1 //===- llvm/Support/KnownBits.h - Stores known zeros/ones -------*- 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 // This file contains a class for representing known zeros and ones used by 10 // computeKnownBits. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_SUPPORT_KNOWNBITS_H 15 #define LLVM_SUPPORT_KNOWNBITS_H 16 17 #include "llvm/ADT/APInt.h" 18 #include <optional> 19 20 namespace llvm { 21 22 // Struct for tracking the known zeros and ones of a value. 23 struct KnownBits { 24 APInt Zero; 25 APInt One; 26 27 private: 28 // Internal constructor for creating a KnownBits from two APInts. KnownBitsKnownBits29 KnownBits(APInt Zero, APInt One) 30 : Zero(std::move(Zero)), One(std::move(One)) {} 31 32 public: 33 // Default construct Zero and One. 34 KnownBits() = default; 35 36 /// Create a known bits object of BitWidth bits initialized to unknown. KnownBitsKnownBits37 KnownBits(unsigned BitWidth) : Zero(BitWidth, 0), One(BitWidth, 0) {} 38 39 /// Get the bit width of this value. getBitWidthKnownBits40 unsigned getBitWidth() const { 41 assert(Zero.getBitWidth() == One.getBitWidth() && 42 "Zero and One should have the same width!"); 43 return Zero.getBitWidth(); 44 } 45 46 /// Returns true if there is conflicting information. hasConflictKnownBits47 bool hasConflict() const { return Zero.intersects(One); } 48 49 /// Returns true if we know the value of all bits. isConstantKnownBits50 bool isConstant() const { 51 assert(!hasConflict() && "KnownBits conflict!"); 52 return Zero.popcount() + One.popcount() == getBitWidth(); 53 } 54 55 /// Returns the value when all bits have a known value. This just returns One 56 /// with a protective assertion. getConstantKnownBits57 const APInt &getConstant() const { 58 assert(isConstant() && "Can only get value when all bits are known"); 59 return One; 60 } 61 62 /// Returns true if we don't know any bits. isUnknownKnownBits63 bool isUnknown() const { return Zero.isZero() && One.isZero(); } 64 65 /// Returns true if we don't know the sign bit. isSignUnknownKnownBits66 bool isSignUnknown() const { 67 return !Zero.isSignBitSet() && !One.isSignBitSet(); 68 } 69 70 /// Resets the known state of all bits. resetAllKnownBits71 void resetAll() { 72 Zero.clearAllBits(); 73 One.clearAllBits(); 74 } 75 76 /// Returns true if value is all zero. isZeroKnownBits77 bool isZero() const { 78 assert(!hasConflict() && "KnownBits conflict!"); 79 return Zero.isAllOnes(); 80 } 81 82 /// Returns true if value is all one bits. isAllOnesKnownBits83 bool isAllOnes() const { 84 assert(!hasConflict() && "KnownBits conflict!"); 85 return One.isAllOnes(); 86 } 87 88 /// Make all bits known to be zero and discard any previous information. setAllZeroKnownBits89 void setAllZero() { 90 Zero.setAllBits(); 91 One.clearAllBits(); 92 } 93 94 /// Make all bits known to be one and discard any previous information. setAllOnesKnownBits95 void setAllOnes() { 96 Zero.clearAllBits(); 97 One.setAllBits(); 98 } 99 100 /// Returns true if this value is known to be negative. isNegativeKnownBits101 bool isNegative() const { return One.isSignBitSet(); } 102 103 /// Returns true if this value is known to be non-negative. isNonNegativeKnownBits104 bool isNonNegative() const { return Zero.isSignBitSet(); } 105 106 /// Returns true if this value is known to be non-zero. isNonZeroKnownBits107 bool isNonZero() const { return !One.isZero(); } 108 109 /// Returns true if this value is known to be positive. isStrictlyPositiveKnownBits110 bool isStrictlyPositive() const { 111 return Zero.isSignBitSet() && !One.isZero(); 112 } 113 114 /// Make this value negative. makeNegativeKnownBits115 void makeNegative() { 116 One.setSignBit(); 117 } 118 119 /// Make this value non-negative. makeNonNegativeKnownBits120 void makeNonNegative() { 121 Zero.setSignBit(); 122 } 123 124 /// Return the minimal unsigned value possible given these KnownBits. getMinValueKnownBits125 APInt getMinValue() const { 126 // Assume that all bits that aren't known-ones are zeros. 127 return One; 128 } 129 130 /// Return the minimal signed value possible given these KnownBits. getSignedMinValueKnownBits131 APInt getSignedMinValue() const { 132 // Assume that all bits that aren't known-ones are zeros. 133 APInt Min = One; 134 // Sign bit is unknown. 135 if (Zero.isSignBitClear()) 136 Min.setSignBit(); 137 return Min; 138 } 139 140 /// Return the maximal unsigned value possible given these KnownBits. getMaxValueKnownBits141 APInt getMaxValue() const { 142 // Assume that all bits that aren't known-zeros are ones. 143 return ~Zero; 144 } 145 146 /// Return the maximal signed value possible given these KnownBits. getSignedMaxValueKnownBits147 APInt getSignedMaxValue() const { 148 // Assume that all bits that aren't known-zeros are ones. 149 APInt Max = ~Zero; 150 // Sign bit is unknown. 151 if (One.isSignBitClear()) 152 Max.clearSignBit(); 153 return Max; 154 } 155 156 /// Return known bits for a truncation of the value we're tracking. truncKnownBits157 KnownBits trunc(unsigned BitWidth) const { 158 return KnownBits(Zero.trunc(BitWidth), One.trunc(BitWidth)); 159 } 160 161 /// Return known bits for an "any" extension of the value we're tracking, 162 /// where we don't know anything about the extended bits. anyextKnownBits163 KnownBits anyext(unsigned BitWidth) const { 164 return KnownBits(Zero.zext(BitWidth), One.zext(BitWidth)); 165 } 166 167 /// Return known bits for a zero extension of the value we're tracking. zextKnownBits168 KnownBits zext(unsigned BitWidth) const { 169 unsigned OldBitWidth = getBitWidth(); 170 APInt NewZero = Zero.zext(BitWidth); 171 NewZero.setBitsFrom(OldBitWidth); 172 return KnownBits(NewZero, One.zext(BitWidth)); 173 } 174 175 /// Return known bits for a sign extension of the value we're tracking. sextKnownBits176 KnownBits sext(unsigned BitWidth) const { 177 return KnownBits(Zero.sext(BitWidth), One.sext(BitWidth)); 178 } 179 180 /// Return known bits for an "any" extension or truncation of the value we're 181 /// tracking. anyextOrTruncKnownBits182 KnownBits anyextOrTrunc(unsigned BitWidth) const { 183 if (BitWidth > getBitWidth()) 184 return anyext(BitWidth); 185 if (BitWidth < getBitWidth()) 186 return trunc(BitWidth); 187 return *this; 188 } 189 190 /// Return known bits for a zero extension or truncation of the value we're 191 /// tracking. zextOrTruncKnownBits192 KnownBits zextOrTrunc(unsigned BitWidth) const { 193 if (BitWidth > getBitWidth()) 194 return zext(BitWidth); 195 if (BitWidth < getBitWidth()) 196 return trunc(BitWidth); 197 return *this; 198 } 199 200 /// Return known bits for a sign extension or truncation of the value we're 201 /// tracking. sextOrTruncKnownBits202 KnownBits sextOrTrunc(unsigned BitWidth) const { 203 if (BitWidth > getBitWidth()) 204 return sext(BitWidth); 205 if (BitWidth < getBitWidth()) 206 return trunc(BitWidth); 207 return *this; 208 } 209 210 /// Return known bits for a in-register sign extension of the value we're 211 /// tracking. 212 KnownBits sextInReg(unsigned SrcBitWidth) const; 213 214 /// Insert the bits from a smaller known bits starting at bitPosition. insertBitsKnownBits215 void insertBits(const KnownBits &SubBits, unsigned BitPosition) { 216 Zero.insertBits(SubBits.Zero, BitPosition); 217 One.insertBits(SubBits.One, BitPosition); 218 } 219 220 /// Return a subset of the known bits from [bitPosition,bitPosition+numBits). extractBitsKnownBits221 KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const { 222 return KnownBits(Zero.extractBits(NumBits, BitPosition), 223 One.extractBits(NumBits, BitPosition)); 224 } 225 226 /// Concatenate the bits from \p Lo onto the bottom of *this. This is 227 /// equivalent to: 228 /// (this->zext(NewWidth) << Lo.getBitWidth()) | Lo.zext(NewWidth) concatKnownBits229 KnownBits concat(const KnownBits &Lo) const { 230 return KnownBits(Zero.concat(Lo.Zero), One.concat(Lo.One)); 231 } 232 233 /// Return KnownBits based on this, but updated given that the underlying 234 /// value is known to be greater than or equal to Val. 235 KnownBits makeGE(const APInt &Val) const; 236 237 /// Returns the minimum number of trailing zero bits. countMinTrailingZerosKnownBits238 unsigned countMinTrailingZeros() const { return Zero.countr_one(); } 239 240 /// Returns the minimum number of trailing one bits. countMinTrailingOnesKnownBits241 unsigned countMinTrailingOnes() const { return One.countr_one(); } 242 243 /// Returns the minimum number of leading zero bits. countMinLeadingZerosKnownBits244 unsigned countMinLeadingZeros() const { return Zero.countl_one(); } 245 246 /// Returns the minimum number of leading one bits. countMinLeadingOnesKnownBits247 unsigned countMinLeadingOnes() const { return One.countl_one(); } 248 249 /// Returns the number of times the sign bit is replicated into the other 250 /// bits. countMinSignBitsKnownBits251 unsigned countMinSignBits() const { 252 if (isNonNegative()) 253 return countMinLeadingZeros(); 254 if (isNegative()) 255 return countMinLeadingOnes(); 256 // Every value has at least 1 sign bit. 257 return 1; 258 } 259 260 /// Returns the maximum number of bits needed to represent all possible 261 /// signed values with these known bits. This is the inverse of the minimum 262 /// number of known sign bits. Examples for bitwidth 5: 263 /// 110?? --> 4 264 /// 0000? --> 2 countMaxSignificantBitsKnownBits265 unsigned countMaxSignificantBits() const { 266 return getBitWidth() - countMinSignBits() + 1; 267 } 268 269 /// Returns the maximum number of trailing zero bits possible. countMaxTrailingZerosKnownBits270 unsigned countMaxTrailingZeros() const { return One.countr_zero(); } 271 272 /// Returns the maximum number of trailing one bits possible. countMaxTrailingOnesKnownBits273 unsigned countMaxTrailingOnes() const { return Zero.countr_zero(); } 274 275 /// Returns the maximum number of leading zero bits possible. countMaxLeadingZerosKnownBits276 unsigned countMaxLeadingZeros() const { return One.countl_zero(); } 277 278 /// Returns the maximum number of leading one bits possible. countMaxLeadingOnesKnownBits279 unsigned countMaxLeadingOnes() const { return Zero.countl_zero(); } 280 281 /// Returns the number of bits known to be one. countMinPopulationKnownBits282 unsigned countMinPopulation() const { return One.popcount(); } 283 284 /// Returns the maximum number of bits that could be one. countMaxPopulationKnownBits285 unsigned countMaxPopulation() const { 286 return getBitWidth() - Zero.popcount(); 287 } 288 289 /// Returns the maximum number of bits needed to represent all possible 290 /// unsigned values with these known bits. This is the inverse of the 291 /// minimum number of leading zeros. countMaxActiveBitsKnownBits292 unsigned countMaxActiveBits() const { 293 return getBitWidth() - countMinLeadingZeros(); 294 } 295 296 /// Create known bits from a known constant. makeConstantKnownBits297 static KnownBits makeConstant(const APInt &C) { 298 return KnownBits(~C, C); 299 } 300 301 /// Returns KnownBits information that is known to be true for both this and 302 /// RHS. 303 /// 304 /// When an operation is known to return one of its operands, this can be used 305 /// to combine information about the known bits of the operands to get the 306 /// information that must be true about the result. intersectWithKnownBits307 KnownBits intersectWith(const KnownBits &RHS) const { 308 return KnownBits(Zero & RHS.Zero, One & RHS.One); 309 } 310 311 /// Returns KnownBits information that is known to be true for either this or 312 /// RHS or both. 313 /// 314 /// This can be used to combine different sources of information about the 315 /// known bits of a single value, e.g. information about the low bits and the 316 /// high bits of the result of a multiplication. unionWithKnownBits317 KnownBits unionWith(const KnownBits &RHS) const { 318 return KnownBits(Zero | RHS.Zero, One | RHS.One); 319 } 320 321 /// Compute known bits common to LHS and RHS. 322 LLVM_DEPRECATED("use intersectWith instead", "intersectWith") commonBitsKnownBits323 static KnownBits commonBits(const KnownBits &LHS, const KnownBits &RHS) { 324 return LHS.intersectWith(RHS); 325 } 326 327 /// Return true if LHS and RHS have no common bits set. haveNoCommonBitsSetKnownBits328 static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS) { 329 return (LHS.Zero | RHS.Zero).isAllOnes(); 330 } 331 332 /// Compute known bits resulting from adding LHS, RHS and a 1-bit Carry. 333 static KnownBits computeForAddCarry( 334 const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry); 335 336 /// Compute known bits resulting from adding LHS and RHS. 337 static KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, 338 const KnownBits &LHS, const KnownBits &RHS); 339 340 /// Compute known bits results from subtracting RHS from LHS with 1-bit 341 /// Borrow. 342 static KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, 343 const KnownBits &Borrow); 344 345 /// Compute knownbits resulting from llvm.sadd.sat(LHS, RHS) 346 static KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS); 347 348 /// Compute knownbits resulting from llvm.uadd.sat(LHS, RHS) 349 static KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS); 350 351 /// Compute knownbits resulting from llvm.ssub.sat(LHS, RHS) 352 static KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS); 353 354 /// Compute knownbits resulting from llvm.usub.sat(LHS, RHS) 355 static KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS); 356 357 /// Compute known bits resulting from multiplying LHS and RHS. 358 static KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, 359 bool NoUndefSelfMultiply = false); 360 361 /// Compute known bits from sign-extended multiply-hi. 362 static KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS); 363 364 /// Compute known bits from zero-extended multiply-hi. 365 static KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS); 366 367 /// Compute known bits for sdiv(LHS, RHS). 368 static KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, 369 bool Exact = false); 370 371 /// Compute known bits for udiv(LHS, RHS). 372 static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, 373 bool Exact = false); 374 375 /// Compute known bits for urem(LHS, RHS). 376 static KnownBits urem(const KnownBits &LHS, const KnownBits &RHS); 377 378 /// Compute known bits for srem(LHS, RHS). 379 static KnownBits srem(const KnownBits &LHS, const KnownBits &RHS); 380 381 /// Compute known bits for umax(LHS, RHS). 382 static KnownBits umax(const KnownBits &LHS, const KnownBits &RHS); 383 384 /// Compute known bits for umin(LHS, RHS). 385 static KnownBits umin(const KnownBits &LHS, const KnownBits &RHS); 386 387 /// Compute known bits for smax(LHS, RHS). 388 static KnownBits smax(const KnownBits &LHS, const KnownBits &RHS); 389 390 /// Compute known bits for smin(LHS, RHS). 391 static KnownBits smin(const KnownBits &LHS, const KnownBits &RHS); 392 393 /// Compute known bits for abdu(LHS, RHS). 394 static KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS); 395 396 /// Compute known bits for abds(LHS, RHS). 397 static KnownBits abds(const KnownBits &LHS, const KnownBits &RHS); 398 399 /// Compute known bits for shl(LHS, RHS). 400 /// NOTE: RHS (shift amount) bitwidth doesn't need to be the same as LHS. 401 static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, 402 bool NUW = false, bool NSW = false, 403 bool ShAmtNonZero = false); 404 405 /// Compute known bits for lshr(LHS, RHS). 406 /// NOTE: RHS (shift amount) bitwidth doesn't need to be the same as LHS. 407 static KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, 408 bool ShAmtNonZero = false, bool Exact = false); 409 410 /// Compute known bits for ashr(LHS, RHS). 411 /// NOTE: RHS (shift amount) bitwidth doesn't need to be the same as LHS. 412 static KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, 413 bool ShAmtNonZero = false, bool Exact = false); 414 415 /// Determine if these known bits always give the same ICMP_EQ result. 416 static std::optional<bool> eq(const KnownBits &LHS, const KnownBits &RHS); 417 418 /// Determine if these known bits always give the same ICMP_NE result. 419 static std::optional<bool> ne(const KnownBits &LHS, const KnownBits &RHS); 420 421 /// Determine if these known bits always give the same ICMP_UGT result. 422 static std::optional<bool> ugt(const KnownBits &LHS, const KnownBits &RHS); 423 424 /// Determine if these known bits always give the same ICMP_UGE result. 425 static std::optional<bool> uge(const KnownBits &LHS, const KnownBits &RHS); 426 427 /// Determine if these known bits always give the same ICMP_ULT result. 428 static std::optional<bool> ult(const KnownBits &LHS, const KnownBits &RHS); 429 430 /// Determine if these known bits always give the same ICMP_ULE result. 431 static std::optional<bool> ule(const KnownBits &LHS, const KnownBits &RHS); 432 433 /// Determine if these known bits always give the same ICMP_SGT result. 434 static std::optional<bool> sgt(const KnownBits &LHS, const KnownBits &RHS); 435 436 /// Determine if these known bits always give the same ICMP_SGE result. 437 static std::optional<bool> sge(const KnownBits &LHS, const KnownBits &RHS); 438 439 /// Determine if these known bits always give the same ICMP_SLT result. 440 static std::optional<bool> slt(const KnownBits &LHS, const KnownBits &RHS); 441 442 /// Determine if these known bits always give the same ICMP_SLE result. 443 static std::optional<bool> sle(const KnownBits &LHS, const KnownBits &RHS); 444 445 /// Update known bits based on ANDing with RHS. 446 KnownBits &operator&=(const KnownBits &RHS); 447 448 /// Update known bits based on ORing with RHS. 449 KnownBits &operator|=(const KnownBits &RHS); 450 451 /// Update known bits based on XORing with RHS. 452 KnownBits &operator^=(const KnownBits &RHS); 453 454 /// Compute known bits for the absolute value. 455 KnownBits abs(bool IntMinIsPoison = false) const; 456 byteSwapKnownBits457 KnownBits byteSwap() const { 458 return KnownBits(Zero.byteSwap(), One.byteSwap()); 459 } 460 reverseBitsKnownBits461 KnownBits reverseBits() const { 462 return KnownBits(Zero.reverseBits(), One.reverseBits()); 463 } 464 465 /// Compute known bits for X & -X, which has only the lowest bit set of X set. 466 /// The name comes from the X86 BMI instruction 467 KnownBits blsi() const; 468 469 /// Compute known bits for X ^ (X - 1), which has all bits up to and including 470 /// the lowest set bit of X set. The name comes from the X86 BMI instruction. 471 KnownBits blsmsk() const; 472 473 bool operator==(const KnownBits &Other) const { 474 return Zero == Other.Zero && One == Other.One; 475 } 476 477 bool operator!=(const KnownBits &Other) const { return !(*this == Other); } 478 479 void print(raw_ostream &OS) const; 480 void dump() const; 481 482 private: 483 // Internal helper for getting the initial KnownBits for an `srem` or `urem` 484 // operation with the low-bits set. 485 static KnownBits remGetLowBits(const KnownBits &LHS, const KnownBits &RHS); 486 }; 487 488 inline KnownBits operator&(KnownBits LHS, const KnownBits &RHS) { 489 LHS &= RHS; 490 return LHS; 491 } 492 493 inline KnownBits operator&(const KnownBits &LHS, KnownBits &&RHS) { 494 RHS &= LHS; 495 return std::move(RHS); 496 } 497 498 inline KnownBits operator|(KnownBits LHS, const KnownBits &RHS) { 499 LHS |= RHS; 500 return LHS; 501 } 502 503 inline KnownBits operator|(const KnownBits &LHS, KnownBits &&RHS) { 504 RHS |= LHS; 505 return std::move(RHS); 506 } 507 508 inline KnownBits operator^(KnownBits LHS, const KnownBits &RHS) { 509 LHS ^= RHS; 510 return LHS; 511 } 512 513 inline KnownBits operator^(const KnownBits &LHS, KnownBits &&RHS) { 514 RHS ^= LHS; 515 return std::move(RHS); 516 } 517 518 inline raw_ostream &operator<<(raw_ostream &OS, const KnownBits &Known) { 519 Known.print(OS); 520 return OS; 521 } 522 523 } // end namespace llvm 524 525 #endif 526