LLVM 24.0.0git
KnownBits.cpp
Go to the documentation of this file.
1//===-- KnownBits.cpp - Stores known zeros/ones ---------------------------===//
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
15#include "llvm/ADT/Sequence.h"
16#include "llvm/Support/Debug.h"
18#include <cassert>
19
20using namespace llvm;
21
22KnownBits KnownBits::flipSignBit(const KnownBits &Val) {
23 unsigned SignBitPosition = Val.getBitWidth() - 1;
24 APInt Zero = Val.Zero;
25 APInt One = Val.One;
26 Zero.setBitVal(SignBitPosition, Val.One[SignBitPosition]);
27 One.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]);
28 return KnownBits(Zero, One);
29}
30
32 bool CarryZero, bool CarryOne) {
33
34 APInt PossibleSumZero = LHS.getMaxValue() + RHS.getMaxValue() + !CarryZero;
35 APInt PossibleSumOne = LHS.getMinValue() + RHS.getMinValue() + CarryOne;
36
37 // Compute known bits of the carry.
38 APInt CarryKnownZero = ~(PossibleSumZero ^ LHS.Zero ^ RHS.Zero);
39 APInt CarryKnownOne = PossibleSumOne ^ LHS.One ^ RHS.One;
40
41 // Compute set of known bits (where all three relevant bits are known).
42 APInt LHSKnownUnion = LHS.Zero | LHS.One;
43 APInt RHSKnownUnion = RHS.Zero | RHS.One;
44 APInt CarryKnownUnion = std::move(CarryKnownZero) | CarryKnownOne;
45 APInt Known = std::move(LHSKnownUnion) & RHSKnownUnion & CarryKnownUnion;
46
47 // Compute known bits of the result.
48 KnownBits KnownOut;
49 KnownOut.Zero = ~std::move(PossibleSumZero) & Known;
50 KnownOut.One = std::move(PossibleSumOne) & Known;
51 return KnownOut;
52}
53
55 const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry) {
56 assert(Carry.getBitWidth() == 1 && "Carry must be 1-bit");
57 return ::computeForAddCarry(
58 LHS, RHS, Carry.Zero.getBoolValue(), Carry.One.getBoolValue());
59}
60
61KnownBits KnownBits::computeForAddSub(bool Add, bool NSW, bool NUW,
62 const KnownBits &LHS,
63 const KnownBits &RHS) {
64 unsigned BitWidth = LHS.getBitWidth();
65 KnownBits KnownOut(BitWidth);
66 // This can be a relatively expensive helper, so optimistically save some
67 // work.
68 if (LHS.isUnknown() && RHS.isUnknown())
69 return KnownOut;
70
71 if (!LHS.isUnknown() && !RHS.isUnknown()) {
72 if (Add) {
73 // Sum = LHS + RHS + 0
74 KnownOut = ::computeForAddCarry(LHS, RHS, /*CarryZero=*/true,
75 /*CarryOne=*/false);
76 } else {
77 // Sum = LHS + ~RHS + 1
78 KnownBits NotRHS = RHS;
79 std::swap(NotRHS.Zero, NotRHS.One);
80 KnownOut = ::computeForAddCarry(LHS, NotRHS, /*CarryZero=*/false,
81 /*CarryOne=*/true);
82 }
83 }
84
85 // Handle add/sub given nsw and/or nuw.
86 if (NUW) {
87 if (Add) {
88 // (add nuw X, Y)
89 APInt MinVal = LHS.getMinValue().uadd_sat(RHS.getMinValue());
90 // None of the adds can end up overflowing, so min consecutive highbits
91 // in minimum possible of X + Y must all remain set.
92 if (NSW) {
93 unsigned NumBits = MinVal.trunc(BitWidth - 1).countl_one();
94 // If we have NSW as well, we also know we can't overflow the signbit so
95 // can start counting from 1 bit back.
96 KnownOut.One.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
97 }
98 KnownOut.One.setHighBits(MinVal.countl_one());
99 } else {
100 // (sub nuw X, Y)
101 APInt MaxVal = LHS.getMaxValue().usub_sat(RHS.getMinValue());
102 // None of the subs can overflow at any point, so any common high bits
103 // will subtract away and result in zeros.
104 if (NSW) {
105 // If we have NSW as well, we also know we can't overflow the signbit so
106 // can start counting from 1 bit back.
107 unsigned NumBits = MaxVal.trunc(BitWidth - 1).countl_zero();
108 KnownOut.Zero.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
109 }
110 KnownOut.Zero.setHighBits(MaxVal.countl_zero());
111 }
112 }
113
114 if (NSW) {
115 APInt MinVal;
116 APInt MaxVal;
117 if (Add) {
118 // (add nsw X, Y)
119 MinVal = LHS.getSignedMinValue().sadd_sat(RHS.getSignedMinValue());
120 MaxVal = LHS.getSignedMaxValue().sadd_sat(RHS.getSignedMaxValue());
121 } else {
122 // (sub nsw X, Y)
123 MinVal = LHS.getSignedMinValue().ssub_sat(RHS.getSignedMaxValue());
124 MaxVal = LHS.getSignedMaxValue().ssub_sat(RHS.getSignedMinValue());
125 }
126 if (MinVal.isNonNegative()) {
127 // If min is non-negative, result will always be non-neg (can't overflow
128 // around).
129 unsigned NumBits = MinVal.trunc(BitWidth - 1).countl_one();
130 KnownOut.One.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
131 KnownOut.Zero.setSignBit();
132 }
133 if (MaxVal.isNegative()) {
134 // If max is negative, result will always be neg (can't overflow around).
135 unsigned NumBits = MaxVal.trunc(BitWidth - 1).countl_zero();
136 KnownOut.Zero.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
137 KnownOut.One.setSignBit();
138 }
139 }
140
141 // Just return 0 if the nsw/nuw is violated and we have poison.
142 if (KnownOut.hasConflict())
143 KnownOut.setAllZero();
144 return KnownOut;
145}
146
147KnownBits KnownBits::computeForSubBorrow(const KnownBits &LHS, KnownBits RHS,
148 const KnownBits &Borrow) {
149 assert(Borrow.getBitWidth() == 1 && "Borrow must be 1-bit");
150
151 // LHS - RHS = LHS + ~RHS + 1
152 // Carry 1 - Borrow in ::computeForAddCarry
153 std::swap(RHS.Zero, RHS.One);
154 return ::computeForAddCarry(LHS, RHS,
155 /*CarryZero=*/Borrow.One.getBoolValue(),
156 /*CarryOne=*/Borrow.Zero.getBoolValue());
157}
158
159KnownBits KnownBits::truncSSat(unsigned BitWidth) const {
160 unsigned InputBits = getBitWidth();
161 APInt MinInRange = APInt::getSignedMinValue(BitWidth).sext(InputBits);
162 APInt MaxInRange = APInt::getSignedMaxValue(BitWidth).sext(InputBits);
163 APInt InputMin = getSignedMinValue();
164 APInt InputMax = getSignedMaxValue();
165 KnownBits Known(BitWidth);
166
167 // Case 1: All values fit - just truncate
168 if (InputMin.sge(MinInRange) && InputMax.sle(MaxInRange)) {
170 }
171 // Case 2: All saturate to min
172 else if (InputMax.slt(MinInRange)) {
174 }
175 // Case 3: All saturate to max
176 else if (InputMin.sgt(MaxInRange)) {
178 }
179 // Case 4: All non-negative, some fit, some saturate to max
180 else if (InputMin.isNonNegative()) {
181 // Output: truncated OR max saturation
182 // Max saturation has only sign bit as 0
183 Known.Zero = APInt(BitWidth, 0);
184 Known.Zero.setBit(BitWidth - 1); // Sign bit always 0
185 // Max saturation has all lower bits as 1, so preserve InputOneLower
186 Known.One = One.trunc(BitWidth);
187 Known.One.clearBit(BitWidth - 1); // Sign bit is 0, not 1
188 }
189 // Case 5: All negative, some fit, some saturate to min
190 else if (InputMax.isNegative()) {
191 // Output: truncated OR min saturation
192 // Min saturation has all lower bits as 0, so preserve InputZeroLower
193 Known.Zero = Zero.trunc(BitWidth);
194 Known.Zero.clearBit(BitWidth - 1); // Sign bit is 1, not 0
195 // Min saturation has only sign bit as 1
196 Known.One = APInt(BitWidth, 0);
197 Known.One.setBit(BitWidth - 1); // Sign bit always 1
198 }
199 // Case 6: Mixed positive and negative
200 else {
201 // Output: min saturation, truncated, or max saturation
202 APInt InputZeroLower = Zero.trunc(BitWidth);
203 APInt InputOneLower = One.trunc(BitWidth);
206 KnownBits MinSatKB = KnownBits::makeConstant(MinSat);
207 KnownBits MaxSatKB = KnownBits::makeConstant(MaxSat);
208 if (InputMax.sle(MaxInRange)) {
209 // Positive values fit, only negatives saturate to min
210 Known.Zero = InputZeroLower & MinSatKB.Zero;
211 Known.One = InputOneLower & MinSatKB.One;
212 } else if (InputMin.sge(MinInRange)) {
213 // Negative values fit, only positives saturate to max
214 Known.Zero = InputZeroLower & MaxSatKB.Zero;
215 Known.One = InputOneLower & MaxSatKB.One;
216 } else {
217 // Both positive and negative values might saturate
218 Known.Zero = InputZeroLower & MinSatKB.Zero & MaxSatKB.Zero;
219 Known.One = InputOneLower & MinSatKB.One & MaxSatKB.One;
220 }
221 }
222 return Known;
223}
224
225KnownBits KnownBits::truncSSatU(unsigned BitWidth) const {
226 unsigned InputBits = getBitWidth();
227 APInt MaxInRange = APInt::getAllOnes(BitWidth).zext(InputBits);
228 APInt InputMin = getSignedMinValue();
229 APInt InputMax = getSignedMaxValue();
230 KnownBits Known(BitWidth);
231
232 if (isNegative()) {
233 Known.setAllZero();
234 } else if (InputMin.isNonNegative() && InputMax.ule(MaxInRange)) {
236 } else if (InputMin.isNonNegative() && InputMin.ugt(MaxInRange)) {
237 Known.setAllOnes();
238 } else if (InputMin.isNonNegative()) {
239 // All non-negative but mixed: some fit, some saturate to all-ones
240 // No common zero bits (saturation is all-ones)
241 Known.Zero = APInt(BitWidth, 0);
242 // Common one bits: bits that are 1 in input stay 1
243 Known.One = One.trunc(BitWidth);
244 } else {
245 // Mixed: sign bit unknown
246 if (InputMax.ule(MaxInRange)) {
247 // Positive values all fit (no saturation to all-ones)
248 // Output: all-zeros (negatives) OR truncated (positives)
249 Known.Zero = Zero.trunc(BitWidth);
250 Known.One = APInt(BitWidth, 0);
251 } else {
252 // Positive values might saturate to all-ones
253 // Output: all-zeros OR truncated OR all-ones
254 // No common bits
255 Known.Zero = APInt(BitWidth, 0);
256 Known.One = APInt(BitWidth, 0);
257 }
258 }
259 return Known;
260}
261
262KnownBits KnownBits::truncUSat(unsigned BitWidth) const {
263 unsigned InputBits = getBitWidth();
264 APInt MaxInRange = APInt::getLowBitsSet(InputBits, BitWidth);
265 APInt InputMax = getMaxValue();
266 APInt InputMin = getMinValue();
267 KnownBits Known(BitWidth);
268
269 if (InputMax.ule(MaxInRange)) {
271 } else if (InputMin.ugt(MaxInRange)) {
272 Known.setAllOnes();
273 } else {
274 Known.resetAll();
275 Known.One = One.trunc(BitWidth);
276 }
277 return Known;
278}
279
280KnownBits KnownBits::sextInReg(unsigned SrcBitWidth) const {
281 unsigned BitWidth = getBitWidth();
282 assert(0 < SrcBitWidth && SrcBitWidth <= BitWidth &&
283 "Illegal sext-in-register");
284
285 if (SrcBitWidth == BitWidth)
286 return *this;
287
288 unsigned ExtBits = BitWidth - SrcBitWidth;
289 KnownBits Result;
290 Result.One = One << ExtBits;
291 Result.Zero = Zero << ExtBits;
292 Result.One.ashrInPlace(ExtBits);
293 Result.Zero.ashrInPlace(ExtBits);
294 return Result;
295}
296
297KnownBits KnownBits::makeGE(const APInt &Val) const {
298 // Count the number of leading bit positions where our underlying value is
299 // known to be less than or equal to Val.
300 unsigned N = (Zero | Val).countl_one();
301
302 // For each of those bit positions, if Val has a 1 in that bit then our
303 // underlying value must also have a 1.
304 APInt MaskedVal(Val);
305 MaskedVal.clearLowBits(getBitWidth() - N);
306 return KnownBits(Zero, One | MaskedVal);
307}
308
309KnownBits KnownBits::umax(const KnownBits &LHS, const KnownBits &RHS) {
310 // If we can prove that LHS >= RHS then use LHS as the result. Likewise for
311 // RHS. Ideally our caller would already have spotted these cases and
312 // optimized away the umax operation, but we handle them here for
313 // completeness.
314 if (LHS.getMinValue().uge(RHS.getMaxValue()))
315 return LHS;
316 if (RHS.getMinValue().uge(LHS.getMaxValue()))
317 return RHS;
318
319 // If the result of the umax is LHS then it must be greater than or equal to
320 // the minimum possible value of RHS. Likewise for RHS. Any known bits that
321 // are common to these two values are also known in the result.
322 KnownBits L = LHS.makeGE(RHS.getMinValue());
323 KnownBits R = RHS.makeGE(LHS.getMinValue());
324 return L.intersectWith(R);
325}
326
327KnownBits KnownBits::umin(const KnownBits &LHS, const KnownBits &RHS) {
328 // Flip the range of values: [0, 0xFFFFFFFF] <-> [0xFFFFFFFF, 0]
329 auto Flip = [](const KnownBits &Val) { return KnownBits(Val.One, Val.Zero); };
330 return Flip(umax(Flip(LHS), Flip(RHS)));
331}
332
333KnownBits KnownBits::smax(const KnownBits &LHS, const KnownBits &RHS) {
334 return flipSignBit(umax(flipSignBit(LHS), flipSignBit(RHS)));
335}
336
337KnownBits KnownBits::smin(const KnownBits &LHS, const KnownBits &RHS) {
338 return flipSignBit(umin(flipSignBit(LHS), flipSignBit(RHS)));
339}
340
341KnownBits KnownBits::abdu(const KnownBits &LHS, const KnownBits &RHS) {
342 // If we know which argument is larger, return (sub LHS, RHS) or
343 // (sub RHS, LHS) directly.
344 if (LHS.getMinValue().uge(RHS.getMaxValue()))
345 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS,
346 RHS);
347 if (RHS.getMinValue().uge(LHS.getMaxValue()))
348 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, RHS,
349 LHS);
350
351 // By construction, the subtraction in abdu never has unsigned overflow.
352 // Find the common bits between (sub nuw LHS, RHS) and (sub nuw RHS, LHS).
353 KnownBits Diff0 =
354 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS);
355 KnownBits Diff1 =
356 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS);
357 return Diff0.intersectWith(Diff1);
358}
359
360KnownBits KnownBits::abds(KnownBits LHS, KnownBits RHS) {
361 // Shift both arguments from the signed range to the unsigned range, e.g. from
362 // [-0x80, 0x7F] to [0, 0xFF].
363 return abdu(flipSignBit(LHS), flipSignBit(RHS));
364}
365
366static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth) {
368 // Clamp to the shift amount's width: a narrower amount is already
369 // < BitWidth, so this stays a valid upper bound.
370 return MaxValue.extractBitsAsZExtValue(
371 std::min(Log2_32(BitWidth), MaxValue.getBitWidth()), 0);
372 // This is only an approximate upper bound.
373 return MaxValue.getLimitedValue(BitWidth - 1);
374}
375
376KnownBits KnownBits::shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW,
377 bool NSW, bool ShAmtNonZero) {
378 unsigned BitWidth = LHS.getBitWidth();
379 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
380 KnownBits Known;
381 bool ShiftedOutZero, ShiftedOutOne;
382 Known.Zero = LHS.Zero.ushl_ov(ShiftAmt, ShiftedOutZero);
383 Known.Zero.setLowBits(ShiftAmt);
384 Known.One = LHS.One.ushl_ov(ShiftAmt, ShiftedOutOne);
385
386 // All cases returning poison have been handled by MaxShiftAmount already.
387 if (NSW) {
388 if (NUW && ShiftAmt != 0)
389 // NUW means we can assume anything shifted out was a zero.
390 ShiftedOutZero = true;
391
392 if (ShiftedOutZero)
393 Known.makeNonNegative();
394 else if (ShiftedOutOne)
395 Known.makeNegative();
396 }
397 return Known;
398 };
399
400 // Fast path for a common case when LHS is completely unknown.
401 KnownBits Known(BitWidth);
402 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
403 if (MinShiftAmount == 0 && ShAmtNonZero)
404 MinShiftAmount = 1;
405 if (LHS.isUnknown()) {
406 Known.Zero.setLowBits(MinShiftAmount);
407 if (NUW && NSW && MinShiftAmount != 0)
408 Known.makeNonNegative();
409 return Known;
410 }
411
412 // Determine maximum shift amount, taking NUW/NSW flags into account.
413 APInt MaxValue = RHS.getMaxValue();
414 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
415 if (NUW && NSW)
416 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1);
417 if (NUW)
418 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros());
419 if (NSW)
420 MaxShiftAmount = std::min(
421 MaxShiftAmount,
422 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1);
423
424 // Fast path for common case where the shift amount is unknown.
425 if (MinShiftAmount == 0 && MaxShiftAmount == BitWidth - 1 &&
427 Known.Zero.setLowBits(LHS.countMinTrailingZeros());
428 if (LHS.isAllOnes())
429 Known.One.setSignBit();
430 if (NSW) {
431 if (LHS.isNonNegative())
432 Known.makeNonNegative();
433 if (LHS.isNegative())
434 Known.makeNegative();
435 }
436 return Known;
437 }
438
439 // Find the common bits from all possible shifts.
440 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
441 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
442 Known.setAllConflict();
443 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
444 ++ShiftAmt) {
445 // Skip if the shift amount is impossible.
446 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
447 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
448 continue;
449 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
450 if (Known.isUnknown())
451 break;
452 }
453
454 // All shift amounts may result in poison.
455 if (Known.hasConflict())
456 Known.setAllZero();
457 return Known;
458}
459
460KnownBits KnownBits::lshr(const KnownBits &LHS, const KnownBits &RHS,
461 bool ShAmtNonZero, bool Exact) {
462 unsigned BitWidth = LHS.getBitWidth();
463 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
464 KnownBits Known = LHS;
465 Known >>= ShiftAmt;
466 // High bits are known zero.
467 Known.Zero.setHighBits(ShiftAmt);
468 return Known;
469 };
470
471 // Fast path for a common case when LHS is completely unknown.
472 KnownBits Known(BitWidth);
473 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
474 if (MinShiftAmount == 0 && ShAmtNonZero)
475 MinShiftAmount = 1;
476 if (LHS.isUnknown()) {
477 Known.Zero.setHighBits(MinShiftAmount);
478 return Known;
479 }
480
481 // Find the common bits from all possible shifts.
482 APInt MaxValue = RHS.getMaxValue();
483 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
484
485 // If exact, bound MaxShiftAmount to first known 1 in LHS.
486 if (Exact) {
487 unsigned FirstOne = LHS.countMaxTrailingZeros();
488 if (FirstOne < MinShiftAmount) {
489 // Always poison. Return zero because we don't like returning conflict.
490 Known.setAllZero();
491 return Known;
492 }
493 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
494 }
495
496 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
497 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
498 Known.setAllConflict();
499 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
500 ++ShiftAmt) {
501 // Skip if the shift amount is impossible.
502 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
503 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
504 continue;
505 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
506 if (Known.isUnknown())
507 break;
508 }
509
510 // All shift amounts may result in poison.
511 if (Known.hasConflict())
512 Known.setAllZero();
513 return Known;
514}
515
516KnownBits KnownBits::ashr(const KnownBits &LHS, const KnownBits &RHS,
517 bool ShAmtNonZero, bool Exact) {
518 unsigned BitWidth = LHS.getBitWidth();
519 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
520 KnownBits Known = LHS;
521 Known.Zero.ashrInPlace(ShiftAmt);
522 Known.One.ashrInPlace(ShiftAmt);
523 return Known;
524 };
525
526 // Fast path for a common case when LHS is completely unknown.
527 KnownBits Known(BitWidth);
528 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
529 if (MinShiftAmount == 0 && ShAmtNonZero)
530 MinShiftAmount = 1;
531 if (LHS.isUnknown()) {
532 if (MinShiftAmount == BitWidth) {
533 // Always poison. Return zero because we don't like returning conflict.
534 Known.setAllZero();
535 return Known;
536 }
537 return Known;
538 }
539
540 // Find the common bits from all possible shifts.
541 APInt MaxValue = RHS.getMaxValue();
542 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
543
544 // If exact, bound MaxShiftAmount to first known 1 in LHS.
545 if (Exact) {
546 unsigned FirstOne = LHS.countMaxTrailingZeros();
547 if (FirstOne < MinShiftAmount) {
548 // Always poison. Return zero because we don't like returning conflict.
549 Known.setAllZero();
550 return Known;
551 }
552 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
553 }
554
555 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
556 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
557 Known.setAllConflict();
558 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
559 ++ShiftAmt) {
560 // Skip if the shift amount is impossible.
561 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
562 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
563 continue;
564 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
565 if (Known.isUnknown())
566 break;
567 }
568
569 // All shift amounts may result in poison.
570 if (Known.hasConflict())
571 Known.setAllZero();
572 return Known;
573}
574
575KnownBits KnownBits::fshl(const KnownBits &LHS, const KnownBits &RHS,
576 const APInt &Amt) {
577 return KnownBits(APIntOps::fshl(LHS.Zero, RHS.Zero, Amt),
578 APIntOps::fshl(LHS.One, RHS.One, Amt));
579}
580
581KnownBits KnownBits::fshr(const KnownBits &LHS, const KnownBits &RHS,
582 const APInt &Amt) {
583 return KnownBits(APIntOps::fshr(LHS.Zero, RHS.Zero, Amt),
584 APIntOps::fshr(LHS.One, RHS.One, Amt));
585}
586
587KnownBits KnownBits::clmul(const KnownBits &LHS, const KnownBits &RHS) {
588 KnownBits Res =
589 makeConstant(APIntOps::clmul(LHS.getMinValue(), RHS.getMinValue()));
590
591 // This is the same operation as clmul except it accumulates the result with
592 // an OR instead of an XOR.
593 auto ClMulOr = [](const APInt &LHS, const APInt &RHS) {
594 unsigned BW = LHS.getBitWidth();
595 assert(BW == RHS.getBitWidth() && "Operand mismatch");
596 APInt Result(BW, 0);
597 for (unsigned I :
598 seq(std::min(RHS.getActiveBits(), BW - LHS.countr_zero())))
599 if (RHS[I])
600 Result |= LHS << I;
601 return Result;
602 };
603
604 // Bits in the result are known if, for every corresponding pair of input
605 // bits, both input bits are known or either input bit is known to be zero.
606 APInt Known = ~(ClMulOr(~LHS.Zero & ~LHS.One, ~RHS.Zero) |
607 ClMulOr(~LHS.Zero, ~RHS.Zero & ~RHS.One));
608 Res.Zero &= Known;
609 Res.One &= Known;
610
611 return Res;
612}
613
614KnownBits KnownBits::pext(const KnownBits &Val, const KnownBits &Mask) {
615 unsigned BitWidth = Val.getBitWidth();
616 KnownBits Res(BitWidth);
617 // We start by asserting that bits cannot be 0 and cannot be 1, then clear
618 // Res bits where we know a bit could have some value.
619 Res.setAllConflict();
620
621 // For each source position I where Mask[I] could be 1, the output position J
622 // lies in [M0, M1], where M0 and M1 track the range of possible 1-bit counts
623 // seen so far in Mask. Note that M0=M1 as long as bits in Mask are known;
624 // otherwise, the range of possible output positions widens.
625 unsigned M0 = 0, M1 = 0;
626 for (unsigned I = 0; I < BitWidth; ++I) {
627 if (!Mask.Zero[I]) {
628 // Mask[I] could be 1, so we decide what value the Res bits could have.
629 if (!Val.Zero[I])
630 // Val[I] could be 1 => Res[J] for J in [M0, M1] could be 1
631 Res.Zero.clearBits(M0, M1 + 1);
632 if (!Val.One[I])
633 // Val[I] could be 0 => Res[J] for J in [M0, M1] could be 0
634 Res.One.clearBits(M0, M1 + 1);
635 }
636 if (Mask.One[I])
637 ++M0, ++M1;
638 else if (!Mask.Zero[I])
639 ++M1;
640 }
641
642 // Output bits at J >= M0 may have no source (popcount(Mask) may be <= J), so
643 // they may be 0.
644 Res.One.clearBits(M0, BitWidth);
645 return Res;
646}
647
648KnownBits KnownBits::pdep(const KnownBits &Val, const KnownBits &Mask) {
649 unsigned BitWidth = Val.getBitWidth();
650 KnownBits Res(BitWidth);
651 // We start by asserting that bits cannot be 0 and cannot be 1, then clear
652 // Res bits where we know a bit could have some value.
653 Res.setAllConflict();
654
655 // For each output position I where Mask[I] could be 1, the source position J
656 // lies in [M0, M1], where M0 and M1 track the range of possible 1-bit counts
657 // seen so far in Mask. Note that M0=M1 as long as bits in Mask are known;
658 // otherwise, the range of possible source positions widens.
659 unsigned M0 = 0, M1 = 0;
660 for (unsigned I = 0; I < BitWidth; ++I) {
661 if (!Mask.One[I])
662 // Mask[I] could be 0 => Res[I] could be 0
663 Res.One.clearBit(I);
664 if (!Mask.Zero[I]) {
665 // Mask[I] could be 1, so we check what value the Val bits could have.
667 if (!Range.isSubsetOf(Val.One))
668 // Any Val[J] for J in [M0, M1] could be 0 => Res[I] could be 0
669 Res.One.clearBit(I);
670 if (!Range.isSubsetOf(Val.Zero))
671 // Any Val[J] for J in [M0, M1] could be 1 => Res[I] could be 1
672 Res.Zero.clearBit(I);
673 }
674 if (Mask.One[I])
675 ++M0, ++M1;
676 else if (!Mask.Zero[I])
677 ++M1;
678 }
679 return Res;
680}
681
682std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) {
683 if (LHS.isConstant() && RHS.isConstant())
684 return LHS.getConstant() == RHS.getConstant();
685 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero))
686 return false;
687 return std::nullopt;
688}
689
690std::optional<bool> KnownBits::ne(const KnownBits &LHS, const KnownBits &RHS) {
691 if (std::optional<bool> KnownEQ = eq(LHS, RHS))
692 return !*KnownEQ;
693 return std::nullopt;
694}
695
696std::optional<bool> KnownBits::ugt(const KnownBits &LHS, const KnownBits &RHS) {
697 // LHS >u RHS -> false if umax(LHS) <= umax(RHS)
698 if (LHS.getMaxValue().ule(RHS.getMinValue()))
699 return false;
700 // LHS >u RHS -> true if umin(LHS) > umax(RHS)
701 if (LHS.getMinValue().ugt(RHS.getMaxValue()))
702 return true;
703 return std::nullopt;
704}
705
706std::optional<bool> KnownBits::uge(const KnownBits &LHS, const KnownBits &RHS) {
707 if (std::optional<bool> IsUGT = ugt(RHS, LHS))
708 return !*IsUGT;
709 return std::nullopt;
710}
711
712std::optional<bool> KnownBits::ult(const KnownBits &LHS, const KnownBits &RHS) {
713 return ugt(RHS, LHS);
714}
715
716std::optional<bool> KnownBits::ule(const KnownBits &LHS, const KnownBits &RHS) {
717 return uge(RHS, LHS);
718}
719
720std::optional<bool> KnownBits::sgt(const KnownBits &LHS, const KnownBits &RHS) {
721 // LHS >s RHS -> false if smax(LHS) <= smax(RHS)
722 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue()))
723 return false;
724 // LHS >s RHS -> true if smin(LHS) > smax(RHS)
725 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue()))
726 return true;
727 return std::nullopt;
728}
729
730std::optional<bool> KnownBits::sge(const KnownBits &LHS, const KnownBits &RHS) {
731 if (std::optional<bool> KnownSGT = sgt(RHS, LHS))
732 return !*KnownSGT;
733 return std::nullopt;
734}
735
736std::optional<bool> KnownBits::slt(const KnownBits &LHS, const KnownBits &RHS) {
737 return sgt(RHS, LHS);
738}
739
740std::optional<bool> KnownBits::sle(const KnownBits &LHS, const KnownBits &RHS) {
741 return sge(RHS, LHS);
742}
743
744KnownBits KnownBits::abs(bool IntMinIsPoison) const {
745 // If the source's MSB is zero then we know the rest of the bits already.
746 if (isNonNegative())
747 return *this;
748
749 // Absolute value preserves trailing zero count.
750 KnownBits KnownAbs(getBitWidth());
751
752 // If the input is negative, then abs(x) == -x.
753 if (isNegative()) {
754 KnownBits Tmp = *this;
755 // Special case for IntMinIsPoison. We know the sign bit is set and we know
756 // all the rest of the bits except one to be zero. Since we have
757 // IntMinIsPoison, that final bit MUST be a one, as otherwise the input is
758 // INT_MIN.
759 if (IntMinIsPoison && (Zero.popcount() + 2) == getBitWidth())
761
762 KnownAbs = computeForAddSub(
763 /*Add*/ false, IntMinIsPoison, /*NUW=*/false,
765
766 // One more special case for IntMinIsPoison. If we don't know any ones other
767 // than the signbit, we know for certain that all the unknowns can't be
768 // zero. So if we know high zero bits, but have unknown low bits, we know
769 // for certain those high-zero bits will end up as one. This is because,
770 // the low bits can't be all zeros, so the +1 in (~x + 1) cannot carry up
771 // to the high bits. If we know a known INT_MIN input skip this. The result
772 // is poison anyways.
773 if (IntMinIsPoison && Tmp.countMinPopulation() == 1 &&
774 Tmp.countMaxPopulation() != 1) {
775 Tmp.One.clearSignBit();
776 Tmp.Zero.setSignBit();
777 KnownAbs.One.setBits(getBitWidth() - Tmp.countMinLeadingZeros(),
778 getBitWidth() - 1);
779 }
780
781 } else {
782 unsigned MaxTZ = countMaxTrailingZeros();
783 unsigned MinTZ = countMinTrailingZeros();
784
785 KnownAbs.Zero.setLowBits(MinTZ);
786 // If we know the lowest set 1, then preserve it.
787 if (MaxTZ == MinTZ && MaxTZ < getBitWidth())
788 KnownAbs.One.setBit(MaxTZ);
789
790 // We only know that the absolute values's MSB will be zero if INT_MIN is
791 // poison, or there is a set bit that isn't the sign bit (otherwise it could
792 // be INT_MIN).
793 if (IntMinIsPoison || (!One.isZero() && !One.isMinSignedValue())) {
794 KnownAbs.One.clearSignBit();
795 KnownAbs.Zero.setSignBit();
796 }
797 }
798
799 return KnownAbs;
800}
801
802KnownBits KnownBits::reduceAdd(unsigned NumElts) const {
803 if (NumElts == 0)
804 return KnownBits(getBitWidth());
805
806 unsigned BitWidth = getBitWidth();
807 KnownBits Result(BitWidth);
808
809 if (isConstant())
810 // If all elements are the same constant, we can simply compute it
811 return KnownBits::makeConstant(NumElts * getConstant());
812
813 // The main idea is as follows.
814 //
815 // If KnownBits for each element has L leading zeros then
816 // X_i < 2^(W - L) for every i from [1, N].
817 //
818 // ADD X_i <= ADD max(X_i) = N * max(X_i)
819 // < N * 2^(W - L)
820 // < 2^(W - L + ceil(log2(N)))
821 //
822 // As the result, we can conclude that
823 //
824 // L' = L - ceil(log2(N))
825 //
826 // Similar logic can be applied to leading ones.
827 unsigned LostBits = Log2_32_Ceil(NumElts);
828
829 if (isNonNegative()) {
830 unsigned LeadingZeros = countMinLeadingZeros();
831 LeadingZeros = LeadingZeros > LostBits ? LeadingZeros - LostBits : 0;
832 Result.Zero.setHighBits(LeadingZeros);
833 } else if (isNegative()) {
834 unsigned LeadingOnes = countMinLeadingOnes();
835 LeadingOnes = LeadingOnes > LostBits ? LeadingOnes - LostBits : 0;
836 Result.One.setHighBits(LeadingOnes);
837 }
838
839 return Result;
840}
841
843 const KnownBits &LHS,
844 const KnownBits &RHS) {
845 // We don't see NSW even for sadd/ssub as we want to check if the result has
846 // signed overflow.
847 unsigned BitWidth = LHS.getBitWidth();
848
849 std::optional<bool> Overflow;
850 // Even if we can't entirely rule out overflow, we may be able to rule out
851 // overflow in one direction. This allows us to potentially keep some of the
852 // add/sub bits. I.e if we can't overflow in the positive direction we won't
853 // clamp to INT_MAX so we can keep low 0s from the add/sub result.
854 bool MayNegClamp = true;
855 bool MayPosClamp = true;
856 if (Signed) {
857 // Easy cases we can rule out any overflow.
858 if (Add && ((LHS.isNegative() && RHS.isNonNegative()) ||
859 (LHS.isNonNegative() && RHS.isNegative())))
860 Overflow = false;
861 else if (!Add && (((LHS.isNegative() && RHS.isNegative()) ||
862 (LHS.isNonNegative() && RHS.isNonNegative()))))
863 Overflow = false;
864 else {
865 // Check if we may overflow. If we can't rule out overflow then check if
866 // we can rule out a direction at least.
867 KnownBits UnsignedLHS = LHS;
868 KnownBits UnsignedRHS = RHS;
869 // Get version of LHS/RHS with clearer signbit. This allows us to detect
870 // how the addition/subtraction might overflow into the signbit. Then
871 // using the actual known signbits of LHS/RHS, we can figure out which
872 // overflows are/aren't possible.
873 UnsignedLHS.One.clearSignBit();
874 UnsignedLHS.Zero.setSignBit();
875 UnsignedRHS.One.clearSignBit();
876 UnsignedRHS.Zero.setSignBit();
877 KnownBits Res =
878 KnownBits::computeForAddSub(Add, /*NSW=*/false,
879 /*NUW=*/false, UnsignedLHS, UnsignedRHS);
880 if (Add) {
881 if (Res.isNegative()) {
882 // Only overflow scenario is Pos + Pos.
883 MayNegClamp = false;
884 // Pos + Pos will overflow with extra signbit.
885 if (LHS.isNonNegative() && RHS.isNonNegative())
886 Overflow = true;
887 } else if (Res.isNonNegative()) {
888 // Only overflow scenario is Neg + Neg
889 MayPosClamp = false;
890 // Neg + Neg will overflow without extra signbit.
891 if (LHS.isNegative() && RHS.isNegative())
892 Overflow = true;
893 }
894 // We will never clamp to the opposite sign of N-bit result.
895 if (LHS.isNegative() || RHS.isNegative())
896 MayPosClamp = false;
897 if (LHS.isNonNegative() || RHS.isNonNegative())
898 MayNegClamp = false;
899 } else {
900 if (Res.isNegative()) {
901 // Only overflow scenario is Neg - Pos.
902 MayPosClamp = false;
903 // Neg - Pos will overflow with extra signbit.
904 if (LHS.isNegative() && RHS.isNonNegative())
905 Overflow = true;
906 } else if (Res.isNonNegative()) {
907 // Only overflow scenario is Pos - Neg.
908 MayNegClamp = false;
909 // Pos - Neg will overflow without extra signbit.
910 if (LHS.isNonNegative() && RHS.isNegative())
911 Overflow = true;
912 }
913 // We will never clamp to the opposite sign of N-bit result.
914 if (LHS.isNegative() || RHS.isNonNegative())
915 MayPosClamp = false;
916 if (LHS.isNonNegative() || RHS.isNegative())
917 MayNegClamp = false;
918 }
919 }
920 // If we have ruled out all clamping, we will never overflow.
921 if (!MayNegClamp && !MayPosClamp)
922 Overflow = false;
923 } else if (Add) {
924 // uadd.sat
925 bool Of;
926 (void)LHS.getMaxValue().uadd_ov(RHS.getMaxValue(), Of);
927 if (!Of) {
928 Overflow = false;
929 } else {
930 (void)LHS.getMinValue().uadd_ov(RHS.getMinValue(), Of);
931 if (Of)
932 Overflow = true;
933 }
934 } else {
935 // usub.sat
936 bool Of;
937 (void)LHS.getMinValue().usub_ov(RHS.getMaxValue(), Of);
938 if (!Of) {
939 Overflow = false;
940 } else {
941 (void)LHS.getMaxValue().usub_ov(RHS.getMinValue(), Of);
942 if (Of)
943 Overflow = true;
944 }
945 }
946
948 /*NUW=*/!Signed, LHS, RHS);
949
950 if (Overflow) {
951 // We know whether or not we overflowed.
952 if (!(*Overflow)) {
953 // No overflow.
954 return Res;
955 }
956
957 // We overflowed
958 APInt C;
959 if (Signed) {
960 // sadd.sat / ssub.sat
961 assert(!LHS.isSignUnknown() &&
962 "We somehow know overflow without knowing input sign");
963 C = LHS.isNegative() ? APInt::getSignedMinValue(BitWidth)
965 } else if (Add) {
966 // uadd.sat
968 } else {
969 // uadd.sat
971 }
972
973 Res.One = C;
974 Res.Zero = ~C;
975 return Res;
976 }
977
978 // We don't know if we overflowed.
979 if (Signed) {
980 // sadd.sat/ssub.sat
981 // We can keep our information about the sign bits.
982 if (MayPosClamp)
983 Res.Zero.clearLowBits(BitWidth - 1);
984 if (MayNegClamp)
985 Res.One.clearLowBits(BitWidth - 1);
986 } else if (Add) {
987 // uadd.sat
988 // We need to clear all the known zeros as we can only use the leading ones.
989 Res.Zero.clearAllBits();
990 } else {
991 // usub.sat
992 // We need to clear all the known ones as we can only use the leading zero.
993 Res.One.clearAllBits();
994 }
995
996 return Res;
997}
998
999KnownBits KnownBits::sadd_sat(const KnownBits &LHS, const KnownBits &RHS) {
1000 return computeForSatAddSub(/*Add*/ true, /*Signed*/ true, LHS, RHS);
1001}
1002KnownBits KnownBits::ssub_sat(const KnownBits &LHS, const KnownBits &RHS) {
1003 return computeForSatAddSub(/*Add*/ false, /*Signed*/ true, LHS, RHS);
1004}
1005KnownBits KnownBits::uadd_sat(const KnownBits &LHS, const KnownBits &RHS) {
1006 return computeForSatAddSub(/*Add*/ true, /*Signed*/ false, LHS, RHS);
1007}
1008KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) {
1009 return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS);
1010}
1011
1013 unsigned BitWidth = LHS.getBitWidth();
1014 LHS = LHS.zext(BitWidth + 1);
1015 RHS = RHS.zext(BitWidth + 1);
1016 LHS =
1017 computeForAddCarry(LHS, RHS, /*CarryZero*/ !IsCeil, /*CarryOne*/ IsCeil);
1018 LHS = LHS.extractBits(BitWidth, 1);
1019 return LHS;
1020}
1021
1022KnownBits KnownBits::avgFloorS(const KnownBits &LHS, const KnownBits &RHS) {
1023 return flipSignBit(avgFloorU(flipSignBit(LHS), flipSignBit(RHS)));
1024}
1025
1026KnownBits KnownBits::avgFloorU(const KnownBits &LHS, const KnownBits &RHS) {
1027 return avgComputeU(LHS, RHS, /*IsCeil=*/false);
1028}
1029
1030KnownBits KnownBits::avgCeilS(const KnownBits &LHS, const KnownBits &RHS) {
1031 return flipSignBit(avgCeilU(flipSignBit(LHS), flipSignBit(RHS)));
1032}
1033
1034KnownBits KnownBits::avgCeilU(const KnownBits &LHS, const KnownBits &RHS) {
1035 return avgComputeU(LHS, RHS, /*IsCeil=*/true);
1036}
1037
1038KnownBits KnownBits::mul(const KnownBits &LHS, const KnownBits &RHS,
1039 bool NoUndefSelfMultiply) {
1040 unsigned BitWidth = LHS.getBitWidth();
1041 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1042 assert((!NoUndefSelfMultiply || LHS == RHS) &&
1043 "Self multiplication knownbits mismatch");
1044
1045 // Compute the high known-0 bits by multiplying the unsigned max of each side.
1046 // Conservatively, M active bits * N active bits results in M + N bits in the
1047 // result. But if we know a value is a power-of-2 for example, then this
1048 // computes one more leading zero.
1049 // TODO: This could be generalized to number of sign bits (negative numbers).
1050 APInt UMaxLHS = LHS.getMaxValue();
1051 APInt UMaxRHS = RHS.getMaxValue();
1052
1053 // For leading zeros in the result to be valid, the unsigned max product must
1054 // fit in the bitwidth (it must not overflow).
1055 bool HasOverflow;
1056 APInt UMaxResult = UMaxLHS.umul_ov(UMaxRHS, HasOverflow);
1057 unsigned LeadZ = HasOverflow ? 0 : UMaxResult.countl_zero();
1058
1059 // The result of the bottom bits of an integer multiply can be
1060 // inferred by looking at the bottom bits of both operands and
1061 // multiplying them together.
1062 // We can infer at least the minimum number of known trailing bits
1063 // of both operands. Depending on number of trailing zeros, we can
1064 // infer more bits, because (a*b) <=> ((a/m) * (b/n)) * (m*n) assuming
1065 // a and b are divisible by m and n respectively.
1066 // We then calculate how many of those bits are inferrable and set
1067 // the output. For example, the i8 mul:
1068 // a = XXXX1100 (12)
1069 // b = XXXX1110 (14)
1070 // We know the bottom 3 bits are zero since the first can be divided by
1071 // 4 and the second by 2, thus having ((12/4) * (14/2)) * (2*4).
1072 // Applying the multiplication to the trimmed arguments gets:
1073 // XX11 (3)
1074 // X111 (7)
1075 // -------
1076 // XX11
1077 // XX11
1078 // XX11
1079 // XX11
1080 // -------
1081 // XXXXX01
1082 // Which allows us to infer the 2 LSBs. Since we're multiplying the result
1083 // by 8, the bottom 3 bits will be 0, so we can infer a total of 5 bits.
1084 // The proof for this can be described as:
1085 // Pre: (C1 >= 0) && (C1 < (1 << C5)) && (C2 >= 0) && (C2 < (1 << C6)) &&
1086 // (C7 == (1 << (umin(countTrailingZeros(C1), C5) +
1087 // umin(countTrailingZeros(C2), C6) +
1088 // umin(C5 - umin(countTrailingZeros(C1), C5),
1089 // C6 - umin(countTrailingZeros(C2), C6)))) - 1)
1090 // %aa = shl i8 %a, C5
1091 // %bb = shl i8 %b, C6
1092 // %aaa = or i8 %aa, C1
1093 // %bbb = or i8 %bb, C2
1094 // %mul = mul i8 %aaa, %bbb
1095 // %mask = and i8 %mul, C7
1096 // =>
1097 // %mask = i8 ((C1*C2)&C7)
1098 // Where C5, C6 describe the known bits of %a, %b
1099 // C1, C2 describe the known bottom bits of %a, %b.
1100 // C7 describes the mask of the known bits of the result.
1101
1102 // How many times we'd be able to divide each argument by 2 (shr by 1).
1103 // This gives us the number of trailing zeros on the multiplication result.
1104 unsigned TrailBitsKnownLHS = (LHS.Zero | LHS.One).countr_one();
1105 unsigned TrailBitsKnownRHS = (RHS.Zero | RHS.One).countr_one();
1106 unsigned TrailZeroLHS = LHS.countMinTrailingZeros();
1107 unsigned TrailZeroRHS = RHS.countMinTrailingZeros();
1108 unsigned TrailZ = TrailZeroLHS + TrailZeroRHS;
1109
1110 // Figure out the fewest known-bits operand.
1111 unsigned SmallestOperand = std::min(TrailBitsKnownLHS - TrailZeroLHS,
1112 TrailBitsKnownRHS - TrailZeroRHS);
1113 unsigned ResultBitsKnown = std::min(SmallestOperand + TrailZ, BitWidth);
1114
1115 // The lower ResultBitsKnown bits of this are known.
1116 APInt BottomKnown = LHS.One * RHS.One;
1117
1118 KnownBits Res(BitWidth);
1119 Res.Zero.setHighBits(LeadZ);
1120 Res.Zero |= (~BottomKnown).getLoBits(ResultBitsKnown);
1121 Res.One = BottomKnown.getLoBits(ResultBitsKnown);
1122
1123 if (NoUndefSelfMultiply) {
1124 // If X has at least TZ trailing zeroes, then bit (2 * TZ + 1) must be zero.
1125 unsigned TwoTZP1 = 2 * TrailZeroLHS + 1;
1126 if (TwoTZP1 < BitWidth)
1127 Res.Zero.setBit(TwoTZP1);
1128
1129 // If X has exactly TZ trailing zeros, then bit (2 * TZ + 2) must also be
1130 // zero.
1131 if (TrailZeroLHS < BitWidth && LHS.One[TrailZeroLHS]) {
1132 unsigned TwoTZP2 = TwoTZP1 + 1;
1133 if (TwoTZP2 < BitWidth)
1134 Res.Zero.setBit(TwoTZP2);
1135 }
1136 }
1137
1138 return Res;
1139}
1140
1141KnownBits KnownBits::mulhs(const KnownBits &LHS, const KnownBits &RHS) {
1142 unsigned BitWidth = LHS.getBitWidth();
1143 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1144 KnownBits WideLHS = LHS.sext(2 * BitWidth);
1145 KnownBits WideRHS = RHS.sext(2 * BitWidth);
1146 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
1147}
1148
1149KnownBits KnownBits::mulhu(const KnownBits &LHS, const KnownBits &RHS) {
1150 unsigned BitWidth = LHS.getBitWidth();
1151 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1152 KnownBits WideLHS = LHS.zext(2 * BitWidth);
1153 KnownBits WideRHS = RHS.zext(2 * BitWidth);
1154 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
1155}
1156
1158 const KnownBits &RHS, bool Exact) {
1159
1160 if (!Exact)
1161 return Known;
1162
1163 // If LHS is Odd, the result is Odd no matter what.
1164 // Odd / Odd -> Odd
1165 // Odd / Even -> Impossible (because its exact division)
1166 if (LHS.One[0])
1167 Known.One.setBit(0);
1168
1169 int MinTZ =
1170 (int)LHS.countMinTrailingZeros() - (int)RHS.countMaxTrailingZeros();
1171 int MaxTZ =
1172 (int)LHS.countMaxTrailingZeros() - (int)RHS.countMinTrailingZeros();
1173 if (MinTZ >= 0) {
1174 // Result has at least MinTZ trailing zeros.
1175 Known.Zero.setLowBits(MinTZ);
1176 if (MinTZ == MaxTZ) {
1177 // Result has exactly MinTZ trailing zeros.
1178 Known.One.setBit(MinTZ);
1179 }
1180 } else if (MaxTZ < 0) {
1181 // Poison Result
1182 Known.setAllZero();
1183 }
1184
1185 // In the KnownBits exhaustive tests, we have poison inputs for exact values
1186 // a LOT. If we have a conflict, just return all zeros.
1187 if (Known.hasConflict())
1188 Known.setAllZero();
1189
1190 return Known;
1191}
1192
1193KnownBits KnownBits::sdiv(const KnownBits &LHS, const KnownBits &RHS,
1194 bool Exact) {
1195 // Equivalent of `udiv`. We must have caught this before it was folded.
1196 if (LHS.isNonNegative() && RHS.isNonNegative())
1197 return udiv(LHS, RHS, Exact);
1198
1199 unsigned BitWidth = LHS.getBitWidth();
1200 KnownBits Known(BitWidth);
1201
1202 if (LHS.isZero() || RHS.isZero()) {
1203 // Result is either known Zero or UB. Return Zero either way.
1204 // Checking this earlier saves us a lot of special cases later on.
1205 Known.setAllZero();
1206 return Known;
1207 }
1208
1209 std::optional<APInt> Res;
1210 if (LHS.isNegative() && RHS.isNegative()) {
1211 // Result non-negative.
1212 APInt Denom = RHS.getSignedMaxValue();
1213 APInt Num = LHS.getSignedMinValue();
1214 // INT_MIN/-1 would be a poison result (impossible). Estimate the division
1215 // as signed max (we will only set sign bit in the result).
1216 Res = (Num.isMinSignedValue() && Denom.isAllOnes())
1218 : Num.sdiv(Denom);
1219 } else if (LHS.isNegative() && RHS.isNonNegative()) {
1220 // Result is negative if Exact OR -LHS u>= RHS.
1221 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) {
1222 APInt Denom = RHS.getSignedMinValue();
1223 APInt Num = LHS.getSignedMinValue();
1224 // If the denominator may be zero, use the lowest unknown bit as the
1225 // minimum non-zero denominator, matching udiv.
1226 if (Denom.isZero())
1227 Denom.setBit(RHS.countMinTrailingZeros());
1228 Res = Num.sdiv(Denom);
1229 }
1230 } else if (LHS.isStrictlyPositive() && RHS.isNegative()) {
1231 // Result is negative if Exact OR LHS u>= -RHS.
1232 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) {
1233 APInt Denom = RHS.getSignedMaxValue();
1234 APInt Num = LHS.getSignedMaxValue();
1235 Res = Num.sdiv(Denom);
1236 }
1237 }
1238
1239 if (Res) {
1240 if (Res->isNonNegative()) {
1241 unsigned LeadZ = Res->countLeadingZeros();
1242 Known.Zero.setHighBits(LeadZ);
1243 } else {
1244 unsigned LeadO = Res->countLeadingOnes();
1245 Known.One.setHighBits(LeadO);
1246 }
1247 }
1248
1249 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1250 return Known;
1251}
1252
1253KnownBits KnownBits::udiv(const KnownBits &LHS, const KnownBits &RHS,
1254 bool Exact) {
1255 unsigned BitWidth = LHS.getBitWidth();
1256 KnownBits Known(BitWidth);
1257
1258 if (LHS.isZero() || RHS.isZero()) {
1259 // Result is either known Zero or UB. Return Zero either way.
1260 // Checking this earlier saves us a lot of special cases later on.
1261 Known.setAllZero();
1262 return Known;
1263 }
1264
1265 // A zero denominator is UB, so the minimum attainable denominator is the
1266 // smallest non-zero value consistent with the known bits.
1267 APInt MinDenom = RHS.getMinValue();
1268 if (MinDenom.isZero())
1269 MinDenom.setBit(RHS.countMinTrailingZeros());
1270
1271 // The quotient grows when the numerator grows and shrinks when the
1272 // denominator grows, and all four operand bounds are attainable, so the
1273 // result is in [MinNum / MaxDenom, MaxNum / MinDenom]. Keep the common
1274 // leading bits of the two bounds (as ConstantRange::toKnownBits does),
1275 // which can include leading ones, not just leading zeros.
1276 APInt MaxRes = LHS.getMaxValue().udiv(MinDenom);
1277 APInt MinRes = LHS.getMinValue().udiv(RHS.getMaxValue());
1278
1280 if (std::optional<unsigned> DifferentBit =
1282 Known.Zero.clearLowBits(*DifferentBit + 1);
1283 Known.One.clearLowBits(*DifferentBit + 1);
1284 }
1285
1286 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1287
1288 return Known;
1289}
1290
1291KnownBits KnownBits::remGetLowBits(const KnownBits &LHS, const KnownBits &RHS) {
1292 unsigned BitWidth = LHS.getBitWidth();
1293 if (!RHS.isZero() && RHS.Zero[0]) {
1294 // rem X, Y where Y[0:N] is zero will preserve X[0:N] in the result.
1295 unsigned RHSZeros = RHS.countMinTrailingZeros();
1296 APInt Mask = APInt::getLowBitsSet(BitWidth, RHSZeros);
1297 APInt OnesMask = LHS.One & Mask;
1298 APInt ZerosMask = LHS.Zero & Mask;
1299 return KnownBits(ZerosMask, OnesMask);
1300 }
1301 return KnownBits(BitWidth);
1302}
1303
1304KnownBits KnownBits::urem(const KnownBits &LHS, const KnownBits &RHS) {
1305 // L % R for L < R is L. (A zero divisor is UB, and if MinR is zero this
1306 // condition cannot hold anyway.)
1307 if (LHS.getMaxValue().ult(RHS.getMinValue()))
1308 return LHS;
1309
1310 KnownBits Known = remGetLowBits(LHS, RHS);
1311
1312 // L % R is at most L and, since a zero divisor is UB, strictly less than
1313 // R, so the result has at least as many leading zeros as
1314 // umin(MaxL, MaxR - 1), as in ConstantRange::urem. For a power-of-two
1315 // constant R this computes the exact L & (R - 1): remGetLowBits preserved
1316 // the low bits and this clears the bits from log2(R) up. If R is known to
1317 // be zero, MaxR - 1 wraps around, which is harmless: every input is UB.
1318 APInt MaxRes = APIntOps::umin(LHS.getMaxValue(), RHS.getMaxValue() - 1);
1319 Known.Zero.setHighBits(MaxRes.countLeadingZeros());
1320 return Known;
1321}
1322
1323KnownBits KnownBits::srem(const KnownBits &LHS, const KnownBits &RHS) {
1324 KnownBits Known = remGetLowBits(LHS, RHS);
1325 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1326 // NB: Low bits are set in `remGetLowBits`.
1327 APInt LowBits = RHS.getConstant() - 1;
1328 // If the first operand is non-negative or has all low bits zero, then
1329 // the upper bits are all zero.
1330 if (LHS.isNonNegative() || LowBits.isSubsetOf(LHS.Zero))
1331 Known.Zero |= ~LowBits;
1332
1333 // If the first operand is negative and not all low bits are zero, then
1334 // the upper bits are all one.
1335 if (LHS.isNegative() && LowBits.intersects(LHS.One))
1336 Known.One |= ~LowBits;
1337 return Known;
1338 }
1339
1340 // The sign bit is the LHS's sign bit, except when the result of the
1341 // remainder is zero. The magnitude of the result should be less than or
1342 // equal to the magnitude of either operand.
1343 if (LHS.isNegative() && Known.isNonZero())
1344 Known.One.setHighBits(
1345 std::max(LHS.countMinLeadingOnes(), RHS.countMinSignBits()));
1346 else if (LHS.isNonNegative())
1347 Known.Zero.setHighBits(
1348 std::max(LHS.countMinLeadingZeros(), RHS.countMinSignBits()));
1349 return Known;
1350}
1351
1352KnownBits &KnownBits::operator&=(const KnownBits &RHS) {
1353 // Result bit is 0 if either operand bit is 0.
1354 Zero |= RHS.Zero;
1355 // Result bit is 1 if both operand bits are 1.
1356 One &= RHS.One;
1357 return *this;
1358}
1359
1360KnownBits &KnownBits::operator|=(const KnownBits &RHS) {
1361 // Result bit is 0 if both operand bits are 0.
1362 Zero &= RHS.Zero;
1363 // Result bit is 1 if either operand bit is 1.
1364 One |= RHS.One;
1365 return *this;
1366}
1367
1368KnownBits &KnownBits::operator^=(const KnownBits &RHS) {
1369 // Result bit is 0 if both operand bits are 0 or both are 1.
1370 APInt Z = (Zero & RHS.Zero) | (One & RHS.One);
1371 // Result bit is 1 if one operand bit is 0 and the other is 1.
1372 One = (Zero & RHS.One) | (One & RHS.Zero);
1373 Zero = std::move(Z);
1374 return *this;
1375}
1376
1377KnownBits KnownBits::blsi() const {
1378 unsigned BitWidth = getBitWidth();
1379 KnownBits Known(Zero, APInt(BitWidth, 0));
1380 unsigned Max = countMaxTrailingZeros();
1381 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1382 unsigned Min = countMinTrailingZeros();
1383 if (Max == Min && Max < BitWidth)
1384 Known.One.setBit(Max);
1385 return Known;
1386}
1387
1388KnownBits KnownBits::blsmsk() const {
1389 unsigned BitWidth = getBitWidth();
1390 KnownBits Known(BitWidth);
1391 unsigned Max = countMaxTrailingZeros();
1392 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1393 unsigned Min = countMinTrailingZeros();
1394 Known.One.setLowBits(std::min(Min + 1, BitWidth));
1395 return Known;
1396}
1397
1399 unsigned BitWidth = getBitWidth();
1400 for (unsigned I = 0; I < BitWidth; ++I) {
1401 unsigned N = BitWidth - I - 1;
1402 if (Zero[N] && One[N])
1403 OS << "!";
1404 else if (Zero[N])
1405 OS << "0";
1406 else if (One[N])
1407 OS << "1";
1408 else
1409 OS << "?";
1410 }
1411}
1412
1413#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1415 print(dbgs());
1416 dbgs() << "\n";
1417}
1418#endif
1419
1420unsigned llvm::SignBitsOps::rot(unsigned SrcSignBits, unsigned BitWidth,
1421 std::optional<APInt> RotAmt,
1422 bool IsRotateRight) {
1423 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
1424 if (SrcSignBits == BitWidth)
1425 return BitWidth;
1426
1427 if (!RotAmt)
1428 return 1;
1429
1430 unsigned Amt = RotAmt->urem(BitWidth);
1431
1432 // Handle rotate right by N like a rotate left by BitWidth-N.
1433 if (IsRotateRight)
1434 Amt = (BitWidth - Amt) % BitWidth;
1435
1436 // If we aren't rotating out all of the known-in sign bits, return the
1437 // number that are left. This handles rotl(sext(x), 1) for example.
1438 if (SrcSignBits > Amt + 1)
1439 return SrcSignBits - Amt;
1440 return 1;
1441}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:690
static KnownBits avgComputeU(KnownBits LHS, KnownBits RHS, bool IsCeil)
static KnownBits computeForSatAddSub(bool Add, bool Signed, const KnownBits &LHS, const KnownBits &RHS)
static KnownBits divComputeLowBit(KnownBits Known, const KnownBits &LHS, const KnownBits &RHS, bool Exact)
static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, bool CarryZero, bool CarryOne)
Definition KnownBits.cpp:31
static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth)
#define I(x, y, z)
Definition MD5.cpp:57
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
Provides some synthesis utilities to produce sequences of values.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2009
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2093
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
LLVM_ABI APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
Definition APInt.cpp:641
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1426
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1411
LLVM_ABI uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
Definition APInt.cpp:517
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:202
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1350
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2064
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1205
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:254
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1360
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:205
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:212
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:325
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition APInt.h:1253
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1673
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1416
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1170
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
unsigned countLeadingZeros() const
Definition APInt.h:1626
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1635
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1455
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:471
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2074
bool getBoolValue() const
Convert APInt to a boolean value.
Definition APInt.h:467
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1154
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1387
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1261
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1437
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1134
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1408
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1241
void clearSignBit()
Set the sign bit to 0.
Definition APInt.h:1469
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2083
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
LLVM_ABI std::optional< unsigned > GetMostSignificantDifferentBit(const APInt &A, const APInt &B)
Compare two values, and if they are different, return the position of the most significant bit that i...
Definition APInt.cpp:3036
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3226
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3235
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
Definition APInt.h:2284
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3217
LLVM_ABI unsigned rot(unsigned SrcSignBits, unsigned BitWidth, std::optional< APInt > RotAmt, bool IsRotateRight)
Compute the number of sign bits after rotating a value.
This is an optimization pass for GlobalISel generic memory operations.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:339
@ Known
Known to have no common set bits.
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
unsigned M1(unsigned Val)
Definition VE.h:377
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:326
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
int countl_one(T Value)
Count the number of ones from the most significant bit to the first zero bit.
Definition bit.h:302
@ Add
Sum of integers.
unsigned M0(unsigned Val)
Definition VE.h:376
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
static LLVM_ABI std::optional< bool > eq(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_EQ result.
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
LLVM_ABI KnownBits blsi() const
Compute known bits for X & -X, which has only the lowest bit set of X set.
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinLeadingOnes() const
Returns the minimum number of leading one bits.
Definition KnownBits.h:265
LLVM_ABI KnownBits reduceAdd(unsigned NumElts) const
Compute known bits for horizontal add for a vector with NumElts elements, where each element has the ...
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
LLVM_ABI KnownBits makeGE(const APInt &Val) const
Return KnownBits based on this, but updated given that the underlying value is known to be greater th...
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:152
LLVM_ABI KnownBits blsmsk() const
Compute known bits for X ^ (X - 1), which has all bits up to and including the lowest set bit of X se...
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:97
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
bool hasConflict() const
Returns true if there is conflicting information.
Definition KnownBits.h:51
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
static LLVM_ABI std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
LLVM_ABI KnownBits & operator|=(const KnownBits &RHS)
Update known bits based on ORing with RHS.
LLVM_ABI void print(raw_ostream &OS) const
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
LLVM_DUMP_METHOD void dump() const
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:325
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
KnownBits()=default
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
LLVM_ABI KnownBits & operator&=(const KnownBits &RHS)
Update known bits based on ANDing with RHS.
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
static LLVM_ABI std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:130
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition KnownBits.cpp:61
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static LLVM_ABI std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
LLVM_ABI KnownBits truncSSat(unsigned BitWidth) const
Truncate with signed saturation (signed input -> signed output)
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
static LLVM_ABI std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
LLVM_ABI KnownBits truncUSat(unsigned BitWidth) const
Truncate with unsigned saturation (unsigned input -> unsigned output)
static LLVM_ABI std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:136
LLVM_ABI KnownBits & operator^=(const KnownBits &RHS)
Update known bits based on XORing with RHS.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
LLVM_ABI KnownBits truncSSatU(unsigned BitWidth) const
Truncate with signed saturation to unsigned (signed input -> unsigned output)
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:58