xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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"
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"
208bcb0991SDimitry Andric 
218bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits"
228bcb0991SDimitry Andric 
238bcb0991SDimitry Andric using namespace llvm;
248bcb0991SDimitry Andric 
258bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0;
268bcb0991SDimitry Andric 
275ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE,
288bcb0991SDimitry Andric                 "Analysis for ComputingKnownBits", false, true)
298bcb0991SDimitry Andric 
305ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth)
318bcb0991SDimitry Andric     : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()),
325ffd83dbSDimitry Andric       DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {}
338bcb0991SDimitry Andric 
345ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) {
355ffd83dbSDimitry Andric   const MachineInstr *MI = MRI.getVRegDef(R);
365ffd83dbSDimitry Andric   switch (MI->getOpcode()) {
375ffd83dbSDimitry Andric   case TargetOpcode::COPY:
385ffd83dbSDimitry Andric     return computeKnownAlignment(MI->getOperand(1).getReg(), Depth);
395ffd83dbSDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
405ffd83dbSDimitry Andric     int FrameIdx = MI->getOperand(1).getIndex();
415ffd83dbSDimitry Andric     return MF.getFrameInfo().getObjectAlign(FrameIdx);
428bcb0991SDimitry Andric   }
435ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
445ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
455ffd83dbSDimitry Andric   default:
465ffd83dbSDimitry Andric     return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1);
478bcb0991SDimitry Andric   }
488bcb0991SDimitry Andric }
498bcb0991SDimitry Andric 
508bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) {
515ffd83dbSDimitry Andric   assert(MI.getNumExplicitDefs() == 1 &&
525ffd83dbSDimitry Andric          "expected single return generic instruction");
538bcb0991SDimitry Andric   return getKnownBits(MI.getOperand(0).getReg());
548bcb0991SDimitry Andric }
558bcb0991SDimitry Andric 
568bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) {
575ffd83dbSDimitry Andric   const LLT Ty = MRI.getType(R);
588bcb0991SDimitry Andric   APInt DemandedElts =
598bcb0991SDimitry Andric       Ty.isVector() ? APInt::getAllOnesValue(Ty.getNumElements()) : APInt(1, 1);
605ffd83dbSDimitry Andric   return getKnownBits(R, DemandedElts);
615ffd83dbSDimitry Andric }
625ffd83dbSDimitry Andric 
635ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts,
645ffd83dbSDimitry Andric                                        unsigned Depth) {
655ffd83dbSDimitry Andric   // For now, we only maintain the cache during one request.
665ffd83dbSDimitry Andric   assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared");
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric   KnownBits Known;
698bcb0991SDimitry Andric   computeKnownBitsImpl(R, Known, DemandedElts);
705ffd83dbSDimitry Andric   ComputeKnownBitsCache.clear();
718bcb0991SDimitry Andric   return Known;
728bcb0991SDimitry Andric }
738bcb0991SDimitry Andric 
748bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) {
758bcb0991SDimitry Andric   LLT Ty = MRI.getType(R);
768bcb0991SDimitry Andric   unsigned BitWidth = Ty.getScalarSizeInBits();
778bcb0991SDimitry Andric   return maskedValueIsZero(R, APInt::getSignMask(BitWidth));
788bcb0991SDimitry Andric }
798bcb0991SDimitry Andric 
808bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) {
818bcb0991SDimitry Andric   return getKnownBits(R).Zero;
828bcb0991SDimitry Andric }
838bcb0991SDimitry Andric 
848bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; }
858bcb0991SDimitry Andric 
865ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void
875ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) {
885ffd83dbSDimitry Andric   dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth
895ffd83dbSDimitry Andric          << "] Computed for: " << MI << "[" << Depth << "] Known: 0x"
905ffd83dbSDimitry Andric          << (Known.Zero | Known.One).toString(16, false) << "\n"
915ffd83dbSDimitry Andric          << "[" << Depth << "] Zero: 0x" << Known.Zero.toString(16, false)
925ffd83dbSDimitry Andric          << "\n"
935ffd83dbSDimitry Andric          << "[" << Depth << "] One:  0x" << Known.One.toString(16, false)
945ffd83dbSDimitry Andric          << "\n";
955ffd83dbSDimitry Andric }
965ffd83dbSDimitry Andric 
97*e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1
98*e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1,
99*e8d8bef9SDimitry Andric                                          KnownBits &Known,
100*e8d8bef9SDimitry Andric                                          const APInt &DemandedElts,
101*e8d8bef9SDimitry Andric                                          unsigned Depth) {
102*e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
103*e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src1, Known, DemandedElts, Depth);
104*e8d8bef9SDimitry Andric 
105*e8d8bef9SDimitry Andric   // If we don't know any bits, early out.
106*e8d8bef9SDimitry Andric   if (Known.isUnknown())
107*e8d8bef9SDimitry Andric     return;
108*e8d8bef9SDimitry Andric 
109*e8d8bef9SDimitry Andric   KnownBits Known2;
110*e8d8bef9SDimitry Andric   computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth);
111*e8d8bef9SDimitry Andric 
112*e8d8bef9SDimitry Andric   // Only known if known in both the LHS and RHS.
113*e8d8bef9SDimitry Andric   Known = KnownBits::commonBits(Known, Known2);
114*e8d8bef9SDimitry Andric }
115*e8d8bef9SDimitry Andric 
1168bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
1178bcb0991SDimitry Andric                                           const APInt &DemandedElts,
1188bcb0991SDimitry Andric                                           unsigned Depth) {
1198bcb0991SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
1208bcb0991SDimitry Andric   unsigned Opcode = MI.getOpcode();
1218bcb0991SDimitry Andric   LLT DstTy = MRI.getType(R);
1228bcb0991SDimitry Andric 
1238bcb0991SDimitry Andric   // Handle the case where this is called on a register that does not have a
1248bcb0991SDimitry Andric   // type constraint (i.e. it has a register class constraint instead). This is
1258bcb0991SDimitry Andric   // unlikely to occur except by looking through copies but it is possible for
1268bcb0991SDimitry Andric   // the initial register being queried to be in this state.
1278bcb0991SDimitry Andric   if (!DstTy.isValid()) {
1288bcb0991SDimitry Andric     Known = KnownBits();
1298bcb0991SDimitry Andric     return;
1308bcb0991SDimitry Andric   }
1318bcb0991SDimitry Andric 
1328bcb0991SDimitry Andric   unsigned BitWidth = DstTy.getSizeInBits();
1335ffd83dbSDimitry Andric   auto CacheEntry = ComputeKnownBitsCache.find(R);
1345ffd83dbSDimitry Andric   if (CacheEntry != ComputeKnownBitsCache.end()) {
1355ffd83dbSDimitry Andric     Known = CacheEntry->second;
1365ffd83dbSDimitry Andric     LLVM_DEBUG(dbgs() << "Cache hit at ");
1375ffd83dbSDimitry Andric     LLVM_DEBUG(dumpResult(MI, Known, Depth));
1385ffd83dbSDimitry Andric     assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match");
1395ffd83dbSDimitry Andric     return;
1405ffd83dbSDimitry Andric   }
1418bcb0991SDimitry Andric   Known = KnownBits(BitWidth); // Don't know anything
1428bcb0991SDimitry Andric 
1438bcb0991SDimitry Andric   if (DstTy.isVector())
1448bcb0991SDimitry Andric     return; // TODO: Handle vectors.
1458bcb0991SDimitry Andric 
1465ffd83dbSDimitry Andric   // Depth may get bigger than max depth if it gets passed to a different
1475ffd83dbSDimitry Andric   // GISelKnownBits object.
1485ffd83dbSDimitry Andric   // This may happen when say a generic part uses a GISelKnownBits object
1495ffd83dbSDimitry Andric   // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
1505ffd83dbSDimitry Andric   // which creates a new GISelKnownBits object with a different and smaller
1515ffd83dbSDimitry Andric   // depth. If we just check for equality, we would never exit if the depth
1525ffd83dbSDimitry Andric   // that is passed down to the target specific GISelKnownBits object is
1535ffd83dbSDimitry Andric   // already bigger than its max depth.
1545ffd83dbSDimitry Andric   if (Depth >= getMaxDepth())
1558bcb0991SDimitry Andric     return;
1568bcb0991SDimitry Andric 
1578bcb0991SDimitry Andric   if (!DemandedElts)
1588bcb0991SDimitry Andric     return; // No demanded elts, better to assume we don't know anything.
1598bcb0991SDimitry Andric 
1608bcb0991SDimitry Andric   KnownBits Known2;
1618bcb0991SDimitry Andric 
1628bcb0991SDimitry Andric   switch (Opcode) {
1638bcb0991SDimitry Andric   default:
1648bcb0991SDimitry Andric     TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI,
1658bcb0991SDimitry Andric                                       Depth);
1668bcb0991SDimitry Andric     break;
1675ffd83dbSDimitry Andric   case TargetOpcode::COPY:
1685ffd83dbSDimitry Andric   case TargetOpcode::G_PHI:
1695ffd83dbSDimitry Andric   case TargetOpcode::PHI: {
1705ffd83dbSDimitry Andric     Known.One = APInt::getAllOnesValue(BitWidth);
1715ffd83dbSDimitry Andric     Known.Zero = APInt::getAllOnesValue(BitWidth);
1725ffd83dbSDimitry Andric     // Destination registers should not have subregisters at this
1735ffd83dbSDimitry Andric     // point of the pipeline, otherwise the main live-range will be
1745ffd83dbSDimitry Andric     // defined more than once, which is against SSA.
1755ffd83dbSDimitry Andric     assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?");
1765ffd83dbSDimitry Andric     // Record in the cache that we know nothing for MI.
1775ffd83dbSDimitry Andric     // This will get updated later and in the meantime, if we reach that
1785ffd83dbSDimitry Andric     // phi again, because of a loop, we will cut the search thanks to this
1795ffd83dbSDimitry Andric     // cache entry.
1805ffd83dbSDimitry Andric     // We could actually build up more information on the phi by not cutting
1815ffd83dbSDimitry Andric     // the search, but that additional information is more a side effect
1825ffd83dbSDimitry Andric     // than an intended choice.
1835ffd83dbSDimitry Andric     // Therefore, for now, save on compile time until we derive a proper way
1845ffd83dbSDimitry Andric     // to derive known bits for PHIs within loops.
1855ffd83dbSDimitry Andric     ComputeKnownBitsCache[R] = KnownBits(BitWidth);
1865ffd83dbSDimitry Andric     // PHI's operand are a mix of registers and basic blocks interleaved.
1875ffd83dbSDimitry Andric     // We only care about the register ones.
1885ffd83dbSDimitry Andric     for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) {
1895ffd83dbSDimitry Andric       const MachineOperand &Src = MI.getOperand(Idx);
1905ffd83dbSDimitry Andric       Register SrcReg = Src.getReg();
1915ffd83dbSDimitry Andric       // Look through trivial copies and phis but don't look through trivial
1925ffd83dbSDimitry Andric       // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits
1935ffd83dbSDimitry Andric       // analysis is currently unable to determine the bit width of a
1945ffd83dbSDimitry Andric       // register class.
1958bcb0991SDimitry Andric       //
1968bcb0991SDimitry Andric       // We can't use NoSubRegister by name as it's defined by each target but
1978bcb0991SDimitry Andric       // it's always defined to be 0 by tablegen.
1985ffd83dbSDimitry Andric       if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ &&
1995ffd83dbSDimitry Andric           MRI.getType(SrcReg).isValid()) {
2005ffd83dbSDimitry Andric         // For COPYs we don't do anything, don't increase the depth.
2015ffd83dbSDimitry Andric         computeKnownBitsImpl(SrcReg, Known2, DemandedElts,
2025ffd83dbSDimitry Andric                              Depth + (Opcode != TargetOpcode::COPY));
203*e8d8bef9SDimitry Andric         Known = KnownBits::commonBits(Known, Known2);
2045ffd83dbSDimitry Andric         // If we reach a point where we don't know anything
2055ffd83dbSDimitry Andric         // just stop looking through the operands.
2065ffd83dbSDimitry Andric         if (Known.One == 0 && Known.Zero == 0)
2075ffd83dbSDimitry Andric           break;
2085ffd83dbSDimitry Andric       } else {
2095ffd83dbSDimitry Andric         // We know nothing.
2105ffd83dbSDimitry Andric         Known = KnownBits(BitWidth);
2115ffd83dbSDimitry Andric         break;
2125ffd83dbSDimitry Andric       }
2138bcb0991SDimitry Andric     }
2148bcb0991SDimitry Andric     break;
2158bcb0991SDimitry Andric   }
2168bcb0991SDimitry Andric   case TargetOpcode::G_CONSTANT: {
2178bcb0991SDimitry Andric     auto CstVal = getConstantVRegVal(R, MRI);
2188bcb0991SDimitry Andric     if (!CstVal)
2198bcb0991SDimitry Andric       break;
220*e8d8bef9SDimitry Andric     Known = KnownBits::makeConstant(*CstVal);
2218bcb0991SDimitry Andric     break;
2228bcb0991SDimitry Andric   }
2238bcb0991SDimitry Andric   case TargetOpcode::G_FRAME_INDEX: {
2245ffd83dbSDimitry Andric     int FrameIdx = MI.getOperand(1).getIndex();
2255ffd83dbSDimitry Andric     TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF);
2268bcb0991SDimitry Andric     break;
2278bcb0991SDimitry Andric   }
2288bcb0991SDimitry Andric   case TargetOpcode::G_SUB: {
2295ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2308bcb0991SDimitry Andric                          Depth + 1);
2318bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2328bcb0991SDimitry Andric                          Depth + 1);
2335ffd83dbSDimitry Andric     Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known,
2345ffd83dbSDimitry Andric                                         Known2);
2358bcb0991SDimitry Andric     break;
2368bcb0991SDimitry Andric   }
2378bcb0991SDimitry Andric   case TargetOpcode::G_XOR: {
2388bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2398bcb0991SDimitry Andric                          Depth + 1);
2408bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2418bcb0991SDimitry Andric                          Depth + 1);
2428bcb0991SDimitry Andric 
2435ffd83dbSDimitry Andric     Known ^= Known2;
2448bcb0991SDimitry Andric     break;
2458bcb0991SDimitry Andric   }
246480093f4SDimitry Andric   case TargetOpcode::G_PTR_ADD: {
247480093f4SDimitry Andric     // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets?
2488bcb0991SDimitry Andric     LLT Ty = MRI.getType(MI.getOperand(1).getReg());
2498bcb0991SDimitry Andric     if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace()))
2508bcb0991SDimitry Andric       break;
2518bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
2528bcb0991SDimitry Andric   }
2538bcb0991SDimitry Andric   case TargetOpcode::G_ADD: {
2545ffd83dbSDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2558bcb0991SDimitry Andric                          Depth + 1);
2568bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts,
2578bcb0991SDimitry Andric                          Depth + 1);
2585ffd83dbSDimitry Andric     Known =
2595ffd83dbSDimitry Andric         KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2);
2608bcb0991SDimitry Andric     break;
2618bcb0991SDimitry Andric   }
2628bcb0991SDimitry Andric   case TargetOpcode::G_AND: {
2638bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
2648bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2658bcb0991SDimitry Andric                          Depth + 1);
2668bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2678bcb0991SDimitry Andric                          Depth + 1);
2688bcb0991SDimitry Andric 
2695ffd83dbSDimitry Andric     Known &= Known2;
2708bcb0991SDimitry Andric     break;
2718bcb0991SDimitry Andric   }
2728bcb0991SDimitry Andric   case TargetOpcode::G_OR: {
2738bcb0991SDimitry Andric     // If either the LHS or the RHS are Zero, the result is zero.
2748bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2758bcb0991SDimitry Andric                          Depth + 1);
2768bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2778bcb0991SDimitry Andric                          Depth + 1);
2788bcb0991SDimitry Andric 
2795ffd83dbSDimitry Andric     Known |= Known2;
2808bcb0991SDimitry Andric     break;
2818bcb0991SDimitry Andric   }
2828bcb0991SDimitry Andric   case TargetOpcode::G_MUL: {
2838bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
2848bcb0991SDimitry Andric                          Depth + 1);
2858bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
2868bcb0991SDimitry Andric                          Depth + 1);
287*e8d8bef9SDimitry Andric     Known = KnownBits::computeForMul(Known, Known2);
2888bcb0991SDimitry Andric     break;
2898bcb0991SDimitry Andric   }
2908bcb0991SDimitry Andric   case TargetOpcode::G_SELECT: {
291*e8d8bef9SDimitry Andric     computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(),
292*e8d8bef9SDimitry Andric                         Known, DemandedElts, Depth + 1);
2938bcb0991SDimitry Andric     break;
294*e8d8bef9SDimitry Andric   }
295*e8d8bef9SDimitry Andric   case TargetOpcode::G_SMIN: {
296*e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
297*e8d8bef9SDimitry Andric     KnownBits KnownRHS;
298*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
2998bcb0991SDimitry Andric                          Depth + 1);
300*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
301*e8d8bef9SDimitry Andric                          Depth + 1);
302*e8d8bef9SDimitry Andric     Known = KnownBits::smin(Known, KnownRHS);
303*e8d8bef9SDimitry Andric     break;
304*e8d8bef9SDimitry Andric   }
305*e8d8bef9SDimitry Andric   case TargetOpcode::G_SMAX: {
306*e8d8bef9SDimitry Andric     // TODO: Handle clamp pattern with number of sign bits
307*e8d8bef9SDimitry Andric     KnownBits KnownRHS;
308*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
309*e8d8bef9SDimitry Andric                          Depth + 1);
310*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts,
311*e8d8bef9SDimitry Andric                          Depth + 1);
312*e8d8bef9SDimitry Andric     Known = KnownBits::smax(Known, KnownRHS);
313*e8d8bef9SDimitry Andric     break;
314*e8d8bef9SDimitry Andric   }
315*e8d8bef9SDimitry Andric   case TargetOpcode::G_UMIN: {
316*e8d8bef9SDimitry Andric     KnownBits KnownRHS;
317*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
318*e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
319*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
320*e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
321*e8d8bef9SDimitry Andric     Known = KnownBits::umin(Known, KnownRHS);
322*e8d8bef9SDimitry Andric     break;
323*e8d8bef9SDimitry Andric   }
324*e8d8bef9SDimitry Andric   case TargetOpcode::G_UMAX: {
325*e8d8bef9SDimitry Andric     KnownBits KnownRHS;
326*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known,
327*e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
328*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS,
329*e8d8bef9SDimitry Andric                          DemandedElts, Depth + 1);
330*e8d8bef9SDimitry Andric     Known = KnownBits::umax(Known, KnownRHS);
3318bcb0991SDimitry Andric     break;
3328bcb0991SDimitry Andric   }
3338bcb0991SDimitry Andric   case TargetOpcode::G_FCMP:
3348bcb0991SDimitry Andric   case TargetOpcode::G_ICMP: {
3358bcb0991SDimitry Andric     if (TL.getBooleanContents(DstTy.isVector(),
3368bcb0991SDimitry Andric                               Opcode == TargetOpcode::G_FCMP) ==
3378bcb0991SDimitry Andric             TargetLowering::ZeroOrOneBooleanContent &&
3388bcb0991SDimitry Andric         BitWidth > 1)
3398bcb0991SDimitry Andric       Known.Zero.setBitsFrom(1);
3408bcb0991SDimitry Andric     break;
3418bcb0991SDimitry Andric   }
3428bcb0991SDimitry Andric   case TargetOpcode::G_SEXT: {
3438bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3448bcb0991SDimitry Andric                          Depth + 1);
3458bcb0991SDimitry Andric     // If the sign bit is known to be zero or one, then sext will extend
3468bcb0991SDimitry Andric     // it to the top bits, else it will just zext.
3478bcb0991SDimitry Andric     Known = Known.sext(BitWidth);
3488bcb0991SDimitry Andric     break;
3498bcb0991SDimitry Andric   }
350*e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
351*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
352*e8d8bef9SDimitry Andric                          Depth + 1);
353*e8d8bef9SDimitry Andric     Known = Known.sextInReg(MI.getOperand(2).getImm());
354*e8d8bef9SDimitry Andric     break;
355*e8d8bef9SDimitry Andric   }
3568bcb0991SDimitry Andric   case TargetOpcode::G_ANYEXT: {
3578bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts,
3588bcb0991SDimitry Andric                          Depth + 1);
359*e8d8bef9SDimitry Andric     Known = Known.anyext(BitWidth);
3608bcb0991SDimitry Andric     break;
3618bcb0991SDimitry Andric   }
3628bcb0991SDimitry Andric   case TargetOpcode::G_LOAD: {
3638bcb0991SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
3648bcb0991SDimitry Andric     if (const MDNode *Ranges = MMO->getRanges()) {
3658bcb0991SDimitry Andric       computeKnownBitsFromRangeMetadata(*Ranges, Known);
3668bcb0991SDimitry Andric     }
367*e8d8bef9SDimitry Andric 
3688bcb0991SDimitry Andric     break;
3698bcb0991SDimitry Andric   }
3708bcb0991SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
3718bcb0991SDimitry Andric     // Everything above the retrieved bits is zero
3728bcb0991SDimitry Andric     Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits());
3738bcb0991SDimitry Andric     break;
3748bcb0991SDimitry Andric   }
375*e8d8bef9SDimitry Andric   case TargetOpcode::G_ASHR: {
376*e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
377*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
378*e8d8bef9SDimitry Andric                          Depth + 1);
3798bcb0991SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
3808bcb0991SDimitry Andric                          Depth + 1);
381*e8d8bef9SDimitry Andric     Known = KnownBits::ashr(LHSKnown, RHSKnown);
3828bcb0991SDimitry Andric     break;
3838bcb0991SDimitry Andric   }
384*e8d8bef9SDimitry Andric   case TargetOpcode::G_LSHR: {
385*e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
386*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
3878bcb0991SDimitry Andric                          Depth + 1);
388*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
389*e8d8bef9SDimitry Andric                          Depth + 1);
390*e8d8bef9SDimitry Andric     Known = KnownBits::lshr(LHSKnown, RHSKnown);
3918bcb0991SDimitry Andric     break;
3928bcb0991SDimitry Andric   }
393*e8d8bef9SDimitry Andric   case TargetOpcode::G_SHL: {
394*e8d8bef9SDimitry Andric     KnownBits LHSKnown, RHSKnown;
395*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts,
396*e8d8bef9SDimitry Andric                          Depth + 1);
397*e8d8bef9SDimitry Andric     computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts,
398*e8d8bef9SDimitry Andric                          Depth + 1);
399*e8d8bef9SDimitry Andric     Known = KnownBits::shl(LHSKnown, RHSKnown);
4008bcb0991SDimitry Andric     break;
4018bcb0991SDimitry Andric   }
4028bcb0991SDimitry Andric   case TargetOpcode::G_INTTOPTR:
4038bcb0991SDimitry Andric   case TargetOpcode::G_PTRTOINT:
4048bcb0991SDimitry Andric     // Fall through and handle them the same as zext/trunc.
4058bcb0991SDimitry Andric     LLVM_FALLTHROUGH;
4068bcb0991SDimitry Andric   case TargetOpcode::G_ZEXT:
4078bcb0991SDimitry Andric   case TargetOpcode::G_TRUNC: {
4088bcb0991SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
4098bcb0991SDimitry Andric     LLT SrcTy = MRI.getType(SrcReg);
4108bcb0991SDimitry Andric     unsigned SrcBitWidth = SrcTy.isPointer()
4118bcb0991SDimitry Andric                                ? DL.getIndexSizeInBits(SrcTy.getAddressSpace())
4128bcb0991SDimitry Andric                                : SrcTy.getSizeInBits();
4138bcb0991SDimitry Andric     assert(SrcBitWidth && "SrcBitWidth can't be zero");
4145ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(SrcBitWidth);
4158bcb0991SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
4165ffd83dbSDimitry Andric     Known = Known.zextOrTrunc(BitWidth);
4178bcb0991SDimitry Andric     if (BitWidth > SrcBitWidth)
4188bcb0991SDimitry Andric       Known.Zero.setBitsFrom(SrcBitWidth);
4198bcb0991SDimitry Andric     break;
4208bcb0991SDimitry Andric   }
421*e8d8bef9SDimitry Andric   case TargetOpcode::G_MERGE_VALUES: {
422*e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
423*e8d8bef9SDimitry Andric     unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
424*e8d8bef9SDimitry Andric 
425*e8d8bef9SDimitry Andric     for (unsigned I = 0; I != NumOps - 1; ++I) {
426*e8d8bef9SDimitry Andric       KnownBits SrcOpKnown;
427*e8d8bef9SDimitry Andric       computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown,
428*e8d8bef9SDimitry Andric                            DemandedElts, Depth + 1);
429*e8d8bef9SDimitry Andric       Known.insertBits(SrcOpKnown, I * OpSize);
430*e8d8bef9SDimitry Andric     }
431*e8d8bef9SDimitry Andric     break;
432*e8d8bef9SDimitry Andric   }
433*e8d8bef9SDimitry Andric   case TargetOpcode::G_UNMERGE_VALUES: {
434*e8d8bef9SDimitry Andric     unsigned NumOps = MI.getNumOperands();
435*e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(NumOps - 1).getReg();
436*e8d8bef9SDimitry Andric     if (MRI.getType(SrcReg).isVector())
437*e8d8bef9SDimitry Andric       return; // TODO: Handle vectors.
438*e8d8bef9SDimitry Andric 
439*e8d8bef9SDimitry Andric     KnownBits SrcOpKnown;
440*e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1);
441*e8d8bef9SDimitry Andric 
442*e8d8bef9SDimitry Andric     // Figure out the result operand index
443*e8d8bef9SDimitry Andric     unsigned DstIdx = 0;
444*e8d8bef9SDimitry Andric     for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R;
445*e8d8bef9SDimitry Andric          ++DstIdx)
446*e8d8bef9SDimitry Andric       ;
447*e8d8bef9SDimitry Andric 
448*e8d8bef9SDimitry Andric     Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx);
449*e8d8bef9SDimitry Andric     break;
450*e8d8bef9SDimitry Andric   }
451*e8d8bef9SDimitry Andric   case TargetOpcode::G_BSWAP: {
452*e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
453*e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
454*e8d8bef9SDimitry Andric     Known.byteSwap();
455*e8d8bef9SDimitry Andric     break;
456*e8d8bef9SDimitry Andric   }
457*e8d8bef9SDimitry Andric   case TargetOpcode::G_BITREVERSE: {
458*e8d8bef9SDimitry Andric     Register SrcReg = MI.getOperand(1).getReg();
459*e8d8bef9SDimitry Andric     computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1);
460*e8d8bef9SDimitry Andric     Known.reverseBits();
461*e8d8bef9SDimitry Andric     break;
462*e8d8bef9SDimitry Andric   }
4638bcb0991SDimitry Andric   }
4648bcb0991SDimitry Andric 
4658bcb0991SDimitry Andric   assert(!Known.hasConflict() && "Bits known to be one AND zero?");
4665ffd83dbSDimitry Andric   LLVM_DEBUG(dumpResult(MI, Known, Depth));
4675ffd83dbSDimitry Andric 
4685ffd83dbSDimitry Andric   // Update the cache.
4695ffd83dbSDimitry Andric   ComputeKnownBitsCache[R] = Known;
4708bcb0991SDimitry Andric }
4718bcb0991SDimitry Andric 
472*e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1
473*e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1,
474*e8d8bef9SDimitry Andric                                                const APInt &DemandedElts,
475*e8d8bef9SDimitry Andric                                                unsigned Depth) {
476*e8d8bef9SDimitry Andric   // Test src1 first, since we canonicalize simpler expressions to the RHS.
477*e8d8bef9SDimitry Andric   unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth);
478*e8d8bef9SDimitry Andric   if (Src1SignBits == 1)
479*e8d8bef9SDimitry Andric     return 1;
480*e8d8bef9SDimitry Andric   return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits);
481*e8d8bef9SDimitry Andric }
482*e8d8bef9SDimitry Andric 
483480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R,
484480093f4SDimitry Andric                                             const APInt &DemandedElts,
485480093f4SDimitry Andric                                             unsigned Depth) {
486480093f4SDimitry Andric   MachineInstr &MI = *MRI.getVRegDef(R);
487480093f4SDimitry Andric   unsigned Opcode = MI.getOpcode();
488480093f4SDimitry Andric 
489480093f4SDimitry Andric   if (Opcode == TargetOpcode::G_CONSTANT)
490480093f4SDimitry Andric     return MI.getOperand(1).getCImm()->getValue().getNumSignBits();
491480093f4SDimitry Andric 
492480093f4SDimitry Andric   if (Depth == getMaxDepth())
493480093f4SDimitry Andric     return 1;
494480093f4SDimitry Andric 
495480093f4SDimitry Andric   if (!DemandedElts)
496480093f4SDimitry Andric     return 1; // No demanded elts, better to assume we don't know anything.
497480093f4SDimitry Andric 
498480093f4SDimitry Andric   LLT DstTy = MRI.getType(R);
4995ffd83dbSDimitry Andric   const unsigned TyBits = DstTy.getScalarSizeInBits();
500480093f4SDimitry Andric 
501480093f4SDimitry Andric   // Handle the case where this is called on a register that does not have a
502480093f4SDimitry Andric   // type constraint. This is unlikely to occur except by looking through copies
503480093f4SDimitry Andric   // but it is possible for the initial register being queried to be in this
504480093f4SDimitry Andric   // state.
505480093f4SDimitry Andric   if (!DstTy.isValid())
506480093f4SDimitry Andric     return 1;
507480093f4SDimitry Andric 
5085ffd83dbSDimitry Andric   unsigned FirstAnswer = 1;
509480093f4SDimitry Andric   switch (Opcode) {
510480093f4SDimitry Andric   case TargetOpcode::COPY: {
511480093f4SDimitry Andric     MachineOperand &Src = MI.getOperand(1);
512480093f4SDimitry Andric     if (Src.getReg().isVirtual() && Src.getSubReg() == 0 &&
513480093f4SDimitry Andric         MRI.getType(Src.getReg()).isValid()) {
514480093f4SDimitry Andric       // Don't increment Depth for this one since we didn't do any work.
515480093f4SDimitry Andric       return computeNumSignBits(Src.getReg(), DemandedElts, Depth);
516480093f4SDimitry Andric     }
517480093f4SDimitry Andric 
518480093f4SDimitry Andric     return 1;
519480093f4SDimitry Andric   }
520480093f4SDimitry Andric   case TargetOpcode::G_SEXT: {
521480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
522480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
523480093f4SDimitry Andric     unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits();
524480093f4SDimitry Andric     return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp;
525480093f4SDimitry Andric   }
526*e8d8bef9SDimitry Andric   case TargetOpcode::G_SEXT_INREG: {
527*e8d8bef9SDimitry Andric     // Max of the input and what this extends.
528*e8d8bef9SDimitry Andric     Register Src = MI.getOperand(1).getReg();
529*e8d8bef9SDimitry Andric     unsigned SrcBits = MI.getOperand(2).getImm();
530*e8d8bef9SDimitry Andric     unsigned InRegBits = TyBits - SrcBits + 1;
531*e8d8bef9SDimitry Andric     return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits);
532*e8d8bef9SDimitry Andric   }
5335ffd83dbSDimitry Andric   case TargetOpcode::G_SEXTLOAD: {
534*e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
535*e8d8bef9SDimitry Andric     if (DstTy.isVector())
536*e8d8bef9SDimitry Andric       return 1;
537*e8d8bef9SDimitry Andric 
538*e8d8bef9SDimitry Andric     // e.g. i16->i32 = '17' bits known.
539*e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
540*e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits() + 1;
541*e8d8bef9SDimitry Andric   }
542*e8d8bef9SDimitry Andric   case TargetOpcode::G_ZEXTLOAD: {
543*e8d8bef9SDimitry Andric     // FIXME: We need an in-memory type representation.
544*e8d8bef9SDimitry Andric     if (DstTy.isVector())
545*e8d8bef9SDimitry Andric       return 1;
546*e8d8bef9SDimitry Andric 
547*e8d8bef9SDimitry Andric     // e.g. i16->i32 = '16' bits known.
548*e8d8bef9SDimitry Andric     const MachineMemOperand *MMO = *MI.memoperands_begin();
549*e8d8bef9SDimitry Andric     return TyBits - MMO->getSizeInBits();
5505ffd83dbSDimitry Andric   }
551480093f4SDimitry Andric   case TargetOpcode::G_TRUNC: {
552480093f4SDimitry Andric     Register Src = MI.getOperand(1).getReg();
553480093f4SDimitry Andric     LLT SrcTy = MRI.getType(Src);
554480093f4SDimitry Andric 
555480093f4SDimitry Andric     // Check if the sign bits of source go down as far as the truncated value.
556480093f4SDimitry Andric     unsigned DstTyBits = DstTy.getScalarSizeInBits();
557480093f4SDimitry Andric     unsigned NumSrcBits = SrcTy.getScalarSizeInBits();
558480093f4SDimitry Andric     unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1);
559480093f4SDimitry Andric     if (NumSrcSignBits > (NumSrcBits - DstTyBits))
560480093f4SDimitry Andric       return NumSrcSignBits - (NumSrcBits - DstTyBits);
561480093f4SDimitry Andric     break;
562480093f4SDimitry Andric   }
563*e8d8bef9SDimitry Andric   case TargetOpcode::G_SELECT: {
564*e8d8bef9SDimitry Andric     return computeNumSignBitsMin(MI.getOperand(2).getReg(),
565*e8d8bef9SDimitry Andric                                  MI.getOperand(3).getReg(), DemandedElts,
566*e8d8bef9SDimitry Andric                                  Depth + 1);
567*e8d8bef9SDimitry Andric   }
5685ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC:
5695ffd83dbSDimitry Andric   case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
5705ffd83dbSDimitry Andric   default: {
5715ffd83dbSDimitry Andric     unsigned NumBits =
5725ffd83dbSDimitry Andric       TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth);
5735ffd83dbSDimitry Andric     if (NumBits > 1)
5745ffd83dbSDimitry Andric       FirstAnswer = std::max(FirstAnswer, NumBits);
575480093f4SDimitry Andric     break;
576480093f4SDimitry Andric   }
5775ffd83dbSDimitry Andric   }
578480093f4SDimitry Andric 
5795ffd83dbSDimitry Andric   // Finally, if we can prove that the top bits of the result are 0's or 1's,
5805ffd83dbSDimitry Andric   // use this information.
5815ffd83dbSDimitry Andric   KnownBits Known = getKnownBits(R, DemandedElts, Depth);
5825ffd83dbSDimitry Andric   APInt Mask;
5835ffd83dbSDimitry Andric   if (Known.isNonNegative()) {        // sign bit is 0
5845ffd83dbSDimitry Andric     Mask = Known.Zero;
5855ffd83dbSDimitry Andric   } else if (Known.isNegative()) {  // sign bit is 1;
5865ffd83dbSDimitry Andric     Mask = Known.One;
5875ffd83dbSDimitry Andric   } else {
5885ffd83dbSDimitry Andric     // Nothing known.
5895ffd83dbSDimitry Andric     return FirstAnswer;
5905ffd83dbSDimitry Andric   }
5915ffd83dbSDimitry Andric 
5925ffd83dbSDimitry Andric   // Okay, we know that the sign bit in Mask is set.  Use CLO to determine
5935ffd83dbSDimitry Andric   // the number of identical bits in the top of the input value.
5945ffd83dbSDimitry Andric   Mask <<= Mask.getBitWidth() - TyBits;
5955ffd83dbSDimitry Andric   return std::max(FirstAnswer, Mask.countLeadingOnes());
596480093f4SDimitry Andric }
597480093f4SDimitry Andric 
598480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) {
599480093f4SDimitry Andric   LLT Ty = MRI.getType(R);
600480093f4SDimitry Andric   APInt DemandedElts = Ty.isVector()
601480093f4SDimitry Andric                            ? APInt::getAllOnesValue(Ty.getNumElements())
602480093f4SDimitry Andric                            : APInt(1, 1);
603480093f4SDimitry Andric   return computeNumSignBits(R, DemandedElts, Depth);
604480093f4SDimitry Andric }
605480093f4SDimitry Andric 
6068bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
6078bcb0991SDimitry Andric   AU.setPreservesAll();
6088bcb0991SDimitry Andric   MachineFunctionPass::getAnalysisUsage(AU);
6098bcb0991SDimitry Andric }
6108bcb0991SDimitry Andric 
6118bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) {
6128bcb0991SDimitry Andric   return false;
6138bcb0991SDimitry Andric }
614