xref: /freebsd-src/contrib/llvm-project/llvm/lib/Analysis/DemandedBits.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- DemandedBits.cpp - Determine demanded bits -------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This pass implements a demanded bits analysis. A demanded bit is one that
100b57cec5SDimitry Andric // contributes to a result; bits that are not demanded can be either zero or
110b57cec5SDimitry Andric // one without affecting control or data flow. For example in this sequence:
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //   %1 = add i32 %x, %y
140b57cec5SDimitry Andric //   %2 = trunc i32 %1 to i16
150b57cec5SDimitry Andric //
160b57cec5SDimitry Andric // Only the lowest 16 bits of %1 are demanded; the rest are removed by the
170b57cec5SDimitry Andric // trunc.
180b57cec5SDimitry Andric //
190b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #include "llvm/Analysis/DemandedBits.h"
220b57cec5SDimitry Andric #include "llvm/ADT/APInt.h"
230b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h"
240b57cec5SDimitry Andric #include "llvm/Analysis/AssumptionCache.h"
250b57cec5SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
260b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
270b57cec5SDimitry Andric #include "llvm/IR/Dominators.h"
280b57cec5SDimitry Andric #include "llvm/IR/InstIterator.h"
290b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
300b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
310b57cec5SDimitry Andric #include "llvm/IR/Module.h"
320b57cec5SDimitry Andric #include "llvm/IR/Operator.h"
330b57cec5SDimitry Andric #include "llvm/IR/PassManager.h"
340b57cec5SDimitry Andric #include "llvm/IR/PatternMatch.h"
350b57cec5SDimitry Andric #include "llvm/IR/Type.h"
360b57cec5SDimitry Andric #include "llvm/IR/Use.h"
370b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
380b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
390b57cec5SDimitry Andric #include "llvm/Support/KnownBits.h"
400b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
410b57cec5SDimitry Andric #include <algorithm>
420b57cec5SDimitry Andric #include <cstdint>
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric using namespace llvm;
450b57cec5SDimitry Andric using namespace llvm::PatternMatch;
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric #define DEBUG_TYPE "demanded-bits"
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric static bool isAlwaysLive(Instruction *I) {
500b57cec5SDimitry Andric   return I->isTerminator() || isa<DbgInfoIntrinsic>(I) || I->isEHPad() ||
5128a41182SDimitry Andric          I->mayHaveSideEffects();
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric void DemandedBits::determineLiveOperandBits(
550b57cec5SDimitry Andric     const Instruction *UserI, const Value *Val, unsigned OperandNo,
560b57cec5SDimitry Andric     const APInt &AOut, APInt &AB, KnownBits &Known, KnownBits &Known2,
570b57cec5SDimitry Andric     bool &KnownBitsComputed) {
580b57cec5SDimitry Andric   unsigned BitWidth = AB.getBitWidth();
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   // We're called once per operand, but for some instructions, we need to
610b57cec5SDimitry Andric   // compute known bits of both operands in order to determine the live bits of
620b57cec5SDimitry Andric   // either (when both operands are instructions themselves). We don't,
630b57cec5SDimitry Andric   // however, want to do this twice, so we cache the result in APInts that live
640b57cec5SDimitry Andric   // in the caller. For the two-relevant-operands case, both operand values are
650b57cec5SDimitry Andric   // provided here.
660b57cec5SDimitry Andric   auto ComputeKnownBits =
670b57cec5SDimitry Andric       [&](unsigned BitWidth, const Value *V1, const Value *V2) {
680b57cec5SDimitry Andric         if (KnownBitsComputed)
690b57cec5SDimitry Andric           return;
700b57cec5SDimitry Andric         KnownBitsComputed = true;
710b57cec5SDimitry Andric 
72*0fca6ea1SDimitry Andric         const DataLayout &DL = UserI->getDataLayout();
730b57cec5SDimitry Andric         Known = KnownBits(BitWidth);
740b57cec5SDimitry Andric         computeKnownBits(V1, Known, DL, 0, &AC, UserI, &DT);
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric         if (V2) {
770b57cec5SDimitry Andric           Known2 = KnownBits(BitWidth);
780b57cec5SDimitry Andric           computeKnownBits(V2, Known2, DL, 0, &AC, UserI, &DT);
790b57cec5SDimitry Andric         }
800b57cec5SDimitry Andric       };
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   switch (UserI->getOpcode()) {
830b57cec5SDimitry Andric   default: break;
840b57cec5SDimitry Andric   case Instruction::Call:
850b57cec5SDimitry Andric   case Instruction::Invoke:
8606c3fb27SDimitry Andric     if (const auto *II = dyn_cast<IntrinsicInst>(UserI)) {
870b57cec5SDimitry Andric       switch (II->getIntrinsicID()) {
880b57cec5SDimitry Andric       default: break;
890b57cec5SDimitry Andric       case Intrinsic::bswap:
900b57cec5SDimitry Andric         // The alive bits of the input are the swapped alive bits of
910b57cec5SDimitry Andric         // the output.
920b57cec5SDimitry Andric         AB = AOut.byteSwap();
930b57cec5SDimitry Andric         break;
940b57cec5SDimitry Andric       case Intrinsic::bitreverse:
950b57cec5SDimitry Andric         // The alive bits of the input are the reversed alive bits of
960b57cec5SDimitry Andric         // the output.
970b57cec5SDimitry Andric         AB = AOut.reverseBits();
980b57cec5SDimitry Andric         break;
990b57cec5SDimitry Andric       case Intrinsic::ctlz:
1000b57cec5SDimitry Andric         if (OperandNo == 0) {
1010b57cec5SDimitry Andric           // We need some output bits, so we need all bits of the
1020b57cec5SDimitry Andric           // input to the left of, and including, the leftmost bit
1030b57cec5SDimitry Andric           // known to be one.
1040b57cec5SDimitry Andric           ComputeKnownBits(BitWidth, Val, nullptr);
1050b57cec5SDimitry Andric           AB = APInt::getHighBitsSet(BitWidth,
1060b57cec5SDimitry Andric                  std::min(BitWidth, Known.countMaxLeadingZeros()+1));
1070b57cec5SDimitry Andric         }
1080b57cec5SDimitry Andric         break;
1090b57cec5SDimitry Andric       case Intrinsic::cttz:
1100b57cec5SDimitry Andric         if (OperandNo == 0) {
1110b57cec5SDimitry Andric           // We need some output bits, so we need all bits of the
1120b57cec5SDimitry Andric           // input to the right of, and including, the rightmost bit
1130b57cec5SDimitry Andric           // known to be one.
1140b57cec5SDimitry Andric           ComputeKnownBits(BitWidth, Val, nullptr);
1150b57cec5SDimitry Andric           AB = APInt::getLowBitsSet(BitWidth,
1160b57cec5SDimitry Andric                  std::min(BitWidth, Known.countMaxTrailingZeros()+1));
1170b57cec5SDimitry Andric         }
1180b57cec5SDimitry Andric         break;
1190b57cec5SDimitry Andric       case Intrinsic::fshl:
1200b57cec5SDimitry Andric       case Intrinsic::fshr: {
1210b57cec5SDimitry Andric         const APInt *SA;
1220b57cec5SDimitry Andric         if (OperandNo == 2) {
1230b57cec5SDimitry Andric           // Shift amount is modulo the bitwidth. For powers of two we have
1240b57cec5SDimitry Andric           // SA % BW == SA & (BW - 1).
1250b57cec5SDimitry Andric           if (isPowerOf2_32(BitWidth))
1260b57cec5SDimitry Andric             AB = BitWidth - 1;
1270b57cec5SDimitry Andric         } else if (match(II->getOperand(2), m_APInt(SA))) {
1280b57cec5SDimitry Andric           // Normalize to funnel shift left. APInt shifts of BitWidth are well-
1290b57cec5SDimitry Andric           // defined, so no need to special-case zero shifts here.
1300b57cec5SDimitry Andric           uint64_t ShiftAmt = SA->urem(BitWidth);
1310b57cec5SDimitry Andric           if (II->getIntrinsicID() == Intrinsic::fshr)
1320b57cec5SDimitry Andric             ShiftAmt = BitWidth - ShiftAmt;
1330b57cec5SDimitry Andric 
1340b57cec5SDimitry Andric           if (OperandNo == 0)
1350b57cec5SDimitry Andric             AB = AOut.lshr(ShiftAmt);
1360b57cec5SDimitry Andric           else if (OperandNo == 1)
1370b57cec5SDimitry Andric             AB = AOut.shl(BitWidth - ShiftAmt);
1380b57cec5SDimitry Andric         }
1390b57cec5SDimitry Andric         break;
1400b57cec5SDimitry Andric       }
141e8d8bef9SDimitry Andric       case Intrinsic::umax:
142e8d8bef9SDimitry Andric       case Intrinsic::umin:
143e8d8bef9SDimitry Andric       case Intrinsic::smax:
144e8d8bef9SDimitry Andric       case Intrinsic::smin:
145e8d8bef9SDimitry Andric         // If low bits of result are not demanded, they are also not demanded
146e8d8bef9SDimitry Andric         // for the min/max operands.
14706c3fb27SDimitry Andric         AB = APInt::getBitsSetFrom(BitWidth, AOut.countr_zero());
148e8d8bef9SDimitry Andric         break;
149e8d8bef9SDimitry Andric       }
1500b57cec5SDimitry Andric     }
1510b57cec5SDimitry Andric     break;
1520b57cec5SDimitry Andric   case Instruction::Add:
153e8d8bef9SDimitry Andric     if (AOut.isMask()) {
154e8d8bef9SDimitry Andric       AB = AOut;
155e8d8bef9SDimitry Andric     } else {
156e8d8bef9SDimitry Andric       ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
157e8d8bef9SDimitry Andric       AB = determineLiveOperandBitsAdd(OperandNo, AOut, Known, Known2);
158e8d8bef9SDimitry Andric     }
159e8d8bef9SDimitry Andric     break;
1600b57cec5SDimitry Andric   case Instruction::Sub:
161e8d8bef9SDimitry Andric     if (AOut.isMask()) {
162e8d8bef9SDimitry Andric       AB = AOut;
163e8d8bef9SDimitry Andric     } else {
164e8d8bef9SDimitry Andric       ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
165e8d8bef9SDimitry Andric       AB = determineLiveOperandBitsSub(OperandNo, AOut, Known, Known2);
166e8d8bef9SDimitry Andric     }
167e8d8bef9SDimitry Andric     break;
1680b57cec5SDimitry Andric   case Instruction::Mul:
1690b57cec5SDimitry Andric     // Find the highest live output bit. We don't need any more input
1700b57cec5SDimitry Andric     // bits than that (adds, and thus subtracts, ripple only to the
1710b57cec5SDimitry Andric     // left).
1720b57cec5SDimitry Andric     AB = APInt::getLowBitsSet(BitWidth, AOut.getActiveBits());
1730b57cec5SDimitry Andric     break;
1740b57cec5SDimitry Andric   case Instruction::Shl:
1750b57cec5SDimitry Andric     if (OperandNo == 0) {
1760b57cec5SDimitry Andric       const APInt *ShiftAmtC;
1770b57cec5SDimitry Andric       if (match(UserI->getOperand(1), m_APInt(ShiftAmtC))) {
1780b57cec5SDimitry Andric         uint64_t ShiftAmt = ShiftAmtC->getLimitedValue(BitWidth - 1);
1790b57cec5SDimitry Andric         AB = AOut.lshr(ShiftAmt);
1800b57cec5SDimitry Andric 
1810b57cec5SDimitry Andric         // If the shift is nuw/nsw, then the high bits are not dead
1820b57cec5SDimitry Andric         // (because we've promised that they *must* be zero).
18306c3fb27SDimitry Andric         const auto *S = cast<ShlOperator>(UserI);
1840b57cec5SDimitry Andric         if (S->hasNoSignedWrap())
1850b57cec5SDimitry Andric           AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt+1);
1860b57cec5SDimitry Andric         else if (S->hasNoUnsignedWrap())
1870b57cec5SDimitry Andric           AB |= APInt::getHighBitsSet(BitWidth, ShiftAmt);
1880b57cec5SDimitry Andric       }
1890b57cec5SDimitry Andric     }
1900b57cec5SDimitry Andric     break;
1910b57cec5SDimitry Andric   case Instruction::LShr:
1920b57cec5SDimitry Andric     if (OperandNo == 0) {
1930b57cec5SDimitry Andric       const APInt *ShiftAmtC;
1940b57cec5SDimitry Andric       if (match(UserI->getOperand(1), m_APInt(ShiftAmtC))) {
1950b57cec5SDimitry Andric         uint64_t ShiftAmt = ShiftAmtC->getLimitedValue(BitWidth - 1);
1960b57cec5SDimitry Andric         AB = AOut.shl(ShiftAmt);
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric         // If the shift is exact, then the low bits are not dead
1990b57cec5SDimitry Andric         // (they must be zero).
2000b57cec5SDimitry Andric         if (cast<LShrOperator>(UserI)->isExact())
2010b57cec5SDimitry Andric           AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt);
2020b57cec5SDimitry Andric       }
2030b57cec5SDimitry Andric     }
2040b57cec5SDimitry Andric     break;
2050b57cec5SDimitry Andric   case Instruction::AShr:
2060b57cec5SDimitry Andric     if (OperandNo == 0) {
2070b57cec5SDimitry Andric       const APInt *ShiftAmtC;
2080b57cec5SDimitry Andric       if (match(UserI->getOperand(1), m_APInt(ShiftAmtC))) {
2090b57cec5SDimitry Andric         uint64_t ShiftAmt = ShiftAmtC->getLimitedValue(BitWidth - 1);
2100b57cec5SDimitry Andric         AB = AOut.shl(ShiftAmt);
2110b57cec5SDimitry Andric         // Because the high input bit is replicated into the
2120b57cec5SDimitry Andric         // high-order bits of the result, if we need any of those
2130b57cec5SDimitry Andric         // bits, then we must keep the highest input bit.
2140b57cec5SDimitry Andric         if ((AOut & APInt::getHighBitsSet(BitWidth, ShiftAmt))
2150b57cec5SDimitry Andric             .getBoolValue())
2160b57cec5SDimitry Andric           AB.setSignBit();
2170b57cec5SDimitry Andric 
2180b57cec5SDimitry Andric         // If the shift is exact, then the low bits are not dead
2190b57cec5SDimitry Andric         // (they must be zero).
2200b57cec5SDimitry Andric         if (cast<AShrOperator>(UserI)->isExact())
2210b57cec5SDimitry Andric           AB |= APInt::getLowBitsSet(BitWidth, ShiftAmt);
2220b57cec5SDimitry Andric       }
2230b57cec5SDimitry Andric     }
2240b57cec5SDimitry Andric     break;
2250b57cec5SDimitry Andric   case Instruction::And:
2260b57cec5SDimitry Andric     AB = AOut;
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric     // For bits that are known zero, the corresponding bits in the
2290b57cec5SDimitry Andric     // other operand are dead (unless they're both zero, in which
2300b57cec5SDimitry Andric     // case they can't both be dead, so just mark the LHS bits as
2310b57cec5SDimitry Andric     // dead).
2320b57cec5SDimitry Andric     ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
2330b57cec5SDimitry Andric     if (OperandNo == 0)
2340b57cec5SDimitry Andric       AB &= ~Known2.Zero;
2350b57cec5SDimitry Andric     else
2360b57cec5SDimitry Andric       AB &= ~(Known.Zero & ~Known2.Zero);
2370b57cec5SDimitry Andric     break;
2380b57cec5SDimitry Andric   case Instruction::Or:
2390b57cec5SDimitry Andric     AB = AOut;
2400b57cec5SDimitry Andric 
2410b57cec5SDimitry Andric     // For bits that are known one, the corresponding bits in the
2420b57cec5SDimitry Andric     // other operand are dead (unless they're both one, in which
2430b57cec5SDimitry Andric     // case they can't both be dead, so just mark the LHS bits as
2440b57cec5SDimitry Andric     // dead).
2450b57cec5SDimitry Andric     ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
2460b57cec5SDimitry Andric     if (OperandNo == 0)
2470b57cec5SDimitry Andric       AB &= ~Known2.One;
2480b57cec5SDimitry Andric     else
2490b57cec5SDimitry Andric       AB &= ~(Known.One & ~Known2.One);
2500b57cec5SDimitry Andric     break;
2510b57cec5SDimitry Andric   case Instruction::Xor:
2520b57cec5SDimitry Andric   case Instruction::PHI:
2530b57cec5SDimitry Andric     AB = AOut;
2540b57cec5SDimitry Andric     break;
2550b57cec5SDimitry Andric   case Instruction::Trunc:
2560b57cec5SDimitry Andric     AB = AOut.zext(BitWidth);
2570b57cec5SDimitry Andric     break;
2580b57cec5SDimitry Andric   case Instruction::ZExt:
2590b57cec5SDimitry Andric     AB = AOut.trunc(BitWidth);
2600b57cec5SDimitry Andric     break;
2610b57cec5SDimitry Andric   case Instruction::SExt:
2620b57cec5SDimitry Andric     AB = AOut.trunc(BitWidth);
2630b57cec5SDimitry Andric     // Because the high input bit is replicated into the
2640b57cec5SDimitry Andric     // high-order bits of the result, if we need any of those
2650b57cec5SDimitry Andric     // bits, then we must keep the highest input bit.
2660b57cec5SDimitry Andric     if ((AOut & APInt::getHighBitsSet(AOut.getBitWidth(),
2670b57cec5SDimitry Andric                                       AOut.getBitWidth() - BitWidth))
2680b57cec5SDimitry Andric         .getBoolValue())
2690b57cec5SDimitry Andric       AB.setSignBit();
2700b57cec5SDimitry Andric     break;
2710b57cec5SDimitry Andric   case Instruction::Select:
2720b57cec5SDimitry Andric     if (OperandNo != 0)
2730b57cec5SDimitry Andric       AB = AOut;
2740b57cec5SDimitry Andric     break;
2750b57cec5SDimitry Andric   case Instruction::ExtractElement:
2760b57cec5SDimitry Andric     if (OperandNo == 0)
2770b57cec5SDimitry Andric       AB = AOut;
2780b57cec5SDimitry Andric     break;
2790b57cec5SDimitry Andric   case Instruction::InsertElement:
2800b57cec5SDimitry Andric   case Instruction::ShuffleVector:
2810b57cec5SDimitry Andric     if (OperandNo == 0 || OperandNo == 1)
2820b57cec5SDimitry Andric       AB = AOut;
2830b57cec5SDimitry Andric     break;
2840b57cec5SDimitry Andric   }
2850b57cec5SDimitry Andric }
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric void DemandedBits::performAnalysis() {
2880b57cec5SDimitry Andric   if (Analyzed)
2890b57cec5SDimitry Andric     // Analysis already completed for this function.
2900b57cec5SDimitry Andric     return;
2910b57cec5SDimitry Andric   Analyzed = true;
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric   Visited.clear();
2940b57cec5SDimitry Andric   AliveBits.clear();
2950b57cec5SDimitry Andric   DeadUses.clear();
2960b57cec5SDimitry Andric 
2970b57cec5SDimitry Andric   SmallSetVector<Instruction*, 16> Worklist;
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric   // Collect the set of "root" instructions that are known live.
3000b57cec5SDimitry Andric   for (Instruction &I : instructions(F)) {
3010b57cec5SDimitry Andric     if (!isAlwaysLive(&I))
3020b57cec5SDimitry Andric       continue;
3030b57cec5SDimitry Andric 
3040b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "DemandedBits: Root: " << I << "\n");
3050b57cec5SDimitry Andric     // For integer-valued instructions, set up an initial empty set of alive
3060b57cec5SDimitry Andric     // bits and add the instruction to the work list. For other instructions
3070b57cec5SDimitry Andric     // add their operands to the work list (for integer values operands, mark
3080b57cec5SDimitry Andric     // all bits as live).
3090b57cec5SDimitry Andric     Type *T = I.getType();
3100b57cec5SDimitry Andric     if (T->isIntOrIntVectorTy()) {
3110b57cec5SDimitry Andric       if (AliveBits.try_emplace(&I, T->getScalarSizeInBits(), 0).second)
3120b57cec5SDimitry Andric         Worklist.insert(&I);
3130b57cec5SDimitry Andric 
3140b57cec5SDimitry Andric       continue;
3150b57cec5SDimitry Andric     }
3160b57cec5SDimitry Andric 
3170b57cec5SDimitry Andric     // Non-integer-typed instructions...
3180b57cec5SDimitry Andric     for (Use &OI : I.operands()) {
31906c3fb27SDimitry Andric       if (auto *J = dyn_cast<Instruction>(OI)) {
3200b57cec5SDimitry Andric         Type *T = J->getType();
3210b57cec5SDimitry Andric         if (T->isIntOrIntVectorTy())
322349cc55cSDimitry Andric           AliveBits[J] = APInt::getAllOnes(T->getScalarSizeInBits());
3230b57cec5SDimitry Andric         else
3240b57cec5SDimitry Andric           Visited.insert(J);
3250b57cec5SDimitry Andric         Worklist.insert(J);
3260b57cec5SDimitry Andric       }
3270b57cec5SDimitry Andric     }
3280b57cec5SDimitry Andric     // To save memory, we don't add I to the Visited set here. Instead, we
3290b57cec5SDimitry Andric     // check isAlwaysLive on every instruction when searching for dead
3300b57cec5SDimitry Andric     // instructions later (we need to check isAlwaysLive for the
3310b57cec5SDimitry Andric     // integer-typed instructions anyway).
3320b57cec5SDimitry Andric   }
3330b57cec5SDimitry Andric 
3340b57cec5SDimitry Andric   // Propagate liveness backwards to operands.
3350b57cec5SDimitry Andric   while (!Worklist.empty()) {
3360b57cec5SDimitry Andric     Instruction *UserI = Worklist.pop_back_val();
3370b57cec5SDimitry Andric 
3380b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "DemandedBits: Visiting: " << *UserI);
3390b57cec5SDimitry Andric     APInt AOut;
3400b57cec5SDimitry Andric     bool InputIsKnownDead = false;
3410b57cec5SDimitry Andric     if (UserI->getType()->isIntOrIntVectorTy()) {
3420b57cec5SDimitry Andric       AOut = AliveBits[UserI];
3430b57cec5SDimitry Andric       LLVM_DEBUG(dbgs() << " Alive Out: 0x"
3440b57cec5SDimitry Andric                         << Twine::utohexstr(AOut.getLimitedValue()));
3450b57cec5SDimitry Andric 
3460b57cec5SDimitry Andric       // If all bits of the output are dead, then all bits of the input
3470b57cec5SDimitry Andric       // are also dead.
3480b57cec5SDimitry Andric       InputIsKnownDead = !AOut && !isAlwaysLive(UserI);
3490b57cec5SDimitry Andric     }
3500b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "\n");
3510b57cec5SDimitry Andric 
3520b57cec5SDimitry Andric     KnownBits Known, Known2;
3530b57cec5SDimitry Andric     bool KnownBitsComputed = false;
3540b57cec5SDimitry Andric     // Compute the set of alive bits for each operand. These are anded into the
3550b57cec5SDimitry Andric     // existing set, if any, and if that changes the set of alive bits, the
3560b57cec5SDimitry Andric     // operand is added to the work-list.
3570b57cec5SDimitry Andric     for (Use &OI : UserI->operands()) {
3580b57cec5SDimitry Andric       // We also want to detect dead uses of arguments, but will only store
3590b57cec5SDimitry Andric       // demanded bits for instructions.
36006c3fb27SDimitry Andric       auto *I = dyn_cast<Instruction>(OI);
3610b57cec5SDimitry Andric       if (!I && !isa<Argument>(OI))
3620b57cec5SDimitry Andric         continue;
3630b57cec5SDimitry Andric 
3640b57cec5SDimitry Andric       Type *T = OI->getType();
3650b57cec5SDimitry Andric       if (T->isIntOrIntVectorTy()) {
3660b57cec5SDimitry Andric         unsigned BitWidth = T->getScalarSizeInBits();
367349cc55cSDimitry Andric         APInt AB = APInt::getAllOnes(BitWidth);
3680b57cec5SDimitry Andric         if (InputIsKnownDead) {
3690b57cec5SDimitry Andric           AB = APInt(BitWidth, 0);
3700b57cec5SDimitry Andric         } else {
3710b57cec5SDimitry Andric           // Bits of each operand that are used to compute alive bits of the
3720b57cec5SDimitry Andric           // output are alive, all others are dead.
3730b57cec5SDimitry Andric           determineLiveOperandBits(UserI, OI, OI.getOperandNo(), AOut, AB,
3740b57cec5SDimitry Andric                                    Known, Known2, KnownBitsComputed);
3750b57cec5SDimitry Andric 
3760b57cec5SDimitry Andric           // Keep track of uses which have no demanded bits.
377349cc55cSDimitry Andric           if (AB.isZero())
3780b57cec5SDimitry Andric             DeadUses.insert(&OI);
3790b57cec5SDimitry Andric           else
3800b57cec5SDimitry Andric             DeadUses.erase(&OI);
3810b57cec5SDimitry Andric         }
3820b57cec5SDimitry Andric 
3830b57cec5SDimitry Andric         if (I) {
3840b57cec5SDimitry Andric           // If we've added to the set of alive bits (or the operand has not
3850b57cec5SDimitry Andric           // been previously visited), then re-queue the operand to be visited
3860b57cec5SDimitry Andric           // again.
3870b57cec5SDimitry Andric           auto Res = AliveBits.try_emplace(I);
3880b57cec5SDimitry Andric           if (Res.second || (AB |= Res.first->second) != Res.first->second) {
3890b57cec5SDimitry Andric             Res.first->second = std::move(AB);
3900b57cec5SDimitry Andric             Worklist.insert(I);
3910b57cec5SDimitry Andric           }
3920b57cec5SDimitry Andric         }
3930b57cec5SDimitry Andric       } else if (I && Visited.insert(I).second) {
3940b57cec5SDimitry Andric         Worklist.insert(I);
3950b57cec5SDimitry Andric       }
3960b57cec5SDimitry Andric     }
3970b57cec5SDimitry Andric   }
3980b57cec5SDimitry Andric }
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric APInt DemandedBits::getDemandedBits(Instruction *I) {
4010b57cec5SDimitry Andric   performAnalysis();
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric   auto Found = AliveBits.find(I);
4040b57cec5SDimitry Andric   if (Found != AliveBits.end())
4050b57cec5SDimitry Andric     return Found->second;
4060b57cec5SDimitry Andric 
407*0fca6ea1SDimitry Andric   const DataLayout &DL = I->getDataLayout();
408349cc55cSDimitry Andric   return APInt::getAllOnes(DL.getTypeSizeInBits(I->getType()->getScalarType()));
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric 
411fe6060f1SDimitry Andric APInt DemandedBits::getDemandedBits(Use *U) {
412fe6060f1SDimitry Andric   Type *T = (*U)->getType();
41306c3fb27SDimitry Andric   auto *UserI = cast<Instruction>(U->getUser());
414*0fca6ea1SDimitry Andric   const DataLayout &DL = UserI->getDataLayout();
415fe6060f1SDimitry Andric   unsigned BitWidth = DL.getTypeSizeInBits(T->getScalarType());
416fe6060f1SDimitry Andric 
417fe6060f1SDimitry Andric   // We only track integer uses, everything else produces a mask with all bits
418fe6060f1SDimitry Andric   // set
419fe6060f1SDimitry Andric   if (!T->isIntOrIntVectorTy())
420349cc55cSDimitry Andric     return APInt::getAllOnes(BitWidth);
421fe6060f1SDimitry Andric 
422fe6060f1SDimitry Andric   if (isUseDead(U))
423fe6060f1SDimitry Andric     return APInt(BitWidth, 0);
424fe6060f1SDimitry Andric 
425fe6060f1SDimitry Andric   performAnalysis();
426fe6060f1SDimitry Andric 
427fe6060f1SDimitry Andric   APInt AOut = getDemandedBits(UserI);
428349cc55cSDimitry Andric   APInt AB = APInt::getAllOnes(BitWidth);
429fe6060f1SDimitry Andric   KnownBits Known, Known2;
430fe6060f1SDimitry Andric   bool KnownBitsComputed = false;
431fe6060f1SDimitry Andric 
432fe6060f1SDimitry Andric   determineLiveOperandBits(UserI, *U, U->getOperandNo(), AOut, AB, Known,
433fe6060f1SDimitry Andric                            Known2, KnownBitsComputed);
434fe6060f1SDimitry Andric 
435fe6060f1SDimitry Andric   return AB;
436fe6060f1SDimitry Andric }
437fe6060f1SDimitry Andric 
4380b57cec5SDimitry Andric bool DemandedBits::isInstructionDead(Instruction *I) {
4390b57cec5SDimitry Andric   performAnalysis();
4400b57cec5SDimitry Andric 
44106c3fb27SDimitry Andric   return !Visited.count(I) && !AliveBits.contains(I) && !isAlwaysLive(I);
4420b57cec5SDimitry Andric }
4430b57cec5SDimitry Andric 
4440b57cec5SDimitry Andric bool DemandedBits::isUseDead(Use *U) {
4450b57cec5SDimitry Andric   // We only track integer uses, everything else is assumed live.
4460b57cec5SDimitry Andric   if (!(*U)->getType()->isIntOrIntVectorTy())
4470b57cec5SDimitry Andric     return false;
4480b57cec5SDimitry Andric 
4490b57cec5SDimitry Andric   // Uses by always-live instructions are never dead.
45006c3fb27SDimitry Andric   auto *UserI = cast<Instruction>(U->getUser());
4510b57cec5SDimitry Andric   if (isAlwaysLive(UserI))
4520b57cec5SDimitry Andric     return false;
4530b57cec5SDimitry Andric 
4540b57cec5SDimitry Andric   performAnalysis();
4550b57cec5SDimitry Andric   if (DeadUses.count(U))
4560b57cec5SDimitry Andric     return true;
4570b57cec5SDimitry Andric 
4580b57cec5SDimitry Andric   // If no output bits are demanded, no input bits are demanded and the use
4590b57cec5SDimitry Andric   // is dead. These uses might not be explicitly present in the DeadUses map.
4600b57cec5SDimitry Andric   if (UserI->getType()->isIntOrIntVectorTy()) {
4610b57cec5SDimitry Andric     auto Found = AliveBits.find(UserI);
462349cc55cSDimitry Andric     if (Found != AliveBits.end() && Found->second.isZero())
4630b57cec5SDimitry Andric       return true;
4640b57cec5SDimitry Andric   }
4650b57cec5SDimitry Andric 
4660b57cec5SDimitry Andric   return false;
4670b57cec5SDimitry Andric }
4680b57cec5SDimitry Andric 
4690b57cec5SDimitry Andric void DemandedBits::print(raw_ostream &OS) {
470fe6060f1SDimitry Andric   auto PrintDB = [&](const Instruction *I, const APInt &A, Value *V = nullptr) {
471fe6060f1SDimitry Andric     OS << "DemandedBits: 0x" << Twine::utohexstr(A.getLimitedValue())
472fe6060f1SDimitry Andric        << " for ";
473fe6060f1SDimitry Andric     if (V) {
474fe6060f1SDimitry Andric       V->printAsOperand(OS, false);
475fe6060f1SDimitry Andric       OS << " in ";
476fe6060f1SDimitry Andric     }
477fe6060f1SDimitry Andric     OS << *I << '\n';
478fe6060f1SDimitry Andric   };
479fe6060f1SDimitry Andric 
48006c3fb27SDimitry Andric   OS << "Printing analysis 'Demanded Bits Analysis' for function '" << F.getName() << "':\n";
4810b57cec5SDimitry Andric   performAnalysis();
4820b57cec5SDimitry Andric   for (auto &KV : AliveBits) {
483fe6060f1SDimitry Andric     Instruction *I = KV.first;
484fe6060f1SDimitry Andric     PrintDB(I, KV.second);
485fe6060f1SDimitry Andric 
486fe6060f1SDimitry Andric     for (Use &OI : I->operands()) {
487fe6060f1SDimitry Andric       PrintDB(I, getDemandedBits(&OI), OI);
488fe6060f1SDimitry Andric     }
4890b57cec5SDimitry Andric   }
4900b57cec5SDimitry Andric }
4910b57cec5SDimitry Andric 
492e8d8bef9SDimitry Andric static APInt determineLiveOperandBitsAddCarry(unsigned OperandNo,
493e8d8bef9SDimitry Andric                                               const APInt &AOut,
494e8d8bef9SDimitry Andric                                               const KnownBits &LHS,
495e8d8bef9SDimitry Andric                                               const KnownBits &RHS,
496e8d8bef9SDimitry Andric                                               bool CarryZero, bool CarryOne) {
497e8d8bef9SDimitry Andric   assert(!(CarryZero && CarryOne) &&
498e8d8bef9SDimitry Andric          "Carry can't be zero and one at the same time");
499e8d8bef9SDimitry Andric 
500e8d8bef9SDimitry Andric   // The following check should be done by the caller, as it also indicates
501e8d8bef9SDimitry Andric   // that LHS and RHS don't need to be computed.
502e8d8bef9SDimitry Andric   //
503e8d8bef9SDimitry Andric   // if (AOut.isMask())
504e8d8bef9SDimitry Andric   //   return AOut;
505e8d8bef9SDimitry Andric 
506e8d8bef9SDimitry Andric   // Boundary bits' carry out is unaffected by their carry in.
507e8d8bef9SDimitry Andric   APInt Bound = (LHS.Zero & RHS.Zero) | (LHS.One & RHS.One);
508e8d8bef9SDimitry Andric 
509e8d8bef9SDimitry Andric   // First, the alive carry bits are determined from the alive output bits:
510e8d8bef9SDimitry Andric   // Let demand ripple to the right but only up to any set bit in Bound.
511e8d8bef9SDimitry Andric   //   AOut         = -1----
512e8d8bef9SDimitry Andric   //   Bound        = ----1-
513e8d8bef9SDimitry Andric   //   ACarry&~AOut = --111-
514e8d8bef9SDimitry Andric   APInt RBound = Bound.reverseBits();
515e8d8bef9SDimitry Andric   APInt RAOut = AOut.reverseBits();
516e8d8bef9SDimitry Andric   APInt RProp = RAOut + (RAOut | ~RBound);
517e8d8bef9SDimitry Andric   APInt RACarry = RProp ^ ~RBound;
518e8d8bef9SDimitry Andric   APInt ACarry = RACarry.reverseBits();
519e8d8bef9SDimitry Andric 
520e8d8bef9SDimitry Andric   // Then, the alive input bits are determined from the alive carry bits:
521e8d8bef9SDimitry Andric   APInt NeededToMaintainCarryZero;
522e8d8bef9SDimitry Andric   APInt NeededToMaintainCarryOne;
523e8d8bef9SDimitry Andric   if (OperandNo == 0) {
524e8d8bef9SDimitry Andric     NeededToMaintainCarryZero = LHS.Zero | ~RHS.Zero;
525e8d8bef9SDimitry Andric     NeededToMaintainCarryOne = LHS.One | ~RHS.One;
526e8d8bef9SDimitry Andric   } else {
527e8d8bef9SDimitry Andric     NeededToMaintainCarryZero = RHS.Zero | ~LHS.Zero;
528e8d8bef9SDimitry Andric     NeededToMaintainCarryOne = RHS.One | ~LHS.One;
529e8d8bef9SDimitry Andric   }
530e8d8bef9SDimitry Andric 
531e8d8bef9SDimitry Andric   // As in computeForAddCarry
532e8d8bef9SDimitry Andric   APInt PossibleSumZero = ~LHS.Zero + ~RHS.Zero + !CarryZero;
533e8d8bef9SDimitry Andric   APInt PossibleSumOne = LHS.One + RHS.One + CarryOne;
534e8d8bef9SDimitry Andric 
535e8d8bef9SDimitry Andric   // The below is simplified from
536e8d8bef9SDimitry Andric   //
537e8d8bef9SDimitry Andric   // APInt CarryKnownZero = ~(PossibleSumZero ^ LHS.Zero ^ RHS.Zero);
538e8d8bef9SDimitry Andric   // APInt CarryKnownOne = PossibleSumOne ^ LHS.One ^ RHS.One;
539e8d8bef9SDimitry Andric   // APInt CarryUnknown = ~(CarryKnownZero | CarryKnownOne);
540e8d8bef9SDimitry Andric   //
541e8d8bef9SDimitry Andric   // APInt NeededToMaintainCarry =
542e8d8bef9SDimitry Andric   //   (CarryKnownZero & NeededToMaintainCarryZero) |
543e8d8bef9SDimitry Andric   //   (CarryKnownOne  & NeededToMaintainCarryOne) |
544e8d8bef9SDimitry Andric   //   CarryUnknown;
545e8d8bef9SDimitry Andric 
546e8d8bef9SDimitry Andric   APInt NeededToMaintainCarry = (~PossibleSumZero | NeededToMaintainCarryZero) &
547e8d8bef9SDimitry Andric                                 (PossibleSumOne | NeededToMaintainCarryOne);
548e8d8bef9SDimitry Andric 
549e8d8bef9SDimitry Andric   APInt AB = AOut | (ACarry & NeededToMaintainCarry);
550e8d8bef9SDimitry Andric   return AB;
551e8d8bef9SDimitry Andric }
552e8d8bef9SDimitry Andric 
553e8d8bef9SDimitry Andric APInt DemandedBits::determineLiveOperandBitsAdd(unsigned OperandNo,
554e8d8bef9SDimitry Andric                                                 const APInt &AOut,
555e8d8bef9SDimitry Andric                                                 const KnownBits &LHS,
556e8d8bef9SDimitry Andric                                                 const KnownBits &RHS) {
557e8d8bef9SDimitry Andric   return determineLiveOperandBitsAddCarry(OperandNo, AOut, LHS, RHS, true,
558e8d8bef9SDimitry Andric                                           false);
559e8d8bef9SDimitry Andric }
560e8d8bef9SDimitry Andric 
561e8d8bef9SDimitry Andric APInt DemandedBits::determineLiveOperandBitsSub(unsigned OperandNo,
562e8d8bef9SDimitry Andric                                                 const APInt &AOut,
563e8d8bef9SDimitry Andric                                                 const KnownBits &LHS,
564e8d8bef9SDimitry Andric                                                 const KnownBits &RHS) {
565e8d8bef9SDimitry Andric   KnownBits NRHS;
566e8d8bef9SDimitry Andric   NRHS.Zero = RHS.One;
567e8d8bef9SDimitry Andric   NRHS.One = RHS.Zero;
568e8d8bef9SDimitry Andric   return determineLiveOperandBitsAddCarry(OperandNo, AOut, LHS, NRHS, false,
569e8d8bef9SDimitry Andric                                           true);
570e8d8bef9SDimitry Andric }
571e8d8bef9SDimitry Andric 
5720b57cec5SDimitry Andric AnalysisKey DemandedBitsAnalysis::Key;
5730b57cec5SDimitry Andric 
5740b57cec5SDimitry Andric DemandedBits DemandedBitsAnalysis::run(Function &F,
5750b57cec5SDimitry Andric                                              FunctionAnalysisManager &AM) {
5760b57cec5SDimitry Andric   auto &AC = AM.getResult<AssumptionAnalysis>(F);
5770b57cec5SDimitry Andric   auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
5780b57cec5SDimitry Andric   return DemandedBits(F, AC, DT);
5790b57cec5SDimitry Andric }
5800b57cec5SDimitry Andric 
5810b57cec5SDimitry Andric PreservedAnalyses DemandedBitsPrinterPass::run(Function &F,
5820b57cec5SDimitry Andric                                                FunctionAnalysisManager &AM) {
5830b57cec5SDimitry Andric   AM.getResult<DemandedBitsAnalysis>(F).print(OS);
5840b57cec5SDimitry Andric   return PreservedAnalyses::all();
5850b57cec5SDimitry Andric }
586