LLVM 20.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/Support/Debug.h"
17#include <cassert>
18
19using namespace llvm;
20
21KnownBits KnownBits::flipSignBit(const KnownBits &Val) {
22 unsigned SignBitPosition = Val.getBitWidth() - 1;
23 APInt Zero = Val.Zero;
24 APInt One = Val.One;
25 Zero.setBitVal(SignBitPosition, Val.One[SignBitPosition]);
26 One.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]);
27 return KnownBits(Zero, One);
28}
29
30static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS,
31 bool CarryZero, bool CarryOne) {
32
33 APInt PossibleSumZero = LHS.getMaxValue() + RHS.getMaxValue() + !CarryZero;
34 APInt PossibleSumOne = LHS.getMinValue() + RHS.getMinValue() + CarryOne;
35
36 // Compute known bits of the carry.
37 APInt CarryKnownZero = ~(PossibleSumZero ^ LHS.Zero ^ RHS.Zero);
38 APInt CarryKnownOne = PossibleSumOne ^ LHS.One ^ RHS.One;
39
40 // Compute set of known bits (where all three relevant bits are known).
41 APInt LHSKnownUnion = LHS.Zero | LHS.One;
42 APInt RHSKnownUnion = RHS.Zero | RHS.One;
43 APInt CarryKnownUnion = std::move(CarryKnownZero) | CarryKnownOne;
44 APInt Known = std::move(LHSKnownUnion) & RHSKnownUnion & CarryKnownUnion;
45
46 // Compute known bits of the result.
47 KnownBits KnownOut;
48 KnownOut.Zero = ~std::move(PossibleSumZero) & Known;
49 KnownOut.One = std::move(PossibleSumOne) & Known;
50 return KnownOut;
51}
52
54 const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry) {
55 assert(Carry.getBitWidth() == 1 && "Carry must be 1-bit");
56 return ::computeForAddCarry(
57 LHS, RHS, Carry.Zero.getBoolValue(), Carry.One.getBoolValue());
58}
59
60KnownBits KnownBits::computeForAddSub(bool Add, bool NSW, bool NUW,
61 const KnownBits &LHS,
62 const KnownBits &RHS) {
63 unsigned BitWidth = LHS.getBitWidth();
64 KnownBits KnownOut(BitWidth);
65 // This can be a relatively expensive helper, so optimistically save some
66 // work.
67 if (LHS.isUnknown() && RHS.isUnknown())
68 return KnownOut;
69
70 if (!LHS.isUnknown() && !RHS.isUnknown()) {
71 if (Add) {
72 // Sum = LHS + RHS + 0
73 KnownOut = ::computeForAddCarry(LHS, RHS, /*CarryZero=*/true,
74 /*CarryOne=*/false);
75 } else {
76 // Sum = LHS + ~RHS + 1
77 KnownBits NotRHS = RHS;
78 std::swap(NotRHS.Zero, NotRHS.One);
79 KnownOut = ::computeForAddCarry(LHS, NotRHS, /*CarryZero=*/false,
80 /*CarryOne=*/true);
81 }
82 }
83
84 // Handle add/sub given nsw and/or nuw.
85 if (NUW) {
86 if (Add) {
87 // (add nuw X, Y)
88 APInt MinVal = LHS.getMinValue().uadd_sat(RHS.getMinValue());
89 // None of the adds can end up overflowing, so min consecutive highbits
90 // in minimum possible of X + Y must all remain set.
91 if (NSW) {
92 unsigned NumBits = MinVal.trunc(BitWidth - 1).countl_one();
93 // If we have NSW as well, we also know we can't overflow the signbit so
94 // can start counting from 1 bit back.
95 KnownOut.One.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
96 }
97 KnownOut.One.setHighBits(MinVal.countl_one());
98 } else {
99 // (sub nuw X, Y)
100 APInt MaxVal = LHS.getMaxValue().usub_sat(RHS.getMinValue());
101 // None of the subs can overflow at any point, so any common high bits
102 // will subtract away and result in zeros.
103 if (NSW) {
104 // If we have NSW as well, we also know we can't overflow the signbit so
105 // can start counting from 1 bit back.
106 unsigned NumBits = MaxVal.trunc(BitWidth - 1).countl_zero();
107 KnownOut.Zero.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
108 }
109 KnownOut.Zero.setHighBits(MaxVal.countl_zero());
110 }
111 }
112
113 if (NSW) {
114 APInt MinVal;
115 APInt MaxVal;
116 if (Add) {
117 // (add nsw X, Y)
118 MinVal = LHS.getSignedMinValue().sadd_sat(RHS.getSignedMinValue());
119 MaxVal = LHS.getSignedMaxValue().sadd_sat(RHS.getSignedMaxValue());
120 } else {
121 // (sub nsw X, Y)
122 MinVal = LHS.getSignedMinValue().ssub_sat(RHS.getSignedMaxValue());
123 MaxVal = LHS.getSignedMaxValue().ssub_sat(RHS.getSignedMinValue());
124 }
125 if (MinVal.isNonNegative()) {
126 // If min is non-negative, result will always be non-neg (can't overflow
127 // around).
128 unsigned NumBits = MinVal.trunc(BitWidth - 1).countl_one();
129 KnownOut.One.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
130 KnownOut.Zero.setSignBit();
131 }
132 if (MaxVal.isNegative()) {
133 // If max is negative, result will always be neg (can't overflow around).
134 unsigned NumBits = MaxVal.trunc(BitWidth - 1).countl_zero();
135 KnownOut.Zero.setBits(BitWidth - 1 - NumBits, BitWidth - 1);
136 KnownOut.One.setSignBit();
137 }
138 }
139
140 // Just return 0 if the nsw/nuw is violated and we have poison.
141 if (KnownOut.hasConflict())
142 KnownOut.setAllZero();
143 return KnownOut;
144}
145
147 const KnownBits &Borrow) {
148 assert(Borrow.getBitWidth() == 1 && "Borrow must be 1-bit");
149
150 // LHS - RHS = LHS + ~RHS + 1
151 // Carry 1 - Borrow in ::computeForAddCarry
152 std::swap(RHS.Zero, RHS.One);
153 return ::computeForAddCarry(LHS, RHS,
154 /*CarryZero=*/Borrow.One.getBoolValue(),
155 /*CarryOne=*/Borrow.Zero.getBoolValue());
156}
157
158KnownBits KnownBits::sextInReg(unsigned SrcBitWidth) const {
159 unsigned BitWidth = getBitWidth();
160 assert(0 < SrcBitWidth && SrcBitWidth <= BitWidth &&
161 "Illegal sext-in-register");
162
163 if (SrcBitWidth == BitWidth)
164 return *this;
165
166 unsigned ExtBits = BitWidth - SrcBitWidth;
167 KnownBits Result;
168 Result.One = One << ExtBits;
169 Result.Zero = Zero << ExtBits;
170 Result.One.ashrInPlace(ExtBits);
171 Result.Zero.ashrInPlace(ExtBits);
172 return Result;
173}
174
176 // Count the number of leading bit positions where our underlying value is
177 // known to be less than or equal to Val.
178 unsigned N = (Zero | Val).countl_one();
179
180 // For each of those bit positions, if Val has a 1 in that bit then our
181 // underlying value must also have a 1.
182 APInt MaskedVal(Val);
183 MaskedVal.clearLowBits(getBitWidth() - N);
184 return KnownBits(Zero, One | MaskedVal);
185}
186
188 // If we can prove that LHS >= RHS then use LHS as the result. Likewise for
189 // RHS. Ideally our caller would already have spotted these cases and
190 // optimized away the umax operation, but we handle them here for
191 // completeness.
192 if (LHS.getMinValue().uge(RHS.getMaxValue()))
193 return LHS;
194 if (RHS.getMinValue().uge(LHS.getMaxValue()))
195 return RHS;
196
197 // If the result of the umax is LHS then it must be greater than or equal to
198 // the minimum possible value of RHS. Likewise for RHS. Any known bits that
199 // are common to these two values are also known in the result.
200 KnownBits L = LHS.makeGE(RHS.getMinValue());
201 KnownBits R = RHS.makeGE(LHS.getMinValue());
202 return L.intersectWith(R);
203}
204
206 // Flip the range of values: [0, 0xFFFFFFFF] <-> [0xFFFFFFFF, 0]
207 auto Flip = [](const KnownBits &Val) { return KnownBits(Val.One, Val.Zero); };
208 return Flip(umax(Flip(LHS), Flip(RHS)));
209}
210
212 return flipSignBit(umax(flipSignBit(LHS), flipSignBit(RHS)));
213}
214
216 // Flip the range of values: [-0x80000000, 0x7FFFFFFF] <-> [0xFFFFFFFF, 0]
217 auto Flip = [](const KnownBits &Val) {
218 unsigned SignBitPosition = Val.getBitWidth() - 1;
219 APInt Zero = Val.One;
220 APInt One = Val.Zero;
221 Zero.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]);
222 One.setBitVal(SignBitPosition, Val.One[SignBitPosition]);
223 return KnownBits(Zero, One);
224 };
225 return Flip(umax(Flip(LHS), Flip(RHS)));
226}
227
229 // If we know which argument is larger, return (sub LHS, RHS) or
230 // (sub RHS, LHS) directly.
231 if (LHS.getMinValue().uge(RHS.getMaxValue()))
232 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS,
233 RHS);
234 if (RHS.getMinValue().uge(LHS.getMaxValue()))
235 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, RHS,
236 LHS);
237
238 // By construction, the subtraction in abdu never has unsigned overflow.
239 // Find the common bits between (sub nuw LHS, RHS) and (sub nuw RHS, LHS).
240 KnownBits Diff0 =
241 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS);
242 KnownBits Diff1 =
243 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS);
244 return Diff0.intersectWith(Diff1);
245}
246
248 // If we know which argument is larger, return (sub LHS, RHS) or
249 // (sub RHS, LHS) directly.
250 if (LHS.getSignedMinValue().sge(RHS.getSignedMaxValue()))
251 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS,
252 RHS);
253 if (RHS.getSignedMinValue().sge(LHS.getSignedMaxValue()))
254 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, RHS,
255 LHS);
256
257 // Shift both arguments from the signed range to the unsigned range, e.g. from
258 // [-0x80, 0x7F] to [0, 0xFF]. This allows us to use "sub nuw" below just like
259 // abdu does.
260 // Note that we can't just use "sub nsw" instead because abds has signed
261 // inputs but an unsigned result, which makes the overflow conditions
262 // different.
263 unsigned SignBitPosition = LHS.getBitWidth() - 1;
264 for (auto Arg : {&LHS, &RHS}) {
265 bool Tmp = Arg->Zero[SignBitPosition];
266 Arg->Zero.setBitVal(SignBitPosition, Arg->One[SignBitPosition]);
267 Arg->One.setBitVal(SignBitPosition, Tmp);
268 }
269
270 // Find the common bits between (sub nuw LHS, RHS) and (sub nuw RHS, LHS).
271 KnownBits Diff0 =
272 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS);
273 KnownBits Diff1 =
274 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS);
275 return Diff0.intersectWith(Diff1);
276}
277
278static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth) {
280 return MaxValue.extractBitsAsZExtValue(Log2_32(BitWidth), 0);
281 // This is only an approximate upper bound.
282 return MaxValue.getLimitedValue(BitWidth - 1);
283}
284
285KnownBits KnownBits::shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW,
286 bool NSW, bool ShAmtNonZero) {
287 unsigned BitWidth = LHS.getBitWidth();
288 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
289 KnownBits Known;
290 bool ShiftedOutZero, ShiftedOutOne;
291 Known.Zero = LHS.Zero.ushl_ov(ShiftAmt, ShiftedOutZero);
292 Known.Zero.setLowBits(ShiftAmt);
293 Known.One = LHS.One.ushl_ov(ShiftAmt, ShiftedOutOne);
294
295 // All cases returning poison have been handled by MaxShiftAmount already.
296 if (NSW) {
297 if (NUW && ShiftAmt != 0)
298 // NUW means we can assume anything shifted out was a zero.
299 ShiftedOutZero = true;
300
301 if (ShiftedOutZero)
302 Known.makeNonNegative();
303 else if (ShiftedOutOne)
304 Known.makeNegative();
305 }
306 return Known;
307 };
308
309 // Fast path for a common case when LHS is completely unknown.
310 KnownBits Known(BitWidth);
311 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
312 if (MinShiftAmount == 0 && ShAmtNonZero)
313 MinShiftAmount = 1;
314 if (LHS.isUnknown()) {
315 Known.Zero.setLowBits(MinShiftAmount);
316 if (NUW && NSW && MinShiftAmount != 0)
317 Known.makeNonNegative();
318 return Known;
319 }
320
321 // Determine maximum shift amount, taking NUW/NSW flags into account.
322 APInt MaxValue = RHS.getMaxValue();
323 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
324 if (NUW && NSW)
325 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1);
326 if (NUW)
327 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros());
328 if (NSW)
329 MaxShiftAmount = std::min(
330 MaxShiftAmount,
331 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1);
332
333 // Fast path for common case where the shift amount is unknown.
334 if (MinShiftAmount == 0 && MaxShiftAmount == BitWidth - 1 &&
336 Known.Zero.setLowBits(LHS.countMinTrailingZeros());
337 if (LHS.isAllOnes())
338 Known.One.setSignBit();
339 if (NSW) {
340 if (LHS.isNonNegative())
341 Known.makeNonNegative();
342 if (LHS.isNegative())
343 Known.makeNegative();
344 }
345 return Known;
346 }
347
348 // Find the common bits from all possible shifts.
349 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
350 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
351 Known.Zero.setAllBits();
352 Known.One.setAllBits();
353 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
354 ++ShiftAmt) {
355 // Skip if the shift amount is impossible.
356 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
357 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
358 continue;
359 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
360 if (Known.isUnknown())
361 break;
362 }
363
364 // All shift amounts may result in poison.
365 if (Known.hasConflict())
366 Known.setAllZero();
367 return Known;
368}
369
371 bool ShAmtNonZero, bool Exact) {
372 unsigned BitWidth = LHS.getBitWidth();
373 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
374 KnownBits Known = LHS;
375 Known.Zero.lshrInPlace(ShiftAmt);
376 Known.One.lshrInPlace(ShiftAmt);
377 // High bits are known zero.
378 Known.Zero.setHighBits(ShiftAmt);
379 return Known;
380 };
381
382 // Fast path for a common case when LHS is completely unknown.
383 KnownBits Known(BitWidth);
384 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
385 if (MinShiftAmount == 0 && ShAmtNonZero)
386 MinShiftAmount = 1;
387 if (LHS.isUnknown()) {
388 Known.Zero.setHighBits(MinShiftAmount);
389 return Known;
390 }
391
392 // Find the common bits from all possible shifts.
393 APInt MaxValue = RHS.getMaxValue();
394 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
395
396 // If exact, bound MaxShiftAmount to first known 1 in LHS.
397 if (Exact) {
398 unsigned FirstOne = LHS.countMaxTrailingZeros();
399 if (FirstOne < MinShiftAmount) {
400 // Always poison. Return zero because we don't like returning conflict.
401 Known.setAllZero();
402 return Known;
403 }
404 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
405 }
406
407 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
408 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
409 Known.Zero.setAllBits();
410 Known.One.setAllBits();
411 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
412 ++ShiftAmt) {
413 // Skip if the shift amount is impossible.
414 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
415 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
416 continue;
417 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
418 if (Known.isUnknown())
419 break;
420 }
421
422 // All shift amounts may result in poison.
423 if (Known.hasConflict())
424 Known.setAllZero();
425 return Known;
426}
427
429 bool ShAmtNonZero, bool Exact) {
430 unsigned BitWidth = LHS.getBitWidth();
431 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) {
432 KnownBits Known = LHS;
433 Known.Zero.ashrInPlace(ShiftAmt);
434 Known.One.ashrInPlace(ShiftAmt);
435 return Known;
436 };
437
438 // Fast path for a common case when LHS is completely unknown.
439 KnownBits Known(BitWidth);
440 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(BitWidth);
441 if (MinShiftAmount == 0 && ShAmtNonZero)
442 MinShiftAmount = 1;
443 if (LHS.isUnknown()) {
444 if (MinShiftAmount == BitWidth) {
445 // Always poison. Return zero because we don't like returning conflict.
446 Known.setAllZero();
447 return Known;
448 }
449 return Known;
450 }
451
452 // Find the common bits from all possible shifts.
453 APInt MaxValue = RHS.getMaxValue();
454 unsigned MaxShiftAmount = getMaxShiftAmount(MaxValue, BitWidth);
455
456 // If exact, bound MaxShiftAmount to first known 1 in LHS.
457 if (Exact) {
458 unsigned FirstOne = LHS.countMaxTrailingZeros();
459 if (FirstOne < MinShiftAmount) {
460 // Always poison. Return zero because we don't like returning conflict.
461 Known.setAllZero();
462 return Known;
463 }
464 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
465 }
466
467 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
468 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
469 Known.Zero.setAllBits();
470 Known.One.setAllBits();
471 for (unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
472 ++ShiftAmt) {
473 // Skip if the shift amount is impossible.
474 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
475 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
476 continue;
477 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt));
478 if (Known.isUnknown())
479 break;
480 }
481
482 // All shift amounts may result in poison.
483 if (Known.hasConflict())
484 Known.setAllZero();
485 return Known;
486}
487
488std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) {
489 if (LHS.isConstant() && RHS.isConstant())
490 return std::optional<bool>(LHS.getConstant() == RHS.getConstant());
491 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero))
492 return std::optional<bool>(false);
493 return std::nullopt;
494}
495
496std::optional<bool> KnownBits::ne(const KnownBits &LHS, const KnownBits &RHS) {
497 if (std::optional<bool> KnownEQ = eq(LHS, RHS))
498 return std::optional<bool>(!*KnownEQ);
499 return std::nullopt;
500}
501
502std::optional<bool> KnownBits::ugt(const KnownBits &LHS, const KnownBits &RHS) {
503 // LHS >u RHS -> false if umax(LHS) <= umax(RHS)
504 if (LHS.getMaxValue().ule(RHS.getMinValue()))
505 return std::optional<bool>(false);
506 // LHS >u RHS -> true if umin(LHS) > umax(RHS)
507 if (LHS.getMinValue().ugt(RHS.getMaxValue()))
508 return std::optional<bool>(true);
509 return std::nullopt;
510}
511
512std::optional<bool> KnownBits::uge(const KnownBits &LHS, const KnownBits &RHS) {
513 if (std::optional<bool> IsUGT = ugt(RHS, LHS))
514 return std::optional<bool>(!*IsUGT);
515 return std::nullopt;
516}
517
518std::optional<bool> KnownBits::ult(const KnownBits &LHS, const KnownBits &RHS) {
519 return ugt(RHS, LHS);
520}
521
522std::optional<bool> KnownBits::ule(const KnownBits &LHS, const KnownBits &RHS) {
523 return uge(RHS, LHS);
524}
525
526std::optional<bool> KnownBits::sgt(const KnownBits &LHS, const KnownBits &RHS) {
527 // LHS >s RHS -> false if smax(LHS) <= smax(RHS)
528 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue()))
529 return std::optional<bool>(false);
530 // LHS >s RHS -> true if smin(LHS) > smax(RHS)
531 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue()))
532 return std::optional<bool>(true);
533 return std::nullopt;
534}
535
536std::optional<bool> KnownBits::sge(const KnownBits &LHS, const KnownBits &RHS) {
537 if (std::optional<bool> KnownSGT = sgt(RHS, LHS))
538 return std::optional<bool>(!*KnownSGT);
539 return std::nullopt;
540}
541
542std::optional<bool> KnownBits::slt(const KnownBits &LHS, const KnownBits &RHS) {
543 return sgt(RHS, LHS);
544}
545
546std::optional<bool> KnownBits::sle(const KnownBits &LHS, const KnownBits &RHS) {
547 return sge(RHS, LHS);
548}
549
550KnownBits KnownBits::abs(bool IntMinIsPoison) const {
551 // If the source's MSB is zero then we know the rest of the bits already.
552 if (isNonNegative())
553 return *this;
554
555 // Absolute value preserves trailing zero count.
556 KnownBits KnownAbs(getBitWidth());
557
558 // If the input is negative, then abs(x) == -x.
559 if (isNegative()) {
560 KnownBits Tmp = *this;
561 // Special case for IntMinIsPoison. We know the sign bit is set and we know
562 // all the rest of the bits except one to be zero. Since we have
563 // IntMinIsPoison, that final bit MUST be a one, as otherwise the input is
564 // INT_MIN.
565 if (IntMinIsPoison && (Zero.popcount() + 2) == getBitWidth())
567
568 KnownAbs = computeForAddSub(
569 /*Add*/ false, IntMinIsPoison, /*NUW=*/false,
571
572 // One more special case for IntMinIsPoison. If we don't know any ones other
573 // than the signbit, we know for certain that all the unknowns can't be
574 // zero. So if we know high zero bits, but have unknown low bits, we know
575 // for certain those high-zero bits will end up as one. This is because,
576 // the low bits can't be all zeros, so the +1 in (~x + 1) cannot carry up
577 // to the high bits. If we know a known INT_MIN input skip this. The result
578 // is poison anyways.
579 if (IntMinIsPoison && Tmp.countMinPopulation() == 1 &&
580 Tmp.countMaxPopulation() != 1) {
581 Tmp.One.clearSignBit();
582 Tmp.Zero.setSignBit();
583 KnownAbs.One.setBits(getBitWidth() - Tmp.countMinLeadingZeros(),
584 getBitWidth() - 1);
585 }
586
587 } else {
588 unsigned MaxTZ = countMaxTrailingZeros();
589 unsigned MinTZ = countMinTrailingZeros();
590
591 KnownAbs.Zero.setLowBits(MinTZ);
592 // If we know the lowest set 1, then preserve it.
593 if (MaxTZ == MinTZ && MaxTZ < getBitWidth())
594 KnownAbs.One.setBit(MaxTZ);
595
596 // We only know that the absolute values's MSB will be zero if INT_MIN is
597 // poison, or there is a set bit that isn't the sign bit (otherwise it could
598 // be INT_MIN).
599 if (IntMinIsPoison || (!One.isZero() && !One.isMinSignedValue())) {
600 KnownAbs.One.clearSignBit();
601 KnownAbs.Zero.setSignBit();
602 }
603 }
604
605 return KnownAbs;
606}
607
609 const KnownBits &LHS,
610 const KnownBits &RHS) {
611 // We don't see NSW even for sadd/ssub as we want to check if the result has
612 // signed overflow.
613 unsigned BitWidth = LHS.getBitWidth();
614
615 std::optional<bool> Overflow;
616 // Even if we can't entirely rule out overflow, we may be able to rule out
617 // overflow in one direction. This allows us to potentially keep some of the
618 // add/sub bits. I.e if we can't overflow in the positive direction we won't
619 // clamp to INT_MAX so we can keep low 0s from the add/sub result.
620 bool MayNegClamp = true;
621 bool MayPosClamp = true;
622 if (Signed) {
623 // Easy cases we can rule out any overflow.
624 if (Add && ((LHS.isNegative() && RHS.isNonNegative()) ||
625 (LHS.isNonNegative() && RHS.isNegative())))
626 Overflow = false;
627 else if (!Add && (((LHS.isNegative() && RHS.isNegative()) ||
628 (LHS.isNonNegative() && RHS.isNonNegative()))))
629 Overflow = false;
630 else {
631 // Check if we may overflow. If we can't rule out overflow then check if
632 // we can rule out a direction at least.
633 KnownBits UnsignedLHS = LHS;
634 KnownBits UnsignedRHS = RHS;
635 // Get version of LHS/RHS with clearer signbit. This allows us to detect
636 // how the addition/subtraction might overflow into the signbit. Then
637 // using the actual known signbits of LHS/RHS, we can figure out which
638 // overflows are/aren't possible.
639 UnsignedLHS.One.clearSignBit();
640 UnsignedLHS.Zero.setSignBit();
641 UnsignedRHS.One.clearSignBit();
642 UnsignedRHS.Zero.setSignBit();
643 KnownBits Res =
644 KnownBits::computeForAddSub(Add, /*NSW=*/false,
645 /*NUW=*/false, UnsignedLHS, UnsignedRHS);
646 if (Add) {
647 if (Res.isNegative()) {
648 // Only overflow scenario is Pos + Pos.
649 MayNegClamp = false;
650 // Pos + Pos will overflow with extra signbit.
651 if (LHS.isNonNegative() && RHS.isNonNegative())
652 Overflow = true;
653 } else if (Res.isNonNegative()) {
654 // Only overflow scenario is Neg + Neg
655 MayPosClamp = false;
656 // Neg + Neg will overflow without extra signbit.
657 if (LHS.isNegative() && RHS.isNegative())
658 Overflow = true;
659 }
660 // We will never clamp to the opposite sign of N-bit result.
661 if (LHS.isNegative() || RHS.isNegative())
662 MayPosClamp = false;
663 if (LHS.isNonNegative() || RHS.isNonNegative())
664 MayNegClamp = false;
665 } else {
666 if (Res.isNegative()) {
667 // Only overflow scenario is Neg - Pos.
668 MayPosClamp = false;
669 // Neg - Pos will overflow with extra signbit.
670 if (LHS.isNegative() && RHS.isNonNegative())
671 Overflow = true;
672 } else if (Res.isNonNegative()) {
673 // Only overflow scenario is Pos - Neg.
674 MayNegClamp = false;
675 // Pos - Neg will overflow without extra signbit.
676 if (LHS.isNonNegative() && RHS.isNegative())
677 Overflow = true;
678 }
679 // We will never clamp to the opposite sign of N-bit result.
680 if (LHS.isNegative() || RHS.isNonNegative())
681 MayPosClamp = false;
682 if (LHS.isNonNegative() || RHS.isNegative())
683 MayNegClamp = false;
684 }
685 }
686 // If we have ruled out all clamping, we will never overflow.
687 if (!MayNegClamp && !MayPosClamp)
688 Overflow = false;
689 } else if (Add) {
690 // uadd.sat
691 bool Of;
692 (void)LHS.getMaxValue().uadd_ov(RHS.getMaxValue(), Of);
693 if (!Of) {
694 Overflow = false;
695 } else {
696 (void)LHS.getMinValue().uadd_ov(RHS.getMinValue(), Of);
697 if (Of)
698 Overflow = true;
699 }
700 } else {
701 // usub.sat
702 bool Of;
703 (void)LHS.getMinValue().usub_ov(RHS.getMaxValue(), Of);
704 if (!Of) {
705 Overflow = false;
706 } else {
707 (void)LHS.getMaxValue().usub_ov(RHS.getMinValue(), Of);
708 if (Of)
709 Overflow = true;
710 }
711 }
712
714 /*NUW=*/!Signed, LHS, RHS);
715
716 if (Overflow) {
717 // We know whether or not we overflowed.
718 if (!(*Overflow)) {
719 // No overflow.
720 return Res;
721 }
722
723 // We overflowed
724 APInt C;
725 if (Signed) {
726 // sadd.sat / ssub.sat
727 assert(!LHS.isSignUnknown() &&
728 "We somehow know overflow without knowing input sign");
729 C = LHS.isNegative() ? APInt::getSignedMinValue(BitWidth)
731 } else if (Add) {
732 // uadd.sat
734 } else {
735 // uadd.sat
737 }
738
739 Res.One = C;
740 Res.Zero = ~C;
741 return Res;
742 }
743
744 // We don't know if we overflowed.
745 if (Signed) {
746 // sadd.sat/ssub.sat
747 // We can keep our information about the sign bits.
748 if (MayPosClamp)
749 Res.Zero.clearLowBits(BitWidth - 1);
750 if (MayNegClamp)
751 Res.One.clearLowBits(BitWidth - 1);
752 } else if (Add) {
753 // uadd.sat
754 // We need to clear all the known zeros as we can only use the leading ones.
755 Res.Zero.clearAllBits();
756 } else {
757 // usub.sat
758 // We need to clear all the known ones as we can only use the leading zero.
759 Res.One.clearAllBits();
760 }
761
762 return Res;
763}
764
766 return computeForSatAddSub(/*Add*/ true, /*Signed*/ true, LHS, RHS);
767}
769 return computeForSatAddSub(/*Add*/ false, /*Signed*/ true, LHS, RHS);
770}
772 return computeForSatAddSub(/*Add*/ true, /*Signed*/ false, LHS, RHS);
773}
775 return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS);
776}
777
778static KnownBits avgComputeU(KnownBits LHS, KnownBits RHS, bool IsCeil) {
779 unsigned BitWidth = LHS.getBitWidth();
780 LHS = LHS.zext(BitWidth + 1);
781 RHS = RHS.zext(BitWidth + 1);
782 LHS =
783 computeForAddCarry(LHS, RHS, /*CarryZero*/ !IsCeil, /*CarryOne*/ IsCeil);
784 LHS = LHS.extractBits(BitWidth, 1);
785 return LHS;
786}
787
789 return flipSignBit(avgFloorU(flipSignBit(LHS), flipSignBit(RHS)));
790}
791
793 return avgComputeU(LHS, RHS, /*IsCeil=*/false);
794}
795
797 return flipSignBit(avgCeilU(flipSignBit(LHS), flipSignBit(RHS)));
798}
799
801 return avgComputeU(LHS, RHS, /*IsCeil=*/true);
802}
803
805 bool NoUndefSelfMultiply) {
806 unsigned BitWidth = LHS.getBitWidth();
807 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
808 assert((!NoUndefSelfMultiply || LHS == RHS) &&
809 "Self multiplication knownbits mismatch");
810
811 // Compute the high known-0 bits by multiplying the unsigned max of each side.
812 // Conservatively, M active bits * N active bits results in M + N bits in the
813 // result. But if we know a value is a power-of-2 for example, then this
814 // computes one more leading zero.
815 // TODO: This could be generalized to number of sign bits (negative numbers).
816 APInt UMaxLHS = LHS.getMaxValue();
817 APInt UMaxRHS = RHS.getMaxValue();
818
819 // For leading zeros in the result to be valid, the unsigned max product must
820 // fit in the bitwidth (it must not overflow).
821 bool HasOverflow;
822 APInt UMaxResult = UMaxLHS.umul_ov(UMaxRHS, HasOverflow);
823 unsigned LeadZ = HasOverflow ? 0 : UMaxResult.countl_zero();
824
825 // The result of the bottom bits of an integer multiply can be
826 // inferred by looking at the bottom bits of both operands and
827 // multiplying them together.
828 // We can infer at least the minimum number of known trailing bits
829 // of both operands. Depending on number of trailing zeros, we can
830 // infer more bits, because (a*b) <=> ((a/m) * (b/n)) * (m*n) assuming
831 // a and b are divisible by m and n respectively.
832 // We then calculate how many of those bits are inferrable and set
833 // the output. For example, the i8 mul:
834 // a = XXXX1100 (12)
835 // b = XXXX1110 (14)
836 // We know the bottom 3 bits are zero since the first can be divided by
837 // 4 and the second by 2, thus having ((12/4) * (14/2)) * (2*4).
838 // Applying the multiplication to the trimmed arguments gets:
839 // XX11 (3)
840 // X111 (7)
841 // -------
842 // XX11
843 // XX11
844 // XX11
845 // XX11
846 // -------
847 // XXXXX01
848 // Which allows us to infer the 2 LSBs. Since we're multiplying the result
849 // by 8, the bottom 3 bits will be 0, so we can infer a total of 5 bits.
850 // The proof for this can be described as:
851 // Pre: (C1 >= 0) && (C1 < (1 << C5)) && (C2 >= 0) && (C2 < (1 << C6)) &&
852 // (C7 == (1 << (umin(countTrailingZeros(C1), C5) +
853 // umin(countTrailingZeros(C2), C6) +
854 // umin(C5 - umin(countTrailingZeros(C1), C5),
855 // C6 - umin(countTrailingZeros(C2), C6)))) - 1)
856 // %aa = shl i8 %a, C5
857 // %bb = shl i8 %b, C6
858 // %aaa = or i8 %aa, C1
859 // %bbb = or i8 %bb, C2
860 // %mul = mul i8 %aaa, %bbb
861 // %mask = and i8 %mul, C7
862 // =>
863 // %mask = i8 ((C1*C2)&C7)
864 // Where C5, C6 describe the known bits of %a, %b
865 // C1, C2 describe the known bottom bits of %a, %b.
866 // C7 describes the mask of the known bits of the result.
867 const APInt &Bottom0 = LHS.One;
868 const APInt &Bottom1 = RHS.One;
869
870 // How many times we'd be able to divide each argument by 2 (shr by 1).
871 // This gives us the number of trailing zeros on the multiplication result.
872 unsigned TrailBitsKnown0 = (LHS.Zero | LHS.One).countr_one();
873 unsigned TrailBitsKnown1 = (RHS.Zero | RHS.One).countr_one();
874 unsigned TrailZero0 = LHS.countMinTrailingZeros();
875 unsigned TrailZero1 = RHS.countMinTrailingZeros();
876 unsigned TrailZ = TrailZero0 + TrailZero1;
877
878 // Figure out the fewest known-bits operand.
879 unsigned SmallestOperand =
880 std::min(TrailBitsKnown0 - TrailZero0, TrailBitsKnown1 - TrailZero1);
881 unsigned ResultBitsKnown = std::min(SmallestOperand + TrailZ, BitWidth);
882
883 APInt BottomKnown =
884 Bottom0.getLoBits(TrailBitsKnown0) * Bottom1.getLoBits(TrailBitsKnown1);
885
886 KnownBits Res(BitWidth);
887 Res.Zero.setHighBits(LeadZ);
888 Res.Zero |= (~BottomKnown).getLoBits(ResultBitsKnown);
889 Res.One = BottomKnown.getLoBits(ResultBitsKnown);
890
891 // If we're self-multiplying then bit[1] is guaranteed to be zero.
892 if (NoUndefSelfMultiply && BitWidth > 1) {
893 assert(Res.One[1] == 0 &&
894 "Self-multiplication failed Quadratic Reciprocity!");
895 Res.Zero.setBit(1);
896 }
897
898 return Res;
899}
900
902 unsigned BitWidth = LHS.getBitWidth();
903 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
904 KnownBits WideLHS = LHS.sext(2 * BitWidth);
905 KnownBits WideRHS = RHS.sext(2 * BitWidth);
906 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
907}
908
910 unsigned BitWidth = LHS.getBitWidth();
911 assert(BitWidth == RHS.getBitWidth() && "Operand mismatch");
912 KnownBits WideLHS = LHS.zext(2 * BitWidth);
913 KnownBits WideRHS = RHS.zext(2 * BitWidth);
914 return mul(WideLHS, WideRHS).extractBits(BitWidth, BitWidth);
915}
916
918 const KnownBits &RHS, bool Exact) {
919
920 if (!Exact)
921 return Known;
922
923 // If LHS is Odd, the result is Odd no matter what.
924 // Odd / Odd -> Odd
925 // Odd / Even -> Impossible (because its exact division)
926 if (LHS.One[0])
927 Known.One.setBit(0);
928
929 int MinTZ =
930 (int)LHS.countMinTrailingZeros() - (int)RHS.countMaxTrailingZeros();
931 int MaxTZ =
932 (int)LHS.countMaxTrailingZeros() - (int)RHS.countMinTrailingZeros();
933 if (MinTZ >= 0) {
934 // Result has at least MinTZ trailing zeros.
935 Known.Zero.setLowBits(MinTZ);
936 if (MinTZ == MaxTZ) {
937 // Result has exactly MinTZ trailing zeros.
938 Known.One.setBit(MinTZ);
939 }
940 } else if (MaxTZ < 0) {
941 // Poison Result
942 Known.setAllZero();
943 }
944
945 // In the KnownBits exhaustive tests, we have poison inputs for exact values
946 // a LOT. If we have a conflict, just return all zeros.
947 if (Known.hasConflict())
948 Known.setAllZero();
949
950 return Known;
951}
952
954 bool Exact) {
955 // Equivalent of `udiv`. We must have caught this before it was folded.
956 if (LHS.isNonNegative() && RHS.isNonNegative())
957 return udiv(LHS, RHS, Exact);
958
959 unsigned BitWidth = LHS.getBitWidth();
960 KnownBits Known(BitWidth);
961
962 if (LHS.isZero() || RHS.isZero()) {
963 // Result is either known Zero or UB. Return Zero either way.
964 // Checking this earlier saves us a lot of special cases later on.
965 Known.setAllZero();
966 return Known;
967 }
968
969 std::optional<APInt> Res;
970 if (LHS.isNegative() && RHS.isNegative()) {
971 // Result non-negative.
972 APInt Denom = RHS.getSignedMaxValue();
973 APInt Num = LHS.getSignedMinValue();
974 // INT_MIN/-1 would be a poison result (impossible). Estimate the division
975 // as signed max (we will only set sign bit in the result).
976 Res = (Num.isMinSignedValue() && Denom.isAllOnes())
978 : Num.sdiv(Denom);
979 } else if (LHS.isNegative() && RHS.isNonNegative()) {
980 // Result is negative if Exact OR -LHS u>= RHS.
981 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) {
982 APInt Denom = RHS.getSignedMinValue();
983 APInt Num = LHS.getSignedMinValue();
984 Res = Denom.isZero() ? Num : Num.sdiv(Denom);
985 }
986 } else if (LHS.isStrictlyPositive() && RHS.isNegative()) {
987 // Result is negative if Exact OR LHS u>= -RHS.
988 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) {
989 APInt Denom = RHS.getSignedMaxValue();
990 APInt Num = LHS.getSignedMaxValue();
991 Res = Num.sdiv(Denom);
992 }
993 }
994
995 if (Res) {
996 if (Res->isNonNegative()) {
997 unsigned LeadZ = Res->countLeadingZeros();
998 Known.Zero.setHighBits(LeadZ);
999 } else {
1000 unsigned LeadO = Res->countLeadingOnes();
1001 Known.One.setHighBits(LeadO);
1002 }
1003 }
1004
1005 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1006 return Known;
1007}
1008
1010 bool Exact) {
1011 unsigned BitWidth = LHS.getBitWidth();
1012 KnownBits Known(BitWidth);
1013
1014 if (LHS.isZero() || RHS.isZero()) {
1015 // Result is either known Zero or UB. Return Zero either way.
1016 // Checking this earlier saves us a lot of special cases later on.
1017 Known.setAllZero();
1018 return Known;
1019 }
1020
1021 // We can figure out the minimum number of upper zero bits by doing
1022 // MaxNumerator / MinDenominator. If the Numerator gets smaller or Denominator
1023 // gets larger, the number of upper zero bits increases.
1024 APInt MinDenom = RHS.getMinValue();
1025 APInt MaxNum = LHS.getMaxValue();
1026 APInt MaxRes = MinDenom.isZero() ? MaxNum : MaxNum.udiv(MinDenom);
1027
1028 unsigned LeadZ = MaxRes.countLeadingZeros();
1029
1030 Known.Zero.setHighBits(LeadZ);
1031 Known = divComputeLowBit(Known, LHS, RHS, Exact);
1032
1033 return Known;
1034}
1035
1036KnownBits KnownBits::remGetLowBits(const KnownBits &LHS, const KnownBits &RHS) {
1037 unsigned BitWidth = LHS.getBitWidth();
1038 if (!RHS.isZero() && RHS.Zero[0]) {
1039 // rem X, Y where Y[0:N] is zero will preserve X[0:N] in the result.
1040 unsigned RHSZeros = RHS.countMinTrailingZeros();
1041 APInt Mask = APInt::getLowBitsSet(BitWidth, RHSZeros);
1042 APInt OnesMask = LHS.One & Mask;
1043 APInt ZerosMask = LHS.Zero & Mask;
1044 return KnownBits(ZerosMask, OnesMask);
1045 }
1046 return KnownBits(BitWidth);
1047}
1048
1050 KnownBits Known = remGetLowBits(LHS, RHS);
1051 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1052 // NB: Low bits set in `remGetLowBits`.
1053 APInt HighBits = ~(RHS.getConstant() - 1);
1054 Known.Zero |= HighBits;
1055 return Known;
1056 }
1057
1058 // Since the result is less than or equal to either operand, any leading
1059 // zero bits in either operand must also exist in the result.
1060 uint32_t Leaders =
1061 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingZeros());
1062 Known.Zero.setHighBits(Leaders);
1063 return Known;
1064}
1065
1067 KnownBits Known = remGetLowBits(LHS, RHS);
1068 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1069 // NB: Low bits are set in `remGetLowBits`.
1070 APInt LowBits = RHS.getConstant() - 1;
1071 // If the first operand is non-negative or has all low bits zero, then
1072 // the upper bits are all zero.
1073 if (LHS.isNonNegative() || LowBits.isSubsetOf(LHS.Zero))
1074 Known.Zero |= ~LowBits;
1075
1076 // If the first operand is negative and not all low bits are zero, then
1077 // the upper bits are all one.
1078 if (LHS.isNegative() && LowBits.intersects(LHS.One))
1079 Known.One |= ~LowBits;
1080 return Known;
1081 }
1082
1083 // The sign bit is the LHS's sign bit, except when the result of the
1084 // remainder is zero. The magnitude of the result should be less than or
1085 // equal to the magnitude of either operand.
1086 if (LHS.isNegative() && Known.isNonZero())
1087 Known.One.setHighBits(
1088 std::max(LHS.countMinLeadingOnes(), RHS.countMinSignBits()));
1089 else if (LHS.isNonNegative())
1090 Known.Zero.setHighBits(
1091 std::max(LHS.countMinLeadingZeros(), RHS.countMinSignBits()));
1092 return Known;
1093}
1094
1096 // Result bit is 0 if either operand bit is 0.
1097 Zero |= RHS.Zero;
1098 // Result bit is 1 if both operand bits are 1.
1099 One &= RHS.One;
1100 return *this;
1101}
1102
1104 // Result bit is 0 if both operand bits are 0.
1105 Zero &= RHS.Zero;
1106 // Result bit is 1 if either operand bit is 1.
1107 One |= RHS.One;
1108 return *this;
1109}
1110
1112 // Result bit is 0 if both operand bits are 0 or both are 1.
1113 APInt Z = (Zero & RHS.Zero) | (One & RHS.One);
1114 // Result bit is 1 if one operand bit is 0 and the other is 1.
1115 One = (Zero & RHS.One) | (One & RHS.Zero);
1116 Zero = std::move(Z);
1117 return *this;
1118}
1119
1121 unsigned BitWidth = getBitWidth();
1122 KnownBits Known(Zero, APInt(BitWidth, 0));
1123 unsigned Max = countMaxTrailingZeros();
1124 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1125 unsigned Min = countMinTrailingZeros();
1126 if (Max == Min && Max < BitWidth)
1127 Known.One.setBit(Max);
1128 return Known;
1129}
1130
1132 unsigned BitWidth = getBitWidth();
1133 KnownBits Known(BitWidth);
1134 unsigned Max = countMaxTrailingZeros();
1135 Known.Zero.setBitsFrom(std::min(Max + 1, BitWidth));
1136 unsigned Min = countMinTrailingZeros();
1137 Known.One.setLowBits(std::min(Min + 1, BitWidth));
1138 return Known;
1139}
1140
1142 unsigned BitWidth = getBitWidth();
1143 for (unsigned I = 0; I < BitWidth; ++I) {
1144 unsigned N = BitWidth - I - 1;
1145 if (Zero[N] && One[N])
1146 OS << "!";
1147 else if (Zero[N])
1148 OS << "0";
1149 else if (One[N])
1150 OS << "1";
1151 else
1152 OS << "?";
1153 }
1154}
1155void KnownBits::dump() const {
1156 print(dbgs());
1157 dbgs() << "\n";
1158}
static KnownBits avgComputeU(KnownBits LHS, KnownBits RHS, bool IsCeil)
Definition: KnownBits.cpp:778
static KnownBits computeForSatAddSub(bool Add, bool Signed, const KnownBits &LHS, const KnownBits &RHS)
Definition: KnownBits.cpp:608
static KnownBits divComputeLowBit(KnownBits Known, const KnownBits &LHS, const KnownBits &RHS, bool Exact)
Definition: KnownBits.cpp:917
static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, bool CarryZero, bool CarryOne)
Definition: KnownBits.cpp:30
static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth)
Definition: KnownBits.cpp:278
#define I(x, y, z)
Definition: MD5.cpp:58
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition: APInt.h:78
APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1945
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1547
APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
Definition: APInt.cpp:617
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition: APInt.h:423
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition: APInt.h:1392
unsigned popcount() const
Count the number of bits set.
Definition: APInt.h:1649
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition: APInt.h:1386
uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
Definition: APInt.cpp:493
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:910
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:206
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition: APInt.h:1330
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:371
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:380
void setSignBit()
Set the sign bit to 1.
Definition: APInt.h:1340
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:209
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition: APInt.h:216
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:329
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:1249
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1618
void clearAllBits()
Set every bit to 0.
Definition: APInt.h:1397
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:834
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1577
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:219
unsigned countLeadingZeros() const
Definition: APInt.h:1585
unsigned countl_one() const
Count the number of leading one bits.
Definition: APInt.h:1594
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition: APInt.h:1417
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:475
void setAllBits()
Set every bit to 1.
Definition: APInt.h:1319
bool getBoolValue() const
Convert APInt to a boolean value.
Definition: APInt.h:471
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition: APInt.h:334
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition: APInt.h:1367
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition: APInt.h:1257
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:306
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition: APInt.h:1389
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:858
void setBitVal(unsigned BitPosition, bool BitValue)
Set a given bit to a given value.
Definition: APInt.h:1343
void clearSignBit()
Set the sign bit to 0.
Definition: APInt.h:1431
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition: bit.h:307
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:340
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:291
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
int countl_one(T Value)
Count the number of ones from the most significant bit to the first zero bit.
Definition: bit.h:294
@ Add
Sum of integers.
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:217
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:1873
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define N
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition: KnownBits.h:293
static KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
Definition: KnownBits.cpp:765
static std::optional< bool > eq(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_EQ result.
Definition: KnownBits.cpp:488
KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
Definition: KnownBits.cpp:158
static KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
Definition: KnownBits.cpp:909
static KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
Definition: KnownBits.cpp:211
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition: KnownBits.h:100
KnownBits blsi() const
Compute known bits for X & -X, which has only the lowest bit set of X set.
Definition: KnownBits.cpp:1120
void makeNonNegative()
Make this value non-negative.
Definition: KnownBits.h:116
static KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
Definition: KnownBits.cpp:774
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:234
static KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
Definition: KnownBits.cpp:428
static KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
Definition: KnownBits.cpp:768
static KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
Definition: KnownBits.cpp:1049
bool isUnknown() const
Returns true if we don't know any bits.
Definition: KnownBits.h:65
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:266
static std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
Definition: KnownBits.cpp:496
KnownBits makeGE(const APInt &Val) const
Return KnownBits based on this, but updated given that the underlying value is known to be greater th...
Definition: KnownBits.cpp:175
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...
Definition: KnownBits.cpp:1131
void makeNegative()
Make this value negative.
Definition: KnownBits.h:111
bool hasConflict() const
Returns true if there is conflicting information.
Definition: KnownBits.h:50
static std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
Definition: KnownBits.cpp:536
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:281
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition: KnownBits.h:85
KnownBits & operator|=(const KnownBits &RHS)
Update known bits based on ORing with RHS.
Definition: KnownBits.cpp:1103
void print(raw_ostream &OS) const
Definition: KnownBits.cpp:1141
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:43
static KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
Definition: KnownBits.cpp:187
static KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
Definition: KnownBits.cpp:370
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition: KnownBits.h:103
static KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
Definition: KnownBits.cpp:228
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition: KnownBits.h:217
static KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
Definition: KnownBits.cpp:792
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition: KnownBits.h:303
static KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
Definition: KnownBits.cpp:146
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:240
KnownBits()=default
static KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
Definition: KnownBits.cpp:247
static KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
Definition: KnownBits.cpp:215
KnownBits & operator&=(const KnownBits &RHS)
Update known bits based on ANDing with RHS.
Definition: KnownBits.cpp:1095
static KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
Definition: KnownBits.cpp:901
static KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
Definition: KnownBits.cpp:1066
static std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
Definition: KnownBits.cpp:502
static KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
Definition: KnownBits.cpp:1009
static std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
Definition: KnownBits.cpp:542
static 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:60
void dump() const
Definition: KnownBits.cpp:1155
static KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
Definition: KnownBits.cpp:953
static std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
Definition: KnownBits.cpp:518
static KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
Definition: KnownBits.cpp:788
static std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
Definition: KnownBits.cpp:522
bool isNegative() const
Returns true if this value is known to be negative.
Definition: KnownBits.h:97
static 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:53
static KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
Definition: KnownBits.cpp:800
static KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
Definition: KnownBits.cpp:771
static KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
Definition: KnownBits.cpp:804
KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
Definition: KnownBits.cpp:550
static std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
Definition: KnownBits.cpp:546
static std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
Definition: KnownBits.cpp:526
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition: KnownBits.h:278
static std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
Definition: KnownBits.cpp:512
KnownBits & operator^=(const KnownBits &RHS)
Update known bits based on XORing with RHS.
Definition: KnownBits.cpp:1111
static KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
Definition: KnownBits.cpp:285
static KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
Definition: KnownBits.cpp:205
static KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
Definition: KnownBits.cpp:796