12bb61ba2SHal Finkel //===---- BDCE.cpp - Bit-tracking dead code elimination -------------------===// 22bb61ba2SHal Finkel // 32bb61ba2SHal Finkel // The LLVM Compiler Infrastructure 42bb61ba2SHal Finkel // 52bb61ba2SHal Finkel // This file is distributed under the University of Illinois Open Source 62bb61ba2SHal Finkel // License. See LICENSE.TXT for details. 72bb61ba2SHal Finkel // 82bb61ba2SHal Finkel //===----------------------------------------------------------------------===// 92bb61ba2SHal Finkel // 102bb61ba2SHal Finkel // This file implements the Bit-Tracking Dead Code Elimination pass. Some 112bb61ba2SHal Finkel // instructions (shifts, some ands, ors, etc.) kill some of their input bits. 122bb61ba2SHal Finkel // We track these dead bits and remove instructions that compute only these 132bb61ba2SHal Finkel // dead bits. 142bb61ba2SHal Finkel // 152bb61ba2SHal Finkel //===----------------------------------------------------------------------===// 162bb61ba2SHal Finkel 172bb61ba2SHal Finkel #include "llvm/Transforms/Scalar.h" 182bb61ba2SHal Finkel #include "llvm/ADT/DenseMap.h" 192bb61ba2SHal Finkel #include "llvm/ADT/DepthFirstIterator.h" 202bb61ba2SHal Finkel #include "llvm/ADT/SmallPtrSet.h" 212bb61ba2SHal Finkel #include "llvm/ADT/SmallVector.h" 222bb61ba2SHal Finkel #include "llvm/ADT/Statistic.h" 232bb61ba2SHal Finkel #include "llvm/Analysis/AssumptionCache.h" 242bb61ba2SHal Finkel #include "llvm/Analysis/ValueTracking.h" 252bb61ba2SHal Finkel #include "llvm/IR/BasicBlock.h" 262bb61ba2SHal Finkel #include "llvm/IR/CFG.h" 272bb61ba2SHal Finkel #include "llvm/IR/DataLayout.h" 282bb61ba2SHal Finkel #include "llvm/IR/Dominators.h" 292bb61ba2SHal Finkel #include "llvm/IR/InstIterator.h" 302bb61ba2SHal Finkel #include "llvm/IR/Instructions.h" 312bb61ba2SHal Finkel #include "llvm/IR/IntrinsicInst.h" 322bb61ba2SHal Finkel #include "llvm/IR/Module.h" 332bb61ba2SHal Finkel #include "llvm/IR/Operator.h" 342bb61ba2SHal Finkel #include "llvm/Pass.h" 352bb61ba2SHal Finkel #include "llvm/Support/Debug.h" 362bb61ba2SHal Finkel #include "llvm/Support/raw_ostream.h" 372bb61ba2SHal Finkel 382bb61ba2SHal Finkel using namespace llvm; 392bb61ba2SHal Finkel 402bb61ba2SHal Finkel #define DEBUG_TYPE "bdce" 412bb61ba2SHal Finkel 422bb61ba2SHal Finkel STATISTIC(NumRemoved, "Number of instructions removed (unused)"); 432bb61ba2SHal Finkel STATISTIC(NumSimplified, "Number of instructions trivialized (dead bits)"); 442bb61ba2SHal Finkel 452bb61ba2SHal Finkel namespace { 462bb61ba2SHal Finkel struct BDCE : public FunctionPass { 472bb61ba2SHal Finkel static char ID; // Pass identification, replacement for typeid 482bb61ba2SHal Finkel BDCE() : FunctionPass(ID) { 492bb61ba2SHal Finkel initializeBDCEPass(*PassRegistry::getPassRegistry()); 502bb61ba2SHal Finkel } 512bb61ba2SHal Finkel 522bb61ba2SHal Finkel bool runOnFunction(Function& F) override; 532bb61ba2SHal Finkel 542bb61ba2SHal Finkel void getAnalysisUsage(AnalysisUsage& AU) const override { 552bb61ba2SHal Finkel AU.setPreservesCFG(); 562bb61ba2SHal Finkel AU.addRequired<AssumptionCacheTracker>(); 572bb61ba2SHal Finkel AU.addRequired<DominatorTreeWrapperPass>(); 582bb61ba2SHal Finkel } 592bb61ba2SHal Finkel 602bb61ba2SHal Finkel void determineLiveOperandBits(const Instruction *UserI, 612bb61ba2SHal Finkel const Instruction *I, unsigned OperandNo, 622bb61ba2SHal Finkel const APInt &AOut, APInt &AB, 632bb61ba2SHal Finkel APInt &KnownZero, APInt &KnownOne, 642bb61ba2SHal Finkel APInt &KnownZero2, APInt &KnownOne2); 652bb61ba2SHal Finkel 662bb61ba2SHal Finkel AssumptionCache *AC; 672bb61ba2SHal Finkel const DataLayout *DL; 682bb61ba2SHal Finkel DominatorTree *DT; 692bb61ba2SHal Finkel }; 702bb61ba2SHal Finkel } 712bb61ba2SHal Finkel 722bb61ba2SHal Finkel char BDCE::ID = 0; 732bb61ba2SHal Finkel INITIALIZE_PASS_BEGIN(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", 742bb61ba2SHal Finkel false, false) 752bb61ba2SHal Finkel INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 762bb61ba2SHal Finkel INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 772bb61ba2SHal Finkel INITIALIZE_PASS_END(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", 782bb61ba2SHal Finkel false, false) 792bb61ba2SHal Finkel 802bb61ba2SHal Finkel static bool isAlwaysLive(Instruction *I) { 812bb61ba2SHal Finkel return isa<TerminatorInst>(I) || isa<DbgInfoIntrinsic>(I) || 822bb61ba2SHal Finkel isa<LandingPadInst>(I) || I->mayHaveSideEffects(); 832bb61ba2SHal Finkel } 842bb61ba2SHal Finkel 852bb61ba2SHal Finkel void BDCE::determineLiveOperandBits(const Instruction *UserI, 862bb61ba2SHal Finkel const Instruction *I, unsigned OperandNo, 872bb61ba2SHal Finkel const APInt &AOut, APInt &AB, 882bb61ba2SHal Finkel APInt &KnownZero, APInt &KnownOne, 892bb61ba2SHal Finkel APInt &KnownZero2, APInt &KnownOne2) { 902bb61ba2SHal Finkel unsigned BitWidth = AB.getBitWidth(); 912bb61ba2SHal Finkel 922bb61ba2SHal Finkel // We're called once per operand, but for some instructions, we need to 932bb61ba2SHal Finkel // compute known bits of both operands in order to determine the live bits of 942bb61ba2SHal Finkel // either (when both operands are instructions themselves). We don't, 952bb61ba2SHal Finkel // however, want to do this twice, so we cache the result in APInts that live 962bb61ba2SHal Finkel // in the caller. For the two-relevant-operands case, both operand values are 972bb61ba2SHal Finkel // provided here. 982bb61ba2SHal Finkel auto ComputeKnownBits = [&](unsigned BitWidth, const Value *V1, 992bb61ba2SHal Finkel const Value *V2) { 1002bb61ba2SHal Finkel KnownZero = APInt(BitWidth, 0); 1012bb61ba2SHal Finkel KnownOne = APInt(BitWidth, 0); 1022bb61ba2SHal Finkel computeKnownBits(const_cast<Value*>(V1), KnownZero, KnownOne, DL, 0, AC, 1032bb61ba2SHal Finkel UserI, DT); 1042bb61ba2SHal Finkel 1052bb61ba2SHal Finkel if (V2) { 1062bb61ba2SHal Finkel KnownZero2 = APInt(BitWidth, 0); 1072bb61ba2SHal Finkel KnownOne2 = APInt(BitWidth, 0); 1082bb61ba2SHal Finkel computeKnownBits(const_cast<Value*>(V2), KnownZero2, KnownOne2, DL, 0, AC, 1092bb61ba2SHal Finkel UserI, DT); 1102bb61ba2SHal Finkel } 1112bb61ba2SHal Finkel }; 1122bb61ba2SHal Finkel 1132bb61ba2SHal Finkel switch (UserI->getOpcode()) { 1142bb61ba2SHal Finkel default: break; 1152bb61ba2SHal Finkel case Instruction::Call: 1162bb61ba2SHal Finkel case Instruction::Invoke: 1172bb61ba2SHal Finkel if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(UserI)) 1182bb61ba2SHal Finkel switch (II->getIntrinsicID()) { 1192bb61ba2SHal Finkel default: break; 1202bb61ba2SHal Finkel case Intrinsic::bswap: 1212bb61ba2SHal Finkel // The alive bits of the input are the swapped alive bits of 1222bb61ba2SHal Finkel // the output. 1232bb61ba2SHal Finkel AB = AOut.byteSwap(); 1242bb61ba2SHal Finkel break; 1252bb61ba2SHal Finkel case Intrinsic::ctlz: 1262bb61ba2SHal Finkel if (OperandNo == 0) { 1272bb61ba2SHal Finkel // We need some output bits, so we need all bits of the 1282bb61ba2SHal Finkel // input to the left of, and including, the leftmost bit 1292bb61ba2SHal Finkel // known to be one. 1302bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, nullptr); 1312bb61ba2SHal Finkel AB = APInt::getHighBitsSet(BitWidth, 1322bb61ba2SHal Finkel std::min(BitWidth, KnownOne.countLeadingZeros()+1)); 1332bb61ba2SHal Finkel } 1342bb61ba2SHal Finkel break; 1352bb61ba2SHal Finkel case Intrinsic::cttz: 1362bb61ba2SHal Finkel if (OperandNo == 0) { 1372bb61ba2SHal Finkel // We need some output bits, so we need all bits of the 1382bb61ba2SHal Finkel // input to the right of, and including, the rightmost bit 1392bb61ba2SHal Finkel // known to be one. 1402bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, nullptr); 1412bb61ba2SHal Finkel AB = APInt::getLowBitsSet(BitWidth, 1422bb61ba2SHal Finkel std::min(BitWidth, KnownOne.countTrailingZeros()+1)); 1432bb61ba2SHal Finkel } 1442bb61ba2SHal Finkel break; 1452bb61ba2SHal Finkel } 1462bb61ba2SHal Finkel break; 1472bb61ba2SHal Finkel case Instruction::Add: 1482bb61ba2SHal Finkel case Instruction::Sub: 1492bb61ba2SHal Finkel // Find the highest live output bit. We don't need any more input 1502bb61ba2SHal Finkel // bits than that (adds, and thus subtracts, ripple only to the 1512bb61ba2SHal Finkel // left). 1522bb61ba2SHal Finkel AB = APInt::getLowBitsSet(BitWidth, AOut.getActiveBits()); 1532bb61ba2SHal Finkel break; 1542bb61ba2SHal Finkel case Instruction::Shl: 1552bb61ba2SHal Finkel if (OperandNo == 0) 1562bb61ba2SHal Finkel if (ConstantInt *CI = 1572bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 1582bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 1592bb61ba2SHal Finkel AB = AOut.lshr(ShiftAmt); 1602bb61ba2SHal Finkel 1612bb61ba2SHal Finkel // If the shift is nuw/nsw, then the high bits are not dead 1622bb61ba2SHal Finkel // (because we've promised that they *must* be zero). 1632bb61ba2SHal Finkel const ShlOperator *S = cast<ShlOperator>(UserI); 1642bb61ba2SHal Finkel if (S->hasNoSignedWrap()) 1652bb61ba2SHal Finkel AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt+1); 1662bb61ba2SHal Finkel else if (S->hasNoUnsignedWrap()) 1672bb61ba2SHal Finkel AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt); 1682bb61ba2SHal Finkel } 1692bb61ba2SHal Finkel break; 1702bb61ba2SHal Finkel case Instruction::LShr: 1712bb61ba2SHal Finkel if (OperandNo == 0) 1722bb61ba2SHal Finkel if (ConstantInt *CI = 1732bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 1742bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 1752bb61ba2SHal Finkel AB = AOut.shl(ShiftAmt); 1762bb61ba2SHal Finkel 1772bb61ba2SHal Finkel // If the shift is exact, then the low bits are not dead 1782bb61ba2SHal Finkel // (they must be zero). 1792bb61ba2SHal Finkel if (cast<LShrOperator>(UserI)->isExact()) 1802bb61ba2SHal Finkel AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt); 1812bb61ba2SHal Finkel } 1822bb61ba2SHal Finkel break; 1832bb61ba2SHal Finkel case Instruction::AShr: 1842bb61ba2SHal Finkel if (OperandNo == 0) 1852bb61ba2SHal Finkel if (ConstantInt *CI = 1862bb61ba2SHal Finkel dyn_cast<ConstantInt>(UserI->getOperand(1))) { 1872bb61ba2SHal Finkel uint64_t ShiftAmt = CI->getLimitedValue(BitWidth-1); 1882bb61ba2SHal Finkel AB = AOut.shl(ShiftAmt); 1892bb61ba2SHal Finkel // Because the high input bit is replicated into the 1902bb61ba2SHal Finkel // high-order bits of the result, if we need any of those 1912bb61ba2SHal Finkel // bits, then we must keep the highest input bit. 1922bb61ba2SHal Finkel if ((AOut & APInt::getHighBitsSet(BitWidth, ShiftAmt)) 1932bb61ba2SHal Finkel .getBoolValue()) 1942bb61ba2SHal Finkel AB.setBit(BitWidth-1); 1952bb61ba2SHal Finkel 1962bb61ba2SHal Finkel // If the shift is exact, then the low bits are not dead 1972bb61ba2SHal Finkel // (they must be zero). 1982bb61ba2SHal Finkel if (cast<AShrOperator>(UserI)->isExact()) 1992bb61ba2SHal Finkel AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt); 2002bb61ba2SHal Finkel } 2012bb61ba2SHal Finkel break; 2022bb61ba2SHal Finkel case Instruction::And: 2032bb61ba2SHal Finkel AB = AOut; 2042bb61ba2SHal Finkel 2052bb61ba2SHal Finkel // For bits that are known zero, the corresponding bits in the 2062bb61ba2SHal Finkel // other operand are dead (unless they're both zero, in which 2072bb61ba2SHal Finkel // case they can't both be dead, so just mark the LHS bits as 2082bb61ba2SHal Finkel // dead). 2092bb61ba2SHal Finkel if (OperandNo == 0) { 2102bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, UserI->getOperand(1)); 2112bb61ba2SHal Finkel AB &= ~KnownZero2; 2122bb61ba2SHal Finkel } else { 2132bb61ba2SHal Finkel if (!isa<Instruction>(UserI->getOperand(0))) 2142bb61ba2SHal Finkel ComputeKnownBits(BitWidth, UserI->getOperand(0), I); 2152bb61ba2SHal Finkel AB &= ~(KnownZero & ~KnownZero2); 2162bb61ba2SHal Finkel } 2172bb61ba2SHal Finkel break; 2182bb61ba2SHal Finkel case Instruction::Or: 2192bb61ba2SHal Finkel AB = AOut; 2202bb61ba2SHal Finkel 2212bb61ba2SHal Finkel // For bits that are known one, the corresponding bits in the 2222bb61ba2SHal Finkel // other operand are dead (unless they're both one, in which 2232bb61ba2SHal Finkel // case they can't both be dead, so just mark the LHS bits as 2242bb61ba2SHal Finkel // dead). 2252bb61ba2SHal Finkel if (OperandNo == 0) { 2262bb61ba2SHal Finkel ComputeKnownBits(BitWidth, I, UserI->getOperand(1)); 2272bb61ba2SHal Finkel AB &= ~KnownOne2; 2282bb61ba2SHal Finkel } else { 2292bb61ba2SHal Finkel if (!isa<Instruction>(UserI->getOperand(0))) 2302bb61ba2SHal Finkel ComputeKnownBits(BitWidth, UserI->getOperand(0), I); 2312bb61ba2SHal Finkel AB &= ~(KnownOne & ~KnownOne2); 2322bb61ba2SHal Finkel } 2332bb61ba2SHal Finkel break; 2342bb61ba2SHal Finkel case Instruction::Xor: 2352bb61ba2SHal Finkel case Instruction::PHI: 2362bb61ba2SHal Finkel AB = AOut; 2372bb61ba2SHal Finkel break; 2382bb61ba2SHal Finkel case Instruction::Trunc: 2392bb61ba2SHal Finkel AB = AOut.zext(BitWidth); 2402bb61ba2SHal Finkel break; 2412bb61ba2SHal Finkel case Instruction::ZExt: 2422bb61ba2SHal Finkel AB = AOut.trunc(BitWidth); 2432bb61ba2SHal Finkel break; 2442bb61ba2SHal Finkel case Instruction::SExt: 2452bb61ba2SHal Finkel AB = AOut.trunc(BitWidth); 2462bb61ba2SHal Finkel // Because the high input bit is replicated into the 2472bb61ba2SHal Finkel // high-order bits of the result, if we need any of those 2482bb61ba2SHal Finkel // bits, then we must keep the highest input bit. 2492bb61ba2SHal Finkel if ((AOut & APInt::getHighBitsSet(AOut.getBitWidth(), 2502bb61ba2SHal Finkel AOut.getBitWidth() - BitWidth)) 2512bb61ba2SHal Finkel .getBoolValue()) 2522bb61ba2SHal Finkel AB.setBit(BitWidth-1); 2532bb61ba2SHal Finkel break; 2542bb61ba2SHal Finkel case Instruction::Select: 2552bb61ba2SHal Finkel if (OperandNo != 0) 2562bb61ba2SHal Finkel AB = AOut; 2572bb61ba2SHal Finkel break; 2582bb61ba2SHal Finkel } 2592bb61ba2SHal Finkel } 2602bb61ba2SHal Finkel 2612bb61ba2SHal Finkel bool BDCE::runOnFunction(Function& F) { 2622bb61ba2SHal Finkel if (skipOptnoneFunction(F)) 2632bb61ba2SHal Finkel return false; 2642bb61ba2SHal Finkel 2652bb61ba2SHal Finkel AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); 2662bb61ba2SHal Finkel DL = F.getParent()->getDataLayout(); 2672bb61ba2SHal Finkel DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 2682bb61ba2SHal Finkel 2692bb61ba2SHal Finkel DenseMap<Instruction *, APInt> AliveBits; 2702bb61ba2SHal Finkel SmallVector<Instruction*, 128> Worklist; 2712bb61ba2SHal Finkel 2722bb61ba2SHal Finkel // The set of visited instructions (non-integer-typed only). 2732bb61ba2SHal Finkel SmallPtrSet<Instruction*, 128> Visited; 2742bb61ba2SHal Finkel 2752bb61ba2SHal Finkel // Collect the set of "root" instructions that are known live. 2762bb61ba2SHal Finkel for (Instruction &I : inst_range(F)) { 2772bb61ba2SHal Finkel if (!isAlwaysLive(&I)) 2782bb61ba2SHal Finkel continue; 2792bb61ba2SHal Finkel 280*43935596SHal Finkel DEBUG(dbgs() << "BDCE: Root: " << I); 2812bb61ba2SHal Finkel // For integer-valued instructions, set up an initial empty set of alive 2822bb61ba2SHal Finkel // bits and add the instruction to the work list. For other instructions 2832bb61ba2SHal Finkel // add their operands to the work list (for integer values operands, mark 2842bb61ba2SHal Finkel // all bits as live). 2852bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(I.getType())) { 286*43935596SHal Finkel if (!AliveBits.count(&I)) { 2872bb61ba2SHal Finkel AliveBits[&I] = APInt(IT->getBitWidth(), 0); 2882bb61ba2SHal Finkel Worklist.push_back(&I); 289*43935596SHal Finkel } 290*43935596SHal Finkel 2912bb61ba2SHal Finkel continue; 2922bb61ba2SHal Finkel } 2932bb61ba2SHal Finkel 2942bb61ba2SHal Finkel // Non-integer-typed instructions... 2952bb61ba2SHal Finkel for (Use &OI : I.operands()) { 2962bb61ba2SHal Finkel if (Instruction *J = dyn_cast<Instruction>(OI)) { 2972bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(J->getType())) 2982bb61ba2SHal Finkel AliveBits[J] = APInt::getAllOnesValue(IT->getBitWidth()); 2992bb61ba2SHal Finkel Worklist.push_back(J); 3002bb61ba2SHal Finkel } 3012bb61ba2SHal Finkel } 3022bb61ba2SHal Finkel // To save memory, we don't add I to the Visited set here. Instead, we 3032bb61ba2SHal Finkel // check isAlwaysLive on every instruction when searching for dead 3042bb61ba2SHal Finkel // instructions later (we need to check isAlwaysLive for the 3052bb61ba2SHal Finkel // integer-typed instructions anyway). 3062bb61ba2SHal Finkel } 3072bb61ba2SHal Finkel 3082bb61ba2SHal Finkel // Propagate liveness backwards to operands. 3092bb61ba2SHal Finkel while (!Worklist.empty()) { 3102bb61ba2SHal Finkel Instruction *UserI = Worklist.pop_back_val(); 3112bb61ba2SHal Finkel 3122bb61ba2SHal Finkel DEBUG(dbgs() << "BDCE: Visiting: " << *UserI); 3132bb61ba2SHal Finkel APInt AOut; 3142bb61ba2SHal Finkel if (UserI->getType()->isIntegerTy()) { 3152bb61ba2SHal Finkel AOut = AliveBits[UserI]; 3162bb61ba2SHal Finkel DEBUG(dbgs() << " Alive Out: " << AOut); 3172bb61ba2SHal Finkel } 3182bb61ba2SHal Finkel DEBUG(dbgs() << "\n"); 3192bb61ba2SHal Finkel 3202bb61ba2SHal Finkel if (!UserI->getType()->isIntegerTy()) 3212bb61ba2SHal Finkel Visited.insert(UserI); 3222bb61ba2SHal Finkel 3232bb61ba2SHal Finkel APInt KnownZero, KnownOne, KnownZero2, KnownOne2; 3242bb61ba2SHal Finkel // Compute the set of alive bits for each operand. These are anded into the 3252bb61ba2SHal Finkel // existing set, if any, and if that changes the set of alive bits, the 3262bb61ba2SHal Finkel // operand is added to the work-list. 3272bb61ba2SHal Finkel for (Use &OI : UserI->operands()) { 3282bb61ba2SHal Finkel if (Instruction *I = dyn_cast<Instruction>(OI)) { 3292bb61ba2SHal Finkel if (IntegerType *IT = dyn_cast<IntegerType>(I->getType())) { 3302bb61ba2SHal Finkel unsigned BitWidth = IT->getBitWidth(); 3312bb61ba2SHal Finkel APInt AB = APInt::getAllOnesValue(BitWidth); 3322bb61ba2SHal Finkel if (UserI->getType()->isIntegerTy() && !AOut && 3332bb61ba2SHal Finkel !isAlwaysLive(UserI)) { 3342bb61ba2SHal Finkel AB = APInt(BitWidth, 0); 3352bb61ba2SHal Finkel } else { 3362bb61ba2SHal Finkel // If all bits of the output are dead, then all bits of the input 3372bb61ba2SHal Finkel // Bits of each operand that are used to compute alive bits of the 3382bb61ba2SHal Finkel // output are alive, all others are dead. 3392bb61ba2SHal Finkel determineLiveOperandBits(UserI, I, OI.getOperandNo(), AOut, AB, 3402bb61ba2SHal Finkel KnownZero, KnownOne, 3412bb61ba2SHal Finkel KnownZero2, KnownOne2); 3422bb61ba2SHal Finkel } 3432bb61ba2SHal Finkel 3442bb61ba2SHal Finkel // If we've added to the set of alive bits (or the operand has not 3452bb61ba2SHal Finkel // been previously visited), then re-queue the operand to be visited 3462bb61ba2SHal Finkel // again. 3472bb61ba2SHal Finkel APInt ABPrev(BitWidth, 0); 3482bb61ba2SHal Finkel auto ABI = AliveBits.find(I); 3492bb61ba2SHal Finkel if (ABI != AliveBits.end()) 3502bb61ba2SHal Finkel ABPrev = ABI->second; 3512bb61ba2SHal Finkel 3522bb61ba2SHal Finkel APInt ABNew = AB | ABPrev; 3532bb61ba2SHal Finkel if (ABNew != ABPrev || ABI == AliveBits.end()) { 3542bb61ba2SHal Finkel AliveBits[I] = std::move(ABNew); 3552bb61ba2SHal Finkel Worklist.push_back(I); 3562bb61ba2SHal Finkel } 3572bb61ba2SHal Finkel } else if (!Visited.count(I)) { 3582bb61ba2SHal Finkel Worklist.push_back(I); 3592bb61ba2SHal Finkel } 3602bb61ba2SHal Finkel } 3612bb61ba2SHal Finkel } 3622bb61ba2SHal Finkel } 3632bb61ba2SHal Finkel 3642bb61ba2SHal Finkel bool Changed = false; 3652bb61ba2SHal Finkel // The inverse of the live set is the dead set. These are those instructions 3662bb61ba2SHal Finkel // which have no side effects and do not influence the control flow or return 3672bb61ba2SHal Finkel // value of the function, and may therefore be deleted safely. 3682bb61ba2SHal Finkel // NOTE: We reuse the Worklist vector here for memory efficiency. 3692bb61ba2SHal Finkel for (Instruction &I : inst_range(F)) { 3702bb61ba2SHal Finkel // For live instructions that have all dead bits, first make them dead by 3712bb61ba2SHal Finkel // replacing all uses with something else. Then, if they don't need to 3722bb61ba2SHal Finkel // remain live (because they have side effects, etc.) we can remove them. 3732bb61ba2SHal Finkel if (I.getType()->isIntegerTy()) { 3742bb61ba2SHal Finkel auto ABI = AliveBits.find(&I); 3752bb61ba2SHal Finkel if (ABI != AliveBits.end()) { 3762bb61ba2SHal Finkel if (ABI->second.getBoolValue()) 3772bb61ba2SHal Finkel continue; 3782bb61ba2SHal Finkel 3792bb61ba2SHal Finkel DEBUG(dbgs() << "BDCE: Trivializing: " << I << " (all bits dead)\n"); 3802bb61ba2SHal Finkel // FIXME: In theory we could substitute undef here instead of zero. 3812bb61ba2SHal Finkel // This should be reconsidered once we settle on the semantics of 3822bb61ba2SHal Finkel // undef, poison, etc. 3832bb61ba2SHal Finkel Value *Zero = ConstantInt::get(I.getType(), 0); 3842bb61ba2SHal Finkel ++NumSimplified; 3852bb61ba2SHal Finkel I.replaceAllUsesWith(Zero); 3862bb61ba2SHal Finkel Changed = true; 3872bb61ba2SHal Finkel } 3882bb61ba2SHal Finkel } else if (Visited.count(&I)) { 3892bb61ba2SHal Finkel continue; 3902bb61ba2SHal Finkel } 3912bb61ba2SHal Finkel 3922bb61ba2SHal Finkel if (isAlwaysLive(&I)) 3932bb61ba2SHal Finkel continue; 3942bb61ba2SHal Finkel 3952bb61ba2SHal Finkel Worklist.push_back(&I); 3962bb61ba2SHal Finkel I.dropAllReferences(); 3972bb61ba2SHal Finkel Changed = true; 3982bb61ba2SHal Finkel } 3992bb61ba2SHal Finkel 4002bb61ba2SHal Finkel for (Instruction *&I : Worklist) { 4012bb61ba2SHal Finkel ++NumRemoved; 4022bb61ba2SHal Finkel I->eraseFromParent(); 4032bb61ba2SHal Finkel } 4042bb61ba2SHal Finkel 4052bb61ba2SHal Finkel return Changed; 4062bb61ba2SHal Finkel } 4072bb61ba2SHal Finkel 4082bb61ba2SHal Finkel FunctionPass *llvm::createBitTrackingDCEPass() { 4092bb61ba2SHal Finkel return new BDCE(); 4102bb61ba2SHal Finkel } 4112bb61ba2SHal Finkel 412