1*8bcb0991SDimitry Andric //===- lib/CodeGen/GlobalISel/GISelKnownBits.cpp --------------*- C++ *-===// 2*8bcb0991SDimitry Andric // 3*8bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*8bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*8bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*8bcb0991SDimitry Andric // 7*8bcb0991SDimitry Andric //===----------------------------------------------------------------------===// 8*8bcb0991SDimitry Andric // 9*8bcb0991SDimitry Andric /// Provides analysis for querying information about KnownBits during GISel 10*8bcb0991SDimitry Andric /// passes. 11*8bcb0991SDimitry Andric // 12*8bcb0991SDimitry Andric //===------------------ 13*8bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 14*8bcb0991SDimitry Andric #include "llvm/Analysis/ValueTracking.h" 15*8bcb0991SDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h" 16*8bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 17*8bcb0991SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 18*8bcb0991SDimitry Andric #include "llvm/CodeGen/TargetLowering.h" 19*8bcb0991SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h" 20*8bcb0991SDimitry Andric 21*8bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits" 22*8bcb0991SDimitry Andric 23*8bcb0991SDimitry Andric using namespace llvm; 24*8bcb0991SDimitry Andric 25*8bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0; 26*8bcb0991SDimitry Andric 27*8bcb0991SDimitry Andric INITIALIZE_PASS_BEGIN(GISelKnownBitsAnalysis, DEBUG_TYPE, 28*8bcb0991SDimitry Andric "Analysis for ComputingKnownBits", false, true) 29*8bcb0991SDimitry Andric INITIALIZE_PASS_END(GISelKnownBitsAnalysis, DEBUG_TYPE, 30*8bcb0991SDimitry Andric "Analysis for ComputingKnownBits", false, true) 31*8bcb0991SDimitry Andric 32*8bcb0991SDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF) 33*8bcb0991SDimitry Andric : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()), 34*8bcb0991SDimitry Andric DL(MF.getFunction().getParent()->getDataLayout()) {} 35*8bcb0991SDimitry Andric 36*8bcb0991SDimitry Andric Align GISelKnownBits::inferAlignmentForFrameIdx(int FrameIdx, int Offset, 37*8bcb0991SDimitry Andric const MachineFunction &MF) { 38*8bcb0991SDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo(); 39*8bcb0991SDimitry Andric return commonAlignment(Align(MFI.getObjectAlignment(FrameIdx)), Offset); 40*8bcb0991SDimitry Andric // TODO: How to handle cases with Base + Offset? 41*8bcb0991SDimitry Andric } 42*8bcb0991SDimitry Andric 43*8bcb0991SDimitry Andric MaybeAlign GISelKnownBits::inferPtrAlignment(const MachineInstr &MI) { 44*8bcb0991SDimitry Andric if (MI.getOpcode() == TargetOpcode::G_FRAME_INDEX) { 45*8bcb0991SDimitry Andric int FrameIdx = MI.getOperand(1).getIndex(); 46*8bcb0991SDimitry Andric return inferAlignmentForFrameIdx(FrameIdx, 0, *MI.getMF()); 47*8bcb0991SDimitry Andric } 48*8bcb0991SDimitry Andric return None; 49*8bcb0991SDimitry Andric } 50*8bcb0991SDimitry Andric 51*8bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsForFrameIndex(Register R, KnownBits &Known, 52*8bcb0991SDimitry Andric const APInt &DemandedElts, 53*8bcb0991SDimitry Andric unsigned Depth) { 54*8bcb0991SDimitry Andric const MachineInstr &MI = *MRI.getVRegDef(R); 55*8bcb0991SDimitry Andric computeKnownBitsForAlignment(Known, inferPtrAlignment(MI)); 56*8bcb0991SDimitry Andric } 57*8bcb0991SDimitry Andric 58*8bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsForAlignment(KnownBits &Known, 59*8bcb0991SDimitry Andric MaybeAlign Alignment) { 60*8bcb0991SDimitry Andric if (Alignment) 61*8bcb0991SDimitry Andric // The low bits are known zero if the pointer is aligned. 62*8bcb0991SDimitry Andric Known.Zero.setLowBits(Log2(Alignment)); 63*8bcb0991SDimitry Andric } 64*8bcb0991SDimitry Andric 65*8bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) { 66*8bcb0991SDimitry Andric return getKnownBits(MI.getOperand(0).getReg()); 67*8bcb0991SDimitry Andric } 68*8bcb0991SDimitry Andric 69*8bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) { 70*8bcb0991SDimitry Andric KnownBits Known; 71*8bcb0991SDimitry Andric LLT Ty = MRI.getType(R); 72*8bcb0991SDimitry Andric APInt DemandedElts = 73*8bcb0991SDimitry Andric Ty.isVector() ? APInt::getAllOnesValue(Ty.getNumElements()) : APInt(1, 1); 74*8bcb0991SDimitry Andric computeKnownBitsImpl(R, Known, DemandedElts); 75*8bcb0991SDimitry Andric return Known; 76*8bcb0991SDimitry Andric } 77*8bcb0991SDimitry Andric 78*8bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) { 79*8bcb0991SDimitry Andric LLT Ty = MRI.getType(R); 80*8bcb0991SDimitry Andric unsigned BitWidth = Ty.getScalarSizeInBits(); 81*8bcb0991SDimitry Andric return maskedValueIsZero(R, APInt::getSignMask(BitWidth)); 82*8bcb0991SDimitry Andric } 83*8bcb0991SDimitry Andric 84*8bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) { 85*8bcb0991SDimitry Andric return getKnownBits(R).Zero; 86*8bcb0991SDimitry Andric } 87*8bcb0991SDimitry Andric 88*8bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; } 89*8bcb0991SDimitry Andric 90*8bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known, 91*8bcb0991SDimitry Andric const APInt &DemandedElts, 92*8bcb0991SDimitry Andric unsigned Depth) { 93*8bcb0991SDimitry Andric MachineInstr &MI = *MRI.getVRegDef(R); 94*8bcb0991SDimitry Andric unsigned Opcode = MI.getOpcode(); 95*8bcb0991SDimitry Andric LLT DstTy = MRI.getType(R); 96*8bcb0991SDimitry Andric 97*8bcb0991SDimitry Andric // Handle the case where this is called on a register that does not have a 98*8bcb0991SDimitry Andric // type constraint (i.e. it has a register class constraint instead). This is 99*8bcb0991SDimitry Andric // unlikely to occur except by looking through copies but it is possible for 100*8bcb0991SDimitry Andric // the initial register being queried to be in this state. 101*8bcb0991SDimitry Andric if (!DstTy.isValid()) { 102*8bcb0991SDimitry Andric Known = KnownBits(); 103*8bcb0991SDimitry Andric return; 104*8bcb0991SDimitry Andric } 105*8bcb0991SDimitry Andric 106*8bcb0991SDimitry Andric unsigned BitWidth = DstTy.getSizeInBits(); 107*8bcb0991SDimitry Andric Known = KnownBits(BitWidth); // Don't know anything 108*8bcb0991SDimitry Andric 109*8bcb0991SDimitry Andric if (DstTy.isVector()) 110*8bcb0991SDimitry Andric return; // TODO: Handle vectors. 111*8bcb0991SDimitry Andric 112*8bcb0991SDimitry Andric if (Depth == getMaxDepth()) 113*8bcb0991SDimitry Andric return; 114*8bcb0991SDimitry Andric 115*8bcb0991SDimitry Andric if (!DemandedElts) 116*8bcb0991SDimitry Andric return; // No demanded elts, better to assume we don't know anything. 117*8bcb0991SDimitry Andric 118*8bcb0991SDimitry Andric KnownBits Known2; 119*8bcb0991SDimitry Andric 120*8bcb0991SDimitry Andric switch (Opcode) { 121*8bcb0991SDimitry Andric default: 122*8bcb0991SDimitry Andric TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI, 123*8bcb0991SDimitry Andric Depth); 124*8bcb0991SDimitry Andric break; 125*8bcb0991SDimitry Andric case TargetOpcode::COPY: { 126*8bcb0991SDimitry Andric MachineOperand Dst = MI.getOperand(0); 127*8bcb0991SDimitry Andric MachineOperand Src = MI.getOperand(1); 128*8bcb0991SDimitry Andric // Look through trivial copies but don't look through trivial copies of the 129*8bcb0991SDimitry Andric // form `%1:(s32) = OP %0:gpr32` known-bits analysis is currently unable to 130*8bcb0991SDimitry Andric // determine the bit width of a register class. 131*8bcb0991SDimitry Andric // 132*8bcb0991SDimitry Andric // We can't use NoSubRegister by name as it's defined by each target but 133*8bcb0991SDimitry Andric // it's always defined to be 0 by tablegen. 134*8bcb0991SDimitry Andric if (Dst.getSubReg() == 0 /*NoSubRegister*/ && Src.getReg().isVirtual() && 135*8bcb0991SDimitry Andric Src.getSubReg() == 0 /*NoSubRegister*/ && 136*8bcb0991SDimitry Andric MRI.getType(Src.getReg()).isValid()) { 137*8bcb0991SDimitry Andric // Don't increment Depth for this one since we didn't do any work. 138*8bcb0991SDimitry Andric computeKnownBitsImpl(Src.getReg(), Known, DemandedElts, Depth); 139*8bcb0991SDimitry Andric } 140*8bcb0991SDimitry Andric break; 141*8bcb0991SDimitry Andric } 142*8bcb0991SDimitry Andric case TargetOpcode::G_CONSTANT: { 143*8bcb0991SDimitry Andric auto CstVal = getConstantVRegVal(R, MRI); 144*8bcb0991SDimitry Andric if (!CstVal) 145*8bcb0991SDimitry Andric break; 146*8bcb0991SDimitry Andric Known.One = *CstVal; 147*8bcb0991SDimitry Andric Known.Zero = ~Known.One; 148*8bcb0991SDimitry Andric break; 149*8bcb0991SDimitry Andric } 150*8bcb0991SDimitry Andric case TargetOpcode::G_FRAME_INDEX: { 151*8bcb0991SDimitry Andric computeKnownBitsForFrameIndex(R, Known, DemandedElts); 152*8bcb0991SDimitry Andric break; 153*8bcb0991SDimitry Andric } 154*8bcb0991SDimitry Andric case TargetOpcode::G_SUB: { 155*8bcb0991SDimitry Andric // If low bits are known to be zero in both operands, then we know they are 156*8bcb0991SDimitry Andric // going to be 0 in the result. Both addition and complement operations 157*8bcb0991SDimitry Andric // preserve the low zero bits. 158*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 159*8bcb0991SDimitry Andric Depth + 1); 160*8bcb0991SDimitry Andric unsigned KnownZeroLow = Known2.countMinTrailingZeros(); 161*8bcb0991SDimitry Andric if (KnownZeroLow == 0) 162*8bcb0991SDimitry Andric break; 163*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 164*8bcb0991SDimitry Andric Depth + 1); 165*8bcb0991SDimitry Andric KnownZeroLow = std::min(KnownZeroLow, Known2.countMinTrailingZeros()); 166*8bcb0991SDimitry Andric Known.Zero.setLowBits(KnownZeroLow); 167*8bcb0991SDimitry Andric break; 168*8bcb0991SDimitry Andric } 169*8bcb0991SDimitry Andric case TargetOpcode::G_XOR: { 170*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 171*8bcb0991SDimitry Andric Depth + 1); 172*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 173*8bcb0991SDimitry Andric Depth + 1); 174*8bcb0991SDimitry Andric 175*8bcb0991SDimitry Andric // Output known-0 bits are known if clear or set in both the LHS & RHS. 176*8bcb0991SDimitry Andric APInt KnownZeroOut = (Known.Zero & Known2.Zero) | (Known.One & Known2.One); 177*8bcb0991SDimitry Andric // Output known-1 are known to be set if set in only one of the LHS, RHS. 178*8bcb0991SDimitry Andric Known.One = (Known.Zero & Known2.One) | (Known.One & Known2.Zero); 179*8bcb0991SDimitry Andric Known.Zero = KnownZeroOut; 180*8bcb0991SDimitry Andric break; 181*8bcb0991SDimitry Andric } 182*8bcb0991SDimitry Andric case TargetOpcode::G_GEP: { 183*8bcb0991SDimitry Andric // G_GEP is like G_ADD. FIXME: Is this true for all targets? 184*8bcb0991SDimitry Andric LLT Ty = MRI.getType(MI.getOperand(1).getReg()); 185*8bcb0991SDimitry Andric if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace())) 186*8bcb0991SDimitry Andric break; 187*8bcb0991SDimitry Andric LLVM_FALLTHROUGH; 188*8bcb0991SDimitry Andric } 189*8bcb0991SDimitry Andric case TargetOpcode::G_ADD: { 190*8bcb0991SDimitry Andric // Output known-0 bits are known if clear or set in both the low clear bits 191*8bcb0991SDimitry Andric // common to both LHS & RHS. For example, 8+(X<<3) is known to have the 192*8bcb0991SDimitry Andric // low 3 bits clear. 193*8bcb0991SDimitry Andric // Output known-0 bits are also known if the top bits of each input are 194*8bcb0991SDimitry Andric // known to be clear. For example, if one input has the top 10 bits clear 195*8bcb0991SDimitry Andric // and the other has the top 8 bits clear, we know the top 7 bits of the 196*8bcb0991SDimitry Andric // output must be clear. 197*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 198*8bcb0991SDimitry Andric Depth + 1); 199*8bcb0991SDimitry Andric unsigned KnownZeroHigh = Known2.countMinLeadingZeros(); 200*8bcb0991SDimitry Andric unsigned KnownZeroLow = Known2.countMinTrailingZeros(); 201*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 202*8bcb0991SDimitry Andric Depth + 1); 203*8bcb0991SDimitry Andric KnownZeroHigh = std::min(KnownZeroHigh, Known2.countMinLeadingZeros()); 204*8bcb0991SDimitry Andric KnownZeroLow = std::min(KnownZeroLow, Known2.countMinTrailingZeros()); 205*8bcb0991SDimitry Andric Known.Zero.setLowBits(KnownZeroLow); 206*8bcb0991SDimitry Andric if (KnownZeroHigh > 1) 207*8bcb0991SDimitry Andric Known.Zero.setHighBits(KnownZeroHigh - 1); 208*8bcb0991SDimitry Andric break; 209*8bcb0991SDimitry Andric } 210*8bcb0991SDimitry Andric case TargetOpcode::G_AND: { 211*8bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 212*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 213*8bcb0991SDimitry Andric Depth + 1); 214*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 215*8bcb0991SDimitry Andric Depth + 1); 216*8bcb0991SDimitry Andric 217*8bcb0991SDimitry Andric // Output known-1 bits are only known if set in both the LHS & RHS. 218*8bcb0991SDimitry Andric Known.One &= Known2.One; 219*8bcb0991SDimitry Andric // Output known-0 are known to be clear if zero in either the LHS | RHS. 220*8bcb0991SDimitry Andric Known.Zero |= Known2.Zero; 221*8bcb0991SDimitry Andric break; 222*8bcb0991SDimitry Andric } 223*8bcb0991SDimitry Andric case TargetOpcode::G_OR: { 224*8bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 225*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 226*8bcb0991SDimitry Andric Depth + 1); 227*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 228*8bcb0991SDimitry Andric Depth + 1); 229*8bcb0991SDimitry Andric 230*8bcb0991SDimitry Andric // Output known-0 bits are only known if clear in both the LHS & RHS. 231*8bcb0991SDimitry Andric Known.Zero &= Known2.Zero; 232*8bcb0991SDimitry Andric // Output known-1 are known to be set if set in either the LHS | RHS. 233*8bcb0991SDimitry Andric Known.One |= Known2.One; 234*8bcb0991SDimitry Andric break; 235*8bcb0991SDimitry Andric } 236*8bcb0991SDimitry Andric case TargetOpcode::G_MUL: { 237*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 238*8bcb0991SDimitry Andric Depth + 1); 239*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 240*8bcb0991SDimitry Andric Depth + 1); 241*8bcb0991SDimitry Andric // If low bits are zero in either operand, output low known-0 bits. 242*8bcb0991SDimitry Andric // Also compute a conservative estimate for high known-0 bits. 243*8bcb0991SDimitry Andric // More trickiness is possible, but this is sufficient for the 244*8bcb0991SDimitry Andric // interesting case of alignment computation. 245*8bcb0991SDimitry Andric unsigned TrailZ = 246*8bcb0991SDimitry Andric Known.countMinTrailingZeros() + Known2.countMinTrailingZeros(); 247*8bcb0991SDimitry Andric unsigned LeadZ = 248*8bcb0991SDimitry Andric std::max(Known.countMinLeadingZeros() + Known2.countMinLeadingZeros(), 249*8bcb0991SDimitry Andric BitWidth) - 250*8bcb0991SDimitry Andric BitWidth; 251*8bcb0991SDimitry Andric 252*8bcb0991SDimitry Andric Known.resetAll(); 253*8bcb0991SDimitry Andric Known.Zero.setLowBits(std::min(TrailZ, BitWidth)); 254*8bcb0991SDimitry Andric Known.Zero.setHighBits(std::min(LeadZ, BitWidth)); 255*8bcb0991SDimitry Andric break; 256*8bcb0991SDimitry Andric } 257*8bcb0991SDimitry Andric case TargetOpcode::G_SELECT: { 258*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(3).getReg(), Known, DemandedElts, 259*8bcb0991SDimitry Andric Depth + 1); 260*8bcb0991SDimitry Andric // If we don't know any bits, early out. 261*8bcb0991SDimitry Andric if (Known.isUnknown()) 262*8bcb0991SDimitry Andric break; 263*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 264*8bcb0991SDimitry Andric Depth + 1); 265*8bcb0991SDimitry Andric // Only known if known in both the LHS and RHS. 266*8bcb0991SDimitry Andric Known.One &= Known2.One; 267*8bcb0991SDimitry Andric Known.Zero &= Known2.Zero; 268*8bcb0991SDimitry Andric break; 269*8bcb0991SDimitry Andric } 270*8bcb0991SDimitry Andric case TargetOpcode::G_FCMP: 271*8bcb0991SDimitry Andric case TargetOpcode::G_ICMP: { 272*8bcb0991SDimitry Andric if (TL.getBooleanContents(DstTy.isVector(), 273*8bcb0991SDimitry Andric Opcode == TargetOpcode::G_FCMP) == 274*8bcb0991SDimitry Andric TargetLowering::ZeroOrOneBooleanContent && 275*8bcb0991SDimitry Andric BitWidth > 1) 276*8bcb0991SDimitry Andric Known.Zero.setBitsFrom(1); 277*8bcb0991SDimitry Andric break; 278*8bcb0991SDimitry Andric } 279*8bcb0991SDimitry Andric case TargetOpcode::G_SEXT: { 280*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 281*8bcb0991SDimitry Andric Depth + 1); 282*8bcb0991SDimitry Andric // If the sign bit is known to be zero or one, then sext will extend 283*8bcb0991SDimitry Andric // it to the top bits, else it will just zext. 284*8bcb0991SDimitry Andric Known = Known.sext(BitWidth); 285*8bcb0991SDimitry Andric break; 286*8bcb0991SDimitry Andric } 287*8bcb0991SDimitry Andric case TargetOpcode::G_ANYEXT: { 288*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 289*8bcb0991SDimitry Andric Depth + 1); 290*8bcb0991SDimitry Andric Known = Known.zext(BitWidth, true /* ExtendedBitsAreKnownZero */); 291*8bcb0991SDimitry Andric break; 292*8bcb0991SDimitry Andric } 293*8bcb0991SDimitry Andric case TargetOpcode::G_LOAD: { 294*8bcb0991SDimitry Andric if (MI.hasOneMemOperand()) { 295*8bcb0991SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 296*8bcb0991SDimitry Andric if (const MDNode *Ranges = MMO->getRanges()) { 297*8bcb0991SDimitry Andric computeKnownBitsFromRangeMetadata(*Ranges, Known); 298*8bcb0991SDimitry Andric } 299*8bcb0991SDimitry Andric } 300*8bcb0991SDimitry Andric break; 301*8bcb0991SDimitry Andric } 302*8bcb0991SDimitry Andric case TargetOpcode::G_ZEXTLOAD: { 303*8bcb0991SDimitry Andric // Everything above the retrieved bits is zero 304*8bcb0991SDimitry Andric if (MI.hasOneMemOperand()) 305*8bcb0991SDimitry Andric Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits()); 306*8bcb0991SDimitry Andric break; 307*8bcb0991SDimitry Andric } 308*8bcb0991SDimitry Andric case TargetOpcode::G_ASHR: 309*8bcb0991SDimitry Andric case TargetOpcode::G_LSHR: 310*8bcb0991SDimitry Andric case TargetOpcode::G_SHL: { 311*8bcb0991SDimitry Andric KnownBits RHSKnown; 312*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 313*8bcb0991SDimitry Andric Depth + 1); 314*8bcb0991SDimitry Andric if (!RHSKnown.isConstant()) { 315*8bcb0991SDimitry Andric LLVM_DEBUG( 316*8bcb0991SDimitry Andric MachineInstr *RHSMI = MRI.getVRegDef(MI.getOperand(2).getReg()); 317*8bcb0991SDimitry Andric dbgs() << '[' << Depth << "] Shift not known constant: " << *RHSMI); 318*8bcb0991SDimitry Andric break; 319*8bcb0991SDimitry Andric } 320*8bcb0991SDimitry Andric uint64_t Shift = RHSKnown.getConstant().getZExtValue(); 321*8bcb0991SDimitry Andric LLVM_DEBUG(dbgs() << '[' << Depth << "] Shift is " << Shift << '\n'); 322*8bcb0991SDimitry Andric 323*8bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 324*8bcb0991SDimitry Andric Depth + 1); 325*8bcb0991SDimitry Andric 326*8bcb0991SDimitry Andric switch (Opcode) { 327*8bcb0991SDimitry Andric case TargetOpcode::G_ASHR: 328*8bcb0991SDimitry Andric Known.Zero = Known.Zero.ashr(Shift); 329*8bcb0991SDimitry Andric Known.One = Known.One.ashr(Shift); 330*8bcb0991SDimitry Andric break; 331*8bcb0991SDimitry Andric case TargetOpcode::G_LSHR: 332*8bcb0991SDimitry Andric Known.Zero = Known.Zero.lshr(Shift); 333*8bcb0991SDimitry Andric Known.One = Known.One.lshr(Shift); 334*8bcb0991SDimitry Andric Known.Zero.setBitsFrom(Known.Zero.getBitWidth() - Shift); 335*8bcb0991SDimitry Andric break; 336*8bcb0991SDimitry Andric case TargetOpcode::G_SHL: 337*8bcb0991SDimitry Andric Known.Zero = Known.Zero.shl(Shift); 338*8bcb0991SDimitry Andric Known.One = Known.One.shl(Shift); 339*8bcb0991SDimitry Andric Known.Zero.setBits(0, Shift); 340*8bcb0991SDimitry Andric break; 341*8bcb0991SDimitry Andric } 342*8bcb0991SDimitry Andric break; 343*8bcb0991SDimitry Andric } 344*8bcb0991SDimitry Andric case TargetOpcode::G_INTTOPTR: 345*8bcb0991SDimitry Andric case TargetOpcode::G_PTRTOINT: 346*8bcb0991SDimitry Andric // Fall through and handle them the same as zext/trunc. 347*8bcb0991SDimitry Andric LLVM_FALLTHROUGH; 348*8bcb0991SDimitry Andric case TargetOpcode::G_ZEXT: 349*8bcb0991SDimitry Andric case TargetOpcode::G_TRUNC: { 350*8bcb0991SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 351*8bcb0991SDimitry Andric LLT SrcTy = MRI.getType(SrcReg); 352*8bcb0991SDimitry Andric unsigned SrcBitWidth = SrcTy.isPointer() 353*8bcb0991SDimitry Andric ? DL.getIndexSizeInBits(SrcTy.getAddressSpace()) 354*8bcb0991SDimitry Andric : SrcTy.getSizeInBits(); 355*8bcb0991SDimitry Andric assert(SrcBitWidth && "SrcBitWidth can't be zero"); 356*8bcb0991SDimitry Andric Known = Known.zextOrTrunc(SrcBitWidth, true); 357*8bcb0991SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 358*8bcb0991SDimitry Andric Known = Known.zextOrTrunc(BitWidth, true); 359*8bcb0991SDimitry Andric if (BitWidth > SrcBitWidth) 360*8bcb0991SDimitry Andric Known.Zero.setBitsFrom(SrcBitWidth); 361*8bcb0991SDimitry Andric break; 362*8bcb0991SDimitry Andric } 363*8bcb0991SDimitry Andric } 364*8bcb0991SDimitry Andric 365*8bcb0991SDimitry Andric assert(!Known.hasConflict() && "Bits known to be one AND zero?"); 366*8bcb0991SDimitry Andric LLVM_DEBUG(dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" 367*8bcb0991SDimitry Andric << Depth << "] Computed for: " << MI << "[" << Depth 368*8bcb0991SDimitry Andric << "] Known: 0x" 369*8bcb0991SDimitry Andric << (Known.Zero | Known.One).toString(16, false) << "\n" 370*8bcb0991SDimitry Andric << "[" << Depth << "] Zero: 0x" 371*8bcb0991SDimitry Andric << Known.Zero.toString(16, false) << "\n" 372*8bcb0991SDimitry Andric << "[" << Depth << "] One: 0x" 373*8bcb0991SDimitry Andric << Known.One.toString(16, false) << "\n"); 374*8bcb0991SDimitry Andric } 375*8bcb0991SDimitry Andric 376*8bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 377*8bcb0991SDimitry Andric AU.setPreservesAll(); 378*8bcb0991SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 379*8bcb0991SDimitry Andric } 380*8bcb0991SDimitry Andric 381*8bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) { 382*8bcb0991SDimitry Andric return false; 383*8bcb0991SDimitry Andric } 384