xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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"
1406c3fb27SDimitry Andric #include "llvm/ADT/StringExtras.h"
158bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
16*0fca6ea1SDimitry Andric #include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
178bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
188bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
198bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
208bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
218bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
22*0fca6ea1SDimitry Andric #include "llvm/IR/ConstantRange.h"
23fe6060f1SDimitry Andric #include "llvm/IR/Module.h"
245f757f3fSDimitry Andric #include "llvm/Target/TargetMachine.h"
258bcb0991SDimitry Andric 
268bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits"
278bcb0991SDimitry Andric 
288bcb0991SDimitry Andric using namespace llvm;
298bcb0991SDimitry Andric 
308bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0;
318bcb0991SDimitry Andric 
325ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
338bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
348bcb0991SDimitry Andric 
355ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
368bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
37*0fca6ea1SDimitry Andric       DL(MF.getFunction().getDataLayout()), MaxDepth(MaxDepth) {}
388bcb0991SDimitry Andric 
395ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
405ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
415ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
425ffd83dbSDimitry Andric   case TargetOpcode::COPY:
435ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
4404eeddc0SDimitry Andric   case TargetOpcode::G_ASSERT_ALIGN: {
4504eeddc0SDimitry Andric     // TODO: Min with source
46bdd1243dSDimitry Andric     return Align(MI->getOperand(2).getImm());
4704eeddc0SDimitry Andric   }
485ffd83dbSDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
495ffd83dbSDimitry Andric     int FrameIdx = MI->getOperand(1).getIndex();
505ffd83dbSDimitry Andric     return MF.getFrameInfo().getObjectAlign(FrameIdx);
518bcb0991SDimitry Andric   }
525ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
535ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
545f757f3fSDimitry Andric   case TargetOpcode::G_INTRINSIC_CONVERGENT:
555f757f3fSDimitry Andric   case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
565ffd83dbSDimitry Andric   default:
575ffd83dbSDimitry Andric     return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
588bcb0991SDimitry Andric   }
598bcb0991SDimitry Andric }
608bcb0991SDimitry Andric 
618bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) {
625ffd83dbSDimitry Andric   assert(MI.getNumExplicitDefs() == 1 &&
635ffd83dbSDimitry Andric          "expected single return generic instruction");
648bcb0991SDimitry Andric   return getKnownBits(MI.getOperand(0).getReg());
658bcb0991SDimitry Andric }
668bcb0991SDimitry Andric 
678bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) {
685ffd83dbSDimitry Andric   const LLT Ty = MRI.getType(R);
69*0fca6ea1SDimitry Andric   // Since the number of lanes in a scalable vector is unknown at compile time,
70*0fca6ea1SDimitry Andric   // we track one bit which is implicitly broadcast to all lanes.  This means
71*0fca6ea1SDimitry Andric   // that all lanes in a scalable vector are considered demanded.
728bcb0991SDimitry Andric   APInt DemandedElts =
73*0fca6ea1SDimitry Andric       Ty.isFixedVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
745ffd83dbSDimitry Andric   return getKnownBits(R, DemandedElts);
755ffd83dbSDimitry Andric }
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts,
785ffd83dbSDimitry Andric                                        unsigned Depth) {
795ffd83dbSDimitry Andric   // For now, we only maintain the cache during one request.
805ffd83dbSDimitry Andric   assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared");
815ffd83dbSDimitry Andric 
825ffd83dbSDimitry Andric   KnownBits Known;
835f757f3fSDimitry Andric   computeKnownBitsImpl(R, Known, DemandedElts, Depth);
845ffd83dbSDimitry Andric   ComputeKnownBitsCache.clear();
858bcb0991SDimitry Andric   return Known;
868bcb0991SDimitry Andric }
878bcb0991SDimitry Andric 
888bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) {
898bcb0991SDimitry Andric   LLT Ty = MRI.getType(R);
908bcb0991SDimitry Andric   unsigned BitWidth = Ty.getScalarSizeInBits();
918bcb0991SDimitry Andric   return maskedValueIsZero(R, APInt::getSignMask(BitWidth));
928bcb0991SDimitry Andric }
938bcb0991SDimitry Andric 
948bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) {
958bcb0991SDimitry Andric   return getKnownBits(R).Zero;
968bcb0991SDimitry Andric }
978bcb0991SDimitry Andric 
988bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; }
998bcb0991SDimitry Andric 
1005ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void
1015ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
1025ffd83dbSDimitry Andric   dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
1035ffd83dbSDimitry Andric          << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
104fe6060f1SDimitry Andric          << toString(Known.Zero | Known.One, 16, false) << "\n"
105fe6060f1SDimitry Andric          << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false)
1065ffd83dbSDimitry Andric          << "\n"
107fe6060f1SDimitry Andric          << "[" << Depth << "] One:  0x" << toString(Known.One, 16, false)
1085ffd83dbSDimitry Andric          << "\n";
1095ffd83dbSDimitry Andric }
1105ffd83dbSDimitry Andric 
111e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1
112e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1,
113e8d8bef9SDimitry Andric                                          KnownBits &Known,
114e8d8bef9SDimitry Andric                                          const APInt &DemandedElts,
115e8d8bef9SDimitry Andric                                          unsigned Depth) {
116e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
117e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
118e8d8bef9SDimitry Andric 
119e8d8bef9SDimitry Andric   // If we don't know any bits, early out.
120e8d8bef9SDimitry Andric   if (Known.isUnknown())
121e8d8bef9SDimitry Andric     return;
122e8d8bef9SDimitry Andric 
123e8d8bef9SDimitry Andric   KnownBits Known2;
124e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
125e8d8bef9SDimitry Andric 
126e8d8bef9SDimitry Andric   // Only known if known in both the LHS and RHS.
12706c3fb27SDimitry Andric   Known = Known.intersectWith(Known2);
128e8d8bef9SDimitry Andric }
129e8d8bef9SDimitry Andric 
130fe6060f1SDimitry Andric // Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is
131fe6060f1SDimitry Andric // created using Width. Use this function when the inputs are KnownBits
132fe6060f1SDimitry Andric // objects. TODO: Move this KnownBits.h if this is usable in more cases.
133fe6060f1SDimitry Andric static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown,
134fe6060f1SDimitry Andric                              const KnownBits &OffsetKnown,
135fe6060f1SDimitry Andric                              const KnownBits &WidthKnown) {
136fe6060f1SDimitry Andric   KnownBits Mask(BitWidth);
137fe6060f1SDimitry Andric   Mask.Zero = APInt::getBitsSetFrom(
138fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMaxValue().getLimitedValue(BitWidth));
139fe6060f1SDimitry Andric   Mask.One = APInt::getLowBitsSet(
140fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMinValue().getLimitedValue(BitWidth));
141fe6060f1SDimitry Andric   return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask;
142fe6060f1SDimitry Andric }
143fe6060f1SDimitry Andric 
1448bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
1458bcb0991SDimitry Andric                                           const APInt &DemandedElts,
1468bcb0991SDimitry Andric                                           unsigned Depth) {
1478bcb0991SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
1488bcb0991SDimitry Andric   unsigned Opcode = MI.getOpcode();
1498bcb0991SDimitry Andric   LLT DstTy = MRI.getType(R);
1508bcb0991SDimitry Andric 
1518bcb0991SDimitry Andric   // Handle the case where this is called on a register that does not have a
1528bcb0991SDimitry Andric   // type constraint (i.e. it has a register class constraint instead). This is
1538bcb0991SDimitry Andric   // unlikely to occur except by looking through copies but it is possible for
1548bcb0991SDimitry Andric   // the initial register being queried to be in this state.
1558bcb0991SDimitry Andric   if (!DstTy.isValid()) {
1568bcb0991SDimitry Andric     Known = KnownBits();
1578bcb0991SDimitry Andric     return;
1588bcb0991SDimitry Andric   }
1598bcb0991SDimitry Andric 
160fe6060f1SDimitry Andric   unsigned BitWidth = DstTy.getScalarSizeInBits();
1615ffd83dbSDimitry Andric   auto CacheEntry = ComputeKnownBitsCache.find(R);
1625ffd83dbSDimitry Andric   if (CacheEntry != ComputeKnownBitsCache.end()) {
1635ffd83dbSDimitry Andric     Known = CacheEntry->second;
1645ffd83dbSDimitry Andric     LLVM_DEBUG(dbgs() << "Cache hit at ");
1655ffd83dbSDimitry Andric     LLVM_DEBUG(dumpResult(MI, Known, Depth));
1665ffd83dbSDimitry Andric     assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match");
1675ffd83dbSDimitry Andric     return;
1685ffd83dbSDimitry Andric   }
1698bcb0991SDimitry Andric   Known = KnownBits(BitWidth); // Don't know anything
1708bcb0991SDimitry Andric 
1715ffd83dbSDimitry Andric   // Depth may get bigger than max depth if it gets passed to a different
1725ffd83dbSDimitry Andric   // GISelKnownBits object.
1735ffd83dbSDimitry Andric   // This may happen when say a generic part uses a GISelKnownBits object
1745ffd83dbSDimitry Andric   // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
1755ffd83dbSDimitry Andric   // which creates a new GISelKnownBits object with a different and smaller
1765ffd83dbSDimitry Andric   // depth. If we just check for equality, we would never exit if the depth
1775ffd83dbSDimitry Andric   // that is passed down to the target specific GISelKnownBits object is
1785ffd83dbSDimitry Andric   // already bigger than its max depth.
1795ffd83dbSDimitry Andric   if (Depth >= getMaxDepth())
1808bcb0991SDimitry Andric     return;
1818bcb0991SDimitry Andric 
1828bcb0991SDimitry Andric   if (!DemandedElts)
1838bcb0991SDimitry Andric     return; // No demanded elts, better to assume we don't know anything.
1848bcb0991SDimitry Andric 
1858bcb0991SDimitry Andric   KnownBits Known2;
1868bcb0991SDimitry Andric 
1878bcb0991SDimitry Andric   switch (Opcode) {
1888bcb0991SDimitry Andric   default:
1898bcb0991SDimitry Andric     TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
1908bcb0991SDimitry Andric                                       Depth);
1918bcb0991SDimitry Andric     break;
192fe6060f1SDimitry Andric   case TargetOpcode::G_BUILD_VECTOR: {
193fe6060f1SDimitry Andric     // Collect the known bits that are shared by every demanded vector element.
194fe6060f1SDimitry Andric     Known.Zero.setAllBits(); Known.One.setAllBits();
195fe6060f1SDimitry Andric     for (unsigned i = 0, e = MI.getNumOperands() - 1; i < e; ++i) {
196fe6060f1SDimitry Andric       if (!DemandedElts[i])
197fe6060f1SDimitry Andric         continue;
198fe6060f1SDimitry Andric 
199fe6060f1SDimitry Andric       computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedElts,
200fe6060f1SDimitry Andric                            Depth + 1);
201fe6060f1SDimitry Andric 
202fe6060f1SDimitry Andric       // Known bits are the values that are shared by every demanded element.
20306c3fb27SDimitry Andric       Known = Known.intersectWith(Known2);
204fe6060f1SDimitry Andric 
205fe6060f1SDimitry Andric       // If we don't know any bits, early out.
206fe6060f1SDimitry Andric       if (Known.isUnknown())
207fe6060f1SDimitry Andric         break;
208fe6060f1SDimitry Andric     }
209fe6060f1SDimitry Andric     break;
210fe6060f1SDimitry Andric   }
2115ffd83dbSDimitry Andric   case TargetOpcode::COPY:
2125ffd83dbSDimitry Andric   case TargetOpcode::G_PHI:
2135ffd83dbSDimitry Andric   case TargetOpcode::PHI: {
214349cc55cSDimitry Andric     Known.One = APInt::getAllOnes(BitWidth);
215349cc55cSDimitry Andric     Known.Zero = APInt::getAllOnes(BitWidth);
2165ffd83dbSDimitry Andric     // Destination registers should not have subregisters at this
2175ffd83dbSDimitry Andric     // point of the pipeline, otherwise the main live-range will be
2185ffd83dbSDimitry Andric     // defined more than once, which is against SSA.
2195ffd83dbSDimitry Andric     assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
2205ffd83dbSDimitry Andric     // Record in the cache that we know nothing for MI.
2215ffd83dbSDimitry Andric     // This will get updated later and in the meantime, if we reach that
2225ffd83dbSDimitry Andric     // phi again, because of a loop, we will cut the search thanks to this
2235ffd83dbSDimitry Andric     // cache entry.
2245ffd83dbSDimitry Andric     // We could actually build up more information on the phi by not cutting
2255ffd83dbSDimitry Andric     // the search, but that additional information is more a side effect
2265ffd83dbSDimitry Andric     // than an intended choice.
2275ffd83dbSDimitry Andric     // Therefore, for now, save on compile time until we derive a proper way
2285ffd83dbSDimitry Andric     // to derive known bits for PHIs within loops.
2295ffd83dbSDimitry Andric     ComputeKnownBitsCache[R] = KnownBits(BitWidth);
2305ffd83dbSDimitry Andric     // PHI's operand are a mix of registers and basic blocks interleaved.
2315ffd83dbSDimitry Andric     // We only care about the register ones.
2325ffd83dbSDimitry Andric     for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
2335ffd83dbSDimitry Andric       const MachineOperand &Src = MI.getOperand(Idx);
2345ffd83dbSDimitry Andric       Register SrcReg = Src.getReg();
2355ffd83dbSDimitry Andric       // Look through trivial copies and phis but don't look through trivial
2365ffd83dbSDimitry Andric       // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
2375ffd83dbSDimitry Andric       // analysis is currently unable to determine the bit width of a
2385ffd83dbSDimitry Andric       // register class.
2398bcb0991SDimitry Andric       //
2408bcb0991SDimitry Andric       // We can't use NoSubRegister by name as it's defined by each target but
2418bcb0991SDimitry Andric       // it's always defined to be 0 by tablegen.
2425ffd83dbSDimitry Andric       if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
2435ffd83dbSDimitry Andric           MRI.getType(SrcReg).isValid()) {
2445ffd83dbSDimitry Andric         // For COPYs we don't do anything, don't increase the depth.
2455ffd83dbSDimitry Andric         computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
2465ffd83dbSDimitry Andric                              Depth + (Opcode != TargetOpcode::COPY));
24706c3fb27SDimitry Andric         Known = Known.intersectWith(Known2);
2485ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
2495ffd83dbSDimitry Andric         // just stop looking through the operands.
25006c3fb27SDimitry Andric         if (Known.isUnknown())
2515ffd83dbSDimitry Andric           break;
2525ffd83dbSDimitry Andric       } else {
2535ffd83dbSDimitry Andric         // We know nothing.
2545ffd83dbSDimitry Andric         Known = KnownBits(BitWidth);
2555ffd83dbSDimitry Andric         break;
2565ffd83dbSDimitry Andric       }
2578bcb0991SDimitry Andric     }
2588bcb0991SDimitry Andric     break;
2598bcb0991SDimitry Andric   }
2608bcb0991SDimitry Andric   case TargetOpcode::G_CONSTANT: {
261*0fca6ea1SDimitry Andric     Known = KnownBits::makeConstant(MI.getOperand(1).getCImm()->getValue());
2628bcb0991SDimitry Andric     break;
2638bcb0991SDimitry Andric   }
2648bcb0991SDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
2655ffd83dbSDimitry Andric     int FrameIdx = MI.getOperand(1).getIndex();
2665ffd83dbSDimitry Andric     TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
2678bcb0991SDimitry Andric     break;
2688bcb0991SDimitry Andric   }
2698bcb0991SDimitry Andric   case TargetOpcode::G_SUB: {
2705ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2718bcb0991SDimitry Andric                          Depth + 1);
2728bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2738bcb0991SDimitry Andric                          Depth + 1);
274*0fca6ea1SDimitry Andric     Known = KnownBits::computeForAddSub(/*Add=*/false, /*NSW=*/false,
275*0fca6ea1SDimitry Andric                                         /* NUW=*/false, Known, Known2);
2768bcb0991SDimitry Andric     break;
2778bcb0991SDimitry Andric   }
2788bcb0991SDimitry Andric   case TargetOpcode::G_XOR: {
2798bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2808bcb0991SDimitry Andric                          Depth + 1);
2818bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2828bcb0991SDimitry Andric                          Depth + 1);
2838bcb0991SDimitry Andric 
2845ffd83dbSDimitry Andric     Known ^= Known2;
2858bcb0991SDimitry Andric     break;
2868bcb0991SDimitry Andric   }
287480093f4SDimitry Andric   case TargetOpcode::G_PTR_ADD: {
288fe6060f1SDimitry Andric     if (DstTy.isVector())
289fe6060f1SDimitry Andric       break;
290480093f4SDimitry Andric     // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
2918bcb0991SDimitry Andric     LLT Ty = MRI.getType(MI.getOperand(1).getReg());
2928bcb0991SDimitry Andric     if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
2938bcb0991SDimitry Andric       break;
294bdd1243dSDimitry Andric     [[fallthrough]];
2958bcb0991SDimitry Andric   }
2968bcb0991SDimitry Andric   case TargetOpcode::G_ADD: {
2975ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2988bcb0991SDimitry Andric                          Depth + 1);
2998bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
3008bcb0991SDimitry Andric                          Depth + 1);
301*0fca6ea1SDimitry Andric     Known = KnownBits::computeForAddSub(/*Add=*/true, /*NSW=*/false,
302*0fca6ea1SDimitry Andric                                         /* NUW=*/false, Known, Known2);
3038bcb0991SDimitry Andric     break;
3048bcb0991SDimitry Andric   }
3058bcb0991SDimitry Andric   case TargetOpcode::G_AND: {
3068bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
3078bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3088bcb0991SDimitry Andric                          Depth + 1);
3098bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3108bcb0991SDimitry Andric                          Depth + 1);
3118bcb0991SDimitry Andric 
3125ffd83dbSDimitry Andric     Known &= Known2;
3138bcb0991SDimitry Andric     break;
3148bcb0991SDimitry Andric   }
3158bcb0991SDimitry Andric   case TargetOpcode::G_OR: {
3168bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
3178bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3188bcb0991SDimitry Andric                          Depth + 1);
3198bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3208bcb0991SDimitry Andric                          Depth + 1);
3218bcb0991SDimitry Andric 
3225ffd83dbSDimitry Andric     Known |= Known2;
3238bcb0991SDimitry Andric     break;
3248bcb0991SDimitry Andric   }
3258bcb0991SDimitry Andric   case TargetOpcode::G_MUL: {
3268bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3278bcb0991SDimitry Andric                          Depth + 1);
3288bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3298bcb0991SDimitry Andric                          Depth + 1);
330fe6060f1SDimitry Andric     Known = KnownBits::mul(Known, Known2);
3318bcb0991SDimitry Andric     break;
3328bcb0991SDimitry Andric   }
3338bcb0991SDimitry Andric   case TargetOpcode::G_SELECT: {
334e8d8bef9SDimitry Andric     computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
335e8d8bef9SDimitry Andric                         Known, DemandedElts, Depth + 1);
3368bcb0991SDimitry Andric     break;
337e8d8bef9SDimitry Andric   }
338e8d8bef9SDimitry Andric   case TargetOpcode::G_SMIN: {
339e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
340e8d8bef9SDimitry Andric     KnownBits KnownRHS;
341e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3428bcb0991SDimitry Andric                          Depth + 1);
343e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
344e8d8bef9SDimitry Andric                          Depth + 1);
345e8d8bef9SDimitry Andric     Known = KnownBits::smin(Known, KnownRHS);
346e8d8bef9SDimitry Andric     break;
347e8d8bef9SDimitry Andric   }
348e8d8bef9SDimitry Andric   case TargetOpcode::G_SMAX: {
349e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
350e8d8bef9SDimitry Andric     KnownBits KnownRHS;
351e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
352e8d8bef9SDimitry Andric                          Depth + 1);
353e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
354e8d8bef9SDimitry Andric                          Depth + 1);
355e8d8bef9SDimitry Andric     Known = KnownBits::smax(Known, KnownRHS);
356e8d8bef9SDimitry Andric     break;
357e8d8bef9SDimitry Andric   }
358e8d8bef9SDimitry Andric   case TargetOpcode::G_UMIN: {
359e8d8bef9SDimitry Andric     KnownBits KnownRHS;
360e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
361e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
362e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
363e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
364e8d8bef9SDimitry Andric     Known = KnownBits::umin(Known, KnownRHS);
365e8d8bef9SDimitry Andric     break;
366e8d8bef9SDimitry Andric   }
367e8d8bef9SDimitry Andric   case TargetOpcode::G_UMAX: {
368e8d8bef9SDimitry Andric     KnownBits KnownRHS;
369e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
370e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
371e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
372e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
373e8d8bef9SDimitry Andric     Known = KnownBits::umax(Known, KnownRHS);
3748bcb0991SDimitry Andric     break;
3758bcb0991SDimitry Andric   }
3768bcb0991SDimitry Andric   case TargetOpcode::G_FCMP:
3778bcb0991SDimitry Andric   case TargetOpcode::G_ICMP: {
378fe6060f1SDimitry Andric     if (DstTy.isVector())
379fe6060f1SDimitry Andric       break;
3808bcb0991SDimitry Andric     if (TL.getBooleanContents(DstTy.isVector(),
3818bcb0991SDimitry Andric                               Opcode == TargetOpcode::G_FCMP) ==
3828bcb0991SDimitry Andric             TargetLowering::ZeroOrOneBooleanContent &&
3838bcb0991SDimitry Andric         BitWidth > 1)
3848bcb0991SDimitry Andric       Known.Zero.setBitsFrom(1);
3858bcb0991SDimitry Andric     break;
3868bcb0991SDimitry Andric   }
3878bcb0991SDimitry Andric   case TargetOpcode::G_SEXT: {
3888bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3898bcb0991SDimitry Andric                          Depth + 1);
3908bcb0991SDimitry Andric     // If the sign bit is known to be zero or one, then sext will extend
3918bcb0991SDimitry Andric     // it to the top bits, else it will just zext.
3928bcb0991SDimitry Andric     Known = Known.sext(BitWidth);
3938bcb0991SDimitry Andric     break;
3948bcb0991SDimitry Andric   }
395fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
396e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
397e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
398e8d8bef9SDimitry Andric                          Depth + 1);
399e8d8bef9SDimitry Andric     Known = Known.sextInReg(MI.getOperand(2).getImm());
400e8d8bef9SDimitry Andric     break;
401e8d8bef9SDimitry Andric   }
4028bcb0991SDimitry Andric   case TargetOpcode::G_ANYEXT: {
4038bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
4048bcb0991SDimitry Andric                          Depth + 1);
405e8d8bef9SDimitry Andric     Known = Known.anyext(BitWidth);
4068bcb0991SDimitry Andric     break;
4078bcb0991SDimitry Andric   }
4088bcb0991SDimitry Andric   case TargetOpcode::G_LOAD: {
4098bcb0991SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
410*0fca6ea1SDimitry Andric     KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
411*0fca6ea1SDimitry Andric     if (const MDNode *Ranges = MMO->getRanges())
412*0fca6ea1SDimitry Andric       computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
413*0fca6ea1SDimitry Andric     Known = KnownRange.anyext(Known.getBitWidth());
4148bcb0991SDimitry Andric     break;
4158bcb0991SDimitry Andric   }
416*0fca6ea1SDimitry Andric   case TargetOpcode::G_SEXTLOAD:
4178bcb0991SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
418fe6060f1SDimitry Andric     if (DstTy.isVector())
419fe6060f1SDimitry Andric       break;
420*0fca6ea1SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
421*0fca6ea1SDimitry Andric     KnownBits KnownRange(MMO->getMemoryType().getScalarSizeInBits());
422*0fca6ea1SDimitry Andric     if (const MDNode *Ranges = MMO->getRanges())
423*0fca6ea1SDimitry Andric       computeKnownBitsFromRangeMetadata(*Ranges, KnownRange);
424*0fca6ea1SDimitry Andric     Known = Opcode == TargetOpcode::G_SEXTLOAD
425*0fca6ea1SDimitry Andric                 ? KnownRange.sext(Known.getBitWidth())
426*0fca6ea1SDimitry Andric                 : KnownRange.zext(Known.getBitWidth());
4278bcb0991SDimitry Andric     break;
4288bcb0991SDimitry Andric   }
429e8d8bef9SDimitry Andric   case TargetOpcode::G_ASHR: {
430e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
431e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
432e8d8bef9SDimitry Andric                          Depth + 1);
4338bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
4348bcb0991SDimitry Andric                          Depth + 1);
435e8d8bef9SDimitry Andric     Known = KnownBits::ashr(LHSKnown, RHSKnown);
4368bcb0991SDimitry Andric     break;
4378bcb0991SDimitry Andric   }
438e8d8bef9SDimitry Andric   case TargetOpcode::G_LSHR: {
439e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
440e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
4418bcb0991SDimitry Andric                          Depth + 1);
442e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
443e8d8bef9SDimitry Andric                          Depth + 1);
444e8d8bef9SDimitry Andric     Known = KnownBits::lshr(LHSKnown, RHSKnown);
4458bcb0991SDimitry Andric     break;
4468bcb0991SDimitry Andric   }
447e8d8bef9SDimitry Andric   case TargetOpcode::G_SHL: {
448e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
449e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
450e8d8bef9SDimitry Andric                          Depth + 1);
451e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
452e8d8bef9SDimitry Andric                          Depth + 1);
453e8d8bef9SDimitry Andric     Known = KnownBits::shl(LHSKnown, RHSKnown);
4548bcb0991SDimitry Andric     break;
4558bcb0991SDimitry Andric   }
4568bcb0991SDimitry Andric   case TargetOpcode::G_INTTOPTR:
4578bcb0991SDimitry Andric   case TargetOpcode::G_PTRTOINT:
458fe6060f1SDimitry Andric     if (DstTy.isVector())
459fe6060f1SDimitry Andric       break;
4608bcb0991SDimitry Andric     // Fall through and handle them the same as zext/trunc.
461bdd1243dSDimitry Andric     [[fallthrough]];
462fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_ZEXT:
4638bcb0991SDimitry Andric   case TargetOpcode::G_ZEXT:
4648bcb0991SDimitry Andric   case TargetOpcode::G_TRUNC: {
4658bcb0991SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
4668bcb0991SDimitry Andric     LLT SrcTy = MRI.getType(SrcReg);
467fe6060f1SDimitry Andric     unsigned SrcBitWidth;
468fe6060f1SDimitry Andric 
469fe6060f1SDimitry Andric     // G_ASSERT_ZEXT stores the original bitwidth in the immediate operand.
470fe6060f1SDimitry Andric     if (Opcode == TargetOpcode::G_ASSERT_ZEXT)
471fe6060f1SDimitry Andric       SrcBitWidth = MI.getOperand(2).getImm();
472fe6060f1SDimitry Andric     else {
473fe6060f1SDimitry Andric       SrcBitWidth = SrcTy.isPointer()
4748bcb0991SDimitry Andric                         ? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
4758bcb0991SDimitry Andric                         : SrcTy.getSizeInBits();
476fe6060f1SDimitry Andric     }
4778bcb0991SDimitry Andric     assert(SrcBitWidth && "SrcBitWidth can't be zero");
4785ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(SrcBitWidth);
4798bcb0991SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
4805ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(BitWidth);
4818bcb0991SDimitry Andric     if (BitWidth > SrcBitWidth)
4828bcb0991SDimitry Andric       Known.Zero.setBitsFrom(SrcBitWidth);
4838bcb0991SDimitry Andric     break;
4848bcb0991SDimitry Andric   }
48504eeddc0SDimitry Andric   case TargetOpcode::G_ASSERT_ALIGN: {
486bdd1243dSDimitry Andric     int64_t LogOfAlign = Log2_64(MI.getOperand(2).getImm());
48704eeddc0SDimitry Andric 
48804eeddc0SDimitry Andric     // TODO: Should use maximum with source
48904eeddc0SDimitry Andric     // If a node is guaranteed to be aligned, set low zero bits accordingly as
49004eeddc0SDimitry Andric     // well as clearing one bits.
49104eeddc0SDimitry Andric     Known.Zero.setLowBits(LogOfAlign);
49204eeddc0SDimitry Andric     Known.One.clearLowBits(LogOfAlign);
49304eeddc0SDimitry Andric     break;
49404eeddc0SDimitry Andric   }
495e8d8bef9SDimitry Andric   case TargetOpcode::G_MERGE_VALUES: {
496e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
497e8d8bef9SDimitry Andric     unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
498e8d8bef9SDimitry Andric 
499e8d8bef9SDimitry Andric     for (unsigned I = 0; I != NumOps - 1; ++I) {
500e8d8bef9SDimitry Andric       KnownBits SrcOpKnown;
501e8d8bef9SDimitry Andric       computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
502e8d8bef9SDimitry Andric                            DemandedElts, Depth + 1);
503e8d8bef9SDimitry Andric       Known.insertBits(SrcOpKnown, I * OpSize);
504e8d8bef9SDimitry Andric     }
505e8d8bef9SDimitry Andric     break;
506e8d8bef9SDimitry Andric   }
507e8d8bef9SDimitry Andric   case TargetOpcode::G_UNMERGE_VALUES: {
508fe6060f1SDimitry Andric     if (DstTy.isVector())
509fe6060f1SDimitry Andric       break;
510e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
511e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(NumOps - 1).getReg();
512e8d8bef9SDimitry Andric     if (MRI.getType(SrcReg).isVector())
513e8d8bef9SDimitry Andric       return; // TODO: Handle vectors.
514e8d8bef9SDimitry Andric 
515e8d8bef9SDimitry Andric     KnownBits SrcOpKnown;
516e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1);
517e8d8bef9SDimitry Andric 
518e8d8bef9SDimitry Andric     // Figure out the result operand index
519e8d8bef9SDimitry Andric     unsigned DstIdx = 0;
520e8d8bef9SDimitry Andric     for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
521e8d8bef9SDimitry Andric          ++DstIdx)
522e8d8bef9SDimitry Andric       ;
523e8d8bef9SDimitry Andric 
524e8d8bef9SDimitry Andric     Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
525e8d8bef9SDimitry Andric     break;
526e8d8bef9SDimitry Andric   }
527e8d8bef9SDimitry Andric   case TargetOpcode::G_BSWAP: {
528e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
529e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
530fe6060f1SDimitry Andric     Known = Known.byteSwap();
531e8d8bef9SDimitry Andric     break;
532e8d8bef9SDimitry Andric   }
533e8d8bef9SDimitry Andric   case TargetOpcode::G_BITREVERSE: {
534e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
535e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
536fe6060f1SDimitry Andric     Known = Known.reverseBits();
537fe6060f1SDimitry Andric     break;
538fe6060f1SDimitry Andric   }
539349cc55cSDimitry Andric   case TargetOpcode::G_CTPOP: {
540349cc55cSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
541349cc55cSDimitry Andric                          Depth + 1);
542349cc55cSDimitry Andric     // We can bound the space the count needs.  Also, bits known to be zero can't
543349cc55cSDimitry Andric     // contribute to the population.
544349cc55cSDimitry Andric     unsigned BitsPossiblySet = Known2.countMaxPopulation();
545bdd1243dSDimitry Andric     unsigned LowBits = llvm::bit_width(BitsPossiblySet);
546349cc55cSDimitry Andric     Known.Zero.setBitsFrom(LowBits);
547349cc55cSDimitry Andric     // TODO: we could bound Known.One using the lower bound on the number of
548349cc55cSDimitry Andric     // bits which might be set provided by popcnt KnownOne2.
549349cc55cSDimitry Andric     break;
550349cc55cSDimitry Andric   }
551fe6060f1SDimitry Andric   case TargetOpcode::G_UBFX: {
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     break;
561fe6060f1SDimitry Andric   }
562fe6060f1SDimitry Andric   case TargetOpcode::G_SBFX: {
563fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
564fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
565fe6060f1SDimitry Andric                          Depth + 1);
566fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
567fe6060f1SDimitry Andric                          Depth + 1);
568fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
569fe6060f1SDimitry Andric                          Depth + 1);
570fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
571fe6060f1SDimitry Andric     // Sign extend the extracted value using shift left and arithmetic shift
572fe6060f1SDimitry Andric     // right.
573fe6060f1SDimitry Andric     KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth));
574fe6060f1SDimitry Andric     KnownBits ShiftKnown = KnownBits::computeForAddSub(
575*0fca6ea1SDimitry Andric         /*Add=*/false, /*NSW=*/false, /* NUW=*/false, ExtKnown, WidthKnown);
576fe6060f1SDimitry Andric     Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
577e8d8bef9SDimitry Andric     break;
578e8d8bef9SDimitry Andric   }
57981ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
58081ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
58181ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
58281ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
58381ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
58481ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
58581ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
58681ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
58781ad6265SDimitry Andric   case TargetOpcode::G_UMULO:
58881ad6265SDimitry Andric   case TargetOpcode::G_SMULO: {
58981ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
59081ad6265SDimitry Andric       // If we know the result of a compare has the top bits zero, use this
59181ad6265SDimitry Andric       // info.
59281ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
59381ad6265SDimitry Andric               TargetLowering::ZeroOrOneBooleanContent &&
59481ad6265SDimitry Andric           BitWidth > 1)
59581ad6265SDimitry Andric         Known.Zero.setBitsFrom(1);
59681ad6265SDimitry Andric     }
59781ad6265SDimitry Andric     break;
59881ad6265SDimitry Andric   }
599*0fca6ea1SDimitry Andric   case TargetOpcode::G_CTLZ:
600*0fca6ea1SDimitry Andric   case TargetOpcode::G_CTLZ_ZERO_UNDEF: {
601*0fca6ea1SDimitry Andric     KnownBits SrcOpKnown;
602*0fca6ea1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
603*0fca6ea1SDimitry Andric                          Depth + 1);
604*0fca6ea1SDimitry Andric     // If we have a known 1, its position is our upper bound.
605*0fca6ea1SDimitry Andric     unsigned PossibleLZ = SrcOpKnown.countMaxLeadingZeros();
606*0fca6ea1SDimitry Andric     unsigned LowBits = llvm::bit_width(PossibleLZ);
607*0fca6ea1SDimitry Andric     Known.Zero.setBitsFrom(LowBits);
608*0fca6ea1SDimitry Andric     break;
609*0fca6ea1SDimitry Andric   }
6108bcb0991SDimitry Andric   }
6118bcb0991SDimitry Andric 
6125ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
6135ffd83dbSDimitry Andric 
6145ffd83dbSDimitry Andric   // Update the cache.
6155ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
6168bcb0991SDimitry Andric }
6178bcb0991SDimitry Andric 
618e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1
619e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1,
620e8d8bef9SDimitry Andric                                                const APInt &DemandedElts,
621e8d8bef9SDimitry Andric                                                unsigned Depth) {
622e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
623e8d8bef9SDimitry Andric   unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
624e8d8bef9SDimitry Andric   if (Src1SignBits == 1)
625e8d8bef9SDimitry Andric     return 1;
626e8d8bef9SDimitry Andric   return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
627e8d8bef9SDimitry Andric }
628e8d8bef9SDimitry Andric 
629*0fca6ea1SDimitry Andric /// Compute the known number of sign bits with attached range metadata in the
630*0fca6ea1SDimitry Andric /// memory operand. If this is an extending load, accounts for the behavior of
631*0fca6ea1SDimitry Andric /// the high bits.
632*0fca6ea1SDimitry Andric static unsigned computeNumSignBitsFromRangeMetadata(const GAnyLoad *Ld,
633*0fca6ea1SDimitry Andric                                                     unsigned TyBits) {
634*0fca6ea1SDimitry Andric   const MDNode *Ranges = Ld->getRanges();
635*0fca6ea1SDimitry Andric   if (!Ranges)
636*0fca6ea1SDimitry Andric     return 1;
637*0fca6ea1SDimitry Andric 
638*0fca6ea1SDimitry Andric   ConstantRange CR = getConstantRangeFromMetadata(*Ranges);
639*0fca6ea1SDimitry Andric   if (TyBits > CR.getBitWidth()) {
640*0fca6ea1SDimitry Andric     switch (Ld->getOpcode()) {
641*0fca6ea1SDimitry Andric     case TargetOpcode::G_SEXTLOAD:
642*0fca6ea1SDimitry Andric       CR = CR.signExtend(TyBits);
643*0fca6ea1SDimitry Andric       break;
644*0fca6ea1SDimitry Andric     case TargetOpcode::G_ZEXTLOAD:
645*0fca6ea1SDimitry Andric       CR = CR.zeroExtend(TyBits);
646*0fca6ea1SDimitry Andric       break;
647*0fca6ea1SDimitry Andric     default:
648*0fca6ea1SDimitry Andric       break;
649*0fca6ea1SDimitry Andric     }
650*0fca6ea1SDimitry Andric   }
651*0fca6ea1SDimitry Andric 
652*0fca6ea1SDimitry Andric   return std::min(CR.getSignedMin().getNumSignBits(),
653*0fca6ea1SDimitry Andric                   CR.getSignedMax().getNumSignBits());
654*0fca6ea1SDimitry Andric }
655*0fca6ea1SDimitry Andric 
656480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
657480093f4SDimitry Andric                                             const APInt &DemandedElts,
658480093f4SDimitry Andric                                             unsigned Depth) {
659480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
660480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
661480093f4SDimitry Andric 
662480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
663480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
664480093f4SDimitry Andric 
665480093f4SDimitry Andric   if (Depth == getMaxDepth())
666480093f4SDimitry Andric     return 1;
667480093f4SDimitry Andric 
668480093f4SDimitry Andric   if (!DemandedElts)
669480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
670480093f4SDimitry Andric 
671480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
6725ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
673480093f4SDimitry Andric 
674480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
675480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
676480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
677480093f4SDimitry Andric   // state.
678480093f4SDimitry Andric   if (!DstTy.isValid())
679480093f4SDimitry Andric     return 1;
680480093f4SDimitry Andric 
6815ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
682480093f4SDimitry Andric   switch (Opcode) {
683480093f4SDimitry Andric   case TargetOpcode::COPY: {
684480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
685480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
686480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
687480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
688480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
689480093f4SDimitry Andric     }
690480093f4SDimitry Andric 
691480093f4SDimitry Andric     return 1;
692480093f4SDimitry Andric   }
693480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
694480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
695480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
696480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
697480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
698480093f4SDimitry Andric   }
699fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
700e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
701e8d8bef9SDimitry Andric     // Max of the input and what this extends.
702e8d8bef9SDimitry Andric     Register Src = MI.getOperand(1).getReg();
703e8d8bef9SDimitry Andric     unsigned SrcBits = MI.getOperand(2).getImm();
704e8d8bef9SDimitry Andric     unsigned InRegBits = TyBits - SrcBits + 1;
705e8d8bef9SDimitry Andric     return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits);
706e8d8bef9SDimitry Andric   }
707*0fca6ea1SDimitry Andric   case TargetOpcode::G_LOAD: {
708*0fca6ea1SDimitry Andric     GLoad *Ld = cast<GLoad>(&MI);
709*0fca6ea1SDimitry Andric     if (DemandedElts != 1 || !getDataLayout().isLittleEndian())
710*0fca6ea1SDimitry Andric       break;
711*0fca6ea1SDimitry Andric 
712*0fca6ea1SDimitry Andric     return computeNumSignBitsFromRangeMetadata(Ld, TyBits);
713*0fca6ea1SDimitry Andric   }
7145ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
715*0fca6ea1SDimitry Andric     GSExtLoad *Ld = cast<GSExtLoad>(&MI);
716*0fca6ea1SDimitry Andric 
717e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
718e8d8bef9SDimitry Andric     if (DstTy.isVector())
719e8d8bef9SDimitry Andric       return 1;
720e8d8bef9SDimitry Andric 
721*0fca6ea1SDimitry Andric     unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
722*0fca6ea1SDimitry Andric     if (NumBits != 1)
723*0fca6ea1SDimitry Andric       return NumBits;
724*0fca6ea1SDimitry Andric 
725e8d8bef9SDimitry Andric     // e.g. i16->i32 = '17' bits known.
726e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
727*0fca6ea1SDimitry Andric     return TyBits - MMO->getSizeInBits().getValue() + 1;
728e8d8bef9SDimitry Andric   }
729e8d8bef9SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
730*0fca6ea1SDimitry Andric     GZExtLoad *Ld = cast<GZExtLoad>(&MI);
731*0fca6ea1SDimitry Andric 
732e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
733e8d8bef9SDimitry Andric     if (DstTy.isVector())
734e8d8bef9SDimitry Andric       return 1;
735e8d8bef9SDimitry Andric 
736*0fca6ea1SDimitry Andric     unsigned NumBits = computeNumSignBitsFromRangeMetadata(Ld, TyBits);
737*0fca6ea1SDimitry Andric     if (NumBits != 1)
738*0fca6ea1SDimitry Andric       return NumBits;
739*0fca6ea1SDimitry Andric 
740e8d8bef9SDimitry Andric     // e.g. i16->i32 = '16' bits known.
741e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
742*0fca6ea1SDimitry Andric     return TyBits - MMO->getSizeInBits().getValue();
743*0fca6ea1SDimitry Andric   }
744*0fca6ea1SDimitry Andric   case TargetOpcode::G_AND:
745*0fca6ea1SDimitry Andric   case TargetOpcode::G_OR:
746*0fca6ea1SDimitry Andric   case TargetOpcode::G_XOR: {
747*0fca6ea1SDimitry Andric     Register Src1 = MI.getOperand(1).getReg();
748*0fca6ea1SDimitry Andric     unsigned Src1NumSignBits =
749*0fca6ea1SDimitry Andric         computeNumSignBits(Src1, DemandedElts, Depth + 1);
750*0fca6ea1SDimitry Andric     if (Src1NumSignBits != 1) {
751*0fca6ea1SDimitry Andric       Register Src2 = MI.getOperand(2).getReg();
752*0fca6ea1SDimitry Andric       unsigned Src2NumSignBits =
753*0fca6ea1SDimitry Andric           computeNumSignBits(Src2, DemandedElts, Depth + 1);
754*0fca6ea1SDimitry Andric       FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
755*0fca6ea1SDimitry Andric     }
756*0fca6ea1SDimitry Andric     break;
7575ffd83dbSDimitry Andric   }
758480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
759480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
760480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
761480093f4SDimitry Andric 
762480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
763480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
764480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
765480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
766480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
767480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
768480093f4SDimitry Andric     break;
769480093f4SDimitry Andric   }
770e8d8bef9SDimitry Andric   case TargetOpcode::G_SELECT: {
771e8d8bef9SDimitry Andric     return computeNumSignBitsMin(MI.getOperand(2).getReg(),
772e8d8bef9SDimitry Andric                                  MI.getOperand(3).getReg(), DemandedElts,
773e8d8bef9SDimitry Andric                                  Depth + 1);
774e8d8bef9SDimitry Andric   }
77581ad6265SDimitry Andric   case TargetOpcode::G_SADDO:
77681ad6265SDimitry Andric   case TargetOpcode::G_SADDE:
77781ad6265SDimitry Andric   case TargetOpcode::G_UADDO:
77881ad6265SDimitry Andric   case TargetOpcode::G_UADDE:
77981ad6265SDimitry Andric   case TargetOpcode::G_SSUBO:
78081ad6265SDimitry Andric   case TargetOpcode::G_SSUBE:
78181ad6265SDimitry Andric   case TargetOpcode::G_USUBO:
78281ad6265SDimitry Andric   case TargetOpcode::G_USUBE:
78381ad6265SDimitry Andric   case TargetOpcode::G_SMULO:
78481ad6265SDimitry Andric   case TargetOpcode::G_UMULO: {
78581ad6265SDimitry Andric     // If compares returns 0/-1, all bits are sign bits.
78681ad6265SDimitry Andric     // We know that we have an integer-based boolean since these operations
78781ad6265SDimitry Andric     // are only available for integer.
78881ad6265SDimitry Andric     if (MI.getOperand(1).getReg() == R) {
78981ad6265SDimitry Andric       if (TL.getBooleanContents(DstTy.isVector(), false) ==
79081ad6265SDimitry Andric           TargetLowering::ZeroOrNegativeOneBooleanContent)
79181ad6265SDimitry Andric         return TyBits;
79281ad6265SDimitry Andric     }
79381ad6265SDimitry Andric 
79481ad6265SDimitry Andric     break;
79581ad6265SDimitry Andric   }
796bdd1243dSDimitry Andric   case TargetOpcode::G_FCMP:
797bdd1243dSDimitry Andric   case TargetOpcode::G_ICMP: {
798bdd1243dSDimitry Andric     bool IsFP = Opcode == TargetOpcode::G_FCMP;
799bdd1243dSDimitry Andric     if (TyBits == 1)
800bdd1243dSDimitry Andric       break;
801bdd1243dSDimitry Andric     auto BC = TL.getBooleanContents(DstTy.isVector(), IsFP);
802bdd1243dSDimitry Andric     if (BC == TargetLoweringBase::ZeroOrNegativeOneBooleanContent)
803bdd1243dSDimitry Andric       return TyBits; // All bits are sign bits.
804bdd1243dSDimitry Andric     if (BC == TargetLowering::ZeroOrOneBooleanContent)
805bdd1243dSDimitry Andric       return TyBits - 1; // Every always-zero bit is a sign bit.
806bdd1243dSDimitry Andric     break;
807bdd1243dSDimitry Andric   }
8085ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
8095ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
8105f757f3fSDimitry Andric   case TargetOpcode::G_INTRINSIC_CONVERGENT:
8115f757f3fSDimitry Andric   case TargetOpcode::G_INTRINSIC_CONVERGENT_W_SIDE_EFFECTS:
8125ffd83dbSDimitry Andric   default: {
8135ffd83dbSDimitry Andric     unsigned NumBits =
8145ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
8155ffd83dbSDimitry Andric     if (NumBits > 1)
8165ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
817480093f4SDimitry Andric     break;
818480093f4SDimitry Andric   }
8195ffd83dbSDimitry Andric   }
820480093f4SDimitry Andric 
8215ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
8225ffd83dbSDimitry Andric   // use this information.
8235ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
8245ffd83dbSDimitry Andric   APInt Mask;
8255ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
8265ffd83dbSDimitry Andric     Mask = Known.Zero;
8275ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
8285ffd83dbSDimitry Andric     Mask = Known.One;
8295ffd83dbSDimitry Andric   } else {
8305ffd83dbSDimitry Andric     // Nothing known.
8315ffd83dbSDimitry Andric     return FirstAnswer;
8325ffd83dbSDimitry Andric   }
8335ffd83dbSDimitry Andric 
8345ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
8355ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
8365ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
83706c3fb27SDimitry Andric   return std::max(FirstAnswer, Mask.countl_one());
838480093f4SDimitry Andric }
839480093f4SDimitry Andric 
840480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
841480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
842349cc55cSDimitry Andric   APInt DemandedElts =
843349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
844480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
845480093f4SDimitry Andric }
846480093f4SDimitry Andric 
8478bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
8488bcb0991SDimitry Andric   AU.setPreservesAll();
8498bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
8508bcb0991SDimitry Andric }
8518bcb0991SDimitry Andric 
8528bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
8538bcb0991SDimitry Andric   return false;
8548bcb0991SDimitry Andric }
8555f757f3fSDimitry Andric 
8565f757f3fSDimitry Andric GISelKnownBits &GISelKnownBitsAnalysis::get(MachineFunction &MF) {
8575f757f3fSDimitry Andric   if (!Info) {
8585f757f3fSDimitry Andric     unsigned MaxDepth =
8595f757f3fSDimitry Andric         MF.getTarget().getOptLevel() == CodeGenOptLevel::None ? 2 : 6;
8605f757f3fSDimitry Andric     Info = std::make_unique<GISelKnownBits>(MF, MaxDepth);
8615f757f3fSDimitry Andric   }
862*0fca6ea1SDimitry Andric   return *Info;
8635f757f3fSDimitry Andric }
864