xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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 //
12*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
138bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
148bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
158bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
168bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
178bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
188bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
198bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
20fe6060f1SDimitry Andric #include "llvm/IR/Module.h"
218bcb0991SDimitry Andric 
228bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits"
238bcb0991SDimitry Andric 
248bcb0991SDimitry Andric using namespace llvm;
258bcb0991SDimitry Andric 
268bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0;
278bcb0991SDimitry Andric 
285ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
298bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
308bcb0991SDimitry Andric 
315ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
328bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
335ffd83dbSDimitry Andric       DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {}
348bcb0991SDimitry Andric 
355ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
365ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
375ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
385ffd83dbSDimitry Andric   case TargetOpcode::COPY:
395ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
405ffd83dbSDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
415ffd83dbSDimitry Andric     int FrameIdx = MI->getOperand(1).getIndex();
425ffd83dbSDimitry Andric     return MF.getFrameInfo().getObjectAlign(FrameIdx);
438bcb0991SDimitry Andric   }
445ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
455ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
465ffd83dbSDimitry Andric   default:
475ffd83dbSDimitry Andric     return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
488bcb0991SDimitry Andric   }
498bcb0991SDimitry Andric }
508bcb0991SDimitry Andric 
518bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) {
525ffd83dbSDimitry Andric   assert(MI.getNumExplicitDefs() == 1 &&
535ffd83dbSDimitry Andric          "expected single return generic instruction");
548bcb0991SDimitry Andric   return getKnownBits(MI.getOperand(0).getReg());
558bcb0991SDimitry Andric }
568bcb0991SDimitry Andric 
578bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) {
585ffd83dbSDimitry Andric   const LLT Ty = MRI.getType(R);
598bcb0991SDimitry Andric   APInt DemandedElts =
60*349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
615ffd83dbSDimitry Andric   return getKnownBits(R, DemandedElts);
625ffd83dbSDimitry Andric }
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts,
655ffd83dbSDimitry Andric                                        unsigned Depth) {
665ffd83dbSDimitry Andric   // For now, we only maintain the cache during one request.
675ffd83dbSDimitry Andric   assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared");
685ffd83dbSDimitry Andric 
695ffd83dbSDimitry Andric   KnownBits Known;
708bcb0991SDimitry Andric   computeKnownBitsImpl(R, Known, DemandedElts);
715ffd83dbSDimitry Andric   ComputeKnownBitsCache.clear();
728bcb0991SDimitry Andric   return Known;
738bcb0991SDimitry Andric }
748bcb0991SDimitry Andric 
758bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) {
768bcb0991SDimitry Andric   LLT Ty = MRI.getType(R);
778bcb0991SDimitry Andric   unsigned BitWidth = Ty.getScalarSizeInBits();
788bcb0991SDimitry Andric   return maskedValueIsZero(R, APInt::getSignMask(BitWidth));
798bcb0991SDimitry Andric }
808bcb0991SDimitry Andric 
818bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) {
828bcb0991SDimitry Andric   return getKnownBits(R).Zero;
838bcb0991SDimitry Andric }
848bcb0991SDimitry Andric 
858bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; }
868bcb0991SDimitry Andric 
875ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void
885ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
895ffd83dbSDimitry Andric   dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
905ffd83dbSDimitry Andric          << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
91fe6060f1SDimitry Andric          << toString(Known.Zero | Known.One, 16, false) << "\n"
92fe6060f1SDimitry Andric          << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false)
935ffd83dbSDimitry Andric          << "\n"
94fe6060f1SDimitry Andric          << "[" << Depth << "] One:  0x" << toString(Known.One, 16, false)
955ffd83dbSDimitry Andric          << "\n";
965ffd83dbSDimitry Andric }
975ffd83dbSDimitry Andric 
98e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1
99e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1,
100e8d8bef9SDimitry Andric                                          KnownBits &Known,
101e8d8bef9SDimitry Andric                                          const APInt &DemandedElts,
102e8d8bef9SDimitry Andric                                          unsigned Depth) {
103e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
104e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
105e8d8bef9SDimitry Andric 
106e8d8bef9SDimitry Andric   // If we don't know any bits, early out.
107e8d8bef9SDimitry Andric   if (Known.isUnknown())
108e8d8bef9SDimitry Andric     return;
109e8d8bef9SDimitry Andric 
110e8d8bef9SDimitry Andric   KnownBits Known2;
111e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
112e8d8bef9SDimitry Andric 
113e8d8bef9SDimitry Andric   // Only known if known in both the LHS and RHS.
114e8d8bef9SDimitry Andric   Known = KnownBits::commonBits(Known, Known2);
115e8d8bef9SDimitry Andric }
116e8d8bef9SDimitry Andric 
117fe6060f1SDimitry Andric // Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is
118fe6060f1SDimitry Andric // created using Width. Use this function when the inputs are KnownBits
119fe6060f1SDimitry Andric // objects. TODO: Move this KnownBits.h if this is usable in more cases.
120fe6060f1SDimitry Andric static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown,
121fe6060f1SDimitry Andric                              const KnownBits &OffsetKnown,
122fe6060f1SDimitry Andric                              const KnownBits &WidthKnown) {
123fe6060f1SDimitry Andric   KnownBits Mask(BitWidth);
124fe6060f1SDimitry Andric   Mask.Zero = APInt::getBitsSetFrom(
125fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMaxValue().getLimitedValue(BitWidth));
126fe6060f1SDimitry Andric   Mask.One = APInt::getLowBitsSet(
127fe6060f1SDimitry Andric       BitWidth, WidthKnown.getMinValue().getLimitedValue(BitWidth));
128fe6060f1SDimitry Andric   return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask;
129fe6060f1SDimitry Andric }
130fe6060f1SDimitry Andric 
1318bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
1328bcb0991SDimitry Andric                                           const APInt &DemandedElts,
1338bcb0991SDimitry Andric                                           unsigned Depth) {
1348bcb0991SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
1358bcb0991SDimitry Andric   unsigned Opcode = MI.getOpcode();
1368bcb0991SDimitry Andric   LLT DstTy = MRI.getType(R);
1378bcb0991SDimitry Andric 
1388bcb0991SDimitry Andric   // Handle the case where this is called on a register that does not have a
1398bcb0991SDimitry Andric   // type constraint (i.e. it has a register class constraint instead). This is
1408bcb0991SDimitry Andric   // unlikely to occur except by looking through copies but it is possible for
1418bcb0991SDimitry Andric   // the initial register being queried to be in this state.
1428bcb0991SDimitry Andric   if (!DstTy.isValid()) {
1438bcb0991SDimitry Andric     Known = KnownBits();
1448bcb0991SDimitry Andric     return;
1458bcb0991SDimitry Andric   }
1468bcb0991SDimitry Andric 
147fe6060f1SDimitry Andric   unsigned BitWidth = DstTy.getScalarSizeInBits();
1485ffd83dbSDimitry Andric   auto CacheEntry = ComputeKnownBitsCache.find(R);
1495ffd83dbSDimitry Andric   if (CacheEntry != ComputeKnownBitsCache.end()) {
1505ffd83dbSDimitry Andric     Known = CacheEntry->second;
1515ffd83dbSDimitry Andric     LLVM_DEBUG(dbgs() << "Cache hit at ");
1525ffd83dbSDimitry Andric     LLVM_DEBUG(dumpResult(MI, Known, Depth));
1535ffd83dbSDimitry Andric     assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match");
1545ffd83dbSDimitry Andric     return;
1555ffd83dbSDimitry Andric   }
1568bcb0991SDimitry Andric   Known = KnownBits(BitWidth); // Don't know anything
1578bcb0991SDimitry Andric 
1585ffd83dbSDimitry Andric   // Depth may get bigger than max depth if it gets passed to a different
1595ffd83dbSDimitry Andric   // GISelKnownBits object.
1605ffd83dbSDimitry Andric   // This may happen when say a generic part uses a GISelKnownBits object
1615ffd83dbSDimitry Andric   // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
1625ffd83dbSDimitry Andric   // which creates a new GISelKnownBits object with a different and smaller
1635ffd83dbSDimitry Andric   // depth. If we just check for equality, we would never exit if the depth
1645ffd83dbSDimitry Andric   // that is passed down to the target specific GISelKnownBits object is
1655ffd83dbSDimitry Andric   // already bigger than its max depth.
1665ffd83dbSDimitry Andric   if (Depth >= getMaxDepth())
1678bcb0991SDimitry Andric     return;
1688bcb0991SDimitry Andric 
1698bcb0991SDimitry Andric   if (!DemandedElts)
1708bcb0991SDimitry Andric     return; // No demanded elts, better to assume we don't know anything.
1718bcb0991SDimitry Andric 
1728bcb0991SDimitry Andric   KnownBits Known2;
1738bcb0991SDimitry Andric 
1748bcb0991SDimitry Andric   switch (Opcode) {
1758bcb0991SDimitry Andric   default:
1768bcb0991SDimitry Andric     TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
1778bcb0991SDimitry Andric                                       Depth);
1788bcb0991SDimitry Andric     break;
179fe6060f1SDimitry Andric   case TargetOpcode::G_BUILD_VECTOR: {
180fe6060f1SDimitry Andric     // Collect the known bits that are shared by every demanded vector element.
181fe6060f1SDimitry Andric     Known.Zero.setAllBits(); Known.One.setAllBits();
182fe6060f1SDimitry Andric     for (unsigned i = 0, e = MI.getNumOperands() - 1; i < e; ++i) {
183fe6060f1SDimitry Andric       if (!DemandedElts[i])
184fe6060f1SDimitry Andric         continue;
185fe6060f1SDimitry Andric 
186fe6060f1SDimitry Andric       computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedElts,
187fe6060f1SDimitry Andric                            Depth + 1);
188fe6060f1SDimitry Andric 
189fe6060f1SDimitry Andric       // Known bits are the values that are shared by every demanded element.
190fe6060f1SDimitry Andric       Known = KnownBits::commonBits(Known, Known2);
191fe6060f1SDimitry Andric 
192fe6060f1SDimitry Andric       // If we don't know any bits, early out.
193fe6060f1SDimitry Andric       if (Known.isUnknown())
194fe6060f1SDimitry Andric         break;
195fe6060f1SDimitry Andric     }
196fe6060f1SDimitry Andric     break;
197fe6060f1SDimitry Andric   }
1985ffd83dbSDimitry Andric   case TargetOpcode::COPY:
1995ffd83dbSDimitry Andric   case TargetOpcode::G_PHI:
2005ffd83dbSDimitry Andric   case TargetOpcode::PHI: {
201*349cc55cSDimitry Andric     Known.One = APInt::getAllOnes(BitWidth);
202*349cc55cSDimitry Andric     Known.Zero = APInt::getAllOnes(BitWidth);
2035ffd83dbSDimitry Andric     // Destination registers should not have subregisters at this
2045ffd83dbSDimitry Andric     // point of the pipeline, otherwise the main live-range will be
2055ffd83dbSDimitry Andric     // defined more than once, which is against SSA.
2065ffd83dbSDimitry Andric     assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
2075ffd83dbSDimitry Andric     // Record in the cache that we know nothing for MI.
2085ffd83dbSDimitry Andric     // This will get updated later and in the meantime, if we reach that
2095ffd83dbSDimitry Andric     // phi again, because of a loop, we will cut the search thanks to this
2105ffd83dbSDimitry Andric     // cache entry.
2115ffd83dbSDimitry Andric     // We could actually build up more information on the phi by not cutting
2125ffd83dbSDimitry Andric     // the search, but that additional information is more a side effect
2135ffd83dbSDimitry Andric     // than an intended choice.
2145ffd83dbSDimitry Andric     // Therefore, for now, save on compile time until we derive a proper way
2155ffd83dbSDimitry Andric     // to derive known bits for PHIs within loops.
2165ffd83dbSDimitry Andric     ComputeKnownBitsCache[R] = KnownBits(BitWidth);
2175ffd83dbSDimitry Andric     // PHI's operand are a mix of registers and basic blocks interleaved.
2185ffd83dbSDimitry Andric     // We only care about the register ones.
2195ffd83dbSDimitry Andric     for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
2205ffd83dbSDimitry Andric       const MachineOperand &Src = MI.getOperand(Idx);
2215ffd83dbSDimitry Andric       Register SrcReg = Src.getReg();
2225ffd83dbSDimitry Andric       // Look through trivial copies and phis but don't look through trivial
2235ffd83dbSDimitry Andric       // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
2245ffd83dbSDimitry Andric       // analysis is currently unable to determine the bit width of a
2255ffd83dbSDimitry Andric       // register class.
2268bcb0991SDimitry Andric       //
2278bcb0991SDimitry Andric       // We can't use NoSubRegister by name as it's defined by each target but
2288bcb0991SDimitry Andric       // it's always defined to be 0 by tablegen.
2295ffd83dbSDimitry Andric       if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
2305ffd83dbSDimitry Andric           MRI.getType(SrcReg).isValid()) {
2315ffd83dbSDimitry Andric         // For COPYs we don't do anything, don't increase the depth.
2325ffd83dbSDimitry Andric         computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
2335ffd83dbSDimitry Andric                              Depth + (Opcode != TargetOpcode::COPY));
234e8d8bef9SDimitry Andric         Known = KnownBits::commonBits(Known, Known2);
2355ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
2365ffd83dbSDimitry Andric         // just stop looking through the operands.
2375ffd83dbSDimitry Andric         if (Known.One == 0 && Known.Zero == 0)
2385ffd83dbSDimitry Andric           break;
2395ffd83dbSDimitry Andric       } else {
2405ffd83dbSDimitry Andric         // We know nothing.
2415ffd83dbSDimitry Andric         Known = KnownBits(BitWidth);
2425ffd83dbSDimitry Andric         break;
2435ffd83dbSDimitry Andric       }
2448bcb0991SDimitry Andric     }
2458bcb0991SDimitry Andric     break;
2468bcb0991SDimitry Andric   }
2478bcb0991SDimitry Andric   case TargetOpcode::G_CONSTANT: {
248*349cc55cSDimitry Andric     auto CstVal = getIConstantVRegVal(R, MRI);
2498bcb0991SDimitry Andric     if (!CstVal)
2508bcb0991SDimitry Andric       break;
251e8d8bef9SDimitry Andric     Known = KnownBits::makeConstant(*CstVal);
2528bcb0991SDimitry Andric     break;
2538bcb0991SDimitry Andric   }
2548bcb0991SDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
2555ffd83dbSDimitry Andric     int FrameIdx = MI.getOperand(1).getIndex();
2565ffd83dbSDimitry Andric     TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
2578bcb0991SDimitry Andric     break;
2588bcb0991SDimitry Andric   }
2598bcb0991SDimitry Andric   case TargetOpcode::G_SUB: {
2605ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2618bcb0991SDimitry Andric                          Depth + 1);
2628bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2638bcb0991SDimitry Andric                          Depth + 1);
2645ffd83dbSDimitry Andric     Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known,
2655ffd83dbSDimitry Andric                                         Known2);
2668bcb0991SDimitry Andric     break;
2678bcb0991SDimitry Andric   }
2688bcb0991SDimitry Andric   case TargetOpcode::G_XOR: {
2698bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2708bcb0991SDimitry Andric                          Depth + 1);
2718bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2728bcb0991SDimitry Andric                          Depth + 1);
2738bcb0991SDimitry Andric 
2745ffd83dbSDimitry Andric     Known ^= Known2;
2758bcb0991SDimitry Andric     break;
2768bcb0991SDimitry Andric   }
277480093f4SDimitry Andric   case TargetOpcode::G_PTR_ADD: {
278fe6060f1SDimitry Andric     if (DstTy.isVector())
279fe6060f1SDimitry Andric       break;
280480093f4SDimitry Andric     // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
2818bcb0991SDimitry Andric     LLT Ty = MRI.getType(MI.getOperand(1).getReg());
2828bcb0991SDimitry Andric     if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
2838bcb0991SDimitry Andric       break;
2848bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
2858bcb0991SDimitry Andric   }
2868bcb0991SDimitry Andric   case TargetOpcode::G_ADD: {
2875ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2888bcb0991SDimitry Andric                          Depth + 1);
2898bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2908bcb0991SDimitry Andric                          Depth + 1);
2915ffd83dbSDimitry Andric     Known =
2925ffd83dbSDimitry Andric         KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2);
2938bcb0991SDimitry Andric     break;
2948bcb0991SDimitry Andric   }
2958bcb0991SDimitry Andric   case TargetOpcode::G_AND: {
2968bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
2978bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2988bcb0991SDimitry Andric                          Depth + 1);
2998bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3008bcb0991SDimitry Andric                          Depth + 1);
3018bcb0991SDimitry Andric 
3025ffd83dbSDimitry Andric     Known &= Known2;
3038bcb0991SDimitry Andric     break;
3048bcb0991SDimitry Andric   }
3058bcb0991SDimitry Andric   case TargetOpcode::G_OR: {
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_MUL: {
3168bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
3178bcb0991SDimitry Andric                          Depth + 1);
3188bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
3198bcb0991SDimitry Andric                          Depth + 1);
320fe6060f1SDimitry Andric     Known = KnownBits::mul(Known, Known2);
3218bcb0991SDimitry Andric     break;
3228bcb0991SDimitry Andric   }
3238bcb0991SDimitry Andric   case TargetOpcode::G_SELECT: {
324e8d8bef9SDimitry Andric     computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
325e8d8bef9SDimitry Andric                         Known, DemandedElts, Depth + 1);
3268bcb0991SDimitry Andric     break;
327e8d8bef9SDimitry Andric   }
328e8d8bef9SDimitry Andric   case TargetOpcode::G_SMIN: {
329e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
330e8d8bef9SDimitry Andric     KnownBits KnownRHS;
331e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3328bcb0991SDimitry Andric                          Depth + 1);
333e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
334e8d8bef9SDimitry Andric                          Depth + 1);
335e8d8bef9SDimitry Andric     Known = KnownBits::smin(Known, KnownRHS);
336e8d8bef9SDimitry Andric     break;
337e8d8bef9SDimitry Andric   }
338e8d8bef9SDimitry Andric   case TargetOpcode::G_SMAX: {
339e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
340e8d8bef9SDimitry Andric     KnownBits KnownRHS;
341e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
342e8d8bef9SDimitry Andric                          Depth + 1);
343e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
344e8d8bef9SDimitry Andric                          Depth + 1);
345e8d8bef9SDimitry Andric     Known = KnownBits::smax(Known, KnownRHS);
346e8d8bef9SDimitry Andric     break;
347e8d8bef9SDimitry Andric   }
348e8d8bef9SDimitry Andric   case TargetOpcode::G_UMIN: {
349e8d8bef9SDimitry Andric     KnownBits KnownRHS;
350e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
351e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
352e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
353e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
354e8d8bef9SDimitry Andric     Known = KnownBits::umin(Known, KnownRHS);
355e8d8bef9SDimitry Andric     break;
356e8d8bef9SDimitry Andric   }
357e8d8bef9SDimitry Andric   case TargetOpcode::G_UMAX: {
358e8d8bef9SDimitry Andric     KnownBits KnownRHS;
359e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
360e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
361e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
362e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
363e8d8bef9SDimitry Andric     Known = KnownBits::umax(Known, KnownRHS);
3648bcb0991SDimitry Andric     break;
3658bcb0991SDimitry Andric   }
3668bcb0991SDimitry Andric   case TargetOpcode::G_FCMP:
3678bcb0991SDimitry Andric   case TargetOpcode::G_ICMP: {
368fe6060f1SDimitry Andric     if (DstTy.isVector())
369fe6060f1SDimitry Andric       break;
3708bcb0991SDimitry Andric     if (TL.getBooleanContents(DstTy.isVector(),
3718bcb0991SDimitry Andric                               Opcode == TargetOpcode::G_FCMP) ==
3728bcb0991SDimitry Andric             TargetLowering::ZeroOrOneBooleanContent &&
3738bcb0991SDimitry Andric         BitWidth > 1)
3748bcb0991SDimitry Andric       Known.Zero.setBitsFrom(1);
3758bcb0991SDimitry Andric     break;
3768bcb0991SDimitry Andric   }
3778bcb0991SDimitry Andric   case TargetOpcode::G_SEXT: {
3788bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3798bcb0991SDimitry Andric                          Depth + 1);
3808bcb0991SDimitry Andric     // If the sign bit is known to be zero or one, then sext will extend
3818bcb0991SDimitry Andric     // it to the top bits, else it will just zext.
3828bcb0991SDimitry Andric     Known = Known.sext(BitWidth);
3838bcb0991SDimitry Andric     break;
3848bcb0991SDimitry Andric   }
385fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
386e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
387e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
388e8d8bef9SDimitry Andric                          Depth + 1);
389e8d8bef9SDimitry Andric     Known = Known.sextInReg(MI.getOperand(2).getImm());
390e8d8bef9SDimitry Andric     break;
391e8d8bef9SDimitry Andric   }
3928bcb0991SDimitry Andric   case TargetOpcode::G_ANYEXT: {
3938bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3948bcb0991SDimitry Andric                          Depth + 1);
395e8d8bef9SDimitry Andric     Known = Known.anyext(BitWidth);
3968bcb0991SDimitry Andric     break;
3978bcb0991SDimitry Andric   }
3988bcb0991SDimitry Andric   case TargetOpcode::G_LOAD: {
3998bcb0991SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
4008bcb0991SDimitry Andric     if (const MDNode *Ranges = MMO->getRanges()) {
4018bcb0991SDimitry Andric       computeKnownBitsFromRangeMetadata(*Ranges, Known);
4028bcb0991SDimitry Andric     }
403e8d8bef9SDimitry Andric 
4048bcb0991SDimitry Andric     break;
4058bcb0991SDimitry Andric   }
4068bcb0991SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
407fe6060f1SDimitry Andric     if (DstTy.isVector())
408fe6060f1SDimitry Andric       break;
4098bcb0991SDimitry Andric     // Everything above the retrieved bits is zero
4108bcb0991SDimitry Andric     Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits());
4118bcb0991SDimitry Andric     break;
4128bcb0991SDimitry Andric   }
413e8d8bef9SDimitry Andric   case TargetOpcode::G_ASHR: {
414e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
415e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
416e8d8bef9SDimitry Andric                          Depth + 1);
4178bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
4188bcb0991SDimitry Andric                          Depth + 1);
419e8d8bef9SDimitry Andric     Known = KnownBits::ashr(LHSKnown, RHSKnown);
4208bcb0991SDimitry Andric     break;
4218bcb0991SDimitry Andric   }
422e8d8bef9SDimitry Andric   case TargetOpcode::G_LSHR: {
423e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
424e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
4258bcb0991SDimitry Andric                          Depth + 1);
426e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
427e8d8bef9SDimitry Andric                          Depth + 1);
428e8d8bef9SDimitry Andric     Known = KnownBits::lshr(LHSKnown, RHSKnown);
4298bcb0991SDimitry Andric     break;
4308bcb0991SDimitry Andric   }
431e8d8bef9SDimitry Andric   case TargetOpcode::G_SHL: {
432e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
433e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
434e8d8bef9SDimitry Andric                          Depth + 1);
435e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
436e8d8bef9SDimitry Andric                          Depth + 1);
437e8d8bef9SDimitry Andric     Known = KnownBits::shl(LHSKnown, RHSKnown);
4388bcb0991SDimitry Andric     break;
4398bcb0991SDimitry Andric   }
4408bcb0991SDimitry Andric   case TargetOpcode::G_INTTOPTR:
4418bcb0991SDimitry Andric   case TargetOpcode::G_PTRTOINT:
442fe6060f1SDimitry Andric     if (DstTy.isVector())
443fe6060f1SDimitry Andric       break;
4448bcb0991SDimitry Andric     // Fall through and handle them the same as zext/trunc.
4458bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
446fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_ZEXT:
4478bcb0991SDimitry Andric   case TargetOpcode::G_ZEXT:
4488bcb0991SDimitry Andric   case TargetOpcode::G_TRUNC: {
4498bcb0991SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
4508bcb0991SDimitry Andric     LLT SrcTy = MRI.getType(SrcReg);
451fe6060f1SDimitry Andric     unsigned SrcBitWidth;
452fe6060f1SDimitry Andric 
453fe6060f1SDimitry Andric     // G_ASSERT_ZEXT stores the original bitwidth in the immediate operand.
454fe6060f1SDimitry Andric     if (Opcode == TargetOpcode::G_ASSERT_ZEXT)
455fe6060f1SDimitry Andric       SrcBitWidth = MI.getOperand(2).getImm();
456fe6060f1SDimitry Andric     else {
457fe6060f1SDimitry Andric       SrcBitWidth = SrcTy.isPointer()
4588bcb0991SDimitry Andric                         ? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
4598bcb0991SDimitry Andric                         : SrcTy.getSizeInBits();
460fe6060f1SDimitry Andric     }
4618bcb0991SDimitry Andric     assert(SrcBitWidth && "SrcBitWidth can't be zero");
4625ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(SrcBitWidth);
4638bcb0991SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
4645ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(BitWidth);
4658bcb0991SDimitry Andric     if (BitWidth > SrcBitWidth)
4668bcb0991SDimitry Andric       Known.Zero.setBitsFrom(SrcBitWidth);
4678bcb0991SDimitry Andric     break;
4688bcb0991SDimitry Andric   }
469e8d8bef9SDimitry Andric   case TargetOpcode::G_MERGE_VALUES: {
470e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
471e8d8bef9SDimitry Andric     unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
472e8d8bef9SDimitry Andric 
473e8d8bef9SDimitry Andric     for (unsigned I = 0; I != NumOps - 1; ++I) {
474e8d8bef9SDimitry Andric       KnownBits SrcOpKnown;
475e8d8bef9SDimitry Andric       computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
476e8d8bef9SDimitry Andric                            DemandedElts, Depth + 1);
477e8d8bef9SDimitry Andric       Known.insertBits(SrcOpKnown, I * OpSize);
478e8d8bef9SDimitry Andric     }
479e8d8bef9SDimitry Andric     break;
480e8d8bef9SDimitry Andric   }
481e8d8bef9SDimitry Andric   case TargetOpcode::G_UNMERGE_VALUES: {
482fe6060f1SDimitry Andric     if (DstTy.isVector())
483fe6060f1SDimitry Andric       break;
484e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
485e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(NumOps - 1).getReg();
486e8d8bef9SDimitry Andric     if (MRI.getType(SrcReg).isVector())
487e8d8bef9SDimitry Andric       return; // TODO: Handle vectors.
488e8d8bef9SDimitry Andric 
489e8d8bef9SDimitry Andric     KnownBits SrcOpKnown;
490e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1);
491e8d8bef9SDimitry Andric 
492e8d8bef9SDimitry Andric     // Figure out the result operand index
493e8d8bef9SDimitry Andric     unsigned DstIdx = 0;
494e8d8bef9SDimitry Andric     for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
495e8d8bef9SDimitry Andric          ++DstIdx)
496e8d8bef9SDimitry Andric       ;
497e8d8bef9SDimitry Andric 
498e8d8bef9SDimitry Andric     Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
499e8d8bef9SDimitry Andric     break;
500e8d8bef9SDimitry Andric   }
501e8d8bef9SDimitry Andric   case TargetOpcode::G_BSWAP: {
502e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
503e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
504fe6060f1SDimitry Andric     Known = Known.byteSwap();
505e8d8bef9SDimitry Andric     break;
506e8d8bef9SDimitry Andric   }
507e8d8bef9SDimitry Andric   case TargetOpcode::G_BITREVERSE: {
508e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
509e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
510fe6060f1SDimitry Andric     Known = Known.reverseBits();
511fe6060f1SDimitry Andric     break;
512fe6060f1SDimitry Andric   }
513*349cc55cSDimitry Andric   case TargetOpcode::G_CTPOP: {
514*349cc55cSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
515*349cc55cSDimitry Andric                          Depth + 1);
516*349cc55cSDimitry Andric     // We can bound the space the count needs.  Also, bits known to be zero can't
517*349cc55cSDimitry Andric     // contribute to the population.
518*349cc55cSDimitry Andric     unsigned BitsPossiblySet = Known2.countMaxPopulation();
519*349cc55cSDimitry Andric     unsigned LowBits = Log2_32(BitsPossiblySet)+1;
520*349cc55cSDimitry Andric     Known.Zero.setBitsFrom(LowBits);
521*349cc55cSDimitry Andric     // TODO: we could bound Known.One using the lower bound on the number of
522*349cc55cSDimitry Andric     // bits which might be set provided by popcnt KnownOne2.
523*349cc55cSDimitry Andric     break;
524*349cc55cSDimitry Andric   }
525fe6060f1SDimitry Andric   case TargetOpcode::G_UBFX: {
526fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
527fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
528fe6060f1SDimitry Andric                          Depth + 1);
529fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
530fe6060f1SDimitry Andric                          Depth + 1);
531fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
532fe6060f1SDimitry Andric                          Depth + 1);
533fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
534fe6060f1SDimitry Andric     break;
535fe6060f1SDimitry Andric   }
536fe6060f1SDimitry Andric   case TargetOpcode::G_SBFX: {
537fe6060f1SDimitry Andric     KnownBits SrcOpKnown, OffsetKnown, WidthKnown;
538fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts,
539fe6060f1SDimitry Andric                          Depth + 1);
540fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts,
541fe6060f1SDimitry Andric                          Depth + 1);
542fe6060f1SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts,
543fe6060f1SDimitry Andric                          Depth + 1);
544fe6060f1SDimitry Andric     Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown);
545fe6060f1SDimitry Andric     // Sign extend the extracted value using shift left and arithmetic shift
546fe6060f1SDimitry Andric     // right.
547fe6060f1SDimitry Andric     KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth));
548fe6060f1SDimitry Andric     KnownBits ShiftKnown = KnownBits::computeForAddSub(
549fe6060f1SDimitry Andric         /*Add*/ false, /*NSW*/ false, ExtKnown, WidthKnown);
550fe6060f1SDimitry Andric     Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown);
551e8d8bef9SDimitry Andric     break;
552e8d8bef9SDimitry Andric   }
5538bcb0991SDimitry Andric   }
5548bcb0991SDimitry Andric 
5558bcb0991SDimitry Andric   assert(!Known.hasConflict() && "Bits known to be one AND zero?");
5565ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
5575ffd83dbSDimitry Andric 
5585ffd83dbSDimitry Andric   // Update the cache.
5595ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
5608bcb0991SDimitry Andric }
5618bcb0991SDimitry Andric 
562e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1
563e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1,
564e8d8bef9SDimitry Andric                                                const APInt &DemandedElts,
565e8d8bef9SDimitry Andric                                                unsigned Depth) {
566e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
567e8d8bef9SDimitry Andric   unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
568e8d8bef9SDimitry Andric   if (Src1SignBits == 1)
569e8d8bef9SDimitry Andric     return 1;
570e8d8bef9SDimitry Andric   return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
571e8d8bef9SDimitry Andric }
572e8d8bef9SDimitry Andric 
573480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
574480093f4SDimitry Andric                                             const APInt &DemandedElts,
575480093f4SDimitry Andric                                             unsigned Depth) {
576480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
577480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
578480093f4SDimitry Andric 
579480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
580480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
581480093f4SDimitry Andric 
582480093f4SDimitry Andric   if (Depth == getMaxDepth())
583480093f4SDimitry Andric     return 1;
584480093f4SDimitry Andric 
585480093f4SDimitry Andric   if (!DemandedElts)
586480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
587480093f4SDimitry Andric 
588480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
5895ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
590480093f4SDimitry Andric 
591480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
592480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
593480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
594480093f4SDimitry Andric   // state.
595480093f4SDimitry Andric   if (!DstTy.isValid())
596480093f4SDimitry Andric     return 1;
597480093f4SDimitry Andric 
5985ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
599480093f4SDimitry Andric   switch (Opcode) {
600480093f4SDimitry Andric   case TargetOpcode::COPY: {
601480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
602480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
603480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
604480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
605480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
606480093f4SDimitry Andric     }
607480093f4SDimitry Andric 
608480093f4SDimitry Andric     return 1;
609480093f4SDimitry Andric   }
610480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
611480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
612480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
613480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
614480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
615480093f4SDimitry Andric   }
616fe6060f1SDimitry Andric   case TargetOpcode::G_ASSERT_SEXT:
617e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
618e8d8bef9SDimitry Andric     // Max of the input and what this extends.
619e8d8bef9SDimitry Andric     Register Src = MI.getOperand(1).getReg();
620e8d8bef9SDimitry Andric     unsigned SrcBits = MI.getOperand(2).getImm();
621e8d8bef9SDimitry Andric     unsigned InRegBits = TyBits - SrcBits + 1;
622e8d8bef9SDimitry Andric     return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits);
623e8d8bef9SDimitry Andric   }
6245ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
625e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
626e8d8bef9SDimitry Andric     if (DstTy.isVector())
627e8d8bef9SDimitry Andric       return 1;
628e8d8bef9SDimitry Andric 
629e8d8bef9SDimitry Andric     // e.g. i16->i32 = '17' bits known.
630e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
631e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits() + 1;
632e8d8bef9SDimitry Andric   }
633e8d8bef9SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
634e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
635e8d8bef9SDimitry Andric     if (DstTy.isVector())
636e8d8bef9SDimitry Andric       return 1;
637e8d8bef9SDimitry Andric 
638e8d8bef9SDimitry Andric     // e.g. i16->i32 = '16' bits known.
639e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
640e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits();
6415ffd83dbSDimitry Andric   }
642480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
643480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
644480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
645480093f4SDimitry Andric 
646480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
647480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
648480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
649480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
650480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
651480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
652480093f4SDimitry Andric     break;
653480093f4SDimitry Andric   }
654e8d8bef9SDimitry Andric   case TargetOpcode::G_SELECT: {
655e8d8bef9SDimitry Andric     return computeNumSignBitsMin(MI.getOperand(2).getReg(),
656e8d8bef9SDimitry Andric                                  MI.getOperand(3).getReg(), DemandedElts,
657e8d8bef9SDimitry Andric                                  Depth + 1);
658e8d8bef9SDimitry Andric   }
6595ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
6605ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
6615ffd83dbSDimitry Andric   default: {
6625ffd83dbSDimitry Andric     unsigned NumBits =
6635ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
6645ffd83dbSDimitry Andric     if (NumBits > 1)
6655ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
666480093f4SDimitry Andric     break;
667480093f4SDimitry Andric   }
6685ffd83dbSDimitry Andric   }
669480093f4SDimitry Andric 
6705ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
6715ffd83dbSDimitry Andric   // use this information.
6725ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
6735ffd83dbSDimitry Andric   APInt Mask;
6745ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
6755ffd83dbSDimitry Andric     Mask = Known.Zero;
6765ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
6775ffd83dbSDimitry Andric     Mask = Known.One;
6785ffd83dbSDimitry Andric   } else {
6795ffd83dbSDimitry Andric     // Nothing known.
6805ffd83dbSDimitry Andric     return FirstAnswer;
6815ffd83dbSDimitry Andric   }
6825ffd83dbSDimitry Andric 
6835ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
6845ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
6855ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
6865ffd83dbSDimitry Andric   return std::max(FirstAnswer, Mask.countLeadingOnes());
687480093f4SDimitry Andric }
688480093f4SDimitry Andric 
689480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
690480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
691*349cc55cSDimitry Andric   APInt DemandedElts =
692*349cc55cSDimitry Andric       Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1);
693480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
694480093f4SDimitry Andric }
695480093f4SDimitry Andric 
6968bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
6978bcb0991SDimitry Andric   AU.setPreservesAll();
6988bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
6998bcb0991SDimitry Andric }
7008bcb0991SDimitry Andric 
7018bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
7028bcb0991SDimitry Andric   return false;
7038bcb0991SDimitry Andric }
704