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