LLVM 23.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)) {
169 Known = trunc(BitWidth);
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)) {
235 Known = trunc(BitWidth);
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)) {
270 Known = trunc(BitWidth);
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 // Flip the range of values: [-0x80000000, 0x7FFFFFFF] <-> [0xFFFFFFFF, 0]
339 auto Flip = [](const KnownBits &Val) {
340 unsigned SignBitPosition = Val.getBitWidth() - 1;
341 APInt Zero = Val.One;
342 APInt One = Val.Zero;
343 Zero.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]);
344 One.setBitVal(SignBitPosition, Val.One[SignBitPosition]);
345 return KnownBits(Zero, One);
346 };
347 return Flip(umax(Flip(LHS), Flip(RHS)));
348}
349
350KnownBits KnownBits::abdu(const KnownBits &LHS, const KnownBits &RHS) {
351 // If we know which argument is larger, return (sub LHS, RHS) or
352 // (sub RHS, LHS) directly.
353 if (LHS.getMinValue().uge(RHS.getMaxValue()))
354 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS,
355 RHS);
356 if (RHS.getMinValue().uge(LHS.getMaxValue()))
357 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, RHS,
358 LHS);
359
360 // By construction, the subtraction in abdu never has unsigned overflow.
361 // Find the common bits between (sub nuw LHS, RHS) and (sub nuw RHS, LHS).
362 KnownBits Diff0 =
363 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS);
364 KnownBits Diff1 =
365 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS);
366 return Diff0.intersectWith(Diff1);
367}
368
369KnownBits KnownBits::abds(KnownBits LHS, KnownBits RHS) {
370 // If we know which argument is larger, return (sub LHS, RHS) or
371 // (sub RHS, LHS) directly.
372 if (LHS.getSignedMinValue().sge(RHS.getSignedMaxValue()))
373 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS,
374 RHS);
375 if (RHS.getSignedMinValue().sge(LHS.getSignedMaxValue()))
376 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, RHS,
377 LHS);
378
379 // Shift both arguments from the signed range to the unsigned range, e.g. from
380 // [-0x80, 0x7F] to [0, 0xFF]. This allows us to use "sub nuw" below just like
381 // abdu does.
382 // Note that we can't just use "sub nsw" instead because abds has signed
383 // inputs but an unsigned result, which makes the overflow conditions
384 // different.
385 unsigned SignBitPosition = LHS.getBitWidth() - 1;
386 for (auto Arg : {&LHS, &RHS}) {
387 bool Tmp = Arg->Zero[SignBitPosition];
388 Arg->Zero.setBitVal(SignBitPosition, Arg->One[SignBitPosition]);
389 Arg->One.setBitVal(SignBitPosition, Tmp);
390 }
391
392 // Find the common bits between (sub nuw LHS, RHS) and (sub nuw RHS, LHS).
393 KnownBits Diff0 =
394 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS);
395 KnownBits Diff1 =
396 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS);
397 return Diff0.intersectWith(Diff1);
398}
399
400static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth) {
402 return MaxValue.extractBitsAsZExtValue(Log2_32(BitWidth), 0);
403 // This is only an approximate upper bound.
404 return MaxValue.getLimitedValue(BitWidth - 1);
405}
406
407KnownBits KnownBits::shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW,
408 bool NSW, bool ShAmtNonZero) {
409 unsigned BitWidth = LHS.getBitWidth();
410 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
411 KnownBits Known;
412 bool ShiftedOutZero, ShiftedOutOne;
413 Known.Zero = LHS.Zero.ushl_ov(ShiftAmt, ShiftedOutZero);
414 Known.Zero.setLowBits(ShiftAmt);
415 Known.One = LHS.One.ushl_ov(ShiftAmt, ShiftedOutOne);
416
417 // All cases returning poison have been handled by MaxShiftAmount already.
418 if (NSW) {
419 if (NUW && ShiftAmt != 0)
420 // NUW means we can assume anything shifted out was a zero.
421 ShiftedOutZero = true;
422
423 if (ShiftedOutZero)
424 Known.makeNonNegative();
425 else if (ShiftedOutOne)
426 Known.makeNegative();
427 }
428 return Known;
429 };
430
431 // Fast path for a common case when LHS is completely unknown.
432 KnownBits Known(BitWidth);
433 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
434 if (MinShiftAmount == 0 && ShAmtNonZero)
435 MinShiftAmount = 1;
436 if (LHS.isUnknown()) {
437 Known.Zero.setLowBits(MinShiftAmount);
438 if (NUW && NSW && MinShiftAmount != 0)
439 Known.makeNonNegative();
440 return Known;
441 }
442
443 // Determine maximum shift amount, taking NUW/NSW flags into account.
444 APInt MaxValue = RHS.getMaxValue();
445 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
446 if (NUW && NSW)
447 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1);
448 if (NUW)
449 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros());
450 if (NSW)
451 MaxShiftAmount = std::min(
452 MaxShiftAmount,
453 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1);
454
455 // Fast path for common case where the shift amount is unknown.
456 if (MinShiftAmount == 0 && MaxShiftAmount == BitWidth - 1 &&
458 Known.Zero.setLowBits(LHS.countMinTrailingZeros());
459 if (LHS.isAllOnes())
460 Known.One.setSignBit();
461 if (NSW) {
462 if (LHS.isNonNegative())
463 Known.makeNonNegative();
464 if (LHS.isNegative())
465 Known.makeNegative();
466 }
467 return Known;
468 }
469
470 // Find the common bits from all possible shifts.
471 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
472 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
473 Known.setAllConflict();
474 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
475 ++ShiftAmt) {
476 // Skip if the shift amount is impossible.
477 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
478 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
479 continue;
480 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
481 if (Known.isUnknown())
482 break;
483 }
484
485 // All shift amounts may result in poison.
486 if (Known.hasConflict())
487 Known.setAllZero();
488 return Known;
489}
490
491KnownBits KnownBits::lshr(const KnownBits &LHS, const KnownBits &RHS,
492 bool ShAmtNonZero, bool Exact) {
493 unsigned BitWidth = LHS.getBitWidth();
494 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
495 KnownBits Known = LHS;
496 Known >>= ShiftAmt;
497 // High bits are known zero.
498 Known.Zero.setHighBits(ShiftAmt);
499 return Known;
500 };
501
502 // Fast path for a common case when LHS is completely unknown.
503 KnownBits Known(BitWidth);
504 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
505 if (MinShiftAmount == 0 && ShAmtNonZero)
506 MinShiftAmount = 1;
507 if (LHS.isUnknown()) {
508 Known.Zero.setHighBits(MinShiftAmount);
509 return Known;
510 }
511
512 // Find the common bits from all possible shifts.
513 APInt MaxValue = RHS.getMaxValue();
514 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
515
516 // If exact, bound MaxShiftAmount to first known 1 in LHS.
517 if (Exact) {
518 unsigned FirstOne = LHS.countMaxTrailingZeros();
519 if (FirstOne < MinShiftAmount) {
520 // Always poison. Return zero because we don't like returning conflict.
521 Known.setAllZero();
522 return Known;
523 }
524 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
525 }
526
527 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
528 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
529 Known.setAllConflict();
530 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
531 ++ShiftAmt) {
532 // Skip if the shift amount is impossible.
533 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
534 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
535 continue;
536 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
537 if (Known.isUnknown())
538 break;
539 }
540
541 // All shift amounts may result in poison.
542 if (Known.hasConflict())
543 Known.setAllZero();
544 return Known;
545}
546
547KnownBits KnownBits::ashr(const KnownBits &LHS, const KnownBits &RHS,
548 bool ShAmtNonZero, bool Exact) {
549 unsigned BitWidth = LHS.getBitWidth();
550 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
551 KnownBits Known = LHS;
552 Known.Zero.ashrInPlace(ShiftAmt);
553 Known.One.ashrInPlace(ShiftAmt);
554 return Known;
555 };
556
557 // Fast path for a common case when LHS is completely unknown.
558 KnownBits Known(BitWidth);
559 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
560 if (MinShiftAmount == 0 && ShAmtNonZero)
561 MinShiftAmount = 1;
562 if (LHS.isUnknown()) {
563 if (MinShiftAmount == BitWidth) {
564 // Always poison. Return zero because we don't like returning conflict.
565 Known.setAllZero();
566 return Known;
567 }
568 return Known;
569 }
570
571 // Find the common bits from all possible shifts.
572 APInt MaxValue = RHS.getMaxValue();
573 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
574
575 // If exact, bound MaxShiftAmount to first known 1 in LHS.
576 if (Exact) {
577 unsigned FirstOne = LHS.countMaxTrailingZeros();
578 if (FirstOne < MinShiftAmount) {
579 // Always poison. Return zero because we don't like returning conflict.
580 Known.setAllZero();
581 return Known;
582 }
583 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
584 }
585
586 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
587 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
588 Known.setAllConflict();
589 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
590 ++ShiftAmt) {
591 // Skip if the shift amount is impossible.
592 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
593 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
594 continue;
595 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
596 if (Known.isUnknown())
597 break;
598 }
599
600 // All shift amounts may result in poison.
601 if (Known.hasConflict())
602 Known.setAllZero();
603 return Known;
604}
605
606KnownBits KnownBits::fshl(const KnownBits &LHS, const KnownBits &RHS,
607 const APInt &Amt) {
608 return KnownBits(APIntOps::fshl(LHS.Zero, RHS.Zero, Amt),
609 APIntOps::fshl(LHS.One, RHS.One, Amt));
610}
611
612KnownBits KnownBits::fshr(const KnownBits &LHS, const KnownBits &RHS,
613 const APInt &Amt) {
614 return KnownBits(APIntOps::fshr(LHS.Zero, RHS.Zero, Amt),
615 APIntOps::fshr(LHS.One, RHS.One, Amt));
616}
617
618KnownBits KnownBits::clmul(const KnownBits &LHS, const KnownBits &RHS) {
619 KnownBits Res =
620 makeConstant(APIntOps::clmul(LHS.getMinValue(), RHS.getMinValue()));
621
622 // This is the same operation as clmul except it accumulates the result with
623 // an OR instead of an XOR.
624 auto ClMulOr = [](const APInt &LHS, const APInt &RHS) {
625 unsigned BW = LHS.getBitWidth();
626 assert(BW == RHS.getBitWidth() && "Operand mismatch");
627 APInt Result(BW, 0);
628 for (unsigned I :
629 seq(std::min(RHS.getActiveBits(), BW - LHS.countr_zero())))
630 if (RHS[I])
631 Result |= LHS << I;
632 return Result;
633 };
634
635 // Bits in the result are known if, for every corresponding pair of input
636 // bits, both input bits are known or either input bit is known to be zero.
637 APInt Known = ~(ClMulOr(~LHS.Zero & ~LHS.One, ~RHS.Zero) |
638 ClMulOr(~LHS.Zero, ~RHS.Zero & ~RHS.One));
639 Res.Zero &= Known;
640 Res.One &= Known;
641
642 return Res;
643}
644
645std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) {
646 if (LHS.isConstant() && RHS.isConstant())
647 return LHS.getConstant() == RHS.getConstant();
648 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero))
649 return false;
650 return std::nullopt;
651}
652
653std::optional<bool> KnownBits::ne(const KnownBits &LHS, const KnownBits &RHS) {
654 if (std::optional<bool> KnownEQ = eq(LHS, RHS))
655 return !*KnownEQ;
656 return std::nullopt;
657}
658
659std::optional<bool> KnownBits::ugt(const KnownBits &LHS, const KnownBits &RHS) {
660 // LHS >u RHS -> false if umax(LHS) <= umax(RHS)
661 if (LHS.getMaxValue().ule(RHS.getMinValue()))
662 return false;
663 // LHS >u RHS -> true if umin(LHS) > umax(RHS)
664 if (LHS.getMinValue().ugt(RHS.getMaxValue()))
665 return true;
666 return std::nullopt;
667}
668
669std::optional<bool> KnownBits::uge(const KnownBits &LHS, const KnownBits &RHS) {
670 if (std::optional<bool> IsUGT = ugt(RHS, LHS))
671 return !*IsUGT;
672 return std::nullopt;
673}
674
675std::optional<bool> KnownBits::ult(const KnownBits &LHS, const KnownBits &RHS) {
676 return ugt(RHS, LHS);
677}
678
679std::optional<bool> KnownBits::ule(const KnownBits &LHS, const KnownBits &RHS) {
680 return uge(RHS, LHS);
681}
682
683std::optional<bool> KnownBits::sgt(const KnownBits &LHS, const KnownBits &RHS) {
684 // LHS >s RHS -> false if smax(LHS) <= smax(RHS)
685 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue()))
686 return false;
687 // LHS >s RHS -> true if smin(LHS) > smax(RHS)
688 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue()))
689 return true;
690 return std::nullopt;
691}
692
693std::optional<bool> KnownBits::sge(const KnownBits &LHS, const KnownBits &RHS) {
694 if (std::optional<bool> KnownSGT = sgt(RHS, LHS))
695 return !*KnownSGT;
696 return std::nullopt;
697}
698
699std::optional<bool> KnownBits::slt(const KnownBits &LHS, const KnownBits &RHS) {
700 return sgt(RHS, LHS);
701}
702
703std::optional<bool> KnownBits::sle(const KnownBits &LHS, const KnownBits &RHS) {
704 return sge(RHS, LHS);
705}
706
707KnownBits KnownBits::abs(bool IntMinIsPoison) const {
708 // If the source's MSB is zero then we know the rest of the bits already.
709 if (isNonNegative())
710 return *this;
711
712 // Absolute value preserves trailing zero count.
713 KnownBits KnownAbs(getBitWidth());
714
715 // If the input is negative, then abs(x) == -x.
716 if (isNegative()) {
717 KnownBits Tmp = *this;
718 // Special case for IntMinIsPoison. We know the sign bit is set and we know
719 // all the rest of the bits except one to be zero. Since we have
720 // IntMinIsPoison, that final bit MUST be a one, as otherwise the input is
721 // INT_MIN.
722 if (IntMinIsPoison && (Zero.popcount() + 2) == getBitWidth())
724
725 KnownAbs = computeForAddSub(
726 /*Add*/ false, IntMinIsPoison, /*NUW=*/false,
728
729 // One more special case for IntMinIsPoison. If we don't know any ones other
730 // than the signbit, we know for certain that all the unknowns can't be
731 // zero. So if we know high zero bits, but have unknown low bits, we know
732 // for certain those high-zero bits will end up as one. This is because,
733 // the low bits can't be all zeros, so the +1 in (~x + 1) cannot carry up
734 // to the high bits. If we know a known INT_MIN input skip this. The result
735 // is poison anyways.
736 if (IntMinIsPoison && Tmp.countMinPopulation() == 1 &&
737 Tmp.countMaxPopulation() != 1) {
738 Tmp.One.clearSignBit();
739 Tmp.Zero.setSignBit();
740 KnownAbs.One.setBits(getBitWidth() - Tmp.countMinLeadingZeros(),
741 getBitWidth() - 1);
742 }
743
744 } else {
745 unsigned MaxTZ = countMaxTrailingZeros();
746 unsigned MinTZ = countMinTrailingZeros();
747
748 KnownAbs.Zero.setLowBits(MinTZ);
749 // If we know the lowest set 1, then preserve it.
750 if (MaxTZ == MinTZ && MaxTZ < getBitWidth())
751 KnownAbs.One.setBit(MaxTZ);
752
753 // We only know that the absolute values's MSB will be zero if INT_MIN is
754 // poison, or there is a set bit that isn't the sign bit (otherwise it could
755 // be INT_MIN).
756 if (IntMinIsPoison || (!One.isZero() && !One.isMinSignedValue())) {
757 KnownAbs.One.clearSignBit();
758 KnownAbs.Zero.setSignBit();
759 }
760 }
761
762 return KnownAbs;
763}
764
765KnownBits KnownBits::reduceAdd(unsigned NumElts) const {
766 if (NumElts == 0)
767 return KnownBits(getBitWidth());
768
769 unsigned BitWidth = getBitWidth();
770 KnownBits Result(BitWidth);
771
772 if (isConstant())
773 // If all elements are the same constant, we can simply compute it
774 return KnownBits::makeConstant(NumElts * getConstant());
775
776 // The main idea is as follows.
777 //
778 // If KnownBits for each element has L leading zeros then
779 // X_i < 2^(W - L) for every i from [1, N].
780 //
781 // ADD X_i <= ADD max(X_i) = N * max(X_i)
782 // < N * 2^(W - L)
783 // < 2^(W - L + ceil(log2(N)))
784 //
785 // As the result, we can conclude that
786 //
787 // L' = L - ceil(log2(N))
788 //
789 // Similar logic can be applied to leading ones.
790 unsigned LostBits = Log2_32_Ceil(NumElts);
791
792 if (isNonNegative()) {
793 unsigned LeadingZeros = countMinLeadingZeros();
794 LeadingZeros = LeadingZeros > LostBits ? LeadingZeros - LostBits : 0;
795 Result.Zero.setHighBits(LeadingZeros);
796 } else if (isNegative()) {
797 unsigned LeadingOnes = countMinLeadingOnes();
798 LeadingOnes = LeadingOnes > LostBits ? LeadingOnes - LostBits : 0;
799 Result.One.setHighBits(LeadingOnes);
800 }
801
802 return Result;
803}
804
806 const KnownBits &LHS,
807 const KnownBits &RHS) {
808 // We don't see NSW even for sadd/ssub as we want to check if the result has
809 // signed overflow.
810 unsigned BitWidth = LHS.getBitWidth();
811
812 std::optional<bool> Overflow;
813 // Even if we can't entirely rule out overflow, we may be able to rule out
814 // overflow in one direction. This allows us to potentially keep some of the
815 // add/sub bits. I.e if we can't overflow in the positive direction we won't
816 // clamp to INT_MAX so we can keep low 0s from the add/sub result.
817 bool MayNegClamp = true;
818 bool MayPosClamp = true;
819 if (Signed) {
820 // Easy cases we can rule out any overflow.
821 if (Add && ((LHS.isNegative() && RHS.isNonNegative()) ||
822 (LHS.isNonNegative() && RHS.isNegative())))
823 Overflow = false;
824 else if (!Add && (((LHS.isNegative() && RHS.isNegative()) ||
825 (LHS.isNonNegative() && RHS.isNonNegative()))))
826 Overflow = false;
827 else {
828 // Check if we may overflow. If we can't rule out overflow then check if
829 // we can rule out a direction at least.
830 KnownBits UnsignedLHS = LHS;
831 KnownBits UnsignedRHS = RHS;
832 // Get version of LHS/RHS with clearer signbit. This allows us to detect
833 // how the addition/subtraction might overflow into the signbit. Then
834 // using the actual known signbits of LHS/RHS, we can figure out which
835 // overflows are/aren't possible.
836 UnsignedLHS.One.clearSignBit();
837 UnsignedLHS.Zero.setSignBit();
838 UnsignedRHS.One.clearSignBit();
839 UnsignedRHS.Zero.setSignBit();
840 KnownBits Res =
841 KnownBits::computeForAddSub(Add, /*NSW=*/false,
842 /*NUW=*/false, UnsignedLHS, UnsignedRHS);
843 if (Add) {
844 if (Res.isNegative()) {
845 // Only overflow scenario is Pos + Pos.
846 MayNegClamp = false;
847 // Pos + Pos will overflow with extra signbit.
848 if (LHS.isNonNegative() && RHS.isNonNegative())
849 Overflow = true;
850 } else if (Res.isNonNegative()) {
851 // Only overflow scenario is Neg + Neg
852 MayPosClamp = false;
853 // Neg + Neg will overflow without extra signbit.
854 if (LHS.isNegative() && RHS.isNegative())
855 Overflow = true;
856 }
857 // We will never clamp to the opposite sign of N-bit result.
858 if (LHS.isNegative() || RHS.isNegative())
859 MayPosClamp = false;
860 if (LHS.isNonNegative() || RHS.isNonNegative())
861 MayNegClamp = false;
862 } else {
863 if (Res.isNegative()) {
864 // Only overflow scenario is Neg - Pos.
865 MayPosClamp = false;
866 // Neg - Pos will overflow with extra signbit.
867 if (LHS.isNegative() && RHS.isNonNegative())
868 Overflow = true;
869 } else if (Res.isNonNegative()) {
870 // Only overflow scenario is Pos - Neg.
871 MayNegClamp = false;
872 // Pos - Neg will overflow without extra signbit.
873 if (LHS.isNonNegative() && RHS.isNegative())
874 Overflow = true;
875 }
876 // We will never clamp to the opposite sign of N-bit result.
877 if (LHS.isNegative() || RHS.isNonNegative())
878 MayPosClamp = false;
879 if (LHS.isNonNegative() || RHS.isNegative())
880 MayNegClamp = false;
881 }
882 }
883 // If we have ruled out all clamping, we will never overflow.
884 if (!MayNegClamp && !MayPosClamp)
885 Overflow = false;
886 } else if (Add) {
887 // uadd.sat
888 bool Of;
889 (void)LHS.getMaxValue().uadd_ov(RHS.getMaxValue(), Of);
890 if (!Of) {
891 Overflow = false;
892 } else {
893 (void)LHS.getMinValue().uadd_ov(RHS.getMinValue(), Of);
894 if (Of)
895 Overflow = true;
896 }
897 } else {
898 // usub.sat
899 bool Of;
900 (void)LHS.getMinValue().usub_ov(RHS.getMaxValue(), Of);
901 if (!Of) {
902 Overflow = false;
903 } else {
904 (void)LHS.getMaxValue().usub_ov(RHS.getMinValue(), Of);
905 if (Of)
906 Overflow = true;
907 }
908 }
909
911 /*NUW=*/!Signed, LHS, RHS);
912
913 if (Overflow) {
914 // We know whether or not we overflowed.
915 if (!(*Overflow)) {
916 // No overflow.
917 return Res;
918 }
919
920 // We overflowed
921 APInt C;
922 if (Signed) {
923 // sadd.sat / ssub.sat
924 assert(!LHS.isSignUnknown() &&
925 "We somehow know overflow without knowing input sign");
926 C = LHS.isNegative() ? APInt::getSignedMinValue(BitWidth)
928 } else if (Add) {
929 // uadd.sat
931 } else {
932 // uadd.sat
934 }
935
936 Res.One = C;
937 Res.Zero = ~C;
938 return Res;
939 }
940
941 // We don't know if we overflowed.
942 if (Signed) {
943 // sadd.sat/ssub.sat
944 // We can keep our information about the sign bits.
945 if (MayPosClamp)
946 Res.Zero.clearLowBits(BitWidth - 1);
947 if (MayNegClamp)
948 Res.One.clearLowBits(BitWidth - 1);
949 } else if (Add) {
950 // uadd.sat
951 // We need to clear all the known zeros as we can only use the leading ones.
952 Res.Zero.clearAllBits();
953 } else {
954 // usub.sat
955 // We need to clear all the known ones as we can only use the leading zero.
956 Res.One.clearAllBits();
957 }
958
959 return Res;
960}
961
962KnownBits KnownBits::sadd_sat(const KnownBits &LHS, const KnownBits &RHS) {
963 return computeForSatAddSub(/*Add*/ true, /*Signed*/ true, LHS, RHS);
964}
965KnownBits KnownBits::ssub_sat(const KnownBits &LHS, const KnownBits &RHS) {
966 return computeForSatAddSub(/*Add*/ false, /*Signed*/ true, LHS, RHS);
967}
968KnownBits KnownBits::uadd_sat(const KnownBits &LHS, const KnownBits &RHS) {
969 return computeForSatAddSub(/*Add*/ true, /*Signed*/ false, LHS, RHS);
970}
971KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) {
972 return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS);
973}
974
976 unsigned BitWidth = LHS.getBitWidth();
977 LHS = LHS.zext(BitWidth + 1);
978 RHS = RHS.zext(BitWidth + 1);
979 LHS =
980 computeForAddCarry(LHS, RHS, /*CarryZero*/ !IsCeil, /*CarryOne*/ IsCeil);
981 LHS = LHS.extractBits(BitWidth, 1);
982 return LHS;
983}
984
985KnownBits KnownBits::avgFloorS(const KnownBits &LHS, const KnownBits &RHS) {
986 return flipSignBit(avgFloorU(flipSignBit(LHS), flipSignBit(RHS)));
987}
988
989KnownBits KnownBits::avgFloorU(const KnownBits &LHS, const KnownBits &RHS) {
990 return avgComputeU(LHS, RHS, /*IsCeil=*/false);
991}
992
993KnownBits KnownBits::avgCeilS(const KnownBits &LHS, const KnownBits &RHS) {
994 return flipSignBit(avgCeilU(flipSignBit(LHS), flipSignBit(RHS)));
995}
996
997KnownBits KnownBits::avgCeilU(const KnownBits &LHS, const KnownBits &RHS) {
998 return avgComputeU(LHS, RHS, /*IsCeil=*/true);
999}
1000
1001KnownBits KnownBits::mul(const KnownBits &LHS, const KnownBits &RHS,
1002 bool NoUndefSelfMultiply) {
1003 unsigned BitWidth = LHS.getBitWidth();
1004 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1005 assert((!NoUndefSelfMultiply || LHS == RHS) &&
1006 "Self multiplication knownbits mismatch");
1007
1008 // Compute the high known-0 bits by multiplying the unsigned max of each side.
1009 // Conservatively, M active bits * N active bits results in M + N bits in the
1010 // result. But if we know a value is a power-of-2 for example, then this
1011 // computes one more leading zero.
1012 // TODO: This could be generalized to number of sign bits (negative numbers).
1013 APInt UMaxLHS = LHS.getMaxValue();
1014 APInt UMaxRHS = RHS.getMaxValue();
1015
1016 // For leading zeros in the result to be valid, the unsigned max product must
1017 // fit in the bitwidth (it must not overflow).
1018 bool HasOverflow;
1019 APInt UMaxResult = UMaxLHS.umul_ov(UMaxRHS, HasOverflow);
1020 unsigned LeadZ = HasOverflow ? 0 : UMaxResult.countl_zero();
1021
1022 // The result of the bottom bits of an integer multiply can be
1023 // inferred by looking at the bottom bits of both operands and
1024 // multiplying them together.
1025 // We can infer at least the minimum number of known trailing bits
1026 // of both operands. Depending on number of trailing zeros, we can
1027 // infer more bits, because (a*b) <=> ((a/m) * (b/n)) * (m*n) assuming
1028 // a and b are divisible by m and n respectively.
1029 // We then calculate how many of those bits are inferrable and set
1030 // the output. For example, the i8 mul:
1031 // a = XXXX1100 (12)
1032 // b = XXXX1110 (14)
1033 // We know the bottom 3 bits are zero since the first can be divided by
1034 // 4 and the second by 2, thus having ((12/4) * (14/2)) * (2*4).
1035 // Applying the multiplication to the trimmed arguments gets:
1036 // XX11 (3)
1037 // X111 (7)
1038 // -------
1039 // XX11
1040 // XX11
1041 // XX11
1042 // XX11
1043 // -------
1044 // XXXXX01
1045 // Which allows us to infer the 2 LSBs. Since we're multiplying the result
1046 // by 8, the bottom 3 bits will be 0, so we can infer a total of 5 bits.
1047 // The proof for this can be described as:
1048 // Pre: (C1 >= 0) && (C1 < (1 << C5)) && (C2 >= 0) && (C2 < (1 << C6)) &&
1049 // (C7 == (1 << (umin(countTrailingZeros(C1), C5) +
1050 // umin(countTrailingZeros(C2), C6) +
1051 // umin(C5 - umin(countTrailingZeros(C1), C5),
1052 // C6 - umin(countTrailingZeros(C2), C6)))) - 1)
1053 // %aa = shl i8 %a, C5
1054 // %bb = shl i8 %b, C6
1055 // %aaa = or i8 %aa, C1
1056 // %bbb = or i8 %bb, C2
1057 // %mul = mul i8 %aaa, %bbb
1058 // %mask = and i8 %mul, C7
1059 // =>
1060 // %mask = i8 ((C1*C2)&C7)
1061 // Where C5, C6 describe the known bits of %a, %b
1062 // C1, C2 describe the known bottom bits of %a, %b.
1063 // C7 describes the mask of the known bits of the result.
1064
1065 // How many times we'd be able to divide each argument by 2 (shr by 1).
1066 // This gives us the number of trailing zeros on the multiplication result.
1067 unsigned TrailBitsKnownLHS = (LHS.Zero | LHS.One).countr_one();
1068 unsigned TrailBitsKnownRHS = (RHS.Zero | RHS.One).countr_one();
1069 unsigned TrailZeroLHS = LHS.countMinTrailingZeros();
1070 unsigned TrailZeroRHS = RHS.countMinTrailingZeros();
1071 unsigned TrailZ = TrailZeroLHS + TrailZeroRHS;
1072
1073 // Figure out the fewest known-bits operand.
1074 unsigned SmallestOperand = std::min(TrailBitsKnownLHS - TrailZeroLHS,
1075 TrailBitsKnownRHS - TrailZeroRHS);
1076 unsigned ResultBitsKnown = std::min(SmallestOperand + TrailZ, BitWidth);
1077
1078 // The lower ResultBitsKnown bits of this are known.
1079 APInt BottomKnown = LHS.One * RHS.One;
1080
1081 KnownBits Res(BitWidth);
1082 Res.Zero.setHighBits(LeadZ);
1083 Res.Zero |= (~BottomKnown).getLoBits(ResultBitsKnown);
1084 Res.One = BottomKnown.getLoBits(ResultBitsKnown);
1085
1086 if (NoUndefSelfMultiply) {
1087 // If X has at least TZ trailing zeroes, then bit (2 * TZ + 1) must be zero.
1088 unsigned TwoTZP1 = 2 * TrailZeroLHS + 1;
1089 if (TwoTZP1 < BitWidth)
1090 Res.Zero.setBit(TwoTZP1);
1091
1092 // If X has exactly TZ trailing zeros, then bit (2 * TZ + 2) must also be
1093 // zero.
1094 if (TrailZeroLHS < BitWidth && LHS.One[TrailZeroLHS]) {
1095 unsigned TwoTZP2 = TwoTZP1 + 1;
1096 if (TwoTZP2 < BitWidth)
1097 Res.Zero.setBit(TwoTZP2);
1098 }
1099 }
1100
1101 return Res;
1102}
1103
1104KnownBits KnownBits::mulhs(const KnownBits &LHS, const KnownBits &RHS) {
1105 unsigned BitWidth = LHS.getBitWidth();
1106 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1107 KnownBits WideLHS = LHS.sext(2 * BitWidth);
1108 KnownBits WideRHS = RHS.sext(2 * BitWidth);
1109 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
1110}
1111
1112KnownBits KnownBits::mulhu(const KnownBits &LHS, const KnownBits &RHS) {
1113 unsigned BitWidth = LHS.getBitWidth();
1114 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
1115 KnownBits WideLHS = LHS.zext(2 * BitWidth);
1116 KnownBits WideRHS = RHS.zext(2 * BitWidth);
1117 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
1118}
1119
1121 const KnownBits &RHS, bool Exact) {
1122
1123 if (!Exact)
1124 return Known;
1125
1126 // If LHS is Odd, the result is Odd no matter what.
1127 // Odd / Odd -> Odd
1128 // Odd / Even -> Impossible (because its exact division)
1129 if (LHS.One[0])
1130 Known.One.setBit(0);
1131
1132 int MinTZ =
1133 (int)LHS.countMinTrailingZeros() - (int)RHS.countMaxTrailingZeros();
1134 int MaxTZ =
1135 (int)LHS.countMaxTrailingZeros() - (int)RHS.countMinTrailingZeros();
1136 if (MinTZ >= 0) {
1137 // Result has at least MinTZ trailing zeros.
1138 Known.Zero.setLowBits(MinTZ);
1139 if (MinTZ == MaxTZ) {
1140 // Result has exactly MinTZ trailing zeros.
1141 Known.One.setBit(MinTZ);
1142 }
1143 } else if (MaxTZ < 0) {
1144 // Poison Result
1145 Known.setAllZero();
1146 }
1147
1148 // In the KnownBits exhaustive tests, we have poison inputs for exact values
1149 // a LOT. If we have a conflict, just return all zeros.
1150 if (Known.hasConflict())
1151 Known.setAllZero();
1152
1153 return Known;
1154}
1155
1156KnownBits KnownBits::sdiv(const KnownBits &LHS, const KnownBits &RHS,
1157 bool Exact) {
1158 // Equivalent of `udiv`. We must have caught this before it was folded.
1159 if (LHS.isNonNegative() && RHS.isNonNegative())
1160 return udiv(LHS, RHS, Exact);
1161
1162 unsigned BitWidth = LHS.getBitWidth();
1163 KnownBits Known(BitWidth);
1164
1165 if (LHS.isZero() || RHS.isZero()) {
1166 // Result is either known Zero or UB. Return Zero either way.
1167 // Checking this earlier saves us a lot of special cases later on.
1168 Known.setAllZero();
1169 return Known;
1170 }
1171
1172 std::optional<APInt> Res;
1173 if (LHS.isNegative() && RHS.isNegative()) {
1174 // Result non-negative.
1175 APInt Denom = RHS.getSignedMaxValue();
1176 APInt Num = LHS.getSignedMinValue();
1177 // INT_MIN/-1 would be a poison result (impossible). Estimate the division
1178 // as signed max (we will only set sign bit in the result).
1179 Res = (Num.isMinSignedValue() && Denom.isAllOnes())
1181 : Num.sdiv(Denom);
1182 } else if (LHS.isNegative() && RHS.isNonNegative()) {
1183 // Result is negative if Exact OR -LHS u>= RHS.
1184 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) {
1185 APInt Denom = RHS.getSignedMinValue();
1186 APInt Num = LHS.getSignedMinValue();
1187 Res = Denom.isZero() ? Num : Num.sdiv(Denom);
1188 }
1189 } else if (LHS.isStrictlyPositive() && RHS.isNegative()) {
1190 // Result is negative if Exact OR LHS u>= -RHS.
1191 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) {
1192 APInt Denom = RHS.getSignedMaxValue();
1193 APInt Num = LHS.getSignedMaxValue();
1194 Res = Num.sdiv(Denom);
1195 }
1196 }
1197
1198 if (Res) {
1199 if (Res->isNonNegative()) {
1200 unsigned LeadZ = Res->countLeadingZeros();
1201 Known.Zero.setHighBits(LeadZ);
1202 } else {
1203 unsigned LeadO = Res->countLeadingOnes();
1204 Known.One.setHighBits(LeadO);
1205 }
1206 }
1207
1208 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1209 return Known;
1210}
1211
1212KnownBits KnownBits::udiv(const KnownBits &LHS, const KnownBits &RHS,
1213 bool Exact) {
1214 unsigned BitWidth = LHS.getBitWidth();
1215 KnownBits Known(BitWidth);
1216
1217 if (LHS.isZero() || RHS.isZero()) {
1218 // Result is either known Zero or UB. Return Zero either way.
1219 // Checking this earlier saves us a lot of special cases later on.
1220 Known.setAllZero();
1221 return Known;
1222 }
1223
1224 // We can figure out the minimum number of upper zero bits by doing
1225 // MaxNumerator / MinDenominator. If the Numerator gets smaller or Denominator
1226 // gets larger, the number of upper zero bits increases.
1227 APInt MinDenom = RHS.getMinValue();
1228 APInt MaxNum = LHS.getMaxValue();
1229 APInt MaxRes = MinDenom.isZero() ? MaxNum : MaxNum.udiv(MinDenom);
1230
1231 unsigned LeadZ = MaxRes.countLeadingZeros();
1232
1233 Known.Zero.setHighBits(LeadZ);
1234 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1235
1236 return Known;
1237}
1238
1239KnownBits KnownBits::remGetLowBits(const KnownBits &LHS, const KnownBits &RHS) {
1240 unsigned BitWidth = LHS.getBitWidth();
1241 if (!RHS.isZero() && RHS.Zero[0]) {
1242 // rem X, Y where Y[0:N] is zero will preserve X[0:N] in the result.
1243 unsigned RHSZeros = RHS.countMinTrailingZeros();
1244 APInt Mask = APInt::getLowBitsSet(BitWidth, RHSZeros);
1245 APInt OnesMask = LHS.One & Mask;
1246 APInt ZerosMask = LHS.Zero & Mask;
1247 return KnownBits(ZerosMask, OnesMask);
1248 }
1249 return KnownBits(BitWidth);
1250}
1251
1252KnownBits KnownBits::urem(const KnownBits &LHS, const KnownBits &RHS) {
1253 KnownBits Known = remGetLowBits(LHS, RHS);
1254 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1255 // NB: Low bits set in `remGetLowBits`.
1256 APInt HighBits = ~(RHS.getConstant() - 1);
1257 Known.Zero |= std::move(HighBits);
1258 return Known;
1259 }
1260
1261 // Since the result is less than or equal to either operand, any leading
1262 // zero bits in either operand must also exist in the result.
1263 uint32_t Leaders =
1264 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingZeros());
1265 Known.Zero.setHighBits(Leaders);
1266 return Known;
1267}
1268
1269KnownBits KnownBits::srem(const KnownBits &LHS, const KnownBits &RHS) {
1270 KnownBits Known = remGetLowBits(LHS, RHS);
1271 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1272 // NB: Low bits are set in `remGetLowBits`.
1273 APInt LowBits = RHS.getConstant() - 1;
1274 // If the first operand is non-negative or has all low bits zero, then
1275 // the upper bits are all zero.
1276 if (LHS.isNonNegative() || LowBits.isSubsetOf(LHS.Zero))
1277 Known.Zero |= ~LowBits;
1278
1279 // If the first operand is negative and not all low bits are zero, then
1280 // the upper bits are all one.
1281 if (LHS.isNegative() && LowBits.intersects(LHS.One))
1282 Known.One |= ~LowBits;
1283 return Known;
1284 }
1285
1286 // The sign bit is the LHS's sign bit, except when the result of the
1287 // remainder is zero. The magnitude of the result should be less than or
1288 // equal to the magnitude of either operand.
1289 if (LHS.isNegative() && Known.isNonZero())
1290 Known.One.setHighBits(
1291 std::max(LHS.countMinLeadingOnes(), RHS.countMinSignBits()));
1292 else if (LHS.isNonNegative())
1293 Known.Zero.setHighBits(
1294 std::max(LHS.countMinLeadingZeros(), RHS.countMinSignBits()));
1295 return Known;
1296}
1297
1298KnownBits &KnownBits::operator&=(const KnownBits &RHS) {
1299 // Result bit is 0 if either operand bit is 0.
1300 Zero |= RHS.Zero;
1301 // Result bit is 1 if both operand bits are 1.
1302 One &= RHS.One;
1303 return *this;
1304}
1305
1306KnownBits &KnownBits::operator|=(const KnownBits &RHS) {
1307 // Result bit is 0 if both operand bits are 0.
1308 Zero &= RHS.Zero;
1309 // Result bit is 1 if either operand bit is 1.
1310 One |= RHS.One;
1311 return *this;
1312}
1313
1314KnownBits &KnownBits::operator^=(const KnownBits &RHS) {
1315 // Result bit is 0 if both operand bits are 0 or both are 1.
1316 APInt Z = (Zero & RHS.Zero) | (One & RHS.One);
1317 // Result bit is 1 if one operand bit is 0 and the other is 1.
1318 One = (Zero & RHS.One) | (One & RHS.Zero);
1319 Zero = std::move(Z);
1320 return *this;
1321}
1322
1323KnownBits KnownBits::blsi() const {
1324 unsigned BitWidth = getBitWidth();
1325 KnownBits Known(Zero, APInt(BitWidth, 0));
1326 unsigned Max = countMaxTrailingZeros();
1327 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1328 unsigned Min = countMinTrailingZeros();
1329 if (Max == Min && Max < BitWidth)
1330 Known.One.setBit(Max);
1331 return Known;
1332}
1333
1334KnownBits KnownBits::blsmsk() const {
1335 unsigned BitWidth = getBitWidth();
1336 KnownBits Known(BitWidth);
1337 unsigned Max = countMaxTrailingZeros();
1338 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1339 unsigned Min = countMinTrailingZeros();
1340 Known.One.setLowBits(std::min(Min + 1, BitWidth));
1341 return Known;
1342}
1343
1345 unsigned BitWidth = getBitWidth();
1346 for (unsigned I = 0; I < BitWidth; ++I) {
1347 unsigned N = BitWidth - I - 1;
1348 if (Zero[N] && One[N])
1349 OS << "!";
1350 else if (Zero[N])
1351 OS << "0";
1352 else if (One[N])
1353 OS << "1";
1354 else
1355 OS << "?";
1356 }
1357}
1358
1359#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1361 print(dbgs());
1362 dbgs() << "\n";
1363}
1364#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:661
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
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:2022
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2106
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1615
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
LLVM_ABI APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
Definition APInt.cpp:644
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1429
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1054
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1414
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1408
LLVM_ABI uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
Definition APInt.cpp:520
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:967
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1353
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2077
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1208
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1363
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
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:1256
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1686
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1419
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1173
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt ushl_ov(const APInt &Amt, bool &Overflow) const
Definition APInt.cpp:2056
unsigned countLeadingZeros() const
Definition APInt.h:1629
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1638
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1458
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:476
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2087
bool getBoolValue() const
Convert APInt to a boolean value.
Definition APInt.h:472
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1027
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1390
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1137
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1411
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
void clearSignBit()
Set the sign bit to 0.
Definition APInt.h:1472
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2096
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3233
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:3242
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3224
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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:344
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 Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:331
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
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.
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:1916
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:305
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#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.
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:125
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).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:64
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 makeNegative()
Make this value negative.
Definition KnownBits.h:120
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
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
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).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
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 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
void setAllOnes()
Make all bits known to be one and discard any previous information.
Definition KnownBits.h:90
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 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