LLVM 19.0.0git
Classes | Namespaces | Macros | Functions | Variables
InstCombinePHI.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
#include "llvm/Transforms/Utils/Local.h"
#include <optional>

Go to the source code of this file.

Classes

struct  llvm::DenseMapInfo< LoweredPHIRecord >
 

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.
 

Macros

#define DEBUG_TYPE   "instcombine"
 

Functions

 STATISTIC (NumPHIsOfInsertValues, "Number of phi-of-insertvalue turned into insertvalue-of-phis")
 
 STATISTIC (NumPHIsOfExtractValues, "Number of phi-of-extractvalue turned into extractvalue-of-phi")
 
 STATISTIC (NumPHICSEs, "Number of PHI's that got CSE'd")
 
static bool isSafeAndProfitableToSinkLoad (LoadInst *L)
 Return true if we know that it is safe to sink the load out of the block that defines it.
 
static bool isDeadPHICycle (PHINode *PN, SmallPtrSetImpl< PHINode * > &PotentiallyDeadPHIs)
 Return true if this PHI node is only used by a PHI node cycle that is dead.
 
static bool PHIsEqualValue (PHINode *PN, Value *&NonPhiInVal, SmallPtrSetImpl< PHINode * > &ValueEqualPHIs)
 Return true if this phi node is always equal to NonPhiInVal.
 
static ConstantIntgetAnyNonZeroConstInt (PHINode &PN)
 Return an existing non-zero constant if this phi node has one, otherwise return constant 1.
 
static ValuesimplifyUsingControlFlow (InstCombiner &Self, PHINode &PN, const DominatorTree &DT)
 
static ValuefoldDependentIVs (PHINode &PN, IRBuilderBase &Builder)
 

Variables

static cl::opt< unsignedMaxNumPhis ("instcombine-max-num-phis", cl::init(512), cl::desc("Maximum number phis to handle in intptr/ptrint folding"))
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "instcombine"

Definition at line 28 of file InstCombinePHI.cpp.

Function Documentation

◆ foldDependentIVs()

static Value * foldDependentIVs ( PHINode PN,
IRBuilderBase Builder 
)
static

◆ getAnyNonZeroConstInt()

static ConstantInt * getAnyNonZeroConstInt ( PHINode PN)
static

Return an existing non-zero constant if this phi node has one, otherwise return constant 1.

Definition at line 1027 of file InstCombinePHI.cpp.

References assert(), llvm::Value::getType(), and llvm::User::operands().

Referenced by llvm::InstCombinerImpl::visitPHINode().

◆ isDeadPHICycle()

static bool isDeadPHICycle ( PHINode PN,
SmallPtrSetImpl< PHINode * > &  PotentiallyDeadPHIs 
)
static

◆ isSafeAndProfitableToSinkLoad()

static bool isSafeAndProfitableToSinkLoad ( LoadInst L)
static

Return true if we know that it is safe to sink the load out of the block that defines it.

This means that it must be obvious the value of the load is not changed from the point of the load to the end of the block it is in.

Finally, it is safe, but not profitable, to sink a load targeting a non-address-taken alloca. Doing so will cause us to not promote the alloca to a register.

Definition at line 621 of file InstCombinePHI.cpp.

References GEP.

Referenced by llvm::InstCombinerImpl::foldPHIArgLoadIntoPHI().

◆ PHIsEqualValue()

static bool PHIsEqualValue ( PHINode PN,
Value *&  NonPhiInVal,
SmallPtrSetImpl< PHINode * > &  ValueEqualPHIs 
)
static

Return true if this phi node is always equal to NonPhiInVal.

This happens with mutually cyclic phi nodes like: z = some value; x = phi (y, z); y = phi (x, z)

Definition at line 999 of file InstCombinePHI.cpp.

References llvm::PHINode::incoming_values(), llvm::SmallPtrSetImpl< PtrType >::insert(), PHIsEqualValue(), and llvm::SmallPtrSetImplBase::size().

Referenced by PHIsEqualValue().

◆ simplifyUsingControlFlow()

static Value * simplifyUsingControlFlow ( InstCombiner Self,
PHINode PN,
const DominatorTree DT 
)
static

◆ STATISTIC() [1/3]

STATISTIC ( NumPHICSEs  ,
"Number of PHI's that got CSE'd"   
)

◆ STATISTIC() [2/3]

STATISTIC ( NumPHIsOfExtractValues  ,
"Number of phi-of-extractvalue turned into extractvalue-of-phi"   
)

◆ STATISTIC() [3/3]

STATISTIC ( NumPHIsOfInsertValues  ,
"Number of phi-of-insertvalue turned into insertvalue-of-phis"   
)

Variable Documentation

◆ MaxNumPhis

cl::opt< unsigned > MaxNumPhis("instcombine-max-num-phis", cl::init(512), cl::desc("Maximum number phis to handle in intptr/ptrint folding")) ( "instcombine-max-num-phis"  ,
cl::init(512)  ,
cl::desc("Maximum number phis to handle in intptr/ptrint folding")   
)
static