34#define DEBUG_TYPE "bdce"
36STATISTIC(NumRemoved,
"Number of instructions removed (unused)");
37STATISTIC(NumSimplified,
"Number of instructions trivialized (dead bits)");
39 "Number of sign extension instructions converted to zero extension");
45 assert(
I->getType()->isIntOrIntVectorTy() &&
46 "Trivializing a non-integer value?");
51 for (
User *JU :
I->users()) {
54 auto *J = dyn_cast<Instruction>(JU);
55 if (J && J->getType()->isIntOrIntVectorTy() &&
56 !DB.getDemandedBits(J).isAllOnes()) {
72 while (!WorkList.
empty()) {
85 auto *K = dyn_cast<Instruction>(KU);
86 if (K && Visited.
insert(K).second && K->getType()->isIntOrIntVectorTy() &&
87 !DB.getDemandedBits(K).isAllOnes())
100 if (
I.mayHaveSideEffects() &&
I.use_empty())
105 if (DB.isInstructionDead(&
I) ||
106 (
I.getType()->isIntOrIntVectorTy() && DB.getDemandedBits(&
I).isZero() &&
114 if (
SExtInst *SE = dyn_cast<SExtInst>(&
I)) {
115 APInt Demanded = DB.getDemandedBits(SE);
116 const uint32_t SrcBitSize = SE->getSrcTy()->getScalarSizeInBits();
117 auto *
const DstTy = SE->getDestTy();
118 const uint32_t DestBitSize = DstTy->getScalarSizeInBits();
119 if (Demanded.
countl_zero() >= (DestBitSize - SrcBitSize)) {
122 I.replaceAllUsesWith(
123 Builder.CreateZExt(SE->getOperand(0), DstTy, SE->getName()));
131 for (
Use &U :
I.operands()) {
133 if (!U->getType()->isIntOrIntVectorTy())
136 if (!isa<Instruction>(U) && !isa<Argument>(U))
139 if (!DB.isUseDead(&U))
142 LLVM_DEBUG(
dbgs() <<
"BDCE: Trivializing: " << U <<
" (all bits dead)\n");
156 I->dropAllReferences();
161 I->eraseFromParent();
187 auto &DB = getAnalysis<DemandedBitsWrapperPass>().getDemandedBits();
199char BDCELegacyPass::ID = 0;
201 "Bit-Tracking Dead Code Elimination",
false,
false)
static void clearAssumptionsOfUsers(Instruction *I, DemandedBits &DB)
If an instruction is trivialized (dead), then the chain of users of that instruction may need to be c...
static bool bitTrackingDCE(Function &F, DemandedBits &DB)
static bool runOnFunction(Function &F, bool PostInlining)
This is the interface for a simple mod/ref and alias analysis over globals.
Machine Common Subexpression Elimination
print must be executed print the must be executed context for all instructions
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Class for arbitrary precision integers.
unsigned countl_zero() const
The APInt version of std::countl_zero.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
void setPreservesCFG()
This function should be called by the pass, iff they do not:
Represents analyses that only rely on functions' control flow.
static Constant * get(Type *Ty, uint64_t V, bool IsSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
An analysis that produces DemandedBits for a function.
FunctionPass class - This class is used to implement most global optimizations.
Legacy wrapper pass to provide the GlobalsAAResult object.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void preserveSet()
Mark an analysis set as preserved.
This class represents a sign extension of integer types.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A Use represents the edge between a Value definition and its users.
iterator_range< user_iterator > users()
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createBitTrackingDCEPass()
void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
void initializeBDCELegacyPassPass(PassRegistry &)
bool wouldInstructionBeTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction would have no side effects if it was not used.
auto reverse(ContainerTy &&C)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)