xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
18bcb0991SDimitry Andric //===- lib/CodeGen/GlobalISel/GISelKnownBits.cpp --------------*- C++ *-===//
28bcb0991SDimitry Andric //
38bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
58bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68bcb0991SDimitry Andric //
78bcb0991SDimitry Andric //===----------------------------------------------------------------------===//
88bcb0991SDimitry Andric //
98bcb0991SDimitry Andric /// Provides analysis for querying information about KnownBits during GISel
108bcb0991SDimitry Andric /// passes.
118bcb0991SDimitry Andric //
12349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
138bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
148bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
158bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
168bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
178bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
188bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
198bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
20fe6060f1SDimitry Andric #include "llvm/IR/Module.h"
218bcb0991SDimitry Andric 
228bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits"
238bcb0991SDimitry Andric 
248bcb0991SDimitry Andric using namespace llvm;
258bcb0991SDimitry Andric 
268bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0;
278bcb0991SDimitry Andric 
285ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
298bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
308bcb0991SDimitry Andric 
315ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
328bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
335ffd83dbSDimitry Andric       DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {}
348bcb0991SDimitry Andric 
355ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
365ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
375ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
385ffd83dbSDimitry Andric   case TargetOpcode::COPY:
395ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
4004eeddc0SDimitry Andric   case TargetOpcode::G_ASSERT_ALIGN: {
4104eeddc0SDimitry Andric     // TODO: Min with source
4204eeddc0SDimitry Andric     int64_t LogAlign = MI->getOperand(2).getImm();
4304eeddc0SDimitry Andric     return Align(1ull << LogAlign);
4404eeddc0SDimitry Andric   }
455ffd83dbSDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
465ffd83dbSDimitry Andric     int FrameIdx = MI->getOperand(1).getIndex();
475ffd83dbSDimitry Andric     return MF.getFrameInfo().getObjectAlign(FrameIdx);
488bcb0991SDimitry Andric   }
495ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
505ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
515ffd83dbSDimitry Andric   default:
525ffd83dbSDimitry Andric     return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
538bcb0991SDimitry Andric   }
548bcb0991SDimitry Andric }
558bcb0991SDimitry Andric 
568bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) {
575ffd83dbSDimitry Andric   assert(MI.getNumExplicitDefs() == 1 &&
585ffd83dbSDimitry Andric          "expected single return generic instruction");
598bcb0991SDimitry Andric   return getKnownBits(MI.getOperand(0).getReg());
608bcb0991SDimitry Andric }
618bcb0991SDimitry Andric 
628bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) {
635ffd83dbSDimitry Andric   const LLT Ty = MRI.getType(R);
648bcb0991SDimitry Andric   APInt DemandedElts =
65349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
665ffd83dbSDimitry Andric   return getKnownBits(R, DemandedElts);
675ffd83dbSDimitry Andric }
685ffd83dbSDimitry Andric 
695ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts,
705ffd83dbSDimitry Andric                                        unsigned Depth) {
715ffd83dbSDimitry Andric   // For now, we only maintain the cache during one request.
725ffd83dbSDimitry Andric   assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared");
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric   KnownBits Known;
758bcb0991SDimitry Andric   computeKnownBitsImpl(R, Known, DemandedElts);
765ffd83dbSDimitry Andric   ComputeKnownBitsCache.clear();
778bcb0991SDimitry Andric   return Known;
788bcb0991SDimitry Andric }
798bcb0991SDimitry Andric 
808bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) {
818bcb0991SDimitry Andric   LLT Ty = MRI.getType(R);
828bcb0991SDimitry Andric   unsigned BitWidth = Ty.getScalarSizeInBits();
838bcb0991SDimitry Andric   return maskedValueIsZero(R, APInt::getSignMask(BitWidth));
848bcb0991SDimitry Andric }
858bcb0991SDimitry Andric 
868bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) {
878bcb0991SDimitry Andric   return getKnownBits(R).Zero;
888bcb0991SDimitry Andric }
898bcb0991SDimitry Andric 
908bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; }
918bcb0991SDimitry Andric 
925ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void
935ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
945ffd83dbSDimitry Andric   dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
955ffd83dbSDimitry Andric          << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
96fe6060f1SDimitry Andric          << toString(Known.Zero | Known.One, 16, false) << "\n"
97fe6060f1SDimitry Andric          << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false)
985ffd83dbSDimitry Andric          << "\n"
99fe6060f1SDimitry Andric          << "[" << Depth << "] One:  0x" << toString(Known.One, 16, false)
1005ffd83dbSDimitry Andric          << "\n";
1015ffd83dbSDimitry Andric }
1025ffd83dbSDimitry Andric 
103e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1
104e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1,
105e8d8bef9SDimitry Andric                                          KnownBits &Known,
106e8d8bef9SDimitry Andric                                          const APInt &DemandedElts,
107e8d8bef9SDimitry Andric                                          unsigned Depth) {
108e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
109e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
110e8d8bef9SDimitry Andric 
111e8d8bef9SDimitry Andric   // If we don't know any bits, early out.
112e8d8bef9SDimitry Andric   if (Known.isUnknown())
113e8d8bef9SDimitry Andric     return;
114e8d8bef9SDimitry Andric 
115e8d8bef9SDimitry Andric   KnownBits Known2;
116e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
117e8d8bef9SDimitry Andric 
118e8d8bef9SDimitry Andric   // Only known if known in both the LHS and RHS.
119e8d8bef9SDimitry Andric   Known = KnownBits::commonBits(Known, Known2);
120e8d8bef9SDimitry Andric }
121e8d8bef9SDimitry Andric 
122fe6060f1SDimitry Andric // Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is
123fe6060f1SDimitry Andric // created using Width. Use this function when the inputs are KnownBits
124fe6060f1SDimitry Andric // objects. TODO: Move this KnownBits.h if this is usable in more cases.
125fe6060f1SDimitry Andric static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown,
126fe6060f1SDimitry Andric                              const KnownBits &OffsetKnown,
127fe6060f1SDimitry Andric                              const KnownBits &WidthKnown) {
128fe6060f1SDimitry Andric   KnownBits Mask(BitWidth);
129fe6060f1SDimitry Andric   Mask.Zero = APInt::getBitsSetFrom(
130fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMaxValue().getLimitedValue(BitWidth));
131fe6060f1SDimitry Andric   Mask.One = APInt::getLowBitsSet(
132fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMinValue().getLimitedValue(BitWidth));
133fe6060f1SDimitry Andric   return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask;
134fe6060f1SDimitry Andric }
135fe6060f1SDimitry Andric 
1368bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
1378bcb0991SDimitry Andric                                           const APInt &DemandedElts,
1388bcb0991SDimitry Andric                                           unsigned Depth) {
1398bcb0991SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
1408bcb0991SDimitry Andric   unsigned Opcode = MI.getOpcode();
1418bcb0991SDimitry Andric   LLT DstTy = MRI.getType(R);
1428bcb0991SDimitry Andric 
1438bcb0991SDimitry Andric   // Handle the case where this is called on a register that does not have a
1448bcb0991SDimitry Andric   // type constraint (i.e. it has a register class constraint instead). This is
1458bcb0991SDimitry Andric   // unlikely to occur except by looking through copies but it is possible for
1468bcb0991SDimitry Andric   // the initial register being queried to be in this state.
1478bcb0991SDimitry Andric   if (!DstTy.isValid()) {
1488bcb0991SDimitry Andric     Known = KnownBits();
1498bcb0991SDimitry Andric     return;
1508bcb0991SDimitry Andric   }
1518bcb0991SDimitry Andric 
152fe6060f1SDimitry Andric   unsigned BitWidth = DstTy.getScalarSizeInBits();
1535ffd83dbSDimitry Andric   auto CacheEntry = ComputeKnownBitsCache.find(R);
1545ffd83dbSDimitry Andric   if (CacheEntry != ComputeKnownBitsCache.end()) {
1555ffd83dbSDimitry Andric     Known = CacheEntry->second;
1565ffd83dbSDimitry Andric     LLVM_DEBUG(dbgs() << "Cache hit at ");
1575ffd83dbSDimitry Andric     LLVM_DEBUG(dumpResult(MI, Known, Depth));
1585ffd83dbSDimitry Andric     assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match");
1595ffd83dbSDimitry Andric     return;
1605ffd83dbSDimitry Andric   }
1618bcb0991SDimitry Andric   Known = KnownBits(BitWidth); // Don't know anything
1628bcb0991SDimitry Andric 
1635ffd83dbSDimitry Andric   // Depth may get bigger than max depth if it gets passed to a different
1645ffd83dbSDimitry Andric   // GISelKnownBits object.
1655ffd83dbSDimitry Andric   // This may happen when say a generic part uses a GISelKnownBits object
1665ffd83dbSDimitry Andric   // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
1675ffd83dbSDimitry Andric   // which creates a new GISelKnownBits object with a different and smaller
1685ffd83dbSDimitry Andric   // depth. If we just check for equality, we would never exit if the depth
1695ffd83dbSDimitry Andric   // that is passed down to the target specific GISelKnownBits object is
1705ffd83dbSDimitry Andric   // already bigger than its max depth.
1715ffd83dbSDimitry Andric   if (Depth >= getMaxDepth())
1728bcb0991SDimitry Andric     return;
1738bcb0991SDimitry Andric 
1748bcb0991SDimitry Andric   if (!DemandedElts)
1758bcb0991SDimitry Andric     return; // No demanded elts, better to assume we don't know anything.
1768bcb0991SDimitry Andric 
1778bcb0991SDimitry Andric   KnownBits Known2;
1788bcb0991SDimitry Andric 
1798bcb0991SDimitry Andric   switch (Opcode) {
1808bcb0991SDimitry Andric   default:
1818bcb0991SDimitry Andric     TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
1828bcb0991SDimitry Andric                                       Depth);
1838bcb0991SDimitry Andric     break;
184fe6060f1SDimitry Andric   case TargetOpcode::G_BUILD_VECTOR: {
185fe6060f1SDimitry Andric     // Collect the known bits that are shared by every demanded vector element.
186fe6060f1SDimitry Andric     Known.Zero.setAllBits(); Known.One.setAllBits();
187fe6060f1SDimitry Andric     for (unsigned i = 0, e = MI.getNumOperands() - 1; i < e; ++i) {
188fe6060f1SDimitry Andric       if (!DemandedElts[i])
189fe6060f1SDimitry Andric         continue;
190fe6060f1SDimitry Andric 
191fe6060f1SDimitry Andric       computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedElts,
192fe6060f1SDimitry Andric                            Depth + 1);
193fe6060f1SDimitry Andric 
194fe6060f1SDimitry Andric       // Known bits are the values that are shared by every demanded element.
195fe6060f1SDimitry Andric       Known = KnownBits::commonBits(Known, Known2);
196fe6060f1SDimitry Andric 
197fe6060f1SDimitry Andric       // If we don't know any bits, early out.
198fe6060f1SDimitry Andric       if (Known.isUnknown())
199fe6060f1SDimitry Andric         break;
200fe6060f1SDimitry Andric     }
201fe6060f1SDimitry Andric     break;
202fe6060f1SDimitry Andric   }
2035ffd83dbSDimitry Andric   case TargetOpcode::COPY:
2045ffd83dbSDimitry Andric   case TargetOpcode::G_PHI:
2055ffd83dbSDimitry Andric   case TargetOpcode::PHI: {
206349cc55cSDimitry Andric     Known.One = APInt::getAllOnes(BitWidth);
207349cc55cSDimitry Andric     Known.Zero = APInt::getAllOnes(BitWidth);
2085ffd83dbSDimitry Andric     // Destination registers should not have subregisters at this
2095ffd83dbSDimitry Andric     // point of the pipeline, otherwise the main live-range will be
2105ffd83dbSDimitry Andric     // defined more than once, which is against SSA.
2115ffd83dbSDimitry Andric     assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
2125ffd83dbSDimitry Andric     // Record in the cache that we know nothing for MI.
2135ffd83dbSDimitry Andric     // This will get updated later and in the meantime, if we reach that
2145ffd83dbSDimitry Andric     // phi again, because of a loop, we will cut the search thanks to this
2155ffd83dbSDimitry Andric     // cache entry.
2165ffd83dbSDimitry Andric     // We could actually build up more information on the phi by not cutting
2175ffd83dbSDimitry Andric     // the search, but that additional information is more a side effect
2185ffd83dbSDimitry Andric     // than an intended choice.
2195ffd83dbSDimitry Andric     // Therefore, for now, save on compile time until we derive a proper way
2205ffd83dbSDimitry Andric     // to derive known bits for PHIs within loops.
2215ffd83dbSDimitry Andric     ComputeKnownBitsCache[R] = KnownBits(BitWidth);
2225ffd83dbSDimitry Andric     // PHI's operand are a mix of registers and basic blocks interleaved.
2235ffd83dbSDimitry Andric     // We only care about the register ones.
2245ffd83dbSDimitry Andric     for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
2255ffd83dbSDimitry Andric       const MachineOperand &Src = MI.getOperand(Idx);
2265ffd83dbSDimitry Andric       Register SrcReg = Src.getReg();
2275ffd83dbSDimitry Andric       // Look through trivial copies and phis but don't look through trivial
2285ffd83dbSDimitry Andric       // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
2295ffd83dbSDimitry Andric       // analysis is currently unable to determine the bit width of a
2305ffd83dbSDimitry Andric       // register class.
2318bcb0991SDimitry Andric       //
2328bcb0991SDimitry Andric       // We can't use NoSubRegister by name as it's defined by each target but
2338bcb0991SDimitry Andric       // it's always defined to be 0 by tablegen.
2345ffd83dbSDimitry Andric       if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
2355ffd83dbSDimitry Andric           MRI.getType(SrcReg).isValid()) {
2365ffd83dbSDimitry Andric         // For COPYs we don't do anything, don't increase the depth.
2375ffd83dbSDimitry Andric         computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
2385ffd83dbSDimitry Andric                              Depth + (Opcode != TargetOpcode::COPY));
239e8d8bef9SDimitry Andric         Known = KnownBits::commonBits(Known, Known2);
2405ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
2415ffd83dbSDimitry Andric         // just stop looking through the operands.
2425ffd83dbSDimitry Andric         if (Known.One == 0 && Known.Zero == 0)
2435ffd83dbSDimitry Andric           break;
2445ffd83dbSDimitry Andric       } else {
2455ffd83dbSDimitry Andric         // We know nothing.
2465ffd83dbSDimitry Andric         Known = KnownBits(BitWidth);
2475ffd83dbSDimitry Andric         break;
2485ffd83dbSDimitry Andric       }
2498bcb0991SDimitry Andric     }
2508bcb0991SDimitry Andric     break;
2518bcb0991SDimitry Andric   }
2528bcb0991SDimitry Andric   case TargetOpcode::G_CONSTANT: {
253349cc55cSDimitry Andric     auto CstVal = getIConstantVRegVal(R, MRI);
2548bcb0991SDimitry Andric     if (!CstVal)
2558bcb0991SDimitry Andric       break;
256e8d8bef9SDimitry Andric     Known = KnownBits::makeConstant(*CstVal);
2578bcb0991SDimitry Andric     break;
2588bcb0991SDimitry Andric   }
2598bcb0991SDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
2605ffd83dbSDimitry Andric     int FrameIdx = MI.getOperand(1).getIndex();
2615ffd83dbSDimitry Andric     TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
2628bcb0991SDimitry Andric     break;
2638bcb0991SDimitry Andric   }
2648bcb0991SDimitry Andric   case TargetOpcode::G_SUB: {
2655ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2668bcb0991SDimitry Andric                          Depth + 1);
2678bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2688bcb0991SDimitry Andric                          Depth + 1);
2695ffd83dbSDimitry Andric     Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known,
2705ffd83dbSDimitry Andric                                         Known2);
2718bcb0991SDimitry Andric     break;
2728bcb0991SDimitry Andric   }
2738bcb0991SDimitry Andric   case TargetOpcode::G_XOR: {
2748bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2758bcb0991SDimitry Andric                          Depth + 1);
2768bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2778bcb0991SDimitry Andric                          Depth + 1);
2788bcb0991SDimitry Andric 
2795ffd83dbSDimitry Andric     Known ^= Known2;
2808bcb0991SDimitry Andric     break;
2818bcb0991SDimitry Andric   }
282480093f4SDimitry Andric   case TargetOpcode::G_PTR_ADD: {
283fe6060f1SDimitry Andric     if (DstTy.isVector())
284fe6060f1SDimitry Andric       break;
285480093f4SDimitry Andric     // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
2868bcb0991SDimitry Andric     LLT Ty = MRI.getType(MI.getOperand(1).getReg());
2878bcb0991SDimitry Andric     if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
2888bcb0991SDimitry Andric       break;
2898bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
2908bcb0991SDimitry Andric   }
2918bcb0991SDimitry Andric   case TargetOpcode::G_ADD: {
2925ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2938bcb0991SDimitry Andric                          Depth + 1);
2948bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2958bcb0991SDimitry Andric                          Depth + 1);
2965ffd83dbSDimitry Andric     Known =
2975ffd83dbSDimitry Andric         KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2);
2988bcb0991SDimitry Andric     break;
2998bcb0991SDimitry Andric   }
3008bcb0991SDimitry Andric   case TargetOpcode::G_AND: {
3018bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
3028bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3038bcb0991SDimitry Andric                          Depth + 1);
3048bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3058bcb0991SDimitry Andric                          Depth + 1);
3068bcb0991SDimitry Andric 
3075ffd83dbSDimitry Andric     Known &= Known2;
3088bcb0991SDimitry Andric     break;
3098bcb0991SDimitry Andric   }
3108bcb0991SDimitry Andric   case TargetOpcode::G_OR: {
3118bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
3128bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3138bcb0991SDimitry Andric                          Depth + 1);
3148bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3158bcb0991SDimitry Andric                          Depth + 1);
3168bcb0991SDimitry Andric 
3175ffd83dbSDimitry Andric     Known |= Known2;
3188bcb0991SDimitry Andric     break;
3198bcb0991SDimitry Andric   }
3208bcb0991SDimitry Andric   case TargetOpcode::G_MUL: {
3218bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3228bcb0991SDimitry Andric                          Depth + 1);
3238bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3248bcb0991SDimitry Andric                          Depth + 1);
325fe6060f1SDimitry Andric     Known = KnownBits::mul(Known, Known2);
3268bcb0991SDimitry Andric     break;
3278bcb0991SDimitry Andric   }
3288bcb0991SDimitry Andric   case TargetOpcode::G_SELECT: {
329e8d8bef9SDimitry Andric     computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
330e8d8bef9SDimitry Andric                         Known, DemandedElts, Depth + 1);
3318bcb0991SDimitry Andric     break;
332e8d8bef9SDimitry Andric   }
333e8d8bef9SDimitry Andric   case TargetOpcode::G_SMIN: {
334e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
335e8d8bef9SDimitry Andric     KnownBits KnownRHS;
336e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3378bcb0991SDimitry Andric                          Depth + 1);
338e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
339e8d8bef9SDimitry Andric                          Depth + 1);
340e8d8bef9SDimitry Andric     Known = KnownBits::smin(Known, KnownRHS);
341e8d8bef9SDimitry Andric     break;
342e8d8bef9SDimitry Andric   }
343e8d8bef9SDimitry Andric   case TargetOpcode::G_SMAX: {
344e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
345e8d8bef9SDimitry Andric     KnownBits KnownRHS;
346e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
347e8d8bef9SDimitry Andric                          Depth + 1);
348e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
349e8d8bef9SDimitry Andric                          Depth + 1);
350e8d8bef9SDimitry Andric     Known = KnownBits::smax(Known, KnownRHS);
351e8d8bef9SDimitry Andric     break;
352e8d8bef9SDimitry Andric   }
353e8d8bef9SDimitry Andric   case TargetOpcode::G_UMIN: {
354e8d8bef9SDimitry Andric     KnownBits KnownRHS;
355e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
356e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
357e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
358e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
359e8d8bef9SDimitry Andric     Known = KnownBits::umin(Known, KnownRHS);
360e8d8bef9SDimitry Andric     break;
361e8d8bef9SDimitry Andric   }
362e8d8bef9SDimitry Andric   case TargetOpcode::G_UMAX: {
363e8d8bef9SDimitry Andric     KnownBits KnownRHS;
364e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
365e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
366e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
367e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
368e8d8bef9SDimitry Andric     Known = KnownBits::umax(Known, KnownRHS);
3698bcb0991SDimitry Andric     break;
3708bcb0991SDimitry Andric   }
3718bcb0991SDimitry Andric   case TargetOpcode::G_FCMP:
3728bcb0991SDimitry Andric   case TargetOpcode::G_ICMP: {
373fe6060f1SDimitry Andric     if (DstTy.isVector())
374fe6060f1SDimitry Andric       break;
3758bcb0991SDimitry Andric     if (TL.getBooleanContents(DstTy.isVector(),
3768bcb0991SDimitry Andric                               Opcode == TargetOpcode::G_FCMP) ==
3778bcb0991SDimitry Andric             TargetLowering::ZeroOrOneBooleanContent &&
3788bcb0991SDimitry Andric         BitWidth > 1)
3798bcb0991SDimitry Andric       Known.Zero.setBitsFrom(1);
3808bcb0991SDimitry Andric     break;
3818bcb0991SDimitry Andric   }
3828bcb0991SDimitry Andric   case TargetOpcode::G_SEXT: {
3838bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3848bcb0991SDimitry Andric                          Depth + 1);
3858bcb0991SDimitry Andric     // If the sign bit is known to be zero or one, then sext will extend
3868bcb0991SDimitry Andric     // it to the top bits, else it will just zext.
3878bcb0991SDimitry Andric     Known = Known.sext(BitWidth);
3888bcb0991SDimitry Andric     break;
3898bcb0991SDimitry Andric   }
390fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
391e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
392e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
393e8d8bef9SDimitry Andric                          Depth + 1);
394e8d8bef9SDimitry Andric     Known = Known.sextInReg(MI.getOperand(2).getImm());
395e8d8bef9SDimitry Andric     break;
396e8d8bef9SDimitry Andric   }
3978bcb0991SDimitry Andric   case TargetOpcode::G_ANYEXT: {
3988bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3998bcb0991SDimitry Andric                          Depth + 1);
400e8d8bef9SDimitry Andric     Known = Known.anyext(BitWidth);
4018bcb0991SDimitry Andric     break;
4028bcb0991SDimitry Andric   }
4038bcb0991SDimitry Andric   case TargetOpcode::G_LOAD: {
4048bcb0991SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
4058bcb0991SDimitry Andric     if (const MDNode *Ranges = MMO->getRanges()) {
4068bcb0991SDimitry Andric       computeKnownBitsFromRangeMetadata(*Ranges, Known);
4078bcb0991SDimitry Andric     }
408e8d8bef9SDimitry Andric 
4098bcb0991SDimitry Andric     break;
4108bcb0991SDimitry Andric   }
4118bcb0991SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
412fe6060f1SDimitry Andric     if (DstTy.isVector())
413fe6060f1SDimitry Andric       break;
4148bcb0991SDimitry Andric     // Everything above the retrieved bits is zero
4158bcb0991SDimitry Andric     Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits());
4168bcb0991SDimitry Andric     break;
4178bcb0991SDimitry Andric   }
418e8d8bef9SDimitry Andric   case TargetOpcode::G_ASHR: {
419e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
420e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
421e8d8bef9SDimitry Andric                          Depth + 1);
4228bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
4238bcb0991SDimitry Andric                          Depth + 1);
424e8d8bef9SDimitry Andric     Known = KnownBits::ashr(LHSKnown, RHSKnown);
4258bcb0991SDimitry Andric     break;
4268bcb0991SDimitry Andric   }
427e8d8bef9SDimitry Andric   case TargetOpcode::G_LSHR: {
428e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
429e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
4308bcb0991SDimitry Andric                          Depth + 1);
431e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
432e8d8bef9SDimitry Andric                          Depth + 1);
433e8d8bef9SDimitry Andric     Known = KnownBits::lshr(LHSKnown, RHSKnown);
4348bcb0991SDimitry Andric     break;
4358bcb0991SDimitry Andric   }
436e8d8bef9SDimitry Andric   case TargetOpcode::G_SHL: {
437e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
438e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
439e8d8bef9SDimitry Andric                          Depth + 1);
440e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
441e8d8bef9SDimitry Andric                          Depth + 1);
442e8d8bef9SDimitry Andric     Known = KnownBits::shl(LHSKnown, RHSKnown);
4438bcb0991SDimitry Andric     break;
4448bcb0991SDimitry Andric   }
4458bcb0991SDimitry Andric   case TargetOpcode::G_INTTOPTR:
4468bcb0991SDimitry Andric   case TargetOpcode::G_PTRTOINT:
447fe6060f1SDimitry Andric     if (DstTy.isVector())
448fe6060f1SDimitry Andric       break;
4498bcb0991SDimitry Andric     // Fall through and handle them the same as zext/trunc.
4508bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
451fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_ZEXT:
4528bcb0991SDimitry Andric   case TargetOpcode::G_ZEXT:
4538bcb0991SDimitry Andric   case TargetOpcode::G_TRUNC: {
4548bcb0991SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
4558bcb0991SDimitry Andric     LLT SrcTy = MRI.getType(SrcReg);
456fe6060f1SDimitry Andric     unsigned SrcBitWidth;
457fe6060f1SDimitry Andric 
458fe6060f1SDimitry Andric     // G_ASSERT_ZEXT stores the original bitwidth in the immediate operand.
459fe6060f1SDimitry Andric     if (Opcode == TargetOpcode::G_ASSERT_ZEXT)
460fe6060f1SDimitry Andric       SrcBitWidth = MI.getOperand(2).getImm();
461fe6060f1SDimitry Andric     else {
462fe6060f1SDimitry Andric       SrcBitWidth = SrcTy.isPointer()
4638bcb0991SDimitry Andric                         ? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
4648bcb0991SDimitry Andric                         : SrcTy.getSizeInBits();
465fe6060f1SDimitry Andric     }
4668bcb0991SDimitry Andric     assert(SrcBitWidth && "SrcBitWidth can't be zero");
4675ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(SrcBitWidth);
4688bcb0991SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
4695ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(BitWidth);
4708bcb0991SDimitry Andric     if (BitWidth > SrcBitWidth)
4718bcb0991SDimitry Andric       Known.Zero.setBitsFrom(SrcBitWidth);
4728bcb0991SDimitry Andric     break;
4738bcb0991SDimitry Andric   }
47404eeddc0SDimitry Andric   case TargetOpcode::G_ASSERT_ALIGN: {
47504eeddc0SDimitry Andric     int64_t LogOfAlign = MI.getOperand(2).getImm();
47604eeddc0SDimitry Andric     if (LogOfAlign == 0)
47704eeddc0SDimitry Andric       break;
47804eeddc0SDimitry Andric 
47904eeddc0SDimitry Andric     // TODO: Should use maximum with source
48004eeddc0SDimitry Andric     // If a node is guaranteed to be aligned, set low zero bits accordingly as
48104eeddc0SDimitry Andric     // well as clearing one bits.
48204eeddc0SDimitry Andric     Known.Zero.setLowBits(LogOfAlign);
48304eeddc0SDimitry Andric     Known.One.clearLowBits(LogOfAlign);
48404eeddc0SDimitry Andric     break;
48504eeddc0SDimitry Andric   }
486e8d8bef9SDimitry Andric   case TargetOpcode::G_MERGE_VALUES: {
487e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
488e8d8bef9SDimitry Andric     unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
489e8d8bef9SDimitry Andric 
490e8d8bef9SDimitry Andric     for (unsigned I = 0; I != NumOps - 1; ++I) {
491e8d8bef9SDimitry Andric       KnownBits SrcOpKnown;
492e8d8bef9SDimitry Andric       computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
493e8d8bef9SDimitry Andric                            DemandedElts, Depth + 1);
494e8d8bef9SDimitry Andric       Known.insertBits(SrcOpKnown, I * OpSize);
495e8d8bef9SDimitry Andric     }
496e8d8bef9SDimitry Andric     break;
497e8d8bef9SDimitry Andric   }
498e8d8bef9SDimitry Andric   case TargetOpcode::G_UNMERGE_VALUES: {
499fe6060f1SDimitry Andric     if (DstTy.isVector())
500fe6060f1SDimitry Andric       break;
501e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
502e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(NumOps - 1).getReg();
503e8d8bef9SDimitry Andric     if (MRI.getType(SrcReg).isVector())
504e8d8bef9SDimitry Andric       return; // TODO: Handle vectors.
505e8d8bef9SDimitry Andric 
506e8d8bef9SDimitry Andric     KnownBits SrcOpKnown;
507e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1);
508e8d8bef9SDimitry Andric 
509e8d8bef9SDimitry Andric     // Figure out the result operand index
510e8d8bef9SDimitry Andric     unsigned DstIdx = 0;
511e8d8bef9SDimitry Andric     for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
512e8d8bef9SDimitry Andric          ++DstIdx)
513e8d8bef9SDimitry Andric       ;
514e8d8bef9SDimitry Andric 
515e8d8bef9SDimitry Andric     Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
516e8d8bef9SDimitry Andric     break;
517e8d8bef9SDimitry Andric   }
518e8d8bef9SDimitry Andric   case TargetOpcode::G_BSWAP: {
519e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
520e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
521fe6060f1SDimitry Andric     Known = Known.byteSwap();
522e8d8bef9SDimitry Andric     break;
523e8d8bef9SDimitry Andric   }
524e8d8bef9SDimitry Andric   case TargetOpcode::G_BITREVERSE: {
525e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
526e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
527fe6060f1SDimitry Andric     Known = Known.reverseBits();
528fe6060f1SDimitry Andric     break;
529fe6060f1SDimitry Andric   }
530349cc55cSDimitry Andric   case TargetOpcode::G_CTPOP: {
531349cc55cSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
532349cc55cSDimitry Andric                          Depth + 1);
533349cc55cSDimitry Andric     // We can bound the space the count needs.  Also, bits known to be zero can't
534349cc55cSDimitry Andric     // contribute to the population.
535349cc55cSDimitry Andric     unsigned BitsPossiblySet = Known2.countMaxPopulation();
536349cc55cSDimitry Andric     unsigned LowBits = Log2_32(BitsPossiblySet)+1;
537349cc55cSDimitry Andric     Known.Zero.setBitsFrom(LowBits);
538349cc55cSDimitry Andric     // TODO: we could bound Known.One using the lower bound on the number of
539349cc55cSDimitry Andric     // bits which might be set provided by popcnt KnownOne2.
540349cc55cSDimitry Andric     break;
541349cc55cSDimitry Andric   }
542fe6060f1SDimitry Andric   case TargetOpcode::G_UBFX: {
543fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
544fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
545fe6060f1SDimitry Andric                          Depth + 1);
546fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
547fe6060f1SDimitry Andric                          Depth + 1);
548fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
549fe6060f1SDimitry Andric                          Depth + 1);
550fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
551fe6060f1SDimitry Andric     break;
552fe6060f1SDimitry Andric   }
553fe6060f1SDimitry Andric   case TargetOpcode::G_SBFX: {
554fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
555fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
556fe6060f1SDimitry Andric                          Depth + 1);
557fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
558fe6060f1SDimitry Andric                          Depth + 1);
559fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
560fe6060f1SDimitry Andric                          Depth + 1);
561fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
562fe6060f1SDimitry Andric     // Sign extend the extracted value using shift left and arithmetic shift
563fe6060f1SDimitry Andric     // right.
564fe6060f1SDimitry Andric     KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth));
565fe6060f1SDimitry Andric     KnownBits ShiftKnown = KnownBits::computeForAddSub(
566fe6060f1SDimitry Andric         /*Add*/ false, /*NSW*/ false, ExtKnown, WidthKnown);
567fe6060f1SDimitry Andric     Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
568e8d8bef9SDimitry Andric     break;
569e8d8bef9SDimitry Andric   }
570*81ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
571*81ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
572*81ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
573*81ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
574*81ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
575*81ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
576*81ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
577*81ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
578*81ad6265SDimitry Andric   case TargetOpcode::G_UMULO:
579*81ad6265SDimitry Andric   case TargetOpcode::G_SMULO: {
580*81ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
581*81ad6265SDimitry Andric       // If we know the result of a compare has the top bits zero, use this
582*81ad6265SDimitry Andric       // info.
583*81ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
584*81ad6265SDimitry Andric               TargetLowering::ZeroOrOneBooleanContent &&
585*81ad6265SDimitry Andric           BitWidth > 1)
586*81ad6265SDimitry Andric         Known.Zero.setBitsFrom(1);
587*81ad6265SDimitry Andric     }
588*81ad6265SDimitry Andric     break;
589*81ad6265SDimitry Andric   }
5908bcb0991SDimitry Andric   }
5918bcb0991SDimitry Andric 
5928bcb0991SDimitry Andric   assert(!Known.hasConflict() && "Bits known to be one AND zero?");
5935ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
5945ffd83dbSDimitry Andric 
5955ffd83dbSDimitry Andric   // Update the cache.
5965ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
5978bcb0991SDimitry Andric }
5988bcb0991SDimitry Andric 
599e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1
600e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1,
601e8d8bef9SDimitry Andric                                                const APInt &DemandedElts,
602e8d8bef9SDimitry Andric                                                unsigned Depth) {
603e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
604e8d8bef9SDimitry Andric   unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
605e8d8bef9SDimitry Andric   if (Src1SignBits == 1)
606e8d8bef9SDimitry Andric     return 1;
607e8d8bef9SDimitry Andric   return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
608e8d8bef9SDimitry Andric }
609e8d8bef9SDimitry Andric 
610480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
611480093f4SDimitry Andric                                             const APInt &DemandedElts,
612480093f4SDimitry Andric                                             unsigned Depth) {
613480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
614480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
615480093f4SDimitry Andric 
616480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
617480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
618480093f4SDimitry Andric 
619480093f4SDimitry Andric   if (Depth == getMaxDepth())
620480093f4SDimitry Andric     return 1;
621480093f4SDimitry Andric 
622480093f4SDimitry Andric   if (!DemandedElts)
623480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
624480093f4SDimitry Andric 
625480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
6265ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
627480093f4SDimitry Andric 
628480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
629480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
630480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
631480093f4SDimitry Andric   // state.
632480093f4SDimitry Andric   if (!DstTy.isValid())
633480093f4SDimitry Andric     return 1;
634480093f4SDimitry Andric 
6355ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
636480093f4SDimitry Andric   switch (Opcode) {
637480093f4SDimitry Andric   case TargetOpcode::COPY: {
638480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
639480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
640480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
641480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
642480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
643480093f4SDimitry Andric     }
644480093f4SDimitry Andric 
645480093f4SDimitry Andric     return 1;
646480093f4SDimitry Andric   }
647480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
648480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
649480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
650480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
651480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
652480093f4SDimitry Andric   }
653fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
654e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
655e8d8bef9SDimitry Andric     // Max of the input and what this extends.
656e8d8bef9SDimitry Andric     Register Src = MI.getOperand(1).getReg();
657e8d8bef9SDimitry Andric     unsigned SrcBits = MI.getOperand(2).getImm();
658e8d8bef9SDimitry Andric     unsigned InRegBits = TyBits - SrcBits + 1;
659e8d8bef9SDimitry Andric     return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits);
660e8d8bef9SDimitry Andric   }
6615ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
662e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
663e8d8bef9SDimitry Andric     if (DstTy.isVector())
664e8d8bef9SDimitry Andric       return 1;
665e8d8bef9SDimitry Andric 
666e8d8bef9SDimitry Andric     // e.g. i16->i32 = '17' bits known.
667e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
668e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits() + 1;
669e8d8bef9SDimitry Andric   }
670e8d8bef9SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
671e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
672e8d8bef9SDimitry Andric     if (DstTy.isVector())
673e8d8bef9SDimitry Andric       return 1;
674e8d8bef9SDimitry Andric 
675e8d8bef9SDimitry Andric     // e.g. i16->i32 = '16' bits known.
676e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
677e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits();
6785ffd83dbSDimitry Andric   }
679480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
680480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
681480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
682480093f4SDimitry Andric 
683480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
684480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
685480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
686480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
687480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
688480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
689480093f4SDimitry Andric     break;
690480093f4SDimitry Andric   }
691e8d8bef9SDimitry Andric   case TargetOpcode::G_SELECT: {
692e8d8bef9SDimitry Andric     return computeNumSignBitsMin(MI.getOperand(2).getReg(),
693e8d8bef9SDimitry Andric                                  MI.getOperand(3).getReg(), DemandedElts,
694e8d8bef9SDimitry Andric                                  Depth + 1);
695e8d8bef9SDimitry Andric   }
696*81ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
697*81ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
698*81ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
699*81ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
700*81ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
701*81ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
702*81ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
703*81ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
704*81ad6265SDimitry Andric   case TargetOpcode::G_SMULO:
705*81ad6265SDimitry Andric   case TargetOpcode::G_UMULO: {
706*81ad6265SDimitry Andric     // If compares returns 0/-1, all bits are sign bits.
707*81ad6265SDimitry Andric     // We know that we have an integer-based boolean since these operations
708*81ad6265SDimitry Andric     // are only available for integer.
709*81ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
710*81ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
711*81ad6265SDimitry Andric           TargetLowering::ZeroOrNegativeOneBooleanContent)
712*81ad6265SDimitry Andric         return TyBits;
713*81ad6265SDimitry Andric     }
714*81ad6265SDimitry Andric 
715*81ad6265SDimitry Andric     break;
716*81ad6265SDimitry Andric   }
7175ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
7185ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
7195ffd83dbSDimitry Andric   default: {
7205ffd83dbSDimitry Andric     unsigned NumBits =
7215ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
7225ffd83dbSDimitry Andric     if (NumBits > 1)
7235ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
724480093f4SDimitry Andric     break;
725480093f4SDimitry Andric   }
7265ffd83dbSDimitry Andric   }
727480093f4SDimitry Andric 
7285ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
7295ffd83dbSDimitry Andric   // use this information.
7305ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
7315ffd83dbSDimitry Andric   APInt Mask;
7325ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
7335ffd83dbSDimitry Andric     Mask = Known.Zero;
7345ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
7355ffd83dbSDimitry Andric     Mask = Known.One;
7365ffd83dbSDimitry Andric   } else {
7375ffd83dbSDimitry Andric     // Nothing known.
7385ffd83dbSDimitry Andric     return FirstAnswer;
7395ffd83dbSDimitry Andric   }
7405ffd83dbSDimitry Andric 
7415ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
7425ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
7435ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
7445ffd83dbSDimitry Andric   return std::max(FirstAnswer, Mask.countLeadingOnes());
745480093f4SDimitry Andric }
746480093f4SDimitry Andric 
747480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
748480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
749349cc55cSDimitry Andric   APInt DemandedElts =
750349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
751480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
752480093f4SDimitry Andric }
753480093f4SDimitry Andric 
7548bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
7558bcb0991SDimitry Andric   AU.setPreservesAll();
7568bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
7578bcb0991SDimitry Andric }
7588bcb0991SDimitry Andric 
7598bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
7608bcb0991SDimitry Andric   return false;
7618bcb0991SDimitry Andric }
762