LLVM 23.0.0git
ValueTracking.cpp
Go to the documentation of this file.
1//===- ValueTracking.cpp - Walk computations to compute properties --------===//
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 routines that help analyze properties that chains of
10// computations have.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/ScopeExit.h"
23#include "llvm/ADT/StringRef.h"
33#include "llvm/Analysis/Loads.h"
38#include "llvm/IR/Argument.h"
39#include "llvm/IR/Attributes.h"
40#include "llvm/IR/BasicBlock.h"
41#include "llvm/IR/Constant.h"
44#include "llvm/IR/Constants.h"
47#include "llvm/IR/Dominators.h"
49#include "llvm/IR/Function.h"
51#include "llvm/IR/GlobalAlias.h"
52#include "llvm/IR/GlobalValue.h"
54#include "llvm/IR/InstrTypes.h"
55#include "llvm/IR/Instruction.h"
58#include "llvm/IR/Intrinsics.h"
59#include "llvm/IR/IntrinsicsAArch64.h"
60#include "llvm/IR/IntrinsicsAMDGPU.h"
61#include "llvm/IR/IntrinsicsRISCV.h"
62#include "llvm/IR/IntrinsicsX86.h"
63#include "llvm/IR/LLVMContext.h"
64#include "llvm/IR/Metadata.h"
65#include "llvm/IR/Module.h"
66#include "llvm/IR/Operator.h"
68#include "llvm/IR/Type.h"
69#include "llvm/IR/User.h"
70#include "llvm/IR/Value.h"
79#include <algorithm>
80#include <cassert>
81#include <cstdint>
82#include <optional>
83#include <utility>
84
85using namespace llvm;
86using namespace llvm::PatternMatch;
87
88// Controls the number of uses of the value searched for possible
89// dominating comparisons.
90static cl::opt<unsigned> DomConditionsMaxUses("dom-conditions-max-uses",
91 cl::Hidden, cl::init(20));
92
93/// Maximum number of instructions to check between assume and context
94/// instruction.
95static constexpr unsigned MaxInstrsToCheckForFree = 16;
96
97/// Returns the bitwidth of the given scalar or pointer type. For vector types,
98/// returns the element type's bitwidth.
99static unsigned getBitWidth(Type *Ty, const DataLayout &DL) {
100 if (unsigned BitWidth = Ty->getScalarSizeInBits())
101 return BitWidth;
102
103 return DL.getPointerTypeSizeInBits(Ty);
104}
105
106// Given the provided Value and, potentially, a context instruction, return
107// the preferred context instruction (if any).
108static const Instruction *safeCxtI(const Value *V, const Instruction *CxtI) {
109 // If we've been provided with a context instruction, then use that (provided
110 // it has been inserted).
111 if (CxtI && CxtI->getParent())
112 return CxtI;
113
114 // If the value is really an already-inserted instruction, then use that.
115 CxtI = dyn_cast<Instruction>(V);
116 if (CxtI && CxtI->getParent())
117 return CxtI;
118
119 return nullptr;
120}
121
123 const APInt &DemandedElts,
124 APInt &DemandedLHS, APInt &DemandedRHS) {
125 if (isa<ScalableVectorType>(Shuf->getType())) {
126 assert(DemandedElts == APInt(1,1));
127 DemandedLHS = DemandedRHS = DemandedElts;
128 return true;
129 }
130
131 int NumElts =
132 cast<FixedVectorType>(Shuf->getOperand(0)->getType())->getNumElements();
133 return llvm::getShuffleDemandedElts(NumElts, Shuf->getShuffleMask(),
134 DemandedElts, DemandedLHS, DemandedRHS);
135}
136
137static void computeKnownBits(const Value *V, const APInt &DemandedElts,
138 KnownBits &Known, const SimplifyQuery &Q,
139 unsigned Depth);
140
142 const SimplifyQuery &Q, unsigned Depth) {
143 // Since the number of lanes in a scalable vector is unknown at compile time,
144 // we track one bit which is implicitly broadcast to all lanes. This means
145 // that all lanes in a scalable vector are considered demanded.
146 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
147 APInt DemandedElts =
148 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
149 ::computeKnownBits(V, DemandedElts, Known, Q, Depth);
150}
151
153 const DataLayout &DL, AssumptionCache *AC,
154 const Instruction *CxtI, const DominatorTree *DT,
155 bool UseInstrInfo, unsigned Depth) {
156 computeKnownBits(V, Known,
157 SimplifyQuery(DL, DT, AC, safeCxtI(V, CxtI), UseInstrInfo),
158 Depth);
159}
160
162 AssumptionCache *AC, const Instruction *CxtI,
163 const DominatorTree *DT, bool UseInstrInfo,
164 unsigned Depth) {
165 return computeKnownBits(
166 V, SimplifyQuery(DL, DT, AC, safeCxtI(V, CxtI), UseInstrInfo), Depth);
167}
168
169KnownBits llvm::computeKnownBits(const Value *V, const APInt &DemandedElts,
170 const DataLayout &DL, AssumptionCache *AC,
171 const Instruction *CxtI,
172 const DominatorTree *DT, bool UseInstrInfo,
173 unsigned Depth) {
174 return computeKnownBits(
175 V, DemandedElts,
176 SimplifyQuery(DL, DT, AC, safeCxtI(V, CxtI), UseInstrInfo), Depth);
177}
178
180 const SimplifyQuery &SQ) {
181 // Look for an inverted mask: (X & ~M) op (Y & M).
182 {
183 Value *M;
184 if (match(LHS, m_c_And(m_Not(m_Value(M)), m_Value())) &&
186 isGuaranteedNotToBeUndef(M, SQ.AC, SQ.CxtI, SQ.DT))
187 return true;
188 }
189
190 // X op (Y & ~X)
193 return true;
194
195 // X op ((X & Y) ^ Y) -- this is the canonical form of the previous pattern
196 // for constant Y.
197 Value *Y;
198 if (match(RHS,
200 isGuaranteedNotToBeUndef(LHS, SQ.AC, SQ.CxtI, SQ.DT) &&
201 isGuaranteedNotToBeUndef(Y, SQ.AC, SQ.CxtI, SQ.DT))
202 return true;
203
204 // Peek through extends to find a 'not' of the other side:
205 // (ext Y) op ext(~Y)
206 if (match(LHS, m_ZExtOrSExt(m_Value(Y))) &&
208 isGuaranteedNotToBeUndef(Y, SQ.AC, SQ.CxtI, SQ.DT))
209 return true;
210
211 // Look for: (A & B) op ~(A | B)
212 {
213 Value *A, *B;
214 if (match(LHS, m_And(m_Value(A), m_Value(B))) &&
216 isGuaranteedNotToBeUndef(A, SQ.AC, SQ.CxtI, SQ.DT) &&
217 isGuaranteedNotToBeUndef(B, SQ.AC, SQ.CxtI, SQ.DT))
218 return true;
219 }
220
221 // Look for: (X << V) op (Y >> (BitWidth - V))
222 // or (X >> V) op (Y << (BitWidth - V))
223 {
224 const Value *V;
225 const APInt *R;
226 if (((match(RHS, m_Shl(m_Value(), m_Sub(m_APInt(R), m_Value(V)))) &&
227 match(LHS, m_LShr(m_Value(), m_Specific(V)))) ||
228 (match(RHS, m_LShr(m_Value(), m_Sub(m_APInt(R), m_Value(V)))) &&
229 match(LHS, m_Shl(m_Value(), m_Specific(V))))) &&
230 R->uge(LHS->getType()->getScalarSizeInBits()))
231 return true;
232 }
233
234 return false;
235}
236
238 const WithCache<const Value *> &RHSCache,
239 const SimplifyQuery &SQ) {
240 const Value *LHS = LHSCache.getValue();
241 const Value *RHS = RHSCache.getValue();
242
243 assert(LHS->getType() == RHS->getType() &&
244 "LHS and RHS should have the same type");
245 assert(LHS->getType()->isIntOrIntVectorTy() &&
246 "LHS and RHS should be integers");
247
248 if (haveNoCommonBitsSetSpecialCases(LHS, RHS, SQ) ||
250 return true;
251
253 RHSCache.getKnownBits(SQ));
254}
255
257 return !I->user_empty() &&
258 all_of(I->users(), match_fn(m_ICmp(m_Value(), m_Zero())));
259}
260
262 return !I->user_empty() && all_of(I->users(), [](const User *U) {
263 CmpPredicate P;
264 return match(U, m_ICmp(P, m_Value(), m_Zero())) && ICmpInst::isEquality(P);
265 });
266}
267
269 bool OrZero, AssumptionCache *AC,
270 const Instruction *CxtI,
271 const DominatorTree *DT, bool UseInstrInfo,
272 unsigned Depth) {
273 return ::isKnownToBeAPowerOfTwo(
274 V, OrZero, SimplifyQuery(DL, DT, AC, safeCxtI(V, CxtI), UseInstrInfo),
275 Depth);
276}
277
278static bool isKnownNonZero(const Value *V, const APInt &DemandedElts,
279 const SimplifyQuery &Q, unsigned Depth);
280
282 unsigned Depth) {
283 return computeKnownBits(V, SQ, Depth).isNonNegative();
284}
285
287 unsigned Depth) {
288 if (auto *CI = dyn_cast<ConstantInt>(V))
289 return CI->getValue().isStrictlyPositive();
290
291 // If `isKnownNonNegative` ever becomes more sophisticated, make sure to keep
292 // this updated.
293 KnownBits Known = computeKnownBits(V, SQ, Depth);
294 return Known.isNonNegative() &&
295 (Known.isNonZero() || isKnownNonZero(V, SQ, Depth));
296}
297
299 unsigned Depth) {
300 return computeKnownBits(V, SQ, Depth).isNegative();
301}
302
303static bool isKnownNonEqual(const Value *V1, const Value *V2,
304 const APInt &DemandedElts, const SimplifyQuery &Q,
305 unsigned Depth);
306
307bool llvm::isKnownNonEqual(const Value *V1, const Value *V2,
308 const SimplifyQuery &Q, unsigned Depth) {
309 // We don't support looking through casts.
310 if (V1 == V2 || V1->getType() != V2->getType())
311 return false;
312 auto *FVTy = dyn_cast<FixedVectorType>(V1->getType());
313 APInt DemandedElts =
314 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
315 return ::isKnownNonEqual(V1, V2, DemandedElts, Q, Depth);
316}
317
318bool llvm::MaskedValueIsZero(const Value *V, const APInt &Mask,
319 const SimplifyQuery &SQ, unsigned Depth) {
320 KnownBits Known(Mask.getBitWidth());
321 computeKnownBits(V, Known, SQ, Depth);
322 return Mask.isSubsetOf(Known.Zero);
323}
324
325static unsigned ComputeNumSignBits(const Value *V, const APInt &DemandedElts,
326 const SimplifyQuery &Q, unsigned Depth);
327
328static unsigned ComputeNumSignBits(const Value *V, const SimplifyQuery &Q,
329 unsigned Depth = 0) {
330 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
331 APInt DemandedElts =
332 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
333 return ComputeNumSignBits(V, DemandedElts, Q, Depth);
334}
335
336unsigned llvm::ComputeNumSignBits(const Value *V, const DataLayout &DL,
337 AssumptionCache *AC, const Instruction *CxtI,
338 const DominatorTree *DT, bool UseInstrInfo,
339 unsigned Depth) {
340 return ::ComputeNumSignBits(
341 V, SimplifyQuery(DL, DT, AC, safeCxtI(V, CxtI), UseInstrInfo), Depth);
342}
343
345 AssumptionCache *AC,
346 const Instruction *CxtI,
347 const DominatorTree *DT,
348 unsigned Depth) {
349 unsigned SignBits = ComputeNumSignBits(V, DL, AC, CxtI, DT, Depth);
350 return V->getType()->getScalarSizeInBits() - SignBits + 1;
351}
352
353/// Try to detect the lerp pattern: a * (b - c) + c * d
354/// where a >= 0, b >= 0, c >= 0, d >= 0, and b >= c.
355///
356/// In that particular case, we can use the following chain of reasoning:
357///
358/// a * (b - c) + c * d <= a' * (b - c) + a' * c = a' * b where a' = max(a, d)
359///
360/// Since that is true for arbitrary a, b, c and d within our constraints, we
361/// can conclude that:
362///
363/// max(a * (b - c) + c * d) <= max(max(a), max(d)) * max(b) = U
364///
365/// Considering that any result of the lerp would be less or equal to U, it
366/// would have at least the number of leading 0s as in U.
367///
368/// While being quite a specific situation, it is fairly common in computer
369/// graphics in the shape of alpha blending.
370///
371/// Modifies given KnownOut in-place with the inferred information.
372static void computeKnownBitsFromLerpPattern(const Value *Op0, const Value *Op1,
373 const APInt &DemandedElts,
374 KnownBits &KnownOut,
375 const SimplifyQuery &Q,
376 unsigned Depth) {
377
378 Type *Ty = Op0->getType();
379 const unsigned BitWidth = Ty->getScalarSizeInBits();
380
381 // Only handle scalar types for now
382 if (Ty->isVectorTy())
383 return;
384
385 // Try to match: a * (b - c) + c * d.
386 // When a == 1 => A == nullptr, the same applies to d/D as well.
387 const Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
388 const Instruction *SubBC = nullptr;
389
390 const auto MatchSubBC = [&]() {
391 // (b - c) can have two forms that interest us:
392 //
393 // 1. sub nuw %b, %c
394 // 2. xor %c, %b
395 //
396 // For the first case, nuw flag guarantees our requirement b >= c.
397 //
398 // The second case might happen when the analysis can infer that b is a mask
399 // for c and we can transform sub operation into xor (that is usually true
400 // for constant b's). Even though xor is symmetrical, canonicalization
401 // ensures that the constant will be the RHS. We have additional checks
402 // later on to ensure that this xor operation is equivalent to subtraction.
404 m_Xor(m_Value(C), m_Value(B))));
405 };
406
407 const auto MatchASubBC = [&]() {
408 // Cases:
409 // - a * (b - c)
410 // - (b - c) * a
411 // - (b - c) <- a implicitly equals 1
412 return m_CombineOr(m_c_Mul(m_Value(A), MatchSubBC()), MatchSubBC());
413 };
414
415 const auto MatchCD = [&]() {
416 // Cases:
417 // - d * c
418 // - c * d
419 // - c <- d implicitly equals 1
421 };
422
423 const auto Match = [&](const Value *LHS, const Value *RHS) {
424 // We do use m_Specific(C) in MatchCD, so we have to make sure that
425 // it's bound to anything and match(LHS, MatchASubBC()) absolutely
426 // has to evaluate first and return true.
427 //
428 // If Match returns true, it is guaranteed that B != nullptr, C != nullptr.
429 return match(LHS, MatchASubBC()) && match(RHS, MatchCD());
430 };
431
432 if (!Match(Op0, Op1) && !Match(Op1, Op0))
433 return;
434
435 const auto ComputeKnownBitsOrOne = [&](const Value *V) {
436 // For some of the values we use the convention of leaving
437 // it nullptr to signify an implicit constant 1.
438 return V ? computeKnownBits(V, DemandedElts, Q, Depth + 1)
440 };
441
442 // Check that all operands are non-negative
443 const KnownBits KnownA = ComputeKnownBitsOrOne(A);
444 if (!KnownA.isNonNegative())
445 return;
446
447 const KnownBits KnownD = ComputeKnownBitsOrOne(D);
448 if (!KnownD.isNonNegative())
449 return;
450
451 const KnownBits KnownB = computeKnownBits(B, DemandedElts, Q, Depth + 1);
452 if (!KnownB.isNonNegative())
453 return;
454
455 const KnownBits KnownC = computeKnownBits(C, DemandedElts, Q, Depth + 1);
456 if (!KnownC.isNonNegative())
457 return;
458
459 // If we matched subtraction as xor, we need to actually check that xor
460 // is semantically equivalent to subtraction.
461 //
462 // For that to be true, b has to be a mask for c or that b's known
463 // ones cover all known and possible ones of c.
464 if (SubBC->getOpcode() == Instruction::Xor &&
465 !KnownC.getMaxValue().isSubsetOf(KnownB.getMinValue()))
466 return;
467
468 const APInt MaxA = KnownA.getMaxValue();
469 const APInt MaxD = KnownD.getMaxValue();
470 const APInt MaxAD = APIntOps::umax(MaxA, MaxD);
471 const APInt MaxB = KnownB.getMaxValue();
472
473 // We can't infer leading zeros info if the upper-bound estimate wraps.
474 bool Overflow;
475 const APInt UpperBound = MaxAD.umul_ov(MaxB, Overflow);
476
477 if (Overflow)
478 return;
479
480 // If we know that x <= y and both are positive than x has at least the same
481 // number of leading zeros as y.
482 const unsigned MinimumNumberOfLeadingZeros = UpperBound.countl_zero();
483 KnownOut.Zero.setHighBits(MinimumNumberOfLeadingZeros);
484}
485
486static void computeKnownBitsAddSub(bool Add, const Value *Op0, const Value *Op1,
487 bool NSW, bool NUW,
488 const APInt &DemandedElts,
489 KnownBits &KnownOut, KnownBits &Known2,
490 const SimplifyQuery &Q, unsigned Depth) {
491 computeKnownBits(Op1, DemandedElts, KnownOut, Q, Depth + 1);
492
493 // If one operand is unknown and we have no nowrap information,
494 // the result will be unknown independently of the second operand.
495 if (KnownOut.isUnknown() && !NSW && !NUW)
496 return;
497
498 computeKnownBits(Op0, DemandedElts, Known2, Q, Depth + 1);
499 KnownOut = KnownBits::computeForAddSub(Add, NSW, NUW, Known2, KnownOut);
500
501 if (!Add && NSW && !KnownOut.isNonNegative() &&
503 .value_or(false))
504 KnownOut.makeNonNegative();
505
506 if (Add)
507 // Try to match lerp pattern and combine results
508 computeKnownBitsFromLerpPattern(Op0, Op1, DemandedElts, KnownOut, Q, Depth);
509}
510
511static void computeKnownBitsMul(const Value *Op0, const Value *Op1, bool NSW,
512 bool NUW, const APInt &DemandedElts,
513 KnownBits &Known, KnownBits &Known2,
514 const SimplifyQuery &Q, unsigned Depth) {
515 computeKnownBits(Op1, DemandedElts, Known, Q, Depth + 1);
516 computeKnownBits(Op0, DemandedElts, Known2, Q, Depth + 1);
517
518 bool isKnownNegative = false;
519 bool isKnownNonNegative = false;
520 // If the multiplication is known not to overflow, compute the sign bit.
521 if (NSW) {
522 if (Op0 == Op1) {
523 // The product of a number with itself is non-negative.
524 isKnownNonNegative = true;
525 } else {
526 bool isKnownNonNegativeOp1 = Known.isNonNegative();
527 bool isKnownNonNegativeOp0 = Known2.isNonNegative();
528 bool isKnownNegativeOp1 = Known.isNegative();
529 bool isKnownNegativeOp0 = Known2.isNegative();
530 // The product of two numbers with the same sign is non-negative.
531 isKnownNonNegative = (isKnownNegativeOp1 && isKnownNegativeOp0) ||
532 (isKnownNonNegativeOp1 && isKnownNonNegativeOp0);
533 if (!isKnownNonNegative && NUW) {
534 // mul nuw nsw with a factor > 1 is non-negative.
536 isKnownNonNegative = KnownBits::sgt(Known, One).value_or(false) ||
537 KnownBits::sgt(Known2, One).value_or(false);
538 }
539
540 // The product of a negative number and a non-negative number is either
541 // negative or zero.
544 (isKnownNegativeOp1 && isKnownNonNegativeOp0 &&
545 Known2.isNonZero()) ||
546 (isKnownNegativeOp0 && isKnownNonNegativeOp1 && Known.isNonZero());
547 }
548 }
549
550 bool SelfMultiply = Op0 == Op1;
551 if (SelfMultiply)
552 SelfMultiply &=
553 isGuaranteedNotToBeUndef(Op0, Q.AC, Q.CxtI, Q.DT, Depth + 1);
554 Known = KnownBits::mul(Known, Known2, SelfMultiply);
555
556 if (SelfMultiply) {
557 unsigned SignBits = ComputeNumSignBits(Op0, DemandedElts, Q, Depth + 1);
558 unsigned TyBits = Op0->getType()->getScalarSizeInBits();
559 unsigned OutValidBits = 2 * (TyBits - SignBits + 1);
560
561 if (OutValidBits < TyBits) {
562 APInt KnownZeroMask =
563 APInt::getHighBitsSet(TyBits, TyBits - OutValidBits + 1);
564 Known.Zero |= KnownZeroMask;
565 }
566 }
567
568 // Only make use of no-wrap flags if we failed to compute the sign bit
569 // directly. This matters if the multiplication always overflows, in
570 // which case we prefer to follow the result of the direct computation,
571 // though as the program is invoking undefined behaviour we can choose
572 // whatever we like here.
573 if (isKnownNonNegative && !Known.isNegative())
574 Known.makeNonNegative();
575 else if (isKnownNegative && !Known.isNonNegative())
576 Known.makeNegative();
577}
578
580 KnownBits &Known) {
581 unsigned BitWidth = Known.getBitWidth();
582 unsigned NumRanges = Ranges.getNumOperands() / 2;
583 assert(NumRanges >= 1);
584
585 Known.setAllConflict();
586
587 for (unsigned i = 0; i < NumRanges; ++i) {
589 mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 0));
591 mdconst::extract<ConstantInt>(Ranges.getOperand(2 * i + 1));
592 ConstantRange Range(Lower->getValue(), Upper->getValue());
593 // BitWidth must equal the Ranges BitWidth for the correct number of high
594 // bits to be set.
595 assert(BitWidth == Range.getBitWidth() &&
596 "Known bit width must match range bit width!");
597
598 // The first CommonPrefixBits of all values in Range are equal.
599 unsigned CommonPrefixBits =
600 (Range.getUnsignedMax() ^ Range.getUnsignedMin()).countl_zero();
601 APInt Mask = APInt::getHighBitsSet(BitWidth, CommonPrefixBits);
602 APInt UnsignedMax = Range.getUnsignedMax().zextOrTrunc(BitWidth);
603 Known.One &= UnsignedMax & Mask;
604 Known.Zero &= ~UnsignedMax & Mask;
605 }
606}
607
608static bool isEphemeralValueOf(const Instruction *I, const Value *E) {
612
613 // The instruction defining an assumption's condition itself is always
614 // considered ephemeral to that assumption (even if it has other
615 // non-ephemeral users). See r246696's test case for an example.
616 if (is_contained(I->operands(), E))
617 return true;
618
619 while (!WorkSet.empty()) {
620 const Instruction *V = WorkSet.pop_back_val();
621 if (!Visited.insert(V).second)
622 continue;
623
624 // If all uses of this value are ephemeral, then so is this value.
625 if (all_of(V->users(), [&](const User *U) {
626 return EphValues.count(cast<Instruction>(U));
627 })) {
628 if (V == E)
629 return true;
630
631 if (V == I || (!V->mayHaveSideEffects() && !V->isTerminator())) {
632 EphValues.insert(V);
633
634 if (const User *U = dyn_cast<User>(V)) {
635 for (const Use &U : U->operands()) {
636 if (const auto *I = dyn_cast<Instruction>(U.get()))
637 WorkSet.push_back(I);
638 }
639 }
640 }
641 }
642 }
643
644 return false;
645}
646
647// Is this an intrinsic that cannot be speculated but also cannot trap?
649 if (const IntrinsicInst *CI = dyn_cast<IntrinsicInst>(I))
650 return CI->isAssumeLikeIntrinsic();
651
652 return false;
653}
654
656 const Instruction *CxtI,
657 const DominatorTree *DT,
658 bool AllowEphemerals) {
659 // There are two restrictions on the use of an assume:
660 // 1. The assume must dominate the context (or the control flow must
661 // reach the assume whenever it reaches the context).
662 // 2. The context must not be in the assume's set of ephemeral values
663 // (otherwise we will use the assume to prove that the condition
664 // feeding the assume is trivially true, thus causing the removal of
665 // the assume).
666
667 if (Inv->getParent() == CxtI->getParent()) {
668 // If Inv and CtxI are in the same block, check if the assume (Inv) is first
669 // in the BB.
670 if (Inv->comesBefore(CxtI))
671 return true;
672
673 // Don't let an assume affect itself - this would cause the problems
674 // `isEphemeralValueOf` is trying to prevent, and it would also make
675 // the loop below go out of bounds.
676 if (!AllowEphemerals && Inv == CxtI)
677 return false;
678
679 // The context comes first, but they're both in the same block.
680 // Make sure there is nothing in between that might interrupt
681 // the control flow, not even CxtI itself.
682 // We limit the scan distance between the assume and its context instruction
683 // to avoid a compile-time explosion. This limit is chosen arbitrarily, so
684 // it can be adjusted if needed (could be turned into a cl::opt).
685 auto Range = make_range(CxtI->getIterator(), Inv->getIterator());
687 return false;
688
689 return AllowEphemerals || !isEphemeralValueOf(Inv, CxtI);
690 }
691
692 // Inv and CxtI are in different blocks.
693 if (DT) {
694 if (DT->dominates(Inv, CxtI))
695 return true;
696 } else if (Inv->getParent() == CxtI->getParent()->getSinglePredecessor() ||
697 Inv->getParent()->isEntryBlock()) {
698 // We don't have a DT, but this trivially dominates.
699 return true;
700 }
701
702 return false;
703}
704
706 const Instruction *CtxI) {
707 // Helper to check if there are any calls in the range that may free memory.
708 auto hasNoFreeCalls = [](auto Range) {
709 for (const auto &[Idx, I] : enumerate(Range)) {
710 if (Idx > MaxInstrsToCheckForFree)
711 return false;
712 if (const auto *CB = dyn_cast<CallBase>(&I))
713 if (!CB->hasFnAttr(Attribute::NoFree))
714 return false;
715 }
716 return true;
717 };
718
719 // Make sure the current function cannot arrange for another thread to free on
720 // its behalf.
721 if (!CtxI->getFunction()->hasNoSync())
722 return false;
723
724 // Handle cross-block case: CtxI in a successor of Assume's block.
725 const BasicBlock *CtxBB = CtxI->getParent();
726 const BasicBlock *AssumeBB = Assume->getParent();
727 BasicBlock::const_iterator CtxIter = CtxI->getIterator();
728 if (CtxBB != AssumeBB) {
729 if (CtxBB->getSinglePredecessor() != AssumeBB)
730 return false;
731
732 if (!hasNoFreeCalls(make_range(CtxBB->begin(), CtxIter)))
733 return false;
734
735 CtxIter = AssumeBB->end();
736 } else {
737 // Same block case: check that Assume comes before CtxI.
738 if (!Assume->comesBefore(CtxI))
739 return false;
740 }
741
742 // Check if there are any calls between Assume and CtxIter that may free
743 // memory.
744 return hasNoFreeCalls(make_range(Assume->getIterator(), CtxIter));
745}
746
747// TODO: cmpExcludesZero misses many cases where `RHS` is non-constant but
748// we still have enough information about `RHS` to conclude non-zero. For
749// example Pred=EQ, RHS=isKnownNonZero. cmpExcludesZero is called in loops
750// so the extra compile time may not be worth it, but possibly a second API
751// should be created for use outside of loops.
752static bool cmpExcludesZero(CmpInst::Predicate Pred, const Value *RHS) {
753 // v u> y implies v != 0.
754 if (Pred == ICmpInst::ICMP_UGT)
755 return true;
756
757 // Special-case v != 0 to also handle v != null.
758 if (Pred == ICmpInst::ICMP_NE)
759 return match(RHS, m_Zero());
760
761 // All other predicates - rely on generic ConstantRange handling.
762 const APInt *C;
763 auto Zero = APInt::getZero(RHS->getType()->getScalarSizeInBits());
764 if (match(RHS, m_APInt(C))) {
766 return !TrueValues.contains(Zero);
767 }
768
770 if (VC == nullptr)
771 return false;
772
773 for (unsigned ElemIdx = 0, NElem = VC->getNumElements(); ElemIdx < NElem;
774 ++ElemIdx) {
776 Pred, VC->getElementAsAPInt(ElemIdx));
777 if (TrueValues.contains(Zero))
778 return false;
779 }
780 return true;
781}
782
783static void breakSelfRecursivePHI(const Use *U, const PHINode *PHI,
784 Value *&ValOut, Instruction *&CtxIOut,
785 const PHINode **PhiOut = nullptr) {
786 ValOut = U->get();
787 if (ValOut == PHI)
788 return;
789 CtxIOut = PHI->getIncomingBlock(*U)->getTerminator();
790 if (PhiOut)
791 *PhiOut = PHI;
792 Value *V;
793 // If the Use is a select of this phi, compute analysis on other arm to break
794 // recursion.
795 // TODO: Min/Max
796 if (match(ValOut, m_Select(m_Value(), m_Specific(PHI), m_Value(V))) ||
797 match(ValOut, m_Select(m_Value(), m_Value(V), m_Specific(PHI))))
798 ValOut = V;
799
800 // Same for select, if this phi is 2-operand phi, compute analysis on other
801 // incoming value to break recursion.
802 // TODO: We could handle any number of incoming edges as long as we only have
803 // two unique values.
804 if (auto *IncPhi = dyn_cast<PHINode>(ValOut);
805 IncPhi && IncPhi->getNumIncomingValues() == 2) {
806 for (int Idx = 0; Idx < 2; ++Idx) {
807 if (IncPhi->getIncomingValue(Idx) == PHI) {
808 ValOut = IncPhi->getIncomingValue(1 - Idx);
809 if (PhiOut)
810 *PhiOut = IncPhi;
811 CtxIOut = IncPhi->getIncomingBlock(1 - Idx)->getTerminator();
812 break;
813 }
814 }
815 }
816}
817
818static bool isKnownNonZeroFromAssume(const Value *V, const SimplifyQuery &Q) {
819 // Use of assumptions is context-sensitive. If we don't have a context, we
820 // cannot use them!
821 if (!Q.AC || !Q.CxtI)
822 return false;
823
824 for (AssumptionCache::ResultElem &Elem : Q.AC->assumptionsFor(V)) {
825 if (!Elem.Assume)
826 continue;
827
828 AssumeInst *I = cast<AssumeInst>(Elem.Assume);
829 assert(I->getFunction() == Q.CxtI->getFunction() &&
830 "Got assumption for the wrong function!");
831
832 if (Elem.Index != AssumptionCache::ExprResultIdx) {
833 if (!V->getType()->isPointerTy())
834 continue;
836 *I, I->bundle_op_info_begin()[Elem.Index])) {
837 if (RK.WasOn != V)
838 continue;
839 bool AssumeImpliesNonNull = [&]() {
840 if (RK.AttrKind == Attribute::NonNull)
841 return true;
842
843 if (RK.AttrKind == Attribute::Dereferenceable) {
846 return false;
847 assert(RK.IRArgValue &&
848 "Dereferenceable attribute without IR argument?");
849
850 auto *CI = dyn_cast<ConstantInt>(RK.IRArgValue);
851 return CI && !CI->isZero();
852 }
853
854 return false;
855 }();
856 if (AssumeImpliesNonNull && isValidAssumeForContext(I, Q.CxtI, Q.DT))
857 return true;
858 }
859 continue;
860 }
861
862 // Warning: This loop can end up being somewhat performance sensitive.
863 // We're running this loop for once for each value queried resulting in a
864 // runtime of ~O(#assumes * #values).
865
866 Value *RHS;
867 CmpPredicate Pred;
868 auto m_V = m_CombineOr(m_Specific(V), m_PtrToInt(m_Specific(V)));
869 if (!match(I->getArgOperand(0), m_c_ICmp(Pred, m_V, m_Value(RHS))))
870 continue;
871
872 if (cmpExcludesZero(Pred, RHS) && isValidAssumeForContext(I, Q.CxtI, Q.DT))
873 return true;
874 }
875
876 return false;
877}
878
880 Value *LHS, Value *RHS, KnownBits &Known,
881 const SimplifyQuery &Q) {
882 if (RHS->getType()->isPointerTy()) {
883 // Handle comparison of pointer to null explicitly, as it will not be
884 // covered by the m_APInt() logic below.
885 if (LHS == V && match(RHS, m_Zero())) {
886 switch (Pred) {
888 Known.setAllZero();
889 break;
892 Known.makeNonNegative();
893 break;
895 Known.makeNegative();
896 break;
897 default:
898 break;
899 }
900 }
901 return;
902 }
903
904 unsigned BitWidth = Known.getBitWidth();
905 auto m_V =
907
908 Value *Y;
909 const APInt *Mask, *C;
910 if (!match(RHS, m_APInt(C)))
911 return;
912
913 uint64_t ShAmt;
914 switch (Pred) {
916 // assume(V = C)
917 if (match(LHS, m_V)) {
918 Known = Known.unionWith(KnownBits::makeConstant(*C));
919 // assume(V & Mask = C)
920 } else if (match(LHS, m_c_And(m_V, m_Value(Y)))) {
921 // For one bits in Mask, we can propagate bits from C to V.
922 Known.One |= *C;
923 if (match(Y, m_APInt(Mask)))
924 Known.Zero |= ~*C & *Mask;
925 // assume(V | Mask = C)
926 } else if (match(LHS, m_c_Or(m_V, m_Value(Y)))) {
927 // For zero bits in Mask, we can propagate bits from C to V.
928 Known.Zero |= ~*C;
929 if (match(Y, m_APInt(Mask)))
930 Known.One |= *C & ~*Mask;
931 // assume(V << ShAmt = C)
932 } else if (match(LHS, m_Shl(m_V, m_ConstantInt(ShAmt))) &&
933 ShAmt < BitWidth) {
934 // For those bits in C that are known, we can propagate them to known
935 // bits in V shifted to the right by ShAmt.
937 RHSKnown >>= ShAmt;
938 Known = Known.unionWith(RHSKnown);
939 // assume(V >> ShAmt = C)
940 } else if (match(LHS, m_Shr(m_V, m_ConstantInt(ShAmt))) &&
941 ShAmt < BitWidth) {
942 // For those bits in RHS that are known, we can propagate them to known
943 // bits in V shifted to the right by C.
945 RHSKnown <<= ShAmt;
946 Known = Known.unionWith(RHSKnown);
947 }
948 break;
949 case ICmpInst::ICMP_NE: {
950 // assume (V & B != 0) where B is a power of 2
951 const APInt *BPow2;
952 if (C->isZero() && match(LHS, m_And(m_V, m_Power2(BPow2))))
953 Known.One |= *BPow2;
954 break;
955 }
956 default: {
957 const APInt *Offset = nullptr;
958 if (match(LHS, m_CombineOr(m_V, m_AddLike(m_V, m_APInt(Offset))))) {
960 if (Offset)
961 LHSRange = LHSRange.sub(*Offset);
962 Known = Known.unionWith(LHSRange.toKnownBits());
963 }
964 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE) {
965 // X & Y u> C -> X u> C && Y u> C
966 // X nuw- Y u> C -> X u> C
967 if (match(LHS, m_c_And(m_V, m_Value())) ||
968 match(LHS, m_NUWSub(m_V, m_Value())))
969 Known.One.setHighBits(
970 (*C + (Pred == ICmpInst::ICMP_UGT)).countLeadingOnes());
971 }
972 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
973 // X | Y u< C -> X u< C && Y u< C
974 // X nuw+ Y u< C -> X u< C && Y u< C
975 if (match(LHS, m_c_Or(m_V, m_Value())) ||
976 match(LHS, m_c_NUWAdd(m_V, m_Value()))) {
977 Known.Zero.setHighBits(
978 (*C - (Pred == ICmpInst::ICMP_ULT)).countLeadingZeros());
979 }
980 }
981 } break;
982 }
983}
984
985static void computeKnownBitsFromICmpCond(const Value *V, ICmpInst *Cmp,
986 KnownBits &Known,
987 const SimplifyQuery &SQ, bool Invert) {
989 Invert ? Cmp->getInversePredicate() : Cmp->getPredicate();
990 Value *LHS = Cmp->getOperand(0);
991 Value *RHS = Cmp->getOperand(1);
992
993 // Handle icmp pred (trunc V), C
994 if (match(LHS, m_Trunc(m_Specific(V)))) {
995 KnownBits DstKnown(LHS->getType()->getScalarSizeInBits());
996 computeKnownBitsFromCmp(LHS, Pred, LHS, RHS, DstKnown, SQ);
998 Known = Known.unionWith(DstKnown.zext(Known.getBitWidth()));
999 else
1000 Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
1001 return;
1002 }
1003
1004 computeKnownBitsFromCmp(V, Pred, LHS, RHS, Known, SQ);
1005}
1006
1008 KnownBits &Known, const SimplifyQuery &SQ,
1009 bool Invert, unsigned Depth) {
1010 Value *A, *B;
1013 KnownBits Known2(Known.getBitWidth());
1014 KnownBits Known3(Known.getBitWidth());
1015 computeKnownBitsFromCond(V, A, Known2, SQ, Invert, Depth + 1);
1016 computeKnownBitsFromCond(V, B, Known3, SQ, Invert, Depth + 1);
1017 if (Invert ? match(Cond, m_LogicalOr(m_Value(), m_Value()))
1019 Known2 = Known2.unionWith(Known3);
1020 else
1021 Known2 = Known2.intersectWith(Known3);
1022 Known = Known.unionWith(Known2);
1023 return;
1024 }
1025
1026 if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
1027 computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
1028 return;
1029 }
1030
1031 if (match(Cond, m_Trunc(m_Specific(V)))) {
1032 KnownBits DstKnown(1);
1033 if (Invert) {
1034 DstKnown.setAllZero();
1035 } else {
1036 DstKnown.setAllOnes();
1037 }
1039 Known = Known.unionWith(DstKnown.zext(Known.getBitWidth()));
1040 return;
1041 }
1042 Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
1043 return;
1044 }
1045
1047 computeKnownBitsFromCond(V, A, Known, SQ, !Invert, Depth + 1);
1048}
1049
1051 const SimplifyQuery &Q, unsigned Depth) {
1052 // Handle injected condition.
1053 if (Q.CC && Q.CC->AffectedValues.contains(V))
1054 computeKnownBitsFromCond(V, Q.CC->Cond, Known, Q, Q.CC->Invert, Depth);
1055
1056 if (!Q.CxtI)
1057 return;
1058
1059 if (Q.DC && Q.DT) {
1060 // Handle dominating conditions.
1061 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
1062 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1063 if (Q.DT->dominates(Edge0, Q.CxtI->getParent()))
1064 computeKnownBitsFromCond(V, BI->getCondition(), Known, Q,
1065 /*Invert*/ false, Depth);
1066
1067 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1068 if (Q.DT->dominates(Edge1, Q.CxtI->getParent()))
1069 computeKnownBitsFromCond(V, BI->getCondition(), Known, Q,
1070 /*Invert*/ true, Depth);
1071 }
1072
1073 if (Known.hasConflict())
1074 Known.resetAll();
1075 }
1076
1077 if (!Q.AC)
1078 return;
1079
1080 unsigned BitWidth = Known.getBitWidth();
1081
1082 // Note that the patterns below need to be kept in sync with the code
1083 // in AssumptionCache::updateAffectedValues.
1084
1085 for (AssumptionCache::ResultElem &Elem : Q.AC->assumptionsFor(V)) {
1086 if (!Elem.Assume)
1087 continue;
1088
1089 AssumeInst *I = cast<AssumeInst>(Elem.Assume);
1090 assert(I->getParent()->getParent() == Q.CxtI->getParent()->getParent() &&
1091 "Got assumption for the wrong function!");
1092
1093 if (Elem.Index != AssumptionCache::ExprResultIdx) {
1094 if (!V->getType()->isPointerTy())
1095 continue;
1097 *I, I->bundle_op_info_begin()[Elem.Index])) {
1098 // Allow AllowEphemerals in isValidAssumeForContext, as the CxtI might
1099 // be the producer of the pointer in the bundle. At the moment, align
1100 // assumptions aren't optimized away.
1101 if (RK.WasOn == V && RK.AttrKind == Attribute::Alignment &&
1102 isPowerOf2_64(RK.ArgValue) &&
1103 isValidAssumeForContext(I, Q.CxtI, Q.DT, /*AllowEphemerals*/ true))
1104 Known.Zero.setLowBits(Log2_64(RK.ArgValue));
1105 }
1106 continue;
1107 }
1108
1109 // Warning: This loop can end up being somewhat performance sensitive.
1110 // We're running this loop for once for each value queried resulting in a
1111 // runtime of ~O(#assumes * #values).
1112
1113 Value *Arg = I->getArgOperand(0);
1114
1115 if (Arg == V && isValidAssumeForContext(I, Q.CxtI, Q.DT)) {
1116 assert(BitWidth == 1 && "assume operand is not i1?");
1117 (void)BitWidth;
1118 Known.setAllOnes();
1119 return;
1120 }
1121 if (match(Arg, m_Not(m_Specific(V))) &&
1123 assert(BitWidth == 1 && "assume operand is not i1?");
1124 (void)BitWidth;
1125 Known.setAllZero();
1126 return;
1127 }
1128 auto *Trunc = dyn_cast<TruncInst>(Arg);
1129 if (Trunc && Trunc->getOperand(0) == V &&
1131 if (Trunc->hasNoUnsignedWrap()) {
1133 return;
1134 }
1135 Known.One.setBit(0);
1136 return;
1137 }
1138
1139 // The remaining tests are all recursive, so bail out if we hit the limit.
1141 continue;
1142
1143 ICmpInst *Cmp = dyn_cast<ICmpInst>(Arg);
1144 if (!Cmp)
1145 continue;
1146
1147 if (!isValidAssumeForContext(I, Q.CxtI, Q.DT))
1148 continue;
1149
1150 computeKnownBitsFromICmpCond(V, Cmp, Known, Q, /*Invert=*/false);
1151 }
1152
1153 // Conflicting assumption: Undefined behavior will occur on this execution
1154 // path.
1155 if (Known.hasConflict())
1156 Known.resetAll();
1157}
1158
1159/// Compute known bits from a shift operator, including those with a
1160/// non-constant shift amount. Known is the output of this function. Known2 is a
1161/// pre-allocated temporary with the same bit width as Known and on return
1162/// contains the known bit of the shift value source. KF is an
1163/// operator-specific function that, given the known-bits and a shift amount,
1164/// compute the implied known-bits of the shift operator's result respectively
1165/// for that shift amount. The results from calling KF are conservatively
1166/// combined for all permitted shift amounts.
1168 const Operator *I, const APInt &DemandedElts, KnownBits &Known,
1169 KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth,
1170 function_ref<KnownBits(const KnownBits &, const KnownBits &, bool)> KF) {
1171 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
1172 computeKnownBits(I->getOperand(1), DemandedElts, Known, Q, Depth + 1);
1173 // To limit compile-time impact, only query isKnownNonZero() if we know at
1174 // least something about the shift amount.
1175 bool ShAmtNonZero =
1176 Known.isNonZero() ||
1177 (Known.getMaxValue().ult(Known.getBitWidth()) &&
1178 isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth + 1));
1179 Known = KF(Known2, Known, ShAmtNonZero);
1180}
1181
1182static KnownBits
1183getKnownBitsFromAndXorOr(const Operator *I, const APInt &DemandedElts,
1184 const KnownBits &KnownLHS, const KnownBits &KnownRHS,
1185 const SimplifyQuery &Q, unsigned Depth) {
1186 unsigned BitWidth = KnownLHS.getBitWidth();
1187 KnownBits KnownOut(BitWidth);
1188 bool IsAnd = false;
1189 bool HasKnownOne = !KnownLHS.One.isZero() || !KnownRHS.One.isZero();
1190 Value *X = nullptr, *Y = nullptr;
1191
1192 switch (I->getOpcode()) {
1193 case Instruction::And:
1194 KnownOut = KnownLHS & KnownRHS;
1195 IsAnd = true;
1196 // and(x, -x) is common idioms that will clear all but lowest set
1197 // bit. If we have a single known bit in x, we can clear all bits
1198 // above it.
1199 // TODO: instcombine often reassociates independent `and` which can hide
1200 // this pattern. Try to match and(x, and(-x, y)) / and(and(x, y), -x).
1201 if (HasKnownOne && match(I, m_c_And(m_Value(X), m_Neg(m_Deferred(X))))) {
1202 // -(-x) == x so using whichever (LHS/RHS) gets us a better result.
1203 if (KnownLHS.countMaxTrailingZeros() <= KnownRHS.countMaxTrailingZeros())
1204 KnownOut = KnownLHS.blsi();
1205 else
1206 KnownOut = KnownRHS.blsi();
1207 }
1208 break;
1209 case Instruction::Or:
1210 KnownOut = KnownLHS | KnownRHS;
1211 break;
1212 case Instruction::Xor:
1213 KnownOut = KnownLHS ^ KnownRHS;
1214 // xor(x, x-1) is common idioms that will clear all but lowest set
1215 // bit. If we have a single known bit in x, we can clear all bits
1216 // above it.
1217 // TODO: xor(x, x-1) is often rewritting as xor(x, x-C) where C !=
1218 // -1 but for the purpose of demanded bits (xor(x, x-C) &
1219 // Demanded) == (xor(x, x-1) & Demanded). Extend the xor pattern
1220 // to use arbitrary C if xor(x, x-C) as the same as xor(x, x-1).
1221 if (HasKnownOne &&
1223 const KnownBits &XBits = I->getOperand(0) == X ? KnownLHS : KnownRHS;
1224 KnownOut = XBits.blsmsk();
1225 }
1226 break;
1227 default:
1228 llvm_unreachable("Invalid Op used in 'analyzeKnownBitsFromAndXorOr'");
1229 }
1230
1231 // and(x, add (x, -1)) is a common idiom that always clears the low bit;
1232 // xor/or(x, add (x, -1)) is an idiom that will always set the low bit.
1233 // here we handle the more general case of adding any odd number by
1234 // matching the form and/xor/or(x, add(x, y)) where y is odd.
1235 // TODO: This could be generalized to clearing any bit set in y where the
1236 // following bit is known to be unset in y.
1237 if (!KnownOut.Zero[0] && !KnownOut.One[0] &&
1241 KnownBits KnownY(BitWidth);
1242 computeKnownBits(Y, DemandedElts, KnownY, Q, Depth + 1);
1243 if (KnownY.countMinTrailingOnes() > 0) {
1244 if (IsAnd)
1245 KnownOut.Zero.setBit(0);
1246 else
1247 KnownOut.One.setBit(0);
1248 }
1249 }
1250 return KnownOut;
1251}
1252
1254 const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q,
1255 unsigned Depth,
1256 const function_ref<KnownBits(const KnownBits &, const KnownBits &)>
1257 KnownBitsFunc) {
1258 APInt DemandedEltsLHS, DemandedEltsRHS;
1260 DemandedElts, DemandedEltsLHS,
1261 DemandedEltsRHS);
1262
1263 const auto ComputeForSingleOpFunc =
1264 [Depth, &Q, KnownBitsFunc](const Value *Op, APInt &DemandedEltsOp) {
1265 return KnownBitsFunc(
1266 computeKnownBits(Op, DemandedEltsOp, Q, Depth + 1),
1267 computeKnownBits(Op, DemandedEltsOp << 1, Q, Depth + 1));
1268 };
1269
1270 if (DemandedEltsRHS.isZero())
1271 return ComputeForSingleOpFunc(I->getOperand(0), DemandedEltsLHS);
1272 if (DemandedEltsLHS.isZero())
1273 return ComputeForSingleOpFunc(I->getOperand(1), DemandedEltsRHS);
1274
1275 return ComputeForSingleOpFunc(I->getOperand(0), DemandedEltsLHS)
1276 .intersectWith(ComputeForSingleOpFunc(I->getOperand(1), DemandedEltsRHS));
1277}
1278
1279// Public so this can be used in `SimplifyDemandedUseBits`.
1281 const KnownBits &KnownLHS,
1282 const KnownBits &KnownRHS,
1283 const SimplifyQuery &SQ,
1284 unsigned Depth) {
1285 auto *FVTy = dyn_cast<FixedVectorType>(I->getType());
1286 APInt DemandedElts =
1287 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
1288
1289 return getKnownBitsFromAndXorOr(I, DemandedElts, KnownLHS, KnownRHS, SQ,
1290 Depth);
1291}
1292
1294 Attribute Attr = F->getFnAttribute(Attribute::VScaleRange);
1295 // Without vscale_range, we only know that vscale is non-zero.
1296 if (!Attr.isValid())
1298
1299 unsigned AttrMin = Attr.getVScaleRangeMin();
1300 // Minimum is larger than vscale width, result is always poison.
1301 if ((unsigned)llvm::bit_width(AttrMin) > BitWidth)
1302 return ConstantRange::getEmpty(BitWidth);
1303
1304 APInt Min(BitWidth, AttrMin);
1305 std::optional<unsigned> AttrMax = Attr.getVScaleRangeMax();
1306 if (!AttrMax || (unsigned)llvm::bit_width(*AttrMax) > BitWidth)
1308
1309 return ConstantRange(Min, APInt(BitWidth, *AttrMax) + 1);
1310}
1311
1313 Value *Arm, bool Invert,
1314 const SimplifyQuery &Q, unsigned Depth) {
1315 // If we have a constant arm, we are done.
1316 if (Known.isConstant())
1317 return;
1318
1319 // See what condition implies about the bits of the select arm.
1320 KnownBits CondRes(Known.getBitWidth());
1321 computeKnownBitsFromCond(Arm, Cond, CondRes, Q, Invert, Depth + 1);
1322 // If we don't get any information from the condition, no reason to
1323 // proceed.
1324 if (CondRes.isUnknown())
1325 return;
1326
1327 // We can have conflict if the condition is dead. I.e if we have
1328 // (x | 64) < 32 ? (x | 64) : y
1329 // we will have conflict at bit 6 from the condition/the `or`.
1330 // In that case just return. Its not particularly important
1331 // what we do, as this select is going to be simplified soon.
1332 CondRes = CondRes.unionWith(Known);
1333 if (CondRes.hasConflict())
1334 return;
1335
1336 // Finally make sure the information we found is valid. This is relatively
1337 // expensive so it's left for the very end.
1338 if (!isGuaranteedNotToBeUndef(Arm, Q.AC, Q.CxtI, Q.DT, Depth + 1))
1339 return;
1340
1341 // Finally, we know we get information from the condition and its valid,
1342 // so return it.
1343 Known = CondRes;
1344}
1345
1346// Match a signed min+max clamp pattern like smax(smin(In, CHigh), CLow).
1347// Returns the input and lower/upper bounds.
1348static bool isSignedMinMaxClamp(const Value *Select, const Value *&In,
1349 const APInt *&CLow, const APInt *&CHigh) {
1351 cast<Operator>(Select)->getOpcode() == Instruction::Select &&
1352 "Input should be a Select!");
1353
1354 const Value *LHS = nullptr, *RHS = nullptr;
1356 if (SPF != SPF_SMAX && SPF != SPF_SMIN)
1357 return false;
1358
1359 if (!match(RHS, m_APInt(CLow)))
1360 return false;
1361
1362 const Value *LHS2 = nullptr, *RHS2 = nullptr;
1364 if (getInverseMinMaxFlavor(SPF) != SPF2)
1365 return false;
1366
1367 if (!match(RHS2, m_APInt(CHigh)))
1368 return false;
1369
1370 if (SPF == SPF_SMIN)
1371 std::swap(CLow, CHigh);
1372
1373 In = LHS2;
1374 return CLow->sle(*CHigh);
1375}
1376
1378 const APInt *&CLow,
1379 const APInt *&CHigh) {
1380 assert((II->getIntrinsicID() == Intrinsic::smin ||
1381 II->getIntrinsicID() == Intrinsic::smax) &&
1382 "Must be smin/smax");
1383
1384 Intrinsic::ID InverseID = getInverseMinMaxIntrinsic(II->getIntrinsicID());
1385 auto *InnerII = dyn_cast<IntrinsicInst>(II->getArgOperand(0));
1386 if (!InnerII || InnerII->getIntrinsicID() != InverseID ||
1387 !match(II->getArgOperand(1), m_APInt(CLow)) ||
1388 !match(InnerII->getArgOperand(1), m_APInt(CHigh)))
1389 return false;
1390
1391 if (II->getIntrinsicID() == Intrinsic::smin)
1392 std::swap(CLow, CHigh);
1393 return CLow->sle(*CHigh);
1394}
1395
1397 KnownBits &Known) {
1398 const APInt *CLow, *CHigh;
1399 if (isSignedMinMaxIntrinsicClamp(II, CLow, CHigh))
1400 Known = Known.unionWith(
1401 ConstantRange::getNonEmpty(*CLow, *CHigh + 1).toKnownBits());
1402}
1403
1405 const APInt &DemandedElts,
1406 KnownBits &Known,
1407 const SimplifyQuery &Q,
1408 unsigned Depth) {
1409 unsigned BitWidth = Known.getBitWidth();
1410
1411 KnownBits Known2(BitWidth);
1412 switch (I->getOpcode()) {
1413 default: break;
1414 case Instruction::Load:
1415 if (MDNode *MD =
1416 Q.IIQ.getMetadata(cast<LoadInst>(I), LLVMContext::MD_range))
1418 break;
1419 case Instruction::And:
1420 computeKnownBits(I->getOperand(1), DemandedElts, Known, Q, Depth + 1);
1421 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
1422
1423 Known = getKnownBitsFromAndXorOr(I, DemandedElts, Known2, Known, Q, Depth);
1424 break;
1425 case Instruction::Or:
1426 computeKnownBits(I->getOperand(1), DemandedElts, Known, Q, Depth + 1);
1427 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
1428
1429 Known = getKnownBitsFromAndXorOr(I, DemandedElts, Known2, Known, Q, Depth);
1430 break;
1431 case Instruction::Xor:
1432 computeKnownBits(I->getOperand(1), DemandedElts, Known, Q, Depth + 1);
1433 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
1434
1435 Known = getKnownBitsFromAndXorOr(I, DemandedElts, Known2, Known, Q, Depth);
1436 break;
1437 case Instruction::Mul: {
1440 computeKnownBitsMul(I->getOperand(0), I->getOperand(1), NSW, NUW,
1441 DemandedElts, Known, Known2, Q, Depth);
1442 break;
1443 }
1444 case Instruction::UDiv: {
1445 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1446 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
1447 Known =
1448 KnownBits::udiv(Known, Known2, Q.IIQ.isExact(cast<BinaryOperator>(I)));
1449 break;
1450 }
1451 case Instruction::SDiv: {
1452 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1453 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
1454 Known =
1455 KnownBits::sdiv(Known, Known2, Q.IIQ.isExact(cast<BinaryOperator>(I)));
1456 break;
1457 }
1458 case Instruction::Select: {
1459 auto ComputeForArm = [&](Value *Arm, bool Invert) {
1460 KnownBits Res(Known.getBitWidth());
1461 computeKnownBits(Arm, DemandedElts, Res, Q, Depth + 1);
1462 adjustKnownBitsForSelectArm(Res, I->getOperand(0), Arm, Invert, Q, Depth);
1463 return Res;
1464 };
1465 // Only known if known in both the LHS and RHS.
1466 Known =
1467 ComputeForArm(I->getOperand(1), /*Invert=*/false)
1468 .intersectWith(ComputeForArm(I->getOperand(2), /*Invert=*/true));
1469 break;
1470 }
1471 case Instruction::FPTrunc:
1472 case Instruction::FPExt:
1473 case Instruction::FPToUI:
1474 case Instruction::FPToSI:
1475 case Instruction::SIToFP:
1476 case Instruction::UIToFP:
1477 break; // Can't work with floating point.
1478 case Instruction::PtrToInt:
1479 case Instruction::PtrToAddr:
1480 case Instruction::IntToPtr:
1481 // Fall through and handle them the same as zext/trunc.
1482 [[fallthrough]];
1483 case Instruction::ZExt:
1484 case Instruction::Trunc: {
1485 Type *SrcTy = I->getOperand(0)->getType();
1486
1487 unsigned SrcBitWidth;
1488 // Note that we handle pointer operands here because of inttoptr/ptrtoint
1489 // which fall through here.
1490 Type *ScalarTy = SrcTy->getScalarType();
1491 SrcBitWidth = ScalarTy->isPointerTy() ?
1492 Q.DL.getPointerTypeSizeInBits(ScalarTy) :
1493 Q.DL.getTypeSizeInBits(ScalarTy);
1494
1495 assert(SrcBitWidth && "SrcBitWidth can't be zero");
1496 Known = Known.anyextOrTrunc(SrcBitWidth);
1497 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1498 if (auto *Inst = dyn_cast<PossiblyNonNegInst>(I);
1499 Inst && Inst->hasNonNeg() && !Known.isNegative())
1500 Known.makeNonNegative();
1501 Known = Known.zextOrTrunc(BitWidth);
1502 break;
1503 }
1504 case Instruction::BitCast: {
1505 Type *SrcTy = I->getOperand(0)->getType();
1506 if (SrcTy->isIntOrPtrTy() &&
1507 // TODO: For now, not handling conversions like:
1508 // (bitcast i64 %x to <2 x i32>)
1509 !I->getType()->isVectorTy()) {
1510 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
1511 break;
1512 }
1513
1514 const Value *V;
1515 // Handle bitcast from floating point to integer.
1516 if (match(I, m_ElementWiseBitCast(m_Value(V))) &&
1517 V->getType()->isFPOrFPVectorTy()) {
1518 Type *FPType = V->getType()->getScalarType();
1519 KnownFPClass Result =
1520 computeKnownFPClass(V, DemandedElts, fcAllFlags, Q, Depth + 1);
1521 FPClassTest FPClasses = Result.KnownFPClasses;
1522
1523 // TODO: Treat it as zero/poison if the use of I is unreachable.
1524 if (FPClasses == fcNone)
1525 break;
1526
1527 if (Result.isKnownNever(fcNormal | fcSubnormal | fcNan)) {
1528 Known.setAllConflict();
1529
1530 if (FPClasses & fcInf)
1532 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt()));
1533
1534 if (FPClasses & fcZero)
1536 APInt::getZero(FPType->getScalarSizeInBits())));
1537
1538 Known.Zero.clearSignBit();
1539 Known.One.clearSignBit();
1540 }
1541
1542 if (Result.SignBit) {
1543 if (*Result.SignBit)
1544 Known.makeNegative();
1545 else
1546 Known.makeNonNegative();
1547 }
1548
1549 break;
1550 }
1551
1552 // Handle cast from vector integer type to scalar or vector integer.
1553 auto *SrcVecTy = dyn_cast<FixedVectorType>(SrcTy);
1554 if (!SrcVecTy || !SrcVecTy->getElementType()->isIntegerTy() ||
1555 !I->getType()->isIntOrIntVectorTy() ||
1556 isa<ScalableVectorType>(I->getType()))
1557 break;
1558
1559 unsigned NumElts = DemandedElts.getBitWidth();
1560 bool IsLE = Q.DL.isLittleEndian();
1561 // Look through a cast from narrow vector elements to wider type.
1562 // Examples: v4i32 -> v2i64, v3i8 -> v24
1563 unsigned SubBitWidth = SrcVecTy->getScalarSizeInBits();
1564 if (BitWidth % SubBitWidth == 0) {
1565 // Known bits are automatically intersected across demanded elements of a
1566 // vector. So for example, if a bit is computed as known zero, it must be
1567 // zero across all demanded elements of the vector.
1568 //
1569 // For this bitcast, each demanded element of the output is sub-divided
1570 // across a set of smaller vector elements in the source vector. To get
1571 // the known bits for an entire element of the output, compute the known
1572 // bits for each sub-element sequentially. This is done by shifting the
1573 // one-set-bit demanded elements parameter across the sub-elements for
1574 // consecutive calls to computeKnownBits. We are using the demanded
1575 // elements parameter as a mask operator.
1576 //
1577 // The known bits of each sub-element are then inserted into place
1578 // (dependent on endian) to form the full result of known bits.
1579 unsigned SubScale = BitWidth / SubBitWidth;
1580 APInt SubDemandedElts = APInt::getZero(NumElts * SubScale);
1581 for (unsigned i = 0; i != NumElts; ++i) {
1582 if (DemandedElts[i])
1583 SubDemandedElts.setBit(i * SubScale);
1584 }
1585
1586 KnownBits KnownSrc(SubBitWidth);
1587 for (unsigned i = 0; i != SubScale; ++i) {
1588 computeKnownBits(I->getOperand(0), SubDemandedElts.shl(i), KnownSrc, Q,
1589 Depth + 1);
1590 unsigned ShiftElt = IsLE ? i : SubScale - 1 - i;
1591 Known.insertBits(KnownSrc, ShiftElt * SubBitWidth);
1592 }
1593 }
1594 // Look through a cast from wider vector elements to narrow type.
1595 // Examples: v2i64 -> v4i32
1596 if (SubBitWidth % BitWidth == 0) {
1597 unsigned SubScale = SubBitWidth / BitWidth;
1598 KnownBits KnownSrc(SubBitWidth);
1599 APInt SubDemandedElts =
1600 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
1601 computeKnownBits(I->getOperand(0), SubDemandedElts, KnownSrc, Q,
1602 Depth + 1);
1603
1604 Known.setAllConflict();
1605 for (unsigned i = 0; i != NumElts; ++i) {
1606 if (DemandedElts[i]) {
1607 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
1608 unsigned Offset = (Shifts % SubScale) * BitWidth;
1609 Known = Known.intersectWith(KnownSrc.extractBits(BitWidth, Offset));
1610 if (Known.isUnknown())
1611 break;
1612 }
1613 }
1614 }
1615 break;
1616 }
1617 case Instruction::SExt: {
1618 // Compute the bits in the result that are not present in the input.
1619 unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
1620
1621 Known = Known.trunc(SrcBitWidth);
1622 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1623 // If the sign bit of the input is known set or clear, then we know the
1624 // top bits of the result.
1625 Known = Known.sext(BitWidth);
1626 break;
1627 }
1628 case Instruction::Shl: {
1631 auto KF = [NUW, NSW](const KnownBits &KnownVal, const KnownBits &KnownAmt,
1632 bool ShAmtNonZero) {
1633 return KnownBits::shl(KnownVal, KnownAmt, NUW, NSW, ShAmtNonZero);
1634 };
1635 computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Q, Depth,
1636 KF);
1637 // Trailing zeros of a right-shifted constant never decrease.
1638 const APInt *C;
1639 if (match(I->getOperand(0), m_APInt(C)))
1640 Known.Zero.setLowBits(C->countr_zero());
1641 break;
1642 }
1643 case Instruction::LShr: {
1644 bool Exact = Q.IIQ.isExact(cast<BinaryOperator>(I));
1645 auto KF = [Exact](const KnownBits &KnownVal, const KnownBits &KnownAmt,
1646 bool ShAmtNonZero) {
1647 return KnownBits::lshr(KnownVal, KnownAmt, ShAmtNonZero, Exact);
1648 };
1649 computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Q, Depth,
1650 KF);
1651 // Leading zeros of a left-shifted constant never decrease.
1652 const APInt *C;
1653 if (match(I->getOperand(0), m_APInt(C)))
1654 Known.Zero.setHighBits(C->countl_zero());
1655 break;
1656 }
1657 case Instruction::AShr: {
1658 bool Exact = Q.IIQ.isExact(cast<BinaryOperator>(I));
1659 auto KF = [Exact](const KnownBits &KnownVal, const KnownBits &KnownAmt,
1660 bool ShAmtNonZero) {
1661 return KnownBits::ashr(KnownVal, KnownAmt, ShAmtNonZero, Exact);
1662 };
1663 computeKnownBitsFromShiftOperator(I, DemandedElts, Known, Known2, Q, Depth,
1664 KF);
1665 break;
1666 }
1667 case Instruction::Sub: {
1670 computeKnownBitsAddSub(false, I->getOperand(0), I->getOperand(1), NSW, NUW,
1671 DemandedElts, Known, Known2, Q, Depth);
1672 break;
1673 }
1674 case Instruction::Add: {
1677 computeKnownBitsAddSub(true, I->getOperand(0), I->getOperand(1), NSW, NUW,
1678 DemandedElts, Known, Known2, Q, Depth);
1679 break;
1680 }
1681 case Instruction::SRem:
1682 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1683 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
1684 Known = KnownBits::srem(Known, Known2);
1685 break;
1686
1687 case Instruction::URem:
1688 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
1689 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
1690 Known = KnownBits::urem(Known, Known2);
1691 break;
1692 case Instruction::Alloca:
1694 break;
1695 case Instruction::GetElementPtr: {
1696 // Analyze all of the subscripts of this getelementptr instruction
1697 // to determine if we can prove known low zero bits.
1698 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
1699 // Accumulate the constant indices in a separate variable
1700 // to minimize the number of calls to computeForAddSub.
1701 unsigned IndexWidth = Q.DL.getIndexTypeSizeInBits(I->getType());
1702 APInt AccConstIndices(IndexWidth, 0);
1703
1704 auto AddIndexToKnown = [&](KnownBits IndexBits) {
1705 if (IndexWidth == BitWidth) {
1706 // Note that inbounds does *not* guarantee nsw for the addition, as only
1707 // the offset is signed, while the base address is unsigned.
1708 Known = KnownBits::add(Known, IndexBits);
1709 } else {
1710 // If the index width is smaller than the pointer width, only add the
1711 // value to the low bits.
1712 assert(IndexWidth < BitWidth &&
1713 "Index width can't be larger than pointer width");
1714 Known.insertBits(KnownBits::add(Known.trunc(IndexWidth), IndexBits), 0);
1715 }
1716 };
1717
1719 for (unsigned i = 1, e = I->getNumOperands(); i != e; ++i, ++GTI) {
1720 // TrailZ can only become smaller, short-circuit if we hit zero.
1721 if (Known.isUnknown())
1722 break;
1723
1724 Value *Index = I->getOperand(i);
1725
1726 // Handle case when index is zero.
1727 Constant *CIndex = dyn_cast<Constant>(Index);
1728 if (CIndex && CIndex->isZeroValue())
1729 continue;
1730
1731 if (StructType *STy = GTI.getStructTypeOrNull()) {
1732 // Handle struct member offset arithmetic.
1733
1734 assert(CIndex &&
1735 "Access to structure field must be known at compile time");
1736
1737 if (CIndex->getType()->isVectorTy())
1738 Index = CIndex->getSplatValue();
1739
1740 unsigned Idx = cast<ConstantInt>(Index)->getZExtValue();
1741 const StructLayout *SL = Q.DL.getStructLayout(STy);
1742 uint64_t Offset = SL->getElementOffset(Idx);
1743 AccConstIndices += Offset;
1744 continue;
1745 }
1746
1747 // Handle array index arithmetic.
1748 Type *IndexedTy = GTI.getIndexedType();
1749 if (!IndexedTy->isSized()) {
1750 Known.resetAll();
1751 break;
1752 }
1753
1754 TypeSize Stride = GTI.getSequentialElementStride(Q.DL);
1755 uint64_t StrideInBytes = Stride.getKnownMinValue();
1756 if (!Stride.isScalable()) {
1757 // Fast path for constant offset.
1758 if (auto *CI = dyn_cast<ConstantInt>(Index)) {
1759 AccConstIndices +=
1760 CI->getValue().sextOrTrunc(IndexWidth) * StrideInBytes;
1761 continue;
1762 }
1763 }
1764
1765 KnownBits IndexBits =
1766 computeKnownBits(Index, Q, Depth + 1).sextOrTrunc(IndexWidth);
1767 KnownBits ScalingFactor(IndexWidth);
1768 // Multiply by current sizeof type.
1769 // &A[i] == A + i * sizeof(*A[i]).
1770 if (Stride.isScalable()) {
1771 // For scalable types the only thing we know about sizeof is
1772 // that this is a multiple of the minimum size.
1773 ScalingFactor.Zero.setLowBits(llvm::countr_zero(StrideInBytes));
1774 } else {
1775 ScalingFactor =
1776 KnownBits::makeConstant(APInt(IndexWidth, StrideInBytes));
1777 }
1778 AddIndexToKnown(KnownBits::mul(IndexBits, ScalingFactor));
1779 }
1780 if (!Known.isUnknown() && !AccConstIndices.isZero())
1781 AddIndexToKnown(KnownBits::makeConstant(AccConstIndices));
1782 break;
1783 }
1784 case Instruction::PHI: {
1785 const PHINode *P = cast<PHINode>(I);
1786 BinaryOperator *BO = nullptr;
1787 Value *R = nullptr, *L = nullptr;
1788 if (matchSimpleRecurrence(P, BO, R, L)) {
1789 // Handle the case of a simple two-predecessor recurrence PHI.
1790 // There's a lot more that could theoretically be done here, but
1791 // this is sufficient to catch some interesting cases.
1792 unsigned Opcode = BO->getOpcode();
1793
1794 switch (Opcode) {
1795 // If this is a shift recurrence, we know the bits being shifted in. We
1796 // can combine that with information about the start value of the
1797 // recurrence to conclude facts about the result. If this is a udiv
1798 // recurrence, we know that the result can never exceed either the
1799 // numerator or the start value, whichever is greater.
1800 case Instruction::LShr:
1801 case Instruction::AShr:
1802 case Instruction::Shl:
1803 case Instruction::UDiv:
1804 if (BO->getOperand(0) != I)
1805 break;
1806 [[fallthrough]];
1807
1808 // For a urem recurrence, the result can never exceed the start value. The
1809 // phi could either be the numerator or the denominator.
1810 case Instruction::URem: {
1811 // We have matched a recurrence of the form:
1812 // %iv = [R, %entry], [%iv.next, %backedge]
1813 // %iv.next = shift_op %iv, L
1814
1815 // Recurse with the phi context to avoid concern about whether facts
1816 // inferred hold at original context instruction. TODO: It may be
1817 // correct to use the original context. IF warranted, explore and
1818 // add sufficient tests to cover.
1820 RecQ.CxtI = P;
1821 computeKnownBits(R, DemandedElts, Known2, RecQ, Depth + 1);
1822 switch (Opcode) {
1823 case Instruction::Shl:
1824 // A shl recurrence will only increase the tailing zeros
1825 Known.Zero.setLowBits(Known2.countMinTrailingZeros());
1826 break;
1827 case Instruction::LShr:
1828 case Instruction::UDiv:
1829 case Instruction::URem:
1830 // lshr, udiv, and urem recurrences will preserve the leading zeros of
1831 // the start value.
1832 Known.Zero.setHighBits(Known2.countMinLeadingZeros());
1833 break;
1834 case Instruction::AShr:
1835 // An ashr recurrence will extend the initial sign bit
1836 Known.Zero.setHighBits(Known2.countMinLeadingZeros());
1837 Known.One.setHighBits(Known2.countMinLeadingOnes());
1838 break;
1839 }
1840 break;
1841 }
1842
1843 // Check for operations that have the property that if
1844 // both their operands have low zero bits, the result
1845 // will have low zero bits.
1846 case Instruction::Add:
1847 case Instruction::Sub:
1848 case Instruction::And:
1849 case Instruction::Or:
1850 case Instruction::Mul: {
1851 // Change the context instruction to the "edge" that flows into the
1852 // phi. This is important because that is where the value is actually
1853 // "evaluated" even though it is used later somewhere else. (see also
1854 // D69571).
1856
1857 unsigned OpNum = P->getOperand(0) == R ? 0 : 1;
1858 Instruction *RInst = P->getIncomingBlock(OpNum)->getTerminator();
1859 Instruction *LInst = P->getIncomingBlock(1 - OpNum)->getTerminator();
1860
1861 // Ok, we have a PHI of the form L op= R. Check for low
1862 // zero bits.
1863 RecQ.CxtI = RInst;
1864 computeKnownBits(R, DemandedElts, Known2, RecQ, Depth + 1);
1865
1866 // We need to take the minimum number of known bits
1867 KnownBits Known3(BitWidth);
1868 RecQ.CxtI = LInst;
1869 computeKnownBits(L, DemandedElts, Known3, RecQ, Depth + 1);
1870
1871 Known.Zero.setLowBits(std::min(Known2.countMinTrailingZeros(),
1872 Known3.countMinTrailingZeros()));
1873
1874 auto *OverflowOp = dyn_cast<OverflowingBinaryOperator>(BO);
1875 if (!OverflowOp || !Q.IIQ.hasNoSignedWrap(OverflowOp))
1876 break;
1877
1878 switch (Opcode) {
1879 // If initial value of recurrence is nonnegative, and we are adding
1880 // a nonnegative number with nsw, the result can only be nonnegative
1881 // or poison value regardless of the number of times we execute the
1882 // add in phi recurrence. If initial value is negative and we are
1883 // adding a negative number with nsw, the result can only be
1884 // negative or poison value. Similar arguments apply to sub and mul.
1885 //
1886 // (add non-negative, non-negative) --> non-negative
1887 // (add negative, negative) --> negative
1888 case Instruction::Add: {
1889 if (Known2.isNonNegative() && Known3.isNonNegative())
1890 Known.makeNonNegative();
1891 else if (Known2.isNegative() && Known3.isNegative())
1892 Known.makeNegative();
1893 break;
1894 }
1895
1896 // (sub nsw non-negative, negative) --> non-negative
1897 // (sub nsw negative, non-negative) --> negative
1898 case Instruction::Sub: {
1899 if (BO->getOperand(0) != I)
1900 break;
1901 if (Known2.isNonNegative() && Known3.isNegative())
1902 Known.makeNonNegative();
1903 else if (Known2.isNegative() && Known3.isNonNegative())
1904 Known.makeNegative();
1905 break;
1906 }
1907
1908 // (mul nsw non-negative, non-negative) --> non-negative
1909 case Instruction::Mul:
1910 if (Known2.isNonNegative() && Known3.isNonNegative())
1911 Known.makeNonNegative();
1912 break;
1913
1914 default:
1915 break;
1916 }
1917 break;
1918 }
1919
1920 default:
1921 break;
1922 }
1923 }
1924
1925 // Unreachable blocks may have zero-operand PHI nodes.
1926 if (P->getNumIncomingValues() == 0)
1927 break;
1928
1929 // Otherwise take the unions of the known bit sets of the operands,
1930 // taking conservative care to avoid excessive recursion.
1931 if (Depth < MaxAnalysisRecursionDepth - 1 && Known.isUnknown()) {
1932 // Skip if every incoming value references to ourself.
1933 if (isa_and_nonnull<UndefValue>(P->hasConstantValue()))
1934 break;
1935
1936 Known.setAllConflict();
1937 for (const Use &U : P->operands()) {
1938 Value *IncValue;
1939 const PHINode *CxtPhi;
1940 Instruction *CxtI;
1941 breakSelfRecursivePHI(&U, P, IncValue, CxtI, &CxtPhi);
1942 // Skip direct self references.
1943 if (IncValue == P)
1944 continue;
1945
1946 // Change the context instruction to the "edge" that flows into the
1947 // phi. This is important because that is where the value is actually
1948 // "evaluated" even though it is used later somewhere else. (see also
1949 // D69571).
1951
1952 Known2 = KnownBits(BitWidth);
1953
1954 // Recurse, but cap the recursion to one level, because we don't
1955 // want to waste time spinning around in loops.
1956 // TODO: See if we can base recursion limiter on number of incoming phi
1957 // edges so we don't overly clamp analysis.
1958 computeKnownBits(IncValue, DemandedElts, Known2, RecQ,
1960
1961 // See if we can further use a conditional branch into the phi
1962 // to help us determine the range of the value.
1963 if (!Known2.isConstant()) {
1964 CmpPredicate Pred;
1965 const APInt *RHSC;
1966 BasicBlock *TrueSucc, *FalseSucc;
1967 // TODO: Use RHS Value and compute range from its known bits.
1968 if (match(RecQ.CxtI,
1969 m_Br(m_c_ICmp(Pred, m_Specific(IncValue), m_APInt(RHSC)),
1970 m_BasicBlock(TrueSucc), m_BasicBlock(FalseSucc)))) {
1971 // Check for cases of duplicate successors.
1972 if ((TrueSucc == CxtPhi->getParent()) !=
1973 (FalseSucc == CxtPhi->getParent())) {
1974 // If we're using the false successor, invert the predicate.
1975 if (FalseSucc == CxtPhi->getParent())
1976 Pred = CmpInst::getInversePredicate(Pred);
1977 // Get the knownbits implied by the incoming phi condition.
1978 auto CR = ConstantRange::makeExactICmpRegion(Pred, *RHSC);
1979 KnownBits KnownUnion = Known2.unionWith(CR.toKnownBits());
1980 // We can have conflicts here if we are analyzing deadcode (its
1981 // impossible for us reach this BB based the icmp).
1982 if (KnownUnion.hasConflict()) {
1983 // No reason to continue analyzing in a known dead region, so
1984 // just resetAll and break. This will cause us to also exit the
1985 // outer loop.
1986 Known.resetAll();
1987 break;
1988 }
1989 Known2 = KnownUnion;
1990 }
1991 }
1992 }
1993
1994 Known = Known.intersectWith(Known2);
1995 // If all bits have been ruled out, there's no need to check
1996 // more operands.
1997 if (Known.isUnknown())
1998 break;
1999 }
2000 }
2001 break;
2002 }
2003 case Instruction::Call:
2004 case Instruction::Invoke: {
2005 // If range metadata is attached to this call, set known bits from that,
2006 // and then intersect with known bits based on other properties of the
2007 // function.
2008 if (MDNode *MD =
2009 Q.IIQ.getMetadata(cast<Instruction>(I), LLVMContext::MD_range))
2011
2012 const auto *CB = cast<CallBase>(I);
2013
2014 if (std::optional<ConstantRange> Range = CB->getRange())
2015 Known = Known.unionWith(Range->toKnownBits());
2016
2017 if (const Value *RV = CB->getReturnedArgOperand()) {
2018 if (RV->getType() == I->getType()) {
2019 computeKnownBits(RV, Known2, Q, Depth + 1);
2020 Known = Known.unionWith(Known2);
2021 // If the function doesn't return properly for all input values
2022 // (e.g. unreachable exits) then there might be conflicts between the
2023 // argument value and the range metadata. Simply discard the known bits
2024 // in case of conflicts.
2025 if (Known.hasConflict())
2026 Known.resetAll();
2027 }
2028 }
2029 if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
2030 switch (II->getIntrinsicID()) {
2031 default:
2032 break;
2033 case Intrinsic::abs: {
2034 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2035 bool IntMinIsPoison = match(II->getArgOperand(1), m_One());
2036 Known = Known.unionWith(Known2.abs(IntMinIsPoison));
2037 break;
2038 }
2039 case Intrinsic::bitreverse:
2040 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2041 Known = Known.unionWith(Known2.reverseBits());
2042 break;
2043 case Intrinsic::bswap:
2044 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2045 Known = Known.unionWith(Known2.byteSwap());
2046 break;
2047 case Intrinsic::ctlz: {
2048 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2049 // If we have a known 1, its position is our upper bound.
2050 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
2051 // If this call is poison for 0 input, the result will be less than 2^n.
2052 if (II->getArgOperand(1) == ConstantInt::getTrue(II->getContext()))
2053 PossibleLZ = std::min(PossibleLZ, BitWidth - 1);
2054 unsigned LowBits = llvm::bit_width(PossibleLZ);
2055 Known.Zero.setBitsFrom(LowBits);
2056 break;
2057 }
2058 case Intrinsic::cttz: {
2059 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2060 // If we have a known 1, its position is our upper bound.
2061 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
2062 // If this call is poison for 0 input, the result will be less than 2^n.
2063 if (II->getArgOperand(1) == ConstantInt::getTrue(II->getContext()))
2064 PossibleTZ = std::min(PossibleTZ, BitWidth - 1);
2065 unsigned LowBits = llvm::bit_width(PossibleTZ);
2066 Known.Zero.setBitsFrom(LowBits);
2067 break;
2068 }
2069 case Intrinsic::ctpop: {
2070 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2071 // We can bound the space the count needs. Also, bits known to be zero
2072 // can't contribute to the population.
2073 unsigned BitsPossiblySet = Known2.countMaxPopulation();
2074 unsigned LowBits = llvm::bit_width(BitsPossiblySet);
2075 Known.Zero.setBitsFrom(LowBits);
2076 // TODO: we could bound KnownOne using the lower bound on the number
2077 // of bits which might be set provided by popcnt KnownOne2.
2078 break;
2079 }
2080 case Intrinsic::fshr:
2081 case Intrinsic::fshl: {
2082 const APInt *SA;
2083 if (!match(I->getOperand(2), m_APInt(SA)))
2084 break;
2085
2086 // Normalize to funnel shift left.
2087 uint64_t ShiftAmt = SA->urem(BitWidth);
2088 if (II->getIntrinsicID() == Intrinsic::fshr)
2089 ShiftAmt = BitWidth - ShiftAmt;
2090
2091 KnownBits Known3(BitWidth);
2092 computeKnownBits(I->getOperand(0), DemandedElts, Known2, Q, Depth + 1);
2093 computeKnownBits(I->getOperand(1), DemandedElts, Known3, Q, Depth + 1);
2094
2095 Known2 <<= ShiftAmt;
2096 Known3 >>= BitWidth - ShiftAmt;
2097 Known = Known2.unionWith(Known3);
2098 break;
2099 }
2100 case Intrinsic::uadd_sat:
2101 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2102 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2103 Known = KnownBits::uadd_sat(Known, Known2);
2104 break;
2105 case Intrinsic::usub_sat:
2106 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2107 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2108 Known = KnownBits::usub_sat(Known, Known2);
2109 break;
2110 case Intrinsic::sadd_sat:
2111 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2112 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2113 Known = KnownBits::sadd_sat(Known, Known2);
2114 break;
2115 case Intrinsic::ssub_sat:
2116 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2117 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2118 Known = KnownBits::ssub_sat(Known, Known2);
2119 break;
2120 // Vec reverse preserves bits from input vec.
2121 case Intrinsic::vector_reverse:
2122 computeKnownBits(I->getOperand(0), DemandedElts.reverseBits(), Known, Q,
2123 Depth + 1);
2124 break;
2125 // for min/max/and/or reduce, any bit common to each element in the
2126 // input vec is set in the output.
2127 case Intrinsic::vector_reduce_and:
2128 case Intrinsic::vector_reduce_or:
2129 case Intrinsic::vector_reduce_umax:
2130 case Intrinsic::vector_reduce_umin:
2131 case Intrinsic::vector_reduce_smax:
2132 case Intrinsic::vector_reduce_smin:
2133 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2134 break;
2135 case Intrinsic::vector_reduce_xor: {
2136 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2137 // The zeros common to all vecs are zero in the output.
2138 // If the number of elements is odd, then the common ones remain. If the
2139 // number of elements is even, then the common ones becomes zeros.
2140 auto *VecTy = cast<VectorType>(I->getOperand(0)->getType());
2141 // Even, so the ones become zeros.
2142 bool EvenCnt = VecTy->getElementCount().isKnownEven();
2143 if (EvenCnt)
2144 Known.Zero |= Known.One;
2145 // Maybe even element count so need to clear ones.
2146 if (VecTy->isScalableTy() || EvenCnt)
2147 Known.One.clearAllBits();
2148 break;
2149 }
2150 case Intrinsic::vector_reduce_add: {
2151 auto *VecTy = dyn_cast<FixedVectorType>(I->getOperand(0)->getType());
2152 if (!VecTy)
2153 break;
2154 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2155 Known = Known.reduceAdd(VecTy->getNumElements());
2156 break;
2157 }
2158 case Intrinsic::umin:
2159 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2160 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2161 Known = KnownBits::umin(Known, Known2);
2162 break;
2163 case Intrinsic::umax:
2164 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2165 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2166 Known = KnownBits::umax(Known, Known2);
2167 break;
2168 case Intrinsic::smin:
2169 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2170 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2171 Known = KnownBits::smin(Known, Known2);
2173 break;
2174 case Intrinsic::smax:
2175 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2176 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2177 Known = KnownBits::smax(Known, Known2);
2179 break;
2180 case Intrinsic::ptrmask: {
2181 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2182
2183 const Value *Mask = I->getOperand(1);
2184 Known2 = KnownBits(Mask->getType()->getScalarSizeInBits());
2185 computeKnownBits(Mask, DemandedElts, Known2, Q, Depth + 1);
2186 // TODO: 1-extend would be more precise.
2187 Known &= Known2.anyextOrTrunc(BitWidth);
2188 break;
2189 }
2190 case Intrinsic::x86_sse2_pmulh_w:
2191 case Intrinsic::x86_avx2_pmulh_w:
2192 case Intrinsic::x86_avx512_pmulh_w_512:
2193 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2194 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2195 Known = KnownBits::mulhs(Known, Known2);
2196 break;
2197 case Intrinsic::x86_sse2_pmulhu_w:
2198 case Intrinsic::x86_avx2_pmulhu_w:
2199 case Intrinsic::x86_avx512_pmulhu_w_512:
2200 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2201 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2202 Known = KnownBits::mulhu(Known, Known2);
2203 break;
2204 case Intrinsic::x86_sse42_crc32_64_64:
2205 Known.Zero.setBitsFrom(32);
2206 break;
2207 case Intrinsic::x86_ssse3_phadd_d_128:
2208 case Intrinsic::x86_ssse3_phadd_w_128:
2209 case Intrinsic::x86_avx2_phadd_d:
2210 case Intrinsic::x86_avx2_phadd_w: {
2212 I, DemandedElts, Q, Depth,
2213 [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
2214 return KnownBits::add(KnownLHS, KnownRHS);
2215 });
2216 break;
2217 }
2218 case Intrinsic::x86_ssse3_phadd_sw_128:
2219 case Intrinsic::x86_avx2_phadd_sw: {
2221 I, DemandedElts, Q, Depth, KnownBits::sadd_sat);
2222 break;
2223 }
2224 case Intrinsic::x86_ssse3_phsub_d_128:
2225 case Intrinsic::x86_ssse3_phsub_w_128:
2226 case Intrinsic::x86_avx2_phsub_d:
2227 case Intrinsic::x86_avx2_phsub_w: {
2229 I, DemandedElts, Q, Depth,
2230 [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
2231 return KnownBits::sub(KnownLHS, KnownRHS);
2232 });
2233 break;
2234 }
2235 case Intrinsic::x86_ssse3_phsub_sw_128:
2236 case Intrinsic::x86_avx2_phsub_sw: {
2238 I, DemandedElts, Q, Depth, KnownBits::ssub_sat);
2239 break;
2240 }
2241 case Intrinsic::riscv_vsetvli:
2242 case Intrinsic::riscv_vsetvlimax: {
2243 bool HasAVL = II->getIntrinsicID() == Intrinsic::riscv_vsetvli;
2244 const ConstantRange Range = getVScaleRange(II->getFunction(), BitWidth);
2246 cast<ConstantInt>(II->getArgOperand(HasAVL))->getZExtValue());
2247 RISCVVType::VLMUL VLMUL = static_cast<RISCVVType::VLMUL>(
2248 cast<ConstantInt>(II->getArgOperand(1 + HasAVL))->getZExtValue());
2249 uint64_t MaxVLEN =
2250 Range.getUnsignedMax().getZExtValue() * RISCV::RVVBitsPerBlock;
2251 uint64_t MaxVL = MaxVLEN / RISCVVType::getSEWLMULRatio(SEW, VLMUL);
2252
2253 // Result of vsetvli must be not larger than AVL.
2254 if (HasAVL)
2255 if (auto *CI = dyn_cast<ConstantInt>(II->getArgOperand(0)))
2256 MaxVL = std::min(MaxVL, CI->getZExtValue());
2257
2258 unsigned KnownZeroFirstBit = Log2_32(MaxVL) + 1;
2259 if (BitWidth > KnownZeroFirstBit)
2260 Known.Zero.setBitsFrom(KnownZeroFirstBit);
2261 break;
2262 }
2263 case Intrinsic::vscale: {
2264 if (!II->getParent() || !II->getFunction())
2265 break;
2266
2267 Known = getVScaleRange(II->getFunction(), BitWidth).toKnownBits();
2268 break;
2269 }
2270 }
2271 }
2272 break;
2273 }
2274 case Instruction::ShuffleVector: {
2275 if (auto *Splat = getSplatValue(I)) {
2276 computeKnownBits(Splat, Known, Q, Depth + 1);
2277 break;
2278 }
2279
2280 auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
2281 // FIXME: Do we need to handle ConstantExpr involving shufflevectors?
2282 if (!Shuf) {
2283 Known.resetAll();
2284 return;
2285 }
2286 // For undef elements, we don't know anything about the common state of
2287 // the shuffle result.
2288 APInt DemandedLHS, DemandedRHS;
2289 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS)) {
2290 Known.resetAll();
2291 return;
2292 }
2293 Known.setAllConflict();
2294 if (!!DemandedLHS) {
2295 const Value *LHS = Shuf->getOperand(0);
2296 computeKnownBits(LHS, DemandedLHS, Known, Q, Depth + 1);
2297 // If we don't know any bits, early out.
2298 if (Known.isUnknown())
2299 break;
2300 }
2301 if (!!DemandedRHS) {
2302 const Value *RHS = Shuf->getOperand(1);
2303 computeKnownBits(RHS, DemandedRHS, Known2, Q, Depth + 1);
2304 Known = Known.intersectWith(Known2);
2305 }
2306 break;
2307 }
2308 case Instruction::InsertElement: {
2309 if (isa<ScalableVectorType>(I->getType())) {
2310 Known.resetAll();
2311 return;
2312 }
2313 const Value *Vec = I->getOperand(0);
2314 const Value *Elt = I->getOperand(1);
2315 auto *CIdx = dyn_cast<ConstantInt>(I->getOperand(2));
2316 unsigned NumElts = DemandedElts.getBitWidth();
2317 APInt DemandedVecElts = DemandedElts;
2318 bool NeedsElt = true;
2319 // If we know the index we are inserting too, clear it from Vec check.
2320 if (CIdx && CIdx->getValue().ult(NumElts)) {
2321 DemandedVecElts.clearBit(CIdx->getZExtValue());
2322 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2323 }
2324
2325 Known.setAllConflict();
2326 if (NeedsElt) {
2327 computeKnownBits(Elt, Known, Q, Depth + 1);
2328 // If we don't know any bits, early out.
2329 if (Known.isUnknown())
2330 break;
2331 }
2332
2333 if (!DemandedVecElts.isZero()) {
2334 computeKnownBits(Vec, DemandedVecElts, Known2, Q, Depth + 1);
2335 Known = Known.intersectWith(Known2);
2336 }
2337 break;
2338 }
2339 case Instruction::ExtractElement: {
2340 // Look through extract element. If the index is non-constant or
2341 // out-of-range demand all elements, otherwise just the extracted element.
2342 const Value *Vec = I->getOperand(0);
2343 const Value *Idx = I->getOperand(1);
2344 auto *CIdx = dyn_cast<ConstantInt>(Idx);
2345 if (isa<ScalableVectorType>(Vec->getType())) {
2346 // FIXME: there's probably *something* we can do with scalable vectors
2347 Known.resetAll();
2348 break;
2349 }
2350 unsigned NumElts = cast<FixedVectorType>(Vec->getType())->getNumElements();
2351 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
2352 if (CIdx && CIdx->getValue().ult(NumElts))
2353 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
2354 computeKnownBits(Vec, DemandedVecElts, Known, Q, Depth + 1);
2355 break;
2356 }
2357 case Instruction::ExtractValue:
2358 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I->getOperand(0))) {
2360 if (EVI->getNumIndices() != 1) break;
2361 if (EVI->getIndices()[0] == 0) {
2362 switch (II->getIntrinsicID()) {
2363 default: break;
2364 case Intrinsic::uadd_with_overflow:
2365 case Intrinsic::sadd_with_overflow:
2367 true, II->getArgOperand(0), II->getArgOperand(1), /*NSW=*/false,
2368 /* NUW=*/false, DemandedElts, Known, Known2, Q, Depth);
2369 break;
2370 case Intrinsic::usub_with_overflow:
2371 case Intrinsic::ssub_with_overflow:
2373 false, II->getArgOperand(0), II->getArgOperand(1), /*NSW=*/false,
2374 /* NUW=*/false, DemandedElts, Known, Known2, Q, Depth);
2375 break;
2376 case Intrinsic::umul_with_overflow:
2377 case Intrinsic::smul_with_overflow:
2378 computeKnownBitsMul(II->getArgOperand(0), II->getArgOperand(1), false,
2379 false, DemandedElts, Known, Known2, Q, Depth);
2380 break;
2381 }
2382 }
2383 }
2384 break;
2385 case Instruction::Freeze:
2386 if (isGuaranteedNotToBePoison(I->getOperand(0), Q.AC, Q.CxtI, Q.DT,
2387 Depth + 1))
2388 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2389 break;
2390 }
2391}
2392
2393/// Determine which bits of V are known to be either zero or one and return
2394/// them.
2395KnownBits llvm::computeKnownBits(const Value *V, const APInt &DemandedElts,
2396 const SimplifyQuery &Q, unsigned Depth) {
2397 KnownBits Known(getBitWidth(V->getType(), Q.DL));
2398 ::computeKnownBits(V, DemandedElts, Known, Q, Depth);
2399 return Known;
2400}
2401
2402/// Determine which bits of V are known to be either zero or one and return
2403/// them.
2405 unsigned Depth) {
2406 KnownBits Known(getBitWidth(V->getType(), Q.DL));
2407 computeKnownBits(V, Known, Q, Depth);
2408 return Known;
2409}
2410
2411/// Determine which bits of V are known to be either zero or one and return
2412/// them in the Known bit set.
2413///
2414/// NOTE: we cannot consider 'undef' to be "IsZero" here. The problem is that
2415/// we cannot optimize based on the assumption that it is zero without changing
2416/// it to be an explicit zero. If we don't change it to zero, other code could
2417/// optimized based on the contradictory assumption that it is non-zero.
2418/// Because instcombine aggressively folds operations with undef args anyway,
2419/// this won't lose us code quality.
2420///
2421/// This function is defined on values with integer type, values with pointer
2422/// type, and vectors of integers. In the case
2423/// where V is a vector, known zero, and known one values are the
2424/// same width as the vector element, and the bit is set only if it is true
2425/// for all of the demanded elements in the vector specified by DemandedElts.
2426void computeKnownBits(const Value *V, const APInt &DemandedElts,
2427 KnownBits &Known, const SimplifyQuery &Q,
2428 unsigned Depth) {
2429 if (!DemandedElts) {
2430 // No demanded elts, better to assume we don't know anything.
2431 Known.resetAll();
2432 return;
2433 }
2434
2435 assert(V && "No Value?");
2436 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
2437
2438#ifndef NDEBUG
2439 Type *Ty = V->getType();
2440 unsigned BitWidth = Known.getBitWidth();
2441
2442 assert((Ty->isIntOrIntVectorTy(BitWidth) || Ty->isPtrOrPtrVectorTy()) &&
2443 "Not integer or pointer type!");
2444
2445 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
2446 assert(
2447 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
2448 "DemandedElt width should equal the fixed vector number of elements");
2449 } else {
2450 assert(DemandedElts == APInt(1, 1) &&
2451 "DemandedElt width should be 1 for scalars or scalable vectors");
2452 }
2453
2454 Type *ScalarTy = Ty->getScalarType();
2455 if (ScalarTy->isPointerTy()) {
2456 assert(BitWidth == Q.DL.getPointerTypeSizeInBits(ScalarTy) &&
2457 "V and Known should have same BitWidth");
2458 } else {
2459 assert(BitWidth == Q.DL.getTypeSizeInBits(ScalarTy) &&
2460 "V and Known should have same BitWidth");
2461 }
2462#endif
2463
2464 const APInt *C;
2465 if (match(V, m_APInt(C))) {
2466 // We know all of the bits for a scalar constant or a splat vector constant!
2467 Known = KnownBits::makeConstant(*C);
2468 return;
2469 }
2470 // Null and aggregate-zero are all-zeros.
2472 Known.setAllZero();
2473 return;
2474 }
2475 // Handle a constant vector by taking the intersection of the known bits of
2476 // each element.
2478 assert(!isa<ScalableVectorType>(V->getType()));
2479 // We know that CDV must be a vector of integers. Take the intersection of
2480 // each element.
2481 Known.setAllConflict();
2482 for (unsigned i = 0, e = CDV->getNumElements(); i != e; ++i) {
2483 if (!DemandedElts[i])
2484 continue;
2485 APInt Elt = CDV->getElementAsAPInt(i);
2486 Known.Zero &= ~Elt;
2487 Known.One &= Elt;
2488 }
2489 if (Known.hasConflict())
2490 Known.resetAll();
2491 return;
2492 }
2493
2494 if (const auto *CV = dyn_cast<ConstantVector>(V)) {
2495 assert(!isa<ScalableVectorType>(V->getType()));
2496 // We know that CV must be a vector of integers. Take the intersection of
2497 // each element.
2498 Known.setAllConflict();
2499 for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) {
2500 if (!DemandedElts[i])
2501 continue;
2502 Constant *Element = CV->getAggregateElement(i);
2503 if (isa<PoisonValue>(Element))
2504 continue;
2505 auto *ElementCI = dyn_cast_or_null<ConstantInt>(Element);
2506 if (!ElementCI) {
2507 Known.resetAll();
2508 return;
2509 }
2510 const APInt &Elt = ElementCI->getValue();
2511 Known.Zero &= ~Elt;
2512 Known.One &= Elt;
2513 }
2514 if (Known.hasConflict())
2515 Known.resetAll();
2516 return;
2517 }
2518
2519 // Start out not knowing anything.
2520 Known.resetAll();
2521
2522 // We can't imply anything about undefs.
2523 if (isa<UndefValue>(V))
2524 return;
2525
2526 // There's no point in looking through other users of ConstantData for
2527 // assumptions. Confirm that we've handled them all.
2528 assert(!isa<ConstantData>(V) && "Unhandled constant data!");
2529
2530 if (const auto *A = dyn_cast<Argument>(V))
2531 if (std::optional<ConstantRange> Range = A->getRange())
2532 Known = Range->toKnownBits();
2533
2534 // All recursive calls that increase depth must come after this.
2536 return;
2537
2538 // A weak GlobalAlias is totally unknown. A non-weak GlobalAlias has
2539 // the bits of its aliasee.
2540 if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
2541 if (!GA->isInterposable())
2542 computeKnownBits(GA->getAliasee(), Known, Q, Depth + 1);
2543 return;
2544 }
2545
2546 if (const Operator *I = dyn_cast<Operator>(V))
2547 computeKnownBitsFromOperator(I, DemandedElts, Known, Q, Depth);
2548 else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
2549 if (std::optional<ConstantRange> CR = GV->getAbsoluteSymbolRange())
2550 Known = CR->toKnownBits();
2551 }
2552
2553 // Aligned pointers have trailing zeros - refine Known.Zero set
2554 if (isa<PointerType>(V->getType())) {
2555 Align Alignment = V->getPointerAlignment(Q.DL);
2556 Known.Zero.setLowBits(Log2(Alignment));
2557 }
2558
2559 // computeKnownBitsFromContext strictly refines Known.
2560 // Therefore, we run them after computeKnownBitsFromOperator.
2561
2562 // Check whether we can determine known bits from context such as assumes.
2563 computeKnownBitsFromContext(V, Known, Q, Depth);
2564}
2565
2566/// Try to detect a recurrence that the value of the induction variable is
2567/// always a power of two (or zero).
2568static bool isPowerOfTwoRecurrence(const PHINode *PN, bool OrZero,
2569 SimplifyQuery &Q, unsigned Depth) {
2570 BinaryOperator *BO = nullptr;
2571 Value *Start = nullptr, *Step = nullptr;
2572 if (!matchSimpleRecurrence(PN, BO, Start, Step))
2573 return false;
2574
2575 // Initial value must be a power of two.
2576 for (const Use &U : PN->operands()) {
2577 if (U.get() == Start) {
2578 // Initial value comes from a different BB, need to adjust context
2579 // instruction for analysis.
2580 Q.CxtI = PN->getIncomingBlock(U)->getTerminator();
2581 if (!isKnownToBeAPowerOfTwo(Start, OrZero, Q, Depth))
2582 return false;
2583 }
2584 }
2585
2586 // Except for Mul, the induction variable must be on the left side of the
2587 // increment expression, otherwise its value can be arbitrary.
2588 if (BO->getOpcode() != Instruction::Mul && BO->getOperand(1) != Step)
2589 return false;
2590
2591 Q.CxtI = BO->getParent()->getTerminator();
2592 switch (BO->getOpcode()) {
2593 case Instruction::Mul:
2594 // Power of two is closed under multiplication.
2595 return (OrZero || Q.IIQ.hasNoUnsignedWrap(BO) ||
2596 Q.IIQ.hasNoSignedWrap(BO)) &&
2597 isKnownToBeAPowerOfTwo(Step, OrZero, Q, Depth);
2598 case Instruction::SDiv:
2599 // Start value must not be signmask for signed division, so simply being a
2600 // power of two is not sufficient, and it has to be a constant.
2601 if (!match(Start, m_Power2()) || match(Start, m_SignMask()))
2602 return false;
2603 [[fallthrough]];
2604 case Instruction::UDiv:
2605 // Divisor must be a power of two.
2606 // If OrZero is false, cannot guarantee induction variable is non-zero after
2607 // division, same for Shr, unless it is exact division.
2608 return (OrZero || Q.IIQ.isExact(BO)) &&
2609 isKnownToBeAPowerOfTwo(Step, false, Q, Depth);
2610 case Instruction::Shl:
2611 return OrZero || Q.IIQ.hasNoUnsignedWrap(BO) || Q.IIQ.hasNoSignedWrap(BO);
2612 case Instruction::AShr:
2613 if (!match(Start, m_Power2()) || match(Start, m_SignMask()))
2614 return false;
2615 [[fallthrough]];
2616 case Instruction::LShr:
2617 return OrZero || Q.IIQ.isExact(BO);
2618 default:
2619 return false;
2620 }
2621}
2622
2623/// Return true if we can infer that \p V is known to be a power of 2 from
2624/// dominating condition \p Cond (e.g., ctpop(V) == 1).
2625static bool isImpliedToBeAPowerOfTwoFromCond(const Value *V, bool OrZero,
2626 const Value *Cond,
2627 bool CondIsTrue) {
2628 CmpPredicate Pred;
2629 const APInt *RHSC;
2631 m_APInt(RHSC))))
2632 return false;
2633 if (!CondIsTrue)
2634 Pred = ICmpInst::getInversePredicate(Pred);
2635 // ctpop(V) u< 2
2636 if (OrZero && Pred == ICmpInst::ICMP_ULT && *RHSC == 2)
2637 return true;
2638 // ctpop(V) == 1
2639 return Pred == ICmpInst::ICMP_EQ && *RHSC == 1;
2640}
2641
2642/// Return true if the given value is known to have exactly one
2643/// bit set when defined. For vectors return true if every element is known to
2644/// be a power of two when defined. Supports values with integer or pointer
2645/// types and vectors of integers.
2646bool llvm::isKnownToBeAPowerOfTwo(const Value *V, bool OrZero,
2647 const SimplifyQuery &Q, unsigned Depth) {
2648 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
2649
2650 if (isa<Constant>(V))
2651 return OrZero ? match(V, m_Power2OrZero()) : match(V, m_Power2());
2652
2653 // i1 is by definition a power of 2 or zero.
2654 if (OrZero && V->getType()->getScalarSizeInBits() == 1)
2655 return true;
2656
2657 // Try to infer from assumptions.
2658 if (Q.AC && Q.CxtI) {
2659 for (auto &AssumeVH : Q.AC->assumptionsFor(V)) {
2660 if (!AssumeVH)
2661 continue;
2662 CallInst *I = cast<CallInst>(AssumeVH);
2663 if (isImpliedToBeAPowerOfTwoFromCond(V, OrZero, I->getArgOperand(0),
2664 /*CondIsTrue=*/true) &&
2666 return true;
2667 }
2668 }
2669
2670 // Handle dominating conditions.
2671 if (Q.DC && Q.CxtI && Q.DT) {
2672 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
2673 Value *Cond = BI->getCondition();
2674
2675 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
2677 /*CondIsTrue=*/true) &&
2678 Q.DT->dominates(Edge0, Q.CxtI->getParent()))
2679 return true;
2680
2681 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
2683 /*CondIsTrue=*/false) &&
2684 Q.DT->dominates(Edge1, Q.CxtI->getParent()))
2685 return true;
2686 }
2687 }
2688
2689 auto *I = dyn_cast<Instruction>(V);
2690 if (!I)
2691 return false;
2692
2693 if (Q.CxtI && match(V, m_VScale())) {
2694 const Function *F = Q.CxtI->getFunction();
2695 // The vscale_range indicates vscale is a power-of-two.
2696 return F->hasFnAttribute(Attribute::VScaleRange);
2697 }
2698
2699 // 1 << X is clearly a power of two if the one is not shifted off the end. If
2700 // it is shifted off the end then the result is undefined.
2701 if (match(I, m_Shl(m_One(), m_Value())))
2702 return true;
2703
2704 // (signmask) >>l X is clearly a power of two if the one is not shifted off
2705 // the bottom. If it is shifted off the bottom then the result is undefined.
2706 if (match(I, m_LShr(m_SignMask(), m_Value())))
2707 return true;
2708
2709 // The remaining tests are all recursive, so bail out if we hit the limit.
2711 return false;
2712
2713 switch (I->getOpcode()) {
2714 case Instruction::ZExt:
2715 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2716 case Instruction::Trunc:
2717 return OrZero && isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2718 case Instruction::Shl:
2719 if (OrZero || Q.IIQ.hasNoUnsignedWrap(I) || Q.IIQ.hasNoSignedWrap(I))
2720 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2721 return false;
2722 case Instruction::LShr:
2723 if (OrZero || Q.IIQ.isExact(cast<BinaryOperator>(I)))
2724 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2725 return false;
2726 case Instruction::UDiv:
2728 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2729 return false;
2730 case Instruction::Mul:
2731 return isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth) &&
2732 isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth) &&
2733 (OrZero || isKnownNonZero(I, Q, Depth));
2734 case Instruction::And:
2735 // A power of two and'd with anything is a power of two or zero.
2736 if (OrZero &&
2737 (isKnownToBeAPowerOfTwo(I->getOperand(1), /*OrZero*/ true, Q, Depth) ||
2738 isKnownToBeAPowerOfTwo(I->getOperand(0), /*OrZero*/ true, Q, Depth)))
2739 return true;
2740 // X & (-X) is always a power of two or zero.
2741 if (match(I->getOperand(0), m_Neg(m_Specific(I->getOperand(1)))) ||
2742 match(I->getOperand(1), m_Neg(m_Specific(I->getOperand(0)))))
2743 return OrZero || isKnownNonZero(I->getOperand(0), Q, Depth);
2744 return false;
2745 case Instruction::Add: {
2746 // Adding a power-of-two or zero to the same power-of-two or zero yields
2747 // either the original power-of-two, a larger power-of-two or zero.
2749 if (OrZero || Q.IIQ.hasNoUnsignedWrap(VOBO) ||
2750 Q.IIQ.hasNoSignedWrap(VOBO)) {
2751 if (match(I->getOperand(0),
2752 m_c_And(m_Specific(I->getOperand(1)), m_Value())) &&
2753 isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth))
2754 return true;
2755 if (match(I->getOperand(1),
2756 m_c_And(m_Specific(I->getOperand(0)), m_Value())) &&
2757 isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth))
2758 return true;
2759
2760 unsigned BitWidth = V->getType()->getScalarSizeInBits();
2761 KnownBits LHSBits(BitWidth);
2762 computeKnownBits(I->getOperand(0), LHSBits, Q, Depth);
2763
2764 KnownBits RHSBits(BitWidth);
2765 computeKnownBits(I->getOperand(1), RHSBits, Q, Depth);
2766 // If i8 V is a power of two or zero:
2767 // ZeroBits: 1 1 1 0 1 1 1 1
2768 // ~ZeroBits: 0 0 0 1 0 0 0 0
2769 if ((~(LHSBits.Zero & RHSBits.Zero)).isPowerOf2())
2770 // If OrZero isn't set, we cannot give back a zero result.
2771 // Make sure either the LHS or RHS has a bit set.
2772 if (OrZero || RHSBits.One.getBoolValue() || LHSBits.One.getBoolValue())
2773 return true;
2774 }
2775
2776 // LShr(UINT_MAX, Y) + 1 is a power of two (if add is nuw) or zero.
2777 if (OrZero || Q.IIQ.hasNoUnsignedWrap(VOBO))
2778 if (match(I, m_Add(m_LShr(m_AllOnes(), m_Value()), m_One())))
2779 return true;
2780 return false;
2781 }
2782 case Instruction::Select:
2783 return isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth) &&
2784 isKnownToBeAPowerOfTwo(I->getOperand(2), OrZero, Q, Depth);
2785 case Instruction::PHI: {
2786 // A PHI node is power of two if all incoming values are power of two, or if
2787 // it is an induction variable where in each step its value is a power of
2788 // two.
2789 auto *PN = cast<PHINode>(I);
2791
2792 // Check if it is an induction variable and always power of two.
2793 if (isPowerOfTwoRecurrence(PN, OrZero, RecQ, Depth))
2794 return true;
2795
2796 // Recursively check all incoming values. Limit recursion to 2 levels, so
2797 // that search complexity is limited to number of operands^2.
2798 unsigned NewDepth = std::max(Depth, MaxAnalysisRecursionDepth - 1);
2799 return llvm::all_of(PN->operands(), [&](const Use &U) {
2800 // Value is power of 2 if it is coming from PHI node itself by induction.
2801 if (U.get() == PN)
2802 return true;
2803
2804 // Change the context instruction to the incoming block where it is
2805 // evaluated.
2806 RecQ.CxtI = PN->getIncomingBlock(U)->getTerminator();
2807 return isKnownToBeAPowerOfTwo(U.get(), OrZero, RecQ, NewDepth);
2808 });
2809 }
2810 case Instruction::Invoke:
2811 case Instruction::Call: {
2812 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
2813 switch (II->getIntrinsicID()) {
2814 case Intrinsic::umax:
2815 case Intrinsic::smax:
2816 case Intrinsic::umin:
2817 case Intrinsic::smin:
2818 return isKnownToBeAPowerOfTwo(II->getArgOperand(1), OrZero, Q, Depth) &&
2819 isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2820 // bswap/bitreverse just move around bits, but don't change any 1s/0s
2821 // thus dont change pow2/non-pow2 status.
2822 case Intrinsic::bitreverse:
2823 case Intrinsic::bswap:
2824 return isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2825 case Intrinsic::fshr:
2826 case Intrinsic::fshl:
2827 // If Op0 == Op1, this is a rotate. is_pow2(rotate(x, y)) == is_pow2(x)
2828 if (II->getArgOperand(0) == II->getArgOperand(1))
2829 return isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2830 break;
2831 default:
2832 break;
2833 }
2834 }
2835 return false;
2836 }
2837 default:
2838 return false;
2839 }
2840}
2841
2842/// Test whether a GEP's result is known to be non-null.
2843///
2844/// Uses properties inherent in a GEP to try to determine whether it is known
2845/// to be non-null.
2846///
2847/// Currently this routine does not support vector GEPs.
2848static bool isGEPKnownNonNull(const GEPOperator *GEP, const SimplifyQuery &Q,
2849 unsigned Depth) {
2850 const Function *F = nullptr;
2851 if (const Instruction *I = dyn_cast<Instruction>(GEP))
2852 F = I->getFunction();
2853
2854 // If the gep is nuw or inbounds with invalid null pointer, then the GEP
2855 // may be null iff the base pointer is null and the offset is zero.
2856 if (!GEP->hasNoUnsignedWrap() &&
2857 !(GEP->isInBounds() &&
2858 !NullPointerIsDefined(F, GEP->getPointerAddressSpace())))
2859 return false;
2860
2861 // FIXME: Support vector-GEPs.
2862 assert(GEP->getType()->isPointerTy() && "We only support plain pointer GEP");
2863
2864 // If the base pointer is non-null, we cannot walk to a null address with an
2865 // inbounds GEP in address space zero.
2866 if (isKnownNonZero(GEP->getPointerOperand(), Q, Depth))
2867 return true;
2868
2869 // Walk the GEP operands and see if any operand introduces a non-zero offset.
2870 // If so, then the GEP cannot produce a null pointer, as doing so would
2871 // inherently violate the inbounds contract within address space zero.
2873 GTI != GTE; ++GTI) {
2874 // Struct types are easy -- they must always be indexed by a constant.
2875 if (StructType *STy = GTI.getStructTypeOrNull()) {
2876 ConstantInt *OpC = cast<ConstantInt>(GTI.getOperand());
2877 unsigned ElementIdx = OpC->getZExtValue();
2878 const StructLayout *SL = Q.DL.getStructLayout(STy);
2879 uint64_t ElementOffset = SL->getElementOffset(ElementIdx);
2880 if (ElementOffset > 0)
2881 return true;
2882 continue;
2883 }
2884
2885 // If we have a zero-sized type, the index doesn't matter. Keep looping.
2886 if (GTI.getSequentialElementStride(Q.DL).isZero())
2887 continue;
2888
2889 // Fast path the constant operand case both for efficiency and so we don't
2890 // increment Depth when just zipping down an all-constant GEP.
2891 if (ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand())) {
2892 if (!OpC->isZero())
2893 return true;
2894 continue;
2895 }
2896
2897 // We post-increment Depth here because while isKnownNonZero increments it
2898 // as well, when we pop back up that increment won't persist. We don't want
2899 // to recurse 10k times just because we have 10k GEP operands. We don't
2900 // bail completely out because we want to handle constant GEPs regardless
2901 // of depth.
2903 continue;
2904
2905 if (isKnownNonZero(GTI.getOperand(), Q, Depth))
2906 return true;
2907 }
2908
2909 return false;
2910}
2911
2913 const Instruction *CtxI,
2914 const DominatorTree *DT) {
2915 assert(!isa<Constant>(V) && "Called for constant?");
2916
2917 if (!CtxI || !DT)
2918 return false;
2919
2920 unsigned NumUsesExplored = 0;
2921 for (auto &U : V->uses()) {
2922 // Avoid massive lists
2923 if (NumUsesExplored >= DomConditionsMaxUses)
2924 break;
2925 NumUsesExplored++;
2926
2927 const Instruction *UI = cast<Instruction>(U.getUser());
2928 // If the value is used as an argument to a call or invoke, then argument
2929 // attributes may provide an answer about null-ness.
2930 if (V->getType()->isPointerTy()) {
2931 if (const auto *CB = dyn_cast<CallBase>(UI)) {
2932 if (CB->isArgOperand(&U) &&
2933 CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
2934 /*AllowUndefOrPoison=*/false) &&
2935 DT->dominates(CB, CtxI))
2936 return true;
2937 }
2938 }
2939
2940 // If the value is used as a load/store, then the pointer must be non null.
2941 if (V == getLoadStorePointerOperand(UI)) {
2944 DT->dominates(UI, CtxI))
2945 return true;
2946 }
2947
2948 if ((match(UI, m_IDiv(m_Value(), m_Specific(V))) ||
2949 match(UI, m_IRem(m_Value(), m_Specific(V)))) &&
2950 isValidAssumeForContext(UI, CtxI, DT))
2951 return true;
2952
2953 // Consider only compare instructions uniquely controlling a branch
2954 Value *RHS;
2955 CmpPredicate Pred;
2956 if (!match(UI, m_c_ICmp(Pred, m_Specific(V), m_Value(RHS))))
2957 continue;
2958
2959 bool NonNullIfTrue;
2960 if (cmpExcludesZero(Pred, RHS))
2961 NonNullIfTrue = true;
2963 NonNullIfTrue = false;
2964 else
2965 continue;
2966
2969 for (const auto *CmpU : UI->users()) {
2970 assert(WorkList.empty() && "Should be!");
2971 if (Visited.insert(CmpU).second)
2972 WorkList.push_back(CmpU);
2973
2974 while (!WorkList.empty()) {
2975 auto *Curr = WorkList.pop_back_val();
2976
2977 // If a user is an AND, add all its users to the work list. We only
2978 // propagate "pred != null" condition through AND because it is only
2979 // correct to assume that all conditions of AND are met in true branch.
2980 // TODO: Support similar logic of OR and EQ predicate?
2981 if (NonNullIfTrue)
2982 if (match(Curr, m_LogicalAnd(m_Value(), m_Value()))) {
2983 for (const auto *CurrU : Curr->users())
2984 if (Visited.insert(CurrU).second)
2985 WorkList.push_back(CurrU);
2986 continue;
2987 }
2988
2989 if (const BranchInst *BI = dyn_cast<BranchInst>(Curr)) {
2990 assert(BI->isConditional() && "uses a comparison!");
2991
2992 BasicBlock *NonNullSuccessor =
2993 BI->getSuccessor(NonNullIfTrue ? 0 : 1);
2994 BasicBlockEdge Edge(BI->getParent(), NonNullSuccessor);
2995 if (Edge.isSingleEdge() && DT->dominates(Edge, CtxI->getParent()))
2996 return true;
2997 } else if (NonNullIfTrue && isGuard(Curr) &&
2998 DT->dominates(cast<Instruction>(Curr), CtxI)) {
2999 return true;
3000 }
3001 }
3002 }
3003 }
3004
3005 return false;
3006}
3007
3008/// Does the 'Range' metadata (which must be a valid MD_range operand list)
3009/// ensure that the value it's attached to is never Value? 'RangeType' is
3010/// is the type of the value described by the range.
3011static bool rangeMetadataExcludesValue(const MDNode* Ranges, const APInt& Value) {
3012 const unsigned NumRanges = Ranges->getNumOperands() / 2;
3013 assert(NumRanges >= 1);
3014 for (unsigned i = 0; i < NumRanges; ++i) {
3016 mdconst::extract<ConstantInt>(Ranges->getOperand(2 * i + 0));
3018 mdconst::extract<ConstantInt>(Ranges->getOperand(2 * i + 1));
3019 ConstantRange Range(Lower->getValue(), Upper->getValue());
3020 if (Range.contains(Value))
3021 return false;
3022 }
3023 return true;
3024}
3025
3026/// Try to detect a recurrence that monotonically increases/decreases from a
3027/// non-zero starting value. These are common as induction variables.
3028static bool isNonZeroRecurrence(const PHINode *PN) {
3029 BinaryOperator *BO = nullptr;
3030 Value *Start = nullptr, *Step = nullptr;
3031 const APInt *StartC, *StepC;
3032 if (!matchSimpleRecurrence(PN, BO, Start, Step) ||
3033 !match(Start, m_APInt(StartC)) || StartC->isZero())
3034 return false;
3035
3036 switch (BO->getOpcode()) {
3037 case Instruction::Add:
3038 // Starting from non-zero and stepping away from zero can never wrap back
3039 // to zero.
3040 return BO->hasNoUnsignedWrap() ||
3041 (BO->hasNoSignedWrap() && match(Step, m_APInt(StepC)) &&
3042 StartC->isNegative() == StepC->isNegative());
3043 case Instruction::Mul:
3044 return (BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap()) &&
3045 match(Step, m_APInt(StepC)) && !StepC->isZero();
3046 case Instruction::Shl:
3047 return BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap();
3048 case Instruction::AShr:
3049 case Instruction::LShr:
3050 return BO->isExact();
3051 default:
3052 return false;
3053 }
3054}
3055
3056static bool matchOpWithOpEqZero(Value *Op0, Value *Op1) {
3058 m_Specific(Op1), m_Zero()))) ||
3060 m_Specific(Op0), m_Zero())));
3061}
3062
3063static bool isNonZeroAdd(const APInt &DemandedElts, const SimplifyQuery &Q,
3064 unsigned BitWidth, Value *X, Value *Y, bool NSW,
3065 bool NUW, unsigned Depth) {
3066 // (X + (X != 0)) is non zero
3067 if (matchOpWithOpEqZero(X, Y))
3068 return true;
3069
3070 if (NUW)
3071 return isKnownNonZero(Y, DemandedElts, Q, Depth) ||
3072 isKnownNonZero(X, DemandedElts, Q, Depth);
3073
3074 KnownBits XKnown = computeKnownBits(X, DemandedElts, Q, Depth);
3075 KnownBits YKnown = computeKnownBits(Y, DemandedElts, Q, Depth);
3076
3077 // If X and Y are both non-negative (as signed values) then their sum is not
3078 // zero unless both X and Y are zero.
3079 if (XKnown.isNonNegative() && YKnown.isNonNegative())
3080 if (isKnownNonZero(Y, DemandedElts, Q, Depth) ||
3081 isKnownNonZero(X, DemandedElts, Q, Depth))
3082 return true;
3083
3084 // If X and Y are both negative (as signed values) then their sum is not
3085 // zero unless both X and Y equal INT_MIN.
3086 if (XKnown.isNegative() && YKnown.isNegative()) {
3088 // The sign bit of X is set. If some other bit is set then X is not equal
3089 // to INT_MIN.
3090 if (XKnown.One.intersects(Mask))
3091 return true;
3092 // The sign bit of Y is set. If some other bit is set then Y is not equal
3093 // to INT_MIN.
3094 if (YKnown.One.intersects(Mask))
3095 return true;
3096 }
3097
3098 // The sum of a non-negative number and a power of two is not zero.
3099 if (XKnown.isNonNegative() &&
3100 isKnownToBeAPowerOfTwo(Y, /*OrZero*/ false, Q, Depth))
3101 return true;
3102 if (YKnown.isNonNegative() &&
3103 isKnownToBeAPowerOfTwo(X, /*OrZero*/ false, Q, Depth))
3104 return true;
3105
3106 return KnownBits::add(XKnown, YKnown, NSW, NUW).isNonZero();
3107}
3108
3109static bool isNonZeroSub(const APInt &DemandedElts, const SimplifyQuery &Q,
3110 unsigned BitWidth, Value *X, Value *Y,
3111 unsigned Depth) {
3112 // (X - (X != 0)) is non zero
3113 // ((X != 0) - X) is non zero
3114 if (matchOpWithOpEqZero(X, Y))
3115 return true;
3116
3117 // TODO: Move this case into isKnownNonEqual().
3118 if (auto *C = dyn_cast<Constant>(X))
3119 if (C->isNullValue() && isKnownNonZero(Y, DemandedElts, Q, Depth))
3120 return true;
3121
3122 return ::isKnownNonEqual(X, Y, DemandedElts, Q, Depth);
3123}
3124
3125static bool isNonZeroMul(const APInt &DemandedElts, const SimplifyQuery &Q,
3126 unsigned BitWidth, Value *X, Value *Y, bool NSW,
3127 bool NUW, unsigned Depth) {
3128 // If X and Y are non-zero then so is X * Y as long as the multiplication
3129 // does not overflow.
3130 if (NSW || NUW)
3131 return isKnownNonZero(X, DemandedElts, Q, Depth) &&
3132 isKnownNonZero(Y, DemandedElts, Q, Depth);
3133
3134 // If either X or Y is odd, then if the other is non-zero the result can't
3135 // be zero.
3136 KnownBits XKnown = computeKnownBits(X, DemandedElts, Q, Depth);
3137 if (XKnown.One[0])
3138 return isKnownNonZero(Y, DemandedElts, Q, Depth);
3139
3140 KnownBits YKnown = computeKnownBits(Y, DemandedElts, Q, Depth);
3141 if (YKnown.One[0])
3142 return XKnown.isNonZero() || isKnownNonZero(X, DemandedElts, Q, Depth);
3143
3144 // If there exists any subset of X (sX) and subset of Y (sY) s.t sX * sY is
3145 // non-zero, then X * Y is non-zero. We can find sX and sY by just taking
3146 // the lowest known One of X and Y. If they are non-zero, the result
3147 // must be non-zero. We can check if LSB(X) * LSB(Y) != 0 by doing
3148 // X.CountLeadingZeros + Y.CountLeadingZeros < BitWidth.
3149 return (XKnown.countMaxTrailingZeros() + YKnown.countMaxTrailingZeros()) <
3150 BitWidth;
3151}
3152
3153static bool isNonZeroShift(const Operator *I, const APInt &DemandedElts,
3154 const SimplifyQuery &Q, const KnownBits &KnownVal,
3155 unsigned Depth) {
3156 auto ShiftOp = [&](const APInt &Lhs, const APInt &Rhs) {
3157 switch (I->getOpcode()) {
3158 case Instruction::Shl:
3159 return Lhs.shl(Rhs);
3160 case Instruction::LShr:
3161 return Lhs.lshr(Rhs);
3162 case Instruction::AShr:
3163 return Lhs.ashr(Rhs);
3164 default:
3165 llvm_unreachable("Unknown Shift Opcode");
3166 }
3167 };
3168
3169 auto InvShiftOp = [&](const APInt &Lhs, const APInt &Rhs) {
3170 switch (I->getOpcode()) {
3171 case Instruction::Shl:
3172 return Lhs.lshr(Rhs);
3173 case Instruction::LShr:
3174 case Instruction::AShr:
3175 return Lhs.shl(Rhs);
3176 default:
3177 llvm_unreachable("Unknown Shift Opcode");
3178 }
3179 };
3180
3181 if (KnownVal.isUnknown())
3182 return false;
3183
3184 KnownBits KnownCnt =
3185 computeKnownBits(I->getOperand(1), DemandedElts, Q, Depth);
3186 APInt MaxShift = KnownCnt.getMaxValue();
3187 unsigned NumBits = KnownVal.getBitWidth();
3188 if (MaxShift.uge(NumBits))
3189 return false;
3190
3191 if (!ShiftOp(KnownVal.One, MaxShift).isZero())
3192 return true;
3193
3194 // If all of the bits shifted out are known to be zero, and Val is known
3195 // non-zero then at least one non-zero bit must remain.
3196 if (InvShiftOp(KnownVal.Zero, NumBits - MaxShift)
3197 .eq(InvShiftOp(APInt::getAllOnes(NumBits), NumBits - MaxShift)) &&
3198 isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth))
3199 return true;
3200
3201 return false;
3202}
3203
3205 const APInt &DemandedElts,
3206 const SimplifyQuery &Q, unsigned Depth) {
3207 unsigned BitWidth = getBitWidth(I->getType()->getScalarType(), Q.DL);
3208 switch (I->getOpcode()) {
3209 case Instruction::Alloca:
3210 // Alloca never returns null, malloc might.
3211 return I->getType()->getPointerAddressSpace() == 0;
3212 case Instruction::GetElementPtr:
3213 if (I->getType()->isPointerTy())
3215 break;
3216 case Instruction::BitCast: {
3217 // We need to be a bit careful here. We can only peek through the bitcast
3218 // if the scalar size of elements in the operand are smaller than and a
3219 // multiple of the size they are casting too. Take three cases:
3220 //
3221 // 1) Unsafe:
3222 // bitcast <2 x i16> %NonZero to <4 x i8>
3223 //
3224 // %NonZero can have 2 non-zero i16 elements, but isKnownNonZero on a
3225 // <4 x i8> requires that all 4 i8 elements be non-zero which isn't
3226 // guranteed (imagine just sign bit set in the 2 i16 elements).
3227 //
3228 // 2) Unsafe:
3229 // bitcast <4 x i3> %NonZero to <3 x i4>
3230 //
3231 // Even though the scalar size of the src (`i3`) is smaller than the
3232 // scalar size of the dst `i4`, because `i3` is not a multiple of `i4`
3233 // its possible for the `3 x i4` elements to be zero because there are
3234 // some elements in the destination that don't contain any full src
3235 // element.
3236 //
3237 // 3) Safe:
3238 // bitcast <4 x i8> %NonZero to <2 x i16>
3239 //
3240 // This is always safe as non-zero in the 4 i8 elements implies
3241 // non-zero in the combination of any two adjacent ones. Since i8 is a
3242 // multiple of i16, each i16 is guranteed to have 2 full i8 elements.
3243 // This all implies the 2 i16 elements are non-zero.
3244 Type *FromTy = I->getOperand(0)->getType();
3245 if ((FromTy->isIntOrIntVectorTy() || FromTy->isPtrOrPtrVectorTy()) &&
3246 (BitWidth % getBitWidth(FromTy->getScalarType(), Q.DL)) == 0)
3247 return isKnownNonZero(I->getOperand(0), Q, Depth);
3248 } break;
3249 case Instruction::IntToPtr:
3250 // Note that we have to take special care to avoid looking through
3251 // truncating casts, e.g., int2ptr/ptr2int with appropriate sizes, as well
3252 // as casts that can alter the value, e.g., AddrSpaceCasts.
3253 if (!isa<ScalableVectorType>(I->getType()) &&
3254 Q.DL.getTypeSizeInBits(I->getOperand(0)->getType()).getFixedValue() <=
3255 Q.DL.getTypeSizeInBits(I->getType()).getFixedValue())
3256 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3257 break;
3258 case Instruction::PtrToAddr:
3259 // isKnownNonZero() for pointers refers to the address bits being non-zero,
3260 // so we can directly forward.
3261 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3262 case Instruction::PtrToInt:
3263 // For inttoptr, make sure the result size is >= the address size. If the
3264 // address is non-zero, any larger value is also non-zero.
3265 if (Q.DL.getAddressSizeInBits(I->getOperand(0)->getType()) <=
3266 I->getType()->getScalarSizeInBits())
3267 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3268 break;
3269 case Instruction::Trunc:
3270 // nuw/nsw trunc preserves zero/non-zero status of input.
3271 if (auto *TI = dyn_cast<TruncInst>(I))
3272 if (TI->hasNoSignedWrap() || TI->hasNoUnsignedWrap())
3273 return isKnownNonZero(TI->getOperand(0), DemandedElts, Q, Depth);
3274 break;
3275
3276 // Iff x - y != 0, then x ^ y != 0
3277 // Therefore we can do the same exact checks
3278 case Instruction::Xor:
3279 case Instruction::Sub:
3280 return isNonZeroSub(DemandedElts, Q, BitWidth, I->getOperand(0),
3281 I->getOperand(1), Depth);
3282 case Instruction::Or:
3283 // (X | (X != 0)) is non zero
3284 if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1)))
3285 return true;
3286 // X | Y != 0 if X != Y.
3287 if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Q,
3288 Depth))
3289 return true;
3290 // X | Y != 0 if X != 0 or Y != 0.
3291 return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) ||
3292 isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3293 case Instruction::SExt:
3294 case Instruction::ZExt:
3295 // ext X != 0 if X != 0.
3296 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3297
3298 case Instruction::Shl: {
3299 // shl nsw/nuw can't remove any non-zero bits.
3301 if (Q.IIQ.hasNoUnsignedWrap(BO) || Q.IIQ.hasNoSignedWrap(BO))
3302 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3303
3304 // shl X, Y != 0 if X is odd. Note that the value of the shift is undefined
3305 // if the lowest bit is shifted off the end.
3306 KnownBits Known(BitWidth);
3307 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth);
3308 if (Known.One[0])
3309 return true;
3310
3311 return isNonZeroShift(I, DemandedElts, Q, Known, Depth);
3312 }
3313 case Instruction::LShr:
3314 case Instruction::AShr: {
3315 // shr exact can only shift out zero bits.
3317 if (BO->isExact())
3318 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3319
3320 // shr X, Y != 0 if X is negative. Note that the value of the shift is not
3321 // defined if the sign bit is shifted off the end.
3322 KnownBits Known =
3323 computeKnownBits(I->getOperand(0), DemandedElts, Q, Depth);
3324 if (Known.isNegative())
3325 return true;
3326
3327 return isNonZeroShift(I, DemandedElts, Q, Known, Depth);
3328 }
3329 case Instruction::UDiv:
3330 case Instruction::SDiv: {
3331 // X / Y
3332 // div exact can only produce a zero if the dividend is zero.
3333 if (cast<PossiblyExactOperator>(I)->isExact())
3334 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3335
3336 KnownBits XKnown =
3337 computeKnownBits(I->getOperand(0), DemandedElts, Q, Depth);
3338 // If X is fully unknown we won't be able to figure anything out so don't
3339 // both computing knownbits for Y.
3340 if (XKnown.isUnknown())
3341 return false;
3342
3343 KnownBits YKnown =
3344 computeKnownBits(I->getOperand(1), DemandedElts, Q, Depth);
3345 if (I->getOpcode() == Instruction::SDiv) {
3346 // For signed division need to compare abs value of the operands.
3347 XKnown = XKnown.abs(/*IntMinIsPoison*/ false);
3348 YKnown = YKnown.abs(/*IntMinIsPoison*/ false);
3349 }
3350 // If X u>= Y then div is non zero (0/0 is UB).
3351 std::optional<bool> XUgeY = KnownBits::uge(XKnown, YKnown);
3352 // If X is total unknown or X u< Y we won't be able to prove non-zero
3353 // with compute known bits so just return early.
3354 return XUgeY && *XUgeY;
3355 }
3356 case Instruction::Add: {
3357 // X + Y.
3358
3359 // If Add has nuw wrap flag, then if either X or Y is non-zero the result is
3360 // non-zero.
3362 return isNonZeroAdd(DemandedElts, Q, BitWidth, I->getOperand(0),
3363 I->getOperand(1), Q.IIQ.hasNoSignedWrap(BO),
3364 Q.IIQ.hasNoUnsignedWrap(BO), Depth);
3365 }
3366 case Instruction::Mul: {
3368 return isNonZeroMul(DemandedElts, Q, BitWidth, I->getOperand(0),
3369 I->getOperand(1), Q.IIQ.hasNoSignedWrap(BO),
3370 Q.IIQ.hasNoUnsignedWrap(BO), Depth);
3371 }
3372 case Instruction::Select: {
3373 // (C ? X : Y) != 0 if X != 0 and Y != 0.
3374
3375 // First check if the arm is non-zero using `isKnownNonZero`. If that fails,
3376 // then see if the select condition implies the arm is non-zero. For example
3377 // (X != 0 ? X : Y), we know the true arm is non-zero as the `X` "return" is
3378 // dominated by `X != 0`.
3379 auto SelectArmIsNonZero = [&](bool IsTrueArm) {
3380 Value *Op;
3381 Op = IsTrueArm ? I->getOperand(1) : I->getOperand(2);
3382 // Op is trivially non-zero.
3383 if (isKnownNonZero(Op, DemandedElts, Q, Depth))
3384 return true;
3385
3386 // The condition of the select dominates the true/false arm. Check if the
3387 // condition implies that a given arm is non-zero.
3388 Value *X;
3389 CmpPredicate Pred;
3390 if (!match(I->getOperand(0), m_c_ICmp(Pred, m_Specific(Op), m_Value(X))))
3391 return false;
3392
3393 if (!IsTrueArm)
3394 Pred = ICmpInst::getInversePredicate(Pred);
3395
3396 return cmpExcludesZero(Pred, X);
3397 };
3398
3399 if (SelectArmIsNonZero(/* IsTrueArm */ true) &&
3400 SelectArmIsNonZero(/* IsTrueArm */ false))
3401 return true;
3402 break;
3403 }
3404 case Instruction::PHI: {
3405 auto *PN = cast<PHINode>(I);
3407 return true;
3408
3409 // Check if all incoming values are non-zero using recursion.
3411 unsigned NewDepth = std::max(Depth, MaxAnalysisRecursionDepth - 1);
3412 return llvm::all_of(PN->operands(), [&](const Use &U) {
3413 if (U.get() == PN)
3414 return true;
3415 RecQ.CxtI = PN->getIncomingBlock(U)->getTerminator();
3416 // Check if the branch on the phi excludes zero.
3417 CmpPredicate Pred;
3418 Value *X;
3419 BasicBlock *TrueSucc, *FalseSucc;
3420 if (match(RecQ.CxtI,
3421 m_Br(m_c_ICmp(Pred, m_Specific(U.get()), m_Value(X)),
3422 m_BasicBlock(TrueSucc), m_BasicBlock(FalseSucc)))) {
3423 // Check for cases of duplicate successors.
3424 if ((TrueSucc == PN->getParent()) != (FalseSucc == PN->getParent())) {
3425 // If we're using the false successor, invert the predicate.
3426 if (FalseSucc == PN->getParent())
3427 Pred = CmpInst::getInversePredicate(Pred);
3428 if (cmpExcludesZero(Pred, X))
3429 return true;
3430 }
3431 }
3432 // Finally recurse on the edge and check it directly.
3433 return isKnownNonZero(U.get(), DemandedElts, RecQ, NewDepth);
3434 });
3435 }
3436 case Instruction::InsertElement: {
3437 if (isa<ScalableVectorType>(I->getType()))
3438 break;
3439
3440 const Value *Vec = I->getOperand(0);
3441 const Value *Elt = I->getOperand(1);
3442 auto *CIdx = dyn_cast<ConstantInt>(I->getOperand(2));
3443
3444 unsigned NumElts = DemandedElts.getBitWidth();
3445 APInt DemandedVecElts = DemandedElts;
3446 bool SkipElt = false;
3447 // If we know the index we are inserting too, clear it from Vec check.
3448 if (CIdx && CIdx->getValue().ult(NumElts)) {
3449 DemandedVecElts.clearBit(CIdx->getZExtValue());
3450 SkipElt = !DemandedElts[CIdx->getZExtValue()];
3451 }
3452
3453 // Result is zero if Elt is non-zero and rest of the demanded elts in Vec
3454 // are non-zero.
3455 return (SkipElt || isKnownNonZero(Elt, Q, Depth)) &&
3456 (DemandedVecElts.isZero() ||
3457 isKnownNonZero(Vec, DemandedVecElts, Q, Depth));
3458 }
3459 case Instruction::ExtractElement:
3460 if (const auto *EEI = dyn_cast<ExtractElementInst>(I)) {
3461 const Value *Vec = EEI->getVectorOperand();
3462 const Value *Idx = EEI->getIndexOperand();
3463 auto *CIdx = dyn_cast<ConstantInt>(Idx);
3464 if (auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType())) {
3465 unsigned NumElts = VecTy->getNumElements();
3466 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
3467 if (CIdx && CIdx->getValue().ult(NumElts))
3468 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
3469 return isKnownNonZero(Vec, DemandedVecElts, Q, Depth);
3470 }
3471 }
3472 break;
3473 case Instruction::ShuffleVector: {
3474 auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
3475 if (!Shuf)
3476 break;
3477 APInt DemandedLHS, DemandedRHS;
3478 // For undef elements, we don't know anything about the common state of
3479 // the shuffle result.
3480 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
3481 break;
3482 // If demanded elements for both vecs are non-zero, the shuffle is non-zero.
3483 return (DemandedRHS.isZero() ||
3484 isKnownNonZero(Shuf->getOperand(1), DemandedRHS, Q, Depth)) &&
3485 (DemandedLHS.isZero() ||
3486 isKnownNonZero(Shuf->getOperand(0), DemandedLHS, Q, Depth));
3487 }
3488 case Instruction::Freeze:
3489 return isKnownNonZero(I->getOperand(0), Q, Depth) &&
3490 isGuaranteedNotToBePoison(I->getOperand(0), Q.AC, Q.CxtI, Q.DT,
3491 Depth);
3492 case Instruction::Load: {
3493 auto *LI = cast<LoadInst>(I);
3494 // A Load tagged with nonnull or dereferenceable with null pointer undefined
3495 // is never null.
3496 if (auto *PtrT = dyn_cast<PointerType>(I->getType())) {
3497 if (Q.IIQ.getMetadata(LI, LLVMContext::MD_nonnull) ||
3498 (Q.IIQ.getMetadata(LI, LLVMContext::MD_dereferenceable) &&
3499 !NullPointerIsDefined(LI->getFunction(), PtrT->getAddressSpace())))
3500 return true;
3501 } else if (MDNode *Ranges = Q.IIQ.getMetadata(LI, LLVMContext::MD_range)) {
3503 }
3504
3505 // No need to fall through to computeKnownBits as range metadata is already
3506 // handled in isKnownNonZero.
3507 return false;
3508 }
3509 case Instruction::ExtractValue: {
3510 const WithOverflowInst *WO;
3512 switch (WO->getBinaryOp()) {
3513 default:
3514 break;
3515 case Instruction::Add:
3516 return isNonZeroAdd(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3517 WO->getArgOperand(1),
3518 /*NSW=*/false,
3519 /*NUW=*/false, Depth);
3520 case Instruction::Sub:
3521 return isNonZeroSub(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3522 WO->getArgOperand(1), Depth);
3523 case Instruction::Mul:
3524 return isNonZeroMul(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3525 WO->getArgOperand(1),
3526 /*NSW=*/false, /*NUW=*/false, Depth);
3527 break;
3528 }
3529 }
3530 break;
3531 }
3532 case Instruction::Call:
3533 case Instruction::Invoke: {
3534 const auto *Call = cast<CallBase>(I);
3535 if (I->getType()->isPointerTy()) {
3536 if (Call->isReturnNonNull())
3537 return true;
3538 if (const auto *RP = getArgumentAliasingToReturnedPointer(Call, true))
3539 return isKnownNonZero(RP, Q, Depth);
3540 } else {
3541 if (MDNode *Ranges = Q.IIQ.getMetadata(Call, LLVMContext::MD_range))
3543 if (std::optional<ConstantRange> Range = Call->getRange()) {
3544 const APInt ZeroValue(Range->getBitWidth(), 0);
3545 if (!Range->contains(ZeroValue))
3546 return true;
3547 }
3548 if (const Value *RV = Call->getReturnedArgOperand())
3549 if (RV->getType() == I->getType() && isKnownNonZero(RV, Q, Depth))
3550 return true;
3551 }
3552
3553 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
3554 switch (II->getIntrinsicID()) {
3555 case Intrinsic::sshl_sat:
3556 case Intrinsic::ushl_sat:
3557 case Intrinsic::abs:
3558 case Intrinsic::bitreverse:
3559 case Intrinsic::bswap:
3560 case Intrinsic::ctpop:
3561 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3562 // NB: We don't do usub_sat here as in any case we can prove its
3563 // non-zero, we will fold it to `sub nuw` in InstCombine.
3564 case Intrinsic::ssub_sat:
3565 // For most types, if x != y then ssub.sat x, y != 0. But
3566 // ssub.sat.i1 0, -1 = 0, because 1 saturates to 0. This means
3567 // isNonZeroSub will do the wrong thing for ssub.sat.i1.
3568 if (BitWidth == 1)
3569 return false;
3570 return isNonZeroSub(DemandedElts, Q, BitWidth, II->getArgOperand(0),
3571 II->getArgOperand(1), Depth);
3572 case Intrinsic::sadd_sat:
3573 return isNonZeroAdd(DemandedElts, Q, BitWidth, II->getArgOperand(0),
3574 II->getArgOperand(1),
3575 /*NSW=*/true, /* NUW=*/false, Depth);
3576 // Vec reverse preserves zero/non-zero status from input vec.
3577 case Intrinsic::vector_reverse:
3578 return isKnownNonZero(II->getArgOperand(0), DemandedElts.reverseBits(),
3579 Q, Depth);
3580 // umin/smin/smax/smin/or of all non-zero elements is always non-zero.
3581 case Intrinsic::vector_reduce_or:
3582 case Intrinsic::vector_reduce_umax:
3583 case Intrinsic::vector_reduce_umin:
3584 case Intrinsic::vector_reduce_smax:
3585 case Intrinsic::vector_reduce_smin:
3586 return isKnownNonZero(II->getArgOperand(0), Q, Depth);
3587 case Intrinsic::umax:
3588 case Intrinsic::uadd_sat:
3589 // umax(X, (X != 0)) is non zero
3590 // X +usat (X != 0) is non zero
3591 if (matchOpWithOpEqZero(II->getArgOperand(0), II->getArgOperand(1)))
3592 return true;
3593
3594 return isKnownNonZero(II->getArgOperand(1), DemandedElts, Q, Depth) ||
3595 isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3596 case Intrinsic::smax: {
3597 // If either arg is strictly positive the result is non-zero. Otherwise
3598 // the result is non-zero if both ops are non-zero.
3599 auto IsNonZero = [&](Value *Op, std::optional<bool> &OpNonZero,
3600 const KnownBits &OpKnown) {
3601 if (!OpNonZero.has_value())
3602 OpNonZero = OpKnown.isNonZero() ||
3603 isKnownNonZero(Op, DemandedElts, Q, Depth);
3604 return *OpNonZero;
3605 };
3606 // Avoid re-computing isKnownNonZero.
3607 std::optional<bool> Op0NonZero, Op1NonZero;
3608 KnownBits Op1Known =
3609 computeKnownBits(II->getArgOperand(1), DemandedElts, Q, Depth);
3610 if (Op1Known.isNonNegative() &&
3611 IsNonZero(II->getArgOperand(1), Op1NonZero, Op1Known))
3612 return true;
3613 KnownBits Op0Known =
3614 computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth);
3615 if (Op0Known.isNonNegative() &&
3616 IsNonZero(II->getArgOperand(0), Op0NonZero, Op0Known))
3617 return true;
3618 return IsNonZero(II->getArgOperand(1), Op1NonZero, Op1Known) &&
3619 IsNonZero(II->getArgOperand(0), Op0NonZero, Op0Known);
3620 }
3621 case Intrinsic::smin: {
3622 // If either arg is negative the result is non-zero. Otherwise
3623 // the result is non-zero if both ops are non-zero.
3624 KnownBits Op1Known =
3625 computeKnownBits(II->getArgOperand(1), DemandedElts, Q, Depth);
3626 if (Op1Known.isNegative())
3627 return true;
3628 KnownBits Op0Known =
3629 computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth);
3630 if (Op0Known.isNegative())
3631 return true;
3632
3633 if (Op1Known.isNonZero() && Op0Known.isNonZero())
3634 return true;
3635 }
3636 [[fallthrough]];
3637 case Intrinsic::umin:
3638 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth) &&
3639 isKnownNonZero(II->getArgOperand(1), DemandedElts, Q, Depth);
3640 case Intrinsic::cttz:
3641 return computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth)
3642 .Zero[0];
3643 case Intrinsic::ctlz:
3644 return computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth)
3645 .isNonNegative();
3646 case Intrinsic::fshr:
3647 case Intrinsic::fshl:
3648 // If Op0 == Op1, this is a rotate. rotate(x, y) != 0 iff x != 0.
3649 if (II->getArgOperand(0) == II->getArgOperand(1))
3650 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3651 break;
3652 case Intrinsic::vscale:
3653 return true;
3654 case Intrinsic::experimental_get_vector_length:
3655 return isKnownNonZero(I->getOperand(0), Q, Depth);
3656 default:
3657 break;
3658 }
3659 break;
3660 }
3661
3662 return false;
3663 }
3664 }
3665
3666 KnownBits Known(BitWidth);
3667 computeKnownBits(I, DemandedElts, Known, Q, Depth);
3668 return Known.One != 0;
3669}
3670
3671/// Return true if the given value is known to be non-zero when defined. For
3672/// vectors, return true if every demanded element is known to be non-zero when
3673/// defined. For pointers, if the context instruction and dominator tree are
3674/// specified, perform context-sensitive analysis and return true if the
3675/// pointer couldn't possibly be null at the specified instruction.
3676/// Supports values with integer or pointer type and vectors of integers.
3677bool isKnownNonZero(const Value *V, const APInt &DemandedElts,
3678 const SimplifyQuery &Q, unsigned Depth) {
3679 Type *Ty = V->getType();
3680
3681#ifndef NDEBUG
3682 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
3683
3684 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
3685 assert(
3686 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
3687 "DemandedElt width should equal the fixed vector number of elements");
3688 } else {
3689 assert(DemandedElts == APInt(1, 1) &&
3690 "DemandedElt width should be 1 for scalars");
3691 }
3692#endif
3693
3694 if (auto *C = dyn_cast<Constant>(V)) {
3695 if (C->isNullValue())
3696 return false;
3697 if (isa<ConstantInt>(C))
3698 // Must be non-zero due to null test above.
3699 return true;
3700
3701 // For constant vectors, check that all elements are poison or known
3702 // non-zero to determine that the whole vector is known non-zero.
3703 if (auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
3704 for (unsigned i = 0, e = VecTy->getNumElements(); i != e; ++i) {
3705 if (!DemandedElts[i])
3706 continue;
3707 Constant *Elt = C->getAggregateElement(i);
3708 if (!Elt || Elt->isNullValue())
3709 return false;
3710 if (!isa<PoisonValue>(Elt) && !isa<ConstantInt>(Elt))
3711 return false;
3712 }
3713 return true;
3714 }
3715
3716 // Constant ptrauth can be null, iff the base pointer can be.
3717 if (auto *CPA = dyn_cast<ConstantPtrAuth>(V))
3718 return isKnownNonZero(CPA->getPointer(), DemandedElts, Q, Depth);
3719
3720 // A global variable in address space 0 is non null unless extern weak
3721 // or an absolute symbol reference. Other address spaces may have null as a
3722 // valid address for a global, so we can't assume anything.
3723 if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
3724 if (!GV->isAbsoluteSymbolRef() && !GV->hasExternalWeakLinkage() &&
3725 GV->getType()->getAddressSpace() == 0)
3726 return true;
3727 }
3728
3729 // For constant expressions, fall through to the Operator code below.
3730 if (!isa<ConstantExpr>(V))
3731 return false;
3732 }
3733
3734 if (const auto *A = dyn_cast<Argument>(V))
3735 if (std::optional<ConstantRange> Range = A->getRange()) {
3736 const APInt ZeroValue(Range->getBitWidth(), 0);
3737 if (!Range->contains(ZeroValue))
3738 return true;
3739 }
3740
3741 if (!isa<Constant>(V) && isKnownNonZeroFromAssume(V, Q))
3742 return true;
3743
3744 // Some of the tests below are recursive, so bail out if we hit the limit.
3746 return false;
3747
3748 // Check for pointer simplifications.
3749
3750 if (PointerType *PtrTy = dyn_cast<PointerType>(Ty)) {
3751 // A byval, inalloca may not be null in a non-default addres space. A
3752 // nonnull argument is assumed never 0.
3753 if (const Argument *A = dyn_cast<Argument>(V)) {
3754 if (((A->hasPassPointeeByValueCopyAttr() &&
3755 !NullPointerIsDefined(A->getParent(), PtrTy->getAddressSpace())) ||
3756 A->hasNonNullAttr()))
3757 return true;
3758 }
3759 }
3760
3761 if (const auto *I = dyn_cast<Operator>(V))
3762 if (isKnownNonZeroFromOperator(I, DemandedElts, Q, Depth))
3763 return true;
3764
3765 if (!isa<Constant>(V) &&
3767 return true;
3768
3769 if (const Value *Stripped = stripNullTest(V))
3770 return isKnownNonZero(Stripped, DemandedElts, Q, Depth);
3771
3772 return false;
3773}
3774
3776 unsigned Depth) {
3777 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
3778 APInt DemandedElts =
3779 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
3780 return ::isKnownNonZero(V, DemandedElts, Q, Depth);
3781}
3782
3783/// If the pair of operators are the same invertible function, return the
3784/// the operands of the function corresponding to each input. Otherwise,
3785/// return std::nullopt. An invertible function is one that is 1-to-1 and maps
3786/// every input value to exactly one output value. This is equivalent to
3787/// saying that Op1 and Op2 are equal exactly when the specified pair of
3788/// operands are equal, (except that Op1 and Op2 may be poison more often.)
3789static std::optional<std::pair<Value*, Value*>>
3791 const Operator *Op2) {
3792 if (Op1->getOpcode() != Op2->getOpcode())
3793 return std::nullopt;
3794
3795 auto getOperands = [&](unsigned OpNum) -> auto {
3796 return std::make_pair(Op1->getOperand(OpNum), Op2->getOperand(OpNum));
3797 };
3798
3799 switch (Op1->getOpcode()) {
3800 default:
3801 break;
3802 case Instruction::Or:
3803 if (!cast<PossiblyDisjointInst>(Op1)->isDisjoint() ||
3804 !cast<PossiblyDisjointInst>(Op2)->isDisjoint())
3805 break;
3806 [[fallthrough]];
3807 case Instruction::Xor:
3808 case Instruction::Add: {
3809 Value *Other;
3810 if (match(Op2, m_c_BinOp(m_Specific(Op1->getOperand(0)), m_Value(Other))))
3811 return std::make_pair(Op1->getOperand(1), Other);
3812 if (match(Op2, m_c_BinOp(m_Specific(Op1->getOperand(1)), m_Value(Other))))
3813 return std::make_pair(Op1->getOperand(0), Other);
3814 break;
3815 }
3816 case Instruction::Sub:
3817 if (Op1->getOperand(0) == Op2->getOperand(0))
3818 return getOperands(1);
3819 if (Op1->getOperand(1) == Op2->getOperand(1))
3820 return getOperands(0);
3821 break;
3822 case Instruction::Mul: {
3823 // invertible if A * B == (A * B) mod 2^N where A, and B are integers
3824 // and N is the bitwdith. The nsw case is non-obvious, but proven by
3825 // alive2: https://alive2.llvm.org/ce/z/Z6D5qK
3826 auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
3827 auto *OBO2 = cast<OverflowingBinaryOperator>(Op2);
3828 if ((!OBO1->hasNoUnsignedWrap() || !OBO2->hasNoUnsignedWrap()) &&
3829 (!OBO1->hasNoSignedWrap() || !OBO2->hasNoSignedWrap()))
3830 break;
3831
3832 // Assume operand order has been canonicalized
3833 if (Op1->getOperand(1) == Op2->getOperand(1) &&
3834 isa<ConstantInt>(Op1->getOperand(1)) &&
3835 !cast<ConstantInt>(Op1->getOperand(1))->isZero())
3836 return getOperands(0);
3837 break;
3838 }
3839 case Instruction::Shl: {
3840 // Same as multiplies, with the difference that we don't need to check
3841 // for a non-zero multiply. Shifts always multiply by non-zero.
3842 auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
3843 auto *OBO2 = cast<OverflowingBinaryOperator>(Op2);
3844 if ((!OBO1->hasNoUnsignedWrap() || !OBO2->hasNoUnsignedWrap()) &&
3845 (!OBO1->hasNoSignedWrap() || !OBO2->hasNoSignedWrap()))
3846 break;
3847
3848 if (Op1->getOperand(1) == Op2->getOperand(1))
3849 return getOperands(0);
3850 break;
3851 }
3852 case Instruction::AShr:
3853 case Instruction::LShr: {
3854 auto *PEO1 = cast<PossiblyExactOperator>(Op1);
3855 auto *PEO2 = cast<PossiblyExactOperator>(Op2);
3856 if (!PEO1->isExact() || !PEO2->isExact())
3857 break;
3858
3859 if (Op1->getOperand(1) == Op2->getOperand(1))
3860 return getOperands(0);
3861 break;
3862 }
3863 case Instruction::SExt:
3864 case Instruction::ZExt:
3865 if (Op1->getOperand(0)->getType() == Op2->getOperand(0)->getType())
3866 return getOperands(0);
3867 break;
3868 case Instruction::PHI: {
3869 const PHINode *PN1 = cast<PHINode>(Op1);
3870 const PHINode *PN2 = cast<PHINode>(Op2);
3871
3872 // If PN1 and PN2 are both recurrences, can we prove the entire recurrences
3873 // are a single invertible function of the start values? Note that repeated
3874 // application of an invertible function is also invertible
3875 BinaryOperator *BO1 = nullptr;
3876 Value *Start1 = nullptr, *Step1 = nullptr;
3877 BinaryOperator *BO2 = nullptr;
3878 Value *Start2 = nullptr, *Step2 = nullptr;
3879 if (PN1->getParent() != PN2->getParent() ||
3880 !matchSimpleRecurrence(PN1, BO1, Start1, Step1) ||
3881 !matchSimpleRecurrence(PN2, BO2, Start2, Step2))
3882 break;
3883
3884 auto Values = getInvertibleOperands(cast<Operator>(BO1),
3885 cast<Operator>(BO2));
3886 if (!Values)
3887 break;
3888
3889 // We have to be careful of mutually defined recurrences here. Ex:
3890 // * X_i = X_(i-1) OP Y_(i-1), and Y_i = X_(i-1) OP V
3891 // * X_i = Y_i = X_(i-1) OP Y_(i-1)
3892 // The invertibility of these is complicated, and not worth reasoning
3893 // about (yet?).
3894 if (Values->first != PN1 || Values->second != PN2)
3895 break;
3896
3897 return std::make_pair(Start1, Start2);
3898 }
3899 }
3900 return std::nullopt;
3901}
3902
3903/// Return true if V1 == (binop V2, X), where X is known non-zero.
3904/// Only handle a small subset of binops where (binop V2, X) with non-zero X
3905/// implies V2 != V1.
3906static bool isModifyingBinopOfNonZero(const Value *V1, const Value *V2,
3907 const APInt &DemandedElts,
3908 const SimplifyQuery &Q, unsigned Depth) {
3910 if (!BO)
3911 return false;
3912 switch (BO->getOpcode()) {
3913 default:
3914 break;
3915 case Instruction::Or:
3916 if (!cast<PossiblyDisjointInst>(V1)->isDisjoint())
3917 break;
3918 [[fallthrough]];
3919 case Instruction::Xor:
3920 case Instruction::Add:
3921 Value *Op = nullptr;
3922 if (V2 == BO->getOperand(0))
3923 Op = BO->getOperand(1);
3924 else if (V2 == BO->getOperand(1))
3925 Op = BO->getOperand(0);
3926 else
3927 return false;
3928 return isKnownNonZero(Op, DemandedElts, Q, Depth + 1);
3929 }
3930 return false;
3931}
3932
3933/// Return true if V2 == V1 * C, where V1 is known non-zero, C is not 0/1 and
3934/// the multiplication is nuw or nsw.
3935static bool isNonEqualMul(const Value *V1, const Value *V2,
3936 const APInt &DemandedElts, const SimplifyQuery &Q,
3937 unsigned Depth) {
3938 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(V2)) {
3939 const APInt *C;
3940 return match(OBO, m_Mul(m_Specific(V1), m_APInt(C))) &&
3941 (OBO->hasNoUnsignedWrap() || OBO->hasNoSignedWrap()) &&
3942 !C->isZero() && !C->isOne() &&
3943 isKnownNonZero(V1, DemandedElts, Q, Depth + 1);
3944 }
3945 return false;
3946}
3947
3948/// Return true if V2 == V1 << C, where V1 is known non-zero, C is not 0 and
3949/// the shift is nuw or nsw.
3950static bool isNonEqualShl(const Value *V1, const Value *V2,
3951 const APInt &DemandedElts, const SimplifyQuery &Q,
3952 unsigned Depth) {
3953 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(V2)) {
3954 const APInt *C;
3955 return match(OBO, m_Shl(m_Specific(V1), m_APInt(C))) &&
3956 (OBO->hasNoUnsignedWrap() || OBO->hasNoSignedWrap()) &&
3957 !C->isZero() && isKnownNonZero(V1, DemandedElts, Q, Depth + 1);
3958 }
3959 return false;
3960}
3961
3962static bool isNonEqualPHIs(const PHINode *PN1, const PHINode *PN2,
3963 const APInt &DemandedElts, const SimplifyQuery &Q,
3964 unsigned Depth) {
3965 // Check two PHIs are in same block.
3966 if (PN1->getParent() != PN2->getParent())
3967 return false;
3968
3970 bool UsedFullRecursion = false;
3971 for (const BasicBlock *IncomBB : PN1->blocks()) {
3972 if (!VisitedBBs.insert(IncomBB).second)
3973 continue; // Don't reprocess blocks that we have dealt with already.
3974 const Value *IV1 = PN1->getIncomingValueForBlock(IncomBB);
3975 const Value *IV2 = PN2->getIncomingValueForBlock(IncomBB);
3976 const APInt *C1, *C2;
3977 if (match(IV1, m_APInt(C1)) && match(IV2, m_APInt(C2)) && *C1 != *C2)
3978 continue;
3979
3980 // Only one pair of phi operands is allowed for full recursion.
3981 if (UsedFullRecursion)
3982 return false;
3983
3985 RecQ.CxtI = IncomBB->getTerminator();
3986 if (!isKnownNonEqual(IV1, IV2, DemandedElts, RecQ, Depth + 1))
3987 return false;
3988 UsedFullRecursion = true;
3989 }
3990 return true;
3991}
3992
3993static bool isNonEqualSelect(const Value *V1, const Value *V2,
3994 const APInt &DemandedElts, const SimplifyQuery &Q,
3995 unsigned Depth) {
3996 const SelectInst *SI1 = dyn_cast<SelectInst>(V1);
3997 if (!SI1)
3998 return false;
3999
4000 if (const SelectInst *SI2 = dyn_cast<SelectInst>(V2)) {
4001 const Value *Cond1 = SI1->getCondition();
4002 const Value *Cond2 = SI2->getCondition();
4003 if (Cond1 == Cond2)
4004 return isKnownNonEqual(SI1->getTrueValue(), SI2->getTrueValue(),
4005 DemandedElts, Q, Depth + 1) &&
4006 isKnownNonEqual(SI1->getFalseValue(), SI2->getFalseValue(),
4007 DemandedElts, Q, Depth + 1);
4008 }
4009 return isKnownNonEqual(SI1->getTrueValue(), V2, DemandedElts, Q, Depth + 1) &&
4010 isKnownNonEqual(SI1->getFalseValue(), V2, DemandedElts, Q, Depth + 1);
4011}
4012
4013// Check to see if A is both a GEP and is the incoming value for a PHI in the
4014// loop, and B is either a ptr or another GEP. If the PHI has 2 incoming values,
4015// one of them being the recursive GEP A and the other a ptr at same base and at
4016// the same/higher offset than B we are only incrementing the pointer further in
4017// loop if offset of recursive GEP is greater than 0.
4019 const SimplifyQuery &Q) {
4020 if (!A->getType()->isPointerTy() || !B->getType()->isPointerTy())
4021 return false;
4022
4023 auto *GEPA = dyn_cast<GEPOperator>(A);
4024 if (!GEPA || GEPA->getNumIndices() != 1 || !isa<Constant>(GEPA->idx_begin()))
4025 return false;
4026
4027 // Handle 2 incoming PHI values with one being a recursive GEP.
4028 auto *PN = dyn_cast<PHINode>(GEPA->getPointerOperand());
4029 if (!PN || PN->getNumIncomingValues() != 2)
4030 return false;
4031
4032 // Search for the recursive GEP as an incoming operand, and record that as
4033 // Step.
4034 Value *Start = nullptr;
4035 Value *Step = const_cast<Value *>(A);
4036 if (PN->getIncomingValue(0) == Step)
4037 Start = PN->getIncomingValue(1);
4038 else if (PN->getIncomingValue(1) == Step)
4039 Start = PN->getIncomingValue(0);
4040 else
4041 return false;
4042
4043 // Other incoming node base should match the B base.
4044 // StartOffset >= OffsetB && StepOffset > 0?
4045 // StartOffset <= OffsetB && StepOffset < 0?
4046 // Is non-equal if above are true.
4047 // We use stripAndAccumulateInBoundsConstantOffsets to restrict the
4048 // optimisation to inbounds GEPs only.
4049 unsigned IndexWidth = Q.DL.getIndexTypeSizeInBits(Start->getType());
4050 APInt StartOffset(IndexWidth, 0);
4051 Start = Start->stripAndAccumulateInBoundsConstantOffsets(Q.DL, StartOffset);
4052 APInt StepOffset(IndexWidth, 0);
4053 Step = Step->stripAndAccumulateInBoundsConstantOffsets(Q.DL, StepOffset);
4054
4055 // Check if Base Pointer of Step matches the PHI.
4056 if (Step != PN)
4057 return false;
4058 APInt OffsetB(IndexWidth, 0);
4059 B = B->stripAndAccumulateInBoundsConstantOffsets(Q.DL, OffsetB);
4060 return Start == B &&
4061 ((StartOffset.sge(OffsetB) && StepOffset.isStrictlyPositive()) ||
4062 (StartOffset.sle(OffsetB) && StepOffset.isNegative()));
4063}
4064
4065static bool isKnownNonEqualFromContext(const Value *V1, const Value *V2,
4066 const SimplifyQuery &Q, unsigned Depth) {
4067 if (!Q.CxtI)
4068 return false;
4069
4070 // Try to infer NonEqual based on information from dominating conditions.
4071 if (Q.DC && Q.DT) {
4072 auto IsKnownNonEqualFromDominatingCondition = [&](const Value *V) {
4073 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
4074 Value *Cond = BI->getCondition();
4075 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
4076 if (Q.DT->dominates(Edge0, Q.CxtI->getParent()) &&
4078 /*LHSIsTrue=*/true, Depth)
4079 .value_or(false))
4080 return true;
4081
4082 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
4083 if (Q.DT->dominates(Edge1, Q.CxtI->getParent()) &&
4085 /*LHSIsTrue=*/false, Depth)
4086 .value_or(false))
4087 return true;
4088 }
4089
4090 return false;
4091 };
4092
4093 if (IsKnownNonEqualFromDominatingCondition(V1) ||
4094 IsKnownNonEqualFromDominatingCondition(V2))
4095 return true;
4096 }
4097
4098 if (!Q.AC)
4099 return false;
4100
4101 // Try to infer NonEqual based on information from assumptions.
4102 for (auto &AssumeVH : Q.AC->assumptionsFor(V1)) {
4103 if (!AssumeVH)
4104 continue;
4105 CallInst *I = cast<CallInst>(AssumeVH);
4106
4107 assert(I->getFunction() == Q.CxtI->getFunction() &&
4108 "Got assumption for the wrong function!");
4109 assert(I->getIntrinsicID() == Intrinsic::assume &&
4110 "must be an assume intrinsic");
4111
4112 if (isImpliedCondition(I->getArgOperand(0), ICmpInst::ICMP_NE, V1, V2, Q.DL,
4113 /*LHSIsTrue=*/true, Depth)
4114 .value_or(false) &&
4116 return true;
4117 }
4118
4119 return false;
4120}
4121
4122/// Return true if it is known that V1 != V2.
4123static bool isKnownNonEqual(const Value *V1, const Value *V2,
4124 const APInt &DemandedElts, const SimplifyQuery &Q,
4125 unsigned Depth) {
4126 if (V1 == V2)
4127 return false;
4128 if (V1->getType() != V2->getType())
4129 // We can't look through casts yet.
4130 return false;
4131
4133 return false;
4134
4135 // See if we can recurse through (exactly one of) our operands. This
4136 // requires our operation be 1-to-1 and map every input value to exactly
4137 // one output value. Such an operation is invertible.
4138 auto *O1 = dyn_cast<Operator>(V1);
4139 auto *O2 = dyn_cast<Operator>(V2);
4140 if (O1 && O2 && O1->getOpcode() == O2->getOpcode()) {
4141 if (auto Values = getInvertibleOperands(O1, O2))
4142 return isKnownNonEqual(Values->first, Values->second, DemandedElts, Q,
4143 Depth + 1);
4144
4145 if (const PHINode *PN1 = dyn_cast<PHINode>(V1)) {
4146 const PHINode *PN2 = cast<PHINode>(V2);
4147 // FIXME: This is missing a generalization to handle the case where one is
4148 // a PHI and another one isn't.
4149 if (isNonEqualPHIs(PN1, PN2, DemandedElts, Q, Depth))
4150 return true;
4151 };
4152 }
4153
4154 if (isModifyingBinopOfNonZero(V1, V2, DemandedElts, Q, Depth) ||
4155 isModifyingBinopOfNonZero(V2, V1, DemandedElts, Q, Depth))
4156 return true;
4157
4158 if (isNonEqualMul(V1, V2, DemandedElts, Q, Depth) ||
4159 isNonEqualMul(V2, V1, DemandedElts, Q, Depth))
4160 return true;
4161
4162 if (isNonEqualShl(V1, V2, DemandedElts, Q, Depth) ||
4163 isNonEqualShl(V2, V1, DemandedElts, Q, Depth))
4164 return true;
4165
4166 if (V1->getType()->isIntOrIntVectorTy()) {
4167 // Are any known bits in V1 contradictory to known bits in V2? If V1
4168 // has a known zero where V2 has a known one, they must not be equal.
4169 KnownBits Known1 = computeKnownBits(V1, DemandedElts, Q, Depth);
4170 if (!Known1.isUnknown()) {
4171 KnownBits Known2 = computeKnownBits(V2, DemandedElts, Q, Depth);
4172 if (Known1.Zero.intersects(Known2.One) ||
4173 Known2.Zero.intersects(Known1.One))
4174 return true;
4175 }
4176 }
4177
4178 if (isNonEqualSelect(V1, V2, DemandedElts, Q, Depth) ||
4179 isNonEqualSelect(V2, V1, DemandedElts, Q, Depth))
4180 return true;
4181
4182 if (isNonEqualPointersWithRecursiveGEP(V1, V2, Q) ||
4184 return true;
4185
4186 Value *A, *B;
4187 // PtrToInts are NonEqual if their Ptrs are NonEqual.
4188 // Check PtrToInt type matches the pointer size.
4189 if (match(V1, m_PtrToIntSameSize(Q.DL, m_Value(A))) &&
4191 return isKnownNonEqual(A, B, DemandedElts, Q, Depth + 1);
4192
4193 if (isKnownNonEqualFromContext(V1, V2, Q, Depth))
4194 return true;
4195
4196 return false;
4197}
4198
4199/// For vector constants, loop over the elements and find the constant with the
4200/// minimum number of sign bits. Return 0 if the value is not a vector constant
4201/// or if any element was not analyzed; otherwise, return the count for the
4202/// element with the minimum number of sign bits.
4204 const APInt &DemandedElts,
4205 unsigned TyBits) {
4206 const auto *CV = dyn_cast<Constant>(V);
4207 if (!CV || !isa<FixedVectorType>(CV->getType()))
4208 return 0;
4209
4210 unsigned MinSignBits = TyBits;
4211 unsigned NumElts = cast<FixedVectorType>(CV->getType())->getNumElements();
4212 for (unsigned i = 0; i != NumElts; ++i) {
4213 if (!DemandedElts[i])
4214 continue;
4215 // If we find a non-ConstantInt, bail out.
4216 auto *Elt = dyn_cast_or_null<ConstantInt>(CV->getAggregateElement(i));
4217 if (!Elt)
4218 return 0;
4219
4220 MinSignBits = std::min(MinSignBits, Elt->getValue().getNumSignBits());
4221 }
4222
4223 return MinSignBits;
4224}
4225
4226static unsigned ComputeNumSignBitsImpl(const Value *V,
4227 const APInt &DemandedElts,
4228 const SimplifyQuery &Q, unsigned Depth);
4229
4230static unsigned ComputeNumSignBits(const Value *V, const APInt &DemandedElts,
4231 const SimplifyQuery &Q, unsigned Depth) {
4232 unsigned Result = ComputeNumSignBitsImpl(V, DemandedElts, Q, Depth);
4233 assert(Result > 0 && "At least one sign bit needs to be present!");
4234 return Result;
4235}
4236
4237/// Return the number of times the sign bit of the register is replicated into
4238/// the other bits. We know that at least 1 bit is always equal to the sign bit
4239/// (itself), but other cases can give us information. For example, immediately
4240/// after an "ashr X, 2", we know that the top 3 bits are all equal to each
4241/// other, so we return 3. For vectors, return the number of sign bits for the
4242/// vector element with the minimum number of known sign bits of the demanded
4243/// elements in the vector specified by DemandedElts.
4244static unsigned ComputeNumSignBitsImpl(const Value *V,
4245 const APInt &DemandedElts,
4246 const SimplifyQuery &Q, unsigned Depth) {
4247 Type *Ty = V->getType();
4248#ifndef NDEBUG
4249 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
4250
4251 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
4252 assert(
4253 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
4254 "DemandedElt width should equal the fixed vector number of elements");
4255 } else {
4256 assert(DemandedElts == APInt(1, 1) &&
4257 "DemandedElt width should be 1 for scalars");
4258 }
4259#endif
4260
4261 // We return the minimum number of sign bits that are guaranteed to be present
4262 // in V, so for undef we have to conservatively return 1. We don't have the
4263 // same behavior for poison though -- that's a FIXME today.
4264
4265 Type *ScalarTy = Ty->getScalarType();
4266 unsigned TyBits = ScalarTy->isPointerTy() ?
4267 Q.DL.getPointerTypeSizeInBits(ScalarTy) :
4268 Q.DL.getTypeSizeInBits(ScalarTy);
4269
4270 unsigned Tmp, Tmp2;
4271 unsigned FirstAnswer = 1;
4272
4273 // Note that ConstantInt is handled by the general computeKnownBits case
4274 // below.
4275
4277 return 1;
4278
4279 if (auto *U = dyn_cast<Operator>(V)) {
4280 switch (Operator::getOpcode(V)) {
4281 default: break;
4282 case Instruction::BitCast: {
4283 Value *Src = U->getOperand(0);
4284 Type *SrcTy = Src->getType();
4285
4286 // Skip if the source type is not an integer or integer vector type
4287 // This ensures we only process integer-like types
4288 if (!SrcTy->isIntOrIntVectorTy())
4289 break;
4290
4291 unsigned SrcBits = SrcTy->getScalarSizeInBits();
4292
4293 // Bitcast 'large element' scalar/vector to 'small element' vector.
4294 if ((SrcBits % TyBits) != 0)
4295 break;
4296
4297 // Only proceed if the destination type is a fixed-size vector
4298 if (isa<FixedVectorType>(Ty)) {
4299 // Fast case - sign splat can be simply split across the small elements.
4300 // This works for both vector and scalar sources
4301 Tmp = ComputeNumSignBits(Src, Q, Depth + 1);
4302 if (Tmp == SrcBits)
4303 return TyBits;
4304 }
4305 break;
4306 }
4307 case Instruction::SExt:
4308 Tmp = TyBits - U->getOperand(0)->getType()->getScalarSizeInBits();
4309 return ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1) +
4310 Tmp;
4311
4312 case Instruction::SDiv: {
4313 const APInt *Denominator;
4314 // sdiv X, C -> adds log(C) sign bits.
4315 if (match(U->getOperand(1), m_APInt(Denominator))) {
4316
4317 // Ignore non-positive denominator.
4318 if (!Denominator->isStrictlyPositive())
4319 break;
4320
4321 // Calculate the incoming numerator bits.
4322 unsigned NumBits =
4323 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4324
4325 // Add floor(log(C)) bits to the numerator bits.
4326 return std::min(TyBits, NumBits + Denominator->logBase2());
4327 }
4328 break;
4329 }
4330
4331 case Instruction::SRem: {
4332 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4333
4334 const APInt *Denominator;
4335 // srem X, C -> we know that the result is within [-C+1,C) when C is a
4336 // positive constant. This let us put a lower bound on the number of sign
4337 // bits.
4338 if (match(U->getOperand(1), m_APInt(Denominator))) {
4339
4340 // Ignore non-positive denominator.
4341 if (Denominator->isStrictlyPositive()) {
4342 // Calculate the leading sign bit constraints by examining the
4343 // denominator. Given that the denominator is positive, there are two
4344 // cases:
4345 //
4346 // 1. The numerator is positive. The result range is [0,C) and
4347 // [0,C) u< (1 << ceilLogBase2(C)).
4348 //
4349 // 2. The numerator is negative. Then the result range is (-C,0] and
4350 // integers in (-C,0] are either 0 or >u (-1 << ceilLogBase2(C)).
4351 //
4352 // Thus a lower bound on the number of sign bits is `TyBits -
4353 // ceilLogBase2(C)`.
4354
4355 unsigned ResBits = TyBits - Denominator->ceilLogBase2();
4356 Tmp = std::max(Tmp, ResBits);
4357 }
4358 }
4359 return Tmp;
4360 }
4361
4362 case Instruction::AShr: {
4363 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4364 // ashr X, C -> adds C sign bits. Vectors too.
4365 const APInt *ShAmt;
4366 if (match(U->getOperand(1), m_APInt(ShAmt))) {
4367 if (ShAmt->uge(TyBits))
4368 break; // Bad shift.
4369 unsigned ShAmtLimited = ShAmt->getZExtValue();
4370 Tmp += ShAmtLimited;
4371 if (Tmp > TyBits) Tmp = TyBits;
4372 }
4373 return Tmp;
4374 }
4375 case Instruction::Shl: {
4376 const APInt *ShAmt;
4377 Value *X = nullptr;
4378 if (match(U->getOperand(1), m_APInt(ShAmt))) {
4379 // shl destroys sign bits.
4380 if (ShAmt->uge(TyBits))
4381 break; // Bad shift.
4382 // We can look through a zext (more or less treating it as a sext) if
4383 // all extended bits are shifted out.
4384 if (match(U->getOperand(0), m_ZExt(m_Value(X))) &&
4385 ShAmt->uge(TyBits - X->getType()->getScalarSizeInBits())) {
4386 Tmp = ComputeNumSignBits(X, DemandedElts, Q, Depth + 1);
4387 Tmp += TyBits - X->getType()->getScalarSizeInBits();
4388 } else
4389 Tmp =
4390 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4391 if (ShAmt->uge(Tmp))
4392 break; // Shifted all sign bits out.
4393 Tmp2 = ShAmt->getZExtValue();
4394 return Tmp - Tmp2;
4395 }
4396 break;
4397 }
4398 case Instruction::And:
4399 case Instruction::Or:
4400 case Instruction::Xor: // NOT is handled here.
4401 // Logical binary ops preserve the number of sign bits at the worst.
4402 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4403 if (Tmp != 1) {
4404 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4405 FirstAnswer = std::min(Tmp, Tmp2);
4406 // We computed what we know about the sign bits as our first
4407 // answer. Now proceed to the generic code that uses
4408 // computeKnownBits, and pick whichever answer is better.
4409 }
4410 break;
4411
4412 case Instruction::Select: {
4413 // If we have a clamp pattern, we know that the number of sign bits will
4414 // be the minimum of the clamp min/max range.
4415 const Value *X;
4416 const APInt *CLow, *CHigh;
4417 if (isSignedMinMaxClamp(U, X, CLow, CHigh))
4418 return std::min(CLow->getNumSignBits(), CHigh->getNumSignBits());
4419
4420 Tmp = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4421 if (Tmp == 1)
4422 break;
4423 Tmp2 = ComputeNumSignBits(U->getOperand(2), DemandedElts, Q, Depth + 1);
4424 return std::min(Tmp, Tmp2);
4425 }
4426
4427 case Instruction::Add:
4428 // Add can have at most one carry bit. Thus we know that the output
4429 // is, at worst, one more bit than the inputs.
4430 Tmp = ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4431 if (Tmp == 1) break;
4432
4433 // Special case decrementing a value (ADD X, -1):
4434 if (const auto *CRHS = dyn_cast<Constant>(U->getOperand(1)))
4435 if (CRHS->isAllOnesValue()) {
4436 KnownBits Known(TyBits);
4437 computeKnownBits(U->getOperand(0), DemandedElts, Known, Q, Depth + 1);
4438
4439 // If the input is known to be 0 or 1, the output is 0/-1, which is
4440 // all sign bits set.
4441 if ((Known.Zero | 1).isAllOnes())
4442 return TyBits;
4443
4444 // If we are subtracting one from a positive number, there is no carry
4445 // out of the result.
4446 if (Known.isNonNegative())
4447 return Tmp;
4448 }
4449
4450 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4451 if (Tmp2 == 1)
4452 break;
4453 return std::min(Tmp, Tmp2) - 1;
4454
4455 case Instruction::Sub:
4456 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4457 if (Tmp2 == 1)
4458 break;
4459
4460 // Handle NEG.
4461 if (const auto *CLHS = dyn_cast<Constant>(U->getOperand(0)))
4462 if (CLHS->isNullValue()) {
4463 KnownBits Known(TyBits);
4464 computeKnownBits(U->getOperand(1), DemandedElts, Known, Q, Depth + 1);
4465 // If the input is known to be 0 or 1, the output is 0/-1, which is
4466 // all sign bits set.
4467 if ((Known.Zero | 1).isAllOnes())
4468 return TyBits;
4469
4470 // If the input is known to be positive (the sign bit is known clear),
4471 // the output of the NEG has the same number of sign bits as the
4472 // input.
4473 if (Known.isNonNegative())
4474 return Tmp2;
4475
4476 // Otherwise, we treat this like a SUB.
4477 }
4478
4479 // Sub can have at most one carry bit. Thus we know that the output
4480 // is, at worst, one more bit than the inputs.
4481 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4482 if (Tmp == 1)
4483 break;
4484 return std::min(Tmp, Tmp2) - 1;
4485
4486 case Instruction::Mul: {
4487 // The output of the Mul can be at most twice the valid bits in the
4488 // inputs.
4489 unsigned SignBitsOp0 =
4490 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4491 if (SignBitsOp0 == 1)
4492 break;
4493 unsigned SignBitsOp1 =
4494 ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4495 if (SignBitsOp1 == 1)
4496 break;
4497 unsigned OutValidBits =
4498 (TyBits - SignBitsOp0 + 1) + (TyBits - SignBitsOp1 + 1);
4499 return OutValidBits > TyBits ? 1 : TyBits - OutValidBits + 1;
4500 }
4501
4502 case Instruction::PHI: {
4503 const PHINode *PN = cast<PHINode>(U);
4504 unsigned NumIncomingValues = PN->getNumIncomingValues();
4505 // Don't analyze large in-degree PHIs.
4506 if (NumIncomingValues > 4) break;
4507 // Unreachable blocks may have zero-operand PHI nodes.
4508 if (NumIncomingValues == 0) break;
4509
4510 // Take the minimum of all incoming values. This can't infinitely loop
4511 // because of our depth threshold.
4513 Tmp = TyBits;
4514 for (unsigned i = 0, e = NumIncomingValues; i != e; ++i) {
4515 if (Tmp == 1) return Tmp;
4516 RecQ.CxtI = PN->getIncomingBlock(i)->getTerminator();
4517 Tmp = std::min(Tmp, ComputeNumSignBits(PN->getIncomingValue(i),
4518 DemandedElts, RecQ, Depth + 1));
4519 }
4520 return Tmp;
4521 }
4522
4523 case Instruction::Trunc: {
4524 // If the input contained enough sign bits that some remain after the
4525 // truncation, then we can make use of that. Otherwise we don't know
4526 // anything.
4527 Tmp = ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4528 unsigned OperandTyBits = U->getOperand(0)->getType()->getScalarSizeInBits();
4529 if (Tmp > (OperandTyBits - TyBits))
4530 return Tmp - (OperandTyBits - TyBits);
4531
4532 return 1;
4533 }
4534
4535 case Instruction::ExtractElement:
4536 // Look through extract element. At the moment we keep this simple and
4537 // skip tracking the specific element. But at least we might find
4538 // information valid for all elements of the vector (for example if vector
4539 // is sign extended, shifted, etc).
4540 return ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4541
4542 case Instruction::ShuffleVector: {
4543 // Collect the minimum number of sign bits that are shared by every vector
4544 // element referenced by the shuffle.
4545 auto *Shuf = dyn_cast<ShuffleVectorInst>(U);
4546 if (!Shuf) {
4547 // FIXME: Add support for shufflevector constant expressions.
4548 return 1;
4549 }
4550 APInt DemandedLHS, DemandedRHS;
4551 // For undef elements, we don't know anything about the common state of
4552 // the shuffle result.
4553 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
4554 return 1;
4555 Tmp = std::numeric_limits<unsigned>::max();
4556 if (!!DemandedLHS) {
4557 const Value *LHS = Shuf->getOperand(0);
4558 Tmp = ComputeNumSignBits(LHS, DemandedLHS, Q, Depth + 1);
4559 }
4560 // If we don't know anything, early out and try computeKnownBits
4561 // fall-back.
4562 if (Tmp == 1)
4563 break;
4564 if (!!DemandedRHS) {
4565 const Value *RHS = Shuf->getOperand(1);
4566 Tmp2 = ComputeNumSignBits(RHS, DemandedRHS, Q, Depth + 1);
4567 Tmp = std::min(Tmp, Tmp2);
4568 }
4569 // If we don't know anything, early out and try computeKnownBits
4570 // fall-back.
4571 if (Tmp == 1)
4572 break;
4573 assert(Tmp <= TyBits && "Failed to determine minimum sign bits");
4574 return Tmp;
4575 }
4576 case Instruction::Call: {
4577 if (const auto *II = dyn_cast<IntrinsicInst>(U)) {
4578 switch (II->getIntrinsicID()) {
4579 default:
4580 break;
4581 case Intrinsic::abs:
4582 Tmp =
4583 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4584 if (Tmp == 1)
4585 break;
4586
4587 // Absolute value reduces number of sign bits by at most 1.
4588 return Tmp - 1;
4589 case Intrinsic::smin:
4590 case Intrinsic::smax: {
4591 const APInt *CLow, *CHigh;
4592 if (isSignedMinMaxIntrinsicClamp(II, CLow, CHigh))
4593 return std::min(CLow->getNumSignBits(), CHigh->getNumSignBits());
4594 }
4595 }
4596 }
4597 }
4598 }
4599 }
4600
4601 // Finally, if we can prove that the top bits of the result are 0's or 1's,
4602 // use this information.
4603
4604 // If we can examine all elements of a vector constant successfully, we're
4605 // done (we can't do any better than that). If not, keep trying.
4606 if (unsigned VecSignBits =
4607 computeNumSignBitsVectorConstant(V, DemandedElts, TyBits))
4608 return VecSignBits;
4609
4610 KnownBits Known(TyBits);
4611 computeKnownBits(V, DemandedElts, Known, Q, Depth);
4612
4613 // If we know that the sign bit is either zero or one, determine the number of
4614 // identical bits in the top of the input value.
4615 return std::max(FirstAnswer, Known.countMinSignBits());
4616}
4617
4619 const TargetLibraryInfo *TLI) {
4620 const Function *F = CB.getCalledFunction();
4621 if (!F)
4623
4624 if (F->isIntrinsic())
4625 return F->getIntrinsicID();
4626
4627 // We are going to infer semantics of a library function based on mapping it
4628 // to an LLVM intrinsic. Check that the library function is available from
4629 // this callbase and in this environment.
4630 LibFunc Func;
4631 if (F->hasLocalLinkage() || !TLI || !TLI->getLibFunc(CB, Func) ||
4632 !CB.onlyReadsMemory())
4634
4635 switch (Func) {
4636 default:
4637 break;
4638 case LibFunc_sin:
4639 case LibFunc_sinf:
4640 case LibFunc_sinl:
4641 return Intrinsic::sin;
4642 case LibFunc_cos:
4643 case LibFunc_cosf:
4644 case LibFunc_cosl:
4645 return Intrinsic::cos;
4646 case LibFunc_tan:
4647 case LibFunc_tanf:
4648 case LibFunc_tanl:
4649 return Intrinsic::tan;
4650 case LibFunc_asin:
4651 case LibFunc_asinf:
4652 case LibFunc_asinl:
4653 return Intrinsic::asin;
4654 case LibFunc_acos:
4655 case LibFunc_acosf:
4656 case LibFunc_acosl:
4657 return Intrinsic::acos;
4658 case LibFunc_atan:
4659 case LibFunc_atanf:
4660 case LibFunc_atanl:
4661 return Intrinsic::atan;
4662 case LibFunc_atan2:
4663 case LibFunc_atan2f:
4664 case LibFunc_atan2l:
4665 return Intrinsic::atan2;
4666 case LibFunc_sinh:
4667 case LibFunc_sinhf:
4668 case LibFunc_sinhl:
4669 return Intrinsic::sinh;
4670 case LibFunc_cosh:
4671 case LibFunc_coshf:
4672 case LibFunc_coshl:
4673 return Intrinsic::cosh;
4674 case LibFunc_tanh:
4675 case LibFunc_tanhf:
4676 case LibFunc_tanhl:
4677 return Intrinsic::tanh;
4678 case LibFunc_exp:
4679 case LibFunc_expf:
4680 case LibFunc_expl:
4681 return Intrinsic::exp;
4682 case LibFunc_exp2:
4683 case LibFunc_exp2f:
4684 case LibFunc_exp2l:
4685 return Intrinsic::exp2;
4686 case LibFunc_exp10:
4687 case LibFunc_exp10f:
4688 case LibFunc_exp10l:
4689 return Intrinsic::exp10;
4690 case LibFunc_log:
4691 case LibFunc_logf:
4692 case LibFunc_logl:
4693 return Intrinsic::log;
4694 case LibFunc_log10:
4695 case LibFunc_log10f:
4696 case LibFunc_log10l:
4697 return Intrinsic::log10;
4698 case LibFunc_log2:
4699 case LibFunc_log2f:
4700 case LibFunc_log2l:
4701 return Intrinsic::log2;
4702 case LibFunc_fabs:
4703 case LibFunc_fabsf:
4704 case LibFunc_fabsl:
4705 return Intrinsic::fabs;
4706 case LibFunc_fmin:
4707 case LibFunc_fminf:
4708 case LibFunc_fminl:
4709 return Intrinsic::minnum;
4710 case LibFunc_fmax:
4711 case LibFunc_fmaxf:
4712 case LibFunc_fmaxl:
4713 return Intrinsic::maxnum;
4714 case LibFunc_copysign:
4715 case LibFunc_copysignf:
4716 case LibFunc_copysignl:
4717 return Intrinsic::copysign;
4718 case LibFunc_floor:
4719 case LibFunc_floorf:
4720 case LibFunc_floorl:
4721 return Intrinsic::floor;
4722 case LibFunc_ceil:
4723 case LibFunc_ceilf:
4724 case LibFunc_ceill:
4725 return Intrinsic::ceil;
4726 case LibFunc_trunc:
4727 case LibFunc_truncf:
4728 case LibFunc_truncl:
4729 return Intrinsic::trunc;
4730 case LibFunc_rint:
4731 case LibFunc_rintf:
4732 case LibFunc_rintl:
4733 return Intrinsic::rint;
4734 case LibFunc_nearbyint:
4735 case LibFunc_nearbyintf:
4736 case LibFunc_nearbyintl:
4737 return Intrinsic::nearbyint;
4738 case LibFunc_round:
4739 case LibFunc_roundf:
4740 case LibFunc_roundl:
4741 return Intrinsic::round;
4742 case LibFunc_roundeven:
4743 case LibFunc_roundevenf:
4744 case LibFunc_roundevenl:
4745 return Intrinsic::roundeven;
4746 case LibFunc_pow:
4747 case LibFunc_powf:
4748 case LibFunc_powl:
4749 return Intrinsic::pow;
4750 case LibFunc_sqrt:
4751 case LibFunc_sqrtf:
4752 case LibFunc_sqrtl:
4753 return Intrinsic::sqrt;
4754 }
4755
4757}
4758
4759/// Given an exploded icmp instruction, return true if the comparison only
4760/// checks the sign bit. If it only checks the sign bit, set TrueIfSigned if
4761/// the result of the comparison is true when the input value is signed.
4763 bool &TrueIfSigned) {
4764 switch (Pred) {
4765 case ICmpInst::ICMP_SLT: // True if LHS s< 0
4766 TrueIfSigned = true;
4767 return RHS.isZero();
4768 case ICmpInst::ICMP_SLE: // True if LHS s<= -1
4769 TrueIfSigned = true;
4770 return RHS.isAllOnes();
4771 case ICmpInst::ICMP_SGT: // True if LHS s> -1
4772 TrueIfSigned = false;
4773 return RHS.isAllOnes();
4774 case ICmpInst::ICMP_SGE: // True if LHS s>= 0
4775 TrueIfSigned = false;
4776 return RHS.isZero();
4777 case ICmpInst::ICMP_UGT:
4778 // True if LHS u> RHS and RHS == sign-bit-mask - 1
4779 TrueIfSigned = true;
4780 return RHS.isMaxSignedValue();
4781 case ICmpInst::ICMP_UGE:
4782 // True if LHS u>= RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc)
4783 TrueIfSigned = true;
4784 return RHS.isMinSignedValue();
4785 case ICmpInst::ICMP_ULT:
4786 // True if LHS u< RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc)
4787 TrueIfSigned = false;
4788 return RHS.isMinSignedValue();
4789 case ICmpInst::ICMP_ULE:
4790 // True if LHS u<= RHS and RHS == sign-bit-mask - 1
4791 TrueIfSigned = false;
4792 return RHS.isMaxSignedValue();
4793 default:
4794 return false;
4795 }
4796}
4797
4799 bool CondIsTrue,
4800 const Instruction *CxtI,
4801 KnownFPClass &KnownFromContext,
4802 unsigned Depth = 0) {
4803 Value *A, *B;
4805 (CondIsTrue ? match(Cond, m_LogicalAnd(m_Value(A), m_Value(B)))
4806 : match(Cond, m_LogicalOr(m_Value(A), m_Value(B))))) {
4807 computeKnownFPClassFromCond(V, A, CondIsTrue, CxtI, KnownFromContext,
4808 Depth + 1);
4809 computeKnownFPClassFromCond(V, B, CondIsTrue, CxtI, KnownFromContext,
4810 Depth + 1);
4811 return;
4812 }
4814 computeKnownFPClassFromCond(V, A, !CondIsTrue, CxtI, KnownFromContext,
4815 Depth + 1);
4816 return;
4817 }
4818 CmpPredicate Pred;
4819 Value *LHS;
4820 uint64_t ClassVal = 0;
4821 const APFloat *CRHS;
4822 const APInt *RHS;
4823 if (match(Cond, m_FCmp(Pred, m_Value(LHS), m_APFloat(CRHS)))) {
4824 auto [CmpVal, MaskIfTrue, MaskIfFalse] = fcmpImpliesClass(
4825 Pred, *cast<Instruction>(Cond)->getParent()->getParent(), LHS, *CRHS,
4826 LHS != V);
4827 if (CmpVal == V)
4828 KnownFromContext.knownNot(~(CondIsTrue ? MaskIfTrue : MaskIfFalse));
4830 m_Specific(V), m_ConstantInt(ClassVal)))) {
4831 FPClassTest Mask = static_cast<FPClassTest>(ClassVal);
4832 KnownFromContext.knownNot(CondIsTrue ? ~Mask : Mask);
4833 } else if (match(Cond, m_ICmp(Pred, m_ElementWiseBitCast(m_Specific(V)),
4834 m_APInt(RHS)))) {
4835 bool TrueIfSigned;
4836 if (!isSignBitCheck(Pred, *RHS, TrueIfSigned))
4837 return;
4838 if (TrueIfSigned == CondIsTrue)
4839 KnownFromContext.signBitMustBeOne();
4840 else
4841 KnownFromContext.signBitMustBeZero();
4842 }
4843}
4844
4846 const SimplifyQuery &Q) {
4847 KnownFPClass KnownFromContext;
4848
4849 if (Q.CC && Q.CC->AffectedValues.contains(V))
4851 KnownFromContext);
4852
4853 if (!Q.CxtI)
4854 return KnownFromContext;
4855
4856 if (Q.DC && Q.DT) {
4857 // Handle dominating conditions.
4858 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
4859 Value *Cond = BI->getCondition();
4860
4861 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
4862 if (Q.DT->dominates(Edge0, Q.CxtI->getParent()))
4863 computeKnownFPClassFromCond(V, Cond, /*CondIsTrue=*/true, Q.CxtI,
4864 KnownFromContext);
4865
4866 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
4867 if (Q.DT->dominates(Edge1, Q.CxtI->getParent()))
4868 computeKnownFPClassFromCond(V, Cond, /*CondIsTrue=*/false, Q.CxtI,
4869 KnownFromContext);
4870 }
4871 }
4872
4873 if (!Q.AC)
4874 return KnownFromContext;
4875
4876 // Try to restrict the floating-point classes based on information from
4877 // assumptions.
4878 for (auto &AssumeVH : Q.AC->assumptionsFor(V)) {
4879 if (!AssumeVH)
4880 continue;
4881 CallInst *I = cast<CallInst>(AssumeVH);
4882
4883 assert(I->getFunction() == Q.CxtI->getParent()->getParent() &&
4884 "Got assumption for the wrong function!");
4885 assert(I->getIntrinsicID() == Intrinsic::assume &&
4886 "must be an assume intrinsic");
4887
4888 if (!isValidAssumeForContext(I, Q.CxtI, Q.DT))
4889 continue;
4890
4891 computeKnownFPClassFromCond(V, I->getArgOperand(0),
4892 /*CondIsTrue=*/true, Q.CxtI, KnownFromContext);
4893 }
4894
4895 return KnownFromContext;
4896}
4897
4899 Value *Arm, bool Invert,
4900 const SimplifyQuery &SQ,
4901 unsigned Depth) {
4902
4903 KnownFPClass KnownSrc;
4905 /*CondIsTrue=*/!Invert, SQ.CxtI, KnownSrc,
4906 Depth + 1);
4907 KnownSrc = KnownSrc.unionWith(Known);
4908 if (KnownSrc.isUnknown())
4909 return;
4910
4911 if (isGuaranteedNotToBeUndef(Arm, SQ.AC, SQ.CxtI, SQ.DT, Depth + 1))
4912 Known = KnownSrc;
4913}
4914
4915void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
4916 FPClassTest InterestedClasses, KnownFPClass &Known,
4917 const SimplifyQuery &Q, unsigned Depth);
4918
4919static void computeKnownFPClass(const Value *V, KnownFPClass &Known,
4920 FPClassTest InterestedClasses,
4921 const SimplifyQuery &Q, unsigned Depth) {
4922 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
4923 APInt DemandedElts =
4924 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
4925 computeKnownFPClass(V, DemandedElts, InterestedClasses, Known, Q, Depth);
4926}
4927
4929 const APInt &DemandedElts,
4930 FPClassTest InterestedClasses,
4931 KnownFPClass &Known,
4932 const SimplifyQuery &Q,
4933 unsigned Depth) {
4934 if ((InterestedClasses &
4936 return;
4937
4938 KnownFPClass KnownSrc;
4939 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
4940 KnownSrc, Q, Depth + 1);
4941
4942 // Sign should be preserved
4943 // TODO: Handle cannot be ordered greater than zero
4944 if (KnownSrc.cannotBeOrderedLessThanZero())
4946
4947 Known.propagateNaN(KnownSrc, true);
4948
4949 // Infinity needs a range check.
4950}
4951
4953 switch (IID) {
4954 case Intrinsic::minimum:
4956 case Intrinsic::maximum:
4958 case Intrinsic::minimumnum:
4960 case Intrinsic::maximumnum:
4962 case Intrinsic::minnum:
4964 case Intrinsic::maxnum:
4966 default:
4967 llvm_unreachable("not a floating-point min-max intrinsic");
4968 }
4969}
4970
4971void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
4972 FPClassTest InterestedClasses, KnownFPClass &Known,
4973 const SimplifyQuery &Q, unsigned Depth) {
4974 assert(Known.isUnknown() && "should not be called with known information");
4975
4976 if (!DemandedElts) {
4977 // No demanded elts, better to assume we don't know anything.
4978 Known.resetAll();
4979 return;
4980 }
4981
4982 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
4983
4984 if (auto *CFP = dyn_cast<ConstantFP>(V)) {
4985 Known = KnownFPClass(CFP->getValueAPF());
4986 return;
4987 }
4988
4990 Known.KnownFPClasses = fcPosZero;
4991 Known.SignBit = false;
4992 return;
4993 }
4994
4995 if (isa<PoisonValue>(V)) {
4996 Known.KnownFPClasses = fcNone;
4997 Known.SignBit = false;
4998 return;
4999 }
5000
5001 // Try to handle fixed width vector constants
5002 auto *VFVTy = dyn_cast<FixedVectorType>(V->getType());
5003 const Constant *CV = dyn_cast<Constant>(V);
5004 if (VFVTy && CV) {
5005 Known.KnownFPClasses = fcNone;
5006 bool SignBitAllZero = true;
5007 bool SignBitAllOne = true;
5008
5009 // For vectors, verify that each element is not NaN.
5010 unsigned NumElts = VFVTy->getNumElements();
5011 for (unsigned i = 0; i != NumElts; ++i) {
5012 if (!DemandedElts[i])
5013 continue;
5014
5015 Constant *Elt = CV->getAggregateElement(i);
5016 if (!Elt) {
5017 Known = KnownFPClass();
5018 return;
5019 }
5020 if (isa<PoisonValue>(Elt))
5021 continue;
5022 auto *CElt = dyn_cast<ConstantFP>(Elt);
5023 if (!CElt) {
5024 Known = KnownFPClass();
5025 return;
5026 }
5027
5028 const APFloat &C = CElt->getValueAPF();
5029 Known.KnownFPClasses |= C.classify();
5030 if (C.isNegative())
5031 SignBitAllZero = false;
5032 else
5033 SignBitAllOne = false;
5034 }
5035 if (SignBitAllOne != SignBitAllZero)
5036 Known.SignBit = SignBitAllOne;
5037 return;
5038 }
5039
5040 FPClassTest KnownNotFromFlags = fcNone;
5041 if (const auto *CB = dyn_cast<CallBase>(V))
5042 KnownNotFromFlags |= CB->getRetNoFPClass();
5043 else if (const auto *Arg = dyn_cast<Argument>(V))
5044 KnownNotFromFlags |= Arg->getNoFPClass();
5045
5046 const Operator *Op = dyn_cast<Operator>(V);
5048 if (FPOp->hasNoNaNs())
5049 KnownNotFromFlags |= fcNan;
5050 if (FPOp->hasNoInfs())
5051 KnownNotFromFlags |= fcInf;
5052 }
5053
5054 KnownFPClass AssumedClasses = computeKnownFPClassFromContext(V, Q);
5055 KnownNotFromFlags |= ~AssumedClasses.KnownFPClasses;
5056
5057 // We no longer need to find out about these bits from inputs if we can
5058 // assume this from flags/attributes.
5059 InterestedClasses &= ~KnownNotFromFlags;
5060
5061 llvm::scope_exit ClearClassesFromFlags([=, &Known] {
5062 Known.knownNot(KnownNotFromFlags);
5063 if (!Known.SignBit && AssumedClasses.SignBit) {
5064 if (*AssumedClasses.SignBit)
5065 Known.signBitMustBeOne();
5066 else
5067 Known.signBitMustBeZero();
5068 }
5069 });
5070
5071 if (!Op)
5072 return;
5073
5074 // All recursive calls that increase depth must come after this.
5076 return;
5077
5078 const unsigned Opc = Op->getOpcode();
5079 switch (Opc) {
5080 case Instruction::FNeg: {
5081 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
5082 Known, Q, Depth + 1);
5083 Known.fneg();
5084 break;
5085 }
5086 case Instruction::Select: {
5087 auto ComputeForArm = [&](Value *Arm, bool Invert) {
5088 KnownFPClass Res;
5089 computeKnownFPClass(Arm, DemandedElts, InterestedClasses, Res, Q,
5090 Depth + 1);
5091 adjustKnownFPClassForSelectArm(Res, Op->getOperand(0), Arm, Invert, Q,
5092 Depth);
5093 return Res;
5094 };
5095 // Only known if known in both the LHS and RHS.
5096 Known =
5097 ComputeForArm(Op->getOperand(1), /*Invert=*/false)
5098 .intersectWith(ComputeForArm(Op->getOperand(2), /*Invert=*/true));
5099 break;
5100 }
5101 case Instruction::Call: {
5102 const CallInst *II = cast<CallInst>(Op);
5103 const Intrinsic::ID IID = II->getIntrinsicID();
5104 switch (IID) {
5105 case Intrinsic::fabs: {
5106 if ((InterestedClasses & (fcNan | fcPositive)) != fcNone) {
5107 // If we only care about the sign bit we don't need to inspect the
5108 // operand.
5109 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5110 InterestedClasses, Known, Q, Depth + 1);
5111 }
5112
5113 Known.fabs();
5114 break;
5115 }
5116 case Intrinsic::copysign: {
5117 KnownFPClass KnownSign;
5118
5119 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5120 Known, Q, Depth + 1);
5121 computeKnownFPClass(II->getArgOperand(1), DemandedElts, InterestedClasses,
5122 KnownSign, Q, Depth + 1);
5123 Known.copysign(KnownSign);
5124 break;
5125 }
5126 case Intrinsic::fma:
5127 case Intrinsic::fmuladd: {
5128 if ((InterestedClasses & fcNegative) == fcNone)
5129 break;
5130
5131 if (II->getArgOperand(0) != II->getArgOperand(1) ||
5132 !isGuaranteedNotToBeUndef(II->getArgOperand(0), Q.AC, Q.CxtI, Q.DT,
5133 Depth + 1))
5134 break;
5135
5136 // The multiply cannot be -0 and therefore the add can't be -0
5137 Known.knownNot(fcNegZero);
5138
5139 // x * x + y is non-negative if y is non-negative.
5140 KnownFPClass KnownAddend;
5141 computeKnownFPClass(II->getArgOperand(2), DemandedElts, InterestedClasses,
5142 KnownAddend, Q, Depth + 1);
5143
5144 if (KnownAddend.cannotBeOrderedLessThanZero())
5145 Known.knownNot(fcNegative);
5146 break;
5147 }
5148 case Intrinsic::sqrt:
5149 case Intrinsic::experimental_constrained_sqrt: {
5150 KnownFPClass KnownSrc;
5151 FPClassTest InterestedSrcs = InterestedClasses;
5152 if (InterestedClasses & fcNan)
5153 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
5154
5155 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5156 KnownSrc, Q, Depth + 1);
5157
5159
5160 bool HasNSZ = Q.IIQ.hasNoSignedZeros(II);
5161 if (!HasNSZ) {
5162 const Function *F = II->getFunction();
5163 const fltSemantics &FltSem =
5164 II->getType()->getScalarType()->getFltSemantics();
5165 Mode = F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5166 }
5167
5168 Known = KnownFPClass::sqrt(KnownSrc, Mode);
5169 if (HasNSZ)
5170 Known.knownNot(fcNegZero);
5171
5172 break;
5173 }
5174 case Intrinsic::sin:
5175 case Intrinsic::cos: {
5176 // Return NaN on infinite inputs.
5177 KnownFPClass KnownSrc;
5178 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5179 KnownSrc, Q, Depth + 1);
5180 Known.knownNot(fcInf);
5181 if (KnownSrc.isKnownNeverNaN() && KnownSrc.isKnownNeverInfinity())
5182 Known.knownNot(fcNan);
5183 break;
5184 }
5185 case Intrinsic::maxnum:
5186 case Intrinsic::minnum:
5187 case Intrinsic::minimum:
5188 case Intrinsic::maximum:
5189 case Intrinsic::minimumnum:
5190 case Intrinsic::maximumnum: {
5191 KnownFPClass KnownLHS, KnownRHS;
5192 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5193 KnownLHS, Q, Depth + 1);
5194 computeKnownFPClass(II->getArgOperand(1), DemandedElts, InterestedClasses,
5195 KnownRHS, Q, Depth + 1);
5196
5197 const Function *F = II->getFunction();
5198
5200 F ? F->getDenormalMode(
5201 II->getType()->getScalarType()->getFltSemantics())
5203
5204 Known = KnownFPClass::minMaxLike(KnownLHS, KnownRHS, getMinMaxKind(IID),
5205 Mode);
5206 break;
5207 }
5208 case Intrinsic::canonicalize: {
5209 KnownFPClass KnownSrc;
5210 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5211 KnownSrc, Q, Depth + 1);
5212
5213 const Function *F = II->getFunction();
5214 DenormalMode DenormMode =
5215 F ? F->getDenormalMode(
5216 II->getType()->getScalarType()->getFltSemantics())
5218 Known = KnownFPClass::canonicalize(KnownSrc, DenormMode);
5219 break;
5220 }
5221 case Intrinsic::vector_reduce_fmax:
5222 case Intrinsic::vector_reduce_fmin:
5223 case Intrinsic::vector_reduce_fmaximum:
5224 case Intrinsic::vector_reduce_fminimum: {
5225 // reduce min/max will choose an element from one of the vector elements,
5226 // so we can infer and class information that is common to all elements.
5227 Known = computeKnownFPClass(II->getArgOperand(0), II->getFastMathFlags(),
5228 InterestedClasses, Q, Depth + 1);
5229 // Can only propagate sign if output is never NaN.
5230 if (!Known.isKnownNeverNaN())
5231 Known.SignBit.reset();
5232 break;
5233 }
5234 // reverse preserves all characteristics of the input vec's element.
5235 case Intrinsic::vector_reverse:
5236 Known = computeKnownFPClass(
5237 II->getArgOperand(0), DemandedElts.reverseBits(),
5238 II->getFastMathFlags(), InterestedClasses, Q, Depth + 1);
5239 break;
5240 case Intrinsic::trunc:
5241 case Intrinsic::floor:
5242 case Intrinsic::ceil:
5243 case Intrinsic::rint:
5244 case Intrinsic::nearbyint:
5245 case Intrinsic::round:
5246 case Intrinsic::roundeven: {
5247 KnownFPClass KnownSrc;
5248 FPClassTest InterestedSrcs = InterestedClasses;
5249 if (InterestedSrcs & fcPosFinite)
5250 InterestedSrcs |= fcPosFinite;
5251 if (InterestedSrcs & fcNegFinite)
5252 InterestedSrcs |= fcNegFinite;
5253 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5254 KnownSrc, Q, Depth + 1);
5255
5257 KnownSrc, IID == Intrinsic::trunc,
5258 V->getType()->getScalarType()->isMultiUnitFPType());
5259 break;
5260 }
5261 case Intrinsic::exp:
5262 case Intrinsic::exp2:
5263 case Intrinsic::exp10:
5264 case Intrinsic::amdgcn_exp2: {
5265 KnownFPClass KnownSrc;
5266 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5267 KnownSrc, Q, Depth + 1);
5268
5269 Known = KnownFPClass::exp(KnownSrc);
5270
5271 Type *EltTy = II->getType()->getScalarType();
5272 if (IID == Intrinsic::amdgcn_exp2 && EltTy->isFloatTy())
5273 Known.knownNot(fcSubnormal);
5274
5275 break;
5276 }
5277 case Intrinsic::fptrunc_round: {
5278 computeKnownFPClassForFPTrunc(Op, DemandedElts, InterestedClasses, Known,
5279 Q, Depth);
5280 break;
5281 }
5282 case Intrinsic::log:
5283 case Intrinsic::log10:
5284 case Intrinsic::log2:
5285 case Intrinsic::experimental_constrained_log:
5286 case Intrinsic::experimental_constrained_log10:
5287 case Intrinsic::experimental_constrained_log2:
5288 case Intrinsic::amdgcn_log: {
5289 Type *EltTy = II->getType()->getScalarType();
5290
5291 // log(+inf) -> +inf
5292 // log([+-]0.0) -> -inf
5293 // log(-inf) -> nan
5294 // log(-x) -> nan
5295 if ((InterestedClasses & (fcNan | fcInf)) != fcNone) {
5296 FPClassTest InterestedSrcs = InterestedClasses;
5297 if ((InterestedClasses & fcNegInf) != fcNone)
5298 InterestedSrcs |= fcZero | fcSubnormal;
5299 if ((InterestedClasses & fcNan) != fcNone)
5300 InterestedSrcs |= fcNan | fcNegative;
5301
5302 KnownFPClass KnownSrc;
5303 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5304 KnownSrc, Q, Depth + 1);
5305
5306 const Function *F = II->getFunction();
5307 DenormalMode Mode = F ? F->getDenormalMode(EltTy->getFltSemantics())
5309 Known = KnownFPClass::log(KnownSrc, Mode);
5310 }
5311
5312 if (IID == Intrinsic::amdgcn_log && EltTy->isFloatTy())
5313 Known.knownNot(fcSubnormal);
5314 break;
5315 }
5316 case Intrinsic::powi: {
5317 if ((InterestedClasses & fcNegative) == fcNone)
5318 break;
5319
5320 const Value *Exp = II->getArgOperand(1);
5321 Type *ExpTy = Exp->getType();
5322 unsigned BitWidth = ExpTy->getScalarType()->getIntegerBitWidth();
5323 KnownBits ExponentKnownBits(BitWidth);
5324 computeKnownBits(Exp, isa<VectorType>(ExpTy) ? DemandedElts : APInt(1, 1),
5325 ExponentKnownBits, Q, Depth + 1);
5326
5327 if (ExponentKnownBits.Zero[0]) { // Is even
5328 Known.knownNot(fcNegative);
5329 break;
5330 }
5331
5332 // Given that exp is an integer, here are the
5333 // ways that pow can return a negative value:
5334 //
5335 // pow(-x, exp) --> negative if exp is odd and x is negative.
5336 // pow(-0, exp) --> -inf if exp is negative odd.
5337 // pow(-0, exp) --> -0 if exp is positive odd.
5338 // pow(-inf, exp) --> -0 if exp is negative odd.
5339 // pow(-inf, exp) --> -inf if exp is positive odd.
5340 KnownFPClass KnownSrc;
5341 computeKnownFPClass(II->getArgOperand(0), DemandedElts, fcNegative,
5342 KnownSrc, Q, Depth + 1);
5343 if (KnownSrc.isKnownNever(fcNegative))
5344 Known.knownNot(fcNegative);
5345 break;
5346 }
5347 case Intrinsic::ldexp: {
5348 KnownFPClass KnownSrc;
5349 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5350 KnownSrc, Q, Depth + 1);
5351 Known.propagateNaN(KnownSrc, /*PropagateSign=*/true);
5352
5353 // Sign is preserved, but underflows may produce zeroes.
5354 if (KnownSrc.isKnownNever(fcNegative))
5355 Known.knownNot(fcNegative);
5356 else if (KnownSrc.cannotBeOrderedLessThanZero())
5358
5359 if (KnownSrc.isKnownNever(fcPositive))
5360 Known.knownNot(fcPositive);
5361 else if (KnownSrc.cannotBeOrderedGreaterThanZero())
5363
5364 // Can refine inf/zero handling based on the exponent operand.
5365 const FPClassTest ExpInfoMask = fcZero | fcSubnormal | fcInf;
5366 if ((InterestedClasses & ExpInfoMask) == fcNone)
5367 break;
5368 if ((KnownSrc.KnownFPClasses & ExpInfoMask) == fcNone)
5369 break;
5370
5371 const fltSemantics &Flt =
5372 II->getType()->getScalarType()->getFltSemantics();
5373 unsigned Precision = APFloat::semanticsPrecision(Flt);
5374 const Value *ExpArg = II->getArgOperand(1);
5376 ExpArg, true, Q.IIQ.UseInstrInfo, Q.AC, Q.CxtI, Q.DT, Depth + 1);
5377
5378 const int MantissaBits = Precision - 1;
5379 if (ExpRange.getSignedMin().sge(static_cast<int64_t>(MantissaBits)))
5380 Known.knownNot(fcSubnormal);
5381
5382 const Function *F = II->getFunction();
5383 const APInt *ConstVal = ExpRange.getSingleElement();
5384 const fltSemantics &FltSem =
5385 II->getType()->getScalarType()->getFltSemantics();
5386 if (ConstVal && ConstVal->isZero()) {
5387 // ldexp(x, 0) -> x, so propagate everything.
5388 Known.propagateCanonicalizingSrc(KnownSrc, F->getDenormalMode(FltSem));
5389 } else if (ExpRange.isAllNegative()) {
5390 // If we know the power is <= 0, can't introduce inf
5391 if (KnownSrc.isKnownNeverPosInfinity())
5392 Known.knownNot(fcPosInf);
5393 if (KnownSrc.isKnownNeverNegInfinity())
5394 Known.knownNot(fcNegInf);
5395 } else if (ExpRange.isAllNonNegative()) {
5396 // If we know the power is >= 0, can't introduce subnormal or zero
5397 if (KnownSrc.isKnownNeverPosSubnormal())
5398 Known.knownNot(fcPosSubnormal);
5399 if (KnownSrc.isKnownNeverNegSubnormal())
5400 Known.knownNot(fcNegSubnormal);
5401 if (F &&
5402 KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
5403 Known.knownNot(fcPosZero);
5404 if (F &&
5405 KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
5406 Known.knownNot(fcNegZero);
5407 }
5408
5409 break;
5410 }
5411 case Intrinsic::arithmetic_fence: {
5412 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5413 Known, Q, Depth + 1);
5414 break;
5415 }
5416 case Intrinsic::experimental_constrained_sitofp:
5417 case Intrinsic::experimental_constrained_uitofp:
5418 // Cannot produce nan
5419 Known.knownNot(fcNan);
5420
5421 // sitofp and uitofp turn into +0.0 for zero.
5422 Known.knownNot(fcNegZero);
5423
5424 // Integers cannot be subnormal
5425 Known.knownNot(fcSubnormal);
5426
5427 if (IID == Intrinsic::experimental_constrained_uitofp)
5428 Known.signBitMustBeZero();
5429
5430 // TODO: Copy inf handling from instructions
5431 break;
5432 case Intrinsic::amdgcn_rcp: {
5433 KnownFPClass KnownSrc;
5434 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5435 KnownSrc, Q, Depth + 1);
5436
5437 Known.propagateNaN(KnownSrc);
5438
5439 Type *EltTy = II->getType()->getScalarType();
5440
5441 // f32 denormal always flushed.
5442 if (EltTy->isFloatTy()) {
5443 Known.knownNot(fcSubnormal);
5444 KnownSrc.knownNot(fcSubnormal);
5445 }
5446
5447 if (KnownSrc.isKnownNever(fcNegative))
5448 Known.knownNot(fcNegative);
5449 if (KnownSrc.isKnownNever(fcPositive))
5450 Known.knownNot(fcPositive);
5451
5452 if (const Function *F = II->getFunction()) {
5453 DenormalMode Mode = F->getDenormalMode(EltTy->getFltSemantics());
5454 if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
5455 Known.knownNot(fcPosInf);
5456 if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
5457 Known.knownNot(fcNegInf);
5458 }
5459
5460 break;
5461 }
5462 case Intrinsic::amdgcn_rsq: {
5463 KnownFPClass KnownSrc;
5464 // The only negative value that can be returned is -inf for -0 inputs.
5466
5467 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5468 KnownSrc, Q, Depth + 1);
5469
5470 // Negative -> nan
5471 if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
5472 Known.knownNot(fcNan);
5473 else if (KnownSrc.isKnownNever(fcSNan))
5474 Known.knownNot(fcSNan);
5475
5476 // +inf -> +0
5477 if (KnownSrc.isKnownNeverPosInfinity())
5478 Known.knownNot(fcPosZero);
5479
5480 Type *EltTy = II->getType()->getScalarType();
5481
5482 // f32 denormal always flushed.
5483 if (EltTy->isFloatTy())
5484 Known.knownNot(fcPosSubnormal);
5485
5486 if (const Function *F = II->getFunction()) {
5487 DenormalMode Mode = F->getDenormalMode(EltTy->getFltSemantics());
5488
5489 // -0 -> -inf
5490 if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
5491 Known.knownNot(fcNegInf);
5492
5493 // +0 -> +inf
5494 if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
5495 Known.knownNot(fcPosInf);
5496 }
5497
5498 break;
5499 }
5500 default:
5501 break;
5502 }
5503
5504 break;
5505 }
5506 case Instruction::FAdd:
5507 case Instruction::FSub: {
5508 KnownFPClass KnownLHS, KnownRHS;
5509 bool WantNegative =
5510 Op->getOpcode() == Instruction::FAdd &&
5511 (InterestedClasses & KnownFPClass::OrderedLessThanZeroMask) != fcNone;
5512 bool WantNaN = (InterestedClasses & fcNan) != fcNone;
5513 bool WantNegZero = (InterestedClasses & fcNegZero) != fcNone;
5514
5515 if (!WantNaN && !WantNegative && !WantNegZero)
5516 break;
5517
5518 FPClassTest InterestedSrcs = InterestedClasses;
5519 if (WantNegative)
5520 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
5521 if (InterestedClasses & fcNan)
5522 InterestedSrcs |= fcInf;
5523 computeKnownFPClass(Op->getOperand(1), DemandedElts, InterestedSrcs,
5524 KnownRHS, Q, Depth + 1);
5525
5526 // Special case fadd x, x, which is the canonical form of fmul x, 2.
5527 bool SelfAdd = Op->getOperand(0) == Op->getOperand(1) &&
5528 isGuaranteedNotToBeUndef(Op->getOperand(0), Q.AC, Q.CxtI,
5529 Q.DT, Depth + 1);
5530 if (SelfAdd)
5531 KnownLHS = KnownRHS;
5532
5533 if ((WantNaN && KnownRHS.isKnownNeverNaN()) ||
5534 (WantNegative && KnownRHS.cannotBeOrderedLessThanZero()) ||
5535 WantNegZero || Opc == Instruction::FSub) {
5536
5537 if (!SelfAdd) {
5538 // RHS is canonically cheaper to compute. Skip inspecting the LHS if
5539 // there's no point.
5540 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedSrcs,
5541 KnownLHS, Q, Depth + 1);
5542 }
5543
5544 // Adding positive and negative infinity produces NaN.
5545 // TODO: Check sign of infinities.
5546 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
5547 (KnownLHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverInfinity()))
5548 Known.knownNot(fcNan);
5549
5550 // FIXME: Context function should always be passed in separately
5551 const Function *F = cast<Instruction>(Op)->getFunction();
5552
5553 if (Op->getOpcode() == Instruction::FAdd) {
5554 if (KnownLHS.cannotBeOrderedLessThanZero() &&
5555 KnownRHS.cannotBeOrderedLessThanZero())
5557 if (KnownLHS.cannotBeOrderedGreaterThanZero() &&
5560
5561 if (!F)
5562 break;
5563
5564 const fltSemantics &FltSem =
5565 Op->getType()->getScalarType()->getFltSemantics();
5566 DenormalMode Mode = F->getDenormalMode(FltSem);
5567
5568 // Doubling 0 will give the same 0.
5569 if (SelfAdd && KnownRHS.isKnownNeverLogicalPosZero(Mode) &&
5570 (Mode.Output == DenormalMode::IEEE ||
5571 (Mode.Output == DenormalMode::PreserveSign &&
5572 KnownRHS.isKnownNeverPosSubnormal()) ||
5573 (Mode.Output == DenormalMode::PositiveZero &&
5574 KnownRHS.isKnownNeverSubnormal())))
5575 Known.knownNot(fcPosZero);
5576
5577 // (fadd x, 0.0) is guaranteed to return +0.0, not -0.0.
5578 if ((KnownLHS.isKnownNeverLogicalNegZero(Mode) ||
5579 KnownRHS.isKnownNeverLogicalNegZero(Mode)) &&
5580 // Make sure output negative denormal can't flush to -0
5581 (Mode.Output == DenormalMode::IEEE ||
5583 Known.knownNot(fcNegZero);
5584 } else {
5585 if (!F)
5586 break;
5587
5588 const fltSemantics &FltSem =
5589 Op->getType()->getScalarType()->getFltSemantics();
5590 DenormalMode Mode = F->getDenormalMode(FltSem);
5591
5592 // Only fsub -0, +0 can return -0
5593 if ((KnownLHS.isKnownNeverLogicalNegZero(Mode) ||
5594 KnownRHS.isKnownNeverLogicalPosZero(Mode)) &&
5595 // Make sure output negative denormal can't flush to -0
5596 (Mode.Output == DenormalMode::IEEE ||
5598 Known.knownNot(fcNegZero);
5599 }
5600 }
5601
5602 break;
5603 }
5604 case Instruction::FMul: {
5605 const Function *F = cast<Instruction>(Op)->getFunction();
5607 F ? F->getDenormalMode(
5608 Op->getType()->getScalarType()->getFltSemantics())
5610
5611 // X * X is always non-negative or a NaN.
5612 if (Op->getOperand(0) == Op->getOperand(1) &&
5613 isGuaranteedNotToBeUndef(Op->getOperand(0), Q.AC, Q.CxtI, Q.DT)) {
5614 KnownFPClass KnownSrc;
5615 computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownSrc,
5616 Q, Depth + 1);
5617 Known = KnownFPClass::square(KnownSrc, Mode);
5618 break;
5619 }
5620
5621 KnownFPClass KnownLHS, KnownRHS;
5622
5623 bool CannotBeSubnormal = false;
5624 const APFloat *CRHS;
5625 if (match(Op->getOperand(1), m_APFloat(CRHS))) {
5626 // Match denormal scaling pattern, similar to the case in ldexp. If the
5627 // constant's exponent is sufficiently large, the result cannot be
5628 // subnormal.
5629
5630 // TODO: Should do general ConstantFPRange analysis.
5631 const fltSemantics &Flt =
5632 Op->getType()->getScalarType()->getFltSemantics();
5633 unsigned Precision = APFloat::semanticsPrecision(Flt);
5634 const int MantissaBits = Precision - 1;
5635
5636 int MinKnownExponent = ilogb(*CRHS);
5637 if (MinKnownExponent >= MantissaBits)
5638 CannotBeSubnormal = true;
5639
5640 KnownRHS = KnownFPClass(*CRHS);
5641 } else {
5642 computeKnownFPClass(Op->getOperand(1), DemandedElts, fcAllFlags, KnownRHS,
5643 Q, Depth + 1);
5644 }
5645
5646 computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownLHS,
5647 Q, Depth + 1);
5648
5649 Known = KnownFPClass::fmul(KnownLHS, KnownRHS, Mode);
5650 if (CannotBeSubnormal)
5651 Known.knownNot(fcSubnormal);
5652 break;
5653 }
5654 case Instruction::FDiv:
5655 case Instruction::FRem: {
5656 const bool WantNan = (InterestedClasses & fcNan) != fcNone;
5657
5658 if (Op->getOperand(0) == Op->getOperand(1) &&
5659 isGuaranteedNotToBeUndef(Op->getOperand(0), Q.AC, Q.CxtI, Q.DT)) {
5660 if (Op->getOpcode() == Instruction::FDiv) {
5661 // X / X is always exactly 1.0 or a NaN.
5663 } else {
5664 // X % X is always exactly [+-]0.0 or a NaN.
5665 Known.KnownFPClasses = fcNan | fcZero;
5666 }
5667
5668 if (!WantNan)
5669 break;
5670
5671 KnownFPClass KnownSrc;
5672 computeKnownFPClass(Op->getOperand(0), DemandedElts,
5673 fcNan | fcInf | fcZero | fcSubnormal, KnownSrc, Q,
5674 Depth + 1);
5675 const Function *F = cast<Instruction>(Op)->getFunction();
5676 const fltSemantics &FltSem =
5677 Op->getType()->getScalarType()->getFltSemantics();
5678
5679 if (KnownSrc.isKnownNeverInfOrNaN() &&
5680 KnownSrc.isKnownNeverLogicalZero(F ? F->getDenormalMode(FltSem)
5682 Known.knownNot(fcNan);
5683 else if (KnownSrc.isKnownNever(fcSNan))
5684 Known.knownNot(fcSNan);
5685
5686 break;
5687 }
5688
5689 const bool WantNegative = (InterestedClasses & fcNegative) != fcNone;
5690 const bool WantPositive =
5691 Opc == Instruction::FRem && (InterestedClasses & fcPositive) != fcNone;
5692 if (!WantNan && !WantNegative && !WantPositive)
5693 break;
5694
5695 KnownFPClass KnownLHS, KnownRHS;
5696
5697 computeKnownFPClass(Op->getOperand(1), DemandedElts,
5698 fcNan | fcInf | fcZero | fcNegative, KnownRHS, Q,
5699 Depth + 1);
5700
5701 bool KnowSomethingUseful = KnownRHS.isKnownNeverNaN() ||
5702 KnownRHS.isKnownNever(fcNegative) ||
5703 KnownRHS.isKnownNever(fcPositive);
5704
5705 if (KnowSomethingUseful || WantPositive) {
5706 computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownLHS,
5707 Q, Depth + 1);
5708 }
5709
5710 const Function *F = cast<Instruction>(Op)->getFunction();
5711 const fltSemantics &FltSem =
5712 Op->getType()->getScalarType()->getFltSemantics();
5713
5714 if (Op->getOpcode() == Instruction::FDiv) {
5715 // Only 0/0, Inf/Inf produce NaN.
5716 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
5717 (KnownLHS.isKnownNeverInfinity() ||
5718 KnownRHS.isKnownNeverInfinity()) &&
5719 ((F &&
5720 KnownLHS.isKnownNeverLogicalZero(F->getDenormalMode(FltSem))) ||
5721 (F &&
5722 KnownRHS.isKnownNeverLogicalZero(F->getDenormalMode(FltSem))))) {
5723 Known.knownNot(fcNan);
5724 }
5725
5726 // xor sign bit.
5727 // X / -0.0 is -Inf (or NaN).
5728 // +X / +X is +X
5729 if ((KnownLHS.isKnownNever(fcNegative) &&
5730 KnownRHS.isKnownNever(fcNegative)) ||
5731 (KnownLHS.isKnownNever(fcPositive) &&
5732 KnownRHS.isKnownNever(fcPositive)))
5733 Known.knownNot(fcNegative);
5734
5735 if ((KnownLHS.isKnownNever(fcPositive) &&
5736 KnownRHS.isKnownNever(fcNegative)) ||
5737 (KnownLHS.isKnownNever(fcNegative) &&
5738 KnownRHS.isKnownNever(fcPositive)))
5739 Known.knownNot(fcPositive);
5740
5741 // 0 / x => 0 or nan
5742 if (KnownLHS.isKnownAlways(fcZero))
5744
5745 // x / 0 => nan or inf
5746 if (KnownRHS.isKnownAlways(fcZero))
5747 Known.knownNot(fcFinite);
5748 } else {
5749 // Inf REM x and x REM 0 produce NaN.
5750 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
5751 KnownLHS.isKnownNeverInfinity() && F &&
5752 KnownRHS.isKnownNeverLogicalZero(F->getDenormalMode(FltSem))) {
5753 Known.knownNot(fcNan);
5754 }
5755
5756 // The sign for frem is the same as the first operand.
5757 if (KnownLHS.cannotBeOrderedLessThanZero())
5759 if (KnownLHS.cannotBeOrderedGreaterThanZero())
5761
5762 // See if we can be more aggressive about the sign of 0.
5763 if (KnownLHS.isKnownNever(fcNegative))
5764 Known.knownNot(fcNegative);
5765 if (KnownLHS.isKnownNever(fcPositive))
5766 Known.knownNot(fcPositive);
5767 }
5768
5769 break;
5770 }
5771 case Instruction::FPExt: {
5772 KnownFPClass KnownSrc;
5773 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
5774 KnownSrc, Q, Depth + 1);
5775
5776 const fltSemantics &DstTy =
5777 Op->getType()->getScalarType()->getFltSemantics();
5778 const fltSemantics &SrcTy =
5779 Op->getOperand(0)->getType()->getScalarType()->getFltSemantics();
5780
5781 Known = KnownFPClass::fpext(KnownSrc, DstTy, SrcTy);
5782 break;
5783 }
5784 case Instruction::FPTrunc: {
5785 computeKnownFPClassForFPTrunc(Op, DemandedElts, InterestedClasses, Known, Q,
5786 Depth);
5787 break;
5788 }
5789 case Instruction::SIToFP:
5790 case Instruction::UIToFP: {
5791 // Cannot produce nan
5792 Known.knownNot(fcNan);
5793
5794 // Integers cannot be subnormal
5795 Known.knownNot(fcSubnormal);
5796
5797 // sitofp and uitofp turn into +0.0 for zero.
5798 Known.knownNot(fcNegZero);
5799 if (Op->getOpcode() == Instruction::UIToFP)
5800 Known.signBitMustBeZero();
5801
5802 if (InterestedClasses & fcInf) {
5803 // Get width of largest magnitude integer (remove a bit if signed).
5804 // This still works for a signed minimum value because the largest FP
5805 // value is scaled by some fraction close to 2.0 (1.0 + 0.xxxx).
5806 int IntSize = Op->getOperand(0)->getType()->getScalarSizeInBits();
5807 if (Op->getOpcode() == Instruction::SIToFP)
5808 --IntSize;
5809
5810 // If the exponent of the largest finite FP value can hold the largest
5811 // integer, the result of the cast must be finite.
5812 Type *FPTy = Op->getType()->getScalarType();
5813 if (ilogb(APFloat::getLargest(FPTy->getFltSemantics())) >= IntSize)
5814 Known.knownNot(fcInf);
5815 }
5816
5817 break;
5818 }
5819 case Instruction::ExtractElement: {
5820 // Look through extract element. If the index is non-constant or
5821 // out-of-range demand all elements, otherwise just the extracted element.
5822 const Value *Vec = Op->getOperand(0);
5823
5824 APInt DemandedVecElts;
5825 if (auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType())) {
5826 unsigned NumElts = VecTy->getNumElements();
5827 DemandedVecElts = APInt::getAllOnes(NumElts);
5828 auto *CIdx = dyn_cast<ConstantInt>(Op->getOperand(1));
5829 if (CIdx && CIdx->getValue().ult(NumElts))
5830 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
5831 } else {
5832 DemandedVecElts = APInt(1, 1);
5833 }
5834
5835 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
5836 Q, Depth + 1);
5837 }
5838 case Instruction::InsertElement: {
5839 if (isa<ScalableVectorType>(Op->getType()))
5840 return;
5841
5842 const Value *Vec = Op->getOperand(0);
5843 const Value *Elt = Op->getOperand(1);
5844 auto *CIdx = dyn_cast<ConstantInt>(Op->getOperand(2));
5845 unsigned NumElts = DemandedElts.getBitWidth();
5846 APInt DemandedVecElts = DemandedElts;
5847 bool NeedsElt = true;
5848 // If we know the index we are inserting to, clear it from Vec check.
5849 if (CIdx && CIdx->getValue().ult(NumElts)) {
5850 DemandedVecElts.clearBit(CIdx->getZExtValue());
5851 NeedsElt = DemandedElts[CIdx->getZExtValue()];
5852 }
5853
5854 // Do we demand the inserted element?
5855 if (NeedsElt) {
5856 computeKnownFPClass(Elt, Known, InterestedClasses, Q, Depth + 1);
5857 // If we don't know any bits, early out.
5858 if (Known.isUnknown())
5859 break;
5860 } else {
5861 Known.KnownFPClasses = fcNone;
5862 }
5863
5864 // Do we need anymore elements from Vec?
5865 if (!DemandedVecElts.isZero()) {
5866 KnownFPClass Known2;
5867 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2, Q,
5868 Depth + 1);
5869 Known |= Known2;
5870 }
5871
5872 break;
5873 }
5874 case Instruction::ShuffleVector: {
5875 // Handle vector splat idiom
5876 if (Value *Splat = getSplatValue(V)) {
5877 computeKnownFPClass(Splat, Known, InterestedClasses, Q, Depth + 1);
5878 break;
5879 }
5880
5881 // For undef elements, we don't know anything about the common state of
5882 // the shuffle result.
5883 APInt DemandedLHS, DemandedRHS;
5884 auto *Shuf = dyn_cast<ShuffleVectorInst>(Op);
5885 if (!Shuf || !getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
5886 return;
5887
5888 if (!!DemandedLHS) {
5889 const Value *LHS = Shuf->getOperand(0);
5890 computeKnownFPClass(LHS, DemandedLHS, InterestedClasses, Known, Q,
5891 Depth + 1);
5892
5893 // If we don't know any bits, early out.
5894 if (Known.isUnknown())
5895 break;
5896 } else {
5897 Known.KnownFPClasses = fcNone;
5898 }
5899
5900 if (!!DemandedRHS) {
5901 KnownFPClass Known2;
5902 const Value *RHS = Shuf->getOperand(1);
5903 computeKnownFPClass(RHS, DemandedRHS, InterestedClasses, Known2, Q,
5904 Depth + 1);
5905 Known |= Known2;
5906 }
5907
5908 break;
5909 }
5910 case Instruction::ExtractValue: {
5911 const ExtractValueInst *Extract = cast<ExtractValueInst>(Op);
5912 ArrayRef<unsigned> Indices = Extract->getIndices();
5913 const Value *Src = Extract->getAggregateOperand();
5914 if (isa<StructType>(Src->getType()) && Indices.size() == 1 &&
5915 Indices[0] == 0) {
5916 if (const auto *II = dyn_cast<IntrinsicInst>(Src)) {
5917 switch (II->getIntrinsicID()) {
5918 case Intrinsic::frexp: {
5919 Known.knownNot(fcSubnormal);
5920
5921 KnownFPClass KnownSrc;
5922 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5923 InterestedClasses, KnownSrc, Q, Depth + 1);
5924
5925 const Function *F = cast<Instruction>(Op)->getFunction();
5926 const fltSemantics &FltSem =
5927 Op->getType()->getScalarType()->getFltSemantics();
5928
5929 if (KnownSrc.isKnownNever(fcNegative))
5930 Known.knownNot(fcNegative);
5931 else {
5932 if (F &&
5933 KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
5934 Known.knownNot(fcNegZero);
5935 if (KnownSrc.isKnownNever(fcNegInf))
5936 Known.knownNot(fcNegInf);
5937 }
5938
5939 if (KnownSrc.isKnownNever(fcPositive))
5940 Known.knownNot(fcPositive);
5941 else {
5942 if (F &&
5943 KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
5944 Known.knownNot(fcPosZero);
5945 if (KnownSrc.isKnownNever(fcPosInf))
5946 Known.knownNot(fcPosInf);
5947 }
5948
5949 Known.propagateNaN(KnownSrc);
5950 return;
5951 }
5952 default:
5953 break;
5954 }
5955 }
5956 }
5957
5958 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known, Q,
5959 Depth + 1);
5960 break;
5961 }
5962 case Instruction::PHI: {
5963 const PHINode *P = cast<PHINode>(Op);
5964 // Unreachable blocks may have zero-operand PHI nodes.
5965 if (P->getNumIncomingValues() == 0)
5966 break;
5967
5968 // Otherwise take the unions of the known bit sets of the operands,
5969 // taking conservative care to avoid excessive recursion.
5970 const unsigned PhiRecursionLimit = MaxAnalysisRecursionDepth - 2;
5971
5972 if (Depth < PhiRecursionLimit) {
5973 // Skip if every incoming value references to ourself.
5974 if (isa_and_nonnull<UndefValue>(P->hasConstantValue()))
5975 break;
5976
5977 bool First = true;
5978
5979 for (const Use &U : P->operands()) {
5980 Value *IncValue;
5981 Instruction *CxtI;
5982 breakSelfRecursivePHI(&U, P, IncValue, CxtI);
5983 // Skip direct self references.
5984 if (IncValue == P)
5985 continue;
5986
5987 KnownFPClass KnownSrc;
5988 // Recurse, but cap the recursion to two levels, because we don't want
5989 // to waste time spinning around in loops. We need at least depth 2 to
5990 // detect known sign bits.
5991 computeKnownFPClass(IncValue, DemandedElts, InterestedClasses, KnownSrc,
5993 PhiRecursionLimit);
5994
5995 if (First) {
5996 Known = KnownSrc;
5997 First = false;
5998 } else {
5999 Known |= KnownSrc;
6000 }
6001
6002 if (Known.KnownFPClasses == fcAllFlags)
6003 break;
6004 }
6005 }
6006
6007 break;
6008 }
6009 case Instruction::BitCast: {
6010 const Value *Src;
6011 if (!match(Op, m_ElementWiseBitCast(m_Value(Src))) ||
6012 !Src->getType()->isIntOrIntVectorTy())
6013 break;
6014
6015 const Type *Ty = Op->getType()->getScalarType();
6016 KnownBits Bits(Ty->getScalarSizeInBits());
6017 computeKnownBits(Src, DemandedElts, Bits, Q, Depth + 1);
6018
6019 // Transfer information from the sign bit.
6020 if (Bits.isNonNegative())
6021 Known.signBitMustBeZero();
6022 else if (Bits.isNegative())
6023 Known.signBitMustBeOne();
6024
6025 if (Ty->isIEEELikeFPTy()) {
6026 // IEEE floats are NaN when all bits of the exponent plus at least one of
6027 // the fraction bits are 1. This means:
6028 // - If we assume unknown bits are 0 and the value is NaN, it will
6029 // always be NaN
6030 // - If we assume unknown bits are 1 and the value is not NaN, it can
6031 // never be NaN
6032 // Note: They do not hold for x86_fp80 format.
6033 if (APFloat(Ty->getFltSemantics(), Bits.One).isNaN())
6034 Known.KnownFPClasses = fcNan;
6035 else if (!APFloat(Ty->getFltSemantics(), ~Bits.Zero).isNaN())
6036 Known.knownNot(fcNan);
6037
6038 // Build KnownBits representing Inf and check if it must be equal or
6039 // unequal to this value.
6040 auto InfKB = KnownBits::makeConstant(
6041 APFloat::getInf(Ty->getFltSemantics()).bitcastToAPInt());
6042 InfKB.Zero.clearSignBit();
6043 if (const auto InfResult = KnownBits::eq(Bits, InfKB)) {
6044 assert(!InfResult.value());
6045 Known.knownNot(fcInf);
6046 } else if (Bits == InfKB) {
6047 Known.KnownFPClasses = fcInf;
6048 }
6049
6050 // Build KnownBits representing Zero and check if it must be equal or
6051 // unequal to this value.
6052 auto ZeroKB = KnownBits::makeConstant(
6053 APFloat::getZero(Ty->getFltSemantics()).bitcastToAPInt());
6054 ZeroKB.Zero.clearSignBit();
6055 if (const auto ZeroResult = KnownBits::eq(Bits, ZeroKB)) {
6056 assert(!ZeroResult.value());
6057 Known.knownNot(fcZero);
6058 } else if (Bits == ZeroKB) {
6059 Known.KnownFPClasses = fcZero;
6060 }
6061 }
6062
6063 break;
6064 }
6065 default:
6066 break;
6067 }
6068}
6069
6071 const APInt &DemandedElts,
6072 FPClassTest InterestedClasses,
6073 const SimplifyQuery &SQ,
6074 unsigned Depth) {
6075 KnownFPClass KnownClasses;
6076 ::computeKnownFPClass(V, DemandedElts, InterestedClasses, KnownClasses, SQ,
6077 Depth);
6078 return KnownClasses;
6079}
6080
6082 FPClassTest InterestedClasses,
6083 const SimplifyQuery &SQ,
6084 unsigned Depth) {
6085 KnownFPClass Known;
6086 ::computeKnownFPClass(V, Known, InterestedClasses, SQ, Depth);
6087 return Known;
6088}
6089
6091 const Value *V, const DataLayout &DL, FPClassTest InterestedClasses,
6092 const TargetLibraryInfo *TLI, AssumptionCache *AC, const Instruction *CxtI,
6093 const DominatorTree *DT, bool UseInstrInfo, unsigned Depth) {
6094 return computeKnownFPClass(V, InterestedClasses,
6095 SimplifyQuery(DL, TLI, DT, AC, CxtI, UseInstrInfo),
6096 Depth);
6097}
6098
6100llvm::computeKnownFPClass(const Value *V, const APInt &DemandedElts,
6101 FastMathFlags FMF, FPClassTest InterestedClasses,
6102 const SimplifyQuery &SQ, unsigned Depth) {
6103 if (FMF.noNaNs())
6104 InterestedClasses &= ~fcNan;
6105 if (FMF.noInfs())
6106 InterestedClasses &= ~fcInf;
6107
6108 KnownFPClass Result =
6109 computeKnownFPClass(V, DemandedElts, InterestedClasses, SQ, Depth);
6110
6111 if (FMF.noNaNs())
6112 Result.KnownFPClasses &= ~fcNan;
6113 if (FMF.noInfs())
6114 Result.KnownFPClasses &= ~fcInf;
6115 return Result;
6116}
6117
6119 FPClassTest InterestedClasses,
6120 const SimplifyQuery &SQ,
6121 unsigned Depth) {
6122 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
6123 APInt DemandedElts =
6124 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
6125 return computeKnownFPClass(V, DemandedElts, FMF, InterestedClasses, SQ,
6126 Depth);
6127}
6128
6130 unsigned Depth) {
6132 return Known.isKnownNeverNegZero();
6133}
6134
6141
6143 unsigned Depth) {
6145 return Known.isKnownNeverInfinity();
6146}
6147
6148/// Return true if the floating-point value can never contain a NaN or infinity.
6150 unsigned Depth) {
6152 return Known.isKnownNeverNaN() && Known.isKnownNeverInfinity();
6153}
6154
6155/// Return true if the floating-point scalar value is not a NaN or if the
6156/// floating-point vector value has no NaN elements. Return false if a value
6157/// could ever be NaN.
6159 unsigned Depth) {
6161 return Known.isKnownNeverNaN();
6162}
6163
6164/// Return false if we can prove that the specified FP value's sign bit is 0.
6165/// Return true if we can prove that the specified FP value's sign bit is 1.
6166/// Otherwise return std::nullopt.
6167std::optional<bool> llvm::computeKnownFPSignBit(const Value *V,
6168 const SimplifyQuery &SQ,
6169 unsigned Depth) {
6171 return Known.SignBit;
6172}
6173
6175 auto *User = cast<Instruction>(U.getUser());
6176 if (auto *FPOp = dyn_cast<FPMathOperator>(User)) {
6177 if (FPOp->hasNoSignedZeros())
6178 return true;
6179 }
6180
6181 switch (User->getOpcode()) {
6182 case Instruction::FPToSI:
6183 case Instruction::FPToUI:
6184 return true;
6185 case Instruction::FCmp:
6186 // fcmp treats both positive and negative zero as equal.
6187 return true;
6188 case Instruction::Call:
6189 if (auto *II = dyn_cast<IntrinsicInst>(User)) {
6190 switch (II->getIntrinsicID()) {
6191 case Intrinsic::fabs:
6192 return true;
6193 case Intrinsic::copysign:
6194 return U.getOperandNo() == 0;
6195 case Intrinsic::is_fpclass:
6196 case Intrinsic::vp_is_fpclass: {
6197 auto Test =
6198 static_cast<FPClassTest>(
6199 cast<ConstantInt>(II->getArgOperand(1))->getZExtValue()) &
6202 }
6203 default:
6204 return false;
6205 }
6206 }
6207 return false;
6208 default:
6209 return false;
6210 }
6211}
6212
6214 auto *User = cast<Instruction>(U.getUser());
6215 if (auto *FPOp = dyn_cast<FPMathOperator>(User)) {
6216 if (FPOp->hasNoNaNs())
6217 return true;
6218 }
6219
6220 switch (User->getOpcode()) {
6221 case Instruction::FPToSI:
6222 case Instruction::FPToUI:
6223 return true;
6224 // Proper FP math operations ignore the sign bit of NaN.
6225 case Instruction::FAdd:
6226 case Instruction::FSub:
6227 case Instruction::FMul:
6228 case Instruction::FDiv:
6229 case Instruction::FRem:
6230 case Instruction::FPTrunc:
6231 case Instruction::FPExt:
6232 case Instruction::FCmp:
6233 return true;
6234 // Bitwise FP operations should preserve the sign bit of NaN.
6235 case Instruction::FNeg:
6236 case Instruction::Select:
6237 case Instruction::PHI:
6238 return false;
6239 case Instruction::Ret:
6240 return User->getFunction()->getAttributes().getRetNoFPClass() &
6242 case Instruction::Call:
6243 case Instruction::Invoke: {
6244 if (auto *II = dyn_cast<IntrinsicInst>(User)) {
6245 switch (II->getIntrinsicID()) {
6246 case Intrinsic::fabs:
6247 return true;
6248 case Intrinsic::copysign:
6249 return U.getOperandNo() == 0;
6250 // Other proper FP math intrinsics ignore the sign bit of NaN.
6251 case Intrinsic::maxnum:
6252 case Intrinsic::minnum:
6253 case Intrinsic::maximum:
6254 case Intrinsic::minimum:
6255 case Intrinsic::maximumnum:
6256 case Intrinsic::minimumnum:
6257 case Intrinsic::canonicalize:
6258 case Intrinsic::fma:
6259 case Intrinsic::fmuladd:
6260 case Intrinsic::sqrt:
6261 case Intrinsic::pow:
6262 case Intrinsic::powi:
6263 case Intrinsic::fptoui_sat:
6264 case Intrinsic::fptosi_sat:
6265 case Intrinsic::is_fpclass:
6266 case Intrinsic::vp_is_fpclass:
6267 return true;
6268 default:
6269 return false;
6270 }
6271 }
6272
6273 FPClassTest NoFPClass =
6274 cast<CallBase>(User)->getParamNoFPClass(U.getOperandNo());
6275 return NoFPClass & FPClassTest::fcNan;
6276 }
6277 default:
6278 return false;
6279 }
6280}
6281
6283
6284 // All byte-wide stores are splatable, even of arbitrary variables.
6285 if (V->getType()->isIntegerTy(8))
6286 return V;
6287
6288 LLVMContext &Ctx = V->getContext();
6289
6290 // Undef don't care.
6291 auto *UndefInt8 = UndefValue::get(Type::getInt8Ty(Ctx));
6292 if (isa<UndefValue>(V))
6293 return UndefInt8;
6294
6295 // Return poison for zero-sized type.
6296 if (DL.getTypeStoreSize(V->getType()).isZero())
6297 return PoisonValue::get(Type::getInt8Ty(Ctx));
6298
6300 if (!C) {
6301 // Conceptually, we could handle things like:
6302 // %a = zext i8 %X to i16
6303 // %b = shl i16 %a, 8
6304 // %c = or i16 %a, %b
6305 // but until there is an example that actually needs this, it doesn't seem
6306 // worth worrying about.
6307 return nullptr;
6308 }
6309
6310 // Handle 'null' ConstantArrayZero etc.
6311 if (C->isNullValue())
6313
6314 // Constant floating-point values can be handled as integer values if the
6315 // corresponding integer value is "byteable". An important case is 0.0.
6316 if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
6317 Type *Ty = nullptr;
6318 if (CFP->getType()->isHalfTy())
6319 Ty = Type::getInt16Ty(Ctx);
6320 else if (CFP->getType()->isFloatTy())
6321 Ty = Type::getInt32Ty(Ctx);
6322 else if (CFP->getType()->isDoubleTy())
6323 Ty = Type::getInt64Ty(Ctx);
6324 // Don't handle long double formats, which have strange constraints.
6325 return Ty ? isBytewiseValue(ConstantExpr::getBitCast(CFP, Ty), DL)
6326 : nullptr;
6327 }
6328
6329 // We can handle constant integers that are multiple of 8 bits.
6330 if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
6331 if (CI->getBitWidth() % 8 == 0) {
6332 assert(CI->getBitWidth() > 8 && "8 bits should be handled above!");
6333 if (!CI->getValue().isSplat(8))
6334 return nullptr;
6335 return ConstantInt::get(Ctx, CI->getValue().trunc(8));
6336 }
6337 }
6338
6339 if (auto *CE = dyn_cast<ConstantExpr>(C)) {
6340 if (CE->getOpcode() == Instruction::IntToPtr) {
6341 if (auto *PtrTy = dyn_cast<PointerType>(CE->getType())) {
6342 unsigned BitWidth = DL.getPointerSizeInBits(PtrTy->getAddressSpace());
6344 CE->getOperand(0), Type::getIntNTy(Ctx, BitWidth), false, DL))
6345 return isBytewiseValue(Op, DL);
6346 }
6347 }
6348 }
6349
6350 auto Merge = [&](Value *LHS, Value *RHS) -> Value * {
6351 if (LHS == RHS)
6352 return LHS;
6353 if (!LHS || !RHS)
6354 return nullptr;
6355 if (LHS == UndefInt8)
6356 return RHS;
6357 if (RHS == UndefInt8)
6358 return LHS;
6359 return nullptr;
6360 };
6361
6363 Value *Val = UndefInt8;
6364 for (uint64_t I = 0, E = CA->getNumElements(); I != E; ++I)
6365 if (!(Val = Merge(Val, isBytewiseValue(CA->getElementAsConstant(I), DL))))
6366 return nullptr;
6367 return Val;
6368 }
6369
6371 Value *Val = UndefInt8;
6372 for (Value *Op : C->operands())
6373 if (!(Val = Merge(Val, isBytewiseValue(Op, DL))))
6374 return nullptr;
6375 return Val;
6376 }
6377
6378 // Don't try to handle the handful of other constants.
6379 return nullptr;
6380}
6381
6382// This is the recursive version of BuildSubAggregate. It takes a few different
6383// arguments. Idxs is the index within the nested struct From that we are
6384// looking at now (which is of type IndexedType). IdxSkip is the number of
6385// indices from Idxs that should be left out when inserting into the resulting
6386// struct. To is the result struct built so far, new insertvalue instructions
6387// build on that.
6388static Value *BuildSubAggregate(Value *From, Value *To, Type *IndexedType,
6390 unsigned IdxSkip,
6391 BasicBlock::iterator InsertBefore) {
6392 StructType *STy = dyn_cast<StructType>(IndexedType);
6393 if (STy) {
6394 // Save the original To argument so we can modify it
6395 Value *OrigTo = To;
6396 // General case, the type indexed by Idxs is a struct
6397 for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6398 // Process each struct element recursively
6399 Idxs.push_back(i);
6400 Value *PrevTo = To;
6401 To = BuildSubAggregate(From, To, STy->getElementType(i), Idxs, IdxSkip,
6402 InsertBefore);
6403 Idxs.pop_back();
6404 if (!To) {
6405 // Couldn't find any inserted value for this index? Cleanup
6406 while (PrevTo != OrigTo) {
6408 PrevTo = Del->getAggregateOperand();
6409 Del->eraseFromParent();
6410 }
6411 // Stop processing elements
6412 break;
6413 }
6414 }
6415 // If we successfully found a value for each of our subaggregates
6416 if (To)
6417 return To;
6418 }
6419 // Base case, the type indexed by SourceIdxs is not a struct, or not all of
6420 // the struct's elements had a value that was inserted directly. In the latter
6421 // case, perhaps we can't determine each of the subelements individually, but
6422 // we might be able to find the complete struct somewhere.
6423
6424 // Find the value that is at that particular spot
6425 Value *V = FindInsertedValue(From, Idxs);
6426
6427 if (!V)
6428 return nullptr;
6429
6430 // Insert the value in the new (sub) aggregate
6431 return InsertValueInst::Create(To, V, ArrayRef(Idxs).slice(IdxSkip), "tmp",
6432 InsertBefore);
6433}
6434
6435// This helper takes a nested struct and extracts a part of it (which is again a
6436// struct) into a new value. For example, given the struct:
6437// { a, { b, { c, d }, e } }
6438// and the indices "1, 1" this returns
6439// { c, d }.
6440//
6441// It does this by inserting an insertvalue for each element in the resulting
6442// struct, as opposed to just inserting a single struct. This will only work if
6443// each of the elements of the substruct are known (ie, inserted into From by an
6444// insertvalue instruction somewhere).
6445//
6446// All inserted insertvalue instructions are inserted before InsertBefore
6448 BasicBlock::iterator InsertBefore) {
6449 Type *IndexedType = ExtractValueInst::getIndexedType(From->getType(),
6450 idx_range);
6451 Value *To = PoisonValue::get(IndexedType);
6452 SmallVector<unsigned, 10> Idxs(idx_range);
6453 unsigned IdxSkip = Idxs.size();
6454
6455 return BuildSubAggregate(From, To, IndexedType, Idxs, IdxSkip, InsertBefore);
6456}
6457
6458/// Given an aggregate and a sequence of indices, see if the scalar value
6459/// indexed is already around as a register, for example if it was inserted
6460/// directly into the aggregate.
6461///
6462/// If InsertBefore is not null, this function will duplicate (modified)
6463/// insertvalues when a part of a nested struct is extracted.
6464Value *
6466 std::optional<BasicBlock::iterator> InsertBefore) {
6467 // Nothing to index? Just return V then (this is useful at the end of our
6468 // recursion).
6469 if (idx_range.empty())
6470 return V;
6471 // We have indices, so V should have an indexable type.
6472 assert((V->getType()->isStructTy() || V->getType()->isArrayTy()) &&
6473 "Not looking at a struct or array?");
6474 assert(ExtractValueInst::getIndexedType(V->getType(), idx_range) &&
6475 "Invalid indices for type?");
6476
6477 if (Constant *C = dyn_cast<Constant>(V)) {
6478 C = C->getAggregateElement(idx_range[0]);
6479 if (!C) return nullptr;
6480 return FindInsertedValue(C, idx_range.slice(1), InsertBefore);
6481 }
6482
6484 // Loop the indices for the insertvalue instruction in parallel with the
6485 // requested indices
6486 const unsigned *req_idx = idx_range.begin();
6487 for (const unsigned *i = I->idx_begin(), *e = I->idx_end();
6488 i != e; ++i, ++req_idx) {
6489 if (req_idx == idx_range.end()) {
6490 // We can't handle this without inserting insertvalues
6491 if (!InsertBefore)
6492 return nullptr;
6493
6494 // The requested index identifies a part of a nested aggregate. Handle
6495 // this specially. For example,
6496 // %A = insertvalue { i32, {i32, i32 } } undef, i32 10, 1, 0
6497 // %B = insertvalue { i32, {i32, i32 } } %A, i32 11, 1, 1
6498 // %C = extractvalue {i32, { i32, i32 } } %B, 1
6499 // This can be changed into
6500 // %A = insertvalue {i32, i32 } undef, i32 10, 0
6501 // %C = insertvalue {i32, i32 } %A, i32 11, 1
6502 // which allows the unused 0,0 element from the nested struct to be
6503 // removed.
6504 return BuildSubAggregate(V, ArrayRef(idx_range.begin(), req_idx),
6505 *InsertBefore);
6506 }
6507
6508 // This insert value inserts something else than what we are looking for.
6509 // See if the (aggregate) value inserted into has the value we are
6510 // looking for, then.
6511 if (*req_idx != *i)
6512 return FindInsertedValue(I->getAggregateOperand(), idx_range,
6513 InsertBefore);
6514 }
6515 // If we end up here, the indices of the insertvalue match with those
6516 // requested (though possibly only partially). Now we recursively look at
6517 // the inserted value, passing any remaining indices.
6518 return FindInsertedValue(I->getInsertedValueOperand(),
6519 ArrayRef(req_idx, idx_range.end()), InsertBefore);
6520 }
6521
6523 // If we're extracting a value from an aggregate that was extracted from
6524 // something else, we can extract from that something else directly instead.
6525 // However, we will need to chain I's indices with the requested indices.
6526
6527 // Calculate the number of indices required
6528 unsigned size = I->getNumIndices() + idx_range.size();
6529 // Allocate some space to put the new indices in
6531 Idxs.reserve(size);
6532 // Add indices from the extract value instruction
6533 Idxs.append(I->idx_begin(), I->idx_end());
6534
6535 // Add requested indices
6536 Idxs.append(idx_range.begin(), idx_range.end());
6537
6538 assert(Idxs.size() == size
6539 && "Number of indices added not correct?");
6540
6541 return FindInsertedValue(I->getAggregateOperand(), Idxs, InsertBefore);
6542 }
6543 // Otherwise, we don't know (such as, extracting from a function return value
6544 // or load instruction)
6545 return nullptr;
6546}
6547
6548// If V refers to an initialized global constant, set Slice either to
6549// its initializer if the size of its elements equals ElementSize, or,
6550// for ElementSize == 8, to its representation as an array of unsiged
6551// char. Return true on success.
6552// Offset is in the unit "nr of ElementSize sized elements".
6555 unsigned ElementSize, uint64_t Offset) {
6556 assert(V && "V should not be null.");
6557 assert((ElementSize % 8) == 0 &&
6558 "ElementSize expected to be a multiple of the size of a byte.");
6559 unsigned ElementSizeInBytes = ElementSize / 8;
6560
6561 // Drill down into the pointer expression V, ignoring any intervening
6562 // casts, and determine the identity of the object it references along
6563 // with the cumulative byte offset into it.
6564 const GlobalVariable *GV =
6566 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
6567 // Fail if V is not based on constant global object.
6568 return false;
6569
6570 const DataLayout &DL = GV->getDataLayout();
6571 APInt Off(DL.getIndexTypeSizeInBits(V->getType()), 0);
6572
6573 if (GV != V->stripAndAccumulateConstantOffsets(DL, Off,
6574 /*AllowNonInbounds*/ true))
6575 // Fail if a constant offset could not be determined.
6576 return false;
6577
6578 uint64_t StartIdx = Off.getLimitedValue();
6579 if (StartIdx == UINT64_MAX)
6580 // Fail if the constant offset is excessive.
6581 return false;
6582
6583 // Off/StartIdx is in the unit of bytes. So we need to convert to number of
6584 // elements. Simply bail out if that isn't possible.
6585 if ((StartIdx % ElementSizeInBytes) != 0)
6586 return false;
6587
6588 Offset += StartIdx / ElementSizeInBytes;
6589 ConstantDataArray *Array = nullptr;
6590 ArrayType *ArrayTy = nullptr;
6591
6592 if (GV->getInitializer()->isNullValue()) {
6593 Type *GVTy = GV->getValueType();
6594 uint64_t SizeInBytes = DL.getTypeStoreSize(GVTy).getFixedValue();
6595 uint64_t Length = SizeInBytes / ElementSizeInBytes;
6596
6597 Slice.Array = nullptr;
6598 Slice.Offset = 0;
6599 // Return an empty Slice for undersized constants to let callers
6600 // transform even undefined library calls into simpler, well-defined
6601 // expressions. This is preferable to making the calls although it
6602 // prevents sanitizers from detecting such calls.
6603 Slice.Length = Length < Offset ? 0 : Length - Offset;
6604 return true;
6605 }
6606
6607 auto *Init = const_cast<Constant *>(GV->getInitializer());
6608 if (auto *ArrayInit = dyn_cast<ConstantDataArray>(Init)) {
6609 Type *InitElTy = ArrayInit->getElementType();
6610 if (InitElTy->isIntegerTy(ElementSize)) {
6611 // If Init is an initializer for an array of the expected type
6612 // and size, use it as is.
6613 Array = ArrayInit;
6614 ArrayTy = ArrayInit->getType();
6615 }
6616 }
6617
6618 if (!Array) {
6619 if (ElementSize != 8)
6620 // TODO: Handle conversions to larger integral types.
6621 return false;
6622
6623 // Otherwise extract the portion of the initializer starting
6624 // at Offset as an array of bytes, and reset Offset.
6626 if (!Init)
6627 return false;
6628
6629 Offset = 0;
6631 ArrayTy = dyn_cast<ArrayType>(Init->getType());
6632 }
6633
6634 uint64_t NumElts = ArrayTy->getArrayNumElements();
6635 if (Offset > NumElts)
6636 return false;
6637
6638 Slice.Array = Array;
6639 Slice.Offset = Offset;
6640 Slice.Length = NumElts - Offset;
6641 return true;
6642}
6643
6644/// Extract bytes from the initializer of the constant array V, which need
6645/// not be a nul-terminated string. On success, store the bytes in Str and
6646/// return true. When TrimAtNul is set, Str will contain only the bytes up
6647/// to but not including the first nul. Return false on failure.
6649 bool TrimAtNul) {
6651 if (!getConstantDataArrayInfo(V, Slice, 8))
6652 return false;
6653
6654 if (Slice.Array == nullptr) {
6655 if (TrimAtNul) {
6656 // Return a nul-terminated string even for an empty Slice. This is
6657 // safe because all existing SimplifyLibcalls callers require string
6658 // arguments and the behavior of the functions they fold is undefined
6659 // otherwise. Folding the calls this way is preferable to making
6660 // the undefined library calls, even though it prevents sanitizers
6661 // from reporting such calls.
6662 Str = StringRef();
6663 return true;
6664 }
6665 if (Slice.Length == 1) {
6666 Str = StringRef("", 1);
6667 return true;
6668 }
6669 // We cannot instantiate a StringRef as we do not have an appropriate string
6670 // of 0s at hand.
6671 return false;
6672 }
6673
6674 // Start out with the entire array in the StringRef.
6675 Str = Slice.Array->getAsString();
6676 // Skip over 'offset' bytes.
6677 Str = Str.substr(Slice.Offset);
6678
6679 if (TrimAtNul) {
6680 // Trim off the \0 and anything after it. If the array is not nul
6681 // terminated, we just return the whole end of string. The client may know
6682 // some other way that the string is length-bound.
6683 Str = Str.substr(0, Str.find('\0'));
6684 }
6685 return true;
6686}
6687
6688// These next two are very similar to the above, but also look through PHI
6689// nodes.
6690// TODO: See if we can integrate these two together.
6691
6692/// If we can compute the length of the string pointed to by
6693/// the specified pointer, return 'len+1'. If we can't, return 0.
6696 unsigned CharSize) {
6697 // Look through noop bitcast instructions.
6698 V = V->stripPointerCasts();
6699
6700 // If this is a PHI node, there are two cases: either we have already seen it
6701 // or we haven't.
6702 if (const PHINode *PN = dyn_cast<PHINode>(V)) {
6703 if (!PHIs.insert(PN).second)
6704 return ~0ULL; // already in the set.
6705
6706 // If it was new, see if all the input strings are the same length.
6707 uint64_t LenSoFar = ~0ULL;
6708 for (Value *IncValue : PN->incoming_values()) {
6709 uint64_t Len = GetStringLengthH(IncValue, PHIs, CharSize);
6710 if (Len == 0) return 0; // Unknown length -> unknown.
6711
6712 if (Len == ~0ULL) continue;
6713
6714 if (Len != LenSoFar && LenSoFar != ~0ULL)
6715 return 0; // Disagree -> unknown.
6716 LenSoFar = Len;
6717 }
6718
6719 // Success, all agree.
6720 return LenSoFar;
6721 }
6722
6723 // strlen(select(c,x,y)) -> strlen(x) ^ strlen(y)
6724 if (const SelectInst *SI = dyn_cast<SelectInst>(V)) {
6725 uint64_t Len1 = GetStringLengthH(SI->getTrueValue(), PHIs, CharSize);
6726 if (Len1 == 0) return 0;
6727 uint64_t Len2 = GetStringLengthH(SI->getFalseValue(), PHIs, CharSize);
6728 if (Len2 == 0) return 0;
6729 if (Len1 == ~0ULL) return Len2;
6730 if (Len2 == ~0ULL) return Len1;
6731 if (Len1 != Len2) return 0;
6732 return Len1;
6733 }
6734
6735 // Otherwise, see if we can read the string.
6737 if (!getConstantDataArrayInfo(V, Slice, CharSize))
6738 return 0;
6739
6740 if (Slice.Array == nullptr)
6741 // Zeroinitializer (including an empty one).
6742 return 1;
6743
6744 // Search for the first nul character. Return a conservative result even
6745 // when there is no nul. This is safe since otherwise the string function
6746 // being folded such as strlen is undefined, and can be preferable to
6747 // making the undefined library call.
6748 unsigned NullIndex = 0;
6749 for (unsigned E = Slice.Length; NullIndex < E; ++NullIndex) {
6750 if (Slice.Array->getElementAsInteger(Slice.Offset + NullIndex) == 0)
6751 break;
6752 }
6753
6754 return NullIndex + 1;
6755}
6756
6757/// If we can compute the length of the string pointed to by
6758/// the specified pointer, return 'len+1'. If we can't, return 0.
6759uint64_t llvm::GetStringLength(const Value *V, unsigned CharSize) {
6760 if (!V->getType()->isPointerTy())
6761 return 0;
6762
6764 uint64_t Len = GetStringLengthH(V, PHIs, CharSize);
6765 // If Len is ~0ULL, we had an infinite phi cycle: this is dead code, so return
6766 // an empty string as a length.
6767 return Len == ~0ULL ? 1 : Len;
6768}
6769
6770const Value *
6772 bool MustPreserveNullness) {
6773 assert(Call &&
6774 "getArgumentAliasingToReturnedPointer only works on nonnull calls");
6775 if (const Value *RV = Call->getReturnedArgOperand())
6776 return RV;
6777 // This can be used only as a aliasing property.
6779 Call, MustPreserveNullness))
6780 return Call->getArgOperand(0);
6781 return nullptr;
6782}
6783
6785 const CallBase *Call, bool MustPreserveNullness) {
6786 switch (Call->getIntrinsicID()) {
6787 case Intrinsic::launder_invariant_group:
6788 case Intrinsic::strip_invariant_group:
6789 case Intrinsic::aarch64_irg:
6790 case Intrinsic::aarch64_tagp:
6791 // The amdgcn_make_buffer_rsrc function does not alter the address of the
6792 // input pointer (and thus preserve null-ness for the purposes of escape
6793 // analysis, which is where the MustPreserveNullness flag comes in to play).
6794 // However, it will not necessarily map ptr addrspace(N) null to ptr
6795 // addrspace(8) null, aka the "null descriptor", which has "all loads return
6796 // 0, all stores are dropped" semantics. Given the context of this intrinsic
6797 // list, no one should be relying on such a strict interpretation of
6798 // MustPreserveNullness (and, at time of writing, they are not), but we
6799 // document this fact out of an abundance of caution.
6800 case Intrinsic::amdgcn_make_buffer_rsrc:
6801 return true;
6802 case Intrinsic::ptrmask:
6803 return !MustPreserveNullness;
6804 case Intrinsic::threadlocal_address:
6805 // The underlying variable changes with thread ID. The Thread ID may change
6806 // at coroutine suspend points.
6807 return !Call->getParent()->getParent()->isPresplitCoroutine();
6808 default:
6809 return false;
6810 }
6811}
6812
6813/// \p PN defines a loop-variant pointer to an object. Check if the
6814/// previous iteration of the loop was referring to the same object as \p PN.
6816 const LoopInfo *LI) {
6817 // Find the loop-defined value.
6818 Loop *L = LI->getLoopFor(PN->getParent());
6819 if (PN->getNumIncomingValues() != 2)
6820 return true;
6821
6822 // Find the value from previous iteration.
6823 auto *PrevValue = dyn_cast<Instruction>(PN->getIncomingValue(0));
6824 if (!PrevValue || LI->getLoopFor(PrevValue->getParent()) != L)
6825 PrevValue = dyn_cast<Instruction>(PN->getIncomingValue(1));
6826 if (!PrevValue || LI->getLoopFor(PrevValue->getParent()) != L)
6827 return true;
6828
6829 // If a new pointer is loaded in the loop, the pointer references a different
6830 // object in every iteration. E.g.:
6831 // for (i)
6832 // int *p = a[i];
6833 // ...
6834 if (auto *Load = dyn_cast<LoadInst>(PrevValue))
6835 if (!L->isLoopInvariant(Load->getPointerOperand()))
6836 return false;
6837 return true;
6838}
6839
6840const Value *llvm::getUnderlyingObject(const Value *V, unsigned MaxLookup) {
6841 for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) {
6842 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
6843 const Value *PtrOp = GEP->getPointerOperand();
6844 if (!PtrOp->getType()->isPointerTy()) // Only handle scalar pointer base.
6845 return V;
6846 V = PtrOp;
6847 } else if (Operator::getOpcode(V) == Instruction::BitCast ||
6848 Operator::getOpcode(V) == Instruction::AddrSpaceCast) {
6849 Value *NewV = cast<Operator>(V)->getOperand(0);
6850 if (!NewV->getType()->isPointerTy())
6851 return V;
6852 V = NewV;
6853 } else if (auto *GA = dyn_cast<GlobalAlias>(V)) {
6854 if (GA->isInterposable())
6855 return V;
6856 V = GA->getAliasee();
6857 } else {
6858 if (auto *PHI = dyn_cast<PHINode>(V)) {
6859 // Look through single-arg phi nodes created by LCSSA.
6860 if (PHI->getNumIncomingValues() == 1) {
6861 V = PHI->getIncomingValue(0);
6862 continue;
6863 }
6864 } else if (auto *Call = dyn_cast<CallBase>(V)) {
6865 // CaptureTracking can know about special capturing properties of some
6866 // intrinsics like launder.invariant.group, that can't be expressed with
6867 // the attributes, but have properties like returning aliasing pointer.
6868 // Because some analysis may assume that nocaptured pointer is not
6869 // returned from some special intrinsic (because function would have to
6870 // be marked with returns attribute), it is crucial to use this function
6871 // because it should be in sync with CaptureTracking. Not using it may
6872 // cause weird miscompilations where 2 aliasing pointers are assumed to
6873 // noalias.
6874 if (auto *RP = getArgumentAliasingToReturnedPointer(Call, false)) {
6875 V = RP;
6876 continue;
6877 }
6878 }
6879
6880 return V;
6881 }
6882 assert(V->getType()->isPointerTy() && "Unexpected operand type!");
6883 }
6884 return V;
6885}
6886
6889 const LoopInfo *LI, unsigned MaxLookup) {
6892 Worklist.push_back(V);
6893 do {
6894 const Value *P = Worklist.pop_back_val();
6895 P = getUnderlyingObject(P, MaxLookup);
6896
6897 if (!Visited.insert(P).second)
6898 continue;
6899
6900 if (auto *SI = dyn_cast<SelectInst>(P)) {
6901 Worklist.push_back(SI->getTrueValue());
6902 Worklist.push_back(SI->getFalseValue());
6903 continue;
6904 }
6905
6906 if (auto *PN = dyn_cast<PHINode>(P)) {
6907 // If this PHI changes the underlying object in every iteration of the
6908 // loop, don't look through it. Consider:
6909 // int **A;
6910 // for (i) {
6911 // Prev = Curr; // Prev = PHI (Prev_0, Curr)
6912 // Curr = A[i];
6913 // *Prev, *Curr;
6914 //
6915 // Prev is tracking Curr one iteration behind so they refer to different
6916 // underlying objects.
6917 if (!LI || !LI->isLoopHeader(PN->getParent()) ||
6919 append_range(Worklist, PN->incoming_values());
6920 else
6921 Objects.push_back(P);
6922 continue;
6923 }
6924
6925 Objects.push_back(P);
6926 } while (!Worklist.empty());
6927}
6928
6930 const unsigned MaxVisited = 8;
6931
6934 Worklist.push_back(V);
6935 const Value *Object = nullptr;
6936 // Used as fallback if we can't find a common underlying object through
6937 // recursion.
6938 bool First = true;
6939 const Value *FirstObject = getUnderlyingObject(V);
6940 do {
6941 const Value *P = Worklist.pop_back_val();
6942 P = First ? FirstObject : getUnderlyingObject(P);
6943 First = false;
6944
6945 if (!Visited.insert(P).second)
6946 continue;
6947
6948 if (Visited.size() == MaxVisited)
6949 return FirstObject;
6950
6951 if (auto *SI = dyn_cast<SelectInst>(P)) {
6952 Worklist.push_back(SI->getTrueValue());
6953 Worklist.push_back(SI->getFalseValue());
6954 continue;
6955 }
6956
6957 if (auto *PN = dyn_cast<PHINode>(P)) {
6958 append_range(Worklist, PN->incoming_values());
6959 continue;
6960 }
6961
6962 if (!Object)
6963 Object = P;
6964 else if (Object != P)
6965 return FirstObject;
6966 } while (!Worklist.empty());
6967
6968 return Object ? Object : FirstObject;
6969}
6970
6971/// This is the function that does the work of looking through basic
6972/// ptrtoint+arithmetic+inttoptr sequences.
6973static const Value *getUnderlyingObjectFromInt(const Value *V) {
6974 do {
6975 if (const Operator *U = dyn_cast<Operator>(V)) {
6976 // If we find a ptrtoint, we can transfer control back to the
6977 // regular getUnderlyingObjectFromInt.
6978 if (U->getOpcode() == Instruction::PtrToInt)
6979 return U->getOperand(0);
6980 // If we find an add of a constant, a multiplied value, or a phi, it's
6981 // likely that the other operand will lead us to the base
6982 // object. We don't have to worry about the case where the
6983 // object address is somehow being computed by the multiply,
6984 // because our callers only care when the result is an
6985 // identifiable object.
6986 if (U->getOpcode() != Instruction::Add ||
6987 (!isa<ConstantInt>(U->getOperand(1)) &&
6988 Operator::getOpcode(U->getOperand(1)) != Instruction::Mul &&
6989 !isa<PHINode>(U->getOperand(1))))
6990 return V;
6991 V = U->getOperand(0);
6992 } else {
6993 return V;
6994 }
6995 assert(V->getType()->isIntegerTy() && "Unexpected operand type!");
6996 } while (true);
6997}
6998
6999/// This is a wrapper around getUnderlyingObjects and adds support for basic
7000/// ptrtoint+arithmetic+inttoptr sequences.
7001/// It returns false if unidentified object is found in getUnderlyingObjects.
7003 SmallVectorImpl<Value *> &Objects) {
7005 SmallVector<const Value *, 4> Working(1, V);
7006 do {
7007 V = Working.pop_back_val();
7008
7010 getUnderlyingObjects(V, Objs);
7011
7012 for (const Value *V : Objs) {
7013 if (!Visited.insert(V).second)
7014 continue;
7015 if (Operator::getOpcode(V) == Instruction::IntToPtr) {
7016 const Value *O =
7017 getUnderlyingObjectFromInt(cast<User>(V)->getOperand(0));
7018 if (O->getType()->isPointerTy()) {
7019 Working.push_back(O);
7020 continue;
7021 }
7022 }
7023 // If getUnderlyingObjects fails to find an identifiable object,
7024 // getUnderlyingObjectsForCodeGen also fails for safety.
7025 if (!isIdentifiedObject(V)) {
7026 Objects.clear();
7027 return false;
7028 }
7029 Objects.push_back(const_cast<Value *>(V));
7030 }
7031 } while (!Working.empty());
7032 return true;
7033}
7034
7036 AllocaInst *Result = nullptr;
7038 SmallVector<Value *, 4> Worklist;
7039
7040 auto AddWork = [&](Value *V) {
7041 if (Visited.insert(V).second)
7042 Worklist.push_back(V);
7043 };
7044
7045 AddWork(V);
7046 do {
7047 V = Worklist.pop_back_val();
7048 assert(Visited.count(V));
7049
7050 if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
7051 if (Result && Result != AI)
7052 return nullptr;
7053 Result = AI;
7054 } else if (CastInst *CI = dyn_cast<CastInst>(V)) {
7055 AddWork(CI->getOperand(0));
7056 } else if (PHINode *PN = dyn_cast<PHINode>(V)) {
7057 for (Value *IncValue : PN->incoming_values())
7058 AddWork(IncValue);
7059 } else if (auto *SI = dyn_cast<SelectInst>(V)) {
7060 AddWork(SI->getTrueValue());
7061 AddWork(SI->getFalseValue());
7063 if (OffsetZero && !GEP->hasAllZeroIndices())
7064 return nullptr;
7065 AddWork(GEP->getPointerOperand());
7066 } else if (CallBase *CB = dyn_cast<CallBase>(V)) {
7067 Value *Returned = CB->getReturnedArgOperand();
7068 if (Returned)
7069 AddWork(Returned);
7070 else
7071 return nullptr;
7072 } else {
7073 return nullptr;
7074 }
7075 } while (!Worklist.empty());
7076
7077 return Result;
7078}
7079
7081 const Value *V, bool AllowLifetime, bool AllowDroppable) {
7082 for (const User *U : V->users()) {
7084 if (!II)
7085 return false;
7086
7087 if (AllowLifetime && II->isLifetimeStartOrEnd())
7088 continue;
7089
7090 if (AllowDroppable && II->isDroppable())
7091 continue;
7092
7093 return false;
7094 }
7095 return true;
7096}
7097
7100 V, /* AllowLifetime */ true, /* AllowDroppable */ false);
7101}
7104 V, /* AllowLifetime */ true, /* AllowDroppable */ true);
7105}
7106
7108 if (auto *II = dyn_cast<IntrinsicInst>(I))
7109 return isTriviallyVectorizable(II->getIntrinsicID());
7110 auto *Shuffle = dyn_cast<ShuffleVectorInst>(I);
7111 return (!Shuffle || Shuffle->isSelect()) &&
7113}
7114
7116 const Instruction *Inst, const Instruction *CtxI, AssumptionCache *AC,
7117 const DominatorTree *DT, const TargetLibraryInfo *TLI, bool UseVariableInfo,
7118 bool IgnoreUBImplyingAttrs) {
7119 return isSafeToSpeculativelyExecuteWithOpcode(Inst->getOpcode(), Inst, CtxI,
7120 AC, DT, TLI, UseVariableInfo,
7121 IgnoreUBImplyingAttrs);
7122}
7123
7125 unsigned Opcode, const Instruction *Inst, const Instruction *CtxI,
7126 AssumptionCache *AC, const DominatorTree *DT, const TargetLibraryInfo *TLI,
7127 bool UseVariableInfo, bool IgnoreUBImplyingAttrs) {
7128#ifndef NDEBUG
7129 if (Inst->getOpcode() != Opcode) {
7130 // Check that the operands are actually compatible with the Opcode override.
7131 auto hasEqualReturnAndLeadingOperandTypes =
7132 [](const Instruction *Inst, unsigned NumLeadingOperands) {
7133 if (Inst->getNumOperands() < NumLeadingOperands)
7134 return false;
7135 const Type *ExpectedType = Inst->getType();
7136 for (unsigned ItOp = 0; ItOp < NumLeadingOperands; ++ItOp)
7137 if (Inst->getOperand(ItOp)->getType() != ExpectedType)
7138 return false;
7139 return true;
7140 };
7142 hasEqualReturnAndLeadingOperandTypes(Inst, 2));
7143 assert(!Instruction::isUnaryOp(Opcode) ||
7144 hasEqualReturnAndLeadingOperandTypes(Inst, 1));
7145 }
7146#endif
7147
7148 switch (Opcode) {
7149 default:
7150 return true;
7151 case Instruction::UDiv:
7152 case Instruction::URem: {
7153 // x / y is undefined if y == 0.
7154 const APInt *V;
7155 if (match(Inst->getOperand(1), m_APInt(V)))
7156 return *V != 0;
7157 return false;
7158 }
7159 case Instruction::SDiv:
7160 case Instruction::SRem: {
7161 // x / y is undefined if y == 0 or x == INT_MIN and y == -1
7162 const APInt *Numerator, *Denominator;
7163 if (!match(Inst->getOperand(1), m_APInt(Denominator)))
7164 return false;
7165 // We cannot hoist this division if the denominator is 0.
7166 if (*Denominator == 0)
7167 return false;
7168 // It's safe to hoist if the denominator is not 0 or -1.
7169 if (!Denominator->isAllOnes())
7170 return true;
7171 // At this point we know that the denominator is -1. It is safe to hoist as
7172 // long we know that the numerator is not INT_MIN.
7173 if (match(Inst->getOperand(0), m_APInt(Numerator)))
7174 return !Numerator->isMinSignedValue();
7175 // The numerator *might* be MinSignedValue.
7176 return false;
7177 }
7178 case Instruction::Load: {
7179 if (!UseVariableInfo)
7180 return false;
7181
7182 const LoadInst *LI = dyn_cast<LoadInst>(Inst);
7183 if (!LI)
7184 return false;
7185 if (mustSuppressSpeculation(*LI))
7186 return false;
7187 const DataLayout &DL = LI->getDataLayout();
7189 LI->getType(), LI->getAlign(), DL,
7190 CtxI, AC, DT, TLI);
7191 }
7192 case Instruction::Call: {
7193 auto *CI = dyn_cast<const CallInst>(Inst);
7194 if (!CI)
7195 return false;
7196 const Function *Callee = CI->getCalledFunction();
7197
7198 // The called function could have undefined behavior or side-effects, even
7199 // if marked readnone nounwind.
7200 if (!Callee || !Callee->isSpeculatable())
7201 return false;
7202 // Since the operands may be changed after hoisting, undefined behavior may
7203 // be triggered by some UB-implying attributes.
7204 return IgnoreUBImplyingAttrs || !CI->hasUBImplyingAttrs();
7205 }
7206 case Instruction::VAArg:
7207 case Instruction::Alloca:
7208 case Instruction::Invoke:
7209 case Instruction::CallBr:
7210 case Instruction::PHI:
7211 case Instruction::Store:
7212 case Instruction::Ret:
7213 case Instruction::Br:
7214 case Instruction::IndirectBr:
7215 case Instruction::Switch:
7216 case Instruction::Unreachable:
7217 case Instruction::Fence:
7218 case Instruction::AtomicRMW:
7219 case Instruction::AtomicCmpXchg:
7220 case Instruction::LandingPad:
7221 case Instruction::Resume:
7222 case Instruction::CatchSwitch:
7223 case Instruction::CatchPad:
7224 case Instruction::CatchRet:
7225 case Instruction::CleanupPad:
7226 case Instruction::CleanupRet:
7227 return false; // Misc instructions which have effects
7228 }
7229}
7230
7232 if (I.mayReadOrWriteMemory())
7233 // Memory dependency possible
7234 return true;
7236 // Can't move above a maythrow call or infinite loop. Or if an
7237 // inalloca alloca, above a stacksave call.
7238 return true;
7240 // 1) Can't reorder two inf-loop calls, even if readonly
7241 // 2) Also can't reorder an inf-loop call below a instruction which isn't
7242 // safe to speculative execute. (Inverse of above)
7243 return true;
7244 return false;
7245}
7246
7247/// Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
7261
7262/// Combine constant ranges from computeConstantRange() and computeKnownBits().
7265 bool ForSigned,
7266 const SimplifyQuery &SQ) {
7267 ConstantRange CR1 =
7268 ConstantRange::fromKnownBits(V.getKnownBits(SQ), ForSigned);
7269 ConstantRange CR2 = computeConstantRange(V, ForSigned, SQ.IIQ.UseInstrInfo);
7272 return CR1.intersectWith(CR2, RangeType);
7273}
7274
7276 const Value *RHS,
7277 const SimplifyQuery &SQ,
7278 bool IsNSW) {
7279 ConstantRange LHSRange =
7280 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7281 ConstantRange RHSRange =
7282 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7283
7284 // mul nsw of two non-negative numbers is also nuw.
7285 if (IsNSW && LHSRange.isAllNonNegative() && RHSRange.isAllNonNegative())
7287
7288 return mapOverflowResult(LHSRange.unsignedMulMayOverflow(RHSRange));
7289}
7290
7292 const Value *RHS,
7293 const SimplifyQuery &SQ) {
7294 // Multiplying n * m significant bits yields a result of n + m significant
7295 // bits. If the total number of significant bits does not exceed the
7296 // result bit width (minus 1), there is no overflow.
7297 // This means if we have enough leading sign bits in the operands
7298 // we can guarantee that the result does not overflow.
7299 // Ref: "Hacker's Delight" by Henry Warren
7300 unsigned BitWidth = LHS->getType()->getScalarSizeInBits();
7301
7302 // Note that underestimating the number of sign bits gives a more
7303 // conservative answer.
7304 unsigned SignBits =
7305 ::ComputeNumSignBits(LHS, SQ) + ::ComputeNumSignBits(RHS, SQ);
7306
7307 // First handle the easy case: if we have enough sign bits there's
7308 // definitely no overflow.
7309 if (SignBits > BitWidth + 1)
7311
7312 // There are two ambiguous cases where there can be no overflow:
7313 // SignBits == BitWidth + 1 and
7314 // SignBits == BitWidth
7315 // The second case is difficult to check, therefore we only handle the
7316 // first case.
7317 if (SignBits == BitWidth + 1) {
7318 // It overflows only when both arguments are negative and the true
7319 // product is exactly the minimum negative number.
7320 // E.g. mul i16 with 17 sign bits: 0xff00 * 0xff80 = 0x8000
7321 // For simplicity we just check if at least one side is not negative.
7322 KnownBits LHSKnown = computeKnownBits(LHS, SQ);
7323 KnownBits RHSKnown = computeKnownBits(RHS, SQ);
7324 if (LHSKnown.isNonNegative() || RHSKnown.isNonNegative())
7326 }
7328}
7329
7332 const WithCache<const Value *> &RHS,
7333 const SimplifyQuery &SQ) {
7334 ConstantRange LHSRange =
7335 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7336 ConstantRange RHSRange =
7337 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7338 return mapOverflowResult(LHSRange.unsignedAddMayOverflow(RHSRange));
7339}
7340
7341static OverflowResult
7344 const AddOperator *Add, const SimplifyQuery &SQ) {
7345 if (Add && Add->hasNoSignedWrap()) {
7347 }
7348
7349 // If LHS and RHS each have at least two sign bits, the addition will look
7350 // like
7351 //
7352 // XX..... +
7353 // YY.....
7354 //
7355 // If the carry into the most significant position is 0, X and Y can't both
7356 // be 1 and therefore the carry out of the addition is also 0.
7357 //
7358 // If the carry into the most significant position is 1, X and Y can't both
7359 // be 0 and therefore the carry out of the addition is also 1.
7360 //
7361 // Since the carry into the most significant position is always equal to
7362 // the carry out of the addition, there is no signed overflow.
7363 if (::ComputeNumSignBits(LHS, SQ) > 1 && ::ComputeNumSignBits(RHS, SQ) > 1)
7365
7366 ConstantRange LHSRange =
7367 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/true, SQ);
7368 ConstantRange RHSRange =
7369 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/true, SQ);
7370 OverflowResult OR =
7371 mapOverflowResult(LHSRange.signedAddMayOverflow(RHSRange));
7373 return OR;
7374
7375 // The remaining code needs Add to be available. Early returns if not so.
7376 if (!Add)
7378
7379 // If the sign of Add is the same as at least one of the operands, this add
7380 // CANNOT overflow. If this can be determined from the known bits of the
7381 // operands the above signedAddMayOverflow() check will have already done so.
7382 // The only other way to improve on the known bits is from an assumption, so
7383 // call computeKnownBitsFromContext() directly.
7384 bool LHSOrRHSKnownNonNegative =
7385 (LHSRange.isAllNonNegative() || RHSRange.isAllNonNegative());
7386 bool LHSOrRHSKnownNegative =
7387 (LHSRange.isAllNegative() || RHSRange.isAllNegative());
7388 if (LHSOrRHSKnownNonNegative || LHSOrRHSKnownNegative) {
7389 KnownBits AddKnown(LHSRange.getBitWidth());
7390 computeKnownBitsFromContext(Add, AddKnown, SQ);
7391 if ((AddKnown.isNonNegative() && LHSOrRHSKnownNonNegative) ||
7392 (AddKnown.isNegative() && LHSOrRHSKnownNegative))
7394 }
7395
7397}
7398
7400 const Value *RHS,
7401 const SimplifyQuery &SQ) {
7402 // X - (X % ?)
7403 // The remainder of a value can't have greater magnitude than itself,
7404 // so the subtraction can't overflow.
7405
7406 // X - (X -nuw ?)
7407 // In the minimal case, this would simplify to "?", so there's no subtract
7408 // at all. But if this analysis is used to peek through casts, for example,
7409 // then determining no-overflow may allow other transforms.
7410
7411 // TODO: There are other patterns like this.
7412 // See simplifyICmpWithBinOpOnLHS() for candidates.
7413 if (match(RHS, m_URem(m_Specific(LHS), m_Value())) ||
7414 match(RHS, m_NUWSub(m_Specific(LHS), m_Value())))
7415 if (isGuaranteedNotToBeUndef(LHS, SQ.AC, SQ.CxtI, SQ.DT))
7417
7418 if (auto C = isImpliedByDomCondition(CmpInst::ICMP_UGE, LHS, RHS, SQ.CxtI,
7419 SQ.DL)) {
7420 if (*C)
7423 }
7424
7425 ConstantRange LHSRange =
7426 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7427 ConstantRange RHSRange =
7428 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7429 return mapOverflowResult(LHSRange.unsignedSubMayOverflow(RHSRange));
7430}
7431
7433 const Value *RHS,
7434 const SimplifyQuery &SQ) {
7435 // X - (X % ?)
7436 // The remainder of a value can't have greater magnitude than itself,
7437 // so the subtraction can't overflow.
7438
7439 // X - (X -nsw ?)
7440 // In the minimal case, this would simplify to "?", so there's no subtract
7441 // at all. But if this analysis is used to peek through casts, for example,
7442 // then determining no-overflow may allow other transforms.
7443 if (match(RHS, m_SRem(m_Specific(LHS), m_Value())) ||
7444 match(RHS, m_NSWSub(m_Specific(LHS), m_Value())))
7445 if (isGuaranteedNotToBeUndef(LHS, SQ.AC, SQ.CxtI, SQ.DT))
7447
7448 // If LHS and RHS each have at least two sign bits, the subtraction
7449 // cannot overflow.
7450 if (::ComputeNumSignBits(LHS, SQ) > 1 && ::ComputeNumSignBits(RHS, SQ) > 1)
7452
7453 ConstantRange LHSRange =
7454 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/true, SQ);
7455 ConstantRange RHSRange =
7456 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/true, SQ);
7457 return mapOverflowResult(LHSRange.signedSubMayOverflow(RHSRange));
7458}
7459
7461 const DominatorTree &DT) {
7462 SmallVector<const BranchInst *, 2> GuardingBranches;
7464
7465 for (const User *U : WO->users()) {
7466 if (const auto *EVI = dyn_cast<ExtractValueInst>(U)) {
7467 assert(EVI->getNumIndices() == 1 && "Obvious from CI's type");
7468
7469 if (EVI->getIndices()[0] == 0)
7470 Results.push_back(EVI);
7471 else {
7472 assert(EVI->getIndices()[0] == 1 && "Obvious from CI's type");
7473
7474 for (const auto *U : EVI->users())
7475 if (const auto *B = dyn_cast<BranchInst>(U)) {
7476 assert(B->isConditional() && "How else is it using an i1?");
7477 GuardingBranches.push_back(B);
7478 }
7479 }
7480 } else {
7481 // We are using the aggregate directly in a way we don't want to analyze
7482 // here (storing it to a global, say).
7483 return false;
7484 }
7485 }
7486
7487 auto AllUsesGuardedByBranch = [&](const BranchInst *BI) {
7488 BasicBlockEdge NoWrapEdge(BI->getParent(), BI->getSuccessor(1));
7489 if (!NoWrapEdge.isSingleEdge())
7490 return false;
7491
7492 // Check if all users of the add are provably no-wrap.
7493 for (const auto *Result : Results) {
7494 // If the extractvalue itself is not executed on overflow, the we don't
7495 // need to check each use separately, since domination is transitive.
7496 if (DT.dominates(NoWrapEdge, Result->getParent()))
7497 continue;
7498
7499 for (const auto &RU : Result->uses())
7500 if (!DT.dominates(NoWrapEdge, RU))
7501 return false;
7502 }
7503
7504 return true;
7505 };
7506
7507 return llvm::any_of(GuardingBranches, AllUsesGuardedByBranch);
7508}
7509
7510/// Shifts return poison if shiftwidth is larger than the bitwidth.
7511static bool shiftAmountKnownInRange(const Value *ShiftAmount) {
7512 auto *C = dyn_cast<Constant>(ShiftAmount);
7513 if (!C)
7514 return false;
7515
7516 // Shifts return poison if shiftwidth is larger than the bitwidth.
7518 if (auto *FVTy = dyn_cast<FixedVectorType>(C->getType())) {
7519 unsigned NumElts = FVTy->getNumElements();
7520 for (unsigned i = 0; i < NumElts; ++i)
7521 ShiftAmounts.push_back(C->getAggregateElement(i));
7522 } else if (isa<ScalableVectorType>(C->getType()))
7523 return false; // Can't tell, just return false to be safe
7524 else
7525 ShiftAmounts.push_back(C);
7526
7527 bool Safe = llvm::all_of(ShiftAmounts, [](const Constant *C) {
7528 auto *CI = dyn_cast_or_null<ConstantInt>(C);
7529 return CI && CI->getValue().ult(C->getType()->getIntegerBitWidth());
7530 });
7531
7532 return Safe;
7533}
7534
7540
7542 return (unsigned(Kind) & unsigned(UndefPoisonKind::PoisonOnly)) != 0;
7543}
7544
7546 return (unsigned(Kind) & unsigned(UndefPoisonKind::UndefOnly)) != 0;
7547}
7548
7550 bool ConsiderFlagsAndMetadata) {
7551
7552 if (ConsiderFlagsAndMetadata && includesPoison(Kind) &&
7553 Op->hasPoisonGeneratingAnnotations())
7554 return true;
7555
7556 unsigned Opcode = Op->getOpcode();
7557
7558 // Check whether opcode is a poison/undef-generating operation
7559 switch (Opcode) {
7560 case Instruction::Shl:
7561 case Instruction::AShr:
7562 case Instruction::LShr:
7563 return includesPoison(Kind) && !shiftAmountKnownInRange(Op->getOperand(1));
7564 case Instruction::FPToSI:
7565 case Instruction::FPToUI:
7566 // fptosi/ui yields poison if the resulting value does not fit in the
7567 // destination type.
7568 return true;
7569 case Instruction::Call:
7570 if (auto *II = dyn_cast<IntrinsicInst>(Op)) {
7571 switch (II->getIntrinsicID()) {
7572 // TODO: Add more intrinsics.
7573 case Intrinsic::ctlz:
7574 case Intrinsic::cttz:
7575 case Intrinsic::abs:
7576 // We're not considering flags so it is safe to just return false.
7577 return false;
7578 case Intrinsic::sshl_sat:
7579 case Intrinsic::ushl_sat:
7580 if (!includesPoison(Kind) ||
7581 shiftAmountKnownInRange(II->getArgOperand(1)))
7582 return false;
7583 break;
7584 }
7585 }
7586 [[fallthrough]];
7587 case Instruction::CallBr:
7588 case Instruction::Invoke: {
7589 const auto *CB = cast<CallBase>(Op);
7590 return !CB->hasRetAttr(Attribute::NoUndef) &&
7591 !CB->hasFnAttr(Attribute::NoCreateUndefOrPoison);
7592 }
7593 case Instruction::InsertElement:
7594 case Instruction::ExtractElement: {
7595 // If index exceeds the length of the vector, it returns poison
7596 auto *VTy = cast<VectorType>(Op->getOperand(0)->getType());
7597 unsigned IdxOp = Op->getOpcode() == Instruction::InsertElement ? 2 : 1;
7598 auto *Idx = dyn_cast<ConstantInt>(Op->getOperand(IdxOp));
7599 if (includesPoison(Kind))
7600 return !Idx ||
7601 Idx->getValue().uge(VTy->getElementCount().getKnownMinValue());
7602 return false;
7603 }
7604 case Instruction::ShuffleVector: {
7606 ? cast<ConstantExpr>(Op)->getShuffleMask()
7607 : cast<ShuffleVectorInst>(Op)->getShuffleMask();
7608 return includesPoison(Kind) && is_contained(Mask, PoisonMaskElem);
7609 }
7610 case Instruction::FNeg:
7611 case Instruction::PHI:
7612 case Instruction::Select:
7613 case Instruction::ExtractValue:
7614 case Instruction::InsertValue:
7615 case Instruction::Freeze:
7616 case Instruction::ICmp:
7617 case Instruction::FCmp:
7618 case Instruction::GetElementPtr:
7619 return false;
7620 case Instruction::AddrSpaceCast:
7621 return true;
7622 default: {
7623 const auto *CE = dyn_cast<ConstantExpr>(Op);
7624 if (isa<CastInst>(Op) || (CE && CE->isCast()))
7625 return false;
7626 else if (Instruction::isBinaryOp(Opcode))
7627 return false;
7628 // Be conservative and return true.
7629 return true;
7630 }
7631 }
7632}
7633
7635 bool ConsiderFlagsAndMetadata) {
7636 return ::canCreateUndefOrPoison(Op, UndefPoisonKind::UndefOrPoison,
7637 ConsiderFlagsAndMetadata);
7638}
7639
7640bool llvm::canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata) {
7641 return ::canCreateUndefOrPoison(Op, UndefPoisonKind::PoisonOnly,
7642 ConsiderFlagsAndMetadata);
7643}
7644
7645static bool directlyImpliesPoison(const Value *ValAssumedPoison, const Value *V,
7646 unsigned Depth) {
7647 if (ValAssumedPoison == V)
7648 return true;
7649
7650 const unsigned MaxDepth = 2;
7651 if (Depth >= MaxDepth)
7652 return false;
7653
7654 if (const auto *I = dyn_cast<Instruction>(V)) {
7655 if (any_of(I->operands(), [=](const Use &Op) {
7656 return propagatesPoison(Op) &&
7657 directlyImpliesPoison(ValAssumedPoison, Op, Depth + 1);
7658 }))
7659 return true;
7660
7661 // V = extractvalue V0, idx
7662 // V2 = extractvalue V0, idx2
7663 // V0's elements are all poison or not. (e.g., add_with_overflow)
7664 const WithOverflowInst *II;
7666 (match(ValAssumedPoison, m_ExtractValue(m_Specific(II))) ||
7667 llvm::is_contained(II->args(), ValAssumedPoison)))
7668 return true;
7669 }
7670 return false;
7671}
7672
7673static bool impliesPoison(const Value *ValAssumedPoison, const Value *V,
7674 unsigned Depth) {
7675 if (isGuaranteedNotToBePoison(ValAssumedPoison))
7676 return true;
7677
7678 if (directlyImpliesPoison(ValAssumedPoison, V, /* Depth */ 0))
7679 return true;
7680
7681 const unsigned MaxDepth = 2;
7682 if (Depth >= MaxDepth)
7683 return false;
7684
7685 const auto *I = dyn_cast<Instruction>(ValAssumedPoison);
7686 if (I && !canCreatePoison(cast<Operator>(I))) {
7687 return all_of(I->operands(), [=](const Value *Op) {
7688 return impliesPoison(Op, V, Depth + 1);
7689 });
7690 }
7691 return false;
7692}
7693
7694bool llvm::impliesPoison(const Value *ValAssumedPoison, const Value *V) {
7695 return ::impliesPoison(ValAssumedPoison, V, /* Depth */ 0);
7696}
7697
7698static bool programUndefinedIfUndefOrPoison(const Value *V, bool PoisonOnly);
7699
7701 const Value *V, AssumptionCache *AC, const Instruction *CtxI,
7702 const DominatorTree *DT, unsigned Depth, UndefPoisonKind Kind) {
7704 return false;
7705
7706 if (isa<MetadataAsValue>(V))
7707 return false;
7708
7709 if (const auto *A = dyn_cast<Argument>(V)) {
7710 if (A->hasAttribute(Attribute::NoUndef) ||
7711 A->hasAttribute(Attribute::Dereferenceable) ||
7712 A->hasAttribute(Attribute::DereferenceableOrNull))
7713 return true;
7714 }
7715
7716 if (auto *C = dyn_cast<Constant>(V)) {
7717 if (isa<PoisonValue>(C))
7718 return !includesPoison(Kind);
7719
7720 if (isa<UndefValue>(C))
7721 return !includesUndef(Kind);
7722
7725 return true;
7726
7727 if (C->getType()->isVectorTy()) {
7728 if (isa<ConstantExpr>(C)) {
7729 // Scalable vectors can use a ConstantExpr to build a splat.
7730 if (Constant *SplatC = C->getSplatValue())
7731 if (isa<ConstantInt>(SplatC) || isa<ConstantFP>(SplatC))
7732 return true;
7733 } else {
7734 if (includesUndef(Kind) && C->containsUndefElement())
7735 return false;
7736 if (includesPoison(Kind) && C->containsPoisonElement())
7737 return false;
7738 return !C->containsConstantExpression();
7739 }
7740 }
7741 }
7742
7743 // Strip cast operations from a pointer value.
7744 // Note that stripPointerCastsSameRepresentation can strip off getelementptr
7745 // inbounds with zero offset. To guarantee that the result isn't poison, the
7746 // stripped pointer is checked as it has to be pointing into an allocated
7747 // object or be null `null` to ensure `inbounds` getelement pointers with a
7748 // zero offset could not produce poison.
7749 // It can strip off addrspacecast that do not change bit representation as
7750 // well. We believe that such addrspacecast is equivalent to no-op.
7751 auto *StrippedV = V->stripPointerCastsSameRepresentation();
7752 if (isa<AllocaInst>(StrippedV) || isa<GlobalVariable>(StrippedV) ||
7753 isa<Function>(StrippedV) || isa<ConstantPointerNull>(StrippedV))
7754 return true;
7755
7756 auto OpCheck = [&](const Value *V) {
7757 return isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth + 1, Kind);
7758 };
7759
7760 if (auto *Opr = dyn_cast<Operator>(V)) {
7761 // If the value is a freeze instruction, then it can never
7762 // be undef or poison.
7763 if (isa<FreezeInst>(V))
7764 return true;
7765
7766 if (const auto *CB = dyn_cast<CallBase>(V)) {
7767 if (CB->hasRetAttr(Attribute::NoUndef) ||
7768 CB->hasRetAttr(Attribute::Dereferenceable) ||
7769 CB->hasRetAttr(Attribute::DereferenceableOrNull))
7770 return true;
7771 }
7772
7773 if (!::canCreateUndefOrPoison(Opr, Kind,
7774 /*ConsiderFlagsAndMetadata=*/true)) {
7775 if (const auto *PN = dyn_cast<PHINode>(V)) {
7776 unsigned Num = PN->getNumIncomingValues();
7777 bool IsWellDefined = true;
7778 for (unsigned i = 0; i < Num; ++i) {
7779 if (PN == PN->getIncomingValue(i))
7780 continue;
7781 auto *TI = PN->getIncomingBlock(i)->getTerminator();
7782 if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI,
7783 DT, Depth + 1, Kind)) {
7784 IsWellDefined = false;
7785 break;
7786 }
7787 }
7788 if (IsWellDefined)
7789 return true;
7790 } else if (auto *Splat = isa<ShuffleVectorInst>(Opr) ? getSplatValue(Opr)
7791 : nullptr) {
7792 // For splats we only need to check the value being splatted.
7793 if (OpCheck(Splat))
7794 return true;
7795 } else if (all_of(Opr->operands(), OpCheck))
7796 return true;
7797 }
7798 }
7799
7800 if (auto *I = dyn_cast<LoadInst>(V))
7801 if (I->hasMetadata(LLVMContext::MD_noundef) ||
7802 I->hasMetadata(LLVMContext::MD_dereferenceable) ||
7803 I->hasMetadata(LLVMContext::MD_dereferenceable_or_null))
7804 return true;
7805
7807 return true;
7808
7809 // CxtI may be null or a cloned instruction.
7810 if (!CtxI || !CtxI->getParent() || !DT)
7811 return false;
7812
7813 auto *DNode = DT->getNode(CtxI->getParent());
7814 if (!DNode)
7815 // Unreachable block
7816 return false;
7817
7818 // If V is used as a branch condition before reaching CtxI, V cannot be
7819 // undef or poison.
7820 // br V, BB1, BB2
7821 // BB1:
7822 // CtxI ; V cannot be undef or poison here
7823 auto *Dominator = DNode->getIDom();
7824 // This check is purely for compile time reasons: we can skip the IDom walk
7825 // if what we are checking for includes undef and the value is not an integer.
7826 if (!includesUndef(Kind) || V->getType()->isIntegerTy())
7827 while (Dominator) {
7828 auto *TI = Dominator->getBlock()->getTerminator();
7829
7830 Value *Cond = nullptr;
7831 if (auto BI = dyn_cast_or_null<BranchInst>(TI)) {
7832 if (BI->isConditional())
7833 Cond = BI->getCondition();
7834 } else if (auto SI = dyn_cast_or_null<SwitchInst>(TI)) {
7835 Cond = SI->getCondition();
7836 }
7837
7838 if (Cond) {
7839 if (Cond == V)
7840 return true;
7841 else if (!includesUndef(Kind) && isa<Operator>(Cond)) {
7842 // For poison, we can analyze further
7843 auto *Opr = cast<Operator>(Cond);
7844 if (any_of(Opr->operands(), [V](const Use &U) {
7845 return V == U && propagatesPoison(U);
7846 }))
7847 return true;
7848 }
7849 }
7850
7851 Dominator = Dominator->getIDom();
7852 }
7853
7854 if (AC && getKnowledgeValidInContext(V, {Attribute::NoUndef}, *AC, CtxI, DT))
7855 return true;
7856
7857 return false;
7858}
7859
7861 const Instruction *CtxI,
7862 const DominatorTree *DT,
7863 unsigned Depth) {
7864 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7866}
7867
7869 const Instruction *CtxI,
7870 const DominatorTree *DT, unsigned Depth) {
7871 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7873}
7874
7876 const Instruction *CtxI,
7877 const DominatorTree *DT, unsigned Depth) {
7878 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7880}
7881
7882/// Return true if undefined behavior would provably be executed on the path to
7883/// OnPathTo if Root produced a posion result. Note that this doesn't say
7884/// anything about whether OnPathTo is actually executed or whether Root is
7885/// actually poison. This can be used to assess whether a new use of Root can
7886/// be added at a location which is control equivalent with OnPathTo (such as
7887/// immediately before it) without introducing UB which didn't previously
7888/// exist. Note that a false result conveys no information.
7890 Instruction *OnPathTo,
7891 DominatorTree *DT) {
7892 // Basic approach is to assume Root is poison, propagate poison forward
7893 // through all users we can easily track, and then check whether any of those
7894 // users are provable UB and must execute before out exiting block might
7895 // exit.
7896
7897 // The set of all recursive users we've visited (which are assumed to all be
7898 // poison because of said visit)
7901 Worklist.push_back(Root);
7902 while (!Worklist.empty()) {
7903 const Instruction *I = Worklist.pop_back_val();
7904
7905 // If we know this must trigger UB on a path leading our target.
7906 if (mustTriggerUB(I, KnownPoison) && DT->dominates(I, OnPathTo))
7907 return true;
7908
7909 // If we can't analyze propagation through this instruction, just skip it
7910 // and transitive users. Safe as false is a conservative result.
7911 if (I != Root && !any_of(I->operands(), [&KnownPoison](const Use &U) {
7912 return KnownPoison.contains(U) && propagatesPoison(U);
7913 }))
7914 continue;
7915
7916 if (KnownPoison.insert(I).second)
7917 for (const User *User : I->users())
7918 Worklist.push_back(cast<Instruction>(User));
7919 }
7920
7921 // Might be non-UB, or might have a path we couldn't prove must execute on
7922 // way to exiting bb.
7923 return false;
7924}
7925
7927 const SimplifyQuery &SQ) {
7928 return ::computeOverflowForSignedAdd(Add->getOperand(0), Add->getOperand(1),
7929 Add, SQ);
7930}
7931
7934 const WithCache<const Value *> &RHS,
7935 const SimplifyQuery &SQ) {
7936 return ::computeOverflowForSignedAdd(LHS, RHS, nullptr, SQ);
7937}
7938
7940 // Note: An atomic operation isn't guaranteed to return in a reasonable amount
7941 // of time because it's possible for another thread to interfere with it for an
7942 // arbitrary length of time, but programs aren't allowed to rely on that.
7943
7944 // If there is no successor, then execution can't transfer to it.
7945 if (isa<ReturnInst>(I))
7946 return false;
7948 return false;
7949
7950 // Note: Do not add new checks here; instead, change Instruction::mayThrow or
7951 // Instruction::willReturn.
7952 //
7953 // FIXME: Move this check into Instruction::willReturn.
7954 if (isa<CatchPadInst>(I)) {
7955 switch (classifyEHPersonality(I->getFunction()->getPersonalityFn())) {
7956 default:
7957 // A catchpad may invoke exception object constructors and such, which
7958 // in some languages can be arbitrary code, so be conservative by default.
7959 return false;
7961 // For CoreCLR, it just involves a type test.
7962 return true;
7963 }
7964 }
7965
7966 // An instruction that returns without throwing must transfer control flow
7967 // to a successor.
7968 return !I->mayThrow() && I->willReturn();
7969}
7970
7972 // TODO: This is slightly conservative for invoke instruction since exiting
7973 // via an exception *is* normal control for them.
7974 for (const Instruction &I : *BB)
7976 return false;
7977 return true;
7978}
7979
7986
7989 assert(ScanLimit && "scan limit must be non-zero");
7990 for (const Instruction &I : Range) {
7991 if (--ScanLimit == 0)
7992 return false;
7994 return false;
7995 }
7996 return true;
7997}
7998
8000 const Loop *L) {
8001 // The loop header is guaranteed to be executed for every iteration.
8002 //
8003 // FIXME: Relax this constraint to cover all basic blocks that are
8004 // guaranteed to be executed at every iteration.
8005 if (I->getParent() != L->getHeader()) return false;
8006
8007 for (const Instruction &LI : *L->getHeader()) {
8008 if (&LI == I) return true;
8009 if (!isGuaranteedToTransferExecutionToSuccessor(&LI)) return false;
8010 }
8011 llvm_unreachable("Instruction not contained in its own parent basic block.");
8012}
8013
8015 switch (IID) {
8016 // TODO: Add more intrinsics.
8017 case Intrinsic::sadd_with_overflow:
8018 case Intrinsic::ssub_with_overflow:
8019 case Intrinsic::smul_with_overflow:
8020 case Intrinsic::uadd_with_overflow:
8021 case Intrinsic::usub_with_overflow:
8022 case Intrinsic::umul_with_overflow:
8023 // If an input is a vector containing a poison element, the
8024 // two output vectors (calculated results, overflow bits)'
8025 // corresponding lanes are poison.
8026 return true;
8027 case Intrinsic::ctpop:
8028 case Intrinsic::ctlz:
8029 case Intrinsic::cttz:
8030 case Intrinsic::abs:
8031 case Intrinsic::smax:
8032 case Intrinsic::smin:
8033 case Intrinsic::umax:
8034 case Intrinsic::umin:
8035 case Intrinsic::scmp:
8036 case Intrinsic::is_fpclass:
8037 case Intrinsic::ptrmask:
8038 case Intrinsic::ucmp:
8039 case Intrinsic::bitreverse:
8040 case Intrinsic::bswap:
8041 case Intrinsic::sadd_sat:
8042 case Intrinsic::ssub_sat:
8043 case Intrinsic::sshl_sat:
8044 case Intrinsic::uadd_sat:
8045 case Intrinsic::usub_sat:
8046 case Intrinsic::ushl_sat:
8047 case Intrinsic::smul_fix:
8048 case Intrinsic::smul_fix_sat:
8049 case Intrinsic::umul_fix:
8050 case Intrinsic::umul_fix_sat:
8051 case Intrinsic::pow:
8052 case Intrinsic::powi:
8053 case Intrinsic::sin:
8054 case Intrinsic::sinh:
8055 case Intrinsic::cos:
8056 case Intrinsic::cosh:
8057 case Intrinsic::sincos:
8058 case Intrinsic::sincospi:
8059 case Intrinsic::tan:
8060 case Intrinsic::tanh:
8061 case Intrinsic::asin:
8062 case Intrinsic::acos:
8063 case Intrinsic::atan:
8064 case Intrinsic::atan2:
8065 case Intrinsic::canonicalize:
8066 case Intrinsic::sqrt:
8067 case Intrinsic::exp:
8068 case Intrinsic::exp2:
8069 case Intrinsic::exp10:
8070 case Intrinsic::log:
8071 case Intrinsic::log2:
8072 case Intrinsic::log10:
8073 case Intrinsic::modf:
8074 case Intrinsic::floor:
8075 case Intrinsic::ceil:
8076 case Intrinsic::trunc:
8077 case Intrinsic::rint:
8078 case Intrinsic::nearbyint:
8079 case Intrinsic::round:
8080 case Intrinsic::roundeven:
8081 case Intrinsic::lrint:
8082 case Intrinsic::llrint:
8083 case Intrinsic::fshl:
8084 case Intrinsic::fshr:
8085 return true;
8086 default:
8087 return false;
8088 }
8089}
8090
8091bool llvm::propagatesPoison(const Use &PoisonOp) {
8092 const Operator *I = cast<Operator>(PoisonOp.getUser());
8093 switch (I->getOpcode()) {
8094 case Instruction::Freeze:
8095 case Instruction::PHI:
8096 case Instruction::Invoke:
8097 return false;
8098 case Instruction::Select:
8099 return PoisonOp.getOperandNo() == 0;
8100 case Instruction::Call:
8101 if (auto *II = dyn_cast<IntrinsicInst>(I))
8102 return intrinsicPropagatesPoison(II->getIntrinsicID());
8103 return false;
8104 case Instruction::ICmp:
8105 case Instruction::FCmp:
8106 case Instruction::GetElementPtr:
8107 return true;
8108 default:
8110 return true;
8111
8112 // Be conservative and return false.
8113 return false;
8114 }
8115}
8116
8117/// Enumerates all operands of \p I that are guaranteed to not be undef or
8118/// poison. If the callback \p Handle returns true, stop processing and return
8119/// true. Otherwise, return false.
8120template <typename CallableT>
8122 const CallableT &Handle) {
8123 switch (I->getOpcode()) {
8124 case Instruction::Store:
8125 if (Handle(cast<StoreInst>(I)->getPointerOperand()))
8126 return true;
8127 break;
8128
8129 case Instruction::Load:
8130 if (Handle(cast<LoadInst>(I)->getPointerOperand()))
8131 return true;
8132 break;
8133
8134 // Since dereferenceable attribute imply noundef, atomic operations
8135 // also implicitly have noundef pointers too
8136 case Instruction::AtomicCmpXchg:
8138 return true;
8139 break;
8140
8141 case Instruction::AtomicRMW:
8142 if (Handle(cast<AtomicRMWInst>(I)->getPointerOperand()))
8143 return true;
8144 break;
8145
8146 case Instruction::Call:
8147 case Instruction::Invoke: {
8148 const CallBase *CB = cast<CallBase>(I);
8149 if (CB->isIndirectCall() && Handle(CB->getCalledOperand()))
8150 return true;
8151 for (unsigned i = 0; i < CB->arg_size(); ++i)
8152 if ((CB->paramHasAttr(i, Attribute::NoUndef) ||
8153 CB->paramHasAttr(i, Attribute::Dereferenceable) ||
8154 CB->paramHasAttr(i, Attribute::DereferenceableOrNull)) &&
8155 Handle(CB->getArgOperand(i)))
8156 return true;
8157 break;
8158 }
8159 case Instruction::Ret:
8160 if (I->getFunction()->hasRetAttribute(Attribute::NoUndef) &&
8161 Handle(I->getOperand(0)))
8162 return true;
8163 break;
8164 case Instruction::Switch:
8165 if (Handle(cast<SwitchInst>(I)->getCondition()))
8166 return true;
8167 break;
8168 case Instruction::Br: {
8169 auto *BR = cast<BranchInst>(I);
8170 if (BR->isConditional() && Handle(BR->getCondition()))
8171 return true;
8172 break;
8173 }
8174 default:
8175 break;
8176 }
8177
8178 return false;
8179}
8180
8181/// Enumerates all operands of \p I that are guaranteed to not be poison.
8182template <typename CallableT>
8184 const CallableT &Handle) {
8185 if (handleGuaranteedWellDefinedOps(I, Handle))
8186 return true;
8187 switch (I->getOpcode()) {
8188 // Divisors of these operations are allowed to be partially undef.
8189 case Instruction::UDiv:
8190 case Instruction::SDiv:
8191 case Instruction::URem:
8192 case Instruction::SRem:
8193 return Handle(I->getOperand(1));
8194 default:
8195 return false;
8196 }
8197}
8198
8200 const SmallPtrSetImpl<const Value *> &KnownPoison) {
8202 I, [&](const Value *V) { return KnownPoison.count(V); });
8203}
8204
8206 bool PoisonOnly) {
8207 // We currently only look for uses of values within the same basic
8208 // block, as that makes it easier to guarantee that the uses will be
8209 // executed given that Inst is executed.
8210 //
8211 // FIXME: Expand this to consider uses beyond the same basic block. To do
8212 // this, look out for the distinction between post-dominance and strong
8213 // post-dominance.
8214 const BasicBlock *BB = nullptr;
8216 if (const auto *Inst = dyn_cast<Instruction>(V)) {
8217 BB = Inst->getParent();
8218 Begin = Inst->getIterator();
8219 Begin++;
8220 } else if (const auto *Arg = dyn_cast<Argument>(V)) {
8221 if (Arg->getParent()->isDeclaration())
8222 return false;
8223 BB = &Arg->getParent()->getEntryBlock();
8224 Begin = BB->begin();
8225 } else {
8226 return false;
8227 }
8228
8229 // Limit number of instructions we look at, to avoid scanning through large
8230 // blocks. The current limit is chosen arbitrarily.
8231 unsigned ScanLimit = 32;
8232 BasicBlock::const_iterator End = BB->end();
8233
8234 if (!PoisonOnly) {
8235 // Since undef does not propagate eagerly, be conservative & just check
8236 // whether a value is directly passed to an instruction that must take
8237 // well-defined operands.
8238
8239 for (const auto &I : make_range(Begin, End)) {
8240 if (--ScanLimit == 0)
8241 break;
8242
8243 if (handleGuaranteedWellDefinedOps(&I, [V](const Value *WellDefinedOp) {
8244 return WellDefinedOp == V;
8245 }))
8246 return true;
8247
8249 break;
8250 }
8251 return false;
8252 }
8253
8254 // Set of instructions that we have proved will yield poison if Inst
8255 // does.
8256 SmallPtrSet<const Value *, 16> YieldsPoison;
8258
8259 YieldsPoison.insert(V);
8260 Visited.insert(BB);
8261
8262 while (true) {
8263 for (const auto &I : make_range(Begin, End)) {
8264 if (--ScanLimit == 0)
8265 return false;
8266 if (mustTriggerUB(&I, YieldsPoison))
8267 return true;
8269 return false;
8270
8271 // If an operand is poison and propagates it, mark I as yielding poison.
8272 for (const Use &Op : I.operands()) {
8273 if (YieldsPoison.count(Op) && propagatesPoison(Op)) {
8274 YieldsPoison.insert(&I);
8275 break;
8276 }
8277 }
8278
8279 // Special handling for select, which returns poison if its operand 0 is
8280 // poison (handled in the loop above) *or* if both its true/false operands
8281 // are poison (handled here).
8282 if (I.getOpcode() == Instruction::Select &&
8283 YieldsPoison.count(I.getOperand(1)) &&
8284 YieldsPoison.count(I.getOperand(2))) {
8285 YieldsPoison.insert(&I);
8286 }
8287 }
8288
8289 BB = BB->getSingleSuccessor();
8290 if (!BB || !Visited.insert(BB).second)
8291 break;
8292
8293 Begin = BB->getFirstNonPHIIt();
8294 End = BB->end();
8295 }
8296 return false;
8297}
8298
8300 return ::programUndefinedIfUndefOrPoison(Inst, false);
8301}
8302
8304 return ::programUndefinedIfUndefOrPoison(Inst, true);
8305}
8306
8307static bool isKnownNonNaN(const Value *V, FastMathFlags FMF) {
8308 if (FMF.noNaNs())
8309 return true;
8310
8311 if (auto *C = dyn_cast<ConstantFP>(V))
8312 return !C->isNaN();
8313
8314 if (auto *C = dyn_cast<ConstantDataVector>(V)) {
8315 if (!C->getElementType()->isFloatingPointTy())
8316 return false;
8317 for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) {
8318 if (C->getElementAsAPFloat(I).isNaN())
8319 return false;
8320 }
8321 return true;
8322 }
8323
8325 return true;
8326
8327 return false;
8328}
8329
8330static bool isKnownNonZero(const Value *V) {
8331 if (auto *C = dyn_cast<ConstantFP>(V))
8332 return !C->isZero();
8333
8334 if (auto *C = dyn_cast<ConstantDataVector>(V)) {
8335 if (!C->getElementType()->isFloatingPointTy())
8336 return false;
8337 for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) {
8338 if (C->getElementAsAPFloat(I).isZero())
8339 return false;
8340 }
8341 return true;
8342 }
8343
8344 return false;
8345}
8346
8347/// Match clamp pattern for float types without care about NaNs or signed zeros.
8348/// Given non-min/max outer cmp/select from the clamp pattern this
8349/// function recognizes if it can be substitued by a "canonical" min/max
8350/// pattern.
8352 Value *CmpLHS, Value *CmpRHS,
8353 Value *TrueVal, Value *FalseVal,
8354 Value *&LHS, Value *&RHS) {
8355 // Try to match
8356 // X < C1 ? C1 : Min(X, C2) --> Max(C1, Min(X, C2))
8357 // X > C1 ? C1 : Max(X, C2) --> Min(C1, Max(X, C2))
8358 // and return description of the outer Max/Min.
8359
8360 // First, check if select has inverse order:
8361 if (CmpRHS == FalseVal) {
8362 std::swap(TrueVal, FalseVal);
8363 Pred = CmpInst::getInversePredicate(Pred);
8364 }
8365
8366 // Assume success now. If there's no match, callers should not use these anyway.
8367 LHS = TrueVal;
8368 RHS = FalseVal;
8369
8370 const APFloat *FC1;
8371 if (CmpRHS != TrueVal || !match(CmpRHS, m_APFloat(FC1)) || !FC1->isFinite())
8372 return {SPF_UNKNOWN, SPNB_NA, false};
8373
8374 const APFloat *FC2;
8375 switch (Pred) {
8376 case CmpInst::FCMP_OLT:
8377 case CmpInst::FCMP_OLE:
8378 case CmpInst::FCMP_ULT:
8379 case CmpInst::FCMP_ULE:
8380 if (match(FalseVal, m_OrdOrUnordFMin(m_Specific(CmpLHS), m_APFloat(FC2))) &&
8381 *FC1 < *FC2)
8382 return {SPF_FMAXNUM, SPNB_RETURNS_ANY, false};
8383 break;
8384 case CmpInst::FCMP_OGT:
8385 case CmpInst::FCMP_OGE:
8386 case CmpInst::FCMP_UGT:
8387 case CmpInst::FCMP_UGE:
8388 if (match(FalseVal, m_OrdOrUnordFMax(m_Specific(CmpLHS), m_APFloat(FC2))) &&
8389 *FC1 > *FC2)
8390 return {SPF_FMINNUM, SPNB_RETURNS_ANY, false};
8391 break;
8392 default:
8393 break;
8394 }
8395
8396 return {SPF_UNKNOWN, SPNB_NA, false};
8397}
8398
8399/// Recognize variations of:
8400/// CLAMP(v,l,h) ==> ((v) < (l) ? (l) : ((v) > (h) ? (h) : (v)))
8402 Value *CmpLHS, Value *CmpRHS,
8403 Value *TrueVal, Value *FalseVal) {
8404 // Swap the select operands and predicate to match the patterns below.
8405 if (CmpRHS != TrueVal) {
8406 Pred = ICmpInst::getSwappedPredicate(Pred);
8407 std::swap(TrueVal, FalseVal);
8408 }
8409 const APInt *C1;
8410 if (CmpRHS == TrueVal && match(CmpRHS, m_APInt(C1))) {
8411 const APInt *C2;
8412 // (X <s C1) ? C1 : SMIN(X, C2) ==> SMAX(SMIN(X, C2), C1)
8413 if (match(FalseVal, m_SMin(m_Specific(CmpLHS), m_APInt(C2))) &&
8414 C1->slt(*C2) && Pred == CmpInst::ICMP_SLT)
8415 return {SPF_SMAX, SPNB_NA, false};
8416
8417 // (X >s C1) ? C1 : SMAX(X, C2) ==> SMIN(SMAX(X, C2), C1)
8418 if (match(FalseVal, m_SMax(m_Specific(CmpLHS), m_APInt(C2))) &&
8419 C1->sgt(*C2) && Pred == CmpInst::ICMP_SGT)
8420 return {SPF_SMIN, SPNB_NA, false};
8421
8422 // (X <u C1) ? C1 : UMIN(X, C2) ==> UMAX(UMIN(X, C2), C1)
8423 if (match(FalseVal, m_UMin(m_Specific(CmpLHS), m_APInt(C2))) &&
8424 C1->ult(*C2) && Pred == CmpInst::ICMP_ULT)
8425 return {SPF_UMAX, SPNB_NA, false};
8426
8427 // (X >u C1) ? C1 : UMAX(X, C2) ==> UMIN(UMAX(X, C2), C1)
8428 if (match(FalseVal, m_UMax(m_Specific(CmpLHS), m_APInt(C2))) &&
8429 C1->ugt(*C2) && Pred == CmpInst::ICMP_UGT)
8430 return {SPF_UMIN, SPNB_NA, false};
8431 }
8432 return {SPF_UNKNOWN, SPNB_NA, false};
8433}
8434
8435/// Recognize variations of:
8436/// a < c ? min(a,b) : min(b,c) ==> min(min(a,b),min(b,c))
8438 Value *CmpLHS, Value *CmpRHS,
8439 Value *TVal, Value *FVal,
8440 unsigned Depth) {
8441 // TODO: Allow FP min/max with nnan/nsz.
8442 assert(CmpInst::isIntPredicate(Pred) && "Expected integer comparison");
8443
8444 Value *A = nullptr, *B = nullptr;
8445 SelectPatternResult L = matchSelectPattern(TVal, A, B, nullptr, Depth + 1);
8446 if (!SelectPatternResult::isMinOrMax(L.Flavor))
8447 return {SPF_UNKNOWN, SPNB_NA, false};
8448
8449 Value *C = nullptr, *D = nullptr;
8450 SelectPatternResult R = matchSelectPattern(FVal, C, D, nullptr, Depth + 1);
8451 if (L.Flavor != R.Flavor)
8452 return {SPF_UNKNOWN, SPNB_NA, false};
8453
8454 // We have something like: x Pred y ? min(a, b) : min(c, d).
8455 // Try to match the compare to the min/max operations of the select operands.
8456 // First, make sure we have the right compare predicate.
8457 switch (L.Flavor) {
8458 case SPF_SMIN:
8459 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) {
8460 Pred = ICmpInst::getSwappedPredicate(Pred);
8461 std::swap(CmpLHS, CmpRHS);
8462 }
8463 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
8464 break;
8465 return {SPF_UNKNOWN, SPNB_NA, false};
8466 case SPF_SMAX:
8467 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
8468 Pred = ICmpInst::getSwappedPredicate(Pred);
8469 std::swap(CmpLHS, CmpRHS);
8470 }
8471 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE)
8472 break;
8473 return {SPF_UNKNOWN, SPNB_NA, false};
8474 case SPF_UMIN:
8475 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE) {
8476 Pred = ICmpInst::getSwappedPredicate(Pred);
8477 std::swap(CmpLHS, CmpRHS);
8478 }
8479 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE)
8480 break;
8481 return {SPF_UNKNOWN, SPNB_NA, false};
8482 case SPF_UMAX:
8483 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
8484 Pred = ICmpInst::getSwappedPredicate(Pred);
8485 std::swap(CmpLHS, CmpRHS);
8486 }
8487 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
8488 break;
8489 return {SPF_UNKNOWN, SPNB_NA, false};
8490 default:
8491 return {SPF_UNKNOWN, SPNB_NA, false};
8492 }
8493
8494 // If there is a common operand in the already matched min/max and the other
8495 // min/max operands match the compare operands (either directly or inverted),
8496 // then this is min/max of the same flavor.
8497
8498 // a pred c ? m(a, b) : m(c, b) --> m(m(a, b), m(c, b))
8499 // ~c pred ~a ? m(a, b) : m(c, b) --> m(m(a, b), m(c, b))
8500 if (D == B) {
8501 if ((CmpLHS == A && CmpRHS == C) || (match(C, m_Not(m_Specific(CmpLHS))) &&
8502 match(A, m_Not(m_Specific(CmpRHS)))))
8503 return {L.Flavor, SPNB_NA, false};
8504 }
8505 // a pred d ? m(a, b) : m(b, d) --> m(m(a, b), m(b, d))
8506 // ~d pred ~a ? m(a, b) : m(b, d) --> m(m(a, b), m(b, d))
8507 if (C == B) {
8508 if ((CmpLHS == A && CmpRHS == D) || (match(D, m_Not(m_Specific(CmpLHS))) &&
8509 match(A, m_Not(m_Specific(CmpRHS)))))
8510 return {L.Flavor, SPNB_NA, false};
8511 }
8512 // b pred c ? m(a, b) : m(c, a) --> m(m(a, b), m(c, a))
8513 // ~c pred ~b ? m(a, b) : m(c, a) --> m(m(a, b), m(c, a))
8514 if (D == A) {
8515 if ((CmpLHS == B && CmpRHS == C) || (match(C, m_Not(m_Specific(CmpLHS))) &&
8516 match(B, m_Not(m_Specific(CmpRHS)))))
8517 return {L.Flavor, SPNB_NA, false};
8518 }
8519 // b pred d ? m(a, b) : m(a, d) --> m(m(a, b), m(a, d))
8520 // ~d pred ~b ? m(a, b) : m(a, d) --> m(m(a, b), m(a, d))
8521 if (C == A) {
8522 if ((CmpLHS == B && CmpRHS == D) || (match(D, m_Not(m_Specific(CmpLHS))) &&
8523 match(B, m_Not(m_Specific(CmpRHS)))))
8524 return {L.Flavor, SPNB_NA, false};
8525 }
8526
8527 return {SPF_UNKNOWN, SPNB_NA, false};
8528}
8529
8530/// If the input value is the result of a 'not' op, constant integer, or vector
8531/// splat of a constant integer, return the bitwise-not source value.
8532/// TODO: This could be extended to handle non-splat vector integer constants.
8534 Value *NotV;
8535 if (match(V, m_Not(m_Value(NotV))))
8536 return NotV;
8537
8538 const APInt *C;
8539 if (match(V, m_APInt(C)))
8540 return ConstantInt::get(V->getType(), ~(*C));
8541
8542 return nullptr;
8543}
8544
8545/// Match non-obvious integer minimum and maximum sequences.
8547 Value *CmpLHS, Value *CmpRHS,
8548 Value *TrueVal, Value *FalseVal,
8549 Value *&LHS, Value *&RHS,
8550 unsigned Depth) {
8551 // Assume success. If there's no match, callers should not use these anyway.
8552 LHS = TrueVal;
8553 RHS = FalseVal;
8554
8555 SelectPatternResult SPR = matchClamp(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal);
8557 return SPR;
8558
8559 SPR = matchMinMaxOfMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, Depth);
8561 return SPR;
8562
8563 // Look through 'not' ops to find disguised min/max.
8564 // (X > Y) ? ~X : ~Y ==> (~X < ~Y) ? ~X : ~Y ==> MIN(~X, ~Y)
8565 // (X < Y) ? ~X : ~Y ==> (~X > ~Y) ? ~X : ~Y ==> MAX(~X, ~Y)
8566 if (CmpLHS == getNotValue(TrueVal) && CmpRHS == getNotValue(FalseVal)) {
8567 switch (Pred) {
8568 case CmpInst::ICMP_SGT: return {SPF_SMIN, SPNB_NA, false};
8569 case CmpInst::ICMP_SLT: return {SPF_SMAX, SPNB_NA, false};
8570 case CmpInst::ICMP_UGT: return {SPF_UMIN, SPNB_NA, false};
8571 case CmpInst::ICMP_ULT: return {SPF_UMAX, SPNB_NA, false};
8572 default: break;
8573 }
8574 }
8575
8576 // (X > Y) ? ~Y : ~X ==> (~X < ~Y) ? ~Y : ~X ==> MAX(~Y, ~X)
8577 // (X < Y) ? ~Y : ~X ==> (~X > ~Y) ? ~Y : ~X ==> MIN(~Y, ~X)
8578 if (CmpLHS == getNotValue(FalseVal) && CmpRHS == getNotValue(TrueVal)) {
8579 switch (Pred) {
8580 case CmpInst::ICMP_SGT: return {SPF_SMAX, SPNB_NA, false};
8581 case CmpInst::ICMP_SLT: return {SPF_SMIN, SPNB_NA, false};
8582 case CmpInst::ICMP_UGT: return {SPF_UMAX, SPNB_NA, false};
8583 case CmpInst::ICMP_ULT: return {SPF_UMIN, SPNB_NA, false};
8584 default: break;
8585 }
8586 }
8587
8588 if (Pred != CmpInst::ICMP_SGT && Pred != CmpInst::ICMP_SLT)
8589 return {SPF_UNKNOWN, SPNB_NA, false};
8590
8591 const APInt *C1;
8592 if (!match(CmpRHS, m_APInt(C1)))
8593 return {SPF_UNKNOWN, SPNB_NA, false};
8594
8595 // An unsigned min/max can be written with a signed compare.
8596 const APInt *C2;
8597 if ((CmpLHS == TrueVal && match(FalseVal, m_APInt(C2))) ||
8598 (CmpLHS == FalseVal && match(TrueVal, m_APInt(C2)))) {
8599 // Is the sign bit set?
8600 // (X <s 0) ? X : MAXVAL ==> (X >u MAXVAL) ? X : MAXVAL ==> UMAX
8601 // (X <s 0) ? MAXVAL : X ==> (X >u MAXVAL) ? MAXVAL : X ==> UMIN
8602 if (Pred == CmpInst::ICMP_SLT && C1->isZero() && C2->isMaxSignedValue())
8603 return {CmpLHS == TrueVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};
8604
8605 // Is the sign bit clear?
8606 // (X >s -1) ? MINVAL : X ==> (X <u MINVAL) ? MINVAL : X ==> UMAX
8607 // (X >s -1) ? X : MINVAL ==> (X <u MINVAL) ? X : MINVAL ==> UMIN
8608 if (Pred == CmpInst::ICMP_SGT && C1->isAllOnes() && C2->isMinSignedValue())
8609 return {CmpLHS == FalseVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};
8610 }
8611
8612 return {SPF_UNKNOWN, SPNB_NA, false};
8613}
8614
8615bool llvm::isKnownNegation(const Value *X, const Value *Y, bool NeedNSW,
8616 bool AllowPoison) {
8617 assert(X && Y && "Invalid operand");
8618
8619 auto IsNegationOf = [&](const Value *X, const Value *Y) {
8620 if (!match(X, m_Neg(m_Specific(Y))))
8621 return false;
8622
8623 auto *BO = cast<BinaryOperator>(X);
8624 if (NeedNSW && !BO->hasNoSignedWrap())
8625 return false;
8626
8627 auto *Zero = cast<Constant>(BO->getOperand(0));
8628 if (!AllowPoison && !Zero->isNullValue())
8629 return false;
8630
8631 return true;
8632 };
8633
8634 // X = -Y or Y = -X
8635 if (IsNegationOf(X, Y) || IsNegationOf(Y, X))
8636 return true;
8637
8638 // X = sub (A, B), Y = sub (B, A) || X = sub nsw (A, B), Y = sub nsw (B, A)
8639 Value *A, *B;
8640 return (!NeedNSW && (match(X, m_Sub(m_Value(A), m_Value(B))) &&
8641 match(Y, m_Sub(m_Specific(B), m_Specific(A))))) ||
8642 (NeedNSW && (match(X, m_NSWSub(m_Value(A), m_Value(B))) &&
8644}
8645
8646bool llvm::isKnownInversion(const Value *X, const Value *Y) {
8647 // Handle X = icmp pred A, B, Y = icmp pred A, C.
8648 Value *A, *B, *C;
8649 CmpPredicate Pred1, Pred2;
8650 if (!match(X, m_ICmp(Pred1, m_Value(A), m_Value(B))) ||
8651 !match(Y, m_c_ICmp(Pred2, m_Specific(A), m_Value(C))))
8652 return false;
8653
8654 // They must both have samesign flag or not.
8655 if (Pred1.hasSameSign() != Pred2.hasSameSign())
8656 return false;
8657
8658 if (B == C)
8659 return Pred1 == ICmpInst::getInversePredicate(Pred2);
8660
8661 // Try to infer the relationship from constant ranges.
8662 const APInt *RHSC1, *RHSC2;
8663 if (!match(B, m_APInt(RHSC1)) || !match(C, m_APInt(RHSC2)))
8664 return false;
8665
8666 // Sign bits of two RHSCs should match.
8667 if (Pred1.hasSameSign() && RHSC1->isNonNegative() != RHSC2->isNonNegative())
8668 return false;
8669
8670 const auto CR1 = ConstantRange::makeExactICmpRegion(Pred1, *RHSC1);
8671 const auto CR2 = ConstantRange::makeExactICmpRegion(Pred2, *RHSC2);
8672
8673 return CR1.inverse() == CR2;
8674}
8675
8677 SelectPatternNaNBehavior NaNBehavior,
8678 bool Ordered) {
8679 switch (Pred) {
8680 default:
8681 return {SPF_UNKNOWN, SPNB_NA, false}; // Equality.
8682 case ICmpInst::ICMP_UGT:
8683 case ICmpInst::ICMP_UGE:
8684 return {SPF_UMAX, SPNB_NA, false};
8685 case ICmpInst::ICMP_SGT:
8686 case ICmpInst::ICMP_SGE:
8687 return {SPF_SMAX, SPNB_NA, false};
8688 case ICmpInst::ICMP_ULT:
8689 case ICmpInst::ICMP_ULE:
8690 return {SPF_UMIN, SPNB_NA, false};
8691 case ICmpInst::ICMP_SLT:
8692 case ICmpInst::ICMP_SLE:
8693 return {SPF_SMIN, SPNB_NA, false};
8694 case FCmpInst::FCMP_UGT:
8695 case FCmpInst::FCMP_UGE:
8696 case FCmpInst::FCMP_OGT:
8697 case FCmpInst::FCMP_OGE:
8698 return {SPF_FMAXNUM, NaNBehavior, Ordered};
8699 case FCmpInst::FCMP_ULT:
8700 case FCmpInst::FCMP_ULE:
8701 case FCmpInst::FCMP_OLT:
8702 case FCmpInst::FCMP_OLE:
8703 return {SPF_FMINNUM, NaNBehavior, Ordered};
8704 }
8705}
8706
8707std::optional<std::pair<CmpPredicate, Constant *>>
8710 "Only for relational integer predicates.");
8711 if (isa<UndefValue>(C))
8712 return std::nullopt;
8713
8714 Type *Type = C->getType();
8715 bool IsSigned = ICmpInst::isSigned(Pred);
8716
8718 bool WillIncrement =
8719 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
8720
8721 // Check if the constant operand can be safely incremented/decremented
8722 // without overflowing/underflowing.
8723 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
8724 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
8725 };
8726
8727 Constant *SafeReplacementConstant = nullptr;
8728 if (auto *CI = dyn_cast<ConstantInt>(C)) {
8729 // Bail out if the constant can't be safely incremented/decremented.
8730 if (!ConstantIsOk(CI))
8731 return std::nullopt;
8732 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
8733 unsigned NumElts = FVTy->getNumElements();
8734 for (unsigned i = 0; i != NumElts; ++i) {
8735 Constant *Elt = C->getAggregateElement(i);
8736 if (!Elt)
8737 return std::nullopt;
8738
8739 if (isa<UndefValue>(Elt))
8740 continue;
8741
8742 // Bail out if we can't determine if this constant is min/max or if we
8743 // know that this constant is min/max.
8744 auto *CI = dyn_cast<ConstantInt>(Elt);
8745 if (!CI || !ConstantIsOk(CI))
8746 return std::nullopt;
8747
8748 if (!SafeReplacementConstant)
8749 SafeReplacementConstant = CI;
8750 }
8751 } else if (isa<VectorType>(C->getType())) {
8752 // Handle scalable splat
8753 Value *SplatC = C->getSplatValue();
8754 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
8755 // Bail out if the constant can't be safely incremented/decremented.
8756 if (!CI || !ConstantIsOk(CI))
8757 return std::nullopt;
8758 } else {
8759 // ConstantExpr?
8760 return std::nullopt;
8761 }
8762
8763 // It may not be safe to change a compare predicate in the presence of
8764 // undefined elements, so replace those elements with the first safe constant
8765 // that we found.
8766 // TODO: in case of poison, it is safe; let's replace undefs only.
8767 if (C->containsUndefOrPoisonElement()) {
8768 assert(SafeReplacementConstant && "Replacement constant not set");
8769 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
8770 }
8771
8773
8774 // Increment or decrement the constant.
8775 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
8776 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
8777
8778 return std::make_pair(NewPred, NewC);
8779}
8780
8782 FastMathFlags FMF,
8783 Value *CmpLHS, Value *CmpRHS,
8784 Value *TrueVal, Value *FalseVal,
8785 Value *&LHS, Value *&RHS,
8786 unsigned Depth) {
8787 bool HasMismatchedZeros = false;
8788 if (CmpInst::isFPPredicate(Pred)) {
8789 // IEEE-754 ignores the sign of 0.0 in comparisons. So if the select has one
8790 // 0.0 operand, set the compare's 0.0 operands to that same value for the
8791 // purpose of identifying min/max. Disregard vector constants with undefined
8792 // elements because those can not be back-propagated for analysis.
8793 Value *OutputZeroVal = nullptr;
8794 if (match(TrueVal, m_AnyZeroFP()) && !match(FalseVal, m_AnyZeroFP()) &&
8795 !cast<Constant>(TrueVal)->containsUndefOrPoisonElement())
8796 OutputZeroVal = TrueVal;
8797 else if (match(FalseVal, m_AnyZeroFP()) && !match(TrueVal, m_AnyZeroFP()) &&
8798 !cast<Constant>(FalseVal)->containsUndefOrPoisonElement())
8799 OutputZeroVal = FalseVal;
8800
8801 if (OutputZeroVal) {
8802 if (match(CmpLHS, m_AnyZeroFP()) && CmpLHS != OutputZeroVal) {
8803 HasMismatchedZeros = true;
8804 CmpLHS = OutputZeroVal;
8805 }
8806 if (match(CmpRHS, m_AnyZeroFP()) && CmpRHS != OutputZeroVal) {
8807 HasMismatchedZeros = true;
8808 CmpRHS = OutputZeroVal;
8809 }
8810 }
8811 }
8812
8813 LHS = CmpLHS;
8814 RHS = CmpRHS;
8815
8816 // Signed zero may return inconsistent results between implementations.
8817 // (0.0 <= -0.0) ? 0.0 : -0.0 // Returns 0.0
8818 // minNum(0.0, -0.0) // May return -0.0 or 0.0 (IEEE 754-2008 5.3.1)
8819 // Therefore, we behave conservatively and only proceed if at least one of the
8820 // operands is known to not be zero or if we don't care about signed zero.
8821 switch (Pred) {
8822 default: break;
8825 if (!HasMismatchedZeros)
8826 break;
8827 [[fallthrough]];
8830 if (!FMF.noSignedZeros() && !isKnownNonZero(CmpLHS) &&
8831 !isKnownNonZero(CmpRHS))
8832 return {SPF_UNKNOWN, SPNB_NA, false};
8833 }
8834
8835 SelectPatternNaNBehavior NaNBehavior = SPNB_NA;
8836 bool Ordered = false;
8837
8838 // When given one NaN and one non-NaN input:
8839 // - maxnum/minnum (C99 fmaxf()/fminf()) return the non-NaN input.
8840 // - A simple C99 (a < b ? a : b) construction will return 'b' (as the
8841 // ordered comparison fails), which could be NaN or non-NaN.
8842 // so here we discover exactly what NaN behavior is required/accepted.
8843 if (CmpInst::isFPPredicate(Pred)) {
8844 bool LHSSafe = isKnownNonNaN(CmpLHS, FMF);
8845 bool RHSSafe = isKnownNonNaN(CmpRHS, FMF);
8846
8847 if (LHSSafe && RHSSafe) {
8848 // Both operands are known non-NaN.
8849 NaNBehavior = SPNB_RETURNS_ANY;
8850 Ordered = CmpInst::isOrdered(Pred);
8851 } else if (CmpInst::isOrdered(Pred)) {
8852 // An ordered comparison will return false when given a NaN, so it
8853 // returns the RHS.
8854 Ordered = true;
8855 if (LHSSafe)
8856 // LHS is non-NaN, so if RHS is NaN then NaN will be returned.
8857 NaNBehavior = SPNB_RETURNS_NAN;
8858 else if (RHSSafe)
8859 NaNBehavior = SPNB_RETURNS_OTHER;
8860 else
8861 // Completely unsafe.
8862 return {SPF_UNKNOWN, SPNB_NA, false};
8863 } else {
8864 Ordered = false;
8865 // An unordered comparison will return true when given a NaN, so it
8866 // returns the LHS.
8867 if (LHSSafe)
8868 // LHS is non-NaN, so if RHS is NaN then non-NaN will be returned.
8869 NaNBehavior = SPNB_RETURNS_OTHER;
8870 else if (RHSSafe)
8871 NaNBehavior = SPNB_RETURNS_NAN;
8872 else
8873 // Completely unsafe.
8874 return {SPF_UNKNOWN, SPNB_NA, false};
8875 }
8876 }
8877
8878 if (TrueVal == CmpRHS && FalseVal == CmpLHS) {
8879 std::swap(CmpLHS, CmpRHS);
8880 Pred = CmpInst::getSwappedPredicate(Pred);
8881 if (NaNBehavior == SPNB_RETURNS_NAN)
8882 NaNBehavior = SPNB_RETURNS_OTHER;
8883 else if (NaNBehavior == SPNB_RETURNS_OTHER)
8884 NaNBehavior = SPNB_RETURNS_NAN;
8885 Ordered = !Ordered;
8886 }
8887
8888 // ([if]cmp X, Y) ? X : Y
8889 if (TrueVal == CmpLHS && FalseVal == CmpRHS)
8890 return getSelectPattern(Pred, NaNBehavior, Ordered);
8891
8892 if (isKnownNegation(TrueVal, FalseVal)) {
8893 // Sign-extending LHS does not change its sign, so TrueVal/FalseVal can
8894 // match against either LHS or sext(LHS).
8895 auto MaybeSExtCmpLHS =
8896 m_CombineOr(m_Specific(CmpLHS), m_SExt(m_Specific(CmpLHS)));
8897 auto ZeroOrAllOnes = m_CombineOr(m_ZeroInt(), m_AllOnes());
8898 auto ZeroOrOne = m_CombineOr(m_ZeroInt(), m_One());
8899 if (match(TrueVal, MaybeSExtCmpLHS)) {
8900 // Set the return values. If the compare uses the negated value (-X >s 0),
8901 // swap the return values because the negated value is always 'RHS'.
8902 LHS = TrueVal;
8903 RHS = FalseVal;
8904 if (match(CmpLHS, m_Neg(m_Specific(FalseVal))))
8905 std::swap(LHS, RHS);
8906
8907 // (X >s 0) ? X : -X or (X >s -1) ? X : -X --> ABS(X)
8908 // (-X >s 0) ? -X : X or (-X >s -1) ? -X : X --> ABS(X)
8909 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes))
8910 return {SPF_ABS, SPNB_NA, false};
8911
8912 // (X >=s 0) ? X : -X or (X >=s 1) ? X : -X --> ABS(X)
8913 if (Pred == ICmpInst::ICMP_SGE && match(CmpRHS, ZeroOrOne))
8914 return {SPF_ABS, SPNB_NA, false};
8915
8916 // (X <s 0) ? X : -X or (X <s 1) ? X : -X --> NABS(X)
8917 // (-X <s 0) ? -X : X or (-X <s 1) ? -X : X --> NABS(X)
8918 if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne))
8919 return {SPF_NABS, SPNB_NA, false};
8920 }
8921 else if (match(FalseVal, MaybeSExtCmpLHS)) {
8922 // Set the return values. If the compare uses the negated value (-X >s 0),
8923 // swap the return values because the negated value is always 'RHS'.
8924 LHS = FalseVal;
8925 RHS = TrueVal;
8926 if (match(CmpLHS, m_Neg(m_Specific(TrueVal))))
8927 std::swap(LHS, RHS);
8928
8929 // (X >s 0) ? -X : X or (X >s -1) ? -X : X --> NABS(X)
8930 // (-X >s 0) ? X : -X or (-X >s -1) ? X : -X --> NABS(X)
8931 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes))
8932 return {SPF_NABS, SPNB_NA, false};
8933
8934 // (X <s 0) ? -X : X or (X <s 1) ? -X : X --> ABS(X)
8935 // (-X <s 0) ? X : -X or (-X <s 1) ? X : -X --> ABS(X)
8936 if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne))
8937 return {SPF_ABS, SPNB_NA, false};
8938 }
8939 }
8940
8941 if (CmpInst::isIntPredicate(Pred))
8942 return matchMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS, Depth);
8943
8944 // According to (IEEE 754-2008 5.3.1), minNum(0.0, -0.0) and similar
8945 // may return either -0.0 or 0.0, so fcmp/select pair has stricter
8946 // semantics than minNum. Be conservative in such case.
8947 if (NaNBehavior != SPNB_RETURNS_ANY ||
8948 (!FMF.noSignedZeros() && !isKnownNonZero(CmpLHS) &&
8949 !isKnownNonZero(CmpRHS)))
8950 return {SPF_UNKNOWN, SPNB_NA, false};
8951
8952 return matchFastFloatClamp(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS);
8953}
8954
8956 Instruction::CastOps *CastOp) {
8957 const DataLayout &DL = CmpI->getDataLayout();
8958
8959 Constant *CastedTo = nullptr;
8960 switch (*CastOp) {
8961 case Instruction::ZExt:
8962 if (CmpI->isUnsigned())
8963 CastedTo = ConstantExpr::getTrunc(C, SrcTy);
8964 break;
8965 case Instruction::SExt:
8966 if (CmpI->isSigned())
8967 CastedTo = ConstantExpr::getTrunc(C, SrcTy, true);
8968 break;
8969 case Instruction::Trunc:
8970 Constant *CmpConst;
8971 if (match(CmpI->getOperand(1), m_Constant(CmpConst)) &&
8972 CmpConst->getType() == SrcTy) {
8973 // Here we have the following case:
8974 //
8975 // %cond = cmp iN %x, CmpConst
8976 // %tr = trunc iN %x to iK
8977 // %narrowsel = select i1 %cond, iK %t, iK C
8978 //
8979 // We can always move trunc after select operation:
8980 //
8981 // %cond = cmp iN %x, CmpConst
8982 // %widesel = select i1 %cond, iN %x, iN CmpConst
8983 // %tr = trunc iN %widesel to iK
8984 //
8985 // Note that C could be extended in any way because we don't care about
8986 // upper bits after truncation. It can't be abs pattern, because it would
8987 // look like:
8988 //
8989 // select i1 %cond, x, -x.
8990 //
8991 // So only min/max pattern could be matched. Such match requires widened C
8992 // == CmpConst. That is why set widened C = CmpConst, condition trunc
8993 // CmpConst == C is checked below.
8994 CastedTo = CmpConst;
8995 } else {
8996 unsigned ExtOp = CmpI->isSigned() ? Instruction::SExt : Instruction::ZExt;
8997 CastedTo = ConstantFoldCastOperand(ExtOp, C, SrcTy, DL);
8998 }
8999 break;
9000 case Instruction::FPTrunc:
9001 CastedTo = ConstantFoldCastOperand(Instruction::FPExt, C, SrcTy, DL);
9002 break;
9003 case Instruction::FPExt:
9004 CastedTo = ConstantFoldCastOperand(Instruction::FPTrunc, C, SrcTy, DL);
9005 break;
9006 case Instruction::FPToUI:
9007 CastedTo = ConstantFoldCastOperand(Instruction::UIToFP, C, SrcTy, DL);
9008 break;
9009 case Instruction::FPToSI:
9010 CastedTo = ConstantFoldCastOperand(Instruction::SIToFP, C, SrcTy, DL);
9011 break;
9012 case Instruction::UIToFP:
9013 CastedTo = ConstantFoldCastOperand(Instruction::FPToUI, C, SrcTy, DL);
9014 break;
9015 case Instruction::SIToFP:
9016 CastedTo = ConstantFoldCastOperand(Instruction::FPToSI, C, SrcTy, DL);
9017 break;
9018 default:
9019 break;
9020 }
9021
9022 if (!CastedTo)
9023 return nullptr;
9024
9025 // Make sure the cast doesn't lose any information.
9026 Constant *CastedBack =
9027 ConstantFoldCastOperand(*CastOp, CastedTo, C->getType(), DL);
9028 if (CastedBack && CastedBack != C)
9029 return nullptr;
9030
9031 return CastedTo;
9032}
9033
9034/// Helps to match a select pattern in case of a type mismatch.
9035///
9036/// The function processes the case when type of true and false values of a
9037/// select instruction differs from type of the cmp instruction operands because
9038/// of a cast instruction. The function checks if it is legal to move the cast
9039/// operation after "select". If yes, it returns the new second value of
9040/// "select" (with the assumption that cast is moved):
9041/// 1. As operand of cast instruction when both values of "select" are same cast
9042/// instructions.
9043/// 2. As restored constant (by applying reverse cast operation) when the first
9044/// value of the "select" is a cast operation and the second value is a
9045/// constant. It is implemented in lookThroughCastConst().
9046/// 3. As one operand is cast instruction and the other is not. The operands in
9047/// sel(cmp) are in different type integer.
9048/// NOTE: We return only the new second value because the first value could be
9049/// accessed as operand of cast instruction.
9050static Value *lookThroughCast(CmpInst *CmpI, Value *V1, Value *V2,
9051 Instruction::CastOps *CastOp) {
9052 auto *Cast1 = dyn_cast<CastInst>(V1);
9053 if (!Cast1)
9054 return nullptr;
9055
9056 *CastOp = Cast1->getOpcode();
9057 Type *SrcTy = Cast1->getSrcTy();
9058 if (auto *Cast2 = dyn_cast<CastInst>(V2)) {
9059 // If V1 and V2 are both the same cast from the same type, look through V1.
9060 if (*CastOp == Cast2->getOpcode() && SrcTy == Cast2->getSrcTy())
9061 return Cast2->getOperand(0);
9062 return nullptr;
9063 }
9064
9065 auto *C = dyn_cast<Constant>(V2);
9066 if (C)
9067 return lookThroughCastConst(CmpI, SrcTy, C, CastOp);
9068
9069 Value *CastedTo = nullptr;
9070 if (*CastOp == Instruction::Trunc) {
9071 if (match(CmpI->getOperand(1), m_ZExtOrSExt(m_Specific(V2)))) {
9072 // Here we have the following case:
9073 // %y_ext = sext iK %y to iN
9074 // %cond = cmp iN %x, %y_ext
9075 // %tr = trunc iN %x to iK
9076 // %narrowsel = select i1 %cond, iK %tr, iK %y
9077 //
9078 // We can always move trunc after select operation:
9079 // %y_ext = sext iK %y to iN
9080 // %cond = cmp iN %x, %y_ext
9081 // %widesel = select i1 %cond, iN %x, iN %y_ext
9082 // %tr = trunc iN %widesel to iK
9083 assert(V2->getType() == Cast1->getType() &&
9084 "V2 and Cast1 should be the same type.");
9085 CastedTo = CmpI->getOperand(1);
9086 }
9087 }
9088
9089 return CastedTo;
9090}
9092 Instruction::CastOps *CastOp,
9093 unsigned Depth) {
9095 return {SPF_UNKNOWN, SPNB_NA, false};
9096
9098 if (!SI) return {SPF_UNKNOWN, SPNB_NA, false};
9099
9100 CmpInst *CmpI = dyn_cast<CmpInst>(SI->getCondition());
9101 if (!CmpI) return {SPF_UNKNOWN, SPNB_NA, false};
9102
9103 Value *TrueVal = SI->getTrueValue();
9104 Value *FalseVal = SI->getFalseValue();
9105
9107 CmpI, TrueVal, FalseVal, LHS, RHS,
9108 isa<FPMathOperator>(SI) ? SI->getFastMathFlags() : FastMathFlags(),
9109 CastOp, Depth);
9110}
9111
9113 CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS,
9114 FastMathFlags FMF, Instruction::CastOps *CastOp, unsigned Depth) {
9115 CmpInst::Predicate Pred = CmpI->getPredicate();
9116 Value *CmpLHS = CmpI->getOperand(0);
9117 Value *CmpRHS = CmpI->getOperand(1);
9118 if (isa<FPMathOperator>(CmpI) && CmpI->hasNoNaNs())
9119 FMF.setNoNaNs();
9120
9121 // Bail out early.
9122 if (CmpI->isEquality())
9123 return {SPF_UNKNOWN, SPNB_NA, false};
9124
9125 // Deal with type mismatches.
9126 if (CastOp && CmpLHS->getType() != TrueVal->getType()) {
9127 if (Value *C = lookThroughCast(CmpI, TrueVal, FalseVal, CastOp)) {
9128 // If this is a potential fmin/fmax with a cast to integer, then ignore
9129 // -0.0 because there is no corresponding integer value.
9130 if (*CastOp == Instruction::FPToSI || *CastOp == Instruction::FPToUI)
9131 FMF.setNoSignedZeros();
9132 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS,
9133 cast<CastInst>(TrueVal)->getOperand(0), C,
9134 LHS, RHS, Depth);
9135 }
9136 if (Value *C = lookThroughCast(CmpI, FalseVal, TrueVal, CastOp)) {
9137 // If this is a potential fmin/fmax with a cast to integer, then ignore
9138 // -0.0 because there is no corresponding integer value.
9139 if (*CastOp == Instruction::FPToSI || *CastOp == Instruction::FPToUI)
9140 FMF.setNoSignedZeros();
9141 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS,
9142 C, cast<CastInst>(FalseVal)->getOperand(0),
9143 LHS, RHS, Depth);
9144 }
9145 }
9146 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS, TrueVal, FalseVal,
9147 LHS, RHS, Depth);
9148}
9149
9151 if (SPF == SPF_SMIN) return ICmpInst::ICMP_SLT;
9152 if (SPF == SPF_UMIN) return ICmpInst::ICMP_ULT;
9153 if (SPF == SPF_SMAX) return ICmpInst::ICMP_SGT;
9154 if (SPF == SPF_UMAX) return ICmpInst::ICMP_UGT;
9155 if (SPF == SPF_FMINNUM)
9156 return Ordered ? FCmpInst::FCMP_OLT : FCmpInst::FCMP_ULT;
9157 if (SPF == SPF_FMAXNUM)
9158 return Ordered ? FCmpInst::FCMP_OGT : FCmpInst::FCMP_UGT;
9159 llvm_unreachable("unhandled!");
9160}
9161
9163 switch (SPF) {
9165 return Intrinsic::umin;
9167 return Intrinsic::umax;
9169 return Intrinsic::smin;
9171 return Intrinsic::smax;
9172 default:
9173 llvm_unreachable("Unexpected SPF");
9174 }
9175}
9176
9178 if (SPF == SPF_SMIN) return SPF_SMAX;
9179 if (SPF == SPF_UMIN) return SPF_UMAX;
9180 if (SPF == SPF_SMAX) return SPF_SMIN;
9181 if (SPF == SPF_UMAX) return SPF_UMIN;
9182 llvm_unreachable("unhandled!");
9183}
9184
9186 switch (MinMaxID) {
9187 case Intrinsic::smax: return Intrinsic::smin;
9188 case Intrinsic::smin: return Intrinsic::smax;
9189 case Intrinsic::umax: return Intrinsic::umin;
9190 case Intrinsic::umin: return Intrinsic::umax;
9191 // Please note that next four intrinsics may produce the same result for
9192 // original and inverted case even if X != Y due to NaN is handled specially.
9193 case Intrinsic::maximum: return Intrinsic::minimum;
9194 case Intrinsic::minimum: return Intrinsic::maximum;
9195 case Intrinsic::maxnum: return Intrinsic::minnum;
9196 case Intrinsic::minnum: return Intrinsic::maxnum;
9197 case Intrinsic::maximumnum:
9198 return Intrinsic::minimumnum;
9199 case Intrinsic::minimumnum:
9200 return Intrinsic::maximumnum;
9201 default: llvm_unreachable("Unexpected intrinsic");
9202 }
9203}
9204
9206 switch (SPF) {
9209 case SPF_UMAX: return APInt::getMaxValue(BitWidth);
9210 case SPF_UMIN: return APInt::getMinValue(BitWidth);
9211 default: llvm_unreachable("Unexpected flavor");
9212 }
9213}
9214
9215std::pair<Intrinsic::ID, bool>
9217 // Check if VL contains select instructions that can be folded into a min/max
9218 // vector intrinsic and return the intrinsic if it is possible.
9219 // TODO: Support floating point min/max.
9220 bool AllCmpSingleUse = true;
9221 SelectPatternResult SelectPattern;
9222 SelectPattern.Flavor = SPF_UNKNOWN;
9223 if (all_of(VL, [&SelectPattern, &AllCmpSingleUse](Value *I) {
9224 Value *LHS, *RHS;
9225 auto CurrentPattern = matchSelectPattern(I, LHS, RHS);
9226 if (!SelectPatternResult::isMinOrMax(CurrentPattern.Flavor))
9227 return false;
9228 if (SelectPattern.Flavor != SPF_UNKNOWN &&
9229 SelectPattern.Flavor != CurrentPattern.Flavor)
9230 return false;
9231 SelectPattern = CurrentPattern;
9232 AllCmpSingleUse &=
9234 return true;
9235 })) {
9236 switch (SelectPattern.Flavor) {
9237 case SPF_SMIN:
9238 return {Intrinsic::smin, AllCmpSingleUse};
9239 case SPF_UMIN:
9240 return {Intrinsic::umin, AllCmpSingleUse};
9241 case SPF_SMAX:
9242 return {Intrinsic::smax, AllCmpSingleUse};
9243 case SPF_UMAX:
9244 return {Intrinsic::umax, AllCmpSingleUse};
9245 case SPF_FMAXNUM:
9246 return {Intrinsic::maxnum, AllCmpSingleUse};
9247 case SPF_FMINNUM:
9248 return {Intrinsic::minnum, AllCmpSingleUse};
9249 default:
9250 llvm_unreachable("unexpected select pattern flavor");
9251 }
9252 }
9253 return {Intrinsic::not_intrinsic, false};
9254}
9255
9256template <typename InstTy>
9257static bool matchTwoInputRecurrence(const PHINode *PN, InstTy *&Inst,
9258 Value *&Init, Value *&OtherOp) {
9259 // Handle the case of a simple two-predecessor recurrence PHI.
9260 // There's a lot more that could theoretically be done here, but
9261 // this is sufficient to catch some interesting cases.
9262 // TODO: Expand list -- gep, uadd.sat etc.
9263 if (PN->getNumIncomingValues() != 2)
9264 return false;
9265
9266 for (unsigned I = 0; I != 2; ++I) {
9267 if (auto *Operation = dyn_cast<InstTy>(PN->getIncomingValue(I));
9268 Operation && Operation->getNumOperands() >= 2) {
9269 Value *LHS = Operation->getOperand(0);
9270 Value *RHS = Operation->getOperand(1);
9271 if (LHS != PN && RHS != PN)
9272 continue;
9273
9274 Inst = Operation;
9275 Init = PN->getIncomingValue(!I);
9276 OtherOp = (LHS == PN) ? RHS : LHS;
9277 return true;
9278 }
9279 }
9280 return false;
9281}
9282
9284 Value *&Start, Value *&Step) {
9285 // We try to match a recurrence of the form:
9286 // %iv = [Start, %entry], [%iv.next, %backedge]
9287 // %iv.next = binop %iv, Step
9288 // Or:
9289 // %iv = [Start, %entry], [%iv.next, %backedge]
9290 // %iv.next = binop Step, %iv
9291 return matchTwoInputRecurrence(P, BO, Start, Step);
9292}
9293
9295 Value *&Start, Value *&Step) {
9296 BinaryOperator *BO = nullptr;
9297 P = dyn_cast<PHINode>(I->getOperand(0));
9298 if (!P)
9299 P = dyn_cast<PHINode>(I->getOperand(1));
9300 return P && matchSimpleRecurrence(P, BO, Start, Step) && BO == I;
9301}
9302
9304 PHINode *&P, Value *&Init,
9305 Value *&OtherOp) {
9306 // Binary intrinsics only supported for now.
9307 if (I->arg_size() != 2 || I->getType() != I->getArgOperand(0)->getType() ||
9308 I->getType() != I->getArgOperand(1)->getType())
9309 return false;
9310
9311 IntrinsicInst *II = nullptr;
9312 P = dyn_cast<PHINode>(I->getArgOperand(0));
9313 if (!P)
9314 P = dyn_cast<PHINode>(I->getArgOperand(1));
9315
9316 return P && matchTwoInputRecurrence(P, II, Init, OtherOp) && II == I;
9317}
9318
9319/// Return true if "icmp Pred LHS RHS" is always true.
9321 const Value *RHS) {
9322 if (ICmpInst::isTrueWhenEqual(Pred) && LHS == RHS)
9323 return true;
9324
9325 switch (Pred) {
9326 default:
9327 return false;
9328
9329 case CmpInst::ICMP_SLE: {
9330 const APInt *C;
9331
9332 // LHS s<= LHS +_{nsw} C if C >= 0
9333 // LHS s<= LHS | C if C >= 0
9334 if (match(RHS, m_NSWAdd(m_Specific(LHS), m_APInt(C))) ||
9336 return !C->isNegative();
9337
9338 // LHS s<= smax(LHS, V) for any V
9340 return true;
9341
9342 // smin(RHS, V) s<= RHS for any V
9344 return true;
9345
9346 // Match A to (X +_{nsw} CA) and B to (X +_{nsw} CB)
9347 const Value *X;
9348 const APInt *CLHS, *CRHS;
9349 if (match(LHS, m_NSWAddLike(m_Value(X), m_APInt(CLHS))) &&
9351 return CLHS->sle(*CRHS);
9352
9353 return false;
9354 }
9355
9356 case CmpInst::ICMP_ULE: {
9357 // LHS u<= LHS +_{nuw} V for any V
9358 if (match(RHS, m_c_Add(m_Specific(LHS), m_Value())) &&
9360 return true;
9361
9362 // LHS u<= LHS | V for any V
9363 if (match(RHS, m_c_Or(m_Specific(LHS), m_Value())))
9364 return true;
9365
9366 // LHS u<= umax(LHS, V) for any V
9368 return true;
9369
9370 // RHS >> V u<= RHS for any V
9371 if (match(LHS, m_LShr(m_Specific(RHS), m_Value())))
9372 return true;
9373
9374 // RHS u/ C_ugt_1 u<= RHS
9375 const APInt *C;
9376 if (match(LHS, m_UDiv(m_Specific(RHS), m_APInt(C))) && C->ugt(1))
9377 return true;
9378
9379 // RHS & V u<= RHS for any V
9381 return true;
9382
9383 // umin(RHS, V) u<= RHS for any V
9385 return true;
9386
9387 // Match A to (X +_{nuw} CA) and B to (X +_{nuw} CB)
9388 const Value *X;
9389 const APInt *CLHS, *CRHS;
9390 if (match(LHS, m_NUWAddLike(m_Value(X), m_APInt(CLHS))) &&
9392 return CLHS->ule(*CRHS);
9393
9394 return false;
9395 }
9396 }
9397}
9398
9399/// Return true if "icmp Pred BLHS BRHS" is true whenever "icmp Pred
9400/// ALHS ARHS" is true. Otherwise, return std::nullopt.
9401static std::optional<bool>
9403 const Value *ARHS, const Value *BLHS, const Value *BRHS) {
9404 switch (Pred) {
9405 default:
9406 return std::nullopt;
9407
9408 case CmpInst::ICMP_SLT:
9409 case CmpInst::ICMP_SLE:
9410 if (isTruePredicate(CmpInst::ICMP_SLE, BLHS, ALHS) &&
9412 return true;
9413 return std::nullopt;
9414
9415 case CmpInst::ICMP_SGT:
9416 case CmpInst::ICMP_SGE:
9417 if (isTruePredicate(CmpInst::ICMP_SLE, ALHS, BLHS) &&
9419 return true;
9420 return std::nullopt;
9421
9422 case CmpInst::ICMP_ULT:
9423 case CmpInst::ICMP_ULE:
9424 if (isTruePredicate(CmpInst::ICMP_ULE, BLHS, ALHS) &&
9426 return true;
9427 return std::nullopt;
9428
9429 case CmpInst::ICMP_UGT:
9430 case CmpInst::ICMP_UGE:
9431 if (isTruePredicate(CmpInst::ICMP_ULE, ALHS, BLHS) &&
9433 return true;
9434 return std::nullopt;
9435 }
9436}
9437
9438/// Return true if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is true.
9439/// Return false if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is false.
9440/// Otherwise, return std::nullopt if we can't infer anything.
9441static std::optional<bool>
9443 CmpPredicate RPred, const ConstantRange &RCR) {
9444 auto CRImpliesPred = [&](ConstantRange CR,
9445 CmpInst::Predicate Pred) -> std::optional<bool> {
9446 // If all true values for lhs and true for rhs, lhs implies rhs
9447 if (CR.icmp(Pred, RCR))
9448 return true;
9449
9450 // If there is no overlap, lhs implies not rhs
9451 if (CR.icmp(CmpInst::getInversePredicate(Pred), RCR))
9452 return false;
9453
9454 return std::nullopt;
9455 };
9456 if (auto Res = CRImpliesPred(ConstantRange::makeAllowedICmpRegion(LPred, LCR),
9457 RPred))
9458 return Res;
9459 if (LPred.hasSameSign() ^ RPred.hasSameSign()) {
9461 : LPred.dropSameSign();
9463 : RPred.dropSameSign();
9464 return CRImpliesPred(ConstantRange::makeAllowedICmpRegion(LPred, LCR),
9465 RPred);
9466 }
9467 return std::nullopt;
9468}
9469
9470/// Return true if LHS implies RHS (expanded to its components as "R0 RPred R1")
9471/// is true. Return false if LHS implies RHS is false. Otherwise, return
9472/// std::nullopt if we can't infer anything.
9473static std::optional<bool>
9474isImpliedCondICmps(CmpPredicate LPred, const Value *L0, const Value *L1,
9475 CmpPredicate RPred, const Value *R0, const Value *R1,
9476 const DataLayout &DL, bool LHSIsTrue) {
9477 // The rest of the logic assumes the LHS condition is true. If that's not the
9478 // case, invert the predicate to make it so.
9479 if (!LHSIsTrue)
9480 LPred = ICmpInst::getInverseCmpPredicate(LPred);
9481
9482 // We can have non-canonical operands, so try to normalize any common operand
9483 // to L0/R0.
9484 if (L0 == R1) {
9485 std::swap(R0, R1);
9486 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9487 }
9488 if (R0 == L1) {
9489 std::swap(L0, L1);
9490 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9491 }
9492 if (L1 == R1) {
9493 // If we have L0 == R0 and L1 == R1, then make L1/R1 the constants.
9494 if (L0 != R0 || match(L0, m_ImmConstant())) {
9495 std::swap(L0, L1);
9496 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9497 std::swap(R0, R1);
9498 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9499 }
9500 }
9501
9502 // See if we can infer anything if operand-0 matches and we have at least one
9503 // constant.
9504 const APInt *Unused;
9505 if (L0 == R0 && (match(L1, m_APInt(Unused)) || match(R1, m_APInt(Unused)))) {
9506 // Potential TODO: We could also further use the constant range of L0/R0 to
9507 // further constraint the constant ranges. At the moment this leads to
9508 // several regressions related to not transforming `multi_use(A + C0) eq/ne
9509 // C1` (see discussion: D58633).
9511 L1, ICmpInst::isSigned(LPred), /* UseInstrInfo=*/true, /*AC=*/nullptr,
9512 /*CxtI=*/nullptr, /*DT=*/nullptr, MaxAnalysisRecursionDepth - 1);
9514 R1, ICmpInst::isSigned(RPred), /* UseInstrInfo=*/true, /*AC=*/nullptr,
9515 /*CxtI=*/nullptr, /*DT=*/nullptr, MaxAnalysisRecursionDepth - 1);
9516 // Even if L1/R1 are not both constant, we can still sometimes deduce
9517 // relationship from a single constant. For example X u> Y implies X != 0.
9518 if (auto R = isImpliedCondCommonOperandWithCR(LPred, LCR, RPred, RCR))
9519 return R;
9520 // If both L1/R1 were exact constant ranges and we didn't get anything
9521 // here, we won't be able to deduce this.
9522 if (match(L1, m_APInt(Unused)) && match(R1, m_APInt(Unused)))
9523 return std::nullopt;
9524 }
9525
9526 // Can we infer anything when the two compares have matching operands?
9527 if (L0 == R0 && L1 == R1)
9528 return ICmpInst::isImpliedByMatchingCmp(LPred, RPred);
9529
9530 // It only really makes sense in the context of signed comparison for "X - Y
9531 // must be positive if X >= Y and no overflow".
9532 // Take SGT as an example: L0:x > L1:y and C >= 0
9533 // ==> R0:(x -nsw y) < R1:(-C) is false
9534 CmpInst::Predicate SignedLPred = LPred.getPreferredSignedPredicate();
9535 if ((SignedLPred == ICmpInst::ICMP_SGT ||
9536 SignedLPred == ICmpInst::ICMP_SGE) &&
9537 match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
9538 if (match(R1, m_NonPositive()) &&
9539 ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == false)
9540 return false;
9541 }
9542
9543 // Take SLT as an example: L0:x < L1:y and C <= 0
9544 // ==> R0:(x -nsw y) < R1:(-C) is true
9545 if ((SignedLPred == ICmpInst::ICMP_SLT ||
9546 SignedLPred == ICmpInst::ICMP_SLE) &&
9547 match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
9548 if (match(R1, m_NonNegative()) &&
9549 ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == true)
9550 return true;
9551 }
9552
9553 // a - b == NonZero -> a != b
9554 // ptrtoint(a) - ptrtoint(b) == NonZero -> a != b
9555 const APInt *L1C;
9556 Value *A, *B;
9557 if (LPred == ICmpInst::ICMP_EQ && ICmpInst::isEquality(RPred) &&
9558 match(L1, m_APInt(L1C)) && !L1C->isZero() &&
9559 match(L0, m_Sub(m_Value(A), m_Value(B))) &&
9560 ((A == R0 && B == R1) || (A == R1 && B == R0) ||
9565 return RPred.dropSameSign() == ICmpInst::ICMP_NE;
9566 }
9567
9568 // L0 = R0 = L1 + R1, L0 >=u L1 implies R0 >=u R1, L0 <u L1 implies R0 <u R1
9569 if (L0 == R0 &&
9570 (LPred == ICmpInst::ICMP_ULT || LPred == ICmpInst::ICMP_UGE) &&
9571 (RPred == ICmpInst::ICMP_ULT || RPred == ICmpInst::ICMP_UGE) &&
9572 match(L0, m_c_Add(m_Specific(L1), m_Specific(R1))))
9573 return CmpPredicate::getMatching(LPred, RPred).has_value();
9574
9575 if (auto P = CmpPredicate::getMatching(LPred, RPred))
9576 return isImpliedCondOperands(*P, L0, L1, R0, R1);
9577
9578 return std::nullopt;
9579}
9580
9581/// Return true if LHS implies RHS (expanded to its components as "R0 RPred R1")
9582/// is true. Return false if LHS implies RHS is false. Otherwise, return
9583/// std::nullopt if we can't infer anything.
9584static std::optional<bool>
9586 FCmpInst::Predicate RPred, const Value *R0, const Value *R1,
9587 const DataLayout &DL, bool LHSIsTrue) {
9588 // The rest of the logic assumes the LHS condition is true. If that's not the
9589 // case, invert the predicate to make it so.
9590 if (!LHSIsTrue)
9591 LPred = FCmpInst::getInversePredicate(LPred);
9592
9593 // We can have non-canonical operands, so try to normalize any common operand
9594 // to L0/R0.
9595 if (L0 == R1) {
9596 std::swap(R0, R1);
9597 RPred = FCmpInst::getSwappedPredicate(RPred);
9598 }
9599 if (R0 == L1) {
9600 std::swap(L0, L1);
9601 LPred = FCmpInst::getSwappedPredicate(LPred);
9602 }
9603 if (L1 == R1) {
9604 // If we have L0 == R0 and L1 == R1, then make L1/R1 the constants.
9605 if (L0 != R0 || match(L0, m_ImmConstant())) {
9606 std::swap(L0, L1);
9607 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9608 std::swap(R0, R1);
9609 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9610 }
9611 }
9612
9613 // Can we infer anything when the two compares have matching operands?
9614 if (L0 == R0 && L1 == R1) {
9615 if ((LPred & RPred) == LPred)
9616 return true;
9617 if ((LPred & ~RPred) == LPred)
9618 return false;
9619 }
9620
9621 // See if we can infer anything if operand-0 matches and we have at least one
9622 // constant.
9623 const APFloat *L1C, *R1C;
9624 if (L0 == R0 && match(L1, m_APFloat(L1C)) && match(R1, m_APFloat(R1C))) {
9625 if (std::optional<ConstantFPRange> DomCR =
9627 if (std::optional<ConstantFPRange> ImpliedCR =
9629 if (ImpliedCR->contains(*DomCR))
9630 return true;
9631 }
9632 if (std::optional<ConstantFPRange> ImpliedCR =
9634 FCmpInst::getInversePredicate(RPred), *R1C)) {
9635 if (ImpliedCR->contains(*DomCR))
9636 return false;
9637 }
9638 }
9639 }
9640
9641 return std::nullopt;
9642}
9643
9644/// Return true if LHS implies RHS is true. Return false if LHS implies RHS is
9645/// false. Otherwise, return std::nullopt if we can't infer anything. We
9646/// expect the RHS to be an icmp and the LHS to be an 'and', 'or', or a 'select'
9647/// instruction.
9648static std::optional<bool>
9650 const Value *RHSOp0, const Value *RHSOp1,
9651 const DataLayout &DL, bool LHSIsTrue, unsigned Depth) {
9652 // The LHS must be an 'or', 'and', or a 'select' instruction.
9653 assert((LHS->getOpcode() == Instruction::And ||
9654 LHS->getOpcode() == Instruction::Or ||
9655 LHS->getOpcode() == Instruction::Select) &&
9656 "Expected LHS to be 'and', 'or', or 'select'.");
9657
9658 assert(Depth <= MaxAnalysisRecursionDepth && "Hit recursion limit");
9659
9660 // If the result of an 'or' is false, then we know both legs of the 'or' are
9661 // false. Similarly, if the result of an 'and' is true, then we know both
9662 // legs of the 'and' are true.
9663 const Value *ALHS, *ARHS;
9664 if ((!LHSIsTrue && match(LHS, m_LogicalOr(m_Value(ALHS), m_Value(ARHS)))) ||
9665 (LHSIsTrue && match(LHS, m_LogicalAnd(m_Value(ALHS), m_Value(ARHS))))) {
9666 // FIXME: Make this non-recursion.
9667 if (std::optional<bool> Implication = isImpliedCondition(
9668 ALHS, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue, Depth + 1))
9669 return Implication;
9670 if (std::optional<bool> Implication = isImpliedCondition(
9671 ARHS, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue, Depth + 1))
9672 return Implication;
9673 return std::nullopt;
9674 }
9675 return std::nullopt;
9676}
9677
9678std::optional<bool>
9680 const Value *RHSOp0, const Value *RHSOp1,
9681 const DataLayout &DL, bool LHSIsTrue, unsigned Depth) {
9682 // Bail out when we hit the limit.
9684 return std::nullopt;
9685
9686 // A mismatch occurs when we compare a scalar cmp to a vector cmp, for
9687 // example.
9688 if (RHSOp0->getType()->isVectorTy() != LHS->getType()->isVectorTy())
9689 return std::nullopt;
9690
9691 assert(LHS->getType()->isIntOrIntVectorTy(1) &&
9692 "Expected integer type only!");
9693
9694 // Match not
9695 if (match(LHS, m_Not(m_Value(LHS))))
9696 LHSIsTrue = !LHSIsTrue;
9697
9698 // Both LHS and RHS are icmps.
9699 if (RHSOp0->getType()->getScalarType()->isIntOrPtrTy()) {
9700 if (const auto *LHSCmp = dyn_cast<ICmpInst>(LHS))
9701 return isImpliedCondICmps(LHSCmp->getCmpPredicate(),
9702 LHSCmp->getOperand(0), LHSCmp->getOperand(1),
9703 RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue);
9704 const Value *V;
9705 if (match(LHS, m_NUWTrunc(m_Value(V))))
9707 ConstantInt::get(V->getType(), 0), RHSPred,
9708 RHSOp0, RHSOp1, DL, LHSIsTrue);
9709 } else {
9710 assert(RHSOp0->getType()->isFPOrFPVectorTy() &&
9711 "Expected floating point type only!");
9712 if (const auto *LHSCmp = dyn_cast<FCmpInst>(LHS))
9713 return isImpliedCondFCmps(LHSCmp->getPredicate(), LHSCmp->getOperand(0),
9714 LHSCmp->getOperand(1), RHSPred, RHSOp0, RHSOp1,
9715 DL, LHSIsTrue);
9716 }
9717
9718 /// The LHS should be an 'or', 'and', or a 'select' instruction. We expect
9719 /// the RHS to be an icmp.
9720 /// FIXME: Add support for and/or/select on the RHS.
9721 if (const Instruction *LHSI = dyn_cast<Instruction>(LHS)) {
9722 if ((LHSI->getOpcode() == Instruction::And ||
9723 LHSI->getOpcode() == Instruction::Or ||
9724 LHSI->getOpcode() == Instruction::Select))
9725 return isImpliedCondAndOr(LHSI, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue,
9726 Depth);
9727 }
9728 return std::nullopt;
9729}
9730
9731std::optional<bool> llvm::isImpliedCondition(const Value *LHS, const Value *RHS,
9732 const DataLayout &DL,
9733 bool LHSIsTrue, unsigned Depth) {
9734 // LHS ==> RHS by definition
9735 if (LHS == RHS)
9736 return LHSIsTrue;
9737
9738 // Match not
9739 bool InvertRHS = false;
9740 if (match(RHS, m_Not(m_Value(RHS)))) {
9741 if (LHS == RHS)
9742 return !LHSIsTrue;
9743 InvertRHS = true;
9744 }
9745
9746 if (const ICmpInst *RHSCmp = dyn_cast<ICmpInst>(RHS)) {
9747 if (auto Implied = isImpliedCondition(
9748 LHS, RHSCmp->getCmpPredicate(), RHSCmp->getOperand(0),
9749 RHSCmp->getOperand(1), DL, LHSIsTrue, Depth))
9750 return InvertRHS ? !*Implied : *Implied;
9751 return std::nullopt;
9752 }
9753 if (const FCmpInst *RHSCmp = dyn_cast<FCmpInst>(RHS)) {
9754 if (auto Implied = isImpliedCondition(
9755 LHS, RHSCmp->getPredicate(), RHSCmp->getOperand(0),
9756 RHSCmp->getOperand(1), DL, LHSIsTrue, Depth))
9757 return InvertRHS ? !*Implied : *Implied;
9758 return std::nullopt;
9759 }
9760
9761 const Value *V;
9762 if (match(RHS, m_NUWTrunc(m_Value(V)))) {
9763 if (auto Implied = isImpliedCondition(LHS, CmpInst::ICMP_NE, V,
9764 ConstantInt::get(V->getType(), 0), DL,
9765 LHSIsTrue, Depth))
9766 return InvertRHS ? !*Implied : *Implied;
9767 return std::nullopt;
9768 }
9769
9771 return std::nullopt;
9772
9773 // LHS ==> (RHS1 || RHS2) if LHS ==> RHS1 or LHS ==> RHS2
9774 // LHS ==> !(RHS1 && RHS2) if LHS ==> !RHS1 or LHS ==> !RHS2
9775 const Value *RHS1, *RHS2;
9776 if (match(RHS, m_LogicalOr(m_Value(RHS1), m_Value(RHS2)))) {
9777 if (std::optional<bool> Imp =
9778 isImpliedCondition(LHS, RHS1, DL, LHSIsTrue, Depth + 1))
9779 if (*Imp == true)
9780 return !InvertRHS;
9781 if (std::optional<bool> Imp =
9782 isImpliedCondition(LHS, RHS2, DL, LHSIsTrue, Depth + 1))
9783 if (*Imp == true)
9784 return !InvertRHS;
9785 }
9786 if (match(RHS, m_LogicalAnd(m_Value(RHS1), m_Value(RHS2)))) {
9787 if (std::optional<bool> Imp =
9788 isImpliedCondition(LHS, RHS1, DL, LHSIsTrue, Depth + 1))
9789 if (*Imp == false)
9790 return InvertRHS;
9791 if (std::optional<bool> Imp =
9792 isImpliedCondition(LHS, RHS2, DL, LHSIsTrue, Depth + 1))
9793 if (*Imp == false)
9794 return InvertRHS;
9795 }
9796
9797 return std::nullopt;
9798}
9799
9800// Returns a pair (Condition, ConditionIsTrue), where Condition is a branch
9801// condition dominating ContextI or nullptr, if no condition is found.
9802static std::pair<Value *, bool>
9804 if (!ContextI || !ContextI->getParent())
9805 return {nullptr, false};
9806
9807 // TODO: This is a poor/cheap way to determine dominance. Should we use a
9808 // dominator tree (eg, from a SimplifyQuery) instead?
9809 const BasicBlock *ContextBB = ContextI->getParent();
9810 const BasicBlock *PredBB = ContextBB->getSinglePredecessor();
9811 if (!PredBB)
9812 return {nullptr, false};
9813
9814 // We need a conditional branch in the predecessor.
9815 Value *PredCond;
9816 BasicBlock *TrueBB, *FalseBB;
9817 if (!match(PredBB->getTerminator(), m_Br(m_Value(PredCond), TrueBB, FalseBB)))
9818 return {nullptr, false};
9819
9820 // The branch should get simplified. Don't bother simplifying this condition.
9821 if (TrueBB == FalseBB)
9822 return {nullptr, false};
9823
9824 assert((TrueBB == ContextBB || FalseBB == ContextBB) &&
9825 "Predecessor block does not point to successor?");
9826
9827 // Is this condition implied by the predecessor condition?
9828 return {PredCond, TrueBB == ContextBB};
9829}
9830
9831std::optional<bool> llvm::isImpliedByDomCondition(const Value *Cond,
9832 const Instruction *ContextI,
9833 const DataLayout &DL) {
9834 assert(Cond->getType()->isIntOrIntVectorTy(1) && "Condition must be bool");
9835 auto PredCond = getDomPredecessorCondition(ContextI);
9836 if (PredCond.first)
9837 return isImpliedCondition(PredCond.first, Cond, DL, PredCond.second);
9838 return std::nullopt;
9839}
9840
9842 const Value *LHS,
9843 const Value *RHS,
9844 const Instruction *ContextI,
9845 const DataLayout &DL) {
9846 auto PredCond = getDomPredecessorCondition(ContextI);
9847 if (PredCond.first)
9848 return isImpliedCondition(PredCond.first, Pred, LHS, RHS, DL,
9849 PredCond.second);
9850 return std::nullopt;
9851}
9852
9854 APInt &Upper, const InstrInfoQuery &IIQ,
9855 bool PreferSignedRange) {
9856 unsigned Width = Lower.getBitWidth();
9857 const APInt *C;
9858 switch (BO.getOpcode()) {
9859 case Instruction::Sub:
9860 if (match(BO.getOperand(0), m_APInt(C))) {
9861 bool HasNSW = IIQ.hasNoSignedWrap(&BO);
9862 bool HasNUW = IIQ.hasNoUnsignedWrap(&BO);
9863
9864 // If the caller expects a signed compare, then try to use a signed range.
9865 // Otherwise if both no-wraps are set, use the unsigned range because it
9866 // is never larger than the signed range. Example:
9867 // "sub nuw nsw i8 -2, x" is unsigned [0, 254] vs. signed [-128, 126].
9868 // "sub nuw nsw i8 2, x" is unsigned [0, 2] vs. signed [-125, 127].
9869 if (PreferSignedRange && HasNSW && HasNUW)
9870 HasNUW = false;
9871
9872 if (HasNUW) {
9873 // 'sub nuw c, x' produces [0, C].
9874 Upper = *C + 1;
9875 } else if (HasNSW) {
9876 if (C->isNegative()) {
9877 // 'sub nsw -C, x' produces [SINT_MIN, -C - SINT_MIN].
9879 Upper = *C - APInt::getSignedMaxValue(Width);
9880 } else {
9881 // Note that sub 0, INT_MIN is not NSW. It techically is a signed wrap
9882 // 'sub nsw C, x' produces [C - SINT_MAX, SINT_MAX].
9883 Lower = *C - APInt::getSignedMaxValue(Width);
9885 }
9886 }
9887 }
9888 break;
9889 case Instruction::Add:
9890 if (match(BO.getOperand(1), m_APInt(C)) && !C->isZero()) {
9891 bool HasNSW = IIQ.hasNoSignedWrap(&BO);
9892 bool HasNUW = IIQ.hasNoUnsignedWrap(&BO);
9893
9894 // If the caller expects a signed compare, then try to use a signed
9895 // range. Otherwise if both no-wraps are set, use the unsigned range
9896 // because it is never larger than the signed range. Example: "add nuw
9897 // nsw i8 X, -2" is unsigned [254,255] vs. signed [-128, 125].
9898 if (PreferSignedRange && HasNSW && HasNUW)
9899 HasNUW = false;
9900
9901 if (HasNUW) {
9902 // 'add nuw x, C' produces [C, UINT_MAX].
9903 Lower = *C;
9904 } else if (HasNSW) {
9905 if (C->isNegative()) {
9906 // 'add nsw x, -C' produces [SINT_MIN, SINT_MAX - C].
9908 Upper = APInt::getSignedMaxValue(Width) + *C + 1;
9909 } else {
9910 // 'add nsw x, +C' produces [SINT_MIN + C, SINT_MAX].
9911 Lower = APInt::getSignedMinValue(Width) + *C;
9912 Upper = APInt::getSignedMaxValue(Width) + 1;
9913 }
9914 }
9915 }
9916 break;
9917
9918 case Instruction::And:
9919 if (match(BO.getOperand(1), m_APInt(C)))
9920 // 'and x, C' produces [0, C].
9921 Upper = *C + 1;
9922 // X & -X is a power of two or zero. So we can cap the value at max power of
9923 // two.
9924 if (match(BO.getOperand(0), m_Neg(m_Specific(BO.getOperand(1)))) ||
9925 match(BO.getOperand(1), m_Neg(m_Specific(BO.getOperand(0)))))
9926 Upper = APInt::getSignedMinValue(Width) + 1;
9927 break;
9928
9929 case Instruction::Or:
9930 if (match(BO.getOperand(1), m_APInt(C)))
9931 // 'or x, C' produces [C, UINT_MAX].
9932 Lower = *C;
9933 break;
9934
9935 case Instruction::AShr:
9936 if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
9937 // 'ashr x, C' produces [INT_MIN >> C, INT_MAX >> C].
9939 Upper = APInt::getSignedMaxValue(Width).ashr(*C) + 1;
9940 } else if (match(BO.getOperand(0), m_APInt(C))) {
9941 unsigned ShiftAmount = Width - 1;
9942 if (!C->isZero() && IIQ.isExact(&BO))
9943 ShiftAmount = C->countr_zero();
9944 if (C->isNegative()) {
9945 // 'ashr C, x' produces [C, C >> (Width-1)]
9946 Lower = *C;
9947 Upper = C->ashr(ShiftAmount) + 1;
9948 } else {
9949 // 'ashr C, x' produces [C >> (Width-1), C]
9950 Lower = C->ashr(ShiftAmount);
9951 Upper = *C + 1;
9952 }
9953 }
9954 break;
9955
9956 case Instruction::LShr:
9957 if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
9958 // 'lshr x, C' produces [0, UINT_MAX >> C].
9959 Upper = APInt::getAllOnes(Width).lshr(*C) + 1;
9960 } else if (match(BO.getOperand(0), m_APInt(C))) {
9961 // 'lshr C, x' produces [C >> (Width-1), C].
9962 unsigned ShiftAmount = Width - 1;
9963 if (!C->isZero() && IIQ.isExact(&BO))
9964 ShiftAmount = C->countr_zero();
9965 Lower = C->lshr(ShiftAmount);
9966 Upper = *C + 1;
9967 }
9968 break;
9969
9970 case Instruction::Shl:
9971 if (match(BO.getOperand(0), m_APInt(C))) {
9972 if (IIQ.hasNoUnsignedWrap(&BO)) {
9973 // 'shl nuw C, x' produces [C, C << CLZ(C)]
9974 Lower = *C;
9975 Upper = Lower.shl(Lower.countl_zero()) + 1;
9976 } else if (BO.hasNoSignedWrap()) { // TODO: What if both nuw+nsw?
9977 if (C->isNegative()) {
9978 // 'shl nsw C, x' produces [C << CLO(C)-1, C]
9979 unsigned ShiftAmount = C->countl_one() - 1;
9980 Lower = C->shl(ShiftAmount);
9981 Upper = *C + 1;
9982 } else {
9983 // 'shl nsw C, x' produces [C, C << CLZ(C)-1]
9984 unsigned ShiftAmount = C->countl_zero() - 1;
9985 Lower = *C;
9986 Upper = C->shl(ShiftAmount) + 1;
9987 }
9988 } else {
9989 // If lowbit is set, value can never be zero.
9990 if ((*C)[0])
9991 Lower = APInt::getOneBitSet(Width, 0);
9992 // If we are shifting a constant the largest it can be is if the longest
9993 // sequence of consecutive ones is shifted to the highbits (breaking
9994 // ties for which sequence is higher). At the moment we take a liberal
9995 // upper bound on this by just popcounting the constant.
9996 // TODO: There may be a bitwise trick for it longest/highest
9997 // consecutative sequence of ones (naive method is O(Width) loop).
9998 Upper = APInt::getHighBitsSet(Width, C->popcount()) + 1;
9999 }
10000 } else if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
10001 Upper = APInt::getBitsSetFrom(Width, C->getZExtValue()) + 1;
10002 }
10003 break;
10004
10005 case Instruction::SDiv:
10006 if (match(BO.getOperand(1), m_APInt(C))) {
10007 APInt IntMin = APInt::getSignedMinValue(Width);
10008 APInt IntMax = APInt::getSignedMaxValue(Width);
10009 if (C->isAllOnes()) {
10010 // 'sdiv x, -1' produces [INT_MIN + 1, INT_MAX]
10011 // where C != -1 and C != 0 and C != 1
10012 Lower = IntMin + 1;
10013 Upper = IntMax + 1;
10014 } else if (C->countl_zero() < Width - 1) {
10015 // 'sdiv x, C' produces [INT_MIN / C, INT_MAX / C]
10016 // where C != -1 and C != 0 and C != 1
10017 Lower = IntMin.sdiv(*C);
10018 Upper = IntMax.sdiv(*C);
10019 if (Lower.sgt(Upper))
10021 Upper = Upper + 1;
10022 assert(Upper != Lower && "Upper part of range has wrapped!");
10023 }
10024 } else if (match(BO.getOperand(0), m_APInt(C))) {
10025 if (C->isMinSignedValue()) {
10026 // 'sdiv INT_MIN, x' produces [INT_MIN, INT_MIN / -2].
10027 Lower = *C;
10028 Upper = Lower.lshr(1) + 1;
10029 } else {
10030 // 'sdiv C, x' produces [-|C|, |C|].
10031 Upper = C->abs() + 1;
10032 Lower = (-Upper) + 1;
10033 }
10034 }
10035 break;
10036
10037 case Instruction::UDiv:
10038 if (match(BO.getOperand(1), m_APInt(C)) && !C->isZero()) {
10039 // 'udiv x, C' produces [0, UINT_MAX / C].
10040 Upper = APInt::getMaxValue(Width).udiv(*C) + 1;
10041 } else if (match(BO.getOperand(0), m_APInt(C))) {
10042 // 'udiv C, x' produces [0, C].
10043 Upper = *C + 1;
10044 }
10045 break;
10046
10047 case Instruction::SRem:
10048 if (match(BO.getOperand(1), m_APInt(C))) {
10049 // 'srem x, C' produces (-|C|, |C|).
10050 Upper = C->abs();
10051 Lower = (-Upper) + 1;
10052 } else if (match(BO.getOperand(0), m_APInt(C))) {
10053 if (C->isNegative()) {
10054 // 'srem -|C|, x' produces [-|C|, 0].
10055 Upper = 1;
10056 Lower = *C;
10057 } else {
10058 // 'srem |C|, x' produces [0, |C|].
10059 Upper = *C + 1;
10060 }
10061 }
10062 break;
10063
10064 case Instruction::URem:
10065 if (match(BO.getOperand(1), m_APInt(C)))
10066 // 'urem x, C' produces [0, C).
10067 Upper = *C;
10068 else if (match(BO.getOperand(0), m_APInt(C)))
10069 // 'urem C, x' produces [0, C].
10070 Upper = *C + 1;
10071 break;
10072
10073 default:
10074 break;
10075 }
10076}
10077
10079 bool UseInstrInfo) {
10080 unsigned Width = II.getType()->getScalarSizeInBits();
10081 const APInt *C;
10082 switch (II.getIntrinsicID()) {
10083 case Intrinsic::ctlz:
10084 case Intrinsic::cttz: {
10085 APInt Upper(Width, Width);
10086 if (!UseInstrInfo || !match(II.getArgOperand(1), m_One()))
10087 Upper += 1;
10088 // Maximum of set/clear bits is the bit width.
10090 }
10091 case Intrinsic::ctpop:
10092 // Maximum of set/clear bits is the bit width.
10094 APInt(Width, Width) + 1);
10095 case Intrinsic::uadd_sat:
10096 // uadd.sat(x, C) produces [C, UINT_MAX].
10097 if (match(II.getOperand(0), m_APInt(C)) ||
10098 match(II.getOperand(1), m_APInt(C)))
10100 break;
10101 case Intrinsic::sadd_sat:
10102 if (match(II.getOperand(0), m_APInt(C)) ||
10103 match(II.getOperand(1), m_APInt(C))) {
10104 if (C->isNegative())
10105 // sadd.sat(x, -C) produces [SINT_MIN, SINT_MAX + (-C)].
10107 APInt::getSignedMaxValue(Width) + *C +
10108 1);
10109
10110 // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
10112 APInt::getSignedMaxValue(Width) + 1);
10113 }
10114 break;
10115 case Intrinsic::usub_sat:
10116 // usub.sat(C, x) produces [0, C].
10117 if (match(II.getOperand(0), m_APInt(C)))
10118 return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
10119
10120 // usub.sat(x, C) produces [0, UINT_MAX - C].
10121 if (match(II.getOperand(1), m_APInt(C)))
10123 APInt::getMaxValue(Width) - *C + 1);
10124 break;
10125 case Intrinsic::ssub_sat:
10126 if (match(II.getOperand(0), m_APInt(C))) {
10127 if (C->isNegative())
10128 // ssub.sat(-C, x) produces [SINT_MIN, -SINT_MIN + (-C)].
10130 *C - APInt::getSignedMinValue(Width) +
10131 1);
10132
10133 // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
10135 APInt::getSignedMaxValue(Width) + 1);
10136 } else if (match(II.getOperand(1), m_APInt(C))) {
10137 if (C->isNegative())
10138 // ssub.sat(x, -C) produces [SINT_MIN - (-C), SINT_MAX]:
10140 APInt::getSignedMaxValue(Width) + 1);
10141
10142 // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
10144 APInt::getSignedMaxValue(Width) - *C +
10145 1);
10146 }
10147 break;
10148 case Intrinsic::umin:
10149 case Intrinsic::umax:
10150 case Intrinsic::smin:
10151 case Intrinsic::smax:
10152 if (!match(II.getOperand(0), m_APInt(C)) &&
10153 !match(II.getOperand(1), m_APInt(C)))
10154 break;
10155
10156 switch (II.getIntrinsicID()) {
10157 case Intrinsic::umin:
10158 return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
10159 case Intrinsic::umax:
10161 case Intrinsic::smin:
10163 *C + 1);
10164 case Intrinsic::smax:
10166 APInt::getSignedMaxValue(Width) + 1);
10167 default:
10168 llvm_unreachable("Must be min/max intrinsic");
10169 }
10170 break;
10171 case Intrinsic::abs:
10172 // If abs of SIGNED_MIN is poison, then the result is [0..SIGNED_MAX],
10173 // otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
10174 if (match(II.getOperand(1), m_One()))
10176 APInt::getSignedMaxValue(Width) + 1);
10177
10179 APInt::getSignedMinValue(Width) + 1);
10180 case Intrinsic::vscale:
10181 if (!II.getParent() || !II.getFunction())
10182 break;
10183 return getVScaleRange(II.getFunction(), Width);
10184 default:
10185 break;
10186 }
10187
10188 return ConstantRange::getFull(Width);
10189}
10190
10192 const InstrInfoQuery &IIQ) {
10193 unsigned BitWidth = SI.getType()->getScalarSizeInBits();
10194 const Value *LHS = nullptr, *RHS = nullptr;
10196 if (R.Flavor == SPF_UNKNOWN)
10197 return ConstantRange::getFull(BitWidth);
10198
10199 if (R.Flavor == SelectPatternFlavor::SPF_ABS) {
10200 // If the negation part of the abs (in RHS) has the NSW flag,
10201 // then the result of abs(X) is [0..SIGNED_MAX],
10202 // otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
10203 if (match(RHS, m_Neg(m_Specific(LHS))) &&
10207
10210 }
10211
10212 if (R.Flavor == SelectPatternFlavor::SPF_NABS) {
10213 // The result of -abs(X) is <= 0.
10215 APInt(BitWidth, 1));
10216 }
10217
10218 const APInt *C;
10219 if (!match(LHS, m_APInt(C)) && !match(RHS, m_APInt(C)))
10220 return ConstantRange::getFull(BitWidth);
10221
10222 switch (R.Flavor) {
10223 case SPF_UMIN:
10225 case SPF_UMAX:
10227 case SPF_SMIN:
10229 *C + 1);
10230 case SPF_SMAX:
10233 default:
10234 return ConstantRange::getFull(BitWidth);
10235 }
10236}
10237
10239 // The maximum representable value of a half is 65504. For floats the maximum
10240 // value is 3.4e38 which requires roughly 129 bits.
10241 unsigned BitWidth = I->getType()->getScalarSizeInBits();
10242 if (!I->getOperand(0)->getType()->getScalarType()->isHalfTy())
10243 return;
10244 if (isa<FPToSIInst>(I) && BitWidth >= 17) {
10245 Lower = APInt(BitWidth, -65504, true);
10246 Upper = APInt(BitWidth, 65505);
10247 }
10248
10249 if (isa<FPToUIInst>(I) && BitWidth >= 16) {
10250 // For a fptoui the lower limit is left as 0.
10251 Upper = APInt(BitWidth, 65505);
10252 }
10253}
10254
10256 bool UseInstrInfo, AssumptionCache *AC,
10257 const Instruction *CtxI,
10258 const DominatorTree *DT,
10259 unsigned Depth) {
10260 assert(V->getType()->isIntOrIntVectorTy() && "Expected integer instruction");
10261
10263 return ConstantRange::getFull(V->getType()->getScalarSizeInBits());
10264
10265 if (auto *C = dyn_cast<Constant>(V))
10266 return C->toConstantRange();
10267
10268 unsigned BitWidth = V->getType()->getScalarSizeInBits();
10269 InstrInfoQuery IIQ(UseInstrInfo);
10270 ConstantRange CR = ConstantRange::getFull(BitWidth);
10271 if (auto *BO = dyn_cast<BinaryOperator>(V)) {
10272 APInt Lower = APInt(BitWidth, 0);
10273 APInt Upper = APInt(BitWidth, 0);
10274 // TODO: Return ConstantRange.
10275 setLimitsForBinOp(*BO, Lower, Upper, IIQ, ForSigned);
10277 } else if (auto *II = dyn_cast<IntrinsicInst>(V))
10278 CR = getRangeForIntrinsic(*II, UseInstrInfo);
10279 else if (auto *SI = dyn_cast<SelectInst>(V)) {
10281 SI->getTrueValue(), ForSigned, UseInstrInfo, AC, CtxI, DT, Depth + 1);
10283 SI->getFalseValue(), ForSigned, UseInstrInfo, AC, CtxI, DT, Depth + 1);
10284 CR = CRTrue.unionWith(CRFalse);
10286 } else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V)) {
10287 APInt Lower = APInt(BitWidth, 0);
10288 APInt Upper = APInt(BitWidth, 0);
10289 // TODO: Return ConstantRange.
10292 } else if (const auto *A = dyn_cast<Argument>(V))
10293 if (std::optional<ConstantRange> Range = A->getRange())
10294 CR = *Range;
10295
10296 if (auto *I = dyn_cast<Instruction>(V)) {
10297 if (auto *Range = IIQ.getMetadata(I, LLVMContext::MD_range))
10299
10300 if (const auto *CB = dyn_cast<CallBase>(V))
10301 if (std::optional<ConstantRange> Range = CB->getRange())
10302 CR = CR.intersectWith(*Range);
10303 }
10304
10305 if (CtxI && AC) {
10306 // Try to restrict the range based on information from assumptions.
10307 for (auto &AssumeVH : AC->assumptionsFor(V)) {
10308 if (!AssumeVH)
10309 continue;
10310 CallInst *I = cast<CallInst>(AssumeVH);
10311 assert(I->getParent()->getParent() == CtxI->getParent()->getParent() &&
10312 "Got assumption for the wrong function!");
10313 assert(I->getIntrinsicID() == Intrinsic::assume &&
10314 "must be an assume intrinsic");
10315
10316 if (!isValidAssumeForContext(I, CtxI, DT))
10317 continue;
10318 Value *Arg = I->getArgOperand(0);
10319 ICmpInst *Cmp = dyn_cast<ICmpInst>(Arg);
10320 // Currently we just use information from comparisons.
10321 if (!Cmp || Cmp->getOperand(0) != V)
10322 continue;
10323 // TODO: Set "ForSigned" parameter via Cmp->isSigned()?
10324 ConstantRange RHS =
10325 computeConstantRange(Cmp->getOperand(1), /* ForSigned */ false,
10326 UseInstrInfo, AC, I, DT, Depth + 1);
10327 CR = CR.intersectWith(
10328 ConstantRange::makeAllowedICmpRegion(Cmp->getPredicate(), RHS));
10329 }
10330 }
10331
10332 return CR;
10333}
10334
10335static void
10337 function_ref<void(Value *)> InsertAffected) {
10338 assert(V != nullptr);
10339 if (isa<Argument>(V) || isa<GlobalValue>(V)) {
10340 InsertAffected(V);
10341 } else if (auto *I = dyn_cast<Instruction>(V)) {
10342 InsertAffected(V);
10343
10344 // Peek through unary operators to find the source of the condition.
10345 Value *Op;
10347 m_Trunc(m_Value(Op))))) {
10349 InsertAffected(Op);
10350 }
10351 }
10352}
10353
10355 Value *Cond, bool IsAssume, function_ref<void(Value *)> InsertAffected) {
10356 auto AddAffected = [&InsertAffected](Value *V) {
10357 addValueAffectedByCondition(V, InsertAffected);
10358 };
10359
10360 auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS) {
10361 if (IsAssume) {
10362 AddAffected(LHS);
10363 AddAffected(RHS);
10364 } else if (match(RHS, m_Constant()))
10365 AddAffected(LHS);
10366 };
10367
10368 SmallVector<Value *, 8> Worklist;
10370 Worklist.push_back(Cond);
10371 while (!Worklist.empty()) {
10372 Value *V = Worklist.pop_back_val();
10373 if (!Visited.insert(V).second)
10374 continue;
10375
10376 CmpPredicate Pred;
10377 Value *A, *B, *X;
10378
10379 if (IsAssume) {
10380 AddAffected(V);
10381 if (match(V, m_Not(m_Value(X))))
10382 AddAffected(X);
10383 }
10384
10385 if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
10386 // assume(A && B) is split to -> assume(A); assume(B);
10387 // assume(!(A || B)) is split to -> assume(!A); assume(!B);
10388 // Finally, assume(A || B) / assume(!(A && B)) generally don't provide
10389 // enough information to be worth handling (intersection of information as
10390 // opposed to union).
10391 if (!IsAssume) {
10392 Worklist.push_back(A);
10393 Worklist.push_back(B);
10394 }
10395 } else if (match(V, m_ICmp(Pred, m_Value(A), m_Value(B)))) {
10396 bool HasRHSC = match(B, m_ConstantInt());
10397 if (ICmpInst::isEquality(Pred)) {
10398 AddAffected(A);
10399 if (IsAssume)
10400 AddAffected(B);
10401 if (HasRHSC) {
10402 Value *Y;
10403 // (X << C) or (X >>_s C) or (X >>_u C).
10404 if (match(A, m_Shift(m_Value(X), m_ConstantInt())))
10405 AddAffected(X);
10406 // (X & C) or (X | C).
10407 else if (match(A, m_And(m_Value(X), m_Value(Y))) ||
10408 match(A, m_Or(m_Value(X), m_Value(Y)))) {
10409 AddAffected(X);
10410 AddAffected(Y);
10411 }
10412 // X - Y
10413 else if (match(A, m_Sub(m_Value(X), m_Value(Y)))) {
10414 AddAffected(X);
10415 AddAffected(Y);
10416 }
10417 }
10418 } else {
10419 AddCmpOperands(A, B);
10420 if (HasRHSC) {
10421 // Handle (A + C1) u< C2, which is the canonical form of
10422 // A > C3 && A < C4.
10424 AddAffected(X);
10425
10426 if (ICmpInst::isUnsigned(Pred)) {
10427 Value *Y;
10428 // X & Y u> C -> X >u C && Y >u C
10429 // X | Y u< C -> X u< C && Y u< C
10430 // X nuw+ Y u< C -> X u< C && Y u< C
10431 if (match(A, m_And(m_Value(X), m_Value(Y))) ||
10432 match(A, m_Or(m_Value(X), m_Value(Y))) ||
10433 match(A, m_NUWAdd(m_Value(X), m_Value(Y)))) {
10434 AddAffected(X);
10435 AddAffected(Y);
10436 }
10437 // X nuw- Y u> C -> X u> C
10438 if (match(A, m_NUWSub(m_Value(X), m_Value())))
10439 AddAffected(X);
10440 }
10441 }
10442
10443 // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
10444 // by computeKnownFPClass().
10446 if (Pred == ICmpInst::ICMP_SLT && match(B, m_Zero()))
10447 InsertAffected(X);
10448 else if (Pred == ICmpInst::ICMP_SGT && match(B, m_AllOnes()))
10449 InsertAffected(X);
10450 }
10451 }
10452
10453 if (HasRHSC && match(A, m_Intrinsic<Intrinsic::ctpop>(m_Value(X))))
10454 AddAffected(X);
10455 } else if (match(V, m_FCmp(Pred, m_Value(A), m_Value(B)))) {
10456 AddCmpOperands(A, B);
10457
10458 // fcmp fneg(x), y
10459 // fcmp fabs(x), y
10460 // fcmp fneg(fabs(x)), y
10461 if (match(A, m_FNeg(m_Value(A))))
10462 AddAffected(A);
10463 if (match(A, m_FAbs(m_Value(A))))
10464 AddAffected(A);
10465
10467 m_Value()))) {
10468 // Handle patterns that computeKnownFPClass() support.
10469 AddAffected(A);
10470 } else if (!IsAssume && match(V, m_Trunc(m_Value(X)))) {
10471 // Assume is checked here as X is already added above for assumes in
10472 // addValueAffectedByCondition
10473 AddAffected(X);
10474 } else if (!IsAssume && match(V, m_Not(m_Value(X)))) {
10475 // Assume is checked here to avoid issues with ephemeral values
10476 Worklist.push_back(X);
10477 }
10478 }
10479}
10480
10482 // (X >> C) or/add (X & mask(C) != 0)
10483 if (const auto *BO = dyn_cast<BinaryOperator>(V)) {
10484 if (BO->getOpcode() == Instruction::Add ||
10485 BO->getOpcode() == Instruction::Or) {
10486 const Value *X;
10487 const APInt *C1, *C2;
10488 if (match(BO, m_c_BinOp(m_LShr(m_Value(X), m_APInt(C1)),
10492 m_Zero())))) &&
10493 C2->popcount() == C1->getZExtValue())
10494 return X;
10495 }
10496 }
10497 return nullptr;
10498}
10499
10501 return const_cast<Value *>(stripNullTest(const_cast<const Value *>(V)));
10502}
10503
10506 unsigned MaxCount, bool AllowUndefOrPoison) {
10509 auto Push = [&](const Value *V) -> bool {
10510 Constant *C;
10511 if (match(const_cast<Value *>(V), m_ImmConstant(C))) {
10512 if (!AllowUndefOrPoison && !isGuaranteedNotToBeUndefOrPoison(C))
10513 return false;
10514 // Check existence first to avoid unnecessary allocations.
10515 if (Constants.contains(C))
10516 return true;
10517 if (Constants.size() == MaxCount)
10518 return false;
10519 Constants.insert(C);
10520 return true;
10521 }
10522
10523 if (auto *Inst = dyn_cast<Instruction>(V)) {
10524 if (Visited.insert(Inst).second)
10525 Worklist.push_back(Inst);
10526 return true;
10527 }
10528 return false;
10529 };
10530 if (!Push(V))
10531 return false;
10532 while (!Worklist.empty()) {
10533 const Instruction *CurInst = Worklist.pop_back_val();
10534 switch (CurInst->getOpcode()) {
10535 case Instruction::Select:
10536 if (!Push(CurInst->getOperand(1)))
10537 return false;
10538 if (!Push(CurInst->getOperand(2)))
10539 return false;
10540 break;
10541 case Instruction::PHI:
10542 for (Value *IncomingValue : cast<PHINode>(CurInst)->incoming_values()) {
10543 // Fast path for recurrence PHI.
10544 if (IncomingValue == CurInst)
10545 continue;
10546 if (!Push(IncomingValue))
10547 return false;
10548 }
10549 break;
10550 default:
10551 return false;
10552 }
10553 }
10554 return true;
10555}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Utilities for dealing with flags related to floating point properties and mode controls.
static Value * getCondition(Instruction *I)
Hexagon Common GEP
Module.h This file contains the declarations for the Module class.
static bool hasNoUnsignedWrap(BinaryOperator &I)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
PowerPC Reduce CR logical Operation
R600 Clause Merge
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
std::pair< BasicBlock *, BasicBlock * > Edge
This file contains some templates that are useful if you are working with the STL at all.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition VPlanSLP.cpp:247
static SmallVector< VPValue *, 4 > getOperands(ArrayRef< VPValue * > Values, unsigned OperandIndex)
Definition VPlanSLP.cpp:210
static void computeKnownFPClassFromCond(const Value *V, Value *Cond, bool CondIsTrue, const Instruction *CxtI, KnownFPClass &KnownFromContext, unsigned Depth=0)
static bool isPowerOfTwoRecurrence(const PHINode *PN, bool OrZero, SimplifyQuery &Q, unsigned Depth)
Try to detect a recurrence that the value of the induction variable is always a power of two (or zero...
static cl::opt< unsigned > DomConditionsMaxUses("dom-conditions-max-uses", cl::Hidden, cl::init(20))
static unsigned computeNumSignBitsVectorConstant(const Value *V, const APInt &DemandedElts, unsigned TyBits)
For vector constants, loop over the elements and find the constant with the minimum number of sign bi...
static bool isTruePredicate(CmpInst::Predicate Pred, const Value *LHS, const Value *RHS)
Return true if "icmp Pred LHS RHS" is always true.
static bool isModifyingBinopOfNonZero(const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
Return true if V1 == (binop V2, X), where X is known non-zero.
static bool isGEPKnownNonNull(const GEPOperator *GEP, const SimplifyQuery &Q, unsigned Depth)
Test whether a GEP's result is known to be non-null.
static bool isNonEqualShl(const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
Return true if V2 == V1 << C, where V1 is known non-zero, C is not 0 and the shift is nuw or nsw.
static bool isKnownNonNullFromDominatingCondition(const Value *V, const Instruction *CtxI, const DominatorTree *DT)
static const Value * getUnderlyingObjectFromInt(const Value *V)
This is the function that does the work of looking through basic ptrtoint+arithmetic+inttoptr sequenc...
static bool isNonZeroMul(const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, bool NSW, bool NUW, unsigned Depth)
static bool rangeMetadataExcludesValue(const MDNode *Ranges, const APInt &Value)
Does the 'Range' metadata (which must be a valid MD_range operand list) ensure that the value it's at...
static KnownBits getKnownBitsFromAndXorOr(const Operator *I, const APInt &DemandedElts, const KnownBits &KnownLHS, const KnownBits &KnownRHS, const SimplifyQuery &Q, unsigned Depth)
static void breakSelfRecursivePHI(const Use *U, const PHINode *PHI, Value *&ValOut, Instruction *&CtxIOut, const PHINode **PhiOut=nullptr)
static bool isNonZeroSub(const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, unsigned Depth)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static void addValueAffectedByCondition(Value *V, function_ref< void(Value *)> InsertAffected)
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static bool haveNoCommonBitsSetSpecialCases(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
static void setLimitsForBinOp(const BinaryOperator &BO, APInt &Lower, APInt &Upper, const InstrInfoQuery &IIQ, bool PreferSignedRange)
static Value * lookThroughCast(CmpInst *CmpI, Value *V1, Value *V2, Instruction::CastOps *CastOp)
Helps to match a select pattern in case of a type mismatch.
static std::pair< Value *, bool > getDomPredecessorCondition(const Instruction *ContextI)
static constexpr unsigned MaxInstrsToCheckForFree
Maximum number of instructions to check between assume and context instruction.
static bool isNonZeroShift(const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, const KnownBits &KnownVal, unsigned Depth)
static std::optional< bool > isImpliedCondFCmps(FCmpInst::Predicate LPred, const Value *L0, const Value *L1, FCmpInst::Predicate RPred, const Value *R0, const Value *R1, const DataLayout &DL, bool LHSIsTrue)
Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true.
UndefPoisonKind
static bool isKnownNonEqualFromContext(const Value *V1, const Value *V2, const SimplifyQuery &Q, unsigned Depth)
static bool includesPoison(UndefPoisonKind Kind)
static SelectPatternResult matchFastFloatClamp(CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS)
Match clamp pattern for float types without care about NaNs or signed zeros.
static std::optional< bool > isImpliedCondICmps(CmpPredicate LPred, const Value *L0, const Value *L1, CmpPredicate RPred, const Value *R0, const Value *R1, const DataLayout &DL, bool LHSIsTrue)
Return true if LHS implies RHS (expanded to its components as "R0 RPred R1") is true.
static bool includesUndef(UndefPoisonKind Kind)
static std::optional< bool > isImpliedCondCommonOperandWithCR(CmpPredicate LPred, const ConstantRange &LCR, CmpPredicate RPred, const ConstantRange &RCR)
Return true if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is true.
static ConstantRange getRangeForSelectPattern(const SelectInst &SI, const InstrInfoQuery &IIQ)
static void computeKnownBitsFromOperator(const Operator *I, const APInt &DemandedElts, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth)
static uint64_t GetStringLengthH(const Value *V, SmallPtrSetImpl< const PHINode * > &PHIs, unsigned CharSize)
If we can compute the length of the string pointed to by the specified pointer, return 'len+1'.
static void computeKnownBitsFromShiftOperator(const Operator *I, const APInt &DemandedElts, KnownBits &Known, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth, function_ref< KnownBits(const KnownBits &, const KnownBits &, bool)> KF)
Compute known bits from a shift operator, including those with a non-constant shift amount.
static bool onlyUsedByLifetimeMarkersOrDroppableInstsHelper(const Value *V, bool AllowLifetime, bool AllowDroppable)
static std::optional< bool > isImpliedCondAndOr(const Instruction *LHS, CmpPredicate RHSPred, const Value *RHSOp0, const Value *RHSOp1, const DataLayout &DL, bool LHSIsTrue, unsigned Depth)
Return true if LHS implies RHS is true.
static bool isSignedMinMaxClamp(const Value *Select, const Value *&In, const APInt *&CLow, const APInt *&CHigh)
static bool isNonZeroAdd(const APInt &DemandedElts, const SimplifyQuery &Q, unsigned BitWidth, Value *X, Value *Y, bool NSW, bool NUW, unsigned Depth)
static bool directlyImpliesPoison(const Value *ValAssumedPoison, const Value *V, unsigned Depth)
static bool isNonEqualSelect(const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
static bool matchTwoInputRecurrence(const PHINode *PN, InstTy *&Inst, Value *&Init, Value *&OtherOp)
static bool isNonEqualPHIs(const PHINode *PN1, const PHINode *PN2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
static void computeKnownBitsFromCmp(const Value *V, CmpInst::Predicate Pred, Value *LHS, Value *RHS, KnownBits &Known, const SimplifyQuery &Q)
static SelectPatternResult matchMinMaxOfMinMax(CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TVal, Value *FVal, unsigned Depth)
Recognize variations of: a < c ?
static void unionWithMinMaxIntrinsicClamp(const IntrinsicInst *II, KnownBits &Known)
static void setLimitForFPToI(const Instruction *I, APInt &Lower, APInt &Upper)
static bool isSameUnderlyingObjectInLoop(const PHINode *PN, const LoopInfo *LI)
PN defines a loop-variant pointer to an object.
static bool isNonEqualPointersWithRecursiveGEP(const Value *A, const Value *B, const SimplifyQuery &Q)
static bool isSignedMinMaxIntrinsicClamp(const IntrinsicInst *II, const APInt *&CLow, const APInt *&CHigh)
static Value * lookThroughCastConst(CmpInst *CmpI, Type *SrcTy, Constant *C, Instruction::CastOps *CastOp)
static bool handleGuaranteedWellDefinedOps(const Instruction *I, const CallableT &Handle)
Enumerates all operands of I that are guaranteed to not be undef or poison.
static void computeKnownBitsFromLerpPattern(const Value *Op0, const Value *Op1, const APInt &DemandedElts, KnownBits &KnownOut, const SimplifyQuery &Q, unsigned Depth)
Try to detect the lerp pattern: a * (b - c) + c * d where a >= 0, b >= 0, c >= 0, d >= 0,...
static KnownFPClass computeKnownFPClassFromContext(const Value *V, const SimplifyQuery &Q)
static void computeKnownBitsAddSub(bool Add, const Value *Op0, const Value *Op1, bool NSW, bool NUW, const APInt &DemandedElts, KnownBits &KnownOut, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth)
static Value * getNotValue(Value *V)
If the input value is the result of a 'not' op, constant integer, or vector splat of a constant integ...
static constexpr KnownFPClass::MinMaxKind getMinMaxKind(Intrinsic::ID IID)
static unsigned ComputeNumSignBitsImpl(const Value *V, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
Return the number of times the sign bit of the register is replicated into the other bits.
static void computeKnownBitsFromICmpCond(const Value *V, ICmpInst *Cmp, KnownBits &Known, const SimplifyQuery &SQ, bool Invert)
static bool isKnownNonZeroFromOperator(const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
static bool matchOpWithOpEqZero(Value *Op0, Value *Op1)
static bool isNonZeroRecurrence(const PHINode *PN)
Try to detect a recurrence that monotonically increases/decreases from a non-zero starting value.
static SelectPatternResult matchClamp(CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal)
Recognize variations of: CLAMP(v,l,h) ==> ((v) < (l) ?
static bool shiftAmountKnownInRange(const Value *ShiftAmount)
Shifts return poison if shiftwidth is larger than the bitwidth.
static bool isEphemeralValueOf(const Instruction *I, const Value *E)
static SelectPatternResult matchMinMax(CmpInst::Predicate Pred, Value *CmpLHS, Value *CmpRHS, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, unsigned Depth)
Match non-obvious integer minimum and maximum sequences.
static KnownBits computeKnownBitsForHorizontalOperation(const Operator *I, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth, const function_ref< KnownBits(const KnownBits &, const KnownBits &)> KnownBitsFunc)
static bool handleGuaranteedNonPoisonOps(const Instruction *I, const CallableT &Handle)
Enumerates all operands of I that are guaranteed to not be poison.
static std::optional< std::pair< Value *, Value * > > getInvertibleOperands(const Operator *Op1, const Operator *Op2)
If the pair of operators are the same invertible function, return the the operands of the function co...
static bool cmpExcludesZero(CmpInst::Predicate Pred, const Value *RHS)
static void computeKnownBitsFromCond(const Value *V, Value *Cond, KnownBits &Known, const SimplifyQuery &SQ, bool Invert, unsigned Depth)
static bool isKnownNonZeroFromAssume(const Value *V, const SimplifyQuery &Q)
static std::optional< bool > isImpliedCondOperands(CmpInst::Predicate Pred, const Value *ALHS, const Value *ARHS, const Value *BLHS, const Value *BRHS)
Return true if "icmp Pred BLHS BRHS" is true whenever "icmp PredALHS ARHS" is true.
static const Instruction * safeCxtI(const Value *V, const Instruction *CxtI)
static bool isNonEqualMul(const Value *V1, const Value *V2, const APInt &DemandedElts, const SimplifyQuery &Q, unsigned Depth)
Return true if V2 == V1 * C, where V1 is known non-zero, C is not 0/1 and the multiplication is nuw o...
static bool isImpliedToBeAPowerOfTwoFromCond(const Value *V, bool OrZero, const Value *Cond, bool CondIsTrue)
Return true if we can infer that V is known to be a power of 2 from dominating condition Cond (e....
static void computeKnownBitsMul(const Value *Op0, const Value *Op1, bool NSW, bool NUW, const APInt &DemandedElts, KnownBits &Known, KnownBits &Known2, const SimplifyQuery &Q, unsigned Depth)
static bool isKnownNonNaN(const Value *V, FastMathFlags FMF)
static ConstantRange getRangeForIntrinsic(const IntrinsicInst &II, bool UseInstrInfo)
static void computeKnownFPClassForFPTrunc(const Operator *Op, const APInt &DemandedElts, FPClassTest InterestedClasses, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth)
static Value * BuildSubAggregate(Value *From, Value *To, Type *IndexedType, SmallVectorImpl< unsigned > &Idxs, unsigned IdxSkip, BasicBlock::iterator InsertBefore)
Value * RHS
Value * LHS
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Definition APFloat.cpp:213
bool isFinite() const
Definition APFloat.h:1517
bool isNaN() const
Definition APFloat.h:1510
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1201
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1161
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition APFloat.h:1142
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1982
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1415
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1549
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1400
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1679
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1394
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:1339
unsigned ceilLogBase2() const
Definition APInt.h:1773
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1202
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:1183
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1677
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1497
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1112
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:1250
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1655
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1405
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:768
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1167
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1637
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1607
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1052
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
unsigned logBase2() const
Definition APInt.h:1770
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:828
bool getBoolValue() const
Convert APInt to a boolean value.
Definition APInt.h:472
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
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:1151
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:874
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1258
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1131
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1397
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1238
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:852
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1222
void clearSignBit()
Set the sign bit to 0.
Definition APInt.h:1458
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition ArrayRef.h:186
Class to represent array types.
This represents the llvm.assume intrinsic.
A cache of @llvm.assume calls within a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
LLVM_ABI unsigned getVScaleRangeMin() const
Returns the minimum value for the vscale_range attribute.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:223
LLVM_ABI bool isSingleEdge() const
Check if this is the only edge between Start and End.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:483
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:470
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
BinaryOps getOpcode() const
Definition InstrTypes.h:374
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
bool onlyReadsMemory(unsigned OpNo) const
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
unsigned arg_size() const
This class represents a function call, abstracting a target machine's calling convention.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:448
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:682
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:691
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:680
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:681
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:690
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:688
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:683
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:704
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:689
bool isSigned() const
Definition InstrTypes.h:930
static LLVM_ABI bool isEquality(Predicate pred)
Determine if this is an equals/not equals predicate.
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:942
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:770
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:789
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition InstrTypes.h:893
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:776
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:936
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
LLVM_ABI CmpInst::Predicate getPreferredSignedPredicate() const
Attempts to return a signed CmpInst::Predicate from the CmpPredicate.
CmpInst::Predicate dropSameSign() const
Drops samesign information.
bool hasSameSign() const
Query samesign information, for optimizations.
An array constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
Definition Constants.h:707
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:598
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition Constants.h:673
A vector constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
Definition Constants.h:781
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI std::optional< ConstantFPRange > makeExactFCmpRegion(FCmpInst::Predicate Pred, const APFloat &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:282
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI bool isAllNegative() const
Return true if all values in this range are negative.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI bool isAllNonNegative() const
Return true if all values in this range are non-negative.
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI OverflowResult signedAddMayOverflow(const ConstantRange &Other) const
Return whether signed add of the two ranges always/never overflows.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
LLVM_ABI bool isZeroValue() const
Return true if the value is negative zero or null value.
Definition Constants.cpp:76
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:214
unsigned getAddressSizeInBits(unsigned AS) const
The size in bits of an address in for the given AS.
Definition DataLayout.h:507
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:771
ArrayRef< BranchInst * > conditionsFor(const Value *V) const
Access the list of branches which affect this value.
DomTreeNodeBase * getIDom() const
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction extracts a struct member or array element value from an aggregate value.
ArrayRef< unsigned > getIndices() const
unsigned getNumIndices() const
static LLVM_ABI Type * getIndexedType(Type *Agg, ArrayRef< unsigned > Idxs)
Returns the type of the element that would be extracted with an extractvalue instruction with the spe...
This instruction compares its operands according to the predicate given to the constructor.
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition Operator.h:200
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:22
bool noSignedZeros() const
Definition FMF.h:67
bool noInfs() const
Definition FMF.h:66
void setNoSignedZeros(bool B=true)
Definition FMF.h:84
void setNoNaNs(bool B=true)
Definition FMF.h:78
bool noNaNs() const
Definition FMF.h:65
const BasicBlock & getEntryBlock() const
Definition Function.h:807
bool hasNoSync() const
Determine if the call can synchroize with other threads.
Definition Function.h:637
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
PointerType * getType() const
Global values are always pointers.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:132
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
This instruction compares its operands according to the predicate given to the constructor.
CmpPredicate getSwappedCmpPredicate() const
CmpPredicate getInverseCmpPredicate() const
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
static LLVM_ABI std::optional< bool > isImpliedByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
Determine if Pred1 implies Pred2 is true, false, or if nothing can be inferred about the implication,...
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
This instruction inserts a struct field of array element value into an aggregate value.
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
bool isBinaryOp() const
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isUnaryOp() const
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
An instruction for reading from memory.
Value * getPointerOperand()
Align getAlign() const
Return the alignment of the access that is being performed.
bool isLoopHeader(const BlockT *BB) const
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Metadata node.
Definition Metadata.h:1078
This is a utility class that provides an abstraction for the common functionality between Instruction...
Definition Operator.h:33
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Definition Operator.h:43
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition Operator.h:78
iterator_range< const_block_iterator > blocks() const
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A udiv, sdiv, lshr, or ashr instruction, which can be marked as "exact", indicating that no bits are ...
Definition Operator.h:154
bool isExact() const
Test whether this division is known to be exact, with zero remainder.
Definition Operator.h:173
This class represents the LLVM 'select' instruction.
const Value * getFalseValue() const
const Value * getCondition() const
const Value * getTrueValue() const
This instruction constructs a fixed permutation of two input vectors.
VectorType * getType() const
Overload to return most specific vector type.
static LLVM_ABI void getShuffleMask(const Constant *Mask, SmallVectorImpl< int > &Result)
Convert the input shuffle mask operand to a vector of integers.
size_type size() const
Definition SmallPtrSet.h:99
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:573
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:723
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:754
Class to represent struct types.
unsigned getNumElements() const
Random access to the elements.
Type * getElementType(unsigned N) const
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:297
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:296
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:153
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI uint64_t getArrayNumElements() const
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:294
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
Definition Type.cpp:295
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition Type.h:311
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:270
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
Definition Type.h:255
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
op_range operands()
Definition User.h:267
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
const Value * stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL, APInt &Offset) const
This is a wrapper around stripAndAccumulateConstantOffsets with the in-bounds requirement set to fals...
Definition Value.h:759
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
const KnownBits & getKnownBits(const SimplifyQuery &Q) const
Definition WithCache.h:59
PointerType getValue() const
Definition WithCache.h:57
Represents an op.with.overflow intrinsic.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
An efficient, type-erasing, non-owning reference to a callable.
TypeSize getSequentialElementStride(const DataLayout &DL) const
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
A range adaptor for a pair of iterators.
CallInst * Call
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3020
const APInt & umax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be unsigned.
Definition APInt.h:2272
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
auto m_PtrToIntOrAddr(const OpTy &Op)
Matches PtrToInt or PtrToAddr.
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
auto m_LogicalOp()
Matches either L && R or L || R where L and R are arbitrary values.
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
cst_pred_ty< is_power2_or_zero > m_Power2OrZero()
Match an integer or vector of 0 or power-of-2 values.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
auto match_fn(const Pattern &P)
A match functor that can be used as a UnaryPredicate in functional algorithms like all_of.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
match_combine_or< MaxMin_match< FCmpInst, LHS, RHS, ofmin_pred_ty >, MaxMin_match< FCmpInst, LHS, RHS, ufmin_pred_ty > > m_OrdOrUnordFMin(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point minimum function.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > m_c_SMin(const LHS &L, const RHS &R)
Matches an SMin with LHS and RHS in either order.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty, true > m_c_UMax(const LHS &L, const RHS &R)
Matches a UMax with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > m_c_UMin(const LHS &L, const RHS &R)
Matches a UMin with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
match_combine_or< MaxMin_match< FCmpInst, LHS, RHS, ofmax_pred_ty >, MaxMin_match< FCmpInst, LHS, RHS, ufmax_pred_ty > > m_OrdOrUnordFMax(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point maximum function.
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty, true > m_c_SMax(const LHS &L, const RHS &R)
Matches an SMax with LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
class_match< BasicBlock > m_BasicBlock()
Match an arbitrary basic block value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
cst_pred_ty< is_nonpositive > m_NonPositive()
Match an integer or vector of non-positive values.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > m_UMin(const LHS &L, const RHS &R)
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
static unsigned decodeVSEW(unsigned VSEW)
LLVM_ABI unsigned getSEWLMULRatio(unsigned SEW, VLMUL VLMul)
static constexpr unsigned RVVBitsPerBlock
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:667
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
LLVM_ABI bool haveNoCommonBitsSet(const WithCache< const Value * > &LHSCache, const WithCache< const Value * > &RHSCache, const SimplifyQuery &SQ)
Return true if LHS and RHS have no common bits set.
LLVM_ABI bool mustExecuteUBIfPoisonOnPathTo(Instruction *Root, Instruction *OnPathTo, DominatorTree *DT)
Return true if undefined behavior would provable be executed on the path to OnPathTo if Root produced...
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
LLVM_ABI bool willNotFreeBetween(const Instruction *Assume, const Instruction *CtxI)
Returns true, if no instruction between Assume and CtxI may free memory and the function is marked as...
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1737
MaybeAlign getAlign(const CallInst &I, unsigned Index)
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1667
LLVM_ABI bool canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
LLVM_ABI bool mustTriggerUB(const Instruction *I, const SmallPtrSetImpl< const Value * > &KnownPoison)
Return true if the given instruction must trigger undefined behavior when I is executed with any oper...
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI void computeKnownBitsFromContext(const Value *V, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0)
Merge bits known from context-dependent facts into Known.
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
LLVM_ABI const Value * getArgumentAliasingToReturnedPointer(const CallBase *Call, bool MustPreserveNullness)
This function returns call pointer argument that is considered the same by aliasing rules.
LLVM_ABI bool isAssumeLikeIntrinsic(const Instruction *I)
Return true if it is an intrinsic that cannot be speculated but also cannot trap.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2544
LLVM_ABI AllocaInst * findAllocaForValue(Value *V, bool OffsetZero=false)
Returns unique alloca where the value comes from, or nullptr.
LLVM_ABI APInt getMinMaxLimit(SelectPatternFlavor SPF, unsigned BitWidth)
Return the minimum or maximum constant value for the specified integer min/max flavor and type.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool isOnlyUsedInZeroComparison(const Instruction *CxtI)
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
LLVM_ABI bool onlyUsedByLifetimeMarkersOrDroppableInsts(const Value *V)
Return true if the only users of this pointer are lifetime markers or droppable instructions.
LLVM_ABI Constant * ReadByteArrayFromGlobal(const GlobalVariable *GV, uint64_t Offset)
LLVM_ABI Value * stripNullTest(Value *V)
Returns the inner value X if the expression has the form f(X) where f(X) == 0 if and only if X == 0,...
LLVM_ABI bool getUnderlyingObjectsForCodeGen(const Value *V, SmallVectorImpl< Value * > &Objects)
This is a wrapper around getUnderlyingObjects and adds support for basic ptrtoint+arithmetic+inttoptr...
LLVM_ABI std::pair< Intrinsic::ID, bool > canConvertToMinOrMaxIntrinsic(ArrayRef< Value * > VL)
Check if the values in VL are select instructions that can be converted to a min or max (vector) intr...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:303
LLVM_ABI bool isGuaranteedToExecuteForEveryIteration(const Instruction *I, const Loop *L)
Return true if this function can prove that the instruction I is executed for every iteration of the ...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2198
LLVM_ABI bool mustSuppressSpeculation(const LoadInst &LI)
Return true if speculation of the given load must be suppressed to avoid ordering or interfering with...
Definition Loads.cpp:420
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:284
gep_type_iterator gep_type_end(const User *GEP)
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1597
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
LLVM_ABI CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:337
LLVM_ABI bool canIgnoreSignBitOfZero(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is zero.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
std::tuple< Value *, FPClassTest, FPClassTest > fcmpImpliesClass(CmpInst::Predicate Pred, const Function &F, Value *LHS, FPClassTest RHSClass, bool LookThroughSrc=true)
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
const Value * getPointerOperand(const Value *V)
A helper function that returns the pointer operand of a load, store or GEP instruction.
LLVM_ABI bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
LLVM_ABI bool isOverflowIntrinsicNoWrap(const WithOverflowInst *WO, const DominatorTree &DT)
Returns true if the arithmetic part of the WO 's result is used only along the paths control dependen...
LLVM_ABI RetainedKnowledge getKnowledgeFromBundle(AssumeInst &Assume, const CallBase::BundleOpInfo &BOI)
This extracts the Knowledge from an element of an operand bundle.
LLVM_ABI bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1744
LLVM_ABI OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ, bool IsNSW=false)
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
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
bool isGuard(const User *U)
Returns true iff U has semantics of a guard expressed in a form of call of llvm.experimental....
LLVM_ABI SelectPatternFlavor getInverseMinMaxFlavor(SelectPatternFlavor SPF)
Return the inverse minimum/maximum flavor of the specified flavor.
constexpr unsigned MaxAnalysisRecursionDepth
LLVM_ABI void adjustKnownBitsForSelectArm(KnownBits &Known, Value *Cond, Value *Arm, bool Invert, const SimplifyQuery &Q, unsigned Depth=0)
Adjust Known for the given select Arm to include information from the select Cond.
LLVM_ABI bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
LLVM_ABI OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UMIN
Signed minimum.
@ SPF_UMAX
Signed maximum.
@ SPF_SMAX
Unsigned minimum.
@ SPF_UNKNOWN
@ SPF_FMINNUM
Unsigned maximum.
LLVM_ABI bool isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(const CallBase *Call, bool MustPreserveNullness)
{launder,strip}.invariant.group returns pointer that aliases its argument, and it only captures point...
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI void getHorizDemandedEltsForFirstOperand(unsigned VectorBitWidth, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS)
Compute the demanded elements mask of horizontal binary operations.
LLVM_ABI SelectPatternResult getSelectPattern(CmpInst::Predicate Pred, SelectPatternNaNBehavior NaNBehavior=SPNB_NA, bool Ordered=false)
Determine the pattern for predicate X Pred Y ? X : Y.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool programUndefinedIfPoison(const Instruction *Inst)
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI bool matchSimpleBinaryIntrinsicRecurrence(const IntrinsicInst *I, PHINode *&P, Value *&Init, Value *&OtherOp)
Attempt to match a simple value-accumulating recurrence of the form: llvm.intrinsic....
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI bool cannotBeNegativeZero(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if we can prove that the specified FP value is never equal to -0.0.
LLVM_ABI bool programUndefinedIfUndefOrPoison(const Instruction *Inst)
Return true if this function can prove that if Inst is executed and yields a poison value or undef bi...
LLVM_ABI void adjustKnownFPClassForSelectArm(KnownFPClass &Known, Value *Cond, Value *Arm, bool Invert, const SimplifyQuery &Q, unsigned Depth=0)
Adjust Known for the given select Arm to include information from the select Cond.
generic_gep_type_iterator<> gep_type_iterator
LLVM_ABI bool collectPossibleValues(const Value *V, SmallPtrSetImpl< const Constant * > &Constants, unsigned MaxCount, bool AllowUndefOrPoison=true)
Enumerates all possible immediate values of V and inserts them into the set Constants.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI uint64_t GetStringLength(const Value *V, unsigned CharSize=8)
If we can compute the length of the string pointed to by the specified pointer, return 'len+1'.
LLVM_ABI OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI bool canCreateUndefOrPoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
canCreateUndefOrPoison returns true if Op can create undef or poison from non-undef & non-poison oper...
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
LLVM_ABI bool isKnownInversion(const Value *X, const Value *Y)
Return true iff:
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool intrinsicPropagatesPoison(Intrinsic::ID IID)
Return whether this intrinsic propagates poison for all operands.
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
LLVM_ABI RetainedKnowledge getKnowledgeValidInContext(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache &AC, const Instruction *CtxI, const DominatorTree *DT=nullptr)
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and the know...
LLVM_ABI bool isSafeToSpeculativelyExecuteWithOpcode(unsigned Opcode, const Instruction *Inst, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
This returns the same result as isSafeToSpeculativelyExecute if Opcode is the actual opcode of Inst.
LLVM_ABI bool onlyUsedByLifetimeMarkers(const Value *V)
Return true if the only users of this pointer are lifetime markers.
LLVM_ABI Intrinsic::ID getIntrinsicForCallSite(const CallBase &CB, const TargetLibraryInfo *TLI)
Map a call instruction to an intrinsic ID.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
LLVM_ABI const Value * getUnderlyingObjectAggressive(const Value *V)
Like getUnderlyingObject(), but will try harder to find a single underlying object.
LLVM_ABI Intrinsic::ID getMinMaxIntrinsic(SelectPatternFlavor SPF)
Convert given SPF to equivalent min/max intrinsic.
LLVM_ABI SelectPatternResult matchDecomposedSelectPattern(CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, FastMathFlags FMF=FastMathFlags(), Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Determine the pattern that a select with the given compare as its predicate and given values as its t...
LLVM_ABI OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
LLVM_ABI bool propagatesPoison(const Use &PoisonOp)
Return true if PoisonOp's user yields poison or raises UB if its operand PoisonOp is poison.
@ Add
Sum of integers.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(const WithCache< const Value * > &V, bool ForSigned, const SimplifyQuery &SQ)
Combine constant ranges from computeConstantRange() and computeKnownBits().
SelectPatternNaNBehavior
Behavior when a floating point min/max is given one NaN and one non-NaN as input.
@ SPNB_RETURNS_NAN
NaN behavior not applicable.
@ SPNB_RETURNS_OTHER
Given one NaN input, returns the NaN.
@ SPNB_RETURNS_ANY
Given one NaN input, returns the non-NaN.
LLVM_ABI bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return the number of times the sign bit of the register is replicated into the other bits.
constexpr unsigned BitWidth
LLVM_ABI KnownBits analyzeKnownBitsFromAndXorOr(const Operator *I, const KnownBits &KnownLHS, const KnownBits &KnownRHS, const SimplifyQuery &SQ, unsigned Depth=0)
Using KnownBits LHS/RHS produce the known bits for logic op (and/xor/or).
LLVM_ABI OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
LLVM_ABI bool isKnownNeverInfOrNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point value can never contain a NaN or infinity.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI Value * isBytewiseValue(Value *V, const DataLayout &DL)
If the specified value can be set by repeating the same byte in memory, return the i8 value that it i...
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
LLVM_ABI unsigned ComputeMaxSignificantBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Get the upper bound on bit size for this Value Op as a signed integer.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1945
LLVM_ABI OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
LLVM_ABI std::optional< bool > isImpliedByDomCondition(const Value *Cond, const Instruction *ContextI, const DataLayout &DL)
Return the boolean condition value in the context of the given instruction if it is known based on do...
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_ABI Value * FindInsertedValue(Value *V, ArrayRef< unsigned > idx_range, std::optional< BasicBlock::iterator > InsertBefore=std::nullopt)
Given an aggregate and an sequence of indices, see if the scalar value indexed is already around as a...
LLVM_ABI bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW=false, bool AllowPoison=true)
Return true if the two given values are negation.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI bool cannotBeOrderedLessThanZero(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if we can prove that the specified FP value is either NaN or never less than -0....
LLVM_ABI void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=MaxLookupSearchDepth)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
LLVM_ABI bool mayHaveNonDefUseDependency(const Instruction &I)
Returns true if the result or effects of the given instructions I depend values not reachable through...
LLVM_ABI bool isTriviallyVectorizable(Intrinsic::ID ID)
Identify if the intrinsic is trivially vectorizable.
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI std::optional< bool > computeKnownFPSignBit(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return false if we can prove that the specified FP value's sign bit is 0.
LLVM_ABI bool canIgnoreSignBitOfNaN(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is NaN.
LLVM_ABI void findValuesAffectedByCondition(Value *Cond, bool IsAssume, function_ref< void(Value *)> InsertAffected)
Call InsertAffected on all Values whose known bits / value may be affected by the condition Cond.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
SmallPtrSet< Value *, 4 > AffectedValues
Represents offset+length into a ConstantDataArray.
const ConstantDataArray * Array
ConstantDataArray pointer.
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ IEEE
IEEE-754 denormal numbers preserved.
static constexpr DenormalMode getDynamic()
InstrInfoQuery provides an interface to query additional information for instructions like metadata o...
bool isExact(const BinaryOperator *Op) const
MDNode * getMetadata(const Instruction *I, unsigned KindID) const
bool hasNoSignedZeros(const InstT *Op) const
bool hasNoSignedWrap(const InstT *Op) const
bool hasNoUnsignedWrap(const InstT *Op) const
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:304
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.
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:189
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:258
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:108
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:127
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:254
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:245
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:66
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:277
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:122
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:99
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:164
KnownBits byteSwap() const
Definition KnownBits.h:522
bool hasConflict() const
Returns true if there is conflicting information.
Definition KnownBits.h:51
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:292
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:86
KnownBits reverseBits() const
Definition KnownBits.h:526
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).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:175
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:74
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition KnownBits.h:324
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:111
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:228
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:314
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:183
unsigned countMinTrailingOnes() const
Returns the minimum number of trailing one bits.
Definition KnownBits.h:248
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:350
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:199
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:251
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, 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 KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:132
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:60
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:329
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:356
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:283
void setAllOnes()
Make all bits known to be one and discard any previous information.
Definition KnownBits.h:92
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:222
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.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:170
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
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.
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.
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).
KnownBits sextOrTrunc(unsigned BitWidth) const
Return known bits for a sign extension or truncation of the value we're tracking.
Definition KnownBits.h:209
bool isKnownNeverInfOrNaN() const
Return true if it's known this can never be an infinity or nan.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
bool cannotBeOrderedGreaterThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never greater tha...
static constexpr FPClassTest OrderedGreaterThanZeroMask
static constexpr FPClassTest OrderedLessThanZeroMask
void knownNot(FPClassTest RuleOut)
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
void copysign(const KnownFPClass &Sign)
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
bool isKnownNeverSubnormal() const
Return true if it's known this can never be a subnormal.
bool isKnownAlways(FPClassTest Mask) const
KnownFPClass unionWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode DenormMode=DenormalMode::getDynamic())
Apply the canonicalize intrinsic to this value.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsTrunc, bool IsMultiUnitFPType)
Propagate known class for rounding intrinsics (trunc, floor, ceil, rint, nearbyint,...
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
bool isKnownNeverNegInfinity() const
Return true if it's known this can never be -infinity.
bool isKnownNeverNegSubnormal() const
Return true if it's known this can never be a negative subnormal.
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy)
Propagate known class for fpext.
bool isKnownNeverNegZero() const
Return true if it's known this can never be a negative zero.
void propagateNaN(const KnownFPClass &Src, bool PreserveSign=false)
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
void signBitMustBeOne()
Assume the sign bit is one.
LLVM_ABI void propagateCanonicalizingSrc(const KnownFPClass &Src, DenormalMode Mode)
Report known classes if Src is evaluated through a potentially canonicalizing operation.
void signBitMustBeZero()
Assume the sign bit is zero.
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
LLVM_ABI bool isKnownNeverLogicalPosZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a positive zero.
bool isKnownNeverPosInfinity() const
Return true if it's known this can never be +infinity.
LLVM_ABI bool isKnownNeverLogicalNegZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a negative zero.
bool isKnownNeverPosSubnormal() const
Return true if it's known this can never be a positive subnormal.
Represent one information held inside an operand bundle of an llvm.assume.
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DataLayout & DL
SimplifyQuery getWithoutCondContext() const
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
const DomConditionCache * DC
const InstrInfoQuery IIQ
const CondContext * CC