xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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"
14*06c3fb27SDimitry Andric #include "llvm/ADT/StringExtras.h"
158bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
168bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
178bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
188bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
198bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
208bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
21fe6060f1SDimitry Andric #include "llvm/IR/Module.h"
228bcb0991SDimitry Andric 
238bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits"
248bcb0991SDimitry Andric 
258bcb0991SDimitry Andric using namespace llvm;
268bcb0991SDimitry Andric 
278bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0;
288bcb0991SDimitry Andric 
295ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
308bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
318bcb0991SDimitry Andric 
325ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
338bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
345ffd83dbSDimitry Andric       DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {}
358bcb0991SDimitry Andric 
365ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
375ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
385ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
395ffd83dbSDimitry Andric   case TargetOpcode::COPY:
405ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
4104eeddc0SDimitry Andric   case TargetOpcode::G_ASSERT_ALIGN: {
4204eeddc0SDimitry Andric     // TODO: Min with source
43bdd1243dSDimitry Andric     return Align(MI->getOperand(2).getImm());
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.
119*06c3fb27SDimitry Andric   Known = Known.intersectWith(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.
195*06c3fb27SDimitry Andric       Known = Known.intersectWith(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));
239*06c3fb27SDimitry Andric         Known = Known.intersectWith(Known2);
2405ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
2415ffd83dbSDimitry Andric         // just stop looking through the operands.
242*06c3fb27SDimitry Andric         if (Known.isUnknown())
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;
289bdd1243dSDimitry Andric     [[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.
450bdd1243dSDimitry Andric     [[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: {
475bdd1243dSDimitry Andric     int64_t LogOfAlign = Log2_64(MI.getOperand(2).getImm());
47604eeddc0SDimitry Andric 
47704eeddc0SDimitry Andric     // TODO: Should use maximum with source
47804eeddc0SDimitry Andric     // If a node is guaranteed to be aligned, set low zero bits accordingly as
47904eeddc0SDimitry Andric     // well as clearing one bits.
48004eeddc0SDimitry Andric     Known.Zero.setLowBits(LogOfAlign);
48104eeddc0SDimitry Andric     Known.One.clearLowBits(LogOfAlign);
48204eeddc0SDimitry Andric     break;
48304eeddc0SDimitry Andric   }
484e8d8bef9SDimitry Andric   case TargetOpcode::G_MERGE_VALUES: {
485e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
486e8d8bef9SDimitry Andric     unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
487e8d8bef9SDimitry Andric 
488e8d8bef9SDimitry Andric     for (unsigned I = 0; I != NumOps - 1; ++I) {
489e8d8bef9SDimitry Andric       KnownBits SrcOpKnown;
490e8d8bef9SDimitry Andric       computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
491e8d8bef9SDimitry Andric                            DemandedElts, Depth + 1);
492e8d8bef9SDimitry Andric       Known.insertBits(SrcOpKnown, I * OpSize);
493e8d8bef9SDimitry Andric     }
494e8d8bef9SDimitry Andric     break;
495e8d8bef9SDimitry Andric   }
496e8d8bef9SDimitry Andric   case TargetOpcode::G_UNMERGE_VALUES: {
497fe6060f1SDimitry Andric     if (DstTy.isVector())
498fe6060f1SDimitry Andric       break;
499e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
500e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(NumOps - 1).getReg();
501e8d8bef9SDimitry Andric     if (MRI.getType(SrcReg).isVector())
502e8d8bef9SDimitry Andric       return; // TODO: Handle vectors.
503e8d8bef9SDimitry Andric 
504e8d8bef9SDimitry Andric     KnownBits SrcOpKnown;
505e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1);
506e8d8bef9SDimitry Andric 
507e8d8bef9SDimitry Andric     // Figure out the result operand index
508e8d8bef9SDimitry Andric     unsigned DstIdx = 0;
509e8d8bef9SDimitry Andric     for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
510e8d8bef9SDimitry Andric          ++DstIdx)
511e8d8bef9SDimitry Andric       ;
512e8d8bef9SDimitry Andric 
513e8d8bef9SDimitry Andric     Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
514e8d8bef9SDimitry Andric     break;
515e8d8bef9SDimitry Andric   }
516e8d8bef9SDimitry Andric   case TargetOpcode::G_BSWAP: {
517e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
518e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
519fe6060f1SDimitry Andric     Known = Known.byteSwap();
520e8d8bef9SDimitry Andric     break;
521e8d8bef9SDimitry Andric   }
522e8d8bef9SDimitry Andric   case TargetOpcode::G_BITREVERSE: {
523e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
524e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
525fe6060f1SDimitry Andric     Known = Known.reverseBits();
526fe6060f1SDimitry Andric     break;
527fe6060f1SDimitry Andric   }
528349cc55cSDimitry Andric   case TargetOpcode::G_CTPOP: {
529349cc55cSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
530349cc55cSDimitry Andric                          Depth + 1);
531349cc55cSDimitry Andric     // We can bound the space the count needs.  Also, bits known to be zero can't
532349cc55cSDimitry Andric     // contribute to the population.
533349cc55cSDimitry Andric     unsigned BitsPossiblySet = Known2.countMaxPopulation();
534bdd1243dSDimitry Andric     unsigned LowBits = llvm::bit_width(BitsPossiblySet);
535349cc55cSDimitry Andric     Known.Zero.setBitsFrom(LowBits);
536349cc55cSDimitry Andric     // TODO: we could bound Known.One using the lower bound on the number of
537349cc55cSDimitry Andric     // bits which might be set provided by popcnt KnownOne2.
538349cc55cSDimitry Andric     break;
539349cc55cSDimitry Andric   }
540fe6060f1SDimitry Andric   case TargetOpcode::G_UBFX: {
541fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
542fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
543fe6060f1SDimitry Andric                          Depth + 1);
544fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
545fe6060f1SDimitry Andric                          Depth + 1);
546fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
547fe6060f1SDimitry Andric                          Depth + 1);
548fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
549fe6060f1SDimitry Andric     break;
550fe6060f1SDimitry Andric   }
551fe6060f1SDimitry Andric   case TargetOpcode::G_SBFX: {
552fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
553fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
554fe6060f1SDimitry Andric                          Depth + 1);
555fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
556fe6060f1SDimitry Andric                          Depth + 1);
557fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
558fe6060f1SDimitry Andric                          Depth + 1);
559fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
560fe6060f1SDimitry Andric     // Sign extend the extracted value using shift left and arithmetic shift
561fe6060f1SDimitry Andric     // right.
562fe6060f1SDimitry Andric     KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth));
563fe6060f1SDimitry Andric     KnownBits ShiftKnown = KnownBits::computeForAddSub(
564fe6060f1SDimitry Andric         /*Add*/ false, /*NSW*/ false, ExtKnown, WidthKnown);
565fe6060f1SDimitry Andric     Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
566e8d8bef9SDimitry Andric     break;
567e8d8bef9SDimitry Andric   }
56881ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
56981ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
57081ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
57181ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
57281ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
57381ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
57481ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
57581ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
57681ad6265SDimitry Andric   case TargetOpcode::G_UMULO:
57781ad6265SDimitry Andric   case TargetOpcode::G_SMULO: {
57881ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
57981ad6265SDimitry Andric       // If we know the result of a compare has the top bits zero, use this
58081ad6265SDimitry Andric       // info.
58181ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
58281ad6265SDimitry Andric               TargetLowering::ZeroOrOneBooleanContent &&
58381ad6265SDimitry Andric           BitWidth > 1)
58481ad6265SDimitry Andric         Known.Zero.setBitsFrom(1);
58581ad6265SDimitry Andric     }
58681ad6265SDimitry Andric     break;
58781ad6265SDimitry Andric   }
5888bcb0991SDimitry Andric   }
5898bcb0991SDimitry Andric 
5908bcb0991SDimitry Andric   assert(!Known.hasConflict() && "Bits known to be one AND zero?");
5915ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
5925ffd83dbSDimitry Andric 
5935ffd83dbSDimitry Andric   // Update the cache.
5945ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
5958bcb0991SDimitry Andric }
5968bcb0991SDimitry Andric 
597e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1
598e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1,
599e8d8bef9SDimitry Andric                                                const APInt &DemandedElts,
600e8d8bef9SDimitry Andric                                                unsigned Depth) {
601e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
602e8d8bef9SDimitry Andric   unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
603e8d8bef9SDimitry Andric   if (Src1SignBits == 1)
604e8d8bef9SDimitry Andric     return 1;
605e8d8bef9SDimitry Andric   return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
606e8d8bef9SDimitry Andric }
607e8d8bef9SDimitry Andric 
608480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
609480093f4SDimitry Andric                                             const APInt &DemandedElts,
610480093f4SDimitry Andric                                             unsigned Depth) {
611480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
612480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
613480093f4SDimitry Andric 
614480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
615480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
616480093f4SDimitry Andric 
617480093f4SDimitry Andric   if (Depth == getMaxDepth())
618480093f4SDimitry Andric     return 1;
619480093f4SDimitry Andric 
620480093f4SDimitry Andric   if (!DemandedElts)
621480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
622480093f4SDimitry Andric 
623480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
6245ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
625480093f4SDimitry Andric 
626480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
627480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
628480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
629480093f4SDimitry Andric   // state.
630480093f4SDimitry Andric   if (!DstTy.isValid())
631480093f4SDimitry Andric     return 1;
632480093f4SDimitry Andric 
6335ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
634480093f4SDimitry Andric   switch (Opcode) {
635480093f4SDimitry Andric   case TargetOpcode::COPY: {
636480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
637480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
638480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
639480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
640480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
641480093f4SDimitry Andric     }
642480093f4SDimitry Andric 
643480093f4SDimitry Andric     return 1;
644480093f4SDimitry Andric   }
645480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
646480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
647480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
648480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
649480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
650480093f4SDimitry Andric   }
651fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
652e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
653e8d8bef9SDimitry Andric     // Max of the input and what this extends.
654e8d8bef9SDimitry Andric     Register Src = MI.getOperand(1).getReg();
655e8d8bef9SDimitry Andric     unsigned SrcBits = MI.getOperand(2).getImm();
656e8d8bef9SDimitry Andric     unsigned InRegBits = TyBits - SrcBits + 1;
657e8d8bef9SDimitry Andric     return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits);
658e8d8bef9SDimitry Andric   }
6595ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
660e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
661e8d8bef9SDimitry Andric     if (DstTy.isVector())
662e8d8bef9SDimitry Andric       return 1;
663e8d8bef9SDimitry Andric 
664e8d8bef9SDimitry Andric     // e.g. i16->i32 = '17' bits known.
665e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
666e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits() + 1;
667e8d8bef9SDimitry Andric   }
668e8d8bef9SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
669e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
670e8d8bef9SDimitry Andric     if (DstTy.isVector())
671e8d8bef9SDimitry Andric       return 1;
672e8d8bef9SDimitry Andric 
673e8d8bef9SDimitry Andric     // e.g. i16->i32 = '16' bits known.
674e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
675e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits();
6765ffd83dbSDimitry Andric   }
677480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
678480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
679480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
680480093f4SDimitry Andric 
681480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
682480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
683480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
684480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
685480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
686480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
687480093f4SDimitry Andric     break;
688480093f4SDimitry Andric   }
689e8d8bef9SDimitry Andric   case TargetOpcode::G_SELECT: {
690e8d8bef9SDimitry Andric     return computeNumSignBitsMin(MI.getOperand(2).getReg(),
691e8d8bef9SDimitry Andric                                  MI.getOperand(3).getReg(), DemandedElts,
692e8d8bef9SDimitry Andric                                  Depth + 1);
693e8d8bef9SDimitry Andric   }
69481ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
69581ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
69681ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
69781ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
69881ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
69981ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
70081ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
70181ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
70281ad6265SDimitry Andric   case TargetOpcode::G_SMULO:
70381ad6265SDimitry Andric   case TargetOpcode::G_UMULO: {
70481ad6265SDimitry Andric     // If compares returns 0/-1, all bits are sign bits.
70581ad6265SDimitry Andric     // We know that we have an integer-based boolean since these operations
70681ad6265SDimitry Andric     // are only available for integer.
70781ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
70881ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
70981ad6265SDimitry Andric           TargetLowering::ZeroOrNegativeOneBooleanContent)
71081ad6265SDimitry Andric         return TyBits;
71181ad6265SDimitry Andric     }
71281ad6265SDimitry Andric 
71381ad6265SDimitry Andric     break;
71481ad6265SDimitry Andric   }
715bdd1243dSDimitry Andric   case TargetOpcode::G_FCMP:
716bdd1243dSDimitry Andric   case TargetOpcode::G_ICMP: {
717bdd1243dSDimitry Andric     bool IsFP = Opcode == TargetOpcode::G_FCMP;
718bdd1243dSDimitry Andric     if (TyBits == 1)
719bdd1243dSDimitry Andric       break;
720bdd1243dSDimitry Andric     auto BC = TL.getBooleanContents(DstTy.isVector(), IsFP);
721bdd1243dSDimitry Andric     if (BC == TargetLoweringBase::ZeroOrNegativeOneBooleanContent)
722bdd1243dSDimitry Andric       return TyBits; // All bits are sign bits.
723bdd1243dSDimitry Andric     if (BC == TargetLowering::ZeroOrOneBooleanContent)
724bdd1243dSDimitry Andric       return TyBits - 1; // Every always-zero bit is a sign bit.
725bdd1243dSDimitry Andric     break;
726bdd1243dSDimitry Andric   }
7275ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
7285ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
7295ffd83dbSDimitry Andric   default: {
7305ffd83dbSDimitry Andric     unsigned NumBits =
7315ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
7325ffd83dbSDimitry Andric     if (NumBits > 1)
7335ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
734480093f4SDimitry Andric     break;
735480093f4SDimitry Andric   }
7365ffd83dbSDimitry Andric   }
737480093f4SDimitry Andric 
7385ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
7395ffd83dbSDimitry Andric   // use this information.
7405ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
7415ffd83dbSDimitry Andric   APInt Mask;
7425ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
7435ffd83dbSDimitry Andric     Mask = Known.Zero;
7445ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
7455ffd83dbSDimitry Andric     Mask = Known.One;
7465ffd83dbSDimitry Andric   } else {
7475ffd83dbSDimitry Andric     // Nothing known.
7485ffd83dbSDimitry Andric     return FirstAnswer;
7495ffd83dbSDimitry Andric   }
7505ffd83dbSDimitry Andric 
7515ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
7525ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
7535ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
754*06c3fb27SDimitry Andric   return std::max(FirstAnswer, Mask.countl_one());
755480093f4SDimitry Andric }
756480093f4SDimitry Andric 
757480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
758480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
759349cc55cSDimitry Andric   APInt DemandedElts =
760349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
761480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
762480093f4SDimitry Andric }
763480093f4SDimitry Andric 
7648bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
7658bcb0991SDimitry Andric   AU.setPreservesAll();
7668bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
7678bcb0991SDimitry Andric }
7688bcb0991SDimitry Andric 
7698bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
7708bcb0991SDimitry Andric   return false;
7718bcb0991SDimitry Andric }
772