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" 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" 208bcb0991SDimitry Andric 218bcb0991SDimitry Andric #define DEBUG_TYPE "gisel-known-bits" 228bcb0991SDimitry Andric 238bcb0991SDimitry Andric using namespace llvm; 248bcb0991SDimitry Andric 258bcb0991SDimitry Andric char llvm::GISelKnownBitsAnalysis::ID = 0; 268bcb0991SDimitry Andric 275ffd83dbSDimitry Andric INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE, 288bcb0991SDimitry Andric "Analysis for ComputingKnownBits", false, true) 298bcb0991SDimitry Andric 305ffd83dbSDimitry Andric GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth) 318bcb0991SDimitry Andric : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()), 325ffd83dbSDimitry Andric DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {} 338bcb0991SDimitry Andric 345ffd83dbSDimitry Andric Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) { 355ffd83dbSDimitry Andric const MachineInstr *MI = MRI.getVRegDef(R); 365ffd83dbSDimitry Andric switch (MI->getOpcode()) { 375ffd83dbSDimitry Andric case TargetOpcode::COPY: 385ffd83dbSDimitry Andric return computeKnownAlignment(MI->getOperand(1).getReg(), Depth); 395ffd83dbSDimitry Andric case TargetOpcode::G_FRAME_INDEX: { 405ffd83dbSDimitry Andric int FrameIdx = MI->getOperand(1).getIndex(); 415ffd83dbSDimitry Andric return MF.getFrameInfo().getObjectAlign(FrameIdx); 428bcb0991SDimitry Andric } 435ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC: 445ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 455ffd83dbSDimitry Andric default: 465ffd83dbSDimitry Andric return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1); 478bcb0991SDimitry Andric } 488bcb0991SDimitry Andric } 498bcb0991SDimitry Andric 508bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) { 515ffd83dbSDimitry Andric assert(MI.getNumExplicitDefs() == 1 && 525ffd83dbSDimitry Andric "expected single return generic instruction"); 538bcb0991SDimitry Andric return getKnownBits(MI.getOperand(0).getReg()); 548bcb0991SDimitry Andric } 558bcb0991SDimitry Andric 568bcb0991SDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R) { 575ffd83dbSDimitry Andric const LLT Ty = MRI.getType(R); 588bcb0991SDimitry Andric APInt DemandedElts = 598bcb0991SDimitry Andric Ty.isVector() ? APInt::getAllOnesValue(Ty.getNumElements()) : APInt(1, 1); 605ffd83dbSDimitry Andric return getKnownBits(R, DemandedElts); 615ffd83dbSDimitry Andric } 625ffd83dbSDimitry Andric 635ffd83dbSDimitry Andric KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts, 645ffd83dbSDimitry Andric unsigned Depth) { 655ffd83dbSDimitry Andric // For now, we only maintain the cache during one request. 665ffd83dbSDimitry Andric assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared"); 675ffd83dbSDimitry Andric 685ffd83dbSDimitry Andric KnownBits Known; 698bcb0991SDimitry Andric computeKnownBitsImpl(R, Known, DemandedElts); 705ffd83dbSDimitry Andric ComputeKnownBitsCache.clear(); 718bcb0991SDimitry Andric return Known; 728bcb0991SDimitry Andric } 738bcb0991SDimitry Andric 748bcb0991SDimitry Andric bool GISelKnownBits::signBitIsZero(Register R) { 758bcb0991SDimitry Andric LLT Ty = MRI.getType(R); 768bcb0991SDimitry Andric unsigned BitWidth = Ty.getScalarSizeInBits(); 778bcb0991SDimitry Andric return maskedValueIsZero(R, APInt::getSignMask(BitWidth)); 788bcb0991SDimitry Andric } 798bcb0991SDimitry Andric 808bcb0991SDimitry Andric APInt GISelKnownBits::getKnownZeroes(Register R) { 818bcb0991SDimitry Andric return getKnownBits(R).Zero; 828bcb0991SDimitry Andric } 838bcb0991SDimitry Andric 848bcb0991SDimitry Andric APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; } 858bcb0991SDimitry Andric 865ffd83dbSDimitry Andric LLVM_ATTRIBUTE_UNUSED static void 875ffd83dbSDimitry Andric dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) { 885ffd83dbSDimitry Andric dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth 895ffd83dbSDimitry Andric << "] Computed for: " << MI << "[" << Depth << "] Known: 0x" 905ffd83dbSDimitry Andric << (Known.Zero | Known.One).toString(16, false) << "\n" 915ffd83dbSDimitry Andric << "[" << Depth << "] Zero: 0x" << Known.Zero.toString(16, false) 925ffd83dbSDimitry Andric << "\n" 935ffd83dbSDimitry Andric << "[" << Depth << "] One: 0x" << Known.One.toString(16, false) 945ffd83dbSDimitry Andric << "\n"; 955ffd83dbSDimitry Andric } 965ffd83dbSDimitry Andric 97*e8d8bef9SDimitry Andric /// Compute known bits for the intersection of \p Src0 and \p Src1 98*e8d8bef9SDimitry Andric void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1, 99*e8d8bef9SDimitry Andric KnownBits &Known, 100*e8d8bef9SDimitry Andric const APInt &DemandedElts, 101*e8d8bef9SDimitry Andric unsigned Depth) { 102*e8d8bef9SDimitry Andric // Test src1 first, since we canonicalize simpler expressions to the RHS. 103*e8d8bef9SDimitry Andric computeKnownBitsImpl(Src1, Known, DemandedElts, Depth); 104*e8d8bef9SDimitry Andric 105*e8d8bef9SDimitry Andric // If we don't know any bits, early out. 106*e8d8bef9SDimitry Andric if (Known.isUnknown()) 107*e8d8bef9SDimitry Andric return; 108*e8d8bef9SDimitry Andric 109*e8d8bef9SDimitry Andric KnownBits Known2; 110*e8d8bef9SDimitry Andric computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth); 111*e8d8bef9SDimitry Andric 112*e8d8bef9SDimitry Andric // Only known if known in both the LHS and RHS. 113*e8d8bef9SDimitry Andric Known = KnownBits::commonBits(Known, Known2); 114*e8d8bef9SDimitry Andric } 115*e8d8bef9SDimitry Andric 1168bcb0991SDimitry Andric void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known, 1178bcb0991SDimitry Andric const APInt &DemandedElts, 1188bcb0991SDimitry Andric unsigned Depth) { 1198bcb0991SDimitry Andric MachineInstr &MI = *MRI.getVRegDef(R); 1208bcb0991SDimitry Andric unsigned Opcode = MI.getOpcode(); 1218bcb0991SDimitry Andric LLT DstTy = MRI.getType(R); 1228bcb0991SDimitry Andric 1238bcb0991SDimitry Andric // Handle the case where this is called on a register that does not have a 1248bcb0991SDimitry Andric // type constraint (i.e. it has a register class constraint instead). This is 1258bcb0991SDimitry Andric // unlikely to occur except by looking through copies but it is possible for 1268bcb0991SDimitry Andric // the initial register being queried to be in this state. 1278bcb0991SDimitry Andric if (!DstTy.isValid()) { 1288bcb0991SDimitry Andric Known = KnownBits(); 1298bcb0991SDimitry Andric return; 1308bcb0991SDimitry Andric } 1318bcb0991SDimitry Andric 1328bcb0991SDimitry Andric unsigned BitWidth = DstTy.getSizeInBits(); 1335ffd83dbSDimitry Andric auto CacheEntry = ComputeKnownBitsCache.find(R); 1345ffd83dbSDimitry Andric if (CacheEntry != ComputeKnownBitsCache.end()) { 1355ffd83dbSDimitry Andric Known = CacheEntry->second; 1365ffd83dbSDimitry Andric LLVM_DEBUG(dbgs() << "Cache hit at "); 1375ffd83dbSDimitry Andric LLVM_DEBUG(dumpResult(MI, Known, Depth)); 1385ffd83dbSDimitry Andric assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match"); 1395ffd83dbSDimitry Andric return; 1405ffd83dbSDimitry Andric } 1418bcb0991SDimitry Andric Known = KnownBits(BitWidth); // Don't know anything 1428bcb0991SDimitry Andric 1438bcb0991SDimitry Andric if (DstTy.isVector()) 1448bcb0991SDimitry Andric return; // TODO: Handle vectors. 1458bcb0991SDimitry Andric 1465ffd83dbSDimitry Andric // Depth may get bigger than max depth if it gets passed to a different 1475ffd83dbSDimitry Andric // GISelKnownBits object. 1485ffd83dbSDimitry Andric // This may happen when say a generic part uses a GISelKnownBits object 1495ffd83dbSDimitry Andric // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr 1505ffd83dbSDimitry Andric // which creates a new GISelKnownBits object with a different and smaller 1515ffd83dbSDimitry Andric // depth. If we just check for equality, we would never exit if the depth 1525ffd83dbSDimitry Andric // that is passed down to the target specific GISelKnownBits object is 1535ffd83dbSDimitry Andric // already bigger than its max depth. 1545ffd83dbSDimitry Andric if (Depth >= getMaxDepth()) 1558bcb0991SDimitry Andric return; 1568bcb0991SDimitry Andric 1578bcb0991SDimitry Andric if (!DemandedElts) 1588bcb0991SDimitry Andric return; // No demanded elts, better to assume we don't know anything. 1598bcb0991SDimitry Andric 1608bcb0991SDimitry Andric KnownBits Known2; 1618bcb0991SDimitry Andric 1628bcb0991SDimitry Andric switch (Opcode) { 1638bcb0991SDimitry Andric default: 1648bcb0991SDimitry Andric TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI, 1658bcb0991SDimitry Andric Depth); 1668bcb0991SDimitry Andric break; 1675ffd83dbSDimitry Andric case TargetOpcode::COPY: 1685ffd83dbSDimitry Andric case TargetOpcode::G_PHI: 1695ffd83dbSDimitry Andric case TargetOpcode::PHI: { 1705ffd83dbSDimitry Andric Known.One = APInt::getAllOnesValue(BitWidth); 1715ffd83dbSDimitry Andric Known.Zero = APInt::getAllOnesValue(BitWidth); 1725ffd83dbSDimitry Andric // Destination registers should not have subregisters at this 1735ffd83dbSDimitry Andric // point of the pipeline, otherwise the main live-range will be 1745ffd83dbSDimitry Andric // defined more than once, which is against SSA. 1755ffd83dbSDimitry Andric assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?"); 1765ffd83dbSDimitry Andric // Record in the cache that we know nothing for MI. 1775ffd83dbSDimitry Andric // This will get updated later and in the meantime, if we reach that 1785ffd83dbSDimitry Andric // phi again, because of a loop, we will cut the search thanks to this 1795ffd83dbSDimitry Andric // cache entry. 1805ffd83dbSDimitry Andric // We could actually build up more information on the phi by not cutting 1815ffd83dbSDimitry Andric // the search, but that additional information is more a side effect 1825ffd83dbSDimitry Andric // than an intended choice. 1835ffd83dbSDimitry Andric // Therefore, for now, save on compile time until we derive a proper way 1845ffd83dbSDimitry Andric // to derive known bits for PHIs within loops. 1855ffd83dbSDimitry Andric ComputeKnownBitsCache[R] = KnownBits(BitWidth); 1865ffd83dbSDimitry Andric // PHI's operand are a mix of registers and basic blocks interleaved. 1875ffd83dbSDimitry Andric // We only care about the register ones. 1885ffd83dbSDimitry Andric for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) { 1895ffd83dbSDimitry Andric const MachineOperand &Src = MI.getOperand(Idx); 1905ffd83dbSDimitry Andric Register SrcReg = Src.getReg(); 1915ffd83dbSDimitry Andric // Look through trivial copies and phis but don't look through trivial 1925ffd83dbSDimitry Andric // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits 1935ffd83dbSDimitry Andric // analysis is currently unable to determine the bit width of a 1945ffd83dbSDimitry Andric // register class. 1958bcb0991SDimitry Andric // 1968bcb0991SDimitry Andric // We can't use NoSubRegister by name as it's defined by each target but 1978bcb0991SDimitry Andric // it's always defined to be 0 by tablegen. 1985ffd83dbSDimitry Andric if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ && 1995ffd83dbSDimitry Andric MRI.getType(SrcReg).isValid()) { 2005ffd83dbSDimitry Andric // For COPYs we don't do anything, don't increase the depth. 2015ffd83dbSDimitry Andric computeKnownBitsImpl(SrcReg, Known2, DemandedElts, 2025ffd83dbSDimitry Andric Depth + (Opcode != TargetOpcode::COPY)); 203*e8d8bef9SDimitry Andric Known = KnownBits::commonBits(Known, Known2); 2045ffd83dbSDimitry Andric // If we reach a point where we don't know anything 2055ffd83dbSDimitry Andric // just stop looking through the operands. 2065ffd83dbSDimitry Andric if (Known.One == 0 && Known.Zero == 0) 2075ffd83dbSDimitry Andric break; 2085ffd83dbSDimitry Andric } else { 2095ffd83dbSDimitry Andric // We know nothing. 2105ffd83dbSDimitry Andric Known = KnownBits(BitWidth); 2115ffd83dbSDimitry Andric break; 2125ffd83dbSDimitry Andric } 2138bcb0991SDimitry Andric } 2148bcb0991SDimitry Andric break; 2158bcb0991SDimitry Andric } 2168bcb0991SDimitry Andric case TargetOpcode::G_CONSTANT: { 2178bcb0991SDimitry Andric auto CstVal = getConstantVRegVal(R, MRI); 2188bcb0991SDimitry Andric if (!CstVal) 2198bcb0991SDimitry Andric break; 220*e8d8bef9SDimitry Andric Known = KnownBits::makeConstant(*CstVal); 2218bcb0991SDimitry Andric break; 2228bcb0991SDimitry Andric } 2238bcb0991SDimitry Andric case TargetOpcode::G_FRAME_INDEX: { 2245ffd83dbSDimitry Andric int FrameIdx = MI.getOperand(1).getIndex(); 2255ffd83dbSDimitry Andric TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF); 2268bcb0991SDimitry Andric break; 2278bcb0991SDimitry Andric } 2288bcb0991SDimitry Andric case TargetOpcode::G_SUB: { 2295ffd83dbSDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 2308bcb0991SDimitry Andric Depth + 1); 2318bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 2328bcb0991SDimitry Andric Depth + 1); 2335ffd83dbSDimitry Andric Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known, 2345ffd83dbSDimitry Andric Known2); 2358bcb0991SDimitry Andric break; 2368bcb0991SDimitry Andric } 2378bcb0991SDimitry Andric case TargetOpcode::G_XOR: { 2388bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 2398bcb0991SDimitry Andric Depth + 1); 2408bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 2418bcb0991SDimitry Andric Depth + 1); 2428bcb0991SDimitry Andric 2435ffd83dbSDimitry Andric Known ^= Known2; 2448bcb0991SDimitry Andric break; 2458bcb0991SDimitry Andric } 246480093f4SDimitry Andric case TargetOpcode::G_PTR_ADD: { 247480093f4SDimitry Andric // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets? 2488bcb0991SDimitry Andric LLT Ty = MRI.getType(MI.getOperand(1).getReg()); 2498bcb0991SDimitry Andric if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace())) 2508bcb0991SDimitry Andric break; 2518bcb0991SDimitry Andric LLVM_FALLTHROUGH; 2528bcb0991SDimitry Andric } 2538bcb0991SDimitry Andric case TargetOpcode::G_ADD: { 2545ffd83dbSDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 2558bcb0991SDimitry Andric Depth + 1); 2568bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 2578bcb0991SDimitry Andric Depth + 1); 2585ffd83dbSDimitry Andric Known = 2595ffd83dbSDimitry Andric KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2); 2608bcb0991SDimitry Andric break; 2618bcb0991SDimitry Andric } 2628bcb0991SDimitry Andric case TargetOpcode::G_AND: { 2638bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 2648bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 2658bcb0991SDimitry Andric Depth + 1); 2668bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 2678bcb0991SDimitry Andric Depth + 1); 2688bcb0991SDimitry Andric 2695ffd83dbSDimitry Andric Known &= Known2; 2708bcb0991SDimitry Andric break; 2718bcb0991SDimitry Andric } 2728bcb0991SDimitry Andric case TargetOpcode::G_OR: { 2738bcb0991SDimitry Andric // If either the LHS or the RHS are Zero, the result is zero. 2748bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 2758bcb0991SDimitry Andric Depth + 1); 2768bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 2778bcb0991SDimitry Andric Depth + 1); 2788bcb0991SDimitry Andric 2795ffd83dbSDimitry Andric Known |= Known2; 2808bcb0991SDimitry Andric break; 2818bcb0991SDimitry Andric } 2828bcb0991SDimitry Andric case TargetOpcode::G_MUL: { 2838bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 2848bcb0991SDimitry Andric Depth + 1); 2858bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 2868bcb0991SDimitry Andric Depth + 1); 287*e8d8bef9SDimitry Andric Known = KnownBits::computeForMul(Known, Known2); 2888bcb0991SDimitry Andric break; 2898bcb0991SDimitry Andric } 2908bcb0991SDimitry Andric case TargetOpcode::G_SELECT: { 291*e8d8bef9SDimitry Andric computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(), 292*e8d8bef9SDimitry Andric Known, DemandedElts, Depth + 1); 2938bcb0991SDimitry Andric break; 294*e8d8bef9SDimitry Andric } 295*e8d8bef9SDimitry Andric case TargetOpcode::G_SMIN: { 296*e8d8bef9SDimitry Andric // TODO: Handle clamp pattern with number of sign bits 297*e8d8bef9SDimitry Andric KnownBits KnownRHS; 298*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 2998bcb0991SDimitry Andric Depth + 1); 300*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 301*e8d8bef9SDimitry Andric Depth + 1); 302*e8d8bef9SDimitry Andric Known = KnownBits::smin(Known, KnownRHS); 303*e8d8bef9SDimitry Andric break; 304*e8d8bef9SDimitry Andric } 305*e8d8bef9SDimitry Andric case TargetOpcode::G_SMAX: { 306*e8d8bef9SDimitry Andric // TODO: Handle clamp pattern with number of sign bits 307*e8d8bef9SDimitry Andric KnownBits KnownRHS; 308*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 309*e8d8bef9SDimitry Andric Depth + 1); 310*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 311*e8d8bef9SDimitry Andric Depth + 1); 312*e8d8bef9SDimitry Andric Known = KnownBits::smax(Known, KnownRHS); 313*e8d8bef9SDimitry Andric break; 314*e8d8bef9SDimitry Andric } 315*e8d8bef9SDimitry Andric case TargetOpcode::G_UMIN: { 316*e8d8bef9SDimitry Andric KnownBits KnownRHS; 317*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 318*e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 319*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 320*e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 321*e8d8bef9SDimitry Andric Known = KnownBits::umin(Known, KnownRHS); 322*e8d8bef9SDimitry Andric break; 323*e8d8bef9SDimitry Andric } 324*e8d8bef9SDimitry Andric case TargetOpcode::G_UMAX: { 325*e8d8bef9SDimitry Andric KnownBits KnownRHS; 326*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 327*e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 328*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 329*e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 330*e8d8bef9SDimitry Andric Known = KnownBits::umax(Known, KnownRHS); 3318bcb0991SDimitry Andric break; 3328bcb0991SDimitry Andric } 3338bcb0991SDimitry Andric case TargetOpcode::G_FCMP: 3348bcb0991SDimitry Andric case TargetOpcode::G_ICMP: { 3358bcb0991SDimitry Andric if (TL.getBooleanContents(DstTy.isVector(), 3368bcb0991SDimitry Andric Opcode == TargetOpcode::G_FCMP) == 3378bcb0991SDimitry Andric TargetLowering::ZeroOrOneBooleanContent && 3388bcb0991SDimitry Andric BitWidth > 1) 3398bcb0991SDimitry Andric Known.Zero.setBitsFrom(1); 3408bcb0991SDimitry Andric break; 3418bcb0991SDimitry Andric } 3428bcb0991SDimitry Andric case TargetOpcode::G_SEXT: { 3438bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 3448bcb0991SDimitry Andric Depth + 1); 3458bcb0991SDimitry Andric // If the sign bit is known to be zero or one, then sext will extend 3468bcb0991SDimitry Andric // it to the top bits, else it will just zext. 3478bcb0991SDimitry Andric Known = Known.sext(BitWidth); 3488bcb0991SDimitry Andric break; 3498bcb0991SDimitry Andric } 350*e8d8bef9SDimitry Andric case TargetOpcode::G_SEXT_INREG: { 351*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 352*e8d8bef9SDimitry Andric Depth + 1); 353*e8d8bef9SDimitry Andric Known = Known.sextInReg(MI.getOperand(2).getImm()); 354*e8d8bef9SDimitry Andric break; 355*e8d8bef9SDimitry Andric } 3568bcb0991SDimitry Andric case TargetOpcode::G_ANYEXT: { 3578bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 3588bcb0991SDimitry Andric Depth + 1); 359*e8d8bef9SDimitry Andric Known = Known.anyext(BitWidth); 3608bcb0991SDimitry Andric break; 3618bcb0991SDimitry Andric } 3628bcb0991SDimitry Andric case TargetOpcode::G_LOAD: { 3638bcb0991SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 3648bcb0991SDimitry Andric if (const MDNode *Ranges = MMO->getRanges()) { 3658bcb0991SDimitry Andric computeKnownBitsFromRangeMetadata(*Ranges, Known); 3668bcb0991SDimitry Andric } 367*e8d8bef9SDimitry Andric 3688bcb0991SDimitry Andric break; 3698bcb0991SDimitry Andric } 3708bcb0991SDimitry Andric case TargetOpcode::G_ZEXTLOAD: { 3718bcb0991SDimitry Andric // Everything above the retrieved bits is zero 3728bcb0991SDimitry Andric Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits()); 3738bcb0991SDimitry Andric break; 3748bcb0991SDimitry Andric } 375*e8d8bef9SDimitry Andric case TargetOpcode::G_ASHR: { 376*e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 377*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 378*e8d8bef9SDimitry Andric Depth + 1); 3798bcb0991SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 3808bcb0991SDimitry Andric Depth + 1); 381*e8d8bef9SDimitry Andric Known = KnownBits::ashr(LHSKnown, RHSKnown); 3828bcb0991SDimitry Andric break; 3838bcb0991SDimitry Andric } 384*e8d8bef9SDimitry Andric case TargetOpcode::G_LSHR: { 385*e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 386*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 3878bcb0991SDimitry Andric Depth + 1); 388*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 389*e8d8bef9SDimitry Andric Depth + 1); 390*e8d8bef9SDimitry Andric Known = KnownBits::lshr(LHSKnown, RHSKnown); 3918bcb0991SDimitry Andric break; 3928bcb0991SDimitry Andric } 393*e8d8bef9SDimitry Andric case TargetOpcode::G_SHL: { 394*e8d8bef9SDimitry Andric KnownBits LHSKnown, RHSKnown; 395*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 396*e8d8bef9SDimitry Andric Depth + 1); 397*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 398*e8d8bef9SDimitry Andric Depth + 1); 399*e8d8bef9SDimitry Andric Known = KnownBits::shl(LHSKnown, RHSKnown); 4008bcb0991SDimitry Andric break; 4018bcb0991SDimitry Andric } 4028bcb0991SDimitry Andric case TargetOpcode::G_INTTOPTR: 4038bcb0991SDimitry Andric case TargetOpcode::G_PTRTOINT: 4048bcb0991SDimitry Andric // Fall through and handle them the same as zext/trunc. 4058bcb0991SDimitry Andric LLVM_FALLTHROUGH; 4068bcb0991SDimitry Andric case TargetOpcode::G_ZEXT: 4078bcb0991SDimitry Andric case TargetOpcode::G_TRUNC: { 4088bcb0991SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 4098bcb0991SDimitry Andric LLT SrcTy = MRI.getType(SrcReg); 4108bcb0991SDimitry Andric unsigned SrcBitWidth = SrcTy.isPointer() 4118bcb0991SDimitry Andric ? DL.getIndexSizeInBits(SrcTy.getAddressSpace()) 4128bcb0991SDimitry Andric : SrcTy.getSizeInBits(); 4138bcb0991SDimitry Andric assert(SrcBitWidth && "SrcBitWidth can't be zero"); 4145ffd83dbSDimitry Andric Known = Known.zextOrTrunc(SrcBitWidth); 4158bcb0991SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 4165ffd83dbSDimitry Andric Known = Known.zextOrTrunc(BitWidth); 4178bcb0991SDimitry Andric if (BitWidth > SrcBitWidth) 4188bcb0991SDimitry Andric Known.Zero.setBitsFrom(SrcBitWidth); 4198bcb0991SDimitry Andric break; 4208bcb0991SDimitry Andric } 421*e8d8bef9SDimitry Andric case TargetOpcode::G_MERGE_VALUES: { 422*e8d8bef9SDimitry Andric unsigned NumOps = MI.getNumOperands(); 423*e8d8bef9SDimitry Andric unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 424*e8d8bef9SDimitry Andric 425*e8d8bef9SDimitry Andric for (unsigned I = 0; I != NumOps - 1; ++I) { 426*e8d8bef9SDimitry Andric KnownBits SrcOpKnown; 427*e8d8bef9SDimitry Andric computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown, 428*e8d8bef9SDimitry Andric DemandedElts, Depth + 1); 429*e8d8bef9SDimitry Andric Known.insertBits(SrcOpKnown, I * OpSize); 430*e8d8bef9SDimitry Andric } 431*e8d8bef9SDimitry Andric break; 432*e8d8bef9SDimitry Andric } 433*e8d8bef9SDimitry Andric case TargetOpcode::G_UNMERGE_VALUES: { 434*e8d8bef9SDimitry Andric unsigned NumOps = MI.getNumOperands(); 435*e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(NumOps - 1).getReg(); 436*e8d8bef9SDimitry Andric if (MRI.getType(SrcReg).isVector()) 437*e8d8bef9SDimitry Andric return; // TODO: Handle vectors. 438*e8d8bef9SDimitry Andric 439*e8d8bef9SDimitry Andric KnownBits SrcOpKnown; 440*e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1); 441*e8d8bef9SDimitry Andric 442*e8d8bef9SDimitry Andric // Figure out the result operand index 443*e8d8bef9SDimitry Andric unsigned DstIdx = 0; 444*e8d8bef9SDimitry Andric for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R; 445*e8d8bef9SDimitry Andric ++DstIdx) 446*e8d8bef9SDimitry Andric ; 447*e8d8bef9SDimitry Andric 448*e8d8bef9SDimitry Andric Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx); 449*e8d8bef9SDimitry Andric break; 450*e8d8bef9SDimitry Andric } 451*e8d8bef9SDimitry Andric case TargetOpcode::G_BSWAP: { 452*e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 453*e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 454*e8d8bef9SDimitry Andric Known.byteSwap(); 455*e8d8bef9SDimitry Andric break; 456*e8d8bef9SDimitry Andric } 457*e8d8bef9SDimitry Andric case TargetOpcode::G_BITREVERSE: { 458*e8d8bef9SDimitry Andric Register SrcReg = MI.getOperand(1).getReg(); 459*e8d8bef9SDimitry Andric computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 460*e8d8bef9SDimitry Andric Known.reverseBits(); 461*e8d8bef9SDimitry Andric break; 462*e8d8bef9SDimitry Andric } 4638bcb0991SDimitry Andric } 4648bcb0991SDimitry Andric 4658bcb0991SDimitry Andric assert(!Known.hasConflict() && "Bits known to be one AND zero?"); 4665ffd83dbSDimitry Andric LLVM_DEBUG(dumpResult(MI, Known, Depth)); 4675ffd83dbSDimitry Andric 4685ffd83dbSDimitry Andric // Update the cache. 4695ffd83dbSDimitry Andric ComputeKnownBitsCache[R] = Known; 4708bcb0991SDimitry Andric } 4718bcb0991SDimitry Andric 472*e8d8bef9SDimitry Andric /// Compute number of sign bits for the intersection of \p Src0 and \p Src1 473*e8d8bef9SDimitry Andric unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1, 474*e8d8bef9SDimitry Andric const APInt &DemandedElts, 475*e8d8bef9SDimitry Andric unsigned Depth) { 476*e8d8bef9SDimitry Andric // Test src1 first, since we canonicalize simpler expressions to the RHS. 477*e8d8bef9SDimitry Andric unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth); 478*e8d8bef9SDimitry Andric if (Src1SignBits == 1) 479*e8d8bef9SDimitry Andric return 1; 480*e8d8bef9SDimitry Andric return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits); 481*e8d8bef9SDimitry Andric } 482*e8d8bef9SDimitry Andric 483480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, 484480093f4SDimitry Andric const APInt &DemandedElts, 485480093f4SDimitry Andric unsigned Depth) { 486480093f4SDimitry Andric MachineInstr &MI = *MRI.getVRegDef(R); 487480093f4SDimitry Andric unsigned Opcode = MI.getOpcode(); 488480093f4SDimitry Andric 489480093f4SDimitry Andric if (Opcode == TargetOpcode::G_CONSTANT) 490480093f4SDimitry Andric return MI.getOperand(1).getCImm()->getValue().getNumSignBits(); 491480093f4SDimitry Andric 492480093f4SDimitry Andric if (Depth == getMaxDepth()) 493480093f4SDimitry Andric return 1; 494480093f4SDimitry Andric 495480093f4SDimitry Andric if (!DemandedElts) 496480093f4SDimitry Andric return 1; // No demanded elts, better to assume we don't know anything. 497480093f4SDimitry Andric 498480093f4SDimitry Andric LLT DstTy = MRI.getType(R); 4995ffd83dbSDimitry Andric const unsigned TyBits = DstTy.getScalarSizeInBits(); 500480093f4SDimitry Andric 501480093f4SDimitry Andric // Handle the case where this is called on a register that does not have a 502480093f4SDimitry Andric // type constraint. This is unlikely to occur except by looking through copies 503480093f4SDimitry Andric // but it is possible for the initial register being queried to be in this 504480093f4SDimitry Andric // state. 505480093f4SDimitry Andric if (!DstTy.isValid()) 506480093f4SDimitry Andric return 1; 507480093f4SDimitry Andric 5085ffd83dbSDimitry Andric unsigned FirstAnswer = 1; 509480093f4SDimitry Andric switch (Opcode) { 510480093f4SDimitry Andric case TargetOpcode::COPY: { 511480093f4SDimitry Andric MachineOperand &Src = MI.getOperand(1); 512480093f4SDimitry Andric if (Src.getReg().isVirtual() && Src.getSubReg() == 0 && 513480093f4SDimitry Andric MRI.getType(Src.getReg()).isValid()) { 514480093f4SDimitry Andric // Don't increment Depth for this one since we didn't do any work. 515480093f4SDimitry Andric return computeNumSignBits(Src.getReg(), DemandedElts, Depth); 516480093f4SDimitry Andric } 517480093f4SDimitry Andric 518480093f4SDimitry Andric return 1; 519480093f4SDimitry Andric } 520480093f4SDimitry Andric case TargetOpcode::G_SEXT: { 521480093f4SDimitry Andric Register Src = MI.getOperand(1).getReg(); 522480093f4SDimitry Andric LLT SrcTy = MRI.getType(Src); 523480093f4SDimitry Andric unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits(); 524480093f4SDimitry Andric return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp; 525480093f4SDimitry Andric } 526*e8d8bef9SDimitry Andric case TargetOpcode::G_SEXT_INREG: { 527*e8d8bef9SDimitry Andric // Max of the input and what this extends. 528*e8d8bef9SDimitry Andric Register Src = MI.getOperand(1).getReg(); 529*e8d8bef9SDimitry Andric unsigned SrcBits = MI.getOperand(2).getImm(); 530*e8d8bef9SDimitry Andric unsigned InRegBits = TyBits - SrcBits + 1; 531*e8d8bef9SDimitry Andric return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits); 532*e8d8bef9SDimitry Andric } 5335ffd83dbSDimitry Andric case TargetOpcode::G_SEXTLOAD: { 534*e8d8bef9SDimitry Andric // FIXME: We need an in-memory type representation. 535*e8d8bef9SDimitry Andric if (DstTy.isVector()) 536*e8d8bef9SDimitry Andric return 1; 537*e8d8bef9SDimitry Andric 538*e8d8bef9SDimitry Andric // e.g. i16->i32 = '17' bits known. 539*e8d8bef9SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 540*e8d8bef9SDimitry Andric return TyBits - MMO->getSizeInBits() + 1; 541*e8d8bef9SDimitry Andric } 542*e8d8bef9SDimitry Andric case TargetOpcode::G_ZEXTLOAD: { 543*e8d8bef9SDimitry Andric // FIXME: We need an in-memory type representation. 544*e8d8bef9SDimitry Andric if (DstTy.isVector()) 545*e8d8bef9SDimitry Andric return 1; 546*e8d8bef9SDimitry Andric 547*e8d8bef9SDimitry Andric // e.g. i16->i32 = '16' bits known. 548*e8d8bef9SDimitry Andric const MachineMemOperand *MMO = *MI.memoperands_begin(); 549*e8d8bef9SDimitry Andric return TyBits - MMO->getSizeInBits(); 5505ffd83dbSDimitry Andric } 551480093f4SDimitry Andric case TargetOpcode::G_TRUNC: { 552480093f4SDimitry Andric Register Src = MI.getOperand(1).getReg(); 553480093f4SDimitry Andric LLT SrcTy = MRI.getType(Src); 554480093f4SDimitry Andric 555480093f4SDimitry Andric // Check if the sign bits of source go down as far as the truncated value. 556480093f4SDimitry Andric unsigned DstTyBits = DstTy.getScalarSizeInBits(); 557480093f4SDimitry Andric unsigned NumSrcBits = SrcTy.getScalarSizeInBits(); 558480093f4SDimitry Andric unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1); 559480093f4SDimitry Andric if (NumSrcSignBits > (NumSrcBits - DstTyBits)) 560480093f4SDimitry Andric return NumSrcSignBits - (NumSrcBits - DstTyBits); 561480093f4SDimitry Andric break; 562480093f4SDimitry Andric } 563*e8d8bef9SDimitry Andric case TargetOpcode::G_SELECT: { 564*e8d8bef9SDimitry Andric return computeNumSignBitsMin(MI.getOperand(2).getReg(), 565*e8d8bef9SDimitry Andric MI.getOperand(3).getReg(), DemandedElts, 566*e8d8bef9SDimitry Andric Depth + 1); 567*e8d8bef9SDimitry Andric } 5685ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC: 5695ffd83dbSDimitry Andric case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 5705ffd83dbSDimitry Andric default: { 5715ffd83dbSDimitry Andric unsigned NumBits = 5725ffd83dbSDimitry Andric TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth); 5735ffd83dbSDimitry Andric if (NumBits > 1) 5745ffd83dbSDimitry Andric FirstAnswer = std::max(FirstAnswer, NumBits); 575480093f4SDimitry Andric break; 576480093f4SDimitry Andric } 5775ffd83dbSDimitry Andric } 578480093f4SDimitry Andric 5795ffd83dbSDimitry Andric // Finally, if we can prove that the top bits of the result are 0's or 1's, 5805ffd83dbSDimitry Andric // use this information. 5815ffd83dbSDimitry Andric KnownBits Known = getKnownBits(R, DemandedElts, Depth); 5825ffd83dbSDimitry Andric APInt Mask; 5835ffd83dbSDimitry Andric if (Known.isNonNegative()) { // sign bit is 0 5845ffd83dbSDimitry Andric Mask = Known.Zero; 5855ffd83dbSDimitry Andric } else if (Known.isNegative()) { // sign bit is 1; 5865ffd83dbSDimitry Andric Mask = Known.One; 5875ffd83dbSDimitry Andric } else { 5885ffd83dbSDimitry Andric // Nothing known. 5895ffd83dbSDimitry Andric return FirstAnswer; 5905ffd83dbSDimitry Andric } 5915ffd83dbSDimitry Andric 5925ffd83dbSDimitry Andric // Okay, we know that the sign bit in Mask is set. Use CLO to determine 5935ffd83dbSDimitry Andric // the number of identical bits in the top of the input value. 5945ffd83dbSDimitry Andric Mask <<= Mask.getBitWidth() - TyBits; 5955ffd83dbSDimitry Andric return std::max(FirstAnswer, Mask.countLeadingOnes()); 596480093f4SDimitry Andric } 597480093f4SDimitry Andric 598480093f4SDimitry Andric unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) { 599480093f4SDimitry Andric LLT Ty = MRI.getType(R); 600480093f4SDimitry Andric APInt DemandedElts = Ty.isVector() 601480093f4SDimitry Andric ? APInt::getAllOnesValue(Ty.getNumElements()) 602480093f4SDimitry Andric : APInt(1, 1); 603480093f4SDimitry Andric return computeNumSignBits(R, DemandedElts, Depth); 604480093f4SDimitry Andric } 605480093f4SDimitry Andric 6068bcb0991SDimitry Andric void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 6078bcb0991SDimitry Andric AU.setPreservesAll(); 6088bcb0991SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 6098bcb0991SDimitry Andric } 6108bcb0991SDimitry Andric 6118bcb0991SDimitry Andric bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) { 6128bcb0991SDimitry Andric return false; 6138bcb0991SDimitry Andric } 614