xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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 //
128bcb0991SDimitry Andric //===------------------
138bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
14*5ffd83dbSDimitry Andric #include "llvm/Analysis/TargetTransformInfo.h"
158bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h"
168bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
178bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
188bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
198bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
208bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
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 
28*5ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
298bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
308bcb0991SDimitry Andric 
31*5ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
328bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
33*5ffd83dbSDimitry Andric       DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {}
348bcb0991SDimitry Andric 
35*5ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
36*5ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
37*5ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
38*5ffd83dbSDimitry Andric   case TargetOpcode::COPY:
39*5ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
40*5ffd83dbSDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
41*5ffd83dbSDimitry Andric     int FrameIdx = MI->getOperand(1).getIndex();
42*5ffd83dbSDimitry Andric     return MF.getFrameInfo().getObjectAlign(FrameIdx);
438bcb0991SDimitry Andric   }
44*5ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
45*5ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
46*5ffd83dbSDimitry Andric   default:
47*5ffd83dbSDimitry Andric     return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
488bcb0991SDimitry Andric   }
498bcb0991SDimitry Andric }
508bcb0991SDimitry Andric 
518bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) {
52*5ffd83dbSDimitry Andric   assert(MI.getNumExplicitDefs() == 1 &&
53*5ffd83dbSDimitry 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) {
58*5ffd83dbSDimitry Andric   const LLT Ty = MRI.getType(R);
598bcb0991SDimitry Andric   APInt DemandedElts =
608bcb0991SDimitry Andric       Ty.isVector() ? APInt::getAllOnesValue(Ty.getNumElements()) : APInt(1, 1);
61*5ffd83dbSDimitry Andric   return getKnownBits(R, DemandedElts);
62*5ffd83dbSDimitry Andric }
63*5ffd83dbSDimitry Andric 
64*5ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts,
65*5ffd83dbSDimitry Andric                                        unsigned Depth) {
66*5ffd83dbSDimitry Andric   // For now, we only maintain the cache during one request.
67*5ffd83dbSDimitry Andric   assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared");
68*5ffd83dbSDimitry Andric 
69*5ffd83dbSDimitry Andric   KnownBits Known;
708bcb0991SDimitry Andric   computeKnownBitsImpl(R, Known, DemandedElts);
71*5ffd83dbSDimitry 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 
87*5ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void
88*5ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
89*5ffd83dbSDimitry Andric   dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
90*5ffd83dbSDimitry Andric          << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
91*5ffd83dbSDimitry Andric          << (Known.Zero | Known.One).toString(16, false) << "\n"
92*5ffd83dbSDimitry Andric          << "[" << Depth << "] Zero: 0x" << Known.Zero.toString(16, false)
93*5ffd83dbSDimitry Andric          << "\n"
94*5ffd83dbSDimitry Andric          << "[" << Depth << "] One:  0x" << Known.One.toString(16, false)
95*5ffd83dbSDimitry Andric          << "\n";
96*5ffd83dbSDimitry Andric }
97*5ffd83dbSDimitry Andric 
988bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
998bcb0991SDimitry Andric                                           const APInt &DemandedElts,
1008bcb0991SDimitry Andric                                           unsigned Depth) {
1018bcb0991SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
1028bcb0991SDimitry Andric   unsigned Opcode = MI.getOpcode();
1038bcb0991SDimitry Andric   LLT DstTy = MRI.getType(R);
1048bcb0991SDimitry Andric 
1058bcb0991SDimitry Andric   // Handle the case where this is called on a register that does not have a
1068bcb0991SDimitry Andric   // type constraint (i.e. it has a register class constraint instead). This is
1078bcb0991SDimitry Andric   // unlikely to occur except by looking through copies but it is possible for
1088bcb0991SDimitry Andric   // the initial register being queried to be in this state.
1098bcb0991SDimitry Andric   if (!DstTy.isValid()) {
1108bcb0991SDimitry Andric     Known = KnownBits();
1118bcb0991SDimitry Andric     return;
1128bcb0991SDimitry Andric   }
1138bcb0991SDimitry Andric 
1148bcb0991SDimitry Andric   unsigned BitWidth = DstTy.getSizeInBits();
115*5ffd83dbSDimitry Andric   auto CacheEntry = ComputeKnownBitsCache.find(R);
116*5ffd83dbSDimitry Andric   if (CacheEntry != ComputeKnownBitsCache.end()) {
117*5ffd83dbSDimitry Andric     Known = CacheEntry->second;
118*5ffd83dbSDimitry Andric     LLVM_DEBUG(dbgs() << "Cache hit at ");
119*5ffd83dbSDimitry Andric     LLVM_DEBUG(dumpResult(MI, Known, Depth));
120*5ffd83dbSDimitry Andric     assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match");
121*5ffd83dbSDimitry Andric     return;
122*5ffd83dbSDimitry Andric   }
1238bcb0991SDimitry Andric   Known = KnownBits(BitWidth); // Don't know anything
1248bcb0991SDimitry Andric 
1258bcb0991SDimitry Andric   if (DstTy.isVector())
1268bcb0991SDimitry Andric     return; // TODO: Handle vectors.
1278bcb0991SDimitry Andric 
128*5ffd83dbSDimitry Andric   // Depth may get bigger than max depth if it gets passed to a different
129*5ffd83dbSDimitry Andric   // GISelKnownBits object.
130*5ffd83dbSDimitry Andric   // This may happen when say a generic part uses a GISelKnownBits object
131*5ffd83dbSDimitry Andric   // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
132*5ffd83dbSDimitry Andric   // which creates a new GISelKnownBits object with a different and smaller
133*5ffd83dbSDimitry Andric   // depth. If we just check for equality, we would never exit if the depth
134*5ffd83dbSDimitry Andric   // that is passed down to the target specific GISelKnownBits object is
135*5ffd83dbSDimitry Andric   // already bigger than its max depth.
136*5ffd83dbSDimitry Andric   if (Depth >= getMaxDepth())
1378bcb0991SDimitry Andric     return;
1388bcb0991SDimitry Andric 
1398bcb0991SDimitry Andric   if (!DemandedElts)
1408bcb0991SDimitry Andric     return; // No demanded elts, better to assume we don't know anything.
1418bcb0991SDimitry Andric 
1428bcb0991SDimitry Andric   KnownBits Known2;
1438bcb0991SDimitry Andric 
1448bcb0991SDimitry Andric   switch (Opcode) {
1458bcb0991SDimitry Andric   default:
1468bcb0991SDimitry Andric     TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
1478bcb0991SDimitry Andric                                       Depth);
1488bcb0991SDimitry Andric     break;
149*5ffd83dbSDimitry Andric   case TargetOpcode::COPY:
150*5ffd83dbSDimitry Andric   case TargetOpcode::G_PHI:
151*5ffd83dbSDimitry Andric   case TargetOpcode::PHI: {
152*5ffd83dbSDimitry Andric     Known.One = APInt::getAllOnesValue(BitWidth);
153*5ffd83dbSDimitry Andric     Known.Zero = APInt::getAllOnesValue(BitWidth);
154*5ffd83dbSDimitry Andric     // Destination registers should not have subregisters at this
155*5ffd83dbSDimitry Andric     // point of the pipeline, otherwise the main live-range will be
156*5ffd83dbSDimitry Andric     // defined more than once, which is against SSA.
157*5ffd83dbSDimitry Andric     assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
158*5ffd83dbSDimitry Andric     // Record in the cache that we know nothing for MI.
159*5ffd83dbSDimitry Andric     // This will get updated later and in the meantime, if we reach that
160*5ffd83dbSDimitry Andric     // phi again, because of a loop, we will cut the search thanks to this
161*5ffd83dbSDimitry Andric     // cache entry.
162*5ffd83dbSDimitry Andric     // We could actually build up more information on the phi by not cutting
163*5ffd83dbSDimitry Andric     // the search, but that additional information is more a side effect
164*5ffd83dbSDimitry Andric     // than an intended choice.
165*5ffd83dbSDimitry Andric     // Therefore, for now, save on compile time until we derive a proper way
166*5ffd83dbSDimitry Andric     // to derive known bits for PHIs within loops.
167*5ffd83dbSDimitry Andric     ComputeKnownBitsCache[R] = KnownBits(BitWidth);
168*5ffd83dbSDimitry Andric     // PHI's operand are a mix of registers and basic blocks interleaved.
169*5ffd83dbSDimitry Andric     // We only care about the register ones.
170*5ffd83dbSDimitry Andric     for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
171*5ffd83dbSDimitry Andric       const MachineOperand &Src = MI.getOperand(Idx);
172*5ffd83dbSDimitry Andric       Register SrcReg = Src.getReg();
173*5ffd83dbSDimitry Andric       // Look through trivial copies and phis but don't look through trivial
174*5ffd83dbSDimitry Andric       // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
175*5ffd83dbSDimitry Andric       // analysis is currently unable to determine the bit width of a
176*5ffd83dbSDimitry Andric       // register class.
1778bcb0991SDimitry Andric       //
1788bcb0991SDimitry Andric       // We can't use NoSubRegister by name as it's defined by each target but
1798bcb0991SDimitry Andric       // it's always defined to be 0 by tablegen.
180*5ffd83dbSDimitry Andric       if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
181*5ffd83dbSDimitry Andric           MRI.getType(SrcReg).isValid()) {
182*5ffd83dbSDimitry Andric         // For COPYs we don't do anything, don't increase the depth.
183*5ffd83dbSDimitry Andric         computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
184*5ffd83dbSDimitry Andric                              Depth + (Opcode != TargetOpcode::COPY));
185*5ffd83dbSDimitry Andric         Known.One &= Known2.One;
186*5ffd83dbSDimitry Andric         Known.Zero &= Known2.Zero;
187*5ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
188*5ffd83dbSDimitry Andric         // just stop looking through the operands.
189*5ffd83dbSDimitry Andric         if (Known.One == 0 && Known.Zero == 0)
190*5ffd83dbSDimitry Andric           break;
191*5ffd83dbSDimitry Andric       } else {
192*5ffd83dbSDimitry Andric         // We know nothing.
193*5ffd83dbSDimitry Andric         Known = KnownBits(BitWidth);
194*5ffd83dbSDimitry Andric         break;
195*5ffd83dbSDimitry Andric       }
1968bcb0991SDimitry Andric     }
1978bcb0991SDimitry Andric     break;
1988bcb0991SDimitry Andric   }
1998bcb0991SDimitry Andric   case TargetOpcode::G_CONSTANT: {
2008bcb0991SDimitry Andric     auto CstVal = getConstantVRegVal(R, MRI);
2018bcb0991SDimitry Andric     if (!CstVal)
2028bcb0991SDimitry Andric       break;
2038bcb0991SDimitry Andric     Known.One = *CstVal;
2048bcb0991SDimitry Andric     Known.Zero = ~Known.One;
2058bcb0991SDimitry Andric     break;
2068bcb0991SDimitry Andric   }
2078bcb0991SDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
208*5ffd83dbSDimitry Andric     int FrameIdx = MI.getOperand(1).getIndex();
209*5ffd83dbSDimitry Andric     TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
2108bcb0991SDimitry Andric     break;
2118bcb0991SDimitry Andric   }
2128bcb0991SDimitry Andric   case TargetOpcode::G_SUB: {
213*5ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2148bcb0991SDimitry Andric                          Depth + 1);
2158bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2168bcb0991SDimitry Andric                          Depth + 1);
217*5ffd83dbSDimitry Andric     Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known,
218*5ffd83dbSDimitry Andric                                         Known2);
2198bcb0991SDimitry Andric     break;
2208bcb0991SDimitry Andric   }
2218bcb0991SDimitry Andric   case TargetOpcode::G_XOR: {
2228bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2238bcb0991SDimitry Andric                          Depth + 1);
2248bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2258bcb0991SDimitry Andric                          Depth + 1);
2268bcb0991SDimitry Andric 
227*5ffd83dbSDimitry Andric     Known ^= Known2;
2288bcb0991SDimitry Andric     break;
2298bcb0991SDimitry Andric   }
230480093f4SDimitry Andric   case TargetOpcode::G_PTR_ADD: {
231480093f4SDimitry Andric     // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
2328bcb0991SDimitry Andric     LLT Ty = MRI.getType(MI.getOperand(1).getReg());
2338bcb0991SDimitry Andric     if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
2348bcb0991SDimitry Andric       break;
2358bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
2368bcb0991SDimitry Andric   }
2378bcb0991SDimitry Andric   case TargetOpcode::G_ADD: {
238*5ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2398bcb0991SDimitry Andric                          Depth + 1);
2408bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2418bcb0991SDimitry Andric                          Depth + 1);
242*5ffd83dbSDimitry Andric     Known =
243*5ffd83dbSDimitry Andric         KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2);
2448bcb0991SDimitry Andric     break;
2458bcb0991SDimitry Andric   }
2468bcb0991SDimitry Andric   case TargetOpcode::G_AND: {
2478bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
2488bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2498bcb0991SDimitry Andric                          Depth + 1);
2508bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2518bcb0991SDimitry Andric                          Depth + 1);
2528bcb0991SDimitry Andric 
253*5ffd83dbSDimitry Andric     Known &= Known2;
2548bcb0991SDimitry Andric     break;
2558bcb0991SDimitry Andric   }
2568bcb0991SDimitry Andric   case TargetOpcode::G_OR: {
2578bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
2588bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2598bcb0991SDimitry Andric                          Depth + 1);
2608bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2618bcb0991SDimitry Andric                          Depth + 1);
2628bcb0991SDimitry Andric 
263*5ffd83dbSDimitry Andric     Known |= Known2;
2648bcb0991SDimitry Andric     break;
2658bcb0991SDimitry Andric   }
2668bcb0991SDimitry Andric   case TargetOpcode::G_MUL: {
2678bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2688bcb0991SDimitry Andric                          Depth + 1);
2698bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2708bcb0991SDimitry Andric                          Depth + 1);
2718bcb0991SDimitry Andric     // If low bits are zero in either operand, output low known-0 bits.
2728bcb0991SDimitry Andric     // Also compute a conservative estimate for high known-0 bits.
2738bcb0991SDimitry Andric     // More trickiness is possible, but this is sufficient for the
2748bcb0991SDimitry Andric     // interesting case of alignment computation.
2758bcb0991SDimitry Andric     unsigned TrailZ =
2768bcb0991SDimitry Andric         Known.countMinTrailingZeros() + Known2.countMinTrailingZeros();
2778bcb0991SDimitry Andric     unsigned LeadZ =
2788bcb0991SDimitry Andric         std::max(Known.countMinLeadingZeros() + Known2.countMinLeadingZeros(),
2798bcb0991SDimitry Andric                  BitWidth) -
2808bcb0991SDimitry Andric         BitWidth;
2818bcb0991SDimitry Andric 
2828bcb0991SDimitry Andric     Known.resetAll();
2838bcb0991SDimitry Andric     Known.Zero.setLowBits(std::min(TrailZ, BitWidth));
2848bcb0991SDimitry Andric     Known.Zero.setHighBits(std::min(LeadZ, BitWidth));
2858bcb0991SDimitry Andric     break;
2868bcb0991SDimitry Andric   }
2878bcb0991SDimitry Andric   case TargetOpcode::G_SELECT: {
2888bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(3).getReg(), Known, DemandedElts,
2898bcb0991SDimitry Andric                          Depth + 1);
2908bcb0991SDimitry Andric     // If we don't know any bits, early out.
2918bcb0991SDimitry Andric     if (Known.isUnknown())
2928bcb0991SDimitry Andric       break;
2938bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2948bcb0991SDimitry Andric                          Depth + 1);
2958bcb0991SDimitry Andric     // Only known if known in both the LHS and RHS.
2968bcb0991SDimitry Andric     Known.One &= Known2.One;
2978bcb0991SDimitry Andric     Known.Zero &= Known2.Zero;
2988bcb0991SDimitry Andric     break;
2998bcb0991SDimitry Andric   }
3008bcb0991SDimitry Andric   case TargetOpcode::G_FCMP:
3018bcb0991SDimitry Andric   case TargetOpcode::G_ICMP: {
3028bcb0991SDimitry Andric     if (TL.getBooleanContents(DstTy.isVector(),
3038bcb0991SDimitry Andric                               Opcode == TargetOpcode::G_FCMP) ==
3048bcb0991SDimitry Andric             TargetLowering::ZeroOrOneBooleanContent &&
3058bcb0991SDimitry Andric         BitWidth > 1)
3068bcb0991SDimitry Andric       Known.Zero.setBitsFrom(1);
3078bcb0991SDimitry Andric     break;
3088bcb0991SDimitry Andric   }
3098bcb0991SDimitry Andric   case TargetOpcode::G_SEXT: {
3108bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3118bcb0991SDimitry Andric                          Depth + 1);
3128bcb0991SDimitry Andric     // If the sign bit is known to be zero or one, then sext will extend
3138bcb0991SDimitry Andric     // it to the top bits, else it will just zext.
3148bcb0991SDimitry Andric     Known = Known.sext(BitWidth);
3158bcb0991SDimitry Andric     break;
3168bcb0991SDimitry Andric   }
3178bcb0991SDimitry Andric   case TargetOpcode::G_ANYEXT: {
3188bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3198bcb0991SDimitry Andric                          Depth + 1);
320*5ffd83dbSDimitry Andric     Known = Known.zext(BitWidth);
3218bcb0991SDimitry Andric     break;
3228bcb0991SDimitry Andric   }
3238bcb0991SDimitry Andric   case TargetOpcode::G_LOAD: {
3248bcb0991SDimitry Andric     if (MI.hasOneMemOperand()) {
3258bcb0991SDimitry Andric       const MachineMemOperand *MMO = *MI.memoperands_begin();
3268bcb0991SDimitry Andric       if (const MDNode *Ranges = MMO->getRanges()) {
3278bcb0991SDimitry Andric         computeKnownBitsFromRangeMetadata(*Ranges, Known);
3288bcb0991SDimitry Andric       }
3298bcb0991SDimitry Andric     }
3308bcb0991SDimitry Andric     break;
3318bcb0991SDimitry Andric   }
3328bcb0991SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
3338bcb0991SDimitry Andric     // Everything above the retrieved bits is zero
3348bcb0991SDimitry Andric     if (MI.hasOneMemOperand())
3358bcb0991SDimitry Andric       Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits());
3368bcb0991SDimitry Andric     break;
3378bcb0991SDimitry Andric   }
3388bcb0991SDimitry Andric   case TargetOpcode::G_ASHR:
3398bcb0991SDimitry Andric   case TargetOpcode::G_LSHR:
3408bcb0991SDimitry Andric   case TargetOpcode::G_SHL: {
3418bcb0991SDimitry Andric     KnownBits RHSKnown;
3428bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
3438bcb0991SDimitry Andric                          Depth + 1);
3448bcb0991SDimitry Andric     if (!RHSKnown.isConstant()) {
3458bcb0991SDimitry Andric       LLVM_DEBUG(
3468bcb0991SDimitry Andric           MachineInstr *RHSMI = MRI.getVRegDef(MI.getOperand(2).getReg());
3478bcb0991SDimitry Andric           dbgs() << '[' << Depth << "] Shift not known constant: " << *RHSMI);
3488bcb0991SDimitry Andric       break;
3498bcb0991SDimitry Andric     }
3508bcb0991SDimitry Andric     uint64_t Shift = RHSKnown.getConstant().getZExtValue();
3518bcb0991SDimitry Andric     LLVM_DEBUG(dbgs() << '[' << Depth << "] Shift is " << Shift << '\n');
3528bcb0991SDimitry Andric 
3538bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3548bcb0991SDimitry Andric                          Depth + 1);
3558bcb0991SDimitry Andric 
3568bcb0991SDimitry Andric     switch (Opcode) {
3578bcb0991SDimitry Andric     case TargetOpcode::G_ASHR:
3588bcb0991SDimitry Andric       Known.Zero = Known.Zero.ashr(Shift);
3598bcb0991SDimitry Andric       Known.One = Known.One.ashr(Shift);
3608bcb0991SDimitry Andric       break;
3618bcb0991SDimitry Andric     case TargetOpcode::G_LSHR:
3628bcb0991SDimitry Andric       Known.Zero = Known.Zero.lshr(Shift);
3638bcb0991SDimitry Andric       Known.One = Known.One.lshr(Shift);
3648bcb0991SDimitry Andric       Known.Zero.setBitsFrom(Known.Zero.getBitWidth() - Shift);
3658bcb0991SDimitry Andric       break;
3668bcb0991SDimitry Andric     case TargetOpcode::G_SHL:
3678bcb0991SDimitry Andric       Known.Zero = Known.Zero.shl(Shift);
3688bcb0991SDimitry Andric       Known.One = Known.One.shl(Shift);
3698bcb0991SDimitry Andric       Known.Zero.setBits(0, Shift);
3708bcb0991SDimitry Andric       break;
3718bcb0991SDimitry Andric     }
3728bcb0991SDimitry Andric     break;
3738bcb0991SDimitry Andric   }
3748bcb0991SDimitry Andric   case TargetOpcode::G_INTTOPTR:
3758bcb0991SDimitry Andric   case TargetOpcode::G_PTRTOINT:
3768bcb0991SDimitry Andric     // Fall through and handle them the same as zext/trunc.
3778bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
3788bcb0991SDimitry Andric   case TargetOpcode::G_ZEXT:
3798bcb0991SDimitry Andric   case TargetOpcode::G_TRUNC: {
3808bcb0991SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
3818bcb0991SDimitry Andric     LLT SrcTy = MRI.getType(SrcReg);
3828bcb0991SDimitry Andric     unsigned SrcBitWidth = SrcTy.isPointer()
3838bcb0991SDimitry Andric                                ? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
3848bcb0991SDimitry Andric                                : SrcTy.getSizeInBits();
3858bcb0991SDimitry Andric     assert(SrcBitWidth && "SrcBitWidth can't be zero");
386*5ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(SrcBitWidth);
3878bcb0991SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
388*5ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(BitWidth);
3898bcb0991SDimitry Andric     if (BitWidth > SrcBitWidth)
3908bcb0991SDimitry Andric       Known.Zero.setBitsFrom(SrcBitWidth);
3918bcb0991SDimitry Andric     break;
3928bcb0991SDimitry Andric   }
3938bcb0991SDimitry Andric   }
3948bcb0991SDimitry Andric 
3958bcb0991SDimitry Andric   assert(!Known.hasConflict() && "Bits known to be one AND zero?");
396*5ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
397*5ffd83dbSDimitry Andric 
398*5ffd83dbSDimitry Andric   // Update the cache.
399*5ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
4008bcb0991SDimitry Andric }
4018bcb0991SDimitry Andric 
402480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
403480093f4SDimitry Andric                                             const APInt &DemandedElts,
404480093f4SDimitry Andric                                             unsigned Depth) {
405480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
406480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
407480093f4SDimitry Andric 
408480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
409480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
410480093f4SDimitry Andric 
411480093f4SDimitry Andric   if (Depth == getMaxDepth())
412480093f4SDimitry Andric     return 1;
413480093f4SDimitry Andric 
414480093f4SDimitry Andric   if (!DemandedElts)
415480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
416480093f4SDimitry Andric 
417480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
418*5ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
419480093f4SDimitry Andric 
420480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
421480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
422480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
423480093f4SDimitry Andric   // state.
424480093f4SDimitry Andric   if (!DstTy.isValid())
425480093f4SDimitry Andric     return 1;
426480093f4SDimitry Andric 
427*5ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
428480093f4SDimitry Andric   switch (Opcode) {
429480093f4SDimitry Andric   case TargetOpcode::COPY: {
430480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
431480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
432480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
433480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
434480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
435480093f4SDimitry Andric     }
436480093f4SDimitry Andric 
437480093f4SDimitry Andric     return 1;
438480093f4SDimitry Andric   }
439480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
440480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
441480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
442480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
443480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
444480093f4SDimitry Andric   }
445*5ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
446*5ffd83dbSDimitry Andric     Register Dst = MI.getOperand(0).getReg();
447*5ffd83dbSDimitry Andric     LLT Ty = MRI.getType(Dst);
448*5ffd83dbSDimitry Andric     // TODO: add vector support
449*5ffd83dbSDimitry Andric     if (Ty.isVector())
450*5ffd83dbSDimitry Andric       break;
451*5ffd83dbSDimitry Andric     if (MI.hasOneMemOperand())
452*5ffd83dbSDimitry Andric       return Ty.getSizeInBits() - (*MI.memoperands_begin())->getSizeInBits();
453*5ffd83dbSDimitry Andric     break;
454*5ffd83dbSDimitry Andric   }
455480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
456480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
457480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
458480093f4SDimitry Andric 
459480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
460480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
461480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
462480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
463480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
464480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
465480093f4SDimitry Andric     break;
466480093f4SDimitry Andric   }
467*5ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
468*5ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
469*5ffd83dbSDimitry Andric   default: {
470*5ffd83dbSDimitry Andric     unsigned NumBits =
471*5ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
472*5ffd83dbSDimitry Andric     if (NumBits > 1)
473*5ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
474480093f4SDimitry Andric     break;
475480093f4SDimitry Andric   }
476*5ffd83dbSDimitry Andric   }
477480093f4SDimitry Andric 
478*5ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
479*5ffd83dbSDimitry Andric   // use this information.
480*5ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
481*5ffd83dbSDimitry Andric   APInt Mask;
482*5ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
483*5ffd83dbSDimitry Andric     Mask = Known.Zero;
484*5ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
485*5ffd83dbSDimitry Andric     Mask = Known.One;
486*5ffd83dbSDimitry Andric   } else {
487*5ffd83dbSDimitry Andric     // Nothing known.
488*5ffd83dbSDimitry Andric     return FirstAnswer;
489*5ffd83dbSDimitry Andric   }
490*5ffd83dbSDimitry Andric 
491*5ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
492*5ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
493*5ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
494*5ffd83dbSDimitry Andric   return std::max(FirstAnswer, Mask.countLeadingOnes());
495480093f4SDimitry Andric }
496480093f4SDimitry Andric 
497480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
498480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
499480093f4SDimitry Andric   APInt DemandedElts = Ty.isVector()
500480093f4SDimitry Andric                            ? APInt::getAllOnesValue(Ty.getNumElements())
501480093f4SDimitry Andric                            : APInt(1, 1);
502480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
503480093f4SDimitry Andric }
504480093f4SDimitry Andric 
5058bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
5068bcb0991SDimitry Andric   AU.setPreservesAll();
5078bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
5088bcb0991SDimitry Andric }
5098bcb0991SDimitry Andric 
5108bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
5118bcb0991SDimitry Andric   return false;
5128bcb0991SDimitry Andric }
513