1*2bb61ba2SHal Finkel //===---- BDCE.cpp - Bit-tracking dead code elimination -------------------===// 2*2bb61ba2SHal Finkel // 3*2bb61ba2SHal Finkel // The LLVM Compiler Infrastructure 4*2bb61ba2SHal Finkel // 5*2bb61ba2SHal Finkel // This file is distributed under the University of Illinois Open Source 6*2bb61ba2SHal Finkel // License. See LICENSE.TXT for details. 7*2bb61ba2SHal Finkel // 8*2bb61ba2SHal Finkel //===----------------------------------------------------------------------===// 9*2bb61ba2SHal Finkel // 10*2bb61ba2SHal Finkel // This file implements the Bit-Tracking Dead Code Elimination pass. Some 11*2bb61ba2SHal Finkel // instructions (shifts, some ands, ors, etc.) kill some of their input bits. 12*2bb61ba2SHal Finkel // We track these dead bits and remove instructions that compute only these 13*2bb61ba2SHal Finkel // dead bits. 14*2bb61ba2SHal Finkel // 15*2bb61ba2SHal Finkel //===----------------------------------------------------------------------===// 16*2bb61ba2SHal Finkel 17*2bb61ba2SHal Finkel #include "llvm/Transforms/Scalar.h" 18*2bb61ba2SHal Finkel #include "llvm/ADT/DenseMap.h" 19*2bb61ba2SHal Finkel #include "llvm/ADT/DepthFirstIterator.h" 20*2bb61ba2SHal Finkel #include "llvm/ADT/SmallPtrSet.h" 21*2bb61ba2SHal Finkel #include "llvm/ADT/SmallVector.h" 22*2bb61ba2SHal Finkel #include "llvm/ADT/Statistic.h" 23*2bb61ba2SHal Finkel #include "llvm/Analysis/AssumptionCache.h" 24*2bb61ba2SHal Finkel #include "llvm/Analysis/ValueTracking.h" 25*2bb61ba2SHal Finkel #include "llvm/IR/BasicBlock.h" 26*2bb61ba2SHal Finkel #include "llvm/IR/CFG.h" 27*2bb61ba2SHal Finkel #include "llvm/IR/DataLayout.h" 28*2bb61ba2SHal Finkel #include "llvm/IR/Dominators.h" 29*2bb61ba2SHal Finkel #include "llvm/IR/InstIterator.h" 30*2bb61ba2SHal Finkel #include "llvm/IR/Instructions.h" 31*2bb61ba2SHal Finkel #include "llvm/IR/IntrinsicInst.h" 32*2bb61ba2SHal Finkel #include "llvm/IR/Module.h" 33*2bb61ba2SHal Finkel #include "llvm/IR/Operator.h" 34*2bb61ba2SHal Finkel #include "llvm/Pass.h" 35*2bb61ba2SHal Finkel #include "llvm/Support/Debug.h" 36*2bb61ba2SHal Finkel #include "llvm/Support/raw_ostream.h" 37*2bb61ba2SHal Finkel 38*2bb61ba2SHal Finkel using namespace llvm; 39*2bb61ba2SHal Finkel 40*2bb61ba2SHal Finkel #define DEBUG_TYPE "bdce" 41*2bb61ba2SHal Finkel 42*2bb61ba2SHal Finkel STATISTIC(NumRemoved, "Number of instructions removed (unused)"); 43*2bb61ba2SHal Finkel STATISTIC(NumSimplified, "Number of instructions trivialized (dead bits)"); 44*2bb61ba2SHal Finkel 45*2bb61ba2SHal Finkel namespace { 46*2bb61ba2SHal Finkel struct BDCE : public FunctionPass { 47*2bb61ba2SHal Finkel static char ID; // Pass identification, replacement for typeid 48*2bb61ba2SHal Finkel BDCE() : FunctionPass(ID) { 49*2bb61ba2SHal Finkel initializeBDCEPass(*PassRegistry::getPassRegistry()); 50*2bb61ba2SHal Finkel } 51*2bb61ba2SHal Finkel 52*2bb61ba2SHal Finkel bool runOnFunction(Function& F) override; 53*2bb61ba2SHal Finkel 54*2bb61ba2SHal Finkel void getAnalysisUsage(AnalysisUsage& AU) const override { 55*2bb61ba2SHal Finkel AU.setPreservesCFG(); 56*2bb61ba2SHal Finkel AU.addRequired<AssumptionCacheTracker>(); 57*2bb61ba2SHal Finkel AU.addRequired<DominatorTreeWrapperPass>(); 58*2bb61ba2SHal Finkel } 59*2bb61ba2SHal Finkel 60*2bb61ba2SHal Finkel void determineLiveOperandBits(const Instruction *UserI, 61*2bb61ba2SHal Finkel const Instruction *I, unsigned OperandNo, 62*2bb61ba2SHal Finkel const APInt &AOut, APInt &AB, 63*2bb61ba2SHal Finkel APInt &KnownZero, APInt &KnownOne, 64*2bb61ba2SHal Finkel APInt &KnownZero2, APInt &KnownOne2); 65*2bb61ba2SHal Finkel 66*2bb61ba2SHal Finkel AssumptionCache *AC; 67*2bb61ba2SHal Finkel const DataLayout *DL; 68*2bb61ba2SHal Finkel DominatorTree *DT; 69*2bb61ba2SHal Finkel }; 70*2bb61ba2SHal Finkel } 71*2bb61ba2SHal Finkel 72*2bb61ba2SHal Finkel char BDCE::ID = 0; 73*2bb61ba2SHal Finkel INITIALIZE_PASS_BEGIN(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", 74*2bb61ba2SHal Finkel false, false) 75*2bb61ba2SHal Finkel INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 76*2bb61ba2SHal Finkel INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 77*2bb61ba2SHal Finkel INITIALIZE_PASS_END(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", 78*2bb61ba2SHal Finkel false, false) 79*2bb61ba2SHal Finkel 80*2bb61ba2SHal Finkel static bool isAlwaysLive(Instruction *I) { 81*2bb61ba2SHal Finkel return isa<TerminatorInst>(I) || isa<DbgInfoIntrinsic>(I) || 82*2bb61ba2SHal Finkel isa<LandingPadInst>(I) || I->mayHaveSideEffects(); 83*2bb61ba2SHal Finkel } 84*2bb61ba2SHal Finkel 85*2bb61ba2SHal Finkel void BDCE::determineLiveOperandBits(const Instruction *UserI, 86*2bb61ba2SHal Finkel const Instruction *I, unsigned OperandNo, 87*2bb61ba2SHal Finkel const APInt &AOut, APInt &AB, 88*2bb61ba2SHal Finkel APInt &KnownZero, APInt &KnownOne, 89*2bb61ba2SHal Finkel APInt &KnownZero2, APInt &KnownOne2) { 90*2bb61ba2SHal Finkel unsigned BitWidth = AB.getBitWidth(); 91*2bb61ba2SHal Finkel 92*2bb61ba2SHal Finkel // We're called once per operand, but for some instructions, we need to 93*2bb61ba2SHal Finkel // compute known bits of both operands in order to determine the live bits of 94*2bb61ba2SHal Finkel // either (when both operands are instructions themselves). We don't, 95*2bb61ba2SHal Finkel // however, want to do this twice, so we cache the result in APInts that live 96*2bb61ba2SHal Finkel // in the caller. For the two-relevant-operands case, both operand values are 97*2bb61ba2SHal Finkel // provided here. 98*2bb61ba2SHal Finkel auto ComputeKnownBits = [&](unsigned BitWidth, const Value *V1, 99*2bb61ba2SHal Finkel const Value *V2) { 100*2bb61ba2SHal Finkel KnownZero = APInt(BitWidth, 0); 101*2bb61ba2SHal Finkel KnownOne = APInt(BitWidth, 0); 102*2bb61ba2SHal Finkel computeKnownBits(const_cast<Value*>(V1), KnownZero, KnownOne, DL, 0, AC, 103*2bb61ba2SHal Finkel UserI, DT); 104*2bb61ba2SHal Finkel 105*2bb61ba2SHal Finkel if (V2) { 106*2bb61ba2SHal Finkel KnownZero2 = APInt(BitWidth, 0); 107*2bb61ba2SHal Finkel KnownOne2 = APInt(BitWidth, 0); 108*2bb61ba2SHal Finkel computeKnownBits(const_cast<Value*>(V2), KnownZero2, KnownOne2, DL, 0, AC, 109*2bb61ba2SHal Finkel UserI, DT); 110*2bb61ba2SHal Finkel } 111*2bb61ba2SHal Finkel }; 112*2bb61ba2SHal Finkel 113*2bb61ba2SHal Finkel switch (UserI->getOpcode()) { 114*2bb61ba2SHal Finkel default: break; 115*2bb61ba2SHal Finkel case Instruction::Call: 116*2bb61ba2SHal Finkel case Instruction::Invoke: 117*2bb61ba2SHal Finkel if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(UserI)) 118*2bb61ba2SHal Finkel switch (II->getIntrinsicID()) { 119*2bb61ba2SHal Finkel default: break; 120*2bb61ba2SHal Finkel case Intrinsic::bswap: 121*2bb61ba2SHal Finkel // The alive bits of the input are the swapped alive bits of 122*2bb61ba2SHal Finkel // the output. 123*2bb61ba2SHal Finkel AB = AOut.byteSwap(); 124*2bb61ba2SHal Finkel break; 125*2bb61ba2SHal Finkel case Intrinsic::ctlz: 126*2bb61ba2SHal Finkel if (OperandNo == 0) { 127*2bb61ba2SHal Finkel // We need some output bits, so we need all bits of the 128*2bb61ba2SHal Finkel // input to the left of, and including, the leftmost bit 129*2bb61ba2SHal Finkel // known to be one. 130*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, nullptr); 131*2bb61ba2SHal Finkel AB = APInt::getHighBitsSet(BitWidth, 132*2bb61ba2SHal Finkel std::min(BitWidth, KnownOne.countLeadingZeros()+1)); 133*2bb61ba2SHal Finkel } 134*2bb61ba2SHal Finkel break; 135*2bb61ba2SHal Finkel case Intrinsic::cttz: 136*2bb61ba2SHal Finkel if (OperandNo == 0) { 137*2bb61ba2SHal Finkel // We need some output bits, so we need all bits of the 138*2bb61ba2SHal Finkel // input to the right of, and including, the rightmost bit 139*2bb61ba2SHal Finkel // known to be one. 140*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, nullptr); 141*2bb61ba2SHal Finkel AB = APInt::getLowBitsSet(BitWidth, 142*2bb61ba2SHal Finkel std::min(BitWidth, KnownOne.countTrailingZeros()+1)); 143*2bb61ba2SHal Finkel } 144*2bb61ba2SHal Finkel break; 145*2bb61ba2SHal Finkel } 146*2bb61ba2SHal Finkel break; 147*2bb61ba2SHal Finkel case Instruction::Add: 148*2bb61ba2SHal Finkel case Instruction::Sub: 149*2bb61ba2SHal Finkel // Find the highest live output bit. We don't need any more input 150*2bb61ba2SHal Finkel // bits than that (adds, and thus subtracts, ripple only to the 151*2bb61ba2SHal Finkel // left). 152*2bb61ba2SHal Finkel AB = APInt::getLowBitsSet(BitWidth, AOut.getActiveBits()); 153*2bb61ba2SHal Finkel break; 154*2bb61ba2SHal Finkel case Instruction::Shl: 155*2bb61ba2SHal Finkel if (OperandNo == 0) 156*2bb61ba2SHal Finkel if (ConstantInt *CI = 157*2bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 158*2bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 159*2bb61ba2SHal Finkel AB = AOut.lshr(ShiftAmt); 160*2bb61ba2SHal Finkel 161*2bb61ba2SHal Finkel // If the shift is nuw/nsw, then the high bits are not dead 162*2bb61ba2SHal Finkel // (because we've promised that they *must* be zero). 163*2bb61ba2SHal Finkel const ShlOperator *S = cast<ShlOperator>(UserI); 164*2bb61ba2SHal Finkel if (S->hasNoSignedWrap()) 165*2bb61ba2SHal Finkel AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt+1); 166*2bb61ba2SHal Finkel else if (S->hasNoUnsignedWrap()) 167*2bb61ba2SHal Finkel AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt); 168*2bb61ba2SHal Finkel } 169*2bb61ba2SHal Finkel break; 170*2bb61ba2SHal Finkel case Instruction::LShr: 171*2bb61ba2SHal Finkel if (OperandNo == 0) 172*2bb61ba2SHal Finkel if (ConstantInt *CI = 173*2bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 174*2bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 175*2bb61ba2SHal Finkel AB = AOut.shl(ShiftAmt); 176*2bb61ba2SHal Finkel 177*2bb61ba2SHal Finkel // If the shift is exact, then the low bits are not dead 178*2bb61ba2SHal Finkel // (they must be zero). 179*2bb61ba2SHal Finkel if (cast<LShrOperator>(UserI)->isExact()) 180*2bb61ba2SHal Finkel AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt); 181*2bb61ba2SHal Finkel } 182*2bb61ba2SHal Finkel break; 183*2bb61ba2SHal Finkel case Instruction::AShr: 184*2bb61ba2SHal Finkel if (OperandNo == 0) 185*2bb61ba2SHal Finkel if (ConstantInt *CI = 186*2bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 187*2bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 188*2bb61ba2SHal Finkel AB = AOut.shl(ShiftAmt); 189*2bb61ba2SHal Finkel // Because the high input bit is replicated into the 190*2bb61ba2SHal Finkel // high-order bits of the result, if we need any of those 191*2bb61ba2SHal Finkel // bits, then we must keep the highest input bit. 192*2bb61ba2SHal Finkel if ((AOut & APInt::getHighBitsSet(BitWidth, ShiftAmt)) 193*2bb61ba2SHal Finkel .getBoolValue()) 194*2bb61ba2SHal Finkel AB.setBit(BitWidth-1); 195*2bb61ba2SHal Finkel 196*2bb61ba2SHal Finkel // If the shift is exact, then the low bits are not dead 197*2bb61ba2SHal Finkel // (they must be zero). 198*2bb61ba2SHal Finkel if (cast<AShrOperator>(UserI)->isExact()) 199*2bb61ba2SHal Finkel AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt); 200*2bb61ba2SHal Finkel } 201*2bb61ba2SHal Finkel break; 202*2bb61ba2SHal Finkel case Instruction::And: 203*2bb61ba2SHal Finkel AB = AOut; 204*2bb61ba2SHal Finkel 205*2bb61ba2SHal Finkel // For bits that are known zero, the corresponding bits in the 206*2bb61ba2SHal Finkel // other operand are dead (unless they're both zero, in which 207*2bb61ba2SHal Finkel // case they can't both be dead, so just mark the LHS bits as 208*2bb61ba2SHal Finkel // dead). 209*2bb61ba2SHal Finkel if (OperandNo == 0) { 210*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, UserI->getOperand(1)); 211*2bb61ba2SHal Finkel AB &= ~KnownZero2; 212*2bb61ba2SHal Finkel } else { 213*2bb61ba2SHal Finkel if (!isa<Instruction>(UserI->getOperand(0))) 214*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, UserI->getOperand(0), I); 215*2bb61ba2SHal Finkel AB &= ~(KnownZero & ~KnownZero2); 216*2bb61ba2SHal Finkel } 217*2bb61ba2SHal Finkel break; 218*2bb61ba2SHal Finkel case Instruction::Or: 219*2bb61ba2SHal Finkel AB = AOut; 220*2bb61ba2SHal Finkel 221*2bb61ba2SHal Finkel // For bits that are known one, the corresponding bits in the 222*2bb61ba2SHal Finkel // other operand are dead (unless they're both one, in which 223*2bb61ba2SHal Finkel // case they can't both be dead, so just mark the LHS bits as 224*2bb61ba2SHal Finkel // dead). 225*2bb61ba2SHal Finkel if (OperandNo == 0) { 226*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, UserI->getOperand(1)); 227*2bb61ba2SHal Finkel AB &= ~KnownOne2; 228*2bb61ba2SHal Finkel } else { 229*2bb61ba2SHal Finkel if (!isa<Instruction>(UserI->getOperand(0))) 230*2bb61ba2SHal Finkel ComputeKnownBits(BitWidth, UserI->getOperand(0), I); 231*2bb61ba2SHal Finkel AB &= ~(KnownOne & ~KnownOne2); 232*2bb61ba2SHal Finkel } 233*2bb61ba2SHal Finkel break; 234*2bb61ba2SHal Finkel case Instruction::Xor: 235*2bb61ba2SHal Finkel case Instruction::PHI: 236*2bb61ba2SHal Finkel AB = AOut; 237*2bb61ba2SHal Finkel break; 238*2bb61ba2SHal Finkel case Instruction::Trunc: 239*2bb61ba2SHal Finkel AB = AOut.zext(BitWidth); 240*2bb61ba2SHal Finkel break; 241*2bb61ba2SHal Finkel case Instruction::ZExt: 242*2bb61ba2SHal Finkel AB = AOut.trunc(BitWidth); 243*2bb61ba2SHal Finkel break; 244*2bb61ba2SHal Finkel case Instruction::SExt: 245*2bb61ba2SHal Finkel AB = AOut.trunc(BitWidth); 246*2bb61ba2SHal Finkel // Because the high input bit is replicated into the 247*2bb61ba2SHal Finkel // high-order bits of the result, if we need any of those 248*2bb61ba2SHal Finkel // bits, then we must keep the highest input bit. 249*2bb61ba2SHal Finkel if ((AOut & APInt::getHighBitsSet(AOut.getBitWidth(), 250*2bb61ba2SHal Finkel AOut.getBitWidth() - BitWidth)) 251*2bb61ba2SHal Finkel .getBoolValue()) 252*2bb61ba2SHal Finkel AB.setBit(BitWidth-1); 253*2bb61ba2SHal Finkel break; 254*2bb61ba2SHal Finkel case Instruction::Select: 255*2bb61ba2SHal Finkel if (OperandNo != 0) 256*2bb61ba2SHal Finkel AB = AOut; 257*2bb61ba2SHal Finkel break; 258*2bb61ba2SHal Finkel } 259*2bb61ba2SHal Finkel } 260*2bb61ba2SHal Finkel 261*2bb61ba2SHal Finkel bool BDCE::runOnFunction(Function& F) { 262*2bb61ba2SHal Finkel if (skipOptnoneFunction(F)) 263*2bb61ba2SHal Finkel return false; 264*2bb61ba2SHal Finkel 265*2bb61ba2SHal Finkel AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); 266*2bb61ba2SHal Finkel DL = F.getParent()->getDataLayout(); 267*2bb61ba2SHal Finkel DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 268*2bb61ba2SHal Finkel 269*2bb61ba2SHal Finkel DenseMap<Instruction *, APInt> AliveBits; 270*2bb61ba2SHal Finkel SmallVector<Instruction*, 128> Worklist; 271*2bb61ba2SHal Finkel 272*2bb61ba2SHal Finkel // The set of visited instructions (non-integer-typed only). 273*2bb61ba2SHal Finkel SmallPtrSet<Instruction*, 128> Visited; 274*2bb61ba2SHal Finkel 275*2bb61ba2SHal Finkel // Collect the set of "root" instructions that are known live. 276*2bb61ba2SHal Finkel for (Instruction &I : inst_range(F)) { 277*2bb61ba2SHal Finkel if (!isAlwaysLive(&I)) 278*2bb61ba2SHal Finkel continue; 279*2bb61ba2SHal Finkel 280*2bb61ba2SHal Finkel // For integer-valued instructions, set up an initial empty set of alive 281*2bb61ba2SHal Finkel // bits and add the instruction to the work list. For other instructions 282*2bb61ba2SHal Finkel // add their operands to the work list (for integer values operands, mark 283*2bb61ba2SHal Finkel // all bits as live). 284*2bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(I.getType())) { 285*2bb61ba2SHal Finkel AliveBits[&I] = APInt(IT->getBitWidth(), 0); 286*2bb61ba2SHal Finkel Worklist.push_back(&I); 287*2bb61ba2SHal Finkel continue; 288*2bb61ba2SHal Finkel } 289*2bb61ba2SHal Finkel 290*2bb61ba2SHal Finkel // Non-integer-typed instructions... 291*2bb61ba2SHal Finkel for (Use &OI : I.operands()) { 292*2bb61ba2SHal Finkel if (Instruction *J = dyn_cast<Instruction>(OI)) { 293*2bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(J->getType())) 294*2bb61ba2SHal Finkel AliveBits[J] = APInt::getAllOnesValue(IT->getBitWidth()); 295*2bb61ba2SHal Finkel Worklist.push_back(J); 296*2bb61ba2SHal Finkel } 297*2bb61ba2SHal Finkel } 298*2bb61ba2SHal Finkel // To save memory, we don't add I to the Visited set here. Instead, we 299*2bb61ba2SHal Finkel // check isAlwaysLive on every instruction when searching for dead 300*2bb61ba2SHal Finkel // instructions later (we need to check isAlwaysLive for the 301*2bb61ba2SHal Finkel // integer-typed instructions anyway). 302*2bb61ba2SHal Finkel } 303*2bb61ba2SHal Finkel 304*2bb61ba2SHal Finkel // Propagate liveness backwards to operands. 305*2bb61ba2SHal Finkel while (!Worklist.empty()) { 306*2bb61ba2SHal Finkel Instruction *UserI = Worklist.pop_back_val(); 307*2bb61ba2SHal Finkel 308*2bb61ba2SHal Finkel DEBUG(dbgs() << "BDCE: Visiting: " << *UserI); 309*2bb61ba2SHal Finkel APInt AOut; 310*2bb61ba2SHal Finkel if (UserI->getType()->isIntegerTy()) { 311*2bb61ba2SHal Finkel AOut = AliveBits[UserI]; 312*2bb61ba2SHal Finkel DEBUG(dbgs() << " Alive Out: " << AOut); 313*2bb61ba2SHal Finkel } 314*2bb61ba2SHal Finkel DEBUG(dbgs() << "\n"); 315*2bb61ba2SHal Finkel 316*2bb61ba2SHal Finkel if (!UserI->getType()->isIntegerTy()) 317*2bb61ba2SHal Finkel Visited.insert(UserI); 318*2bb61ba2SHal Finkel 319*2bb61ba2SHal Finkel APInt KnownZero, KnownOne, KnownZero2, KnownOne2; 320*2bb61ba2SHal Finkel // Compute the set of alive bits for each operand. These are anded into the 321*2bb61ba2SHal Finkel // existing set, if any, and if that changes the set of alive bits, the 322*2bb61ba2SHal Finkel // operand is added to the work-list. 323*2bb61ba2SHal Finkel for (Use &OI : UserI->operands()) { 324*2bb61ba2SHal Finkel if (Instruction *I = dyn_cast<Instruction>(OI)) { 325*2bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(I->getType())) { 326*2bb61ba2SHal Finkel unsigned BitWidth = IT->getBitWidth(); 327*2bb61ba2SHal Finkel APInt AB = APInt::getAllOnesValue(BitWidth); 328*2bb61ba2SHal Finkel if (UserI->getType()->isIntegerTy() && !AOut && 329*2bb61ba2SHal Finkel !isAlwaysLive(UserI)) { 330*2bb61ba2SHal Finkel AB = APInt(BitWidth, 0); 331*2bb61ba2SHal Finkel } else { 332*2bb61ba2SHal Finkel // If all bits of the output are dead, then all bits of the input 333*2bb61ba2SHal Finkel // Bits of each operand that are used to compute alive bits of the 334*2bb61ba2SHal Finkel // output are alive, all others are dead. 335*2bb61ba2SHal Finkel determineLiveOperandBits(UserI, I, OI.getOperandNo(), AOut, AB, 336*2bb61ba2SHal Finkel KnownZero, KnownOne, 337*2bb61ba2SHal Finkel KnownZero2, KnownOne2); 338*2bb61ba2SHal Finkel } 339*2bb61ba2SHal Finkel 340*2bb61ba2SHal Finkel // If we've added to the set of alive bits (or the operand has not 341*2bb61ba2SHal Finkel // been previously visited), then re-queue the operand to be visited 342*2bb61ba2SHal Finkel // again. 343*2bb61ba2SHal Finkel APInt ABPrev(BitWidth, 0); 344*2bb61ba2SHal Finkel auto ABI = AliveBits.find(I); 345*2bb61ba2SHal Finkel if (ABI != AliveBits.end()) 346*2bb61ba2SHal Finkel ABPrev = ABI->second; 347*2bb61ba2SHal Finkel 348*2bb61ba2SHal Finkel APInt ABNew = AB | ABPrev; 349*2bb61ba2SHal Finkel if (ABNew != ABPrev || ABI == AliveBits.end()) { 350*2bb61ba2SHal Finkel AliveBits[I] = std::move(ABNew); 351*2bb61ba2SHal Finkel Worklist.push_back(I); 352*2bb61ba2SHal Finkel } 353*2bb61ba2SHal Finkel } else if (!Visited.count(I)) { 354*2bb61ba2SHal Finkel Worklist.push_back(I); 355*2bb61ba2SHal Finkel } 356*2bb61ba2SHal Finkel } 357*2bb61ba2SHal Finkel } 358*2bb61ba2SHal Finkel } 359*2bb61ba2SHal Finkel 360*2bb61ba2SHal Finkel bool Changed = false; 361*2bb61ba2SHal Finkel // The inverse of the live set is the dead set. These are those instructions 362*2bb61ba2SHal Finkel // which have no side effects and do not influence the control flow or return 363*2bb61ba2SHal Finkel // value of the function, and may therefore be deleted safely. 364*2bb61ba2SHal Finkel // NOTE: We reuse the Worklist vector here for memory efficiency. 365*2bb61ba2SHal Finkel for (Instruction &I : inst_range(F)) { 366*2bb61ba2SHal Finkel // For live instructions that have all dead bits, first make them dead by 367*2bb61ba2SHal Finkel // replacing all uses with something else. Then, if they don't need to 368*2bb61ba2SHal Finkel // remain live (because they have side effects, etc.) we can remove them. 369*2bb61ba2SHal Finkel if (I.getType()->isIntegerTy()) { 370*2bb61ba2SHal Finkel auto ABI = AliveBits.find(&I); 371*2bb61ba2SHal Finkel if (ABI != AliveBits.end()) { 372*2bb61ba2SHal Finkel if (ABI->second.getBoolValue()) 373*2bb61ba2SHal Finkel continue; 374*2bb61ba2SHal Finkel 375*2bb61ba2SHal Finkel DEBUG(dbgs() << "BDCE: Trivializing: " << I << " (all bits dead)\n"); 376*2bb61ba2SHal Finkel // FIXME: In theory we could substitute undef here instead of zero. 377*2bb61ba2SHal Finkel // This should be reconsidered once we settle on the semantics of 378*2bb61ba2SHal Finkel // undef, poison, etc. 379*2bb61ba2SHal Finkel Value *Zero = ConstantInt::get(I.getType(), 0); 380*2bb61ba2SHal Finkel ++NumSimplified; 381*2bb61ba2SHal Finkel I.replaceAllUsesWith(Zero); 382*2bb61ba2SHal Finkel Changed = true; 383*2bb61ba2SHal Finkel } 384*2bb61ba2SHal Finkel } else if (Visited.count(&I)) { 385*2bb61ba2SHal Finkel continue; 386*2bb61ba2SHal Finkel } 387*2bb61ba2SHal Finkel 388*2bb61ba2SHal Finkel if (isAlwaysLive(&I)) 389*2bb61ba2SHal Finkel continue; 390*2bb61ba2SHal Finkel 391*2bb61ba2SHal Finkel DEBUG(dbgs() << "BDCE: Removing: " << I << " (unused)\n"); 392*2bb61ba2SHal Finkel Worklist.push_back(&I); 393*2bb61ba2SHal Finkel I.dropAllReferences(); 394*2bb61ba2SHal Finkel Changed = true; 395*2bb61ba2SHal Finkel } 396*2bb61ba2SHal Finkel 397*2bb61ba2SHal Finkel for (Instruction *&I : Worklist) { 398*2bb61ba2SHal Finkel ++NumRemoved; 399*2bb61ba2SHal Finkel I->eraseFromParent(); 400*2bb61ba2SHal Finkel } 401*2bb61ba2SHal Finkel 402*2bb61ba2SHal Finkel return Changed; 403*2bb61ba2SHal Finkel } 404*2bb61ba2SHal Finkel 405*2bb61ba2SHal Finkel FunctionPass *llvm::createBitTrackingDCEPass() { 406*2bb61ba2SHal Finkel return new BDCE(); 407*2bb61ba2SHal Finkel } 408*2bb61ba2SHal Finkel 409