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