18bcb0991SDimitry Andric //===- lib/CodeGen/GlobalISel/GISelKnownBits.cpp --------------*- C++ *-===// 28bcb0991SDimitry Andric // 38bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 58bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68bcb0991SDimitry Andric // 78bcb0991SDimitry Andric //===----------------------------------------------------------------------===// 88bcb0991SDimitry Andric // 98bcb0991SDimitry Andric /// Provides analysis for querying information about KnownBits during GISel 108bcb0991SDimitry Andric /// passes. 118bcb0991SDimitry Andric // 12349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 138bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 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); 4004eeddc0SDimitry Andric case TargetOpcode::G_ASSERT_ALIGN: { 4104eeddc0SDimitry Andric // TODO: Min with source 4204eeddc0SDimitry Andric int64_t LogAlign = MI->getOperand(2).getImm(); 4304eeddc0SDimitry Andric return Align(1ull << LogAlign); 4404eeddc0SDimitry Andric } 455ffd83dbSDimitry Andric case TargetOpcode::G_FRAME_INDEX: { 465ffd83dbSDimitry Andric int FrameIdx = MI->getOperand(1).getIndex(); 475ffd83dbSDimitry Andric return MF.getFrameInfo().getObjectAlign(FrameIdx); 488bcb0991SDimitry Andric } 495ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC: 505ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 515ffd83dbSDimitry Andric default: 525ffd83dbSDimitry Andric return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1); 538bcb0991SDimitry Andric } 548bcb0991SDimitry Andric } 558bcb0991SDimitry Andric 568bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) { 575ffd83dbSDimitry Andric assert(MI.getNumExplicitDefs() == 1 && 585ffd83dbSDimitry Andric "expected single return generic instruction"); 598bcb0991SDimitry Andric return getKnownBits(MI.getOperand(0).getReg()); 608bcb0991SDimitry Andric } 618bcb0991SDimitry Andric 628bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) { 635ffd83dbSDimitry Andric const LLT Ty = MRI.getType(R); 648bcb0991SDimitry Andric APInt DemandedElts = 65349cc55cSDimitry Andric Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1); 665ffd83dbSDimitry Andric return getKnownBits(R, DemandedElts); 675ffd83dbSDimitry Andric } 685ffd83dbSDimitry Andric 695ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts, 705ffd83dbSDimitry Andric unsigned Depth) { 715ffd83dbSDimitry Andric // For now, we only maintain the cache during one request. 725ffd83dbSDimitry Andric assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared"); 735ffd83dbSDimitry Andric 745ffd83dbSDimitry Andric KnownBits Known; 758bcb0991SDimitry Andric computeKnownBitsImpl(R, Known, DemandedElts); 765ffd83dbSDimitry Andric ComputeKnownBitsCache.clear(); 778bcb0991SDimitry Andric return Known; 788bcb0991SDimitry Andric } 798bcb0991SDimitry Andric 808bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) { 818bcb0991SDimitry Andric LLT Ty = MRI.getType(R); 828bcb0991SDimitry Andric unsigned BitWidth = Ty.getScalarSizeInBits(); 838bcb0991SDimitry Andric return maskedValueIsZero(R, APInt::getSignMask(BitWidth)); 848bcb0991SDimitry Andric } 858bcb0991SDimitry Andric 868bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) { 878bcb0991SDimitry Andric return getKnownBits(R).Zero; 888bcb0991SDimitry Andric } 898bcb0991SDimitry Andric 908bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; } 918bcb0991SDimitry Andric 925ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void 935ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) { 945ffd83dbSDimitry Andric dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth 955ffd83dbSDimitry Andric << "] Computed for: " << MI << "[" << Depth << "] Known: 0x" 96fe6060f1SDimitry Andric << toString(Known.Zero | Known.One, 16, false) << "\n" 97fe6060f1SDimitry Andric << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false) 985ffd83dbSDimitry Andric << "\n" 99fe6060f1SDimitry Andric << "[" << Depth << "] One: 0x" << toString(Known.One, 16, false) 1005ffd83dbSDimitry Andric << "\n"; 1015ffd83dbSDimitry Andric } 1025ffd83dbSDimitry Andric 103e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1 104e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1, 105e8d8bef9SDimitry Andric KnownBits &Known, 106e8d8bef9SDimitry Andric const APInt &DemandedElts, 107e8d8bef9SDimitry Andric unsigned Depth) { 108e8d8bef9SDimitry Andric // Test src1 first, since we canonicalize simpler expressions to the RHS. 109e8d8bef9SDimitry Andric computeKnownBitsImpl(Src1, Known, DemandedElts, Depth); 110e8d8bef9SDimitry Andric 111e8d8bef9SDimitry Andric // If we don't know any bits, early out. 112e8d8bef9SDimitry Andric if (Known.isUnknown()) 113e8d8bef9SDimitry Andric return; 114e8d8bef9SDimitry Andric 115e8d8bef9SDimitry Andric KnownBits Known2; 116e8d8bef9SDimitry Andric computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth); 117e8d8bef9SDimitry Andric 118e8d8bef9SDimitry Andric // Only known if known in both the LHS and RHS. 119e8d8bef9SDimitry Andric Known = KnownBits::commonBits(Known, Known2); 120e8d8bef9SDimitry Andric } 121e8d8bef9SDimitry Andric 122fe6060f1SDimitry Andric // Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is 123fe6060f1SDimitry Andric // created using Width. Use this function when the inputs are KnownBits 124fe6060f1SDimitry Andric // objects. TODO: Move this KnownBits.h if this is usable in more cases. 125fe6060f1SDimitry Andric static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown, 126fe6060f1SDimitry Andric const KnownBits &OffsetKnown, 127fe6060f1SDimitry Andric const KnownBits &WidthKnown) { 128fe6060f1SDimitry Andric KnownBits Mask(BitWidth); 129fe6060f1SDimitry Andric Mask.Zero = APInt::getBitsSetFrom( 130fe6060f1SDimitry Andric BitWidth, WidthKnown.getMaxValue().getLimitedValue(BitWidth)); 131fe6060f1SDimitry Andric Mask.One = APInt::getLowBitsSet( 132fe6060f1SDimitry Andric BitWidth, WidthKnown.getMinValue().getLimitedValue(BitWidth)); 133fe6060f1SDimitry Andric return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask; 134fe6060f1SDimitry Andric } 135fe6060f1SDimitry Andric 1368bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known, 1378bcb0991SDimitry Andric const APInt &DemandedElts, 1388bcb0991SDimitry Andric unsigned Depth) { 1398bcb0991SDimitry Andric MachineInstr &MI = *MRI.getVRegDef(R); 1408bcb0991SDimitry Andric unsigned Opcode = MI.getOpcode(); 1418bcb0991SDimitry Andric LLT DstTy = MRI.getType(R); 1428bcb0991SDimitry Andric 1438bcb0991SDimitry Andric // Handle the case where this is called on a register that does not have a 1448bcb0991SDimitry Andric // type constraint (i.e. it has a register class constraint instead). This is 1458bcb0991SDimitry Andric // unlikely to occur except by looking through copies but it is possible for 1468bcb0991SDimitry Andric // the initial register being queried to be in this state. 1478bcb0991SDimitry Andric if (!DstTy.isValid()) { 1488bcb0991SDimitry Andric Known = KnownBits(); 1498bcb0991SDimitry Andric return; 1508bcb0991SDimitry Andric } 1518bcb0991SDimitry Andric 152fe6060f1SDimitry Andric unsigned BitWidth = DstTy.getScalarSizeInBits(); 1535ffd83dbSDimitry Andric auto CacheEntry = ComputeKnownBitsCache.find(R); 1545ffd83dbSDimitry Andric if (CacheEntry != ComputeKnownBitsCache.end()) { 1555ffd83dbSDimitry Andric Known = CacheEntry->second; 1565ffd83dbSDimitry Andric LLVM_DEBUG(dbgs() << "Cache hit at "); 1575ffd83dbSDimitry Andric LLVM_DEBUG(dumpResult(MI, Known, Depth)); 1585ffd83dbSDimitry Andric assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match"); 1595ffd83dbSDimitry Andric return; 1605ffd83dbSDimitry Andric } 1618bcb0991SDimitry Andric Known = KnownBits(BitWidth); // Don't know anything 1628bcb0991SDimitry Andric 1635ffd83dbSDimitry Andric // Depth may get bigger than max depth if it gets passed to a different 1645ffd83dbSDimitry Andric // GISelKnownBits object. 1655ffd83dbSDimitry Andric // This may happen when say a generic part uses a GISelKnownBits object 1665ffd83dbSDimitry Andric // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr 1675ffd83dbSDimitry Andric // which creates a new GISelKnownBits object with a different and smaller 1685ffd83dbSDimitry Andric // depth. If we just check for equality, we would never exit if the depth 1695ffd83dbSDimitry Andric // that is passed down to the target specific GISelKnownBits object is 1705ffd83dbSDimitry Andric // already bigger than its max depth. 1715ffd83dbSDimitry Andric if (Depth >= getMaxDepth()) 1728bcb0991SDimitry Andric return; 1738bcb0991SDimitry Andric 1748bcb0991SDimitry Andric if (!DemandedElts) 1758bcb0991SDimitry Andric return; // No demanded elts, better to assume we don't know anything. 1768bcb0991SDimitry Andric 1778bcb0991SDimitry Andric KnownBits Known2; 1788bcb0991SDimitry Andric 1798bcb0991SDimitry Andric switch (Opcode) { 1808bcb0991SDimitry Andric default: 1818bcb0991SDimitry Andric TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI, 1828bcb0991SDimitry Andric Depth); 1838bcb0991SDimitry Andric break; 184fe6060f1SDimitry Andric case TargetOpcode::G_BUILD_VECTOR: { 185fe6060f1SDimitry Andric // Collect the known bits that are shared by every demanded vector element. 186fe6060f1SDimitry Andric Known.Zero.setAllBits(); Known.One.setAllBits(); 187fe6060f1SDimitry Andric for (unsigned i = 0, e = MI.getNumOperands() - 1; i < e; ++i) { 188fe6060f1SDimitry Andric if (!DemandedElts[i]) 189fe6060f1SDimitry Andric continue; 190fe6060f1SDimitry Andric 191fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedElts, 192fe6060f1SDimitry Andric Depth + 1); 193fe6060f1SDimitry Andric 194fe6060f1SDimitry Andric // Known bits are the values that are shared by every demanded element. 195fe6060f1SDimitry Andric Known = KnownBits::commonBits(Known, Known2); 196fe6060f1SDimitry Andric 197fe6060f1SDimitry Andric // If we don't know any bits, early out. 198fe6060f1SDimitry Andric if (Known.isUnknown()) 199fe6060f1SDimitry Andric break; 200fe6060f1SDimitry Andric } 201fe6060f1SDimitry Andric break; 202fe6060f1SDimitry Andric } 2035ffd83dbSDimitry Andric case TargetOpcode::COPY: 2045ffd83dbSDimitry Andric case TargetOpcode::G_PHI: 2055ffd83dbSDimitry Andric case TargetOpcode::PHI: { 206349cc55cSDimitry Andric Known.One = APInt::getAllOnes(BitWidth); 207349cc55cSDimitry Andric Known.Zero = APInt::getAllOnes(BitWidth); 2085ffd83dbSDimitry Andric // Destination registers should not have subregisters at this 2095ffd83dbSDimitry Andric // point of the pipeline, otherwise the main live-range will be 2105ffd83dbSDimitry Andric // defined more than once, which is against SSA. 2115ffd83dbSDimitry Andric assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?"); 2125ffd83dbSDimitry Andric // Record in the cache that we know nothing for MI. 2135ffd83dbSDimitry Andric // This will get updated later and in the meantime, if we reach that 2145ffd83dbSDimitry Andric // phi again, because of a loop, we will cut the search thanks to this 2155ffd83dbSDimitry Andric // cache entry. 2165ffd83dbSDimitry Andric // We could actually build up more information on the phi by not cutting 2175ffd83dbSDimitry Andric // the search, but that additional information is more a side effect 2185ffd83dbSDimitry Andric // than an intended choice. 2195ffd83dbSDimitry Andric // Therefore, for now, save on compile time until we derive a proper way 2205ffd83dbSDimitry Andric // to derive known bits for PHIs within loops. 2215ffd83dbSDimitry Andric ComputeKnownBitsCache[R] = KnownBits(BitWidth); 2225ffd83dbSDimitry Andric // PHI's operand are a mix of registers and basic blocks interleaved. 2235ffd83dbSDimitry Andric // We only care about the register ones. 2245ffd83dbSDimitry Andric for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) { 2255ffd83dbSDimitry Andric const MachineOperand &Src = MI.getOperand(Idx); 2265ffd83dbSDimitry Andric Register SrcReg = Src.getReg(); 2275ffd83dbSDimitry Andric // Look through trivial copies and phis but don't look through trivial 2285ffd83dbSDimitry Andric // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits 2295ffd83dbSDimitry Andric // analysis is currently unable to determine the bit width of a 2305ffd83dbSDimitry Andric // register class. 2318bcb0991SDimitry Andric // 2328bcb0991SDimitry Andric // We can't use NoSubRegister by name as it's defined by each target but 2338bcb0991SDimitry Andric // it's always defined to be 0 by tablegen. 2345ffd83dbSDimitry Andric if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ && 2355ffd83dbSDimitry Andric MRI.getType(SrcReg).isValid()) { 2365ffd83dbSDimitry Andric // For COPYs we don't do anything, don't increase the depth. 2375ffd83dbSDimitry Andric computeKnownBitsImpl(SrcReg, Known2, DemandedElts, 2385ffd83dbSDimitry Andric Depth + (Opcode != TargetOpcode::COPY)); 239e8d8bef9SDimitry Andric Known = KnownBits::commonBits(Known, Known2); 2405ffd83dbSDimitry Andric // If we reach a point where we don't know anything 2415ffd83dbSDimitry Andric // just stop looking through the operands. 2425ffd83dbSDimitry Andric if (Known.One == 0 && Known.Zero == 0) 2435ffd83dbSDimitry Andric break; 2445ffd83dbSDimitry Andric } else { 2455ffd83dbSDimitry Andric // We know nothing. 2465ffd83dbSDimitry Andric Known = KnownBits(BitWidth); 2475ffd83dbSDimitry Andric break; 2485ffd83dbSDimitry Andric } 2498bcb0991SDimitry Andric } 2508bcb0991SDimitry Andric break; 2518bcb0991SDimitry Andric } 2528bcb0991SDimitry Andric case TargetOpcode::G_CONSTANT: { 253349cc55cSDimitry Andric auto CstVal = getIConstantVRegVal(R, MRI); 2548bcb0991SDimitry Andric if (!CstVal) 2558bcb0991SDimitry Andric break; 256e8d8bef9SDimitry Andric Known = KnownBits::makeConstant(*CstVal); 2578bcb0991SDimitry Andric break; 2588bcb0991SDimitry Andric } 2598bcb0991SDimitry Andric case TargetOpcode::G_FRAME_INDEX: { 2605ffd83dbSDimitry Andric int FrameIdx = MI.getOperand(1).getIndex(); 2615ffd83dbSDimitry Andric TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF); 2628bcb0991SDimitry Andric break; 2638bcb0991SDimitry Andric } 2648bcb0991SDimitry Andric case TargetOpcode::G_SUB: { 2655ffd83dbSDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 2668bcb0991SDimitry Andric Depth + 1); 2678bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 2688bcb0991SDimitry Andric Depth + 1); 2695ffd83dbSDimitry Andric Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known, 2705ffd83dbSDimitry Andric Known2); 2718bcb0991SDimitry Andric break; 2728bcb0991SDimitry Andric } 2738bcb0991SDimitry Andric case TargetOpcode::G_XOR: { 2748bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 2758bcb0991SDimitry Andric Depth + 1); 2768bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 2778bcb0991SDimitry Andric Depth + 1); 2788bcb0991SDimitry Andric 2795ffd83dbSDimitry Andric Known ^= Known2; 2808bcb0991SDimitry Andric break; 2818bcb0991SDimitry Andric } 282480093f4SDimitry Andric case TargetOpcode::G_PTR_ADD: { 283fe6060f1SDimitry Andric if (DstTy.isVector()) 284fe6060f1SDimitry Andric break; 285480093f4SDimitry Andric // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets? 2868bcb0991SDimitry Andric LLT Ty = MRI.getType(MI.getOperand(1).getReg()); 2878bcb0991SDimitry Andric if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace())) 2888bcb0991SDimitry Andric break; 2898bcb0991SDimitry Andric LLVM_FALLTHROUGH; 2908bcb0991SDimitry Andric } 2918bcb0991SDimitry Andric case TargetOpcode::G_ADD: { 2925ffd83dbSDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 2938bcb0991SDimitry Andric Depth + 1); 2948bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 2958bcb0991SDimitry Andric Depth + 1); 2965ffd83dbSDimitry Andric Known = 2975ffd83dbSDimitry Andric KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2); 2988bcb0991SDimitry Andric break; 2998bcb0991SDimitry Andric } 3008bcb0991SDimitry Andric case TargetOpcode::G_AND: { 3018bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 3028bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 3038bcb0991SDimitry Andric Depth + 1); 3048bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 3058bcb0991SDimitry Andric Depth + 1); 3068bcb0991SDimitry Andric 3075ffd83dbSDimitry Andric Known &= Known2; 3088bcb0991SDimitry Andric break; 3098bcb0991SDimitry Andric } 3108bcb0991SDimitry Andric case TargetOpcode::G_OR: { 3118bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 3128bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 3138bcb0991SDimitry Andric Depth + 1); 3148bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 3158bcb0991SDimitry Andric Depth + 1); 3168bcb0991SDimitry Andric 3175ffd83dbSDimitry Andric Known |= Known2; 3188bcb0991SDimitry Andric break; 3198bcb0991SDimitry Andric } 3208bcb0991SDimitry Andric case TargetOpcode::G_MUL: { 3218bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 3228bcb0991SDimitry Andric Depth + 1); 3238bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 3248bcb0991SDimitry Andric Depth + 1); 325fe6060f1SDimitry Andric Known = KnownBits::mul(Known, Known2); 3268bcb0991SDimitry Andric break; 3278bcb0991SDimitry Andric } 3288bcb0991SDimitry Andric case TargetOpcode::G_SELECT: { 329e8d8bef9SDimitry Andric computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(), 330e8d8bef9SDimitry Andric Known, DemandedElts, Depth + 1); 3318bcb0991SDimitry Andric break; 332e8d8bef9SDimitry Andric } 333e8d8bef9SDimitry Andric case TargetOpcode::G_SMIN: { 334e8d8bef9SDimitry Andric // TODO: Handle clamp pattern with number of sign bits 335e8d8bef9SDimitry Andric KnownBits KnownRHS; 336e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 3378bcb0991SDimitry Andric Depth + 1); 338e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 339e8d8bef9SDimitry Andric Depth + 1); 340e8d8bef9SDimitry Andric Known = KnownBits::smin(Known, KnownRHS); 341e8d8bef9SDimitry Andric break; 342e8d8bef9SDimitry Andric } 343e8d8bef9SDimitry Andric case TargetOpcode::G_SMAX: { 344e8d8bef9SDimitry Andric // TODO: Handle clamp pattern with number of sign bits 345e8d8bef9SDimitry Andric KnownBits KnownRHS; 346e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 347e8d8bef9SDimitry Andric Depth + 1); 348e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 349e8d8bef9SDimitry Andric Depth + 1); 350e8d8bef9SDimitry Andric Known = KnownBits::smax(Known, KnownRHS); 351e8d8bef9SDimitry Andric break; 352e8d8bef9SDimitry Andric } 353e8d8bef9SDimitry Andric case TargetOpcode::G_UMIN: { 354e8d8bef9SDimitry Andric KnownBits KnownRHS; 355e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 356e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 357e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 358e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 359e8d8bef9SDimitry Andric Known = KnownBits::umin(Known, KnownRHS); 360e8d8bef9SDimitry Andric break; 361e8d8bef9SDimitry Andric } 362e8d8bef9SDimitry Andric case TargetOpcode::G_UMAX: { 363e8d8bef9SDimitry Andric KnownBits KnownRHS; 364e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 365e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 366e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 367e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 368e8d8bef9SDimitry Andric Known = KnownBits::umax(Known, KnownRHS); 3698bcb0991SDimitry Andric break; 3708bcb0991SDimitry Andric } 3718bcb0991SDimitry Andric case TargetOpcode::G_FCMP: 3728bcb0991SDimitry Andric case TargetOpcode::G_ICMP: { 373fe6060f1SDimitry Andric if (DstTy.isVector()) 374fe6060f1SDimitry Andric break; 3758bcb0991SDimitry Andric if (TL.getBooleanContents(DstTy.isVector(), 3768bcb0991SDimitry Andric Opcode == TargetOpcode::G_FCMP) == 3778bcb0991SDimitry Andric TargetLowering::ZeroOrOneBooleanContent && 3788bcb0991SDimitry Andric BitWidth > 1) 3798bcb0991SDimitry Andric Known.Zero.setBitsFrom(1); 3808bcb0991SDimitry Andric break; 3818bcb0991SDimitry Andric } 3828bcb0991SDimitry Andric case TargetOpcode::G_SEXT: { 3838bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 3848bcb0991SDimitry Andric Depth + 1); 3858bcb0991SDimitry Andric // If the sign bit is known to be zero or one, then sext will extend 3868bcb0991SDimitry Andric // it to the top bits, else it will just zext. 3878bcb0991SDimitry Andric Known = Known.sext(BitWidth); 3888bcb0991SDimitry Andric break; 3898bcb0991SDimitry Andric } 390fe6060f1SDimitry Andric case TargetOpcode::G_ASSERT_SEXT: 391e8d8bef9SDimitry Andric case TargetOpcode::G_SEXT_INREG: { 392e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 393e8d8bef9SDimitry Andric Depth + 1); 394e8d8bef9SDimitry Andric Known = Known.sextInReg(MI.getOperand(2).getImm()); 395e8d8bef9SDimitry Andric break; 396e8d8bef9SDimitry Andric } 3978bcb0991SDimitry Andric case TargetOpcode::G_ANYEXT: { 3988bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 3998bcb0991SDimitry Andric Depth + 1); 400e8d8bef9SDimitry Andric Known = Known.anyext(BitWidth); 4018bcb0991SDimitry Andric break; 4028bcb0991SDimitry Andric } 4038bcb0991SDimitry Andric case TargetOpcode::G_LOAD: { 4048bcb0991SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 4058bcb0991SDimitry Andric if (const MDNode *Ranges = MMO->getRanges()) { 4068bcb0991SDimitry Andric computeKnownBitsFromRangeMetadata(*Ranges, Known); 4078bcb0991SDimitry Andric } 408e8d8bef9SDimitry Andric 4098bcb0991SDimitry Andric break; 4108bcb0991SDimitry Andric } 4118bcb0991SDimitry Andric case TargetOpcode::G_ZEXTLOAD: { 412fe6060f1SDimitry Andric if (DstTy.isVector()) 413fe6060f1SDimitry Andric break; 4148bcb0991SDimitry Andric // Everything above the retrieved bits is zero 4158bcb0991SDimitry Andric Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits()); 4168bcb0991SDimitry Andric break; 4178bcb0991SDimitry Andric } 418e8d8bef9SDimitry Andric case TargetOpcode::G_ASHR: { 419e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 420e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 421e8d8bef9SDimitry Andric Depth + 1); 4228bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 4238bcb0991SDimitry Andric Depth + 1); 424e8d8bef9SDimitry Andric Known = KnownBits::ashr(LHSKnown, RHSKnown); 4258bcb0991SDimitry Andric break; 4268bcb0991SDimitry Andric } 427e8d8bef9SDimitry Andric case TargetOpcode::G_LSHR: { 428e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 429e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 4308bcb0991SDimitry Andric Depth + 1); 431e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 432e8d8bef9SDimitry Andric Depth + 1); 433e8d8bef9SDimitry Andric Known = KnownBits::lshr(LHSKnown, RHSKnown); 4348bcb0991SDimitry Andric break; 4358bcb0991SDimitry Andric } 436e8d8bef9SDimitry Andric case TargetOpcode::G_SHL: { 437e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 438e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 439e8d8bef9SDimitry Andric Depth + 1); 440e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 441e8d8bef9SDimitry Andric Depth + 1); 442e8d8bef9SDimitry Andric Known = KnownBits::shl(LHSKnown, RHSKnown); 4438bcb0991SDimitry Andric break; 4448bcb0991SDimitry Andric } 4458bcb0991SDimitry Andric case TargetOpcode::G_INTTOPTR: 4468bcb0991SDimitry Andric case TargetOpcode::G_PTRTOINT: 447fe6060f1SDimitry Andric if (DstTy.isVector()) 448fe6060f1SDimitry Andric break; 4498bcb0991SDimitry Andric // Fall through and handle them the same as zext/trunc. 4508bcb0991SDimitry Andric LLVM_FALLTHROUGH; 451fe6060f1SDimitry Andric case TargetOpcode::G_ASSERT_ZEXT: 4528bcb0991SDimitry Andric case TargetOpcode::G_ZEXT: 4538bcb0991SDimitry Andric case TargetOpcode::G_TRUNC: { 4548bcb0991SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 4558bcb0991SDimitry Andric LLT SrcTy = MRI.getType(SrcReg); 456fe6060f1SDimitry Andric unsigned SrcBitWidth; 457fe6060f1SDimitry Andric 458fe6060f1SDimitry Andric // G_ASSERT_ZEXT stores the original bitwidth in the immediate operand. 459fe6060f1SDimitry Andric if (Opcode == TargetOpcode::G_ASSERT_ZEXT) 460fe6060f1SDimitry Andric SrcBitWidth = MI.getOperand(2).getImm(); 461fe6060f1SDimitry Andric else { 462fe6060f1SDimitry Andric SrcBitWidth = SrcTy.isPointer() 4638bcb0991SDimitry Andric ? DL.getIndexSizeInBits(SrcTy.getAddressSpace()) 4648bcb0991SDimitry Andric : SrcTy.getSizeInBits(); 465fe6060f1SDimitry Andric } 4668bcb0991SDimitry Andric assert(SrcBitWidth && "SrcBitWidth can't be zero"); 4675ffd83dbSDimitry Andric Known = Known.zextOrTrunc(SrcBitWidth); 4688bcb0991SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 4695ffd83dbSDimitry Andric Known = Known.zextOrTrunc(BitWidth); 4708bcb0991SDimitry Andric if (BitWidth > SrcBitWidth) 4718bcb0991SDimitry Andric Known.Zero.setBitsFrom(SrcBitWidth); 4728bcb0991SDimitry Andric break; 4738bcb0991SDimitry Andric } 47404eeddc0SDimitry Andric case TargetOpcode::G_ASSERT_ALIGN: { 47504eeddc0SDimitry Andric int64_t LogOfAlign = MI.getOperand(2).getImm(); 47604eeddc0SDimitry Andric if (LogOfAlign == 0) 47704eeddc0SDimitry Andric break; 47804eeddc0SDimitry Andric 47904eeddc0SDimitry Andric // TODO: Should use maximum with source 48004eeddc0SDimitry Andric // If a node is guaranteed to be aligned, set low zero bits accordingly as 48104eeddc0SDimitry Andric // well as clearing one bits. 48204eeddc0SDimitry Andric Known.Zero.setLowBits(LogOfAlign); 48304eeddc0SDimitry Andric Known.One.clearLowBits(LogOfAlign); 48404eeddc0SDimitry Andric break; 48504eeddc0SDimitry Andric } 486e8d8bef9SDimitry Andric case TargetOpcode::G_MERGE_VALUES: { 487e8d8bef9SDimitry Andric unsigned NumOps = MI.getNumOperands(); 488e8d8bef9SDimitry Andric unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 489e8d8bef9SDimitry Andric 490e8d8bef9SDimitry Andric for (unsigned I = 0; I != NumOps - 1; ++I) { 491e8d8bef9SDimitry Andric KnownBits SrcOpKnown; 492e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown, 493e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 494e8d8bef9SDimitry Andric Known.insertBits(SrcOpKnown, I * OpSize); 495e8d8bef9SDimitry Andric } 496e8d8bef9SDimitry Andric break; 497e8d8bef9SDimitry Andric } 498e8d8bef9SDimitry Andric case TargetOpcode::G_UNMERGE_VALUES: { 499fe6060f1SDimitry Andric if (DstTy.isVector()) 500fe6060f1SDimitry Andric break; 501e8d8bef9SDimitry Andric unsigned NumOps = MI.getNumOperands(); 502e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(NumOps - 1).getReg(); 503e8d8bef9SDimitry Andric if (MRI.getType(SrcReg).isVector()) 504e8d8bef9SDimitry Andric return; // TODO: Handle vectors. 505e8d8bef9SDimitry Andric 506e8d8bef9SDimitry Andric KnownBits SrcOpKnown; 507e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1); 508e8d8bef9SDimitry Andric 509e8d8bef9SDimitry Andric // Figure out the result operand index 510e8d8bef9SDimitry Andric unsigned DstIdx = 0; 511e8d8bef9SDimitry Andric for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R; 512e8d8bef9SDimitry Andric ++DstIdx) 513e8d8bef9SDimitry Andric ; 514e8d8bef9SDimitry Andric 515e8d8bef9SDimitry Andric Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx); 516e8d8bef9SDimitry Andric break; 517e8d8bef9SDimitry Andric } 518e8d8bef9SDimitry Andric case TargetOpcode::G_BSWAP: { 519e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 520e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 521fe6060f1SDimitry Andric Known = Known.byteSwap(); 522e8d8bef9SDimitry Andric break; 523e8d8bef9SDimitry Andric } 524e8d8bef9SDimitry Andric case TargetOpcode::G_BITREVERSE: { 525e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 526e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 527fe6060f1SDimitry Andric Known = Known.reverseBits(); 528fe6060f1SDimitry Andric break; 529fe6060f1SDimitry Andric } 530349cc55cSDimitry Andric case TargetOpcode::G_CTPOP: { 531349cc55cSDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 532349cc55cSDimitry Andric Depth + 1); 533349cc55cSDimitry Andric // We can bound the space the count needs. Also, bits known to be zero can't 534349cc55cSDimitry Andric // contribute to the population. 535349cc55cSDimitry Andric unsigned BitsPossiblySet = Known2.countMaxPopulation(); 536349cc55cSDimitry Andric unsigned LowBits = Log2_32(BitsPossiblySet)+1; 537349cc55cSDimitry Andric Known.Zero.setBitsFrom(LowBits); 538349cc55cSDimitry Andric // TODO: we could bound Known.One using the lower bound on the number of 539349cc55cSDimitry Andric // bits which might be set provided by popcnt KnownOne2. 540349cc55cSDimitry Andric break; 541349cc55cSDimitry Andric } 542fe6060f1SDimitry Andric case TargetOpcode::G_UBFX: { 543fe6060f1SDimitry Andric KnownBits SrcOpKnown, OffsetKnown, WidthKnown; 544fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts, 545fe6060f1SDimitry Andric Depth + 1); 546fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts, 547fe6060f1SDimitry Andric Depth + 1); 548fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts, 549fe6060f1SDimitry Andric Depth + 1); 550fe6060f1SDimitry Andric Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown); 551fe6060f1SDimitry Andric break; 552fe6060f1SDimitry Andric } 553fe6060f1SDimitry Andric case TargetOpcode::G_SBFX: { 554fe6060f1SDimitry Andric KnownBits SrcOpKnown, OffsetKnown, WidthKnown; 555fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts, 556fe6060f1SDimitry Andric Depth + 1); 557fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts, 558fe6060f1SDimitry Andric Depth + 1); 559fe6060f1SDimitry Andric computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts, 560fe6060f1SDimitry Andric Depth + 1); 561fe6060f1SDimitry Andric Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown); 562fe6060f1SDimitry Andric // Sign extend the extracted value using shift left and arithmetic shift 563fe6060f1SDimitry Andric // right. 564fe6060f1SDimitry Andric KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth)); 565fe6060f1SDimitry Andric KnownBits ShiftKnown = KnownBits::computeForAddSub( 566fe6060f1SDimitry Andric /*Add*/ false, /*NSW*/ false, ExtKnown, WidthKnown); 567fe6060f1SDimitry Andric Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown); 568e8d8bef9SDimitry Andric break; 569e8d8bef9SDimitry Andric } 570*81ad6265SDimitry Andric case TargetOpcode::G_UADDO: 571*81ad6265SDimitry Andric case TargetOpcode::G_UADDE: 572*81ad6265SDimitry Andric case TargetOpcode::G_SADDO: 573*81ad6265SDimitry Andric case TargetOpcode::G_SADDE: 574*81ad6265SDimitry Andric case TargetOpcode::G_USUBO: 575*81ad6265SDimitry Andric case TargetOpcode::G_USUBE: 576*81ad6265SDimitry Andric case TargetOpcode::G_SSUBO: 577*81ad6265SDimitry Andric case TargetOpcode::G_SSUBE: 578*81ad6265SDimitry Andric case TargetOpcode::G_UMULO: 579*81ad6265SDimitry Andric case TargetOpcode::G_SMULO: { 580*81ad6265SDimitry Andric if (MI.getOperand(1).getReg() == R) { 581*81ad6265SDimitry Andric // If we know the result of a compare has the top bits zero, use this 582*81ad6265SDimitry Andric // info. 583*81ad6265SDimitry Andric if (TL.getBooleanContents(DstTy.isVector(), false) == 584*81ad6265SDimitry Andric TargetLowering::ZeroOrOneBooleanContent && 585*81ad6265SDimitry Andric BitWidth > 1) 586*81ad6265SDimitry Andric Known.Zero.setBitsFrom(1); 587*81ad6265SDimitry Andric } 588*81ad6265SDimitry Andric break; 589*81ad6265SDimitry Andric } 5908bcb0991SDimitry Andric } 5918bcb0991SDimitry Andric 5928bcb0991SDimitry Andric assert(!Known.hasConflict() && "Bits known to be one AND zero?"); 5935ffd83dbSDimitry Andric LLVM_DEBUG(dumpResult(MI, Known, Depth)); 5945ffd83dbSDimitry Andric 5955ffd83dbSDimitry Andric // Update the cache. 5965ffd83dbSDimitry Andric ComputeKnownBitsCache[R] = Known; 5978bcb0991SDimitry Andric } 5988bcb0991SDimitry Andric 599e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1 600e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1, 601e8d8bef9SDimitry Andric const APInt &DemandedElts, 602e8d8bef9SDimitry Andric unsigned Depth) { 603e8d8bef9SDimitry Andric // Test src1 first, since we canonicalize simpler expressions to the RHS. 604e8d8bef9SDimitry Andric unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth); 605e8d8bef9SDimitry Andric if (Src1SignBits == 1) 606e8d8bef9SDimitry Andric return 1; 607e8d8bef9SDimitry Andric return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits); 608e8d8bef9SDimitry Andric } 609e8d8bef9SDimitry Andric 610480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, 611480093f4SDimitry Andric const APInt &DemandedElts, 612480093f4SDimitry Andric unsigned Depth) { 613480093f4SDimitry Andric MachineInstr &MI = *MRI.getVRegDef(R); 614480093f4SDimitry Andric unsigned Opcode = MI.getOpcode(); 615480093f4SDimitry Andric 616480093f4SDimitry Andric if (Opcode == TargetOpcode::G_CONSTANT) 617480093f4SDimitry Andric return MI.getOperand(1).getCImm()->getValue().getNumSignBits(); 618480093f4SDimitry Andric 619480093f4SDimitry Andric if (Depth == getMaxDepth()) 620480093f4SDimitry Andric return 1; 621480093f4SDimitry Andric 622480093f4SDimitry Andric if (!DemandedElts) 623480093f4SDimitry Andric return 1; // No demanded elts, better to assume we don't know anything. 624480093f4SDimitry Andric 625480093f4SDimitry Andric LLT DstTy = MRI.getType(R); 6265ffd83dbSDimitry Andric const unsigned TyBits = DstTy.getScalarSizeInBits(); 627480093f4SDimitry Andric 628480093f4SDimitry Andric // Handle the case where this is called on a register that does not have a 629480093f4SDimitry Andric // type constraint. This is unlikely to occur except by looking through copies 630480093f4SDimitry Andric // but it is possible for the initial register being queried to be in this 631480093f4SDimitry Andric // state. 632480093f4SDimitry Andric if (!DstTy.isValid()) 633480093f4SDimitry Andric return 1; 634480093f4SDimitry Andric 6355ffd83dbSDimitry Andric unsigned FirstAnswer = 1; 636480093f4SDimitry Andric switch (Opcode) { 637480093f4SDimitry Andric case TargetOpcode::COPY: { 638480093f4SDimitry Andric MachineOperand &Src = MI.getOperand(1); 639480093f4SDimitry Andric if (Src.getReg().isVirtual() && Src.getSubReg() == 0 && 640480093f4SDimitry Andric MRI.getType(Src.getReg()).isValid()) { 641480093f4SDimitry Andric // Don't increment Depth for this one since we didn't do any work. 642480093f4SDimitry Andric return computeNumSignBits(Src.getReg(), DemandedElts, Depth); 643480093f4SDimitry Andric } 644480093f4SDimitry Andric 645480093f4SDimitry Andric return 1; 646480093f4SDimitry Andric } 647480093f4SDimitry Andric case TargetOpcode::G_SEXT: { 648480093f4SDimitry Andric Register Src = MI.getOperand(1).getReg(); 649480093f4SDimitry Andric LLT SrcTy = MRI.getType(Src); 650480093f4SDimitry Andric unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits(); 651480093f4SDimitry Andric return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp; 652480093f4SDimitry Andric } 653fe6060f1SDimitry Andric case TargetOpcode::G_ASSERT_SEXT: 654e8d8bef9SDimitry Andric case TargetOpcode::G_SEXT_INREG: { 655e8d8bef9SDimitry Andric // Max of the input and what this extends. 656e8d8bef9SDimitry Andric Register Src = MI.getOperand(1).getReg(); 657e8d8bef9SDimitry Andric unsigned SrcBits = MI.getOperand(2).getImm(); 658e8d8bef9SDimitry Andric unsigned InRegBits = TyBits - SrcBits + 1; 659e8d8bef9SDimitry Andric return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits); 660e8d8bef9SDimitry Andric } 6615ffd83dbSDimitry Andric case TargetOpcode::G_SEXTLOAD: { 662e8d8bef9SDimitry Andric // FIXME: We need an in-memory type representation. 663e8d8bef9SDimitry Andric if (DstTy.isVector()) 664e8d8bef9SDimitry Andric return 1; 665e8d8bef9SDimitry Andric 666e8d8bef9SDimitry Andric // e.g. i16->i32 = '17' bits known. 667e8d8bef9SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 668e8d8bef9SDimitry Andric return TyBits - MMO->getSizeInBits() + 1; 669e8d8bef9SDimitry Andric } 670e8d8bef9SDimitry Andric case TargetOpcode::G_ZEXTLOAD: { 671e8d8bef9SDimitry Andric // FIXME: We need an in-memory type representation. 672e8d8bef9SDimitry Andric if (DstTy.isVector()) 673e8d8bef9SDimitry Andric return 1; 674e8d8bef9SDimitry Andric 675e8d8bef9SDimitry Andric // e.g. i16->i32 = '16' bits known. 676e8d8bef9SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 677e8d8bef9SDimitry Andric return TyBits - MMO->getSizeInBits(); 6785ffd83dbSDimitry Andric } 679480093f4SDimitry Andric case TargetOpcode::G_TRUNC: { 680480093f4SDimitry Andric Register Src = MI.getOperand(1).getReg(); 681480093f4SDimitry Andric LLT SrcTy = MRI.getType(Src); 682480093f4SDimitry Andric 683480093f4SDimitry Andric // Check if the sign bits of source go down as far as the truncated value. 684480093f4SDimitry Andric unsigned DstTyBits = DstTy.getScalarSizeInBits(); 685480093f4SDimitry Andric unsigned NumSrcBits = SrcTy.getScalarSizeInBits(); 686480093f4SDimitry Andric unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1); 687480093f4SDimitry Andric if (NumSrcSignBits > (NumSrcBits - DstTyBits)) 688480093f4SDimitry Andric return NumSrcSignBits - (NumSrcBits - DstTyBits); 689480093f4SDimitry Andric break; 690480093f4SDimitry Andric } 691e8d8bef9SDimitry Andric case TargetOpcode::G_SELECT: { 692e8d8bef9SDimitry Andric return computeNumSignBitsMin(MI.getOperand(2).getReg(), 693e8d8bef9SDimitry Andric MI.getOperand(3).getReg(), DemandedElts, 694e8d8bef9SDimitry Andric Depth + 1); 695e8d8bef9SDimitry Andric } 696*81ad6265SDimitry Andric case TargetOpcode::G_SADDO: 697*81ad6265SDimitry Andric case TargetOpcode::G_SADDE: 698*81ad6265SDimitry Andric case TargetOpcode::G_UADDO: 699*81ad6265SDimitry Andric case TargetOpcode::G_UADDE: 700*81ad6265SDimitry Andric case TargetOpcode::G_SSUBO: 701*81ad6265SDimitry Andric case TargetOpcode::G_SSUBE: 702*81ad6265SDimitry Andric case TargetOpcode::G_USUBO: 703*81ad6265SDimitry Andric case TargetOpcode::G_USUBE: 704*81ad6265SDimitry Andric case TargetOpcode::G_SMULO: 705*81ad6265SDimitry Andric case TargetOpcode::G_UMULO: { 706*81ad6265SDimitry Andric // If compares returns 0/-1, all bits are sign bits. 707*81ad6265SDimitry Andric // We know that we have an integer-based boolean since these operations 708*81ad6265SDimitry Andric // are only available for integer. 709*81ad6265SDimitry Andric if (MI.getOperand(1).getReg() == R) { 710*81ad6265SDimitry Andric if (TL.getBooleanContents(DstTy.isVector(), false) == 711*81ad6265SDimitry Andric TargetLowering::ZeroOrNegativeOneBooleanContent) 712*81ad6265SDimitry Andric return TyBits; 713*81ad6265SDimitry Andric } 714*81ad6265SDimitry Andric 715*81ad6265SDimitry Andric break; 716*81ad6265SDimitry Andric } 7175ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC: 7185ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 7195ffd83dbSDimitry Andric default: { 7205ffd83dbSDimitry Andric unsigned NumBits = 7215ffd83dbSDimitry Andric TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth); 7225ffd83dbSDimitry Andric if (NumBits > 1) 7235ffd83dbSDimitry Andric FirstAnswer = std::max(FirstAnswer, NumBits); 724480093f4SDimitry Andric break; 725480093f4SDimitry Andric } 7265ffd83dbSDimitry Andric } 727480093f4SDimitry Andric 7285ffd83dbSDimitry Andric // Finally, if we can prove that the top bits of the result are 0's or 1's, 7295ffd83dbSDimitry Andric // use this information. 7305ffd83dbSDimitry Andric KnownBits Known = getKnownBits(R, DemandedElts, Depth); 7315ffd83dbSDimitry Andric APInt Mask; 7325ffd83dbSDimitry Andric if (Known.isNonNegative()) { // sign bit is 0 7335ffd83dbSDimitry Andric Mask = Known.Zero; 7345ffd83dbSDimitry Andric } else if (Known.isNegative()) { // sign bit is 1; 7355ffd83dbSDimitry Andric Mask = Known.One; 7365ffd83dbSDimitry Andric } else { 7375ffd83dbSDimitry Andric // Nothing known. 7385ffd83dbSDimitry Andric return FirstAnswer; 7395ffd83dbSDimitry Andric } 7405ffd83dbSDimitry Andric 7415ffd83dbSDimitry Andric // Okay, we know that the sign bit in Mask is set. Use CLO to determine 7425ffd83dbSDimitry Andric // the number of identical bits in the top of the input value. 7435ffd83dbSDimitry Andric Mask <<= Mask.getBitWidth() - TyBits; 7445ffd83dbSDimitry Andric return std::max(FirstAnswer, Mask.countLeadingOnes()); 745480093f4SDimitry Andric } 746480093f4SDimitry Andric 747480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) { 748480093f4SDimitry Andric LLT Ty = MRI.getType(R); 749349cc55cSDimitry Andric APInt DemandedElts = 750349cc55cSDimitry Andric Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1); 751480093f4SDimitry Andric return computeNumSignBits(R, DemandedElts, Depth); 752480093f4SDimitry Andric } 753480093f4SDimitry Andric 7548bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 7558bcb0991SDimitry Andric AU.setPreservesAll(); 7568bcb0991SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 7578bcb0991SDimitry Andric } 7588bcb0991SDimitry Andric 7598bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) { 7608bcb0991SDimitry Andric return false; 7618bcb0991SDimitry Andric } 762