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