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