1 //===- lib/CodeGen/GlobalISel/GISelKnownBits.cpp --------------*- C++ *-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// Provides analysis for querying information about KnownBits during GISel 10 /// passes. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h" 14 #include "llvm/Analysis/ValueTracking.h" 15 #include "llvm/CodeGen/GlobalISel/Utils.h" 16 #include "llvm/CodeGen/MachineFrameInfo.h" 17 #include "llvm/CodeGen/MachineRegisterInfo.h" 18 #include "llvm/CodeGen/TargetLowering.h" 19 #include "llvm/CodeGen/TargetOpcodes.h" 20 #include "llvm/IR/Module.h" 21 22 #define DEBUG_TYPE "gisel-known-bits" 23 24 using namespace llvm; 25 26 char llvm::GISelKnownBitsAnalysis::ID = 0; 27 28 INITIALIZE_PASS(GISelKnownBitsAnalysis, DEBUG_TYPE, 29 "Analysis for ComputingKnownBits", false, true) 30 31 GISelKnownBits::GISelKnownBits(MachineFunction &MF, unsigned MaxDepth) 32 : MF(MF), MRI(MF.getRegInfo()), TL(*MF.getSubtarget().getTargetLowering()), 33 DL(MF.getFunction().getParent()->getDataLayout()), MaxDepth(MaxDepth) {} 34 35 Align GISelKnownBits::computeKnownAlignment(Register R, unsigned Depth) { 36 const MachineInstr *MI = MRI.getVRegDef(R); 37 switch (MI->getOpcode()) { 38 case TargetOpcode::COPY: 39 return computeKnownAlignment(MI->getOperand(1).getReg(), Depth); 40 case TargetOpcode::G_ASSERT_ALIGN: { 41 // TODO: Min with source 42 return Align(MI->getOperand(2).getImm()); 43 } 44 case TargetOpcode::G_FRAME_INDEX: { 45 int FrameIdx = MI->getOperand(1).getIndex(); 46 return MF.getFrameInfo().getObjectAlign(FrameIdx); 47 } 48 case TargetOpcode::G_INTRINSIC: 49 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 50 default: 51 return TL.computeKnownAlignForTargetInstr(*this, R, MRI, Depth + 1); 52 } 53 } 54 55 KnownBits GISelKnownBits::getKnownBits(MachineInstr &MI) { 56 assert(MI.getNumExplicitDefs() == 1 && 57 "expected single return generic instruction"); 58 return getKnownBits(MI.getOperand(0).getReg()); 59 } 60 61 KnownBits GISelKnownBits::getKnownBits(Register R) { 62 const LLT Ty = MRI.getType(R); 63 APInt DemandedElts = 64 Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1); 65 return getKnownBits(R, DemandedElts); 66 } 67 68 KnownBits GISelKnownBits::getKnownBits(Register R, const APInt &DemandedElts, 69 unsigned Depth) { 70 // For now, we only maintain the cache during one request. 71 assert(ComputeKnownBitsCache.empty() && "Cache should have been cleared"); 72 73 KnownBits Known; 74 computeKnownBitsImpl(R, Known, DemandedElts); 75 ComputeKnownBitsCache.clear(); 76 return Known; 77 } 78 79 bool GISelKnownBits::signBitIsZero(Register R) { 80 LLT Ty = MRI.getType(R); 81 unsigned BitWidth = Ty.getScalarSizeInBits(); 82 return maskedValueIsZero(R, APInt::getSignMask(BitWidth)); 83 } 84 85 APInt GISelKnownBits::getKnownZeroes(Register R) { 86 return getKnownBits(R).Zero; 87 } 88 89 APInt GISelKnownBits::getKnownOnes(Register R) { return getKnownBits(R).One; } 90 91 LLVM_ATTRIBUTE_UNUSED static void 92 dumpResult(const MachineInstr &MI, const KnownBits &Known, unsigned Depth) { 93 dbgs() << "[" << Depth << "] Compute known bits: " << MI << "[" << Depth 94 << "] Computed for: " << MI << "[" << Depth << "] Known: 0x" 95 << toString(Known.Zero | Known.One, 16, false) << "\n" 96 << "[" << Depth << "] Zero: 0x" << toString(Known.Zero, 16, false) 97 << "\n" 98 << "[" << Depth << "] One: 0x" << toString(Known.One, 16, false) 99 << "\n"; 100 } 101 102 /// Compute known bits for the intersection of \p Src0 and \p Src1 103 void GISelKnownBits::computeKnownBitsMin(Register Src0, Register Src1, 104 KnownBits &Known, 105 const APInt &DemandedElts, 106 unsigned Depth) { 107 // Test src1 first, since we canonicalize simpler expressions to the RHS. 108 computeKnownBitsImpl(Src1, Known, DemandedElts, Depth); 109 110 // If we don't know any bits, early out. 111 if (Known.isUnknown()) 112 return; 113 114 KnownBits Known2; 115 computeKnownBitsImpl(Src0, Known2, DemandedElts, Depth); 116 117 // Only known if known in both the LHS and RHS. 118 Known = KnownBits::commonBits(Known, Known2); 119 } 120 121 // Bitfield extract is computed as (Src >> Offset) & Mask, where Mask is 122 // created using Width. Use this function when the inputs are KnownBits 123 // objects. TODO: Move this KnownBits.h if this is usable in more cases. 124 static KnownBits extractBits(unsigned BitWidth, const KnownBits &SrcOpKnown, 125 const KnownBits &OffsetKnown, 126 const KnownBits &WidthKnown) { 127 KnownBits Mask(BitWidth); 128 Mask.Zero = APInt::getBitsSetFrom( 129 BitWidth, WidthKnown.getMaxValue().getLimitedValue(BitWidth)); 130 Mask.One = APInt::getLowBitsSet( 131 BitWidth, WidthKnown.getMinValue().getLimitedValue(BitWidth)); 132 return KnownBits::lshr(SrcOpKnown, OffsetKnown) & Mask; 133 } 134 135 void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known, 136 const APInt &DemandedElts, 137 unsigned Depth) { 138 MachineInstr &MI = *MRI.getVRegDef(R); 139 unsigned Opcode = MI.getOpcode(); 140 LLT DstTy = MRI.getType(R); 141 142 // Handle the case where this is called on a register that does not have a 143 // type constraint (i.e. it has a register class constraint instead). This is 144 // unlikely to occur except by looking through copies but it is possible for 145 // the initial register being queried to be in this state. 146 if (!DstTy.isValid()) { 147 Known = KnownBits(); 148 return; 149 } 150 151 unsigned BitWidth = DstTy.getScalarSizeInBits(); 152 auto CacheEntry = ComputeKnownBitsCache.find(R); 153 if (CacheEntry != ComputeKnownBitsCache.end()) { 154 Known = CacheEntry->second; 155 LLVM_DEBUG(dbgs() << "Cache hit at "); 156 LLVM_DEBUG(dumpResult(MI, Known, Depth)); 157 assert(Known.getBitWidth() == BitWidth && "Cache entry size doesn't match"); 158 return; 159 } 160 Known = KnownBits(BitWidth); // Don't know anything 161 162 // Depth may get bigger than max depth if it gets passed to a different 163 // GISelKnownBits object. 164 // This may happen when say a generic part uses a GISelKnownBits object 165 // with some max depth, but then we hit TL.computeKnownBitsForTargetInstr 166 // which creates a new GISelKnownBits object with a different and smaller 167 // depth. If we just check for equality, we would never exit if the depth 168 // that is passed down to the target specific GISelKnownBits object is 169 // already bigger than its max depth. 170 if (Depth >= getMaxDepth()) 171 return; 172 173 if (!DemandedElts) 174 return; // No demanded elts, better to assume we don't know anything. 175 176 KnownBits Known2; 177 178 switch (Opcode) { 179 default: 180 TL.computeKnownBitsForTargetInstr(*this, R, Known, DemandedElts, MRI, 181 Depth); 182 break; 183 case TargetOpcode::G_BUILD_VECTOR: { 184 // Collect the known bits that are shared by every demanded vector element. 185 Known.Zero.setAllBits(); Known.One.setAllBits(); 186 for (unsigned i = 0, e = MI.getNumOperands() - 1; i < e; ++i) { 187 if (!DemandedElts[i]) 188 continue; 189 190 computeKnownBitsImpl(MI.getOperand(i + 1).getReg(), Known2, DemandedElts, 191 Depth + 1); 192 193 // Known bits are the values that are shared by every demanded element. 194 Known = KnownBits::commonBits(Known, Known2); 195 196 // If we don't know any bits, early out. 197 if (Known.isUnknown()) 198 break; 199 } 200 break; 201 } 202 case TargetOpcode::COPY: 203 case TargetOpcode::G_PHI: 204 case TargetOpcode::PHI: { 205 Known.One = APInt::getAllOnes(BitWidth); 206 Known.Zero = APInt::getAllOnes(BitWidth); 207 // Destination registers should not have subregisters at this 208 // point of the pipeline, otherwise the main live-range will be 209 // defined more than once, which is against SSA. 210 assert(MI.getOperand(0).getSubReg() == 0 && "Is this code in SSA?"); 211 // Record in the cache that we know nothing for MI. 212 // This will get updated later and in the meantime, if we reach that 213 // phi again, because of a loop, we will cut the search thanks to this 214 // cache entry. 215 // We could actually build up more information on the phi by not cutting 216 // the search, but that additional information is more a side effect 217 // than an intended choice. 218 // Therefore, for now, save on compile time until we derive a proper way 219 // to derive known bits for PHIs within loops. 220 ComputeKnownBitsCache[R] = KnownBits(BitWidth); 221 // PHI's operand are a mix of registers and basic blocks interleaved. 222 // We only care about the register ones. 223 for (unsigned Idx = 1; Idx < MI.getNumOperands(); Idx += 2) { 224 const MachineOperand &Src = MI.getOperand(Idx); 225 Register SrcReg = Src.getReg(); 226 // Look through trivial copies and phis but don't look through trivial 227 // copies or phis of the form `%1:(s32) = OP %0:gpr32`, known-bits 228 // analysis is currently unable to determine the bit width of a 229 // register class. 230 // 231 // We can't use NoSubRegister by name as it's defined by each target but 232 // it's always defined to be 0 by tablegen. 233 if (SrcReg.isVirtual() && Src.getSubReg() == 0 /*NoSubRegister*/ && 234 MRI.getType(SrcReg).isValid()) { 235 // For COPYs we don't do anything, don't increase the depth. 236 computeKnownBitsImpl(SrcReg, Known2, DemandedElts, 237 Depth + (Opcode != TargetOpcode::COPY)); 238 Known = KnownBits::commonBits(Known, Known2); 239 // If we reach a point where we don't know anything 240 // just stop looking through the operands. 241 if (Known.One == 0 && Known.Zero == 0) 242 break; 243 } else { 244 // We know nothing. 245 Known = KnownBits(BitWidth); 246 break; 247 } 248 } 249 break; 250 } 251 case TargetOpcode::G_CONSTANT: { 252 auto CstVal = getIConstantVRegVal(R, MRI); 253 if (!CstVal) 254 break; 255 Known = KnownBits::makeConstant(*CstVal); 256 break; 257 } 258 case TargetOpcode::G_FRAME_INDEX: { 259 int FrameIdx = MI.getOperand(1).getIndex(); 260 TL.computeKnownBitsForFrameIndex(FrameIdx, Known, MF); 261 break; 262 } 263 case TargetOpcode::G_SUB: { 264 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 265 Depth + 1); 266 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 267 Depth + 1); 268 Known = KnownBits::computeForAddSub(/*Add*/ false, /*NSW*/ false, Known, 269 Known2); 270 break; 271 } 272 case TargetOpcode::G_XOR: { 273 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 274 Depth + 1); 275 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 276 Depth + 1); 277 278 Known ^= Known2; 279 break; 280 } 281 case TargetOpcode::G_PTR_ADD: { 282 if (DstTy.isVector()) 283 break; 284 // G_PTR_ADD is like G_ADD. FIXME: Is this true for all targets? 285 LLT Ty = MRI.getType(MI.getOperand(1).getReg()); 286 if (DL.isNonIntegralAddressSpace(Ty.getAddressSpace())) 287 break; 288 [[fallthrough]]; 289 } 290 case TargetOpcode::G_ADD: { 291 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 292 Depth + 1); 293 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedElts, 294 Depth + 1); 295 Known = 296 KnownBits::computeForAddSub(/*Add*/ true, /*NSW*/ false, Known, Known2); 297 break; 298 } 299 case TargetOpcode::G_AND: { 300 // If either the LHS or the RHS are Zero, the result is zero. 301 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 302 Depth + 1); 303 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 304 Depth + 1); 305 306 Known &= Known2; 307 break; 308 } 309 case TargetOpcode::G_OR: { 310 // If either the LHS or the RHS are Zero, the result is zero. 311 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 312 Depth + 1); 313 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 314 Depth + 1); 315 316 Known |= Known2; 317 break; 318 } 319 case TargetOpcode::G_MUL: { 320 computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts, 321 Depth + 1); 322 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 323 Depth + 1); 324 Known = KnownBits::mul(Known, Known2); 325 break; 326 } 327 case TargetOpcode::G_SELECT: { 328 computeKnownBitsMin(MI.getOperand(2).getReg(), MI.getOperand(3).getReg(), 329 Known, DemandedElts, Depth + 1); 330 break; 331 } 332 case TargetOpcode::G_SMIN: { 333 // TODO: Handle clamp pattern with number of sign bits 334 KnownBits KnownRHS; 335 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 336 Depth + 1); 337 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 338 Depth + 1); 339 Known = KnownBits::smin(Known, KnownRHS); 340 break; 341 } 342 case TargetOpcode::G_SMAX: { 343 // TODO: Handle clamp pattern with number of sign bits 344 KnownBits KnownRHS; 345 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 346 Depth + 1); 347 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, DemandedElts, 348 Depth + 1); 349 Known = KnownBits::smax(Known, KnownRHS); 350 break; 351 } 352 case TargetOpcode::G_UMIN: { 353 KnownBits KnownRHS; 354 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 355 DemandedElts, Depth + 1); 356 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 357 DemandedElts, Depth + 1); 358 Known = KnownBits::umin(Known, KnownRHS); 359 break; 360 } 361 case TargetOpcode::G_UMAX: { 362 KnownBits KnownRHS; 363 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, 364 DemandedElts, Depth + 1); 365 computeKnownBitsImpl(MI.getOperand(2).getReg(), KnownRHS, 366 DemandedElts, Depth + 1); 367 Known = KnownBits::umax(Known, KnownRHS); 368 break; 369 } 370 case TargetOpcode::G_FCMP: 371 case TargetOpcode::G_ICMP: { 372 if (DstTy.isVector()) 373 break; 374 if (TL.getBooleanContents(DstTy.isVector(), 375 Opcode == TargetOpcode::G_FCMP) == 376 TargetLowering::ZeroOrOneBooleanContent && 377 BitWidth > 1) 378 Known.Zero.setBitsFrom(1); 379 break; 380 } 381 case TargetOpcode::G_SEXT: { 382 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 383 Depth + 1); 384 // If the sign bit is known to be zero or one, then sext will extend 385 // it to the top bits, else it will just zext. 386 Known = Known.sext(BitWidth); 387 break; 388 } 389 case TargetOpcode::G_ASSERT_SEXT: 390 case TargetOpcode::G_SEXT_INREG: { 391 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 392 Depth + 1); 393 Known = Known.sextInReg(MI.getOperand(2).getImm()); 394 break; 395 } 396 case TargetOpcode::G_ANYEXT: { 397 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts, 398 Depth + 1); 399 Known = Known.anyext(BitWidth); 400 break; 401 } 402 case TargetOpcode::G_LOAD: { 403 const MachineMemOperand *MMO = *MI.memoperands_begin(); 404 if (const MDNode *Ranges = MMO->getRanges()) { 405 computeKnownBitsFromRangeMetadata(*Ranges, Known); 406 } 407 408 break; 409 } 410 case TargetOpcode::G_ZEXTLOAD: { 411 if (DstTy.isVector()) 412 break; 413 // Everything above the retrieved bits is zero 414 Known.Zero.setBitsFrom((*MI.memoperands_begin())->getSizeInBits()); 415 break; 416 } 417 case TargetOpcode::G_ASHR: { 418 KnownBits LHSKnown, RHSKnown; 419 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 420 Depth + 1); 421 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 422 Depth + 1); 423 Known = KnownBits::ashr(LHSKnown, RHSKnown); 424 break; 425 } 426 case TargetOpcode::G_LSHR: { 427 KnownBits LHSKnown, RHSKnown; 428 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 429 Depth + 1); 430 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 431 Depth + 1); 432 Known = KnownBits::lshr(LHSKnown, RHSKnown); 433 break; 434 } 435 case TargetOpcode::G_SHL: { 436 KnownBits LHSKnown, RHSKnown; 437 computeKnownBitsImpl(MI.getOperand(1).getReg(), LHSKnown, DemandedElts, 438 Depth + 1); 439 computeKnownBitsImpl(MI.getOperand(2).getReg(), RHSKnown, DemandedElts, 440 Depth + 1); 441 Known = KnownBits::shl(LHSKnown, RHSKnown); 442 break; 443 } 444 case TargetOpcode::G_INTTOPTR: 445 case TargetOpcode::G_PTRTOINT: 446 if (DstTy.isVector()) 447 break; 448 // Fall through and handle them the same as zext/trunc. 449 [[fallthrough]]; 450 case TargetOpcode::G_ASSERT_ZEXT: 451 case TargetOpcode::G_ZEXT: 452 case TargetOpcode::G_TRUNC: { 453 Register SrcReg = MI.getOperand(1).getReg(); 454 LLT SrcTy = MRI.getType(SrcReg); 455 unsigned SrcBitWidth; 456 457 // G_ASSERT_ZEXT stores the original bitwidth in the immediate operand. 458 if (Opcode == TargetOpcode::G_ASSERT_ZEXT) 459 SrcBitWidth = MI.getOperand(2).getImm(); 460 else { 461 SrcBitWidth = SrcTy.isPointer() 462 ? DL.getIndexSizeInBits(SrcTy.getAddressSpace()) 463 : SrcTy.getSizeInBits(); 464 } 465 assert(SrcBitWidth && "SrcBitWidth can't be zero"); 466 Known = Known.zextOrTrunc(SrcBitWidth); 467 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 468 Known = Known.zextOrTrunc(BitWidth); 469 if (BitWidth > SrcBitWidth) 470 Known.Zero.setBitsFrom(SrcBitWidth); 471 break; 472 } 473 case TargetOpcode::G_ASSERT_ALIGN: { 474 int64_t LogOfAlign = Log2_64(MI.getOperand(2).getImm()); 475 476 // TODO: Should use maximum with source 477 // If a node is guaranteed to be aligned, set low zero bits accordingly as 478 // well as clearing one bits. 479 Known.Zero.setLowBits(LogOfAlign); 480 Known.One.clearLowBits(LogOfAlign); 481 break; 482 } 483 case TargetOpcode::G_MERGE_VALUES: { 484 unsigned NumOps = MI.getNumOperands(); 485 unsigned OpSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 486 487 for (unsigned I = 0; I != NumOps - 1; ++I) { 488 KnownBits SrcOpKnown; 489 computeKnownBitsImpl(MI.getOperand(I + 1).getReg(), SrcOpKnown, 490 DemandedElts, Depth + 1); 491 Known.insertBits(SrcOpKnown, I * OpSize); 492 } 493 break; 494 } 495 case TargetOpcode::G_UNMERGE_VALUES: { 496 if (DstTy.isVector()) 497 break; 498 unsigned NumOps = MI.getNumOperands(); 499 Register SrcReg = MI.getOperand(NumOps - 1).getReg(); 500 if (MRI.getType(SrcReg).isVector()) 501 return; // TODO: Handle vectors. 502 503 KnownBits SrcOpKnown; 504 computeKnownBitsImpl(SrcReg, SrcOpKnown, DemandedElts, Depth + 1); 505 506 // Figure out the result operand index 507 unsigned DstIdx = 0; 508 for (; DstIdx != NumOps - 1 && MI.getOperand(DstIdx).getReg() != R; 509 ++DstIdx) 510 ; 511 512 Known = SrcOpKnown.extractBits(BitWidth, BitWidth * DstIdx); 513 break; 514 } 515 case TargetOpcode::G_BSWAP: { 516 Register SrcReg = MI.getOperand(1).getReg(); 517 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 518 Known = Known.byteSwap(); 519 break; 520 } 521 case TargetOpcode::G_BITREVERSE: { 522 Register SrcReg = MI.getOperand(1).getReg(); 523 computeKnownBitsImpl(SrcReg, Known, DemandedElts, Depth + 1); 524 Known = Known.reverseBits(); 525 break; 526 } 527 case TargetOpcode::G_CTPOP: { 528 computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts, 529 Depth + 1); 530 // We can bound the space the count needs. Also, bits known to be zero can't 531 // contribute to the population. 532 unsigned BitsPossiblySet = Known2.countMaxPopulation(); 533 unsigned LowBits = llvm::bit_width(BitsPossiblySet); 534 Known.Zero.setBitsFrom(LowBits); 535 // TODO: we could bound Known.One using the lower bound on the number of 536 // bits which might be set provided by popcnt KnownOne2. 537 break; 538 } 539 case TargetOpcode::G_UBFX: { 540 KnownBits SrcOpKnown, OffsetKnown, WidthKnown; 541 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts, 542 Depth + 1); 543 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts, 544 Depth + 1); 545 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts, 546 Depth + 1); 547 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown); 548 break; 549 } 550 case TargetOpcode::G_SBFX: { 551 KnownBits SrcOpKnown, OffsetKnown, WidthKnown; 552 computeKnownBitsImpl(MI.getOperand(1).getReg(), SrcOpKnown, DemandedElts, 553 Depth + 1); 554 computeKnownBitsImpl(MI.getOperand(2).getReg(), OffsetKnown, DemandedElts, 555 Depth + 1); 556 computeKnownBitsImpl(MI.getOperand(3).getReg(), WidthKnown, DemandedElts, 557 Depth + 1); 558 Known = extractBits(BitWidth, SrcOpKnown, OffsetKnown, WidthKnown); 559 // Sign extend the extracted value using shift left and arithmetic shift 560 // right. 561 KnownBits ExtKnown = KnownBits::makeConstant(APInt(BitWidth, BitWidth)); 562 KnownBits ShiftKnown = KnownBits::computeForAddSub( 563 /*Add*/ false, /*NSW*/ false, ExtKnown, WidthKnown); 564 Known = KnownBits::ashr(KnownBits::shl(Known, ShiftKnown), ShiftKnown); 565 break; 566 } 567 case TargetOpcode::G_UADDO: 568 case TargetOpcode::G_UADDE: 569 case TargetOpcode::G_SADDO: 570 case TargetOpcode::G_SADDE: 571 case TargetOpcode::G_USUBO: 572 case TargetOpcode::G_USUBE: 573 case TargetOpcode::G_SSUBO: 574 case TargetOpcode::G_SSUBE: 575 case TargetOpcode::G_UMULO: 576 case TargetOpcode::G_SMULO: { 577 if (MI.getOperand(1).getReg() == R) { 578 // If we know the result of a compare has the top bits zero, use this 579 // info. 580 if (TL.getBooleanContents(DstTy.isVector(), false) == 581 TargetLowering::ZeroOrOneBooleanContent && 582 BitWidth > 1) 583 Known.Zero.setBitsFrom(1); 584 } 585 break; 586 } 587 } 588 589 assert(!Known.hasConflict() && "Bits known to be one AND zero?"); 590 LLVM_DEBUG(dumpResult(MI, Known, Depth)); 591 592 // Update the cache. 593 ComputeKnownBitsCache[R] = Known; 594 } 595 596 /// Compute number of sign bits for the intersection of \p Src0 and \p Src1 597 unsigned GISelKnownBits::computeNumSignBitsMin(Register Src0, Register Src1, 598 const APInt &DemandedElts, 599 unsigned Depth) { 600 // Test src1 first, since we canonicalize simpler expressions to the RHS. 601 unsigned Src1SignBits = computeNumSignBits(Src1, DemandedElts, Depth); 602 if (Src1SignBits == 1) 603 return 1; 604 return std::min(computeNumSignBits(Src0, DemandedElts, Depth), Src1SignBits); 605 } 606 607 unsigned GISelKnownBits::computeNumSignBits(Register R, 608 const APInt &DemandedElts, 609 unsigned Depth) { 610 MachineInstr &MI = *MRI.getVRegDef(R); 611 unsigned Opcode = MI.getOpcode(); 612 613 if (Opcode == TargetOpcode::G_CONSTANT) 614 return MI.getOperand(1).getCImm()->getValue().getNumSignBits(); 615 616 if (Depth == getMaxDepth()) 617 return 1; 618 619 if (!DemandedElts) 620 return 1; // No demanded elts, better to assume we don't know anything. 621 622 LLT DstTy = MRI.getType(R); 623 const unsigned TyBits = DstTy.getScalarSizeInBits(); 624 625 // Handle the case where this is called on a register that does not have a 626 // type constraint. This is unlikely to occur except by looking through copies 627 // but it is possible for the initial register being queried to be in this 628 // state. 629 if (!DstTy.isValid()) 630 return 1; 631 632 unsigned FirstAnswer = 1; 633 switch (Opcode) { 634 case TargetOpcode::COPY: { 635 MachineOperand &Src = MI.getOperand(1); 636 if (Src.getReg().isVirtual() && Src.getSubReg() == 0 && 637 MRI.getType(Src.getReg()).isValid()) { 638 // Don't increment Depth for this one since we didn't do any work. 639 return computeNumSignBits(Src.getReg(), DemandedElts, Depth); 640 } 641 642 return 1; 643 } 644 case TargetOpcode::G_SEXT: { 645 Register Src = MI.getOperand(1).getReg(); 646 LLT SrcTy = MRI.getType(Src); 647 unsigned Tmp = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits(); 648 return computeNumSignBits(Src, DemandedElts, Depth + 1) + Tmp; 649 } 650 case TargetOpcode::G_ASSERT_SEXT: 651 case TargetOpcode::G_SEXT_INREG: { 652 // Max of the input and what this extends. 653 Register Src = MI.getOperand(1).getReg(); 654 unsigned SrcBits = MI.getOperand(2).getImm(); 655 unsigned InRegBits = TyBits - SrcBits + 1; 656 return std::max(computeNumSignBits(Src, DemandedElts, Depth + 1), InRegBits); 657 } 658 case TargetOpcode::G_SEXTLOAD: { 659 // FIXME: We need an in-memory type representation. 660 if (DstTy.isVector()) 661 return 1; 662 663 // e.g. i16->i32 = '17' bits known. 664 const MachineMemOperand *MMO = *MI.memoperands_begin(); 665 return TyBits - MMO->getSizeInBits() + 1; 666 } 667 case TargetOpcode::G_ZEXTLOAD: { 668 // FIXME: We need an in-memory type representation. 669 if (DstTy.isVector()) 670 return 1; 671 672 // e.g. i16->i32 = '16' bits known. 673 const MachineMemOperand *MMO = *MI.memoperands_begin(); 674 return TyBits - MMO->getSizeInBits(); 675 } 676 case TargetOpcode::G_TRUNC: { 677 Register Src = MI.getOperand(1).getReg(); 678 LLT SrcTy = MRI.getType(Src); 679 680 // Check if the sign bits of source go down as far as the truncated value. 681 unsigned DstTyBits = DstTy.getScalarSizeInBits(); 682 unsigned NumSrcBits = SrcTy.getScalarSizeInBits(); 683 unsigned NumSrcSignBits = computeNumSignBits(Src, DemandedElts, Depth + 1); 684 if (NumSrcSignBits > (NumSrcBits - DstTyBits)) 685 return NumSrcSignBits - (NumSrcBits - DstTyBits); 686 break; 687 } 688 case TargetOpcode::G_SELECT: { 689 return computeNumSignBitsMin(MI.getOperand(2).getReg(), 690 MI.getOperand(3).getReg(), DemandedElts, 691 Depth + 1); 692 } 693 case TargetOpcode::G_SADDO: 694 case TargetOpcode::G_SADDE: 695 case TargetOpcode::G_UADDO: 696 case TargetOpcode::G_UADDE: 697 case TargetOpcode::G_SSUBO: 698 case TargetOpcode::G_SSUBE: 699 case TargetOpcode::G_USUBO: 700 case TargetOpcode::G_USUBE: 701 case TargetOpcode::G_SMULO: 702 case TargetOpcode::G_UMULO: { 703 // If compares returns 0/-1, all bits are sign bits. 704 // We know that we have an integer-based boolean since these operations 705 // are only available for integer. 706 if (MI.getOperand(1).getReg() == R) { 707 if (TL.getBooleanContents(DstTy.isVector(), false) == 708 TargetLowering::ZeroOrNegativeOneBooleanContent) 709 return TyBits; 710 } 711 712 break; 713 } 714 case TargetOpcode::G_FCMP: 715 case TargetOpcode::G_ICMP: { 716 bool IsFP = Opcode == TargetOpcode::G_FCMP; 717 if (TyBits == 1) 718 break; 719 auto BC = TL.getBooleanContents(DstTy.isVector(), IsFP); 720 if (BC == TargetLoweringBase::ZeroOrNegativeOneBooleanContent) 721 return TyBits; // All bits are sign bits. 722 if (BC == TargetLowering::ZeroOrOneBooleanContent) 723 return TyBits - 1; // Every always-zero bit is a sign bit. 724 break; 725 } 726 case TargetOpcode::G_INTRINSIC: 727 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 728 default: { 729 unsigned NumBits = 730 TL.computeNumSignBitsForTargetInstr(*this, R, DemandedElts, MRI, Depth); 731 if (NumBits > 1) 732 FirstAnswer = std::max(FirstAnswer, NumBits); 733 break; 734 } 735 } 736 737 // Finally, if we can prove that the top bits of the result are 0's or 1's, 738 // use this information. 739 KnownBits Known = getKnownBits(R, DemandedElts, Depth); 740 APInt Mask; 741 if (Known.isNonNegative()) { // sign bit is 0 742 Mask = Known.Zero; 743 } else if (Known.isNegative()) { // sign bit is 1; 744 Mask = Known.One; 745 } else { 746 // Nothing known. 747 return FirstAnswer; 748 } 749 750 // Okay, we know that the sign bit in Mask is set. Use CLO to determine 751 // the number of identical bits in the top of the input value. 752 Mask <<= Mask.getBitWidth() - TyBits; 753 return std::max(FirstAnswer, Mask.countLeadingOnes()); 754 } 755 756 unsigned GISelKnownBits::computeNumSignBits(Register R, unsigned Depth) { 757 LLT Ty = MRI.getType(R); 758 APInt DemandedElts = 759 Ty.isVector() ? APInt::getAllOnes(Ty.getNumElements()) : APInt(1, 1); 760 return computeNumSignBits(R, DemandedElts, Depth); 761 } 762 763 void GISelKnownBitsAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 764 AU.setPreservesAll(); 765 MachineFunctionPass::getAnalysisUsage(AU); 766 } 767 768 bool GISelKnownBitsAnalysis::runOnMachineFunction(MachineFunction &MF) { 769 return false; 770 } 771