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 = std::move(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->isNullValue())
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::clmul:
2101 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2102 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2103 Known = KnownBits::clmul(Known, Known2);
2104 break;
2105 case Intrinsic::uadd_sat:
2106 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2107 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2108 Known = KnownBits::uadd_sat(Known, Known2);
2109 break;
2110 case Intrinsic::usub_sat:
2111 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2112 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2113 Known = KnownBits::usub_sat(Known, Known2);
2114 break;
2115 case Intrinsic::sadd_sat:
2116 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2117 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2118 Known = KnownBits::sadd_sat(Known, Known2);
2119 break;
2120 case Intrinsic::ssub_sat:
2121 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2122 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2123 Known = KnownBits::ssub_sat(Known, Known2);
2124 break;
2125 // Vec reverse preserves bits from input vec.
2126 case Intrinsic::vector_reverse:
2127 computeKnownBits(I->getOperand(0), DemandedElts.reverseBits(), Known, Q,
2128 Depth + 1);
2129 break;
2130 // for min/max/and/or reduce, any bit common to each element in the
2131 // input vec is set in the output.
2132 case Intrinsic::vector_reduce_and:
2133 case Intrinsic::vector_reduce_or:
2134 case Intrinsic::vector_reduce_umax:
2135 case Intrinsic::vector_reduce_umin:
2136 case Intrinsic::vector_reduce_smax:
2137 case Intrinsic::vector_reduce_smin:
2138 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2139 break;
2140 case Intrinsic::vector_reduce_xor: {
2141 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2142 // The zeros common to all vecs are zero in the output.
2143 // If the number of elements is odd, then the common ones remain. If the
2144 // number of elements is even, then the common ones becomes zeros.
2145 auto *VecTy = cast<VectorType>(I->getOperand(0)->getType());
2146 // Even, so the ones become zeros.
2147 bool EvenCnt = VecTy->getElementCount().isKnownEven();
2148 if (EvenCnt)
2149 Known.Zero |= Known.One;
2150 // Maybe even element count so need to clear ones.
2151 if (VecTy->isScalableTy() || EvenCnt)
2152 Known.One.clearAllBits();
2153 break;
2154 }
2155 case Intrinsic::vector_reduce_add: {
2156 auto *VecTy = dyn_cast<FixedVectorType>(I->getOperand(0)->getType());
2157 if (!VecTy)
2158 break;
2159 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2160 Known = Known.reduceAdd(VecTy->getNumElements());
2161 break;
2162 }
2163 case Intrinsic::umin:
2164 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2165 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2166 Known = KnownBits::umin(Known, Known2);
2167 break;
2168 case Intrinsic::umax:
2169 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2170 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2171 Known = KnownBits::umax(Known, Known2);
2172 break;
2173 case Intrinsic::smin:
2174 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2175 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2176 Known = KnownBits::smin(Known, Known2);
2178 break;
2179 case Intrinsic::smax:
2180 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2181 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2182 Known = KnownBits::smax(Known, Known2);
2184 break;
2185 case Intrinsic::ptrmask: {
2186 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2187
2188 const Value *Mask = I->getOperand(1);
2189 Known2 = KnownBits(Mask->getType()->getScalarSizeInBits());
2190 computeKnownBits(Mask, DemandedElts, Known2, Q, Depth + 1);
2191 // TODO: 1-extend would be more precise.
2192 Known &= Known2.anyextOrTrunc(BitWidth);
2193 break;
2194 }
2195 case Intrinsic::x86_sse2_pmulh_w:
2196 case Intrinsic::x86_avx2_pmulh_w:
2197 case Intrinsic::x86_avx512_pmulh_w_512:
2198 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2199 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2200 Known = KnownBits::mulhs(Known, Known2);
2201 break;
2202 case Intrinsic::x86_sse2_pmulhu_w:
2203 case Intrinsic::x86_avx2_pmulhu_w:
2204 case Intrinsic::x86_avx512_pmulhu_w_512:
2205 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth + 1);
2206 computeKnownBits(I->getOperand(1), DemandedElts, Known2, Q, Depth + 1);
2207 Known = KnownBits::mulhu(Known, Known2);
2208 break;
2209 case Intrinsic::x86_sse42_crc32_64_64:
2210 Known.Zero.setBitsFrom(32);
2211 break;
2212 case Intrinsic::x86_ssse3_phadd_d_128:
2213 case Intrinsic::x86_ssse3_phadd_w_128:
2214 case Intrinsic::x86_avx2_phadd_d:
2215 case Intrinsic::x86_avx2_phadd_w: {
2217 I, DemandedElts, Q, Depth,
2218 [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
2219 return KnownBits::add(KnownLHS, KnownRHS);
2220 });
2221 break;
2222 }
2223 case Intrinsic::x86_ssse3_phadd_sw_128:
2224 case Intrinsic::x86_avx2_phadd_sw: {
2226 I, DemandedElts, Q, Depth, KnownBits::sadd_sat);
2227 break;
2228 }
2229 case Intrinsic::x86_ssse3_phsub_d_128:
2230 case Intrinsic::x86_ssse3_phsub_w_128:
2231 case Intrinsic::x86_avx2_phsub_d:
2232 case Intrinsic::x86_avx2_phsub_w: {
2234 I, DemandedElts, Q, Depth,
2235 [](const KnownBits &KnownLHS, const KnownBits &KnownRHS) {
2236 return KnownBits::sub(KnownLHS, KnownRHS);
2237 });
2238 break;
2239 }
2240 case Intrinsic::x86_ssse3_phsub_sw_128:
2241 case Intrinsic::x86_avx2_phsub_sw: {
2243 I, DemandedElts, Q, Depth, KnownBits::ssub_sat);
2244 break;
2245 }
2246 case Intrinsic::riscv_vsetvli:
2247 case Intrinsic::riscv_vsetvlimax: {
2248 bool HasAVL = II->getIntrinsicID() == Intrinsic::riscv_vsetvli;
2249 const ConstantRange Range = getVScaleRange(II->getFunction(), BitWidth);
2251 cast<ConstantInt>(II->getArgOperand(HasAVL))->getZExtValue());
2252 RISCVVType::VLMUL VLMUL = static_cast<RISCVVType::VLMUL>(
2253 cast<ConstantInt>(II->getArgOperand(1 + HasAVL))->getZExtValue());
2254 uint64_t MaxVLEN =
2255 Range.getUnsignedMax().getZExtValue() * RISCV::RVVBitsPerBlock;
2256 uint64_t MaxVL = MaxVLEN / RISCVVType::getSEWLMULRatio(SEW, VLMUL);
2257
2258 // Result of vsetvli must be not larger than AVL.
2259 if (HasAVL)
2260 if (auto *CI = dyn_cast<ConstantInt>(II->getArgOperand(0)))
2261 MaxVL = std::min(MaxVL, CI->getZExtValue());
2262
2263 unsigned KnownZeroFirstBit = Log2_32(MaxVL) + 1;
2264 if (BitWidth > KnownZeroFirstBit)
2265 Known.Zero.setBitsFrom(KnownZeroFirstBit);
2266 break;
2267 }
2268 case Intrinsic::amdgcn_mbcnt_hi:
2269 case Intrinsic::amdgcn_mbcnt_lo: {
2270 // Wave64 mbcnt_lo returns at most 32 + src1. Otherwise these return at
2271 // most 31 + src1.
2272 Known.Zero.setBitsFrom(
2273 II->getIntrinsicID() == Intrinsic::amdgcn_mbcnt_lo ? 6 : 5);
2274 computeKnownBits(I->getOperand(1), Known2, Q, Depth + 1);
2275 Known = KnownBits::add(Known, Known2);
2276 break;
2277 }
2278 case Intrinsic::vscale: {
2279 if (!II->getParent() || !II->getFunction())
2280 break;
2281
2282 Known = getVScaleRange(II->getFunction(), BitWidth).toKnownBits();
2283 break;
2284 }
2285 }
2286 }
2287 break;
2288 }
2289 case Instruction::ShuffleVector: {
2290 if (auto *Splat = getSplatValue(I)) {
2291 computeKnownBits(Splat, Known, Q, Depth + 1);
2292 break;
2293 }
2294
2295 auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
2296 // FIXME: Do we need to handle ConstantExpr involving shufflevectors?
2297 if (!Shuf) {
2298 Known.resetAll();
2299 return;
2300 }
2301 // For undef elements, we don't know anything about the common state of
2302 // the shuffle result.
2303 APInt DemandedLHS, DemandedRHS;
2304 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS)) {
2305 Known.resetAll();
2306 return;
2307 }
2308 Known.setAllConflict();
2309 if (!!DemandedLHS) {
2310 const Value *LHS = Shuf->getOperand(0);
2311 computeKnownBits(LHS, DemandedLHS, Known, Q, Depth + 1);
2312 // If we don't know any bits, early out.
2313 if (Known.isUnknown())
2314 break;
2315 }
2316 if (!!DemandedRHS) {
2317 const Value *RHS = Shuf->getOperand(1);
2318 computeKnownBits(RHS, DemandedRHS, Known2, Q, Depth + 1);
2319 Known = Known.intersectWith(Known2);
2320 }
2321 break;
2322 }
2323 case Instruction::InsertElement: {
2324 if (isa<ScalableVectorType>(I->getType())) {
2325 Known.resetAll();
2326 return;
2327 }
2328 const Value *Vec = I->getOperand(0);
2329 const Value *Elt = I->getOperand(1);
2330 auto *CIdx = dyn_cast<ConstantInt>(I->getOperand(2));
2331 unsigned NumElts = DemandedElts.getBitWidth();
2332 APInt DemandedVecElts = DemandedElts;
2333 bool NeedsElt = true;
2334 // If we know the index we are inserting too, clear it from Vec check.
2335 if (CIdx && CIdx->getValue().ult(NumElts)) {
2336 DemandedVecElts.clearBit(CIdx->getZExtValue());
2337 NeedsElt = DemandedElts[CIdx->getZExtValue()];
2338 }
2339
2340 Known.setAllConflict();
2341 if (NeedsElt) {
2342 computeKnownBits(Elt, Known, Q, Depth + 1);
2343 // If we don't know any bits, early out.
2344 if (Known.isUnknown())
2345 break;
2346 }
2347
2348 if (!DemandedVecElts.isZero()) {
2349 computeKnownBits(Vec, DemandedVecElts, Known2, Q, Depth + 1);
2350 Known = Known.intersectWith(Known2);
2351 }
2352 break;
2353 }
2354 case Instruction::ExtractElement: {
2355 // Look through extract element. If the index is non-constant or
2356 // out-of-range demand all elements, otherwise just the extracted element.
2357 const Value *Vec = I->getOperand(0);
2358 const Value *Idx = I->getOperand(1);
2359 auto *CIdx = dyn_cast<ConstantInt>(Idx);
2360 if (isa<ScalableVectorType>(Vec->getType())) {
2361 // FIXME: there's probably *something* we can do with scalable vectors
2362 Known.resetAll();
2363 break;
2364 }
2365 unsigned NumElts = cast<FixedVectorType>(Vec->getType())->getNumElements();
2366 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
2367 if (CIdx && CIdx->getValue().ult(NumElts))
2368 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
2369 computeKnownBits(Vec, DemandedVecElts, Known, Q, Depth + 1);
2370 break;
2371 }
2372 case Instruction::ExtractValue:
2373 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I->getOperand(0))) {
2375 if (EVI->getNumIndices() != 1) break;
2376 if (EVI->getIndices()[0] == 0) {
2377 switch (II->getIntrinsicID()) {
2378 default: break;
2379 case Intrinsic::uadd_with_overflow:
2380 case Intrinsic::sadd_with_overflow:
2382 true, II->getArgOperand(0), II->getArgOperand(1), /*NSW=*/false,
2383 /* NUW=*/false, DemandedElts, Known, Known2, Q, Depth);
2384 break;
2385 case Intrinsic::usub_with_overflow:
2386 case Intrinsic::ssub_with_overflow:
2388 false, II->getArgOperand(0), II->getArgOperand(1), /*NSW=*/false,
2389 /* NUW=*/false, DemandedElts, Known, Known2, Q, Depth);
2390 break;
2391 case Intrinsic::umul_with_overflow:
2392 case Intrinsic::smul_with_overflow:
2393 computeKnownBitsMul(II->getArgOperand(0), II->getArgOperand(1), false,
2394 false, DemandedElts, Known, Known2, Q, Depth);
2395 break;
2396 }
2397 }
2398 }
2399 break;
2400 case Instruction::Freeze:
2401 if (isGuaranteedNotToBePoison(I->getOperand(0), Q.AC, Q.CxtI, Q.DT,
2402 Depth + 1))
2403 computeKnownBits(I->getOperand(0), Known, Q, Depth + 1);
2404 break;
2405 }
2406}
2407
2408/// Determine which bits of V are known to be either zero or one and return
2409/// them.
2410KnownBits llvm::computeKnownBits(const Value *V, const APInt &DemandedElts,
2411 const SimplifyQuery &Q, unsigned Depth) {
2412 KnownBits Known(getBitWidth(V->getType(), Q.DL));
2413 ::computeKnownBits(V, DemandedElts, Known, Q, Depth);
2414 return Known;
2415}
2416
2417/// Determine which bits of V are known to be either zero or one and return
2418/// them.
2420 unsigned Depth) {
2421 KnownBits Known(getBitWidth(V->getType(), Q.DL));
2422 computeKnownBits(V, Known, Q, Depth);
2423 return Known;
2424}
2425
2426/// Determine which bits of V are known to be either zero or one and return
2427/// them in the Known bit set.
2428///
2429/// NOTE: we cannot consider 'undef' to be "IsZero" here. The problem is that
2430/// we cannot optimize based on the assumption that it is zero without changing
2431/// it to be an explicit zero. If we don't change it to zero, other code could
2432/// optimized based on the contradictory assumption that it is non-zero.
2433/// Because instcombine aggressively folds operations with undef args anyway,
2434/// this won't lose us code quality.
2435///
2436/// This function is defined on values with integer type, values with pointer
2437/// type, and vectors of integers. In the case
2438/// where V is a vector, known zero, and known one values are the
2439/// same width as the vector element, and the bit is set only if it is true
2440/// for all of the demanded elements in the vector specified by DemandedElts.
2441void computeKnownBits(const Value *V, const APInt &DemandedElts,
2442 KnownBits &Known, const SimplifyQuery &Q,
2443 unsigned Depth) {
2444 if (!DemandedElts) {
2445 // No demanded elts, better to assume we don't know anything.
2446 Known.resetAll();
2447 return;
2448 }
2449
2450 assert(V && "No Value?");
2451 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
2452
2453#ifndef NDEBUG
2454 Type *Ty = V->getType();
2455 unsigned BitWidth = Known.getBitWidth();
2456
2457 assert((Ty->isIntOrIntVectorTy(BitWidth) || Ty->isPtrOrPtrVectorTy()) &&
2458 "Not integer or pointer type!");
2459
2460 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
2461 assert(
2462 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
2463 "DemandedElt width should equal the fixed vector number of elements");
2464 } else {
2465 assert(DemandedElts == APInt(1, 1) &&
2466 "DemandedElt width should be 1 for scalars or scalable vectors");
2467 }
2468
2469 Type *ScalarTy = Ty->getScalarType();
2470 if (ScalarTy->isPointerTy()) {
2471 assert(BitWidth == Q.DL.getPointerTypeSizeInBits(ScalarTy) &&
2472 "V and Known should have same BitWidth");
2473 } else {
2474 assert(BitWidth == Q.DL.getTypeSizeInBits(ScalarTy) &&
2475 "V and Known should have same BitWidth");
2476 }
2477#endif
2478
2479 const APInt *C;
2480 if (match(V, m_APInt(C))) {
2481 // We know all of the bits for a scalar constant or a splat vector constant!
2482 Known = KnownBits::makeConstant(*C);
2483 return;
2484 }
2485 // Null and aggregate-zero are all-zeros.
2487 Known.setAllZero();
2488 return;
2489 }
2490 // Handle a constant vector by taking the intersection of the known bits of
2491 // each element.
2493 assert(!isa<ScalableVectorType>(V->getType()));
2494 // We know that CDV must be a vector of integers. Take the intersection of
2495 // each element.
2496 Known.setAllConflict();
2497 for (unsigned i = 0, e = CDV->getNumElements(); i != e; ++i) {
2498 if (!DemandedElts[i])
2499 continue;
2500 APInt Elt = CDV->getElementAsAPInt(i);
2501 Known.Zero &= ~Elt;
2502 Known.One &= Elt;
2503 }
2504 if (Known.hasConflict())
2505 Known.resetAll();
2506 return;
2507 }
2508
2509 if (const auto *CV = dyn_cast<ConstantVector>(V)) {
2510 assert(!isa<ScalableVectorType>(V->getType()));
2511 // We know that CV must be a vector of integers. Take the intersection of
2512 // each element.
2513 Known.setAllConflict();
2514 for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) {
2515 if (!DemandedElts[i])
2516 continue;
2517 Constant *Element = CV->getAggregateElement(i);
2518 if (isa<PoisonValue>(Element))
2519 continue;
2520 auto *ElementCI = dyn_cast_or_null<ConstantInt>(Element);
2521 if (!ElementCI) {
2522 Known.resetAll();
2523 return;
2524 }
2525 const APInt &Elt = ElementCI->getValue();
2526 Known.Zero &= ~Elt;
2527 Known.One &= Elt;
2528 }
2529 if (Known.hasConflict())
2530 Known.resetAll();
2531 return;
2532 }
2533
2534 // Start out not knowing anything.
2535 Known.resetAll();
2536
2537 // We can't imply anything about undefs.
2538 if (isa<UndefValue>(V))
2539 return;
2540
2541 // There's no point in looking through other users of ConstantData for
2542 // assumptions. Confirm that we've handled them all.
2543 assert(!isa<ConstantData>(V) && "Unhandled constant data!");
2544
2545 if (const auto *A = dyn_cast<Argument>(V))
2546 if (std::optional<ConstantRange> Range = A->getRange())
2547 Known = Range->toKnownBits();
2548
2549 // All recursive calls that increase depth must come after this.
2551 return;
2552
2553 // A weak GlobalAlias is totally unknown. A non-weak GlobalAlias has
2554 // the bits of its aliasee.
2555 if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
2556 if (!GA->isInterposable())
2557 computeKnownBits(GA->getAliasee(), Known, Q, Depth + 1);
2558 return;
2559 }
2560
2561 if (const Operator *I = dyn_cast<Operator>(V))
2562 computeKnownBitsFromOperator(I, DemandedElts, Known, Q, Depth);
2563 else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
2564 if (std::optional<ConstantRange> CR = GV->getAbsoluteSymbolRange())
2565 Known = CR->toKnownBits();
2566 }
2567
2568 // Aligned pointers have trailing zeros - refine Known.Zero set
2569 if (isa<PointerType>(V->getType())) {
2570 Align Alignment = V->getPointerAlignment(Q.DL);
2571 Known.Zero.setLowBits(Log2(Alignment));
2572 }
2573
2574 // computeKnownBitsFromContext strictly refines Known.
2575 // Therefore, we run them after computeKnownBitsFromOperator.
2576
2577 // Check whether we can determine known bits from context such as assumes.
2578 computeKnownBitsFromContext(V, Known, Q, Depth);
2579}
2580
2581/// Try to detect a recurrence that the value of the induction variable is
2582/// always a power of two (or zero).
2583static bool isPowerOfTwoRecurrence(const PHINode *PN, bool OrZero,
2584 SimplifyQuery &Q, unsigned Depth) {
2585 BinaryOperator *BO = nullptr;
2586 Value *Start = nullptr, *Step = nullptr;
2587 if (!matchSimpleRecurrence(PN, BO, Start, Step))
2588 return false;
2589
2590 // Initial value must be a power of two.
2591 for (const Use &U : PN->operands()) {
2592 if (U.get() == Start) {
2593 // Initial value comes from a different BB, need to adjust context
2594 // instruction for analysis.
2595 Q.CxtI = PN->getIncomingBlock(U)->getTerminator();
2596 if (!isKnownToBeAPowerOfTwo(Start, OrZero, Q, Depth))
2597 return false;
2598 }
2599 }
2600
2601 // Except for Mul, the induction variable must be on the left side of the
2602 // increment expression, otherwise its value can be arbitrary.
2603 if (BO->getOpcode() != Instruction::Mul && BO->getOperand(1) != Step)
2604 return false;
2605
2606 Q.CxtI = BO->getParent()->getTerminator();
2607 switch (BO->getOpcode()) {
2608 case Instruction::Mul:
2609 // Power of two is closed under multiplication.
2610 return (OrZero || Q.IIQ.hasNoUnsignedWrap(BO) ||
2611 Q.IIQ.hasNoSignedWrap(BO)) &&
2612 isKnownToBeAPowerOfTwo(Step, OrZero, Q, Depth);
2613 case Instruction::SDiv:
2614 // Start value must not be signmask for signed division, so simply being a
2615 // power of two is not sufficient, and it has to be a constant.
2616 if (!match(Start, m_Power2()) || match(Start, m_SignMask()))
2617 return false;
2618 [[fallthrough]];
2619 case Instruction::UDiv:
2620 // Divisor must be a power of two.
2621 // If OrZero is false, cannot guarantee induction variable is non-zero after
2622 // division, same for Shr, unless it is exact division.
2623 return (OrZero || Q.IIQ.isExact(BO)) &&
2624 isKnownToBeAPowerOfTwo(Step, false, Q, Depth);
2625 case Instruction::Shl:
2626 return OrZero || Q.IIQ.hasNoUnsignedWrap(BO) || Q.IIQ.hasNoSignedWrap(BO);
2627 case Instruction::AShr:
2628 if (!match(Start, m_Power2()) || match(Start, m_SignMask()))
2629 return false;
2630 [[fallthrough]];
2631 case Instruction::LShr:
2632 return OrZero || Q.IIQ.isExact(BO);
2633 default:
2634 return false;
2635 }
2636}
2637
2638/// Return true if we can infer that \p V is known to be a power of 2 from
2639/// dominating condition \p Cond (e.g., ctpop(V) == 1).
2640static bool isImpliedToBeAPowerOfTwoFromCond(const Value *V, bool OrZero,
2641 const Value *Cond,
2642 bool CondIsTrue) {
2643 CmpPredicate Pred;
2644 const APInt *RHSC;
2646 m_APInt(RHSC))))
2647 return false;
2648 if (!CondIsTrue)
2649 Pred = ICmpInst::getInversePredicate(Pred);
2650 // ctpop(V) u< 2
2651 if (OrZero && Pred == ICmpInst::ICMP_ULT && *RHSC == 2)
2652 return true;
2653 // ctpop(V) == 1
2654 return Pred == ICmpInst::ICMP_EQ && *RHSC == 1;
2655}
2656
2657/// Return true if the given value is known to have exactly one
2658/// bit set when defined. For vectors return true if every element is known to
2659/// be a power of two when defined. Supports values with integer or pointer
2660/// types and vectors of integers.
2661bool llvm::isKnownToBeAPowerOfTwo(const Value *V, bool OrZero,
2662 const SimplifyQuery &Q, unsigned Depth) {
2663 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
2664
2665 if (isa<Constant>(V))
2666 return OrZero ? match(V, m_Power2OrZero()) : match(V, m_Power2());
2667
2668 // i1 is by definition a power of 2 or zero.
2669 if (OrZero && V->getType()->getScalarSizeInBits() == 1)
2670 return true;
2671
2672 // Try to infer from assumptions.
2673 if (Q.AC && Q.CxtI) {
2674 for (auto &AssumeVH : Q.AC->assumptionsFor(V)) {
2675 if (!AssumeVH)
2676 continue;
2677 CallInst *I = cast<CallInst>(AssumeVH);
2678 if (isImpliedToBeAPowerOfTwoFromCond(V, OrZero, I->getArgOperand(0),
2679 /*CondIsTrue=*/true) &&
2681 return true;
2682 }
2683 }
2684
2685 // Handle dominating conditions.
2686 if (Q.DC && Q.CxtI && Q.DT) {
2687 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
2688 Value *Cond = BI->getCondition();
2689
2690 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
2692 /*CondIsTrue=*/true) &&
2693 Q.DT->dominates(Edge0, Q.CxtI->getParent()))
2694 return true;
2695
2696 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
2698 /*CondIsTrue=*/false) &&
2699 Q.DT->dominates(Edge1, Q.CxtI->getParent()))
2700 return true;
2701 }
2702 }
2703
2704 auto *I = dyn_cast<Instruction>(V);
2705 if (!I)
2706 return false;
2707
2708 if (Q.CxtI && match(V, m_VScale())) {
2709 const Function *F = Q.CxtI->getFunction();
2710 // The vscale_range indicates vscale is a power-of-two.
2711 return F->hasFnAttribute(Attribute::VScaleRange);
2712 }
2713
2714 // 1 << X is clearly a power of two if the one is not shifted off the end. If
2715 // it is shifted off the end then the result is undefined.
2716 if (match(I, m_Shl(m_One(), m_Value())))
2717 return true;
2718
2719 // (signmask) >>l X is clearly a power of two if the one is not shifted off
2720 // the bottom. If it is shifted off the bottom then the result is undefined.
2721 if (match(I, m_LShr(m_SignMask(), m_Value())))
2722 return true;
2723
2724 // The remaining tests are all recursive, so bail out if we hit the limit.
2726 return false;
2727
2728 switch (I->getOpcode()) {
2729 case Instruction::ZExt:
2730 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2731 case Instruction::Trunc:
2732 return OrZero && isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2733 case Instruction::Shl:
2734 if (OrZero || Q.IIQ.hasNoUnsignedWrap(I) || Q.IIQ.hasNoSignedWrap(I))
2735 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2736 return false;
2737 case Instruction::LShr:
2738 if (OrZero || Q.IIQ.isExact(cast<BinaryOperator>(I)))
2739 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2740 return false;
2741 case Instruction::UDiv:
2743 return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth);
2744 return false;
2745 case Instruction::Mul:
2746 return isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth) &&
2747 isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth) &&
2748 (OrZero || isKnownNonZero(I, Q, Depth));
2749 case Instruction::And:
2750 // A power of two and'd with anything is a power of two or zero.
2751 if (OrZero &&
2752 (isKnownToBeAPowerOfTwo(I->getOperand(1), /*OrZero*/ true, Q, Depth) ||
2753 isKnownToBeAPowerOfTwo(I->getOperand(0), /*OrZero*/ true, Q, Depth)))
2754 return true;
2755 // X & (-X) is always a power of two or zero.
2756 if (match(I->getOperand(0), m_Neg(m_Specific(I->getOperand(1)))) ||
2757 match(I->getOperand(1), m_Neg(m_Specific(I->getOperand(0)))))
2758 return OrZero || isKnownNonZero(I->getOperand(0), Q, Depth);
2759 return false;
2760 case Instruction::Add: {
2761 // Adding a power-of-two or zero to the same power-of-two or zero yields
2762 // either the original power-of-two, a larger power-of-two or zero.
2764 if (OrZero || Q.IIQ.hasNoUnsignedWrap(VOBO) ||
2765 Q.IIQ.hasNoSignedWrap(VOBO)) {
2766 if (match(I->getOperand(0),
2767 m_c_And(m_Specific(I->getOperand(1)), m_Value())) &&
2768 isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth))
2769 return true;
2770 if (match(I->getOperand(1),
2771 m_c_And(m_Specific(I->getOperand(0)), m_Value())) &&
2772 isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Q, Depth))
2773 return true;
2774
2775 unsigned BitWidth = V->getType()->getScalarSizeInBits();
2776 KnownBits LHSBits(BitWidth);
2777 computeKnownBits(I->getOperand(0), LHSBits, Q, Depth);
2778
2779 KnownBits RHSBits(BitWidth);
2780 computeKnownBits(I->getOperand(1), RHSBits, Q, Depth);
2781 // If i8 V is a power of two or zero:
2782 // ZeroBits: 1 1 1 0 1 1 1 1
2783 // ~ZeroBits: 0 0 0 1 0 0 0 0
2784 if ((~(LHSBits.Zero & RHSBits.Zero)).isPowerOf2())
2785 // If OrZero isn't set, we cannot give back a zero result.
2786 // Make sure either the LHS or RHS has a bit set.
2787 if (OrZero || RHSBits.One.getBoolValue() || LHSBits.One.getBoolValue())
2788 return true;
2789 }
2790
2791 // LShr(UINT_MAX, Y) + 1 is a power of two (if add is nuw) or zero.
2792 if (OrZero || Q.IIQ.hasNoUnsignedWrap(VOBO))
2793 if (match(I, m_Add(m_LShr(m_AllOnes(), m_Value()), m_One())))
2794 return true;
2795 return false;
2796 }
2797 case Instruction::Select:
2798 return isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Q, Depth) &&
2799 isKnownToBeAPowerOfTwo(I->getOperand(2), OrZero, Q, Depth);
2800 case Instruction::PHI: {
2801 // A PHI node is power of two if all incoming values are power of two, or if
2802 // it is an induction variable where in each step its value is a power of
2803 // two.
2804 auto *PN = cast<PHINode>(I);
2806
2807 // Check if it is an induction variable and always power of two.
2808 if (isPowerOfTwoRecurrence(PN, OrZero, RecQ, Depth))
2809 return true;
2810
2811 // Recursively check all incoming values. Limit recursion to 2 levels, so
2812 // that search complexity is limited to number of operands^2.
2813 unsigned NewDepth = std::max(Depth, MaxAnalysisRecursionDepth - 1);
2814 return llvm::all_of(PN->operands(), [&](const Use &U) {
2815 // Value is power of 2 if it is coming from PHI node itself by induction.
2816 if (U.get() == PN)
2817 return true;
2818
2819 // Change the context instruction to the incoming block where it is
2820 // evaluated.
2821 RecQ.CxtI = PN->getIncomingBlock(U)->getTerminator();
2822 return isKnownToBeAPowerOfTwo(U.get(), OrZero, RecQ, NewDepth);
2823 });
2824 }
2825 case Instruction::Invoke:
2826 case Instruction::Call: {
2827 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
2828 switch (II->getIntrinsicID()) {
2829 case Intrinsic::umax:
2830 case Intrinsic::smax:
2831 case Intrinsic::umin:
2832 case Intrinsic::smin:
2833 return isKnownToBeAPowerOfTwo(II->getArgOperand(1), OrZero, Q, Depth) &&
2834 isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2835 // bswap/bitreverse just move around bits, but don't change any 1s/0s
2836 // thus dont change pow2/non-pow2 status.
2837 case Intrinsic::bitreverse:
2838 case Intrinsic::bswap:
2839 return isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2840 case Intrinsic::fshr:
2841 case Intrinsic::fshl:
2842 // If Op0 == Op1, this is a rotate. is_pow2(rotate(x, y)) == is_pow2(x)
2843 if (II->getArgOperand(0) == II->getArgOperand(1))
2844 return isKnownToBeAPowerOfTwo(II->getArgOperand(0), OrZero, Q, Depth);
2845 break;
2846 default:
2847 break;
2848 }
2849 }
2850 return false;
2851 }
2852 default:
2853 return false;
2854 }
2855}
2856
2857/// Test whether a GEP's result is known to be non-null.
2858///
2859/// Uses properties inherent in a GEP to try to determine whether it is known
2860/// to be non-null.
2861///
2862/// Currently this routine does not support vector GEPs.
2863static bool isGEPKnownNonNull(const GEPOperator *GEP, const SimplifyQuery &Q,
2864 unsigned Depth) {
2865 const Function *F = nullptr;
2866 if (const Instruction *I = dyn_cast<Instruction>(GEP))
2867 F = I->getFunction();
2868
2869 // If the gep is nuw or inbounds with invalid null pointer, then the GEP
2870 // may be null iff the base pointer is null and the offset is zero.
2871 if (!GEP->hasNoUnsignedWrap() &&
2872 !(GEP->isInBounds() &&
2873 !NullPointerIsDefined(F, GEP->getPointerAddressSpace())))
2874 return false;
2875
2876 // FIXME: Support vector-GEPs.
2877 assert(GEP->getType()->isPointerTy() && "We only support plain pointer GEP");
2878
2879 // If the base pointer is non-null, we cannot walk to a null address with an
2880 // inbounds GEP in address space zero.
2881 if (isKnownNonZero(GEP->getPointerOperand(), Q, Depth))
2882 return true;
2883
2884 // Walk the GEP operands and see if any operand introduces a non-zero offset.
2885 // If so, then the GEP cannot produce a null pointer, as doing so would
2886 // inherently violate the inbounds contract within address space zero.
2888 GTI != GTE; ++GTI) {
2889 // Struct types are easy -- they must always be indexed by a constant.
2890 if (StructType *STy = GTI.getStructTypeOrNull()) {
2891 ConstantInt *OpC = cast<ConstantInt>(GTI.getOperand());
2892 unsigned ElementIdx = OpC->getZExtValue();
2893 const StructLayout *SL = Q.DL.getStructLayout(STy);
2894 uint64_t ElementOffset = SL->getElementOffset(ElementIdx);
2895 if (ElementOffset > 0)
2896 return true;
2897 continue;
2898 }
2899
2900 // If we have a zero-sized type, the index doesn't matter. Keep looping.
2901 if (GTI.getSequentialElementStride(Q.DL).isZero())
2902 continue;
2903
2904 // Fast path the constant operand case both for efficiency and so we don't
2905 // increment Depth when just zipping down an all-constant GEP.
2906 if (ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand())) {
2907 if (!OpC->isZero())
2908 return true;
2909 continue;
2910 }
2911
2912 // We post-increment Depth here because while isKnownNonZero increments it
2913 // as well, when we pop back up that increment won't persist. We don't want
2914 // to recurse 10k times just because we have 10k GEP operands. We don't
2915 // bail completely out because we want to handle constant GEPs regardless
2916 // of depth.
2918 continue;
2919
2920 if (isKnownNonZero(GTI.getOperand(), Q, Depth))
2921 return true;
2922 }
2923
2924 return false;
2925}
2926
2928 const Instruction *CtxI,
2929 const DominatorTree *DT) {
2930 assert(!isa<Constant>(V) && "Called for constant?");
2931
2932 if (!CtxI || !DT)
2933 return false;
2934
2935 unsigned NumUsesExplored = 0;
2936 for (auto &U : V->uses()) {
2937 // Avoid massive lists
2938 if (NumUsesExplored >= DomConditionsMaxUses)
2939 break;
2940 NumUsesExplored++;
2941
2942 const Instruction *UI = cast<Instruction>(U.getUser());
2943 // If the value is used as an argument to a call or invoke, then argument
2944 // attributes may provide an answer about null-ness.
2945 if (V->getType()->isPointerTy()) {
2946 if (const auto *CB = dyn_cast<CallBase>(UI)) {
2947 if (CB->isArgOperand(&U) &&
2948 CB->paramHasNonNullAttr(CB->getArgOperandNo(&U),
2949 /*AllowUndefOrPoison=*/false) &&
2950 DT->dominates(CB, CtxI))
2951 return true;
2952 }
2953 }
2954
2955 // If the value is used as a load/store, then the pointer must be non null.
2956 if (V == getLoadStorePointerOperand(UI)) {
2959 DT->dominates(UI, CtxI))
2960 return true;
2961 }
2962
2963 if ((match(UI, m_IDiv(m_Value(), m_Specific(V))) ||
2964 match(UI, m_IRem(m_Value(), m_Specific(V)))) &&
2965 isValidAssumeForContext(UI, CtxI, DT))
2966 return true;
2967
2968 // Consider only compare instructions uniquely controlling a branch
2969 Value *RHS;
2970 CmpPredicate Pred;
2971 if (!match(UI, m_c_ICmp(Pred, m_Specific(V), m_Value(RHS))))
2972 continue;
2973
2974 bool NonNullIfTrue;
2975 if (cmpExcludesZero(Pred, RHS))
2976 NonNullIfTrue = true;
2978 NonNullIfTrue = false;
2979 else
2980 continue;
2981
2984 for (const auto *CmpU : UI->users()) {
2985 assert(WorkList.empty() && "Should be!");
2986 if (Visited.insert(CmpU).second)
2987 WorkList.push_back(CmpU);
2988
2989 while (!WorkList.empty()) {
2990 auto *Curr = WorkList.pop_back_val();
2991
2992 // If a user is an AND, add all its users to the work list. We only
2993 // propagate "pred != null" condition through AND because it is only
2994 // correct to assume that all conditions of AND are met in true branch.
2995 // TODO: Support similar logic of OR and EQ predicate?
2996 if (NonNullIfTrue)
2997 if (match(Curr, m_LogicalAnd(m_Value(), m_Value()))) {
2998 for (const auto *CurrU : Curr->users())
2999 if (Visited.insert(CurrU).second)
3000 WorkList.push_back(CurrU);
3001 continue;
3002 }
3003
3004 if (const BranchInst *BI = dyn_cast<BranchInst>(Curr)) {
3005 assert(BI->isConditional() && "uses a comparison!");
3006
3007 BasicBlock *NonNullSuccessor =
3008 BI->getSuccessor(NonNullIfTrue ? 0 : 1);
3009 BasicBlockEdge Edge(BI->getParent(), NonNullSuccessor);
3010 if (Edge.isSingleEdge() && DT->dominates(Edge, CtxI->getParent()))
3011 return true;
3012 } else if (NonNullIfTrue && isGuard(Curr) &&
3013 DT->dominates(cast<Instruction>(Curr), CtxI)) {
3014 return true;
3015 }
3016 }
3017 }
3018 }
3019
3020 return false;
3021}
3022
3023/// Does the 'Range' metadata (which must be a valid MD_range operand list)
3024/// ensure that the value it's attached to is never Value? 'RangeType' is
3025/// is the type of the value described by the range.
3026static bool rangeMetadataExcludesValue(const MDNode* Ranges, const APInt& Value) {
3027 const unsigned NumRanges = Ranges->getNumOperands() / 2;
3028 assert(NumRanges >= 1);
3029 for (unsigned i = 0; i < NumRanges; ++i) {
3031 mdconst::extract<ConstantInt>(Ranges->getOperand(2 * i + 0));
3033 mdconst::extract<ConstantInt>(Ranges->getOperand(2 * i + 1));
3034 ConstantRange Range(Lower->getValue(), Upper->getValue());
3035 if (Range.contains(Value))
3036 return false;
3037 }
3038 return true;
3039}
3040
3041/// Try to detect a recurrence that monotonically increases/decreases from a
3042/// non-zero starting value. These are common as induction variables.
3043static bool isNonZeroRecurrence(const PHINode *PN) {
3044 BinaryOperator *BO = nullptr;
3045 Value *Start = nullptr, *Step = nullptr;
3046 const APInt *StartC, *StepC;
3047 if (!matchSimpleRecurrence(PN, BO, Start, Step) ||
3048 !match(Start, m_APInt(StartC)) || StartC->isZero())
3049 return false;
3050
3051 switch (BO->getOpcode()) {
3052 case Instruction::Add:
3053 // Starting from non-zero and stepping away from zero can never wrap back
3054 // to zero.
3055 return BO->hasNoUnsignedWrap() ||
3056 (BO->hasNoSignedWrap() && match(Step, m_APInt(StepC)) &&
3057 StartC->isNegative() == StepC->isNegative());
3058 case Instruction::Mul:
3059 return (BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap()) &&
3060 match(Step, m_APInt(StepC)) && !StepC->isZero();
3061 case Instruction::Shl:
3062 return BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap();
3063 case Instruction::AShr:
3064 case Instruction::LShr:
3065 return BO->isExact();
3066 default:
3067 return false;
3068 }
3069}
3070
3071static bool matchOpWithOpEqZero(Value *Op0, Value *Op1) {
3073 m_Specific(Op1), m_Zero()))) ||
3075 m_Specific(Op0), m_Zero())));
3076}
3077
3078static bool isNonZeroAdd(const APInt &DemandedElts, const SimplifyQuery &Q,
3079 unsigned BitWidth, Value *X, Value *Y, bool NSW,
3080 bool NUW, unsigned Depth) {
3081 // (X + (X != 0)) is non zero
3082 if (matchOpWithOpEqZero(X, Y))
3083 return true;
3084
3085 if (NUW)
3086 return isKnownNonZero(Y, DemandedElts, Q, Depth) ||
3087 isKnownNonZero(X, DemandedElts, Q, Depth);
3088
3089 KnownBits XKnown = computeKnownBits(X, DemandedElts, Q, Depth);
3090 KnownBits YKnown = computeKnownBits(Y, DemandedElts, Q, Depth);
3091
3092 // If X and Y are both non-negative (as signed values) then their sum is not
3093 // zero unless both X and Y are zero.
3094 if (XKnown.isNonNegative() && YKnown.isNonNegative())
3095 if (isKnownNonZero(Y, DemandedElts, Q, Depth) ||
3096 isKnownNonZero(X, DemandedElts, Q, Depth))
3097 return true;
3098
3099 // If X and Y are both negative (as signed values) then their sum is not
3100 // zero unless both X and Y equal INT_MIN.
3101 if (XKnown.isNegative() && YKnown.isNegative()) {
3103 // The sign bit of X is set. If some other bit is set then X is not equal
3104 // to INT_MIN.
3105 if (XKnown.One.intersects(Mask))
3106 return true;
3107 // The sign bit of Y is set. If some other bit is set then Y is not equal
3108 // to INT_MIN.
3109 if (YKnown.One.intersects(Mask))
3110 return true;
3111 }
3112
3113 // The sum of a non-negative number and a power of two is not zero.
3114 if (XKnown.isNonNegative() &&
3115 isKnownToBeAPowerOfTwo(Y, /*OrZero*/ false, Q, Depth))
3116 return true;
3117 if (YKnown.isNonNegative() &&
3118 isKnownToBeAPowerOfTwo(X, /*OrZero*/ false, Q, Depth))
3119 return true;
3120
3121 return KnownBits::add(XKnown, YKnown, NSW, NUW).isNonZero();
3122}
3123
3124static bool isNonZeroSub(const APInt &DemandedElts, const SimplifyQuery &Q,
3125 unsigned BitWidth, Value *X, Value *Y,
3126 unsigned Depth) {
3127 // (X - (X != 0)) is non zero
3128 // ((X != 0) - X) is non zero
3129 if (matchOpWithOpEqZero(X, Y))
3130 return true;
3131
3132 // TODO: Move this case into isKnownNonEqual().
3133 if (auto *C = dyn_cast<Constant>(X))
3134 if (C->isNullValue() && isKnownNonZero(Y, DemandedElts, Q, Depth))
3135 return true;
3136
3137 return ::isKnownNonEqual(X, Y, DemandedElts, Q, Depth);
3138}
3139
3140static bool isNonZeroMul(const APInt &DemandedElts, const SimplifyQuery &Q,
3141 unsigned BitWidth, Value *X, Value *Y, bool NSW,
3142 bool NUW, unsigned Depth) {
3143 // If X and Y are non-zero then so is X * Y as long as the multiplication
3144 // does not overflow.
3145 if (NSW || NUW)
3146 return isKnownNonZero(X, DemandedElts, Q, Depth) &&
3147 isKnownNonZero(Y, DemandedElts, Q, Depth);
3148
3149 // If either X or Y is odd, then if the other is non-zero the result can't
3150 // be zero.
3151 KnownBits XKnown = computeKnownBits(X, DemandedElts, Q, Depth);
3152 if (XKnown.One[0])
3153 return isKnownNonZero(Y, DemandedElts, Q, Depth);
3154
3155 KnownBits YKnown = computeKnownBits(Y, DemandedElts, Q, Depth);
3156 if (YKnown.One[0])
3157 return XKnown.isNonZero() || isKnownNonZero(X, DemandedElts, Q, Depth);
3158
3159 // If there exists any subset of X (sX) and subset of Y (sY) s.t sX * sY is
3160 // non-zero, then X * Y is non-zero. We can find sX and sY by just taking
3161 // the lowest known One of X and Y. If they are non-zero, the result
3162 // must be non-zero. We can check if LSB(X) * LSB(Y) != 0 by doing
3163 // X.CountLeadingZeros + Y.CountLeadingZeros < BitWidth.
3164 return (XKnown.countMaxTrailingZeros() + YKnown.countMaxTrailingZeros()) <
3165 BitWidth;
3166}
3167
3168static bool isNonZeroShift(const Operator *I, const APInt &DemandedElts,
3169 const SimplifyQuery &Q, const KnownBits &KnownVal,
3170 unsigned Depth) {
3171 auto ShiftOp = [&](const APInt &Lhs, const APInt &Rhs) {
3172 switch (I->getOpcode()) {
3173 case Instruction::Shl:
3174 return Lhs.shl(Rhs);
3175 case Instruction::LShr:
3176 return Lhs.lshr(Rhs);
3177 case Instruction::AShr:
3178 return Lhs.ashr(Rhs);
3179 default:
3180 llvm_unreachable("Unknown Shift Opcode");
3181 }
3182 };
3183
3184 auto InvShiftOp = [&](const APInt &Lhs, const APInt &Rhs) {
3185 switch (I->getOpcode()) {
3186 case Instruction::Shl:
3187 return Lhs.lshr(Rhs);
3188 case Instruction::LShr:
3189 case Instruction::AShr:
3190 return Lhs.shl(Rhs);
3191 default:
3192 llvm_unreachable("Unknown Shift Opcode");
3193 }
3194 };
3195
3196 if (KnownVal.isUnknown())
3197 return false;
3198
3199 KnownBits KnownCnt =
3200 computeKnownBits(I->getOperand(1), DemandedElts, Q, Depth);
3201 APInt MaxShift = KnownCnt.getMaxValue();
3202 unsigned NumBits = KnownVal.getBitWidth();
3203 if (MaxShift.uge(NumBits))
3204 return false;
3205
3206 if (!ShiftOp(KnownVal.One, MaxShift).isZero())
3207 return true;
3208
3209 // If all of the bits shifted out are known to be zero, and Val is known
3210 // non-zero then at least one non-zero bit must remain.
3211 if (InvShiftOp(KnownVal.Zero, NumBits - MaxShift)
3212 .eq(InvShiftOp(APInt::getAllOnes(NumBits), NumBits - MaxShift)) &&
3213 isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth))
3214 return true;
3215
3216 return false;
3217}
3218
3220 const APInt &DemandedElts,
3221 const SimplifyQuery &Q, unsigned Depth) {
3222 unsigned BitWidth = getBitWidth(I->getType()->getScalarType(), Q.DL);
3223 switch (I->getOpcode()) {
3224 case Instruction::Alloca:
3225 // Alloca never returns null, malloc might.
3226 return I->getType()->getPointerAddressSpace() == 0;
3227 case Instruction::GetElementPtr:
3228 if (I->getType()->isPointerTy())
3230 break;
3231 case Instruction::BitCast: {
3232 // We need to be a bit careful here. We can only peek through the bitcast
3233 // if the scalar size of elements in the operand are smaller than and a
3234 // multiple of the size they are casting too. Take three cases:
3235 //
3236 // 1) Unsafe:
3237 // bitcast <2 x i16> %NonZero to <4 x i8>
3238 //
3239 // %NonZero can have 2 non-zero i16 elements, but isKnownNonZero on a
3240 // <4 x i8> requires that all 4 i8 elements be non-zero which isn't
3241 // guranteed (imagine just sign bit set in the 2 i16 elements).
3242 //
3243 // 2) Unsafe:
3244 // bitcast <4 x i3> %NonZero to <3 x i4>
3245 //
3246 // Even though the scalar size of the src (`i3`) is smaller than the
3247 // scalar size of the dst `i4`, because `i3` is not a multiple of `i4`
3248 // its possible for the `3 x i4` elements to be zero because there are
3249 // some elements in the destination that don't contain any full src
3250 // element.
3251 //
3252 // 3) Safe:
3253 // bitcast <4 x i8> %NonZero to <2 x i16>
3254 //
3255 // This is always safe as non-zero in the 4 i8 elements implies
3256 // non-zero in the combination of any two adjacent ones. Since i8 is a
3257 // multiple of i16, each i16 is guranteed to have 2 full i8 elements.
3258 // This all implies the 2 i16 elements are non-zero.
3259 Type *FromTy = I->getOperand(0)->getType();
3260 if ((FromTy->isIntOrIntVectorTy() || FromTy->isPtrOrPtrVectorTy()) &&
3261 (BitWidth % getBitWidth(FromTy->getScalarType(), Q.DL)) == 0)
3262 return isKnownNonZero(I->getOperand(0), Q, Depth);
3263 } break;
3264 case Instruction::IntToPtr:
3265 // Note that we have to take special care to avoid looking through
3266 // truncating casts, e.g., int2ptr/ptr2int with appropriate sizes, as well
3267 // as casts that can alter the value, e.g., AddrSpaceCasts.
3268 if (!isa<ScalableVectorType>(I->getType()) &&
3269 Q.DL.getTypeSizeInBits(I->getOperand(0)->getType()).getFixedValue() <=
3270 Q.DL.getTypeSizeInBits(I->getType()).getFixedValue())
3271 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3272 break;
3273 case Instruction::PtrToAddr:
3274 // isKnownNonZero() for pointers refers to the address bits being non-zero,
3275 // so we can directly forward.
3276 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3277 case Instruction::PtrToInt:
3278 // For inttoptr, make sure the result size is >= the address size. If the
3279 // address is non-zero, any larger value is also non-zero.
3280 if (Q.DL.getAddressSizeInBits(I->getOperand(0)->getType()) <=
3281 I->getType()->getScalarSizeInBits())
3282 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3283 break;
3284 case Instruction::Trunc:
3285 // nuw/nsw trunc preserves zero/non-zero status of input.
3286 if (auto *TI = dyn_cast<TruncInst>(I))
3287 if (TI->hasNoSignedWrap() || TI->hasNoUnsignedWrap())
3288 return isKnownNonZero(TI->getOperand(0), DemandedElts, Q, Depth);
3289 break;
3290
3291 // Iff x - y != 0, then x ^ y != 0
3292 // Therefore we can do the same exact checks
3293 case Instruction::Xor:
3294 case Instruction::Sub:
3295 return isNonZeroSub(DemandedElts, Q, BitWidth, I->getOperand(0),
3296 I->getOperand(1), Depth);
3297 case Instruction::Or:
3298 // (X | (X != 0)) is non zero
3299 if (matchOpWithOpEqZero(I->getOperand(0), I->getOperand(1)))
3300 return true;
3301 // X | Y != 0 if X != Y.
3302 if (isKnownNonEqual(I->getOperand(0), I->getOperand(1), DemandedElts, Q,
3303 Depth))
3304 return true;
3305 // X | Y != 0 if X != 0 or Y != 0.
3306 return isKnownNonZero(I->getOperand(1), DemandedElts, Q, Depth) ||
3307 isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3308 case Instruction::SExt:
3309 case Instruction::ZExt:
3310 // ext X != 0 if X != 0.
3311 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3312
3313 case Instruction::Shl: {
3314 // shl nsw/nuw can't remove any non-zero bits.
3316 if (Q.IIQ.hasNoUnsignedWrap(BO) || Q.IIQ.hasNoSignedWrap(BO))
3317 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3318
3319 // shl X, Y != 0 if X is odd. Note that the value of the shift is undefined
3320 // if the lowest bit is shifted off the end.
3321 KnownBits Known(BitWidth);
3322 computeKnownBits(I->getOperand(0), DemandedElts, Known, Q, Depth);
3323 if (Known.One[0])
3324 return true;
3325
3326 return isNonZeroShift(I, DemandedElts, Q, Known, Depth);
3327 }
3328 case Instruction::LShr:
3329 case Instruction::AShr: {
3330 // shr exact can only shift out zero bits.
3332 if (BO->isExact())
3333 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3334
3335 // shr X, Y != 0 if X is negative. Note that the value of the shift is not
3336 // defined if the sign bit is shifted off the end.
3337 KnownBits Known =
3338 computeKnownBits(I->getOperand(0), DemandedElts, Q, Depth);
3339 if (Known.isNegative())
3340 return true;
3341
3342 return isNonZeroShift(I, DemandedElts, Q, Known, Depth);
3343 }
3344 case Instruction::UDiv:
3345 case Instruction::SDiv: {
3346 // X / Y
3347 // div exact can only produce a zero if the dividend is zero.
3348 if (cast<PossiblyExactOperator>(I)->isExact())
3349 return isKnownNonZero(I->getOperand(0), DemandedElts, Q, Depth);
3350
3351 KnownBits XKnown =
3352 computeKnownBits(I->getOperand(0), DemandedElts, Q, Depth);
3353 // If X is fully unknown we won't be able to figure anything out so don't
3354 // both computing knownbits for Y.
3355 if (XKnown.isUnknown())
3356 return false;
3357
3358 KnownBits YKnown =
3359 computeKnownBits(I->getOperand(1), DemandedElts, Q, Depth);
3360 if (I->getOpcode() == Instruction::SDiv) {
3361 // For signed division need to compare abs value of the operands.
3362 XKnown = XKnown.abs(/*IntMinIsPoison*/ false);
3363 YKnown = YKnown.abs(/*IntMinIsPoison*/ false);
3364 }
3365 // If X u>= Y then div is non zero (0/0 is UB).
3366 std::optional<bool> XUgeY = KnownBits::uge(XKnown, YKnown);
3367 // If X is total unknown or X u< Y we won't be able to prove non-zero
3368 // with compute known bits so just return early.
3369 return XUgeY && *XUgeY;
3370 }
3371 case Instruction::Add: {
3372 // X + Y.
3373
3374 // If Add has nuw wrap flag, then if either X or Y is non-zero the result is
3375 // non-zero.
3377 return isNonZeroAdd(DemandedElts, Q, BitWidth, I->getOperand(0),
3378 I->getOperand(1), Q.IIQ.hasNoSignedWrap(BO),
3379 Q.IIQ.hasNoUnsignedWrap(BO), Depth);
3380 }
3381 case Instruction::Mul: {
3383 return isNonZeroMul(DemandedElts, Q, BitWidth, I->getOperand(0),
3384 I->getOperand(1), Q.IIQ.hasNoSignedWrap(BO),
3385 Q.IIQ.hasNoUnsignedWrap(BO), Depth);
3386 }
3387 case Instruction::Select: {
3388 // (C ? X : Y) != 0 if X != 0 and Y != 0.
3389
3390 // First check if the arm is non-zero using `isKnownNonZero`. If that fails,
3391 // then see if the select condition implies the arm is non-zero. For example
3392 // (X != 0 ? X : Y), we know the true arm is non-zero as the `X` "return" is
3393 // dominated by `X != 0`.
3394 auto SelectArmIsNonZero = [&](bool IsTrueArm) {
3395 Value *Op;
3396 Op = IsTrueArm ? I->getOperand(1) : I->getOperand(2);
3397 // Op is trivially non-zero.
3398 if (isKnownNonZero(Op, DemandedElts, Q, Depth))
3399 return true;
3400
3401 // The condition of the select dominates the true/false arm. Check if the
3402 // condition implies that a given arm is non-zero.
3403 Value *X;
3404 CmpPredicate Pred;
3405 if (!match(I->getOperand(0), m_c_ICmp(Pred, m_Specific(Op), m_Value(X))))
3406 return false;
3407
3408 if (!IsTrueArm)
3409 Pred = ICmpInst::getInversePredicate(Pred);
3410
3411 return cmpExcludesZero(Pred, X);
3412 };
3413
3414 if (SelectArmIsNonZero(/* IsTrueArm */ true) &&
3415 SelectArmIsNonZero(/* IsTrueArm */ false))
3416 return true;
3417 break;
3418 }
3419 case Instruction::PHI: {
3420 auto *PN = cast<PHINode>(I);
3422 return true;
3423
3424 // Check if all incoming values are non-zero using recursion.
3426 unsigned NewDepth = std::max(Depth, MaxAnalysisRecursionDepth - 1);
3427 return llvm::all_of(PN->operands(), [&](const Use &U) {
3428 if (U.get() == PN)
3429 return true;
3430 RecQ.CxtI = PN->getIncomingBlock(U)->getTerminator();
3431 // Check if the branch on the phi excludes zero.
3432 CmpPredicate Pred;
3433 Value *X;
3434 BasicBlock *TrueSucc, *FalseSucc;
3435 if (match(RecQ.CxtI,
3436 m_Br(m_c_ICmp(Pred, m_Specific(U.get()), m_Value(X)),
3437 m_BasicBlock(TrueSucc), m_BasicBlock(FalseSucc)))) {
3438 // Check for cases of duplicate successors.
3439 if ((TrueSucc == PN->getParent()) != (FalseSucc == PN->getParent())) {
3440 // If we're using the false successor, invert the predicate.
3441 if (FalseSucc == PN->getParent())
3442 Pred = CmpInst::getInversePredicate(Pred);
3443 if (cmpExcludesZero(Pred, X))
3444 return true;
3445 }
3446 }
3447 // Finally recurse on the edge and check it directly.
3448 return isKnownNonZero(U.get(), DemandedElts, RecQ, NewDepth);
3449 });
3450 }
3451 case Instruction::InsertElement: {
3452 if (isa<ScalableVectorType>(I->getType()))
3453 break;
3454
3455 const Value *Vec = I->getOperand(0);
3456 const Value *Elt = I->getOperand(1);
3457 auto *CIdx = dyn_cast<ConstantInt>(I->getOperand(2));
3458
3459 unsigned NumElts = DemandedElts.getBitWidth();
3460 APInt DemandedVecElts = DemandedElts;
3461 bool SkipElt = false;
3462 // If we know the index we are inserting too, clear it from Vec check.
3463 if (CIdx && CIdx->getValue().ult(NumElts)) {
3464 DemandedVecElts.clearBit(CIdx->getZExtValue());
3465 SkipElt = !DemandedElts[CIdx->getZExtValue()];
3466 }
3467
3468 // Result is zero if Elt is non-zero and rest of the demanded elts in Vec
3469 // are non-zero.
3470 return (SkipElt || isKnownNonZero(Elt, Q, Depth)) &&
3471 (DemandedVecElts.isZero() ||
3472 isKnownNonZero(Vec, DemandedVecElts, Q, Depth));
3473 }
3474 case Instruction::ExtractElement:
3475 if (const auto *EEI = dyn_cast<ExtractElementInst>(I)) {
3476 const Value *Vec = EEI->getVectorOperand();
3477 const Value *Idx = EEI->getIndexOperand();
3478 auto *CIdx = dyn_cast<ConstantInt>(Idx);
3479 if (auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType())) {
3480 unsigned NumElts = VecTy->getNumElements();
3481 APInt DemandedVecElts = APInt::getAllOnes(NumElts);
3482 if (CIdx && CIdx->getValue().ult(NumElts))
3483 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
3484 return isKnownNonZero(Vec, DemandedVecElts, Q, Depth);
3485 }
3486 }
3487 break;
3488 case Instruction::ShuffleVector: {
3489 auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
3490 if (!Shuf)
3491 break;
3492 APInt DemandedLHS, DemandedRHS;
3493 // For undef elements, we don't know anything about the common state of
3494 // the shuffle result.
3495 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
3496 break;
3497 // If demanded elements for both vecs are non-zero, the shuffle is non-zero.
3498 return (DemandedRHS.isZero() ||
3499 isKnownNonZero(Shuf->getOperand(1), DemandedRHS, Q, Depth)) &&
3500 (DemandedLHS.isZero() ||
3501 isKnownNonZero(Shuf->getOperand(0), DemandedLHS, Q, Depth));
3502 }
3503 case Instruction::Freeze:
3504 return isKnownNonZero(I->getOperand(0), Q, Depth) &&
3505 isGuaranteedNotToBePoison(I->getOperand(0), Q.AC, Q.CxtI, Q.DT,
3506 Depth);
3507 case Instruction::Load: {
3508 auto *LI = cast<LoadInst>(I);
3509 // A Load tagged with nonnull or dereferenceable with null pointer undefined
3510 // is never null.
3511 if (auto *PtrT = dyn_cast<PointerType>(I->getType())) {
3512 if (Q.IIQ.getMetadata(LI, LLVMContext::MD_nonnull) ||
3513 (Q.IIQ.getMetadata(LI, LLVMContext::MD_dereferenceable) &&
3514 !NullPointerIsDefined(LI->getFunction(), PtrT->getAddressSpace())))
3515 return true;
3516 } else if (MDNode *Ranges = Q.IIQ.getMetadata(LI, LLVMContext::MD_range)) {
3518 }
3519
3520 // No need to fall through to computeKnownBits as range metadata is already
3521 // handled in isKnownNonZero.
3522 return false;
3523 }
3524 case Instruction::ExtractValue: {
3525 const WithOverflowInst *WO;
3527 switch (WO->getBinaryOp()) {
3528 default:
3529 break;
3530 case Instruction::Add:
3531 return isNonZeroAdd(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3532 WO->getArgOperand(1),
3533 /*NSW=*/false,
3534 /*NUW=*/false, Depth);
3535 case Instruction::Sub:
3536 return isNonZeroSub(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3537 WO->getArgOperand(1), Depth);
3538 case Instruction::Mul:
3539 return isNonZeroMul(DemandedElts, Q, BitWidth, WO->getArgOperand(0),
3540 WO->getArgOperand(1),
3541 /*NSW=*/false, /*NUW=*/false, Depth);
3542 break;
3543 }
3544 }
3545 break;
3546 }
3547 case Instruction::Call:
3548 case Instruction::Invoke: {
3549 const auto *Call = cast<CallBase>(I);
3550 if (I->getType()->isPointerTy()) {
3551 if (Call->isReturnNonNull())
3552 return true;
3553 if (const auto *RP = getArgumentAliasingToReturnedPointer(Call, true))
3554 return isKnownNonZero(RP, Q, Depth);
3555 } else {
3556 if (MDNode *Ranges = Q.IIQ.getMetadata(Call, LLVMContext::MD_range))
3558 if (std::optional<ConstantRange> Range = Call->getRange()) {
3559 const APInt ZeroValue(Range->getBitWidth(), 0);
3560 if (!Range->contains(ZeroValue))
3561 return true;
3562 }
3563 if (const Value *RV = Call->getReturnedArgOperand())
3564 if (RV->getType() == I->getType() && isKnownNonZero(RV, Q, Depth))
3565 return true;
3566 }
3567
3568 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
3569 switch (II->getIntrinsicID()) {
3570 case Intrinsic::sshl_sat:
3571 case Intrinsic::ushl_sat:
3572 case Intrinsic::abs:
3573 case Intrinsic::bitreverse:
3574 case Intrinsic::bswap:
3575 case Intrinsic::ctpop:
3576 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3577 // NB: We don't do usub_sat here as in any case we can prove its
3578 // non-zero, we will fold it to `sub nuw` in InstCombine.
3579 case Intrinsic::ssub_sat:
3580 // For most types, if x != y then ssub.sat x, y != 0. But
3581 // ssub.sat.i1 0, -1 = 0, because 1 saturates to 0. This means
3582 // isNonZeroSub will do the wrong thing for ssub.sat.i1.
3583 if (BitWidth == 1)
3584 return false;
3585 return isNonZeroSub(DemandedElts, Q, BitWidth, II->getArgOperand(0),
3586 II->getArgOperand(1), Depth);
3587 case Intrinsic::sadd_sat:
3588 return isNonZeroAdd(DemandedElts, Q, BitWidth, II->getArgOperand(0),
3589 II->getArgOperand(1),
3590 /*NSW=*/true, /* NUW=*/false, Depth);
3591 // Vec reverse preserves zero/non-zero status from input vec.
3592 case Intrinsic::vector_reverse:
3593 return isKnownNonZero(II->getArgOperand(0), DemandedElts.reverseBits(),
3594 Q, Depth);
3595 // umin/smin/smax/smin/or of all non-zero elements is always non-zero.
3596 case Intrinsic::vector_reduce_or:
3597 case Intrinsic::vector_reduce_umax:
3598 case Intrinsic::vector_reduce_umin:
3599 case Intrinsic::vector_reduce_smax:
3600 case Intrinsic::vector_reduce_smin:
3601 return isKnownNonZero(II->getArgOperand(0), Q, Depth);
3602 case Intrinsic::umax:
3603 case Intrinsic::uadd_sat:
3604 // umax(X, (X != 0)) is non zero
3605 // X +usat (X != 0) is non zero
3606 if (matchOpWithOpEqZero(II->getArgOperand(0), II->getArgOperand(1)))
3607 return true;
3608
3609 return isKnownNonZero(II->getArgOperand(1), DemandedElts, Q, Depth) ||
3610 isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3611 case Intrinsic::smax: {
3612 // If either arg is strictly positive the result is non-zero. Otherwise
3613 // the result is non-zero if both ops are non-zero.
3614 auto IsNonZero = [&](Value *Op, std::optional<bool> &OpNonZero,
3615 const KnownBits &OpKnown) {
3616 if (!OpNonZero.has_value())
3617 OpNonZero = OpKnown.isNonZero() ||
3618 isKnownNonZero(Op, DemandedElts, Q, Depth);
3619 return *OpNonZero;
3620 };
3621 // Avoid re-computing isKnownNonZero.
3622 std::optional<bool> Op0NonZero, Op1NonZero;
3623 KnownBits Op1Known =
3624 computeKnownBits(II->getArgOperand(1), DemandedElts, Q, Depth);
3625 if (Op1Known.isNonNegative() &&
3626 IsNonZero(II->getArgOperand(1), Op1NonZero, Op1Known))
3627 return true;
3628 KnownBits Op0Known =
3629 computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth);
3630 if (Op0Known.isNonNegative() &&
3631 IsNonZero(II->getArgOperand(0), Op0NonZero, Op0Known))
3632 return true;
3633 return IsNonZero(II->getArgOperand(1), Op1NonZero, Op1Known) &&
3634 IsNonZero(II->getArgOperand(0), Op0NonZero, Op0Known);
3635 }
3636 case Intrinsic::smin: {
3637 // If either arg is negative the result is non-zero. Otherwise
3638 // the result is non-zero if both ops are non-zero.
3639 KnownBits Op1Known =
3640 computeKnownBits(II->getArgOperand(1), DemandedElts, Q, Depth);
3641 if (Op1Known.isNegative())
3642 return true;
3643 KnownBits Op0Known =
3644 computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth);
3645 if (Op0Known.isNegative())
3646 return true;
3647
3648 if (Op1Known.isNonZero() && Op0Known.isNonZero())
3649 return true;
3650 }
3651 [[fallthrough]];
3652 case Intrinsic::umin:
3653 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth) &&
3654 isKnownNonZero(II->getArgOperand(1), DemandedElts, Q, Depth);
3655 case Intrinsic::cttz:
3656 return computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth)
3657 .Zero[0];
3658 case Intrinsic::ctlz:
3659 return computeKnownBits(II->getArgOperand(0), DemandedElts, Q, Depth)
3660 .isNonNegative();
3661 case Intrinsic::fshr:
3662 case Intrinsic::fshl:
3663 // If Op0 == Op1, this is a rotate. rotate(x, y) != 0 iff x != 0.
3664 if (II->getArgOperand(0) == II->getArgOperand(1))
3665 return isKnownNonZero(II->getArgOperand(0), DemandedElts, Q, Depth);
3666 break;
3667 case Intrinsic::vscale:
3668 return true;
3669 case Intrinsic::experimental_get_vector_length:
3670 return isKnownNonZero(I->getOperand(0), Q, Depth);
3671 default:
3672 break;
3673 }
3674 break;
3675 }
3676
3677 return false;
3678 }
3679 }
3680
3681 KnownBits Known(BitWidth);
3682 computeKnownBits(I, DemandedElts, Known, Q, Depth);
3683 return Known.One != 0;
3684}
3685
3686/// Return true if the given value is known to be non-zero when defined. For
3687/// vectors, return true if every demanded element is known to be non-zero when
3688/// defined. For pointers, if the context instruction and dominator tree are
3689/// specified, perform context-sensitive analysis and return true if the
3690/// pointer couldn't possibly be null at the specified instruction.
3691/// Supports values with integer or pointer type and vectors of integers.
3692bool isKnownNonZero(const Value *V, const APInt &DemandedElts,
3693 const SimplifyQuery &Q, unsigned Depth) {
3694 Type *Ty = V->getType();
3695
3696#ifndef NDEBUG
3697 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
3698
3699 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
3700 assert(
3701 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
3702 "DemandedElt width should equal the fixed vector number of elements");
3703 } else {
3704 assert(DemandedElts == APInt(1, 1) &&
3705 "DemandedElt width should be 1 for scalars");
3706 }
3707#endif
3708
3709 if (auto *C = dyn_cast<Constant>(V)) {
3710 if (C->isNullValue())
3711 return false;
3712 if (isa<ConstantInt>(C))
3713 // Must be non-zero due to null test above.
3714 return true;
3715
3716 // For constant vectors, check that all elements are poison or known
3717 // non-zero to determine that the whole vector is known non-zero.
3718 if (auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
3719 for (unsigned i = 0, e = VecTy->getNumElements(); i != e; ++i) {
3720 if (!DemandedElts[i])
3721 continue;
3722 Constant *Elt = C->getAggregateElement(i);
3723 if (!Elt || Elt->isNullValue())
3724 return false;
3725 if (!isa<PoisonValue>(Elt) && !isa<ConstantInt>(Elt))
3726 return false;
3727 }
3728 return true;
3729 }
3730
3731 // Constant ptrauth can be null, iff the base pointer can be.
3732 if (auto *CPA = dyn_cast<ConstantPtrAuth>(V))
3733 return isKnownNonZero(CPA->getPointer(), DemandedElts, Q, Depth);
3734
3735 // A global variable in address space 0 is non null unless extern weak
3736 // or an absolute symbol reference. Other address spaces may have null as a
3737 // valid address for a global, so we can't assume anything.
3738 if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
3739 if (!GV->isAbsoluteSymbolRef() && !GV->hasExternalWeakLinkage() &&
3740 GV->getType()->getAddressSpace() == 0)
3741 return true;
3742 }
3743
3744 // For constant expressions, fall through to the Operator code below.
3745 if (!isa<ConstantExpr>(V))
3746 return false;
3747 }
3748
3749 if (const auto *A = dyn_cast<Argument>(V))
3750 if (std::optional<ConstantRange> Range = A->getRange()) {
3751 const APInt ZeroValue(Range->getBitWidth(), 0);
3752 if (!Range->contains(ZeroValue))
3753 return true;
3754 }
3755
3756 if (!isa<Constant>(V) && isKnownNonZeroFromAssume(V, Q))
3757 return true;
3758
3759 // Some of the tests below are recursive, so bail out if we hit the limit.
3761 return false;
3762
3763 // Check for pointer simplifications.
3764
3765 if (PointerType *PtrTy = dyn_cast<PointerType>(Ty)) {
3766 // A byval, inalloca may not be null in a non-default addres space. A
3767 // nonnull argument is assumed never 0.
3768 if (const Argument *A = dyn_cast<Argument>(V)) {
3769 if (((A->hasPassPointeeByValueCopyAttr() &&
3770 !NullPointerIsDefined(A->getParent(), PtrTy->getAddressSpace())) ||
3771 A->hasNonNullAttr()))
3772 return true;
3773 }
3774 }
3775
3776 if (const auto *I = dyn_cast<Operator>(V))
3777 if (isKnownNonZeroFromOperator(I, DemandedElts, Q, Depth))
3778 return true;
3779
3780 if (!isa<Constant>(V) &&
3782 return true;
3783
3784 if (const Value *Stripped = stripNullTest(V))
3785 return isKnownNonZero(Stripped, DemandedElts, Q, Depth);
3786
3787 return false;
3788}
3789
3791 unsigned Depth) {
3792 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
3793 APInt DemandedElts =
3794 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
3795 return ::isKnownNonZero(V, DemandedElts, Q, Depth);
3796}
3797
3798/// If the pair of operators are the same invertible function, return the
3799/// the operands of the function corresponding to each input. Otherwise,
3800/// return std::nullopt. An invertible function is one that is 1-to-1 and maps
3801/// every input value to exactly one output value. This is equivalent to
3802/// saying that Op1 and Op2 are equal exactly when the specified pair of
3803/// operands are equal, (except that Op1 and Op2 may be poison more often.)
3804static std::optional<std::pair<Value*, Value*>>
3806 const Operator *Op2) {
3807 if (Op1->getOpcode() != Op2->getOpcode())
3808 return std::nullopt;
3809
3810 auto getOperands = [&](unsigned OpNum) -> auto {
3811 return std::make_pair(Op1->getOperand(OpNum), Op2->getOperand(OpNum));
3812 };
3813
3814 switch (Op1->getOpcode()) {
3815 default:
3816 break;
3817 case Instruction::Or:
3818 if (!cast<PossiblyDisjointInst>(Op1)->isDisjoint() ||
3819 !cast<PossiblyDisjointInst>(Op2)->isDisjoint())
3820 break;
3821 [[fallthrough]];
3822 case Instruction::Xor:
3823 case Instruction::Add: {
3824 Value *Other;
3825 if (match(Op2, m_c_BinOp(m_Specific(Op1->getOperand(0)), m_Value(Other))))
3826 return std::make_pair(Op1->getOperand(1), Other);
3827 if (match(Op2, m_c_BinOp(m_Specific(Op1->getOperand(1)), m_Value(Other))))
3828 return std::make_pair(Op1->getOperand(0), Other);
3829 break;
3830 }
3831 case Instruction::Sub:
3832 if (Op1->getOperand(0) == Op2->getOperand(0))
3833 return getOperands(1);
3834 if (Op1->getOperand(1) == Op2->getOperand(1))
3835 return getOperands(0);
3836 break;
3837 case Instruction::Mul: {
3838 // invertible if A * B == (A * B) mod 2^N where A, and B are integers
3839 // and N is the bitwdith. The nsw case is non-obvious, but proven by
3840 // alive2: https://alive2.llvm.org/ce/z/Z6D5qK
3841 auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
3842 auto *OBO2 = cast<OverflowingBinaryOperator>(Op2);
3843 if ((!OBO1->hasNoUnsignedWrap() || !OBO2->hasNoUnsignedWrap()) &&
3844 (!OBO1->hasNoSignedWrap() || !OBO2->hasNoSignedWrap()))
3845 break;
3846
3847 // Assume operand order has been canonicalized
3848 if (Op1->getOperand(1) == Op2->getOperand(1) &&
3849 isa<ConstantInt>(Op1->getOperand(1)) &&
3850 !cast<ConstantInt>(Op1->getOperand(1))->isZero())
3851 return getOperands(0);
3852 break;
3853 }
3854 case Instruction::Shl: {
3855 // Same as multiplies, with the difference that we don't need to check
3856 // for a non-zero multiply. Shifts always multiply by non-zero.
3857 auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
3858 auto *OBO2 = cast<OverflowingBinaryOperator>(Op2);
3859 if ((!OBO1->hasNoUnsignedWrap() || !OBO2->hasNoUnsignedWrap()) &&
3860 (!OBO1->hasNoSignedWrap() || !OBO2->hasNoSignedWrap()))
3861 break;
3862
3863 if (Op1->getOperand(1) == Op2->getOperand(1))
3864 return getOperands(0);
3865 break;
3866 }
3867 case Instruction::AShr:
3868 case Instruction::LShr: {
3869 auto *PEO1 = cast<PossiblyExactOperator>(Op1);
3870 auto *PEO2 = cast<PossiblyExactOperator>(Op2);
3871 if (!PEO1->isExact() || !PEO2->isExact())
3872 break;
3873
3874 if (Op1->getOperand(1) == Op2->getOperand(1))
3875 return getOperands(0);
3876 break;
3877 }
3878 case Instruction::SExt:
3879 case Instruction::ZExt:
3880 if (Op1->getOperand(0)->getType() == Op2->getOperand(0)->getType())
3881 return getOperands(0);
3882 break;
3883 case Instruction::PHI: {
3884 const PHINode *PN1 = cast<PHINode>(Op1);
3885 const PHINode *PN2 = cast<PHINode>(Op2);
3886
3887 // If PN1 and PN2 are both recurrences, can we prove the entire recurrences
3888 // are a single invertible function of the start values? Note that repeated
3889 // application of an invertible function is also invertible
3890 BinaryOperator *BO1 = nullptr;
3891 Value *Start1 = nullptr, *Step1 = nullptr;
3892 BinaryOperator *BO2 = nullptr;
3893 Value *Start2 = nullptr, *Step2 = nullptr;
3894 if (PN1->getParent() != PN2->getParent() ||
3895 !matchSimpleRecurrence(PN1, BO1, Start1, Step1) ||
3896 !matchSimpleRecurrence(PN2, BO2, Start2, Step2))
3897 break;
3898
3899 auto Values = getInvertibleOperands(cast<Operator>(BO1),
3900 cast<Operator>(BO2));
3901 if (!Values)
3902 break;
3903
3904 // We have to be careful of mutually defined recurrences here. Ex:
3905 // * X_i = X_(i-1) OP Y_(i-1), and Y_i = X_(i-1) OP V
3906 // * X_i = Y_i = X_(i-1) OP Y_(i-1)
3907 // The invertibility of these is complicated, and not worth reasoning
3908 // about (yet?).
3909 if (Values->first != PN1 || Values->second != PN2)
3910 break;
3911
3912 return std::make_pair(Start1, Start2);
3913 }
3914 }
3915 return std::nullopt;
3916}
3917
3918/// Return true if V1 == (binop V2, X), where X is known non-zero.
3919/// Only handle a small subset of binops where (binop V2, X) with non-zero X
3920/// implies V2 != V1.
3921static bool isModifyingBinopOfNonZero(const Value *V1, const Value *V2,
3922 const APInt &DemandedElts,
3923 const SimplifyQuery &Q, unsigned Depth) {
3925 if (!BO)
3926 return false;
3927 switch (BO->getOpcode()) {
3928 default:
3929 break;
3930 case Instruction::Or:
3931 if (!cast<PossiblyDisjointInst>(V1)->isDisjoint())
3932 break;
3933 [[fallthrough]];
3934 case Instruction::Xor:
3935 case Instruction::Add:
3936 Value *Op = nullptr;
3937 if (V2 == BO->getOperand(0))
3938 Op = BO->getOperand(1);
3939 else if (V2 == BO->getOperand(1))
3940 Op = BO->getOperand(0);
3941 else
3942 return false;
3943 return isKnownNonZero(Op, 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/1 and
3949/// the multiplication is nuw or nsw.
3950static bool isNonEqualMul(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_Mul(m_Specific(V1), m_APInt(C))) &&
3956 (OBO->hasNoUnsignedWrap() || OBO->hasNoSignedWrap()) &&
3957 !C->isZero() && !C->isOne() &&
3958 isKnownNonZero(V1, DemandedElts, Q, Depth + 1);
3959 }
3960 return false;
3961}
3962
3963/// Return true if V2 == V1 << C, where V1 is known non-zero, C is not 0 and
3964/// the shift is nuw or nsw.
3965static bool isNonEqualShl(const Value *V1, const Value *V2,
3966 const APInt &DemandedElts, const SimplifyQuery &Q,
3967 unsigned Depth) {
3968 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(V2)) {
3969 const APInt *C;
3970 return match(OBO, m_Shl(m_Specific(V1), m_APInt(C))) &&
3971 (OBO->hasNoUnsignedWrap() || OBO->hasNoSignedWrap()) &&
3972 !C->isZero() && isKnownNonZero(V1, DemandedElts, Q, Depth + 1);
3973 }
3974 return false;
3975}
3976
3977static bool isNonEqualPHIs(const PHINode *PN1, const PHINode *PN2,
3978 const APInt &DemandedElts, const SimplifyQuery &Q,
3979 unsigned Depth) {
3980 // Check two PHIs are in same block.
3981 if (PN1->getParent() != PN2->getParent())
3982 return false;
3983
3985 bool UsedFullRecursion = false;
3986 for (const BasicBlock *IncomBB : PN1->blocks()) {
3987 if (!VisitedBBs.insert(IncomBB).second)
3988 continue; // Don't reprocess blocks that we have dealt with already.
3989 const Value *IV1 = PN1->getIncomingValueForBlock(IncomBB);
3990 const Value *IV2 = PN2->getIncomingValueForBlock(IncomBB);
3991 const APInt *C1, *C2;
3992 if (match(IV1, m_APInt(C1)) && match(IV2, m_APInt(C2)) && *C1 != *C2)
3993 continue;
3994
3995 // Only one pair of phi operands is allowed for full recursion.
3996 if (UsedFullRecursion)
3997 return false;
3998
4000 RecQ.CxtI = IncomBB->getTerminator();
4001 if (!isKnownNonEqual(IV1, IV2, DemandedElts, RecQ, Depth + 1))
4002 return false;
4003 UsedFullRecursion = true;
4004 }
4005 return true;
4006}
4007
4008static bool isNonEqualSelect(const Value *V1, const Value *V2,
4009 const APInt &DemandedElts, const SimplifyQuery &Q,
4010 unsigned Depth) {
4011 const SelectInst *SI1 = dyn_cast<SelectInst>(V1);
4012 if (!SI1)
4013 return false;
4014
4015 if (const SelectInst *SI2 = dyn_cast<SelectInst>(V2)) {
4016 const Value *Cond1 = SI1->getCondition();
4017 const Value *Cond2 = SI2->getCondition();
4018 if (Cond1 == Cond2)
4019 return isKnownNonEqual(SI1->getTrueValue(), SI2->getTrueValue(),
4020 DemandedElts, Q, Depth + 1) &&
4021 isKnownNonEqual(SI1->getFalseValue(), SI2->getFalseValue(),
4022 DemandedElts, Q, Depth + 1);
4023 }
4024 return isKnownNonEqual(SI1->getTrueValue(), V2, DemandedElts, Q, Depth + 1) &&
4025 isKnownNonEqual(SI1->getFalseValue(), V2, DemandedElts, Q, Depth + 1);
4026}
4027
4028// Check to see if A is both a GEP and is the incoming value for a PHI in the
4029// loop, and B is either a ptr or another GEP. If the PHI has 2 incoming values,
4030// one of them being the recursive GEP A and the other a ptr at same base and at
4031// the same/higher offset than B we are only incrementing the pointer further in
4032// loop if offset of recursive GEP is greater than 0.
4034 const SimplifyQuery &Q) {
4035 if (!A->getType()->isPointerTy() || !B->getType()->isPointerTy())
4036 return false;
4037
4038 auto *GEPA = dyn_cast<GEPOperator>(A);
4039 if (!GEPA || GEPA->getNumIndices() != 1 || !isa<Constant>(GEPA->idx_begin()))
4040 return false;
4041
4042 // Handle 2 incoming PHI values with one being a recursive GEP.
4043 auto *PN = dyn_cast<PHINode>(GEPA->getPointerOperand());
4044 if (!PN || PN->getNumIncomingValues() != 2)
4045 return false;
4046
4047 // Search for the recursive GEP as an incoming operand, and record that as
4048 // Step.
4049 Value *Start = nullptr;
4050 Value *Step = const_cast<Value *>(A);
4051 if (PN->getIncomingValue(0) == Step)
4052 Start = PN->getIncomingValue(1);
4053 else if (PN->getIncomingValue(1) == Step)
4054 Start = PN->getIncomingValue(0);
4055 else
4056 return false;
4057
4058 // Other incoming node base should match the B base.
4059 // StartOffset >= OffsetB && StepOffset > 0?
4060 // StartOffset <= OffsetB && StepOffset < 0?
4061 // Is non-equal if above are true.
4062 // We use stripAndAccumulateInBoundsConstantOffsets to restrict the
4063 // optimisation to inbounds GEPs only.
4064 unsigned IndexWidth = Q.DL.getIndexTypeSizeInBits(Start->getType());
4065 APInt StartOffset(IndexWidth, 0);
4066 Start = Start->stripAndAccumulateInBoundsConstantOffsets(Q.DL, StartOffset);
4067 APInt StepOffset(IndexWidth, 0);
4068 Step = Step->stripAndAccumulateInBoundsConstantOffsets(Q.DL, StepOffset);
4069
4070 // Check if Base Pointer of Step matches the PHI.
4071 if (Step != PN)
4072 return false;
4073 APInt OffsetB(IndexWidth, 0);
4074 B = B->stripAndAccumulateInBoundsConstantOffsets(Q.DL, OffsetB);
4075 return Start == B &&
4076 ((StartOffset.sge(OffsetB) && StepOffset.isStrictlyPositive()) ||
4077 (StartOffset.sle(OffsetB) && StepOffset.isNegative()));
4078}
4079
4080static bool isKnownNonEqualFromContext(const Value *V1, const Value *V2,
4081 const SimplifyQuery &Q, unsigned Depth) {
4082 if (!Q.CxtI)
4083 return false;
4084
4085 // Try to infer NonEqual based on information from dominating conditions.
4086 if (Q.DC && Q.DT) {
4087 auto IsKnownNonEqualFromDominatingCondition = [&](const Value *V) {
4088 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
4089 Value *Cond = BI->getCondition();
4090 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
4091 if (Q.DT->dominates(Edge0, Q.CxtI->getParent()) &&
4093 /*LHSIsTrue=*/true, Depth)
4094 .value_or(false))
4095 return true;
4096
4097 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
4098 if (Q.DT->dominates(Edge1, Q.CxtI->getParent()) &&
4100 /*LHSIsTrue=*/false, Depth)
4101 .value_or(false))
4102 return true;
4103 }
4104
4105 return false;
4106 };
4107
4108 if (IsKnownNonEqualFromDominatingCondition(V1) ||
4109 IsKnownNonEqualFromDominatingCondition(V2))
4110 return true;
4111 }
4112
4113 if (!Q.AC)
4114 return false;
4115
4116 // Try to infer NonEqual based on information from assumptions.
4117 for (auto &AssumeVH : Q.AC->assumptionsFor(V1)) {
4118 if (!AssumeVH)
4119 continue;
4120 CallInst *I = cast<CallInst>(AssumeVH);
4121
4122 assert(I->getFunction() == Q.CxtI->getFunction() &&
4123 "Got assumption for the wrong function!");
4124 assert(I->getIntrinsicID() == Intrinsic::assume &&
4125 "must be an assume intrinsic");
4126
4127 if (isImpliedCondition(I->getArgOperand(0), ICmpInst::ICMP_NE, V1, V2, Q.DL,
4128 /*LHSIsTrue=*/true, Depth)
4129 .value_or(false) &&
4131 return true;
4132 }
4133
4134 return false;
4135}
4136
4137/// Return true if it is known that V1 != V2.
4138static bool isKnownNonEqual(const Value *V1, const Value *V2,
4139 const APInt &DemandedElts, const SimplifyQuery &Q,
4140 unsigned Depth) {
4141 if (V1 == V2)
4142 return false;
4143 if (V1->getType() != V2->getType())
4144 // We can't look through casts yet.
4145 return false;
4146
4148 return false;
4149
4150 // See if we can recurse through (exactly one of) our operands. This
4151 // requires our operation be 1-to-1 and map every input value to exactly
4152 // one output value. Such an operation is invertible.
4153 auto *O1 = dyn_cast<Operator>(V1);
4154 auto *O2 = dyn_cast<Operator>(V2);
4155 if (O1 && O2 && O1->getOpcode() == O2->getOpcode()) {
4156 if (auto Values = getInvertibleOperands(O1, O2))
4157 return isKnownNonEqual(Values->first, Values->second, DemandedElts, Q,
4158 Depth + 1);
4159
4160 if (const PHINode *PN1 = dyn_cast<PHINode>(V1)) {
4161 const PHINode *PN2 = cast<PHINode>(V2);
4162 // FIXME: This is missing a generalization to handle the case where one is
4163 // a PHI and another one isn't.
4164 if (isNonEqualPHIs(PN1, PN2, DemandedElts, Q, Depth))
4165 return true;
4166 };
4167 }
4168
4169 if (isModifyingBinopOfNonZero(V1, V2, DemandedElts, Q, Depth) ||
4170 isModifyingBinopOfNonZero(V2, V1, DemandedElts, Q, Depth))
4171 return true;
4172
4173 if (isNonEqualMul(V1, V2, DemandedElts, Q, Depth) ||
4174 isNonEqualMul(V2, V1, DemandedElts, Q, Depth))
4175 return true;
4176
4177 if (isNonEqualShl(V1, V2, DemandedElts, Q, Depth) ||
4178 isNonEqualShl(V2, V1, DemandedElts, Q, Depth))
4179 return true;
4180
4181 if (V1->getType()->isIntOrIntVectorTy()) {
4182 // Are any known bits in V1 contradictory to known bits in V2? If V1
4183 // has a known zero where V2 has a known one, they must not be equal.
4184 KnownBits Known1 = computeKnownBits(V1, DemandedElts, Q, Depth);
4185 if (!Known1.isUnknown()) {
4186 KnownBits Known2 = computeKnownBits(V2, DemandedElts, Q, Depth);
4187 if (Known1.Zero.intersects(Known2.One) ||
4188 Known2.Zero.intersects(Known1.One))
4189 return true;
4190 }
4191 }
4192
4193 if (isNonEqualSelect(V1, V2, DemandedElts, Q, Depth) ||
4194 isNonEqualSelect(V2, V1, DemandedElts, Q, Depth))
4195 return true;
4196
4197 if (isNonEqualPointersWithRecursiveGEP(V1, V2, Q) ||
4199 return true;
4200
4201 Value *A, *B;
4202 // PtrToInts are NonEqual if their Ptrs are NonEqual.
4203 // Check PtrToInt type matches the pointer size.
4204 if (match(V1, m_PtrToIntSameSize(Q.DL, m_Value(A))) &&
4206 return isKnownNonEqual(A, B, DemandedElts, Q, Depth + 1);
4207
4208 if (isKnownNonEqualFromContext(V1, V2, Q, Depth))
4209 return true;
4210
4211 return false;
4212}
4213
4214/// For vector constants, loop over the elements and find the constant with the
4215/// minimum number of sign bits. Return 0 if the value is not a vector constant
4216/// or if any element was not analyzed; otherwise, return the count for the
4217/// element with the minimum number of sign bits.
4219 const APInt &DemandedElts,
4220 unsigned TyBits) {
4221 const auto *CV = dyn_cast<Constant>(V);
4222 if (!CV || !isa<FixedVectorType>(CV->getType()))
4223 return 0;
4224
4225 unsigned MinSignBits = TyBits;
4226 unsigned NumElts = cast<FixedVectorType>(CV->getType())->getNumElements();
4227 for (unsigned i = 0; i != NumElts; ++i) {
4228 if (!DemandedElts[i])
4229 continue;
4230 // If we find a non-ConstantInt, bail out.
4231 auto *Elt = dyn_cast_or_null<ConstantInt>(CV->getAggregateElement(i));
4232 if (!Elt)
4233 return 0;
4234
4235 MinSignBits = std::min(MinSignBits, Elt->getValue().getNumSignBits());
4236 }
4237
4238 return MinSignBits;
4239}
4240
4241static unsigned ComputeNumSignBitsImpl(const Value *V,
4242 const APInt &DemandedElts,
4243 const SimplifyQuery &Q, unsigned Depth);
4244
4245static unsigned ComputeNumSignBits(const Value *V, const APInt &DemandedElts,
4246 const SimplifyQuery &Q, unsigned Depth) {
4247 unsigned Result = ComputeNumSignBitsImpl(V, DemandedElts, Q, Depth);
4248 assert(Result > 0 && "At least one sign bit needs to be present!");
4249 return Result;
4250}
4251
4252/// Return the number of times the sign bit of the register is replicated into
4253/// the other bits. We know that at least 1 bit is always equal to the sign bit
4254/// (itself), but other cases can give us information. For example, immediately
4255/// after an "ashr X, 2", we know that the top 3 bits are all equal to each
4256/// other, so we return 3. For vectors, return the number of sign bits for the
4257/// vector element with the minimum number of known sign bits of the demanded
4258/// elements in the vector specified by DemandedElts.
4259static unsigned ComputeNumSignBitsImpl(const Value *V,
4260 const APInt &DemandedElts,
4261 const SimplifyQuery &Q, unsigned Depth) {
4262 Type *Ty = V->getType();
4263#ifndef NDEBUG
4264 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
4265
4266 if (auto *FVTy = dyn_cast<FixedVectorType>(Ty)) {
4267 assert(
4268 FVTy->getNumElements() == DemandedElts.getBitWidth() &&
4269 "DemandedElt width should equal the fixed vector number of elements");
4270 } else {
4271 assert(DemandedElts == APInt(1, 1) &&
4272 "DemandedElt width should be 1 for scalars");
4273 }
4274#endif
4275
4276 // We return the minimum number of sign bits that are guaranteed to be present
4277 // in V, so for undef we have to conservatively return 1. We don't have the
4278 // same behavior for poison though -- that's a FIXME today.
4279
4280 Type *ScalarTy = Ty->getScalarType();
4281 unsigned TyBits = ScalarTy->isPointerTy() ?
4282 Q.DL.getPointerTypeSizeInBits(ScalarTy) :
4283 Q.DL.getTypeSizeInBits(ScalarTy);
4284
4285 unsigned Tmp, Tmp2;
4286 unsigned FirstAnswer = 1;
4287
4288 // Note that ConstantInt is handled by the general computeKnownBits case
4289 // below.
4290
4292 return 1;
4293
4294 if (auto *U = dyn_cast<Operator>(V)) {
4295 switch (Operator::getOpcode(V)) {
4296 default: break;
4297 case Instruction::BitCast: {
4298 Value *Src = U->getOperand(0);
4299 Type *SrcTy = Src->getType();
4300
4301 // Skip if the source type is not an integer or integer vector type
4302 // This ensures we only process integer-like types
4303 if (!SrcTy->isIntOrIntVectorTy())
4304 break;
4305
4306 unsigned SrcBits = SrcTy->getScalarSizeInBits();
4307
4308 // Bitcast 'large element' scalar/vector to 'small element' vector.
4309 if ((SrcBits % TyBits) != 0)
4310 break;
4311
4312 // Only proceed if the destination type is a fixed-size vector
4313 if (isa<FixedVectorType>(Ty)) {
4314 // Fast case - sign splat can be simply split across the small elements.
4315 // This works for both vector and scalar sources
4316 Tmp = ComputeNumSignBits(Src, Q, Depth + 1);
4317 if (Tmp == SrcBits)
4318 return TyBits;
4319 }
4320 break;
4321 }
4322 case Instruction::SExt:
4323 Tmp = TyBits - U->getOperand(0)->getType()->getScalarSizeInBits();
4324 return ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1) +
4325 Tmp;
4326
4327 case Instruction::SDiv: {
4328 const APInt *Denominator;
4329 // sdiv X, C -> adds log(C) sign bits.
4330 if (match(U->getOperand(1), m_APInt(Denominator))) {
4331
4332 // Ignore non-positive denominator.
4333 if (!Denominator->isStrictlyPositive())
4334 break;
4335
4336 // Calculate the incoming numerator bits.
4337 unsigned NumBits =
4338 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4339
4340 // Add floor(log(C)) bits to the numerator bits.
4341 return std::min(TyBits, NumBits + Denominator->logBase2());
4342 }
4343 break;
4344 }
4345
4346 case Instruction::SRem: {
4347 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4348
4349 const APInt *Denominator;
4350 // srem X, C -> we know that the result is within [-C+1,C) when C is a
4351 // positive constant. This let us put a lower bound on the number of sign
4352 // bits.
4353 if (match(U->getOperand(1), m_APInt(Denominator))) {
4354
4355 // Ignore non-positive denominator.
4356 if (Denominator->isStrictlyPositive()) {
4357 // Calculate the leading sign bit constraints by examining the
4358 // denominator. Given that the denominator is positive, there are two
4359 // cases:
4360 //
4361 // 1. The numerator is positive. The result range is [0,C) and
4362 // [0,C) u< (1 << ceilLogBase2(C)).
4363 //
4364 // 2. The numerator is negative. Then the result range is (-C,0] and
4365 // integers in (-C,0] are either 0 or >u (-1 << ceilLogBase2(C)).
4366 //
4367 // Thus a lower bound on the number of sign bits is `TyBits -
4368 // ceilLogBase2(C)`.
4369
4370 unsigned ResBits = TyBits - Denominator->ceilLogBase2();
4371 Tmp = std::max(Tmp, ResBits);
4372 }
4373 }
4374 return Tmp;
4375 }
4376
4377 case Instruction::AShr: {
4378 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4379 // ashr X, C -> adds C sign bits. Vectors too.
4380 const APInt *ShAmt;
4381 if (match(U->getOperand(1), m_APInt(ShAmt))) {
4382 if (ShAmt->uge(TyBits))
4383 break; // Bad shift.
4384 unsigned ShAmtLimited = ShAmt->getZExtValue();
4385 Tmp += ShAmtLimited;
4386 if (Tmp > TyBits) Tmp = TyBits;
4387 }
4388 return Tmp;
4389 }
4390 case Instruction::Shl: {
4391 const APInt *ShAmt;
4392 Value *X = nullptr;
4393 if (match(U->getOperand(1), m_APInt(ShAmt))) {
4394 // shl destroys sign bits.
4395 if (ShAmt->uge(TyBits))
4396 break; // Bad shift.
4397 // We can look through a zext (more or less treating it as a sext) if
4398 // all extended bits are shifted out.
4399 if (match(U->getOperand(0), m_ZExt(m_Value(X))) &&
4400 ShAmt->uge(TyBits - X->getType()->getScalarSizeInBits())) {
4401 Tmp = ComputeNumSignBits(X, DemandedElts, Q, Depth + 1);
4402 Tmp += TyBits - X->getType()->getScalarSizeInBits();
4403 } else
4404 Tmp =
4405 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4406 if (ShAmt->uge(Tmp))
4407 break; // Shifted all sign bits out.
4408 Tmp2 = ShAmt->getZExtValue();
4409 return Tmp - Tmp2;
4410 }
4411 break;
4412 }
4413 case Instruction::And:
4414 case Instruction::Or:
4415 case Instruction::Xor: // NOT is handled here.
4416 // Logical binary ops preserve the number of sign bits at the worst.
4417 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4418 if (Tmp != 1) {
4419 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4420 FirstAnswer = std::min(Tmp, Tmp2);
4421 // We computed what we know about the sign bits as our first
4422 // answer. Now proceed to the generic code that uses
4423 // computeKnownBits, and pick whichever answer is better.
4424 }
4425 break;
4426
4427 case Instruction::Select: {
4428 // If we have a clamp pattern, we know that the number of sign bits will
4429 // be the minimum of the clamp min/max range.
4430 const Value *X;
4431 const APInt *CLow, *CHigh;
4432 if (isSignedMinMaxClamp(U, X, CLow, CHigh))
4433 return std::min(CLow->getNumSignBits(), CHigh->getNumSignBits());
4434
4435 Tmp = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4436 if (Tmp == 1)
4437 break;
4438 Tmp2 = ComputeNumSignBits(U->getOperand(2), DemandedElts, Q, Depth + 1);
4439 return std::min(Tmp, Tmp2);
4440 }
4441
4442 case Instruction::Add:
4443 // Add can have at most one carry bit. Thus we know that the output
4444 // is, at worst, one more bit than the inputs.
4445 Tmp = ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4446 if (Tmp == 1) break;
4447
4448 // Special case decrementing a value (ADD X, -1):
4449 if (const auto *CRHS = dyn_cast<Constant>(U->getOperand(1)))
4450 if (CRHS->isAllOnesValue()) {
4451 KnownBits Known(TyBits);
4452 computeKnownBits(U->getOperand(0), DemandedElts, Known, Q, Depth + 1);
4453
4454 // If the input is known to be 0 or 1, the output is 0/-1, which is
4455 // all sign bits set.
4456 if ((Known.Zero | 1).isAllOnes())
4457 return TyBits;
4458
4459 // If we are subtracting one from a positive number, there is no carry
4460 // out of the result.
4461 if (Known.isNonNegative())
4462 return Tmp;
4463 }
4464
4465 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4466 if (Tmp2 == 1)
4467 break;
4468 return std::min(Tmp, Tmp2) - 1;
4469
4470 case Instruction::Sub:
4471 Tmp2 = ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4472 if (Tmp2 == 1)
4473 break;
4474
4475 // Handle NEG.
4476 if (const auto *CLHS = dyn_cast<Constant>(U->getOperand(0)))
4477 if (CLHS->isNullValue()) {
4478 KnownBits Known(TyBits);
4479 computeKnownBits(U->getOperand(1), DemandedElts, Known, Q, Depth + 1);
4480 // If the input is known to be 0 or 1, the output is 0/-1, which is
4481 // all sign bits set.
4482 if ((Known.Zero | 1).isAllOnes())
4483 return TyBits;
4484
4485 // If the input is known to be positive (the sign bit is known clear),
4486 // the output of the NEG has the same number of sign bits as the
4487 // input.
4488 if (Known.isNonNegative())
4489 return Tmp2;
4490
4491 // Otherwise, we treat this like a SUB.
4492 }
4493
4494 // Sub can have at most one carry bit. Thus we know that the output
4495 // is, at worst, one more bit than the inputs.
4496 Tmp = ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4497 if (Tmp == 1)
4498 break;
4499 return std::min(Tmp, Tmp2) - 1;
4500
4501 case Instruction::Mul: {
4502 // The output of the Mul can be at most twice the valid bits in the
4503 // inputs.
4504 unsigned SignBitsOp0 =
4505 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4506 if (SignBitsOp0 == 1)
4507 break;
4508 unsigned SignBitsOp1 =
4509 ComputeNumSignBits(U->getOperand(1), DemandedElts, Q, Depth + 1);
4510 if (SignBitsOp1 == 1)
4511 break;
4512 unsigned OutValidBits =
4513 (TyBits - SignBitsOp0 + 1) + (TyBits - SignBitsOp1 + 1);
4514 return OutValidBits > TyBits ? 1 : TyBits - OutValidBits + 1;
4515 }
4516
4517 case Instruction::PHI: {
4518 const PHINode *PN = cast<PHINode>(U);
4519 unsigned NumIncomingValues = PN->getNumIncomingValues();
4520 // Don't analyze large in-degree PHIs.
4521 if (NumIncomingValues > 4) break;
4522 // Unreachable blocks may have zero-operand PHI nodes.
4523 if (NumIncomingValues == 0) break;
4524
4525 // Take the minimum of all incoming values. This can't infinitely loop
4526 // because of our depth threshold.
4528 Tmp = TyBits;
4529 for (unsigned i = 0, e = NumIncomingValues; i != e; ++i) {
4530 if (Tmp == 1) return Tmp;
4531 RecQ.CxtI = PN->getIncomingBlock(i)->getTerminator();
4532 Tmp = std::min(Tmp, ComputeNumSignBits(PN->getIncomingValue(i),
4533 DemandedElts, RecQ, Depth + 1));
4534 }
4535 return Tmp;
4536 }
4537
4538 case Instruction::Trunc: {
4539 // If the input contained enough sign bits that some remain after the
4540 // truncation, then we can make use of that. Otherwise we don't know
4541 // anything.
4542 Tmp = ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4543 unsigned OperandTyBits = U->getOperand(0)->getType()->getScalarSizeInBits();
4544 if (Tmp > (OperandTyBits - TyBits))
4545 return Tmp - (OperandTyBits - TyBits);
4546
4547 return 1;
4548 }
4549
4550 case Instruction::ExtractElement:
4551 // Look through extract element. At the moment we keep this simple and
4552 // skip tracking the specific element. But at least we might find
4553 // information valid for all elements of the vector (for example if vector
4554 // is sign extended, shifted, etc).
4555 return ComputeNumSignBits(U->getOperand(0), Q, Depth + 1);
4556
4557 case Instruction::ShuffleVector: {
4558 // Collect the minimum number of sign bits that are shared by every vector
4559 // element referenced by the shuffle.
4560 auto *Shuf = dyn_cast<ShuffleVectorInst>(U);
4561 if (!Shuf) {
4562 // FIXME: Add support for shufflevector constant expressions.
4563 return 1;
4564 }
4565 APInt DemandedLHS, DemandedRHS;
4566 // For undef elements, we don't know anything about the common state of
4567 // the shuffle result.
4568 if (!getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
4569 return 1;
4570 Tmp = std::numeric_limits<unsigned>::max();
4571 if (!!DemandedLHS) {
4572 const Value *LHS = Shuf->getOperand(0);
4573 Tmp = ComputeNumSignBits(LHS, DemandedLHS, Q, Depth + 1);
4574 }
4575 // If we don't know anything, early out and try computeKnownBits
4576 // fall-back.
4577 if (Tmp == 1)
4578 break;
4579 if (!!DemandedRHS) {
4580 const Value *RHS = Shuf->getOperand(1);
4581 Tmp2 = ComputeNumSignBits(RHS, DemandedRHS, Q, Depth + 1);
4582 Tmp = std::min(Tmp, Tmp2);
4583 }
4584 // If we don't know anything, early out and try computeKnownBits
4585 // fall-back.
4586 if (Tmp == 1)
4587 break;
4588 assert(Tmp <= TyBits && "Failed to determine minimum sign bits");
4589 return Tmp;
4590 }
4591 case Instruction::Call: {
4592 if (const auto *II = dyn_cast<IntrinsicInst>(U)) {
4593 switch (II->getIntrinsicID()) {
4594 default:
4595 break;
4596 case Intrinsic::abs:
4597 Tmp =
4598 ComputeNumSignBits(U->getOperand(0), DemandedElts, Q, Depth + 1);
4599 if (Tmp == 1)
4600 break;
4601
4602 // Absolute value reduces number of sign bits by at most 1.
4603 return Tmp - 1;
4604 case Intrinsic::smin:
4605 case Intrinsic::smax: {
4606 const APInt *CLow, *CHigh;
4607 if (isSignedMinMaxIntrinsicClamp(II, CLow, CHigh))
4608 return std::min(CLow->getNumSignBits(), CHigh->getNumSignBits());
4609 }
4610 }
4611 }
4612 }
4613 }
4614 }
4615
4616 // Finally, if we can prove that the top bits of the result are 0's or 1's,
4617 // use this information.
4618
4619 // If we can examine all elements of a vector constant successfully, we're
4620 // done (we can't do any better than that). If not, keep trying.
4621 if (unsigned VecSignBits =
4622 computeNumSignBitsVectorConstant(V, DemandedElts, TyBits))
4623 return VecSignBits;
4624
4625 KnownBits Known(TyBits);
4626 computeKnownBits(V, DemandedElts, Known, Q, Depth);
4627
4628 // If we know that the sign bit is either zero or one, determine the number of
4629 // identical bits in the top of the input value.
4630 return std::max(FirstAnswer, Known.countMinSignBits());
4631}
4632
4634 const TargetLibraryInfo *TLI) {
4635 const Function *F = CB.getCalledFunction();
4636 if (!F)
4638
4639 if (F->isIntrinsic())
4640 return F->getIntrinsicID();
4641
4642 // We are going to infer semantics of a library function based on mapping it
4643 // to an LLVM intrinsic. Check that the library function is available from
4644 // this callbase and in this environment.
4645 LibFunc Func;
4646 if (F->hasLocalLinkage() || !TLI || !TLI->getLibFunc(CB, Func) ||
4647 !CB.onlyReadsMemory())
4649
4650 switch (Func) {
4651 default:
4652 break;
4653 case LibFunc_sin:
4654 case LibFunc_sinf:
4655 case LibFunc_sinl:
4656 return Intrinsic::sin;
4657 case LibFunc_cos:
4658 case LibFunc_cosf:
4659 case LibFunc_cosl:
4660 return Intrinsic::cos;
4661 case LibFunc_tan:
4662 case LibFunc_tanf:
4663 case LibFunc_tanl:
4664 return Intrinsic::tan;
4665 case LibFunc_asin:
4666 case LibFunc_asinf:
4667 case LibFunc_asinl:
4668 return Intrinsic::asin;
4669 case LibFunc_acos:
4670 case LibFunc_acosf:
4671 case LibFunc_acosl:
4672 return Intrinsic::acos;
4673 case LibFunc_atan:
4674 case LibFunc_atanf:
4675 case LibFunc_atanl:
4676 return Intrinsic::atan;
4677 case LibFunc_atan2:
4678 case LibFunc_atan2f:
4679 case LibFunc_atan2l:
4680 return Intrinsic::atan2;
4681 case LibFunc_sinh:
4682 case LibFunc_sinhf:
4683 case LibFunc_sinhl:
4684 return Intrinsic::sinh;
4685 case LibFunc_cosh:
4686 case LibFunc_coshf:
4687 case LibFunc_coshl:
4688 return Intrinsic::cosh;
4689 case LibFunc_tanh:
4690 case LibFunc_tanhf:
4691 case LibFunc_tanhl:
4692 return Intrinsic::tanh;
4693 case LibFunc_exp:
4694 case LibFunc_expf:
4695 case LibFunc_expl:
4696 return Intrinsic::exp;
4697 case LibFunc_exp2:
4698 case LibFunc_exp2f:
4699 case LibFunc_exp2l:
4700 return Intrinsic::exp2;
4701 case LibFunc_exp10:
4702 case LibFunc_exp10f:
4703 case LibFunc_exp10l:
4704 return Intrinsic::exp10;
4705 case LibFunc_log:
4706 case LibFunc_logf:
4707 case LibFunc_logl:
4708 return Intrinsic::log;
4709 case LibFunc_log10:
4710 case LibFunc_log10f:
4711 case LibFunc_log10l:
4712 return Intrinsic::log10;
4713 case LibFunc_log2:
4714 case LibFunc_log2f:
4715 case LibFunc_log2l:
4716 return Intrinsic::log2;
4717 case LibFunc_fabs:
4718 case LibFunc_fabsf:
4719 case LibFunc_fabsl:
4720 return Intrinsic::fabs;
4721 case LibFunc_fmin:
4722 case LibFunc_fminf:
4723 case LibFunc_fminl:
4724 return Intrinsic::minnum;
4725 case LibFunc_fmax:
4726 case LibFunc_fmaxf:
4727 case LibFunc_fmaxl:
4728 return Intrinsic::maxnum;
4729 case LibFunc_copysign:
4730 case LibFunc_copysignf:
4731 case LibFunc_copysignl:
4732 return Intrinsic::copysign;
4733 case LibFunc_floor:
4734 case LibFunc_floorf:
4735 case LibFunc_floorl:
4736 return Intrinsic::floor;
4737 case LibFunc_ceil:
4738 case LibFunc_ceilf:
4739 case LibFunc_ceill:
4740 return Intrinsic::ceil;
4741 case LibFunc_trunc:
4742 case LibFunc_truncf:
4743 case LibFunc_truncl:
4744 return Intrinsic::trunc;
4745 case LibFunc_rint:
4746 case LibFunc_rintf:
4747 case LibFunc_rintl:
4748 return Intrinsic::rint;
4749 case LibFunc_nearbyint:
4750 case LibFunc_nearbyintf:
4751 case LibFunc_nearbyintl:
4752 return Intrinsic::nearbyint;
4753 case LibFunc_round:
4754 case LibFunc_roundf:
4755 case LibFunc_roundl:
4756 return Intrinsic::round;
4757 case LibFunc_roundeven:
4758 case LibFunc_roundevenf:
4759 case LibFunc_roundevenl:
4760 return Intrinsic::roundeven;
4761 case LibFunc_pow:
4762 case LibFunc_powf:
4763 case LibFunc_powl:
4764 return Intrinsic::pow;
4765 case LibFunc_sqrt:
4766 case LibFunc_sqrtf:
4767 case LibFunc_sqrtl:
4768 return Intrinsic::sqrt;
4769 }
4770
4772}
4773
4774/// Given an exploded icmp instruction, return true if the comparison only
4775/// checks the sign bit. If it only checks the sign bit, set TrueIfSigned if
4776/// the result of the comparison is true when the input value is signed.
4778 bool &TrueIfSigned) {
4779 switch (Pred) {
4780 case ICmpInst::ICMP_SLT: // True if LHS s< 0
4781 TrueIfSigned = true;
4782 return RHS.isZero();
4783 case ICmpInst::ICMP_SLE: // True if LHS s<= -1
4784 TrueIfSigned = true;
4785 return RHS.isAllOnes();
4786 case ICmpInst::ICMP_SGT: // True if LHS s> -1
4787 TrueIfSigned = false;
4788 return RHS.isAllOnes();
4789 case ICmpInst::ICMP_SGE: // True if LHS s>= 0
4790 TrueIfSigned = false;
4791 return RHS.isZero();
4792 case ICmpInst::ICMP_UGT:
4793 // True if LHS u> RHS and RHS == sign-bit-mask - 1
4794 TrueIfSigned = true;
4795 return RHS.isMaxSignedValue();
4796 case ICmpInst::ICMP_UGE:
4797 // True if LHS u>= RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc)
4798 TrueIfSigned = true;
4799 return RHS.isMinSignedValue();
4800 case ICmpInst::ICMP_ULT:
4801 // True if LHS u< RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc)
4802 TrueIfSigned = false;
4803 return RHS.isMinSignedValue();
4804 case ICmpInst::ICMP_ULE:
4805 // True if LHS u<= RHS and RHS == sign-bit-mask - 1
4806 TrueIfSigned = false;
4807 return RHS.isMaxSignedValue();
4808 default:
4809 return false;
4810 }
4811}
4812
4814 bool CondIsTrue,
4815 const Instruction *CxtI,
4816 KnownFPClass &KnownFromContext,
4817 unsigned Depth = 0) {
4818 Value *A, *B;
4820 (CondIsTrue ? match(Cond, m_LogicalAnd(m_Value(A), m_Value(B)))
4821 : match(Cond, m_LogicalOr(m_Value(A), m_Value(B))))) {
4822 computeKnownFPClassFromCond(V, A, CondIsTrue, CxtI, KnownFromContext,
4823 Depth + 1);
4824 computeKnownFPClassFromCond(V, B, CondIsTrue, CxtI, KnownFromContext,
4825 Depth + 1);
4826 return;
4827 }
4829 computeKnownFPClassFromCond(V, A, !CondIsTrue, CxtI, KnownFromContext,
4830 Depth + 1);
4831 return;
4832 }
4833 CmpPredicate Pred;
4834 Value *LHS;
4835 uint64_t ClassVal = 0;
4836 const APFloat *CRHS;
4837 const APInt *RHS;
4838 if (match(Cond, m_FCmp(Pred, m_Value(LHS), m_APFloat(CRHS)))) {
4839 auto [CmpVal, MaskIfTrue, MaskIfFalse] = fcmpImpliesClass(
4840 Pred, *cast<Instruction>(Cond)->getParent()->getParent(), LHS, *CRHS,
4841 LHS != V);
4842 if (CmpVal == V)
4843 KnownFromContext.knownNot(~(CondIsTrue ? MaskIfTrue : MaskIfFalse));
4845 m_Specific(V), m_ConstantInt(ClassVal)))) {
4846 FPClassTest Mask = static_cast<FPClassTest>(ClassVal);
4847 KnownFromContext.knownNot(CondIsTrue ? ~Mask : Mask);
4848 } else if (match(Cond, m_ICmp(Pred, m_ElementWiseBitCast(m_Specific(V)),
4849 m_APInt(RHS)))) {
4850 bool TrueIfSigned;
4851 if (!isSignBitCheck(Pred, *RHS, TrueIfSigned))
4852 return;
4853 if (TrueIfSigned == CondIsTrue)
4854 KnownFromContext.signBitMustBeOne();
4855 else
4856 KnownFromContext.signBitMustBeZero();
4857 }
4858}
4859
4861 const SimplifyQuery &Q) {
4862 KnownFPClass KnownFromContext;
4863
4864 if (Q.CC && Q.CC->AffectedValues.contains(V))
4866 KnownFromContext);
4867
4868 if (!Q.CxtI)
4869 return KnownFromContext;
4870
4871 if (Q.DC && Q.DT) {
4872 // Handle dominating conditions.
4873 for (BranchInst *BI : Q.DC->conditionsFor(V)) {
4874 Value *Cond = BI->getCondition();
4875
4876 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
4877 if (Q.DT->dominates(Edge0, Q.CxtI->getParent()))
4878 computeKnownFPClassFromCond(V, Cond, /*CondIsTrue=*/true, Q.CxtI,
4879 KnownFromContext);
4880
4881 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
4882 if (Q.DT->dominates(Edge1, Q.CxtI->getParent()))
4883 computeKnownFPClassFromCond(V, Cond, /*CondIsTrue=*/false, Q.CxtI,
4884 KnownFromContext);
4885 }
4886 }
4887
4888 if (!Q.AC)
4889 return KnownFromContext;
4890
4891 // Try to restrict the floating-point classes based on information from
4892 // assumptions.
4893 for (auto &AssumeVH : Q.AC->assumptionsFor(V)) {
4894 if (!AssumeVH)
4895 continue;
4896 CallInst *I = cast<CallInst>(AssumeVH);
4897
4898 assert(I->getFunction() == Q.CxtI->getParent()->getParent() &&
4899 "Got assumption for the wrong function!");
4900 assert(I->getIntrinsicID() == Intrinsic::assume &&
4901 "must be an assume intrinsic");
4902
4903 if (!isValidAssumeForContext(I, Q.CxtI, Q.DT))
4904 continue;
4905
4906 computeKnownFPClassFromCond(V, I->getArgOperand(0),
4907 /*CondIsTrue=*/true, Q.CxtI, KnownFromContext);
4908 }
4909
4910 return KnownFromContext;
4911}
4912
4914 Value *Arm, bool Invert,
4915 const SimplifyQuery &SQ,
4916 unsigned Depth) {
4917
4918 KnownFPClass KnownSrc;
4920 /*CondIsTrue=*/!Invert, SQ.CxtI, KnownSrc,
4921 Depth + 1);
4922 KnownSrc = KnownSrc.unionWith(Known);
4923 if (KnownSrc.isUnknown())
4924 return;
4925
4926 if (isGuaranteedNotToBeUndef(Arm, SQ.AC, SQ.CxtI, SQ.DT, Depth + 1))
4927 Known = KnownSrc;
4928}
4929
4930void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
4931 FPClassTest InterestedClasses, KnownFPClass &Known,
4932 const SimplifyQuery &Q, unsigned Depth);
4933
4934static void computeKnownFPClass(const Value *V, KnownFPClass &Known,
4935 FPClassTest InterestedClasses,
4936 const SimplifyQuery &Q, unsigned Depth) {
4937 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
4938 APInt DemandedElts =
4939 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
4940 computeKnownFPClass(V, DemandedElts, InterestedClasses, Known, Q, Depth);
4941}
4942
4944 const APInt &DemandedElts,
4945 FPClassTest InterestedClasses,
4946 KnownFPClass &Known,
4947 const SimplifyQuery &Q,
4948 unsigned Depth) {
4949 if ((InterestedClasses &
4951 return;
4952
4953 KnownFPClass KnownSrc;
4954 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
4955 KnownSrc, Q, Depth + 1);
4956 Known = KnownFPClass::fptrunc(KnownSrc);
4957}
4958
4960 switch (IID) {
4961 case Intrinsic::minimum:
4963 case Intrinsic::maximum:
4965 case Intrinsic::minimumnum:
4967 case Intrinsic::maximumnum:
4969 case Intrinsic::minnum:
4971 case Intrinsic::maxnum:
4973 default:
4974 llvm_unreachable("not a floating-point min-max intrinsic");
4975 }
4976}
4977
4978/// \return true if this is a floating point value that is known to have a
4979/// magnitude smaller than 1. i.e., fabs(X) <= 1.0
4980static bool isAbsoluteValueLessEqualOne(const Value *V) {
4981 // TODO: Handle frexp and x - floor(x)?
4983}
4984
4985void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
4986 FPClassTest InterestedClasses, KnownFPClass &Known,
4987 const SimplifyQuery &Q, unsigned Depth) {
4988 assert(Known.isUnknown() && "should not be called with known information");
4989
4990 if (!DemandedElts) {
4991 // No demanded elts, better to assume we don't know anything.
4992 Known.resetAll();
4993 return;
4994 }
4995
4996 assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
4997
4998 if (auto *CFP = dyn_cast<ConstantFP>(V)) {
4999 Known = KnownFPClass(CFP->getValueAPF());
5000 return;
5001 }
5002
5004 Known.KnownFPClasses = fcPosZero;
5005 Known.SignBit = false;
5006 return;
5007 }
5008
5009 if (isa<PoisonValue>(V)) {
5010 Known.KnownFPClasses = fcNone;
5011 Known.SignBit = false;
5012 return;
5013 }
5014
5015 // Try to handle fixed width vector constants
5016 auto *VFVTy = dyn_cast<FixedVectorType>(V->getType());
5017 const Constant *CV = dyn_cast<Constant>(V);
5018 if (VFVTy && CV) {
5019 Known.KnownFPClasses = fcNone;
5020 bool SignBitAllZero = true;
5021 bool SignBitAllOne = true;
5022
5023 // For vectors, verify that each element is not NaN.
5024 unsigned NumElts = VFVTy->getNumElements();
5025 for (unsigned i = 0; i != NumElts; ++i) {
5026 if (!DemandedElts[i])
5027 continue;
5028
5029 Constant *Elt = CV->getAggregateElement(i);
5030 if (!Elt) {
5031 Known = KnownFPClass();
5032 return;
5033 }
5034 if (isa<PoisonValue>(Elt))
5035 continue;
5036 auto *CElt = dyn_cast<ConstantFP>(Elt);
5037 if (!CElt) {
5038 Known = KnownFPClass();
5039 return;
5040 }
5041
5042 const APFloat &C = CElt->getValueAPF();
5043 Known.KnownFPClasses |= C.classify();
5044 if (C.isNegative())
5045 SignBitAllZero = false;
5046 else
5047 SignBitAllOne = false;
5048 }
5049 if (SignBitAllOne != SignBitAllZero)
5050 Known.SignBit = SignBitAllOne;
5051 return;
5052 }
5053
5054 if (const auto *CDS = dyn_cast<ConstantDataSequential>(V)) {
5055 Known.KnownFPClasses = fcNone;
5056 for (size_t I = 0, E = CDS->getNumElements(); I != E; ++I)
5057 Known |= CDS->getElementAsAPFloat(I).classify();
5058 return;
5059 }
5060
5061 FPClassTest KnownNotFromFlags = fcNone;
5062 if (const auto *CB = dyn_cast<CallBase>(V))
5063 KnownNotFromFlags |= CB->getRetNoFPClass();
5064 else if (const auto *Arg = dyn_cast<Argument>(V))
5065 KnownNotFromFlags |= Arg->getNoFPClass();
5066
5067 const Operator *Op = dyn_cast<Operator>(V);
5069 if (FPOp->hasNoNaNs())
5070 KnownNotFromFlags |= fcNan;
5071 if (FPOp->hasNoInfs())
5072 KnownNotFromFlags |= fcInf;
5073 }
5074
5075 KnownFPClass AssumedClasses = computeKnownFPClassFromContext(V, Q);
5076 KnownNotFromFlags |= ~AssumedClasses.KnownFPClasses;
5077
5078 // We no longer need to find out about these bits from inputs if we can
5079 // assume this from flags/attributes.
5080 InterestedClasses &= ~KnownNotFromFlags;
5081
5082 llvm::scope_exit ClearClassesFromFlags([=, &Known] {
5083 Known.knownNot(KnownNotFromFlags);
5084 if (!Known.SignBit && AssumedClasses.SignBit) {
5085 if (*AssumedClasses.SignBit)
5086 Known.signBitMustBeOne();
5087 else
5088 Known.signBitMustBeZero();
5089 }
5090 });
5091
5092 if (!Op)
5093 return;
5094
5095 // All recursive calls that increase depth must come after this.
5097 return;
5098
5099 const unsigned Opc = Op->getOpcode();
5100 switch (Opc) {
5101 case Instruction::FNeg: {
5102 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
5103 Known, Q, Depth + 1);
5104 Known.fneg();
5105 break;
5106 }
5107 case Instruction::Select: {
5108 auto ComputeForArm = [&](Value *Arm, bool Invert) {
5109 KnownFPClass Res;
5110 computeKnownFPClass(Arm, DemandedElts, InterestedClasses, Res, Q,
5111 Depth + 1);
5112 adjustKnownFPClassForSelectArm(Res, Op->getOperand(0), Arm, Invert, Q,
5113 Depth);
5114 return Res;
5115 };
5116 // Only known if known in both the LHS and RHS.
5117 Known =
5118 ComputeForArm(Op->getOperand(1), /*Invert=*/false)
5119 .intersectWith(ComputeForArm(Op->getOperand(2), /*Invert=*/true));
5120 break;
5121 }
5122 case Instruction::Load: {
5123 const MDNode *NoFPClass =
5124 cast<LoadInst>(Op)->getMetadata(LLVMContext::MD_nofpclass);
5125 if (!NoFPClass)
5126 break;
5127
5128 ConstantInt *MaskVal =
5130 Known.knownNot(static_cast<FPClassTest>(MaskVal->getZExtValue()));
5131 break;
5132 }
5133 case Instruction::Call: {
5134 const CallInst *II = cast<CallInst>(Op);
5135 const Intrinsic::ID IID = II->getIntrinsicID();
5136 switch (IID) {
5137 case Intrinsic::fabs: {
5138 if ((InterestedClasses & (fcNan | fcPositive)) != fcNone) {
5139 // If we only care about the sign bit we don't need to inspect the
5140 // operand.
5141 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5142 InterestedClasses, Known, Q, Depth + 1);
5143 }
5144
5145 Known.fabs();
5146 break;
5147 }
5148 case Intrinsic::copysign: {
5149 KnownFPClass KnownSign;
5150
5151 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5152 Known, Q, Depth + 1);
5153 computeKnownFPClass(II->getArgOperand(1), DemandedElts, InterestedClasses,
5154 KnownSign, Q, Depth + 1);
5155 Known.copysign(KnownSign);
5156 break;
5157 }
5158 case Intrinsic::fma:
5159 case Intrinsic::fmuladd: {
5160 if ((InterestedClasses & fcNegative) == fcNone)
5161 break;
5162
5163 // FIXME: This should check isGuaranteedNotToBeUndef
5164 if (II->getArgOperand(0) == II->getArgOperand(1)) {
5165 KnownFPClass KnownSrc, KnownAddend;
5166 computeKnownFPClass(II->getArgOperand(2), DemandedElts,
5167 InterestedClasses, KnownAddend, Q, Depth + 1);
5168 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5169 InterestedClasses, KnownSrc, Q, Depth + 1);
5170
5171 const Function *F = II->getFunction();
5172 const fltSemantics &FltSem =
5173 II->getType()->getScalarType()->getFltSemantics();
5175 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5176
5177 if (KnownNotFromFlags & fcNan) {
5178 KnownSrc.knownNot(fcNan);
5179 KnownAddend.knownNot(fcNan);
5180 }
5181
5182 if (KnownNotFromFlags & fcInf) {
5183 KnownSrc.knownNot(fcInf);
5184 KnownAddend.knownNot(fcInf);
5185 }
5186
5187 Known = KnownFPClass::fma_square(KnownSrc, KnownAddend, Mode);
5188 break;
5189 }
5190
5191 KnownFPClass KnownSrc[3];
5192 for (int I = 0; I != 3; ++I) {
5193 computeKnownFPClass(II->getArgOperand(I), DemandedElts,
5194 InterestedClasses, KnownSrc[I], Q, Depth + 1);
5195 if (KnownSrc[I].isUnknown())
5196 return;
5197
5198 if (KnownNotFromFlags & fcNan)
5199 KnownSrc[I].knownNot(fcNan);
5200 if (KnownNotFromFlags & fcInf)
5201 KnownSrc[I].knownNot(fcInf);
5202 }
5203
5204 const Function *F = II->getFunction();
5205 const fltSemantics &FltSem =
5206 II->getType()->getScalarType()->getFltSemantics();
5208 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5209 Known = KnownFPClass::fma(KnownSrc[0], KnownSrc[1], KnownSrc[2], Mode);
5210 break;
5211 }
5212 case Intrinsic::sqrt:
5213 case Intrinsic::experimental_constrained_sqrt: {
5214 KnownFPClass KnownSrc;
5215 FPClassTest InterestedSrcs = InterestedClasses;
5216 if (InterestedClasses & fcNan)
5217 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
5218
5219 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5220 KnownSrc, Q, Depth + 1);
5221
5223
5224 bool HasNSZ = Q.IIQ.hasNoSignedZeros(II);
5225 if (!HasNSZ) {
5226 const Function *F = II->getFunction();
5227 const fltSemantics &FltSem =
5228 II->getType()->getScalarType()->getFltSemantics();
5229 Mode = F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5230 }
5231
5232 Known = KnownFPClass::sqrt(KnownSrc, Mode);
5233 if (HasNSZ)
5234 Known.knownNot(fcNegZero);
5235
5236 break;
5237 }
5238 case Intrinsic::sin:
5239 case Intrinsic::cos: {
5240 // Return NaN on infinite inputs.
5241 KnownFPClass KnownSrc;
5242 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5243 KnownSrc, Q, Depth + 1);
5244 Known = IID == Intrinsic::sin ? KnownFPClass::sin(KnownSrc)
5245 : KnownFPClass::cos(KnownSrc);
5246 break;
5247 }
5248 case Intrinsic::maxnum:
5249 case Intrinsic::minnum:
5250 case Intrinsic::minimum:
5251 case Intrinsic::maximum:
5252 case Intrinsic::minimumnum:
5253 case Intrinsic::maximumnum: {
5254 KnownFPClass KnownLHS, KnownRHS;
5255 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5256 KnownLHS, Q, Depth + 1);
5257 computeKnownFPClass(II->getArgOperand(1), DemandedElts, InterestedClasses,
5258 KnownRHS, Q, Depth + 1);
5259
5260 const Function *F = II->getFunction();
5261
5263 F ? F->getDenormalMode(
5264 II->getType()->getScalarType()->getFltSemantics())
5266
5267 Known = KnownFPClass::minMaxLike(KnownLHS, KnownRHS, getMinMaxKind(IID),
5268 Mode);
5269 break;
5270 }
5271 case Intrinsic::canonicalize: {
5272 KnownFPClass KnownSrc;
5273 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5274 KnownSrc, Q, Depth + 1);
5275
5276 const Function *F = II->getFunction();
5277 DenormalMode DenormMode =
5278 F ? F->getDenormalMode(
5279 II->getType()->getScalarType()->getFltSemantics())
5281 Known = KnownFPClass::canonicalize(KnownSrc, DenormMode);
5282 break;
5283 }
5284 case Intrinsic::vector_reduce_fmax:
5285 case Intrinsic::vector_reduce_fmin:
5286 case Intrinsic::vector_reduce_fmaximum:
5287 case Intrinsic::vector_reduce_fminimum: {
5288 // reduce min/max will choose an element from one of the vector elements,
5289 // so we can infer and class information that is common to all elements.
5290 Known = computeKnownFPClass(II->getArgOperand(0), II->getFastMathFlags(),
5291 InterestedClasses, Q, Depth + 1);
5292 // Can only propagate sign if output is never NaN.
5293 if (!Known.isKnownNeverNaN())
5294 Known.SignBit.reset();
5295 break;
5296 }
5297 // reverse preserves all characteristics of the input vec's element.
5298 case Intrinsic::vector_reverse:
5299 Known = computeKnownFPClass(
5300 II->getArgOperand(0), DemandedElts.reverseBits(),
5301 II->getFastMathFlags(), InterestedClasses, Q, Depth + 1);
5302 break;
5303 case Intrinsic::trunc:
5304 case Intrinsic::floor:
5305 case Intrinsic::ceil:
5306 case Intrinsic::rint:
5307 case Intrinsic::nearbyint:
5308 case Intrinsic::round:
5309 case Intrinsic::roundeven: {
5310 KnownFPClass KnownSrc;
5311 FPClassTest InterestedSrcs = InterestedClasses;
5312 if (InterestedSrcs & fcPosFinite)
5313 InterestedSrcs |= fcPosFinite;
5314 if (InterestedSrcs & fcNegFinite)
5315 InterestedSrcs |= fcNegFinite;
5316 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5317 KnownSrc, Q, Depth + 1);
5318
5320 KnownSrc, IID == Intrinsic::trunc,
5321 V->getType()->getScalarType()->isMultiUnitFPType());
5322 break;
5323 }
5324 case Intrinsic::exp:
5325 case Intrinsic::exp2:
5326 case Intrinsic::exp10:
5327 case Intrinsic::amdgcn_exp2: {
5328 KnownFPClass KnownSrc;
5329 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5330 KnownSrc, Q, Depth + 1);
5331
5332 Known = KnownFPClass::exp(KnownSrc);
5333
5334 Type *EltTy = II->getType()->getScalarType();
5335 if (IID == Intrinsic::amdgcn_exp2 && EltTy->isFloatTy())
5336 Known.knownNot(fcSubnormal);
5337
5338 break;
5339 }
5340 case Intrinsic::fptrunc_round: {
5341 computeKnownFPClassForFPTrunc(Op, DemandedElts, InterestedClasses, Known,
5342 Q, Depth);
5343 break;
5344 }
5345 case Intrinsic::log:
5346 case Intrinsic::log10:
5347 case Intrinsic::log2:
5348 case Intrinsic::experimental_constrained_log:
5349 case Intrinsic::experimental_constrained_log10:
5350 case Intrinsic::experimental_constrained_log2:
5351 case Intrinsic::amdgcn_log: {
5352 Type *EltTy = II->getType()->getScalarType();
5353
5354 // log(+inf) -> +inf
5355 // log([+-]0.0) -> -inf
5356 // log(-inf) -> nan
5357 // log(-x) -> nan
5358 if ((InterestedClasses & (fcNan | fcInf)) != fcNone) {
5359 FPClassTest InterestedSrcs = InterestedClasses;
5360 if ((InterestedClasses & fcNegInf) != fcNone)
5361 InterestedSrcs |= fcZero | fcSubnormal;
5362 if ((InterestedClasses & fcNan) != fcNone)
5363 InterestedSrcs |= fcNan | fcNegative;
5364
5365 KnownFPClass KnownSrc;
5366 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedSrcs,
5367 KnownSrc, Q, Depth + 1);
5368
5369 const Function *F = II->getFunction();
5370 DenormalMode Mode = F ? F->getDenormalMode(EltTy->getFltSemantics())
5372 Known = KnownFPClass::log(KnownSrc, Mode);
5373 }
5374
5375 break;
5376 }
5377 case Intrinsic::powi: {
5378 if ((InterestedClasses & fcNegative) == fcNone)
5379 break;
5380
5381 const Value *Exp = II->getArgOperand(1);
5382 Type *ExpTy = Exp->getType();
5383 unsigned BitWidth = ExpTy->getScalarType()->getIntegerBitWidth();
5384 KnownBits ExponentKnownBits(BitWidth);
5385 computeKnownBits(Exp, isa<VectorType>(ExpTy) ? DemandedElts : APInt(1, 1),
5386 ExponentKnownBits, Q, Depth + 1);
5387
5388 KnownFPClass KnownSrc;
5389 if (ExponentKnownBits.isZero() || !ExponentKnownBits.isEven()) {
5390 computeKnownFPClass(II->getArgOperand(0), DemandedElts, fcNegative,
5391 KnownSrc, Q, Depth + 1);
5392 }
5393
5394 Known = KnownFPClass::powi(KnownSrc, ExponentKnownBits);
5395 break;
5396 }
5397 case Intrinsic::ldexp: {
5398 KnownFPClass KnownSrc;
5399 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5400 KnownSrc, Q, Depth + 1);
5401 // Can refine inf/zero handling based on the exponent operand.
5402 const FPClassTest ExpInfoMask = fcZero | fcSubnormal | fcInf;
5403
5404 KnownBits ExpBits;
5405 if ((KnownSrc.KnownFPClasses & ExpInfoMask) != fcNone) {
5406 const Value *ExpArg = II->getArgOperand(1);
5407 ExpBits = computeKnownBits(ExpArg, DemandedElts, Q, Depth + 1);
5408 }
5409
5410 const fltSemantics &Flt =
5411 II->getType()->getScalarType()->getFltSemantics();
5412
5413 const Function *F = II->getFunction();
5415 F ? F->getDenormalMode(Flt) : DenormalMode::getDynamic();
5416
5417 Known = KnownFPClass::ldexp(KnownSrc, ExpBits, Flt, Mode);
5418 break;
5419 }
5420 case Intrinsic::arithmetic_fence: {
5421 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5422 Known, Q, Depth + 1);
5423 break;
5424 }
5425 case Intrinsic::experimental_constrained_sitofp:
5426 case Intrinsic::experimental_constrained_uitofp:
5427 // Cannot produce nan
5428 Known.knownNot(fcNan);
5429
5430 // sitofp and uitofp turn into +0.0 for zero.
5431 Known.knownNot(fcNegZero);
5432
5433 // Integers cannot be subnormal
5434 Known.knownNot(fcSubnormal);
5435
5436 if (IID == Intrinsic::experimental_constrained_uitofp)
5437 Known.signBitMustBeZero();
5438
5439 // TODO: Copy inf handling from instructions
5440 break;
5441
5442 case Intrinsic::amdgcn_fract: {
5443 Known.knownNot(fcInf);
5444
5445 if (InterestedClasses & fcNan) {
5446 KnownFPClass KnownSrc;
5447 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5448 InterestedClasses, KnownSrc, Q, Depth + 1);
5449
5450 if (KnownSrc.isKnownNeverInfOrNaN())
5451 Known.knownNot(fcNan);
5452 else if (KnownSrc.isKnownNever(fcSNan))
5453 Known.knownNot(fcSNan);
5454 }
5455
5456 break;
5457 }
5458 case Intrinsic::amdgcn_rcp: {
5459 KnownFPClass KnownSrc;
5460 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5461 KnownSrc, Q, Depth + 1);
5462
5463 Known.propagateNaN(KnownSrc);
5464
5465 Type *EltTy = II->getType()->getScalarType();
5466
5467 // f32 denormal always flushed.
5468 if (EltTy->isFloatTy()) {
5469 Known.knownNot(fcSubnormal);
5470 KnownSrc.knownNot(fcSubnormal);
5471 }
5472
5473 if (KnownSrc.isKnownNever(fcNegative))
5474 Known.knownNot(fcNegative);
5475 if (KnownSrc.isKnownNever(fcPositive))
5476 Known.knownNot(fcPositive);
5477
5478 if (const Function *F = II->getFunction()) {
5479 DenormalMode Mode = F->getDenormalMode(EltTy->getFltSemantics());
5480 if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
5481 Known.knownNot(fcPosInf);
5482 if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
5483 Known.knownNot(fcNegInf);
5484 }
5485
5486 break;
5487 }
5488 case Intrinsic::amdgcn_rsq: {
5489 KnownFPClass KnownSrc;
5490 // The only negative value that can be returned is -inf for -0 inputs.
5492
5493 computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
5494 KnownSrc, Q, Depth + 1);
5495
5496 // Negative -> nan
5497 if (KnownSrc.isKnownNeverNaN() && KnownSrc.cannotBeOrderedLessThanZero())
5498 Known.knownNot(fcNan);
5499 else if (KnownSrc.isKnownNever(fcSNan))
5500 Known.knownNot(fcSNan);
5501
5502 // +inf -> +0
5503 if (KnownSrc.isKnownNeverPosInfinity())
5504 Known.knownNot(fcPosZero);
5505
5506 Type *EltTy = II->getType()->getScalarType();
5507
5508 // f32 denormal always flushed.
5509 if (EltTy->isFloatTy())
5510 Known.knownNot(fcPosSubnormal);
5511
5512 if (const Function *F = II->getFunction()) {
5513 DenormalMode Mode = F->getDenormalMode(EltTy->getFltSemantics());
5514
5515 // -0 -> -inf
5516 if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
5517 Known.knownNot(fcNegInf);
5518
5519 // +0 -> +inf
5520 if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
5521 Known.knownNot(fcPosInf);
5522 }
5523
5524 break;
5525 }
5526 case Intrinsic::amdgcn_trig_preop: {
5527 // Always returns a value [0, 1)
5528 Known.knownNot(fcNan | fcInf | fcNegative);
5529 break;
5530 }
5531 default:
5532 break;
5533 }
5534
5535 break;
5536 }
5537 case Instruction::FAdd:
5538 case Instruction::FSub: {
5539 KnownFPClass KnownLHS, KnownRHS;
5540 bool WantNegative =
5541 Op->getOpcode() == Instruction::FAdd &&
5542 (InterestedClasses & KnownFPClass::OrderedLessThanZeroMask) != fcNone;
5543 bool WantNaN = (InterestedClasses & fcNan) != fcNone;
5544 bool WantNegZero = (InterestedClasses & fcNegZero) != fcNone;
5545
5546 if (!WantNaN && !WantNegative && !WantNegZero)
5547 break;
5548
5549 FPClassTest InterestedSrcs = InterestedClasses;
5550 if (WantNegative)
5551 InterestedSrcs |= KnownFPClass::OrderedLessThanZeroMask;
5552 if (InterestedClasses & fcNan)
5553 InterestedSrcs |= fcInf;
5554 computeKnownFPClass(Op->getOperand(1), DemandedElts, InterestedSrcs,
5555 KnownRHS, Q, Depth + 1);
5556
5557 // Special case fadd x, x, which is the canonical form of fmul x, 2.
5558 bool Self = Op->getOperand(0) == Op->getOperand(1) &&
5559 isGuaranteedNotToBeUndef(Op->getOperand(0), Q.AC, Q.CxtI, Q.DT,
5560 Depth + 1);
5561 if (Self)
5562 KnownLHS = KnownRHS;
5563
5564 if ((WantNaN && KnownRHS.isKnownNeverNaN()) ||
5565 (WantNegative && KnownRHS.cannotBeOrderedLessThanZero()) ||
5566 WantNegZero || Opc == Instruction::FSub) {
5567
5568 // FIXME: Context function should always be passed in separately
5569 const Function *F = cast<Instruction>(Op)->getFunction();
5570 const fltSemantics &FltSem =
5571 Op->getType()->getScalarType()->getFltSemantics();
5573 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5574
5575 if (Self && Opc == Instruction::FAdd) {
5576 Known = KnownFPClass::fadd_self(KnownLHS, Mode);
5577 } else {
5578 // RHS is canonically cheaper to compute. Skip inspecting the LHS if
5579 // there's no point.
5580
5581 if (!Self) {
5582 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedSrcs,
5583 KnownLHS, Q, Depth + 1);
5584 }
5585
5586 Known = Opc == Instruction::FAdd
5587 ? KnownFPClass::fadd(KnownLHS, KnownRHS, Mode)
5588 : KnownFPClass::fsub(KnownLHS, KnownRHS, Mode);
5589 }
5590 }
5591
5592 break;
5593 }
5594 case Instruction::FMul: {
5595 const Function *F = cast<Instruction>(Op)->getFunction();
5597 F ? F->getDenormalMode(
5598 Op->getType()->getScalarType()->getFltSemantics())
5600
5601 Value *LHS = Op->getOperand(0);
5602 Value *RHS = Op->getOperand(1);
5603 // X * X is always non-negative or a NaN.
5604 // FIXME: Should check isGuaranteedNotToBeUndef
5605 if (LHS == RHS) {
5606 KnownFPClass KnownSrc;
5607 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownSrc, Q,
5608 Depth + 1);
5609 Known = KnownFPClass::square(KnownSrc, Mode);
5610 break;
5611 }
5612
5613 KnownFPClass KnownLHS, KnownRHS;
5614
5615 const APFloat *CRHS;
5616 if (match(RHS, m_APFloat(CRHS))) {
5617 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Q,
5618 Depth + 1);
5619 Known = KnownFPClass::fmul(KnownLHS, *CRHS, Mode);
5620 } else {
5621 computeKnownFPClass(RHS, DemandedElts, fcAllFlags, KnownRHS, Q,
5622 Depth + 1);
5623 // TODO: Improve accuracy in unfused FMA pattern. We can prove an
5624 // additional not-nan if the addend is known-not negative infinity if the
5625 // multiply is known-not infinity.
5626
5627 computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Q,
5628 Depth + 1);
5629 Known = KnownFPClass::fmul(KnownLHS, KnownRHS, Mode);
5630 }
5631
5632 /// Propgate no-infs if the other source is known smaller than one, such
5633 /// that this cannot introduce overflow.
5635 Known.knownNot(fcInf);
5636 else if (KnownRHS.isKnownNever(fcInf) && isAbsoluteValueLessEqualOne(LHS))
5637 Known.knownNot(fcInf);
5638
5639 break;
5640 }
5641 case Instruction::FDiv:
5642 case Instruction::FRem: {
5643 const bool WantNan = (InterestedClasses & fcNan) != fcNone;
5644
5645 if (Op->getOperand(0) == Op->getOperand(1) &&
5646 isGuaranteedNotToBeUndef(Op->getOperand(0), Q.AC, Q.CxtI, Q.DT)) {
5647 if (Op->getOpcode() == Instruction::FDiv) {
5648 // X / X is always exactly 1.0 or a NaN.
5650 } else {
5651 // X % X is always exactly [+-]0.0 or a NaN.
5652 Known.KnownFPClasses = fcNan | fcZero;
5653 }
5654
5655 if (!WantNan)
5656 break;
5657
5658 KnownFPClass KnownSrc;
5659 computeKnownFPClass(Op->getOperand(0), DemandedElts,
5660 fcNan | fcInf | fcZero | fcSubnormal, KnownSrc, Q,
5661 Depth + 1);
5662 const Function *F = cast<Instruction>(Op)->getFunction();
5663 const fltSemantics &FltSem =
5664 Op->getType()->getScalarType()->getFltSemantics();
5665
5667 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5668
5669 Known = Op->getOpcode() == Instruction::FDiv
5670 ? KnownFPClass::fdiv_self(KnownSrc, Mode)
5671 : KnownFPClass::frem_self(KnownSrc, Mode);
5672 break;
5673 }
5674
5675 const bool WantNegative = (InterestedClasses & fcNegative) != fcNone;
5676 const bool WantPositive =
5677 Opc == Instruction::FRem && (InterestedClasses & fcPositive) != fcNone;
5678 if (!WantNan && !WantNegative && !WantPositive)
5679 break;
5680
5681 KnownFPClass KnownLHS, KnownRHS;
5682
5683 computeKnownFPClass(Op->getOperand(1), DemandedElts,
5684 fcNan | fcInf | fcZero | fcNegative, KnownRHS, Q,
5685 Depth + 1);
5686
5687 bool KnowSomethingUseful = KnownRHS.isKnownNeverNaN() ||
5688 KnownRHS.isKnownNever(fcNegative) ||
5689 KnownRHS.isKnownNever(fcPositive);
5690
5691 if (KnowSomethingUseful || WantPositive) {
5692 computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownLHS,
5693 Q, Depth + 1);
5694 }
5695
5696 const Function *F = cast<Instruction>(Op)->getFunction();
5697 const fltSemantics &FltSem =
5698 Op->getType()->getScalarType()->getFltSemantics();
5699
5700 if (Op->getOpcode() == Instruction::FDiv) {
5702 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5703 Known = KnownFPClass::fdiv(KnownLHS, KnownRHS, Mode);
5704 } else {
5705 // Inf REM x and x REM 0 produce NaN.
5706 if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
5707 KnownLHS.isKnownNeverInfinity() && F &&
5708 KnownRHS.isKnownNeverLogicalZero(F->getDenormalMode(FltSem))) {
5709 Known.knownNot(fcNan);
5710 }
5711
5712 // The sign for frem is the same as the first operand.
5713 if (KnownLHS.cannotBeOrderedLessThanZero())
5715 if (KnownLHS.cannotBeOrderedGreaterThanZero())
5717
5718 // See if we can be more aggressive about the sign of 0.
5719 if (KnownLHS.isKnownNever(fcNegative))
5720 Known.knownNot(fcNegative);
5721 if (KnownLHS.isKnownNever(fcPositive))
5722 Known.knownNot(fcPositive);
5723 }
5724
5725 break;
5726 }
5727 case Instruction::FPExt: {
5728 KnownFPClass KnownSrc;
5729 computeKnownFPClass(Op->getOperand(0), DemandedElts, InterestedClasses,
5730 KnownSrc, Q, Depth + 1);
5731
5732 const fltSemantics &DstTy =
5733 Op->getType()->getScalarType()->getFltSemantics();
5734 const fltSemantics &SrcTy =
5735 Op->getOperand(0)->getType()->getScalarType()->getFltSemantics();
5736
5737 Known = KnownFPClass::fpext(KnownSrc, DstTy, SrcTy);
5738 break;
5739 }
5740 case Instruction::FPTrunc: {
5741 computeKnownFPClassForFPTrunc(Op, DemandedElts, InterestedClasses, Known, Q,
5742 Depth);
5743 break;
5744 }
5745 case Instruction::SIToFP:
5746 case Instruction::UIToFP: {
5747 // Cannot produce nan
5748 Known.knownNot(fcNan);
5749
5750 // Integers cannot be subnormal
5751 Known.knownNot(fcSubnormal);
5752
5753 // sitofp and uitofp turn into +0.0 for zero.
5754 Known.knownNot(fcNegZero);
5755 if (Op->getOpcode() == Instruction::UIToFP)
5756 Known.signBitMustBeZero();
5757
5758 if (InterestedClasses & fcInf) {
5759 // Get width of largest magnitude integer (remove a bit if signed).
5760 // This still works for a signed minimum value because the largest FP
5761 // value is scaled by some fraction close to 2.0 (1.0 + 0.xxxx).
5762 int IntSize = Op->getOperand(0)->getType()->getScalarSizeInBits();
5763 if (Op->getOpcode() == Instruction::SIToFP)
5764 --IntSize;
5765
5766 // If the exponent of the largest finite FP value can hold the largest
5767 // integer, the result of the cast must be finite.
5768 Type *FPTy = Op->getType()->getScalarType();
5769 if (ilogb(APFloat::getLargest(FPTy->getFltSemantics())) >= IntSize)
5770 Known.knownNot(fcInf);
5771 }
5772
5773 break;
5774 }
5775 case Instruction::ExtractElement: {
5776 // Look through extract element. If the index is non-constant or
5777 // out-of-range demand all elements, otherwise just the extracted element.
5778 const Value *Vec = Op->getOperand(0);
5779
5780 APInt DemandedVecElts;
5781 if (auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType())) {
5782 unsigned NumElts = VecTy->getNumElements();
5783 DemandedVecElts = APInt::getAllOnes(NumElts);
5784 auto *CIdx = dyn_cast<ConstantInt>(Op->getOperand(1));
5785 if (CIdx && CIdx->getValue().ult(NumElts))
5786 DemandedVecElts = APInt::getOneBitSet(NumElts, CIdx->getZExtValue());
5787 } else {
5788 DemandedVecElts = APInt(1, 1);
5789 }
5790
5791 return computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known,
5792 Q, Depth + 1);
5793 }
5794 case Instruction::InsertElement: {
5795 if (isa<ScalableVectorType>(Op->getType()))
5796 return;
5797
5798 const Value *Vec = Op->getOperand(0);
5799 const Value *Elt = Op->getOperand(1);
5800 auto *CIdx = dyn_cast<ConstantInt>(Op->getOperand(2));
5801 unsigned NumElts = DemandedElts.getBitWidth();
5802 APInt DemandedVecElts = DemandedElts;
5803 bool NeedsElt = true;
5804 // If we know the index we are inserting to, clear it from Vec check.
5805 if (CIdx && CIdx->getValue().ult(NumElts)) {
5806 DemandedVecElts.clearBit(CIdx->getZExtValue());
5807 NeedsElt = DemandedElts[CIdx->getZExtValue()];
5808 }
5809
5810 // Do we demand the inserted element?
5811 if (NeedsElt) {
5812 computeKnownFPClass(Elt, Known, InterestedClasses, Q, Depth + 1);
5813 // If we don't know any bits, early out.
5814 if (Known.isUnknown())
5815 break;
5816 } else {
5817 Known.KnownFPClasses = fcNone;
5818 }
5819
5820 // Do we need anymore elements from Vec?
5821 if (!DemandedVecElts.isZero()) {
5822 KnownFPClass Known2;
5823 computeKnownFPClass(Vec, DemandedVecElts, InterestedClasses, Known2, Q,
5824 Depth + 1);
5825 Known |= Known2;
5826 }
5827
5828 break;
5829 }
5830 case Instruction::ShuffleVector: {
5831 // Handle vector splat idiom
5832 if (Value *Splat = getSplatValue(V)) {
5833 computeKnownFPClass(Splat, Known, InterestedClasses, Q, Depth + 1);
5834 break;
5835 }
5836
5837 // For undef elements, we don't know anything about the common state of
5838 // the shuffle result.
5839 APInt DemandedLHS, DemandedRHS;
5840 auto *Shuf = dyn_cast<ShuffleVectorInst>(Op);
5841 if (!Shuf || !getShuffleDemandedElts(Shuf, DemandedElts, DemandedLHS, DemandedRHS))
5842 return;
5843
5844 if (!!DemandedLHS) {
5845 const Value *LHS = Shuf->getOperand(0);
5846 computeKnownFPClass(LHS, DemandedLHS, InterestedClasses, Known, Q,
5847 Depth + 1);
5848
5849 // If we don't know any bits, early out.
5850 if (Known.isUnknown())
5851 break;
5852 } else {
5853 Known.KnownFPClasses = fcNone;
5854 }
5855
5856 if (!!DemandedRHS) {
5857 KnownFPClass Known2;
5858 const Value *RHS = Shuf->getOperand(1);
5859 computeKnownFPClass(RHS, DemandedRHS, InterestedClasses, Known2, Q,
5860 Depth + 1);
5861 Known |= Known2;
5862 }
5863
5864 break;
5865 }
5866 case Instruction::ExtractValue: {
5867 const ExtractValueInst *Extract = cast<ExtractValueInst>(Op);
5868 ArrayRef<unsigned> Indices = Extract->getIndices();
5869 const Value *Src = Extract->getAggregateOperand();
5870 if (isa<StructType>(Src->getType()) && Indices.size() == 1 &&
5871 Indices[0] == 0) {
5872 if (const auto *II = dyn_cast<IntrinsicInst>(Src)) {
5873 switch (II->getIntrinsicID()) {
5874 case Intrinsic::frexp: {
5875 Known.knownNot(fcSubnormal);
5876
5877 KnownFPClass KnownSrc;
5878 computeKnownFPClass(II->getArgOperand(0), DemandedElts,
5879 InterestedClasses, KnownSrc, Q, Depth + 1);
5880
5881 const Function *F = cast<Instruction>(Op)->getFunction();
5882 const fltSemantics &FltSem =
5883 Op->getType()->getScalarType()->getFltSemantics();
5884
5886 F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
5887 Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
5888 return;
5889 }
5890 default:
5891 break;
5892 }
5893 }
5894 }
5895
5896 computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known, Q,
5897 Depth + 1);
5898 break;
5899 }
5900 case Instruction::PHI: {
5901 const PHINode *P = cast<PHINode>(Op);
5902 // Unreachable blocks may have zero-operand PHI nodes.
5903 if (P->getNumIncomingValues() == 0)
5904 break;
5905
5906 // Otherwise take the unions of the known bit sets of the operands,
5907 // taking conservative care to avoid excessive recursion.
5908 const unsigned PhiRecursionLimit = MaxAnalysisRecursionDepth - 2;
5909
5910 if (Depth < PhiRecursionLimit) {
5911 // Skip if every incoming value references to ourself.
5912 if (isa_and_nonnull<UndefValue>(P->hasConstantValue()))
5913 break;
5914
5915 bool First = true;
5916
5917 for (const Use &U : P->operands()) {
5918 Value *IncValue;
5919 Instruction *CxtI;
5920 breakSelfRecursivePHI(&U, P, IncValue, CxtI);
5921 // Skip direct self references.
5922 if (IncValue == P)
5923 continue;
5924
5925 KnownFPClass KnownSrc;
5926 // Recurse, but cap the recursion to two levels, because we don't want
5927 // to waste time spinning around in loops. We need at least depth 2 to
5928 // detect known sign bits.
5929 computeKnownFPClass(IncValue, DemandedElts, InterestedClasses, KnownSrc,
5931 PhiRecursionLimit);
5932
5933 if (First) {
5934 Known = KnownSrc;
5935 First = false;
5936 } else {
5937 Known |= KnownSrc;
5938 }
5939
5940 if (Known.KnownFPClasses == fcAllFlags)
5941 break;
5942 }
5943 }
5944
5945 // Look for the case of a for loop which has a positive
5946 // initial value and is incremented by a squared value.
5947 // This will propagate sign information out of such loops.
5948 if (P->getNumIncomingValues() != 2 || Known.cannotBeOrderedLessThanZero())
5949 break;
5950 for (unsigned I = 0; I < 2; I++) {
5951 Value *RecurValue = P->getIncomingValue(1 - I);
5953 if (!II)
5954 continue;
5955 Value *R, *L, *Init;
5956 PHINode *PN;
5958 PN == P) {
5959 switch (II->getIntrinsicID()) {
5960 case Intrinsic::fma:
5961 case Intrinsic::fmuladd: {
5962 KnownFPClass KnownStart;
5963 computeKnownFPClass(Init, DemandedElts, InterestedClasses, KnownStart,
5964 Q, Depth + 1);
5965 if (KnownStart.cannotBeOrderedLessThanZero() && L == R &&
5966 isGuaranteedNotToBeUndef(L, Q.AC, Q.CxtI, Q.DT, Depth + 1))
5968 break;
5969 }
5970 }
5971 }
5972 }
5973 break;
5974 }
5975 case Instruction::BitCast: {
5976 const Value *Src;
5977 if (!match(Op, m_ElementWiseBitCast(m_Value(Src))) ||
5978 !Src->getType()->isIntOrIntVectorTy())
5979 break;
5980
5981 const Type *Ty = Op->getType()->getScalarType();
5982 KnownBits Bits(Ty->getScalarSizeInBits());
5983 computeKnownBits(Src, DemandedElts, Bits, Q, Depth + 1);
5984
5985 // Transfer information from the sign bit.
5986 if (Bits.isNonNegative())
5987 Known.signBitMustBeZero();
5988 else if (Bits.isNegative())
5989 Known.signBitMustBeOne();
5990
5991 if (Ty->isIEEELikeFPTy()) {
5992 // IEEE floats are NaN when all bits of the exponent plus at least one of
5993 // the fraction bits are 1. This means:
5994 // - If we assume unknown bits are 0 and the value is NaN, it will
5995 // always be NaN
5996 // - If we assume unknown bits are 1 and the value is not NaN, it can
5997 // never be NaN
5998 // Note: They do not hold for x86_fp80 format.
5999 if (APFloat(Ty->getFltSemantics(), Bits.One).isNaN())
6000 Known.KnownFPClasses = fcNan;
6001 else if (!APFloat(Ty->getFltSemantics(), ~Bits.Zero).isNaN())
6002 Known.knownNot(fcNan);
6003
6004 // Build KnownBits representing Inf and check if it must be equal or
6005 // unequal to this value.
6006 auto InfKB = KnownBits::makeConstant(
6007 APFloat::getInf(Ty->getFltSemantics()).bitcastToAPInt());
6008 InfKB.Zero.clearSignBit();
6009 if (const auto InfResult = KnownBits::eq(Bits, InfKB)) {
6010 assert(!InfResult.value());
6011 Known.knownNot(fcInf);
6012 } else if (Bits == InfKB) {
6013 Known.KnownFPClasses = fcInf;
6014 }
6015
6016 // Build KnownBits representing Zero and check if it must be equal or
6017 // unequal to this value.
6018 auto ZeroKB = KnownBits::makeConstant(
6019 APFloat::getZero(Ty->getFltSemantics()).bitcastToAPInt());
6020 ZeroKB.Zero.clearSignBit();
6021 if (const auto ZeroResult = KnownBits::eq(Bits, ZeroKB)) {
6022 assert(!ZeroResult.value());
6023 Known.knownNot(fcZero);
6024 } else if (Bits == ZeroKB) {
6025 Known.KnownFPClasses = fcZero;
6026 }
6027 }
6028
6029 break;
6030 }
6031 default:
6032 break;
6033 }
6034}
6035
6037 const APInt &DemandedElts,
6038 FPClassTest InterestedClasses,
6039 const SimplifyQuery &SQ,
6040 unsigned Depth) {
6041 KnownFPClass KnownClasses;
6042 ::computeKnownFPClass(V, DemandedElts, InterestedClasses, KnownClasses, SQ,
6043 Depth);
6044 return KnownClasses;
6045}
6046
6048 FPClassTest InterestedClasses,
6049 const SimplifyQuery &SQ,
6050 unsigned Depth) {
6051 KnownFPClass Known;
6052 ::computeKnownFPClass(V, Known, InterestedClasses, SQ, Depth);
6053 return Known;
6054}
6055
6057 const Value *V, const DataLayout &DL, FPClassTest InterestedClasses,
6058 const TargetLibraryInfo *TLI, AssumptionCache *AC, const Instruction *CxtI,
6059 const DominatorTree *DT, bool UseInstrInfo, unsigned Depth) {
6060 return computeKnownFPClass(V, InterestedClasses,
6061 SimplifyQuery(DL, TLI, DT, AC, CxtI, UseInstrInfo),
6062 Depth);
6063}
6064
6066llvm::computeKnownFPClass(const Value *V, const APInt &DemandedElts,
6067 FastMathFlags FMF, FPClassTest InterestedClasses,
6068 const SimplifyQuery &SQ, unsigned Depth) {
6069 if (FMF.noNaNs())
6070 InterestedClasses &= ~fcNan;
6071 if (FMF.noInfs())
6072 InterestedClasses &= ~fcInf;
6073
6074 KnownFPClass Result =
6075 computeKnownFPClass(V, DemandedElts, InterestedClasses, SQ, Depth);
6076
6077 if (FMF.noNaNs())
6078 Result.KnownFPClasses &= ~fcNan;
6079 if (FMF.noInfs())
6080 Result.KnownFPClasses &= ~fcInf;
6081 return Result;
6082}
6083
6085 FPClassTest InterestedClasses,
6086 const SimplifyQuery &SQ,
6087 unsigned Depth) {
6088 auto *FVTy = dyn_cast<FixedVectorType>(V->getType());
6089 APInt DemandedElts =
6090 FVTy ? APInt::getAllOnes(FVTy->getNumElements()) : APInt(1, 1);
6091 return computeKnownFPClass(V, DemandedElts, FMF, InterestedClasses, SQ,
6092 Depth);
6093}
6094
6096 unsigned Depth) {
6098 return Known.isKnownNeverNegZero();
6099}
6100
6107
6109 unsigned Depth) {
6111 return Known.isKnownNeverInfinity();
6112}
6113
6114/// Return true if the floating-point value can never contain a NaN or infinity.
6116 unsigned Depth) {
6118 return Known.isKnownNeverNaN() && Known.isKnownNeverInfinity();
6119}
6120
6121/// Return true if the floating-point scalar value is not a NaN or if the
6122/// floating-point vector value has no NaN elements. Return false if a value
6123/// could ever be NaN.
6125 unsigned Depth) {
6127 return Known.isKnownNeverNaN();
6128}
6129
6130/// Return false if we can prove that the specified FP value's sign bit is 0.
6131/// Return true if we can prove that the specified FP value's sign bit is 1.
6132/// Otherwise return std::nullopt.
6133std::optional<bool> llvm::computeKnownFPSignBit(const Value *V,
6134 const SimplifyQuery &SQ,
6135 unsigned Depth) {
6137 return Known.SignBit;
6138}
6139
6141 auto *User = cast<Instruction>(U.getUser());
6142 if (auto *FPOp = dyn_cast<FPMathOperator>(User)) {
6143 if (FPOp->hasNoSignedZeros())
6144 return true;
6145 }
6146
6147 switch (User->getOpcode()) {
6148 case Instruction::FPToSI:
6149 case Instruction::FPToUI:
6150 return true;
6151 case Instruction::FCmp:
6152 // fcmp treats both positive and negative zero as equal.
6153 return true;
6154 case Instruction::Call:
6155 if (auto *II = dyn_cast<IntrinsicInst>(User)) {
6156 switch (II->getIntrinsicID()) {
6157 case Intrinsic::fabs:
6158 return true;
6159 case Intrinsic::copysign:
6160 return U.getOperandNo() == 0;
6161 case Intrinsic::is_fpclass:
6162 case Intrinsic::vp_is_fpclass: {
6163 auto Test =
6164 static_cast<FPClassTest>(
6165 cast<ConstantInt>(II->getArgOperand(1))->getZExtValue()) &
6168 }
6169 default:
6170 return false;
6171 }
6172 }
6173 return false;
6174 default:
6175 return false;
6176 }
6177}
6178
6180 auto *User = cast<Instruction>(U.getUser());
6181 if (auto *FPOp = dyn_cast<FPMathOperator>(User)) {
6182 if (FPOp->hasNoNaNs())
6183 return true;
6184 }
6185
6186 switch (User->getOpcode()) {
6187 case Instruction::FPToSI:
6188 case Instruction::FPToUI:
6189 return true;
6190 // Proper FP math operations ignore the sign bit of NaN.
6191 case Instruction::FAdd:
6192 case Instruction::FSub:
6193 case Instruction::FMul:
6194 case Instruction::FDiv:
6195 case Instruction::FRem:
6196 case Instruction::FPTrunc:
6197 case Instruction::FPExt:
6198 case Instruction::FCmp:
6199 return true;
6200 // Bitwise FP operations should preserve the sign bit of NaN.
6201 case Instruction::FNeg:
6202 case Instruction::Select:
6203 case Instruction::PHI:
6204 return false;
6205 case Instruction::Ret:
6206 return User->getFunction()->getAttributes().getRetNoFPClass() &
6208 case Instruction::Call:
6209 case Instruction::Invoke: {
6210 if (auto *II = dyn_cast<IntrinsicInst>(User)) {
6211 switch (II->getIntrinsicID()) {
6212 case Intrinsic::fabs:
6213 return true;
6214 case Intrinsic::copysign:
6215 return U.getOperandNo() == 0;
6216 // Other proper FP math intrinsics ignore the sign bit of NaN.
6217 case Intrinsic::maxnum:
6218 case Intrinsic::minnum:
6219 case Intrinsic::maximum:
6220 case Intrinsic::minimum:
6221 case Intrinsic::maximumnum:
6222 case Intrinsic::minimumnum:
6223 case Intrinsic::canonicalize:
6224 case Intrinsic::fma:
6225 case Intrinsic::fmuladd:
6226 case Intrinsic::sqrt:
6227 case Intrinsic::pow:
6228 case Intrinsic::powi:
6229 case Intrinsic::fptoui_sat:
6230 case Intrinsic::fptosi_sat:
6231 case Intrinsic::is_fpclass:
6232 case Intrinsic::vp_is_fpclass:
6233 return true;
6234 default:
6235 return false;
6236 }
6237 }
6238
6239 FPClassTest NoFPClass =
6240 cast<CallBase>(User)->getParamNoFPClass(U.getOperandNo());
6241 return NoFPClass & FPClassTest::fcNan;
6242 }
6243 default:
6244 return false;
6245 }
6246}
6247
6249 FastMathFlags FMF) {
6250 if (isa<PoisonValue>(V))
6251 return true;
6252 if (isa<UndefValue>(V))
6253 return false;
6254
6255 if (match(V, m_CheckedFp([](const APFloat &Val) { return Val.isInteger(); })))
6256 return true;
6257
6259 if (!I)
6260 return false;
6261
6262 switch (I->getOpcode()) {
6263 case Instruction::SIToFP:
6264 case Instruction::UIToFP:
6265 // TODO: Could check nofpclass(inf) on incoming argument
6266 if (FMF.noInfs())
6267 return true;
6268
6269 // Need to check int size cannot produce infinity, which computeKnownFPClass
6270 // knows how to do already.
6271 return isKnownNeverInfinity(I, SQ);
6272 case Instruction::Call: {
6273 const CallInst *CI = cast<CallInst>(I);
6274 switch (CI->getIntrinsicID()) {
6275 case Intrinsic::trunc:
6276 case Intrinsic::floor:
6277 case Intrinsic::ceil:
6278 case Intrinsic::rint:
6279 case Intrinsic::nearbyint:
6280 case Intrinsic::round:
6281 case Intrinsic::roundeven:
6282 return (FMF.noInfs() && FMF.noNaNs()) || isKnownNeverInfOrNaN(I, SQ);
6283 default:
6284 break;
6285 }
6286
6287 break;
6288 }
6289 default:
6290 break;
6291 }
6292
6293 return false;
6294}
6295
6297
6298 // All byte-wide stores are splatable, even of arbitrary variables.
6299 if (V->getType()->isIntegerTy(8))
6300 return V;
6301
6302 LLVMContext &Ctx = V->getContext();
6303
6304 // Undef don't care.
6305 auto *UndefInt8 = UndefValue::get(Type::getInt8Ty(Ctx));
6306 if (isa<UndefValue>(V))
6307 return UndefInt8;
6308
6309 // Return poison for zero-sized type.
6310 if (DL.getTypeStoreSize(V->getType()).isZero())
6311 return PoisonValue::get(Type::getInt8Ty(Ctx));
6312
6314 if (!C) {
6315 // Conceptually, we could handle things like:
6316 // %a = zext i8 %X to i16
6317 // %b = shl i16 %a, 8
6318 // %c = or i16 %a, %b
6319 // but until there is an example that actually needs this, it doesn't seem
6320 // worth worrying about.
6321 return nullptr;
6322 }
6323
6324 // Handle 'null' ConstantArrayZero etc.
6325 if (C->isNullValue())
6327
6328 // Constant floating-point values can be handled as integer values if the
6329 // corresponding integer value is "byteable". An important case is 0.0.
6330 if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
6331 Type *ScalarTy = CFP->getType()->getScalarType();
6332 if (ScalarTy->isHalfTy() || ScalarTy->isFloatTy() || ScalarTy->isDoubleTy())
6333 return isBytewiseValue(
6334 ConstantInt::get(Ctx, CFP->getValue().bitcastToAPInt()), DL);
6335
6336 // Don't handle long double formats, which have strange constraints.
6337 return nullptr;
6338 }
6339
6340 // We can handle constant integers that are multiple of 8 bits.
6341 if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
6342 if (CI->getBitWidth() % 8 == 0) {
6343 if (!CI->getValue().isSplat(8))
6344 return nullptr;
6345 return ConstantInt::get(Ctx, CI->getValue().trunc(8));
6346 }
6347 }
6348
6349 if (auto *CE = dyn_cast<ConstantExpr>(C)) {
6350 if (CE->getOpcode() == Instruction::IntToPtr) {
6351 if (auto *PtrTy = dyn_cast<PointerType>(CE->getType())) {
6352 unsigned BitWidth = DL.getPointerSizeInBits(PtrTy->getAddressSpace());
6354 CE->getOperand(0), Type::getIntNTy(Ctx, BitWidth), false, DL))
6355 return isBytewiseValue(Op, DL);
6356 }
6357 }
6358 }
6359
6360 auto Merge = [&](Value *LHS, Value *RHS) -> Value * {
6361 if (LHS == RHS)
6362 return LHS;
6363 if (!LHS || !RHS)
6364 return nullptr;
6365 if (LHS == UndefInt8)
6366 return RHS;
6367 if (RHS == UndefInt8)
6368 return LHS;
6369 return nullptr;
6370 };
6371
6373 Value *Val = UndefInt8;
6374 for (uint64_t I = 0, E = CA->getNumElements(); I != E; ++I)
6375 if (!(Val = Merge(Val, isBytewiseValue(CA->getElementAsConstant(I), DL))))
6376 return nullptr;
6377 return Val;
6378 }
6379
6381 Value *Val = UndefInt8;
6382 for (Value *Op : C->operands())
6383 if (!(Val = Merge(Val, isBytewiseValue(Op, DL))))
6384 return nullptr;
6385 return Val;
6386 }
6387
6388 // Don't try to handle the handful of other constants.
6389 return nullptr;
6390}
6391
6392// This is the recursive version of BuildSubAggregate. It takes a few different
6393// arguments. Idxs is the index within the nested struct From that we are
6394// looking at now (which is of type IndexedType). IdxSkip is the number of
6395// indices from Idxs that should be left out when inserting into the resulting
6396// struct. To is the result struct built so far, new insertvalue instructions
6397// build on that.
6398static Value *BuildSubAggregate(Value *From, Value *To, Type *IndexedType,
6400 unsigned IdxSkip,
6401 BasicBlock::iterator InsertBefore) {
6402 StructType *STy = dyn_cast<StructType>(IndexedType);
6403 if (STy) {
6404 // Save the original To argument so we can modify it
6405 Value *OrigTo = To;
6406 // General case, the type indexed by Idxs is a struct
6407 for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
6408 // Process each struct element recursively
6409 Idxs.push_back(i);
6410 Value *PrevTo = To;
6411 To = BuildSubAggregate(From, To, STy->getElementType(i), Idxs, IdxSkip,
6412 InsertBefore);
6413 Idxs.pop_back();
6414 if (!To) {
6415 // Couldn't find any inserted value for this index? Cleanup
6416 while (PrevTo != OrigTo) {
6418 PrevTo = Del->getAggregateOperand();
6419 Del->eraseFromParent();
6420 }
6421 // Stop processing elements
6422 break;
6423 }
6424 }
6425 // If we successfully found a value for each of our subaggregates
6426 if (To)
6427 return To;
6428 }
6429 // Base case, the type indexed by SourceIdxs is not a struct, or not all of
6430 // the struct's elements had a value that was inserted directly. In the latter
6431 // case, perhaps we can't determine each of the subelements individually, but
6432 // we might be able to find the complete struct somewhere.
6433
6434 // Find the value that is at that particular spot
6435 Value *V = FindInsertedValue(From, Idxs);
6436
6437 if (!V)
6438 return nullptr;
6439
6440 // Insert the value in the new (sub) aggregate
6441 return InsertValueInst::Create(To, V, ArrayRef(Idxs).slice(IdxSkip), "tmp",
6442 InsertBefore);
6443}
6444
6445// This helper takes a nested struct and extracts a part of it (which is again a
6446// struct) into a new value. For example, given the struct:
6447// { a, { b, { c, d }, e } }
6448// and the indices "1, 1" this returns
6449// { c, d }.
6450//
6451// It does this by inserting an insertvalue for each element in the resulting
6452// struct, as opposed to just inserting a single struct. This will only work if
6453// each of the elements of the substruct are known (ie, inserted into From by an
6454// insertvalue instruction somewhere).
6455//
6456// All inserted insertvalue instructions are inserted before InsertBefore
6458 BasicBlock::iterator InsertBefore) {
6459 Type *IndexedType = ExtractValueInst::getIndexedType(From->getType(),
6460 idx_range);
6461 Value *To = PoisonValue::get(IndexedType);
6462 SmallVector<unsigned, 10> Idxs(idx_range);
6463 unsigned IdxSkip = Idxs.size();
6464
6465 return BuildSubAggregate(From, To, IndexedType, Idxs, IdxSkip, InsertBefore);
6466}
6467
6468/// Given an aggregate and a sequence of indices, see if the scalar value
6469/// indexed is already around as a register, for example if it was inserted
6470/// directly into the aggregate.
6471///
6472/// If InsertBefore is not null, this function will duplicate (modified)
6473/// insertvalues when a part of a nested struct is extracted.
6474Value *
6476 std::optional<BasicBlock::iterator> InsertBefore) {
6477 // Nothing to index? Just return V then (this is useful at the end of our
6478 // recursion).
6479 if (idx_range.empty())
6480 return V;
6481 // We have indices, so V should have an indexable type.
6482 assert((V->getType()->isStructTy() || V->getType()->isArrayTy()) &&
6483 "Not looking at a struct or array?");
6484 assert(ExtractValueInst::getIndexedType(V->getType(), idx_range) &&
6485 "Invalid indices for type?");
6486
6487 if (Constant *C = dyn_cast<Constant>(V)) {
6488 C = C->getAggregateElement(idx_range[0]);
6489 if (!C) return nullptr;
6490 return FindInsertedValue(C, idx_range.slice(1), InsertBefore);
6491 }
6492
6494 // Loop the indices for the insertvalue instruction in parallel with the
6495 // requested indices
6496 const unsigned *req_idx = idx_range.begin();
6497 for (const unsigned *i = I->idx_begin(), *e = I->idx_end();
6498 i != e; ++i, ++req_idx) {
6499 if (req_idx == idx_range.end()) {
6500 // We can't handle this without inserting insertvalues
6501 if (!InsertBefore)
6502 return nullptr;
6503
6504 // The requested index identifies a part of a nested aggregate. Handle
6505 // this specially. For example,
6506 // %A = insertvalue { i32, {i32, i32 } } undef, i32 10, 1, 0
6507 // %B = insertvalue { i32, {i32, i32 } } %A, i32 11, 1, 1
6508 // %C = extractvalue {i32, { i32, i32 } } %B, 1
6509 // This can be changed into
6510 // %A = insertvalue {i32, i32 } undef, i32 10, 0
6511 // %C = insertvalue {i32, i32 } %A, i32 11, 1
6512 // which allows the unused 0,0 element from the nested struct to be
6513 // removed.
6514 return BuildSubAggregate(V, ArrayRef(idx_range.begin(), req_idx),
6515 *InsertBefore);
6516 }
6517
6518 // This insert value inserts something else than what we are looking for.
6519 // See if the (aggregate) value inserted into has the value we are
6520 // looking for, then.
6521 if (*req_idx != *i)
6522 return FindInsertedValue(I->getAggregateOperand(), idx_range,
6523 InsertBefore);
6524 }
6525 // If we end up here, the indices of the insertvalue match with those
6526 // requested (though possibly only partially). Now we recursively look at
6527 // the inserted value, passing any remaining indices.
6528 return FindInsertedValue(I->getInsertedValueOperand(),
6529 ArrayRef(req_idx, idx_range.end()), InsertBefore);
6530 }
6531
6533 // If we're extracting a value from an aggregate that was extracted from
6534 // something else, we can extract from that something else directly instead.
6535 // However, we will need to chain I's indices with the requested indices.
6536
6537 // Calculate the number of indices required
6538 unsigned size = I->getNumIndices() + idx_range.size();
6539 // Allocate some space to put the new indices in
6541 Idxs.reserve(size);
6542 // Add indices from the extract value instruction
6543 Idxs.append(I->idx_begin(), I->idx_end());
6544
6545 // Add requested indices
6546 Idxs.append(idx_range.begin(), idx_range.end());
6547
6548 assert(Idxs.size() == size
6549 && "Number of indices added not correct?");
6550
6551 return FindInsertedValue(I->getAggregateOperand(), Idxs, InsertBefore);
6552 }
6553 // Otherwise, we don't know (such as, extracting from a function return value
6554 // or load instruction)
6555 return nullptr;
6556}
6557
6558// If V refers to an initialized global constant, set Slice either to
6559// its initializer if the size of its elements equals ElementSize, or,
6560// for ElementSize == 8, to its representation as an array of unsiged
6561// char. Return true on success.
6562// Offset is in the unit "nr of ElementSize sized elements".
6565 unsigned ElementSize, uint64_t Offset) {
6566 assert(V && "V should not be null.");
6567 assert((ElementSize % 8) == 0 &&
6568 "ElementSize expected to be a multiple of the size of a byte.");
6569 unsigned ElementSizeInBytes = ElementSize / 8;
6570
6571 // Drill down into the pointer expression V, ignoring any intervening
6572 // casts, and determine the identity of the object it references along
6573 // with the cumulative byte offset into it.
6574 const GlobalVariable *GV =
6576 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
6577 // Fail if V is not based on constant global object.
6578 return false;
6579
6580 const DataLayout &DL = GV->getDataLayout();
6581 APInt Off(DL.getIndexTypeSizeInBits(V->getType()), 0);
6582
6583 if (GV != V->stripAndAccumulateConstantOffsets(DL, Off,
6584 /*AllowNonInbounds*/ true))
6585 // Fail if a constant offset could not be determined.
6586 return false;
6587
6588 uint64_t StartIdx = Off.getLimitedValue();
6589 if (StartIdx == UINT64_MAX)
6590 // Fail if the constant offset is excessive.
6591 return false;
6592
6593 // Off/StartIdx is in the unit of bytes. So we need to convert to number of
6594 // elements. Simply bail out if that isn't possible.
6595 if ((StartIdx % ElementSizeInBytes) != 0)
6596 return false;
6597
6598 Offset += StartIdx / ElementSizeInBytes;
6599 ConstantDataArray *Array = nullptr;
6600 ArrayType *ArrayTy = nullptr;
6601
6602 if (GV->getInitializer()->isNullValue()) {
6603 Type *GVTy = GV->getValueType();
6604 uint64_t SizeInBytes = DL.getTypeStoreSize(GVTy).getFixedValue();
6605 uint64_t Length = SizeInBytes / ElementSizeInBytes;
6606
6607 Slice.Array = nullptr;
6608 Slice.Offset = 0;
6609 // Return an empty Slice for undersized constants to let callers
6610 // transform even undefined library calls into simpler, well-defined
6611 // expressions. This is preferable to making the calls although it
6612 // prevents sanitizers from detecting such calls.
6613 Slice.Length = Length < Offset ? 0 : Length - Offset;
6614 return true;
6615 }
6616
6617 auto *Init = const_cast<Constant *>(GV->getInitializer());
6618 if (auto *ArrayInit = dyn_cast<ConstantDataArray>(Init)) {
6619 Type *InitElTy = ArrayInit->getElementType();
6620 if (InitElTy->isIntegerTy(ElementSize)) {
6621 // If Init is an initializer for an array of the expected type
6622 // and size, use it as is.
6623 Array = ArrayInit;
6624 ArrayTy = ArrayInit->getType();
6625 }
6626 }
6627
6628 if (!Array) {
6629 if (ElementSize != 8)
6630 // TODO: Handle conversions to larger integral types.
6631 return false;
6632
6633 // Otherwise extract the portion of the initializer starting
6634 // at Offset as an array of bytes, and reset Offset.
6636 if (!Init)
6637 return false;
6638
6639 Offset = 0;
6641 ArrayTy = dyn_cast<ArrayType>(Init->getType());
6642 }
6643
6644 uint64_t NumElts = ArrayTy->getArrayNumElements();
6645 if (Offset > NumElts)
6646 return false;
6647
6648 Slice.Array = Array;
6649 Slice.Offset = Offset;
6650 Slice.Length = NumElts - Offset;
6651 return true;
6652}
6653
6654/// Extract bytes from the initializer of the constant array V, which need
6655/// not be a nul-terminated string. On success, store the bytes in Str and
6656/// return true. When TrimAtNul is set, Str will contain only the bytes up
6657/// to but not including the first nul. Return false on failure.
6659 bool TrimAtNul) {
6661 if (!getConstantDataArrayInfo(V, Slice, 8))
6662 return false;
6663
6664 if (Slice.Array == nullptr) {
6665 if (TrimAtNul) {
6666 // Return a nul-terminated string even for an empty Slice. This is
6667 // safe because all existing SimplifyLibcalls callers require string
6668 // arguments and the behavior of the functions they fold is undefined
6669 // otherwise. Folding the calls this way is preferable to making
6670 // the undefined library calls, even though it prevents sanitizers
6671 // from reporting such calls.
6672 Str = StringRef();
6673 return true;
6674 }
6675 if (Slice.Length == 1) {
6676 Str = StringRef("", 1);
6677 return true;
6678 }
6679 // We cannot instantiate a StringRef as we do not have an appropriate string
6680 // of 0s at hand.
6681 return false;
6682 }
6683
6684 // Start out with the entire array in the StringRef.
6685 Str = Slice.Array->getAsString();
6686 // Skip over 'offset' bytes.
6687 Str = Str.substr(Slice.Offset);
6688
6689 if (TrimAtNul) {
6690 // Trim off the \0 and anything after it. If the array is not nul
6691 // terminated, we just return the whole end of string. The client may know
6692 // some other way that the string is length-bound.
6693 Str = Str.substr(0, Str.find('\0'));
6694 }
6695 return true;
6696}
6697
6698// These next two are very similar to the above, but also look through PHI
6699// nodes.
6700// TODO: See if we can integrate these two together.
6701
6702/// If we can compute the length of the string pointed to by
6703/// the specified pointer, return 'len+1'. If we can't, return 0.
6706 unsigned CharSize) {
6707 // Look through noop bitcast instructions.
6708 V = V->stripPointerCasts();
6709
6710 // If this is a PHI node, there are two cases: either we have already seen it
6711 // or we haven't.
6712 if (const PHINode *PN = dyn_cast<PHINode>(V)) {
6713 if (!PHIs.insert(PN).second)
6714 return ~0ULL; // already in the set.
6715
6716 // If it was new, see if all the input strings are the same length.
6717 uint64_t LenSoFar = ~0ULL;
6718 for (Value *IncValue : PN->incoming_values()) {
6719 uint64_t Len = GetStringLengthH(IncValue, PHIs, CharSize);
6720 if (Len == 0) return 0; // Unknown length -> unknown.
6721
6722 if (Len == ~0ULL) continue;
6723
6724 if (Len != LenSoFar && LenSoFar != ~0ULL)
6725 return 0; // Disagree -> unknown.
6726 LenSoFar = Len;
6727 }
6728
6729 // Success, all agree.
6730 return LenSoFar;
6731 }
6732
6733 // strlen(select(c,x,y)) -> strlen(x) ^ strlen(y)
6734 if (const SelectInst *SI = dyn_cast<SelectInst>(V)) {
6735 uint64_t Len1 = GetStringLengthH(SI->getTrueValue(), PHIs, CharSize);
6736 if (Len1 == 0) return 0;
6737 uint64_t Len2 = GetStringLengthH(SI->getFalseValue(), PHIs, CharSize);
6738 if (Len2 == 0) return 0;
6739 if (Len1 == ~0ULL) return Len2;
6740 if (Len2 == ~0ULL) return Len1;
6741 if (Len1 != Len2) return 0;
6742 return Len1;
6743 }
6744
6745 // Otherwise, see if we can read the string.
6747 if (!getConstantDataArrayInfo(V, Slice, CharSize))
6748 return 0;
6749
6750 if (Slice.Array == nullptr)
6751 // Zeroinitializer (including an empty one).
6752 return 1;
6753
6754 // Search for the first nul character. Return a conservative result even
6755 // when there is no nul. This is safe since otherwise the string function
6756 // being folded such as strlen is undefined, and can be preferable to
6757 // making the undefined library call.
6758 unsigned NullIndex = 0;
6759 for (unsigned E = Slice.Length; NullIndex < E; ++NullIndex) {
6760 if (Slice.Array->getElementAsInteger(Slice.Offset + NullIndex) == 0)
6761 break;
6762 }
6763
6764 return NullIndex + 1;
6765}
6766
6767/// If we can compute the length of the string pointed to by
6768/// the specified pointer, return 'len+1'. If we can't, return 0.
6769uint64_t llvm::GetStringLength(const Value *V, unsigned CharSize) {
6770 if (!V->getType()->isPointerTy())
6771 return 0;
6772
6774 uint64_t Len = GetStringLengthH(V, PHIs, CharSize);
6775 // If Len is ~0ULL, we had an infinite phi cycle: this is dead code, so return
6776 // an empty string as a length.
6777 return Len == ~0ULL ? 1 : Len;
6778}
6779
6780const Value *
6782 bool MustPreserveNullness) {
6783 assert(Call &&
6784 "getArgumentAliasingToReturnedPointer only works on nonnull calls");
6785 if (const Value *RV = Call->getReturnedArgOperand())
6786 return RV;
6787 // This can be used only as a aliasing property.
6789 Call, MustPreserveNullness))
6790 return Call->getArgOperand(0);
6791 return nullptr;
6792}
6793
6795 const CallBase *Call, bool MustPreserveNullness) {
6796 switch (Call->getIntrinsicID()) {
6797 case Intrinsic::launder_invariant_group:
6798 case Intrinsic::strip_invariant_group:
6799 case Intrinsic::aarch64_irg:
6800 case Intrinsic::aarch64_tagp:
6801 // The amdgcn_make_buffer_rsrc function does not alter the address of the
6802 // input pointer (and thus preserve null-ness for the purposes of escape
6803 // analysis, which is where the MustPreserveNullness flag comes in to play).
6804 // However, it will not necessarily map ptr addrspace(N) null to ptr
6805 // addrspace(8) null, aka the "null descriptor", which has "all loads return
6806 // 0, all stores are dropped" semantics. Given the context of this intrinsic
6807 // list, no one should be relying on such a strict interpretation of
6808 // MustPreserveNullness (and, at time of writing, they are not), but we
6809 // document this fact out of an abundance of caution.
6810 case Intrinsic::amdgcn_make_buffer_rsrc:
6811 return true;
6812 case Intrinsic::ptrmask:
6813 return !MustPreserveNullness;
6814 case Intrinsic::threadlocal_address:
6815 // The underlying variable changes with thread ID. The Thread ID may change
6816 // at coroutine suspend points.
6817 return !Call->getParent()->getParent()->isPresplitCoroutine();
6818 default:
6819 return false;
6820 }
6821}
6822
6823/// \p PN defines a loop-variant pointer to an object. Check if the
6824/// previous iteration of the loop was referring to the same object as \p PN.
6826 const LoopInfo *LI) {
6827 // Find the loop-defined value.
6828 Loop *L = LI->getLoopFor(PN->getParent());
6829 if (PN->getNumIncomingValues() != 2)
6830 return true;
6831
6832 // Find the value from previous iteration.
6833 auto *PrevValue = dyn_cast<Instruction>(PN->getIncomingValue(0));
6834 if (!PrevValue || LI->getLoopFor(PrevValue->getParent()) != L)
6835 PrevValue = dyn_cast<Instruction>(PN->getIncomingValue(1));
6836 if (!PrevValue || LI->getLoopFor(PrevValue->getParent()) != L)
6837 return true;
6838
6839 // If a new pointer is loaded in the loop, the pointer references a different
6840 // object in every iteration. E.g.:
6841 // for (i)
6842 // int *p = a[i];
6843 // ...
6844 if (auto *Load = dyn_cast<LoadInst>(PrevValue))
6845 if (!L->isLoopInvariant(Load->getPointerOperand()))
6846 return false;
6847 return true;
6848}
6849
6850const Value *llvm::getUnderlyingObject(const Value *V, unsigned MaxLookup) {
6851 for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) {
6852 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
6853 const Value *PtrOp = GEP->getPointerOperand();
6854 if (!PtrOp->getType()->isPointerTy()) // Only handle scalar pointer base.
6855 return V;
6856 V = PtrOp;
6857 } else if (Operator::getOpcode(V) == Instruction::BitCast ||
6858 Operator::getOpcode(V) == Instruction::AddrSpaceCast) {
6859 Value *NewV = cast<Operator>(V)->getOperand(0);
6860 if (!NewV->getType()->isPointerTy())
6861 return V;
6862 V = NewV;
6863 } else if (auto *GA = dyn_cast<GlobalAlias>(V)) {
6864 if (GA->isInterposable())
6865 return V;
6866 V = GA->getAliasee();
6867 } else {
6868 if (auto *PHI = dyn_cast<PHINode>(V)) {
6869 // Look through single-arg phi nodes created by LCSSA.
6870 if (PHI->getNumIncomingValues() == 1) {
6871 V = PHI->getIncomingValue(0);
6872 continue;
6873 }
6874 } else if (auto *Call = dyn_cast<CallBase>(V)) {
6875 // CaptureTracking can know about special capturing properties of some
6876 // intrinsics like launder.invariant.group, that can't be expressed with
6877 // the attributes, but have properties like returning aliasing pointer.
6878 // Because some analysis may assume that nocaptured pointer is not
6879 // returned from some special intrinsic (because function would have to
6880 // be marked with returns attribute), it is crucial to use this function
6881 // because it should be in sync with CaptureTracking. Not using it may
6882 // cause weird miscompilations where 2 aliasing pointers are assumed to
6883 // noalias.
6884 if (auto *RP = getArgumentAliasingToReturnedPointer(Call, false)) {
6885 V = RP;
6886 continue;
6887 }
6888 }
6889
6890 return V;
6891 }
6892 assert(V->getType()->isPointerTy() && "Unexpected operand type!");
6893 }
6894 return V;
6895}
6896
6899 const LoopInfo *LI, unsigned MaxLookup) {
6902 Worklist.push_back(V);
6903 do {
6904 const Value *P = Worklist.pop_back_val();
6905 P = getUnderlyingObject(P, MaxLookup);
6906
6907 if (!Visited.insert(P).second)
6908 continue;
6909
6910 if (auto *SI = dyn_cast<SelectInst>(P)) {
6911 Worklist.push_back(SI->getTrueValue());
6912 Worklist.push_back(SI->getFalseValue());
6913 continue;
6914 }
6915
6916 if (auto *PN = dyn_cast<PHINode>(P)) {
6917 // If this PHI changes the underlying object in every iteration of the
6918 // loop, don't look through it. Consider:
6919 // int **A;
6920 // for (i) {
6921 // Prev = Curr; // Prev = PHI (Prev_0, Curr)
6922 // Curr = A[i];
6923 // *Prev, *Curr;
6924 //
6925 // Prev is tracking Curr one iteration behind so they refer to different
6926 // underlying objects.
6927 if (!LI || !LI->isLoopHeader(PN->getParent()) ||
6929 append_range(Worklist, PN->incoming_values());
6930 else
6931 Objects.push_back(P);
6932 continue;
6933 }
6934
6935 Objects.push_back(P);
6936 } while (!Worklist.empty());
6937}
6938
6940 const unsigned MaxVisited = 8;
6941
6944 Worklist.push_back(V);
6945 const Value *Object = nullptr;
6946 // Used as fallback if we can't find a common underlying object through
6947 // recursion.
6948 bool First = true;
6949 const Value *FirstObject = getUnderlyingObject(V);
6950 do {
6951 const Value *P = Worklist.pop_back_val();
6952 P = First ? FirstObject : getUnderlyingObject(P);
6953 First = false;
6954
6955 if (!Visited.insert(P).second)
6956 continue;
6957
6958 if (Visited.size() == MaxVisited)
6959 return FirstObject;
6960
6961 if (auto *SI = dyn_cast<SelectInst>(P)) {
6962 Worklist.push_back(SI->getTrueValue());
6963 Worklist.push_back(SI->getFalseValue());
6964 continue;
6965 }
6966
6967 if (auto *PN = dyn_cast<PHINode>(P)) {
6968 append_range(Worklist, PN->incoming_values());
6969 continue;
6970 }
6971
6972 if (!Object)
6973 Object = P;
6974 else if (Object != P)
6975 return FirstObject;
6976 } while (!Worklist.empty());
6977
6978 return Object ? Object : FirstObject;
6979}
6980
6981/// This is the function that does the work of looking through basic
6982/// ptrtoint+arithmetic+inttoptr sequences.
6983static const Value *getUnderlyingObjectFromInt(const Value *V) {
6984 do {
6985 if (const Operator *U = dyn_cast<Operator>(V)) {
6986 // If we find a ptrtoint, we can transfer control back to the
6987 // regular getUnderlyingObjectFromInt.
6988 if (U->getOpcode() == Instruction::PtrToInt)
6989 return U->getOperand(0);
6990 // If we find an add of a constant, a multiplied value, or a phi, it's
6991 // likely that the other operand will lead us to the base
6992 // object. We don't have to worry about the case where the
6993 // object address is somehow being computed by the multiply,
6994 // because our callers only care when the result is an
6995 // identifiable object.
6996 if (U->getOpcode() != Instruction::Add ||
6997 (!isa<ConstantInt>(U->getOperand(1)) &&
6998 Operator::getOpcode(U->getOperand(1)) != Instruction::Mul &&
6999 !isa<PHINode>(U->getOperand(1))))
7000 return V;
7001 V = U->getOperand(0);
7002 } else {
7003 return V;
7004 }
7005 assert(V->getType()->isIntegerTy() && "Unexpected operand type!");
7006 } while (true);
7007}
7008
7009/// This is a wrapper around getUnderlyingObjects and adds support for basic
7010/// ptrtoint+arithmetic+inttoptr sequences.
7011/// It returns false if unidentified object is found in getUnderlyingObjects.
7013 SmallVectorImpl<Value *> &Objects) {
7015 SmallVector<const Value *, 4> Working(1, V);
7016 do {
7017 V = Working.pop_back_val();
7018
7020 getUnderlyingObjects(V, Objs);
7021
7022 for (const Value *V : Objs) {
7023 if (!Visited.insert(V).second)
7024 continue;
7025 if (Operator::getOpcode(V) == Instruction::IntToPtr) {
7026 const Value *O =
7027 getUnderlyingObjectFromInt(cast<User>(V)->getOperand(0));
7028 if (O->getType()->isPointerTy()) {
7029 Working.push_back(O);
7030 continue;
7031 }
7032 }
7033 // If getUnderlyingObjects fails to find an identifiable object,
7034 // getUnderlyingObjectsForCodeGen also fails for safety.
7035 if (!isIdentifiedObject(V)) {
7036 Objects.clear();
7037 return false;
7038 }
7039 Objects.push_back(const_cast<Value *>(V));
7040 }
7041 } while (!Working.empty());
7042 return true;
7043}
7044
7046 AllocaInst *Result = nullptr;
7048 SmallVector<Value *, 4> Worklist;
7049
7050 auto AddWork = [&](Value *V) {
7051 if (Visited.insert(V).second)
7052 Worklist.push_back(V);
7053 };
7054
7055 AddWork(V);
7056 do {
7057 V = Worklist.pop_back_val();
7058 assert(Visited.count(V));
7059
7060 if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
7061 if (Result && Result != AI)
7062 return nullptr;
7063 Result = AI;
7064 } else if (CastInst *CI = dyn_cast<CastInst>(V)) {
7065 AddWork(CI->getOperand(0));
7066 } else if (PHINode *PN = dyn_cast<PHINode>(V)) {
7067 for (Value *IncValue : PN->incoming_values())
7068 AddWork(IncValue);
7069 } else if (auto *SI = dyn_cast<SelectInst>(V)) {
7070 AddWork(SI->getTrueValue());
7071 AddWork(SI->getFalseValue());
7073 if (OffsetZero && !GEP->hasAllZeroIndices())
7074 return nullptr;
7075 AddWork(GEP->getPointerOperand());
7076 } else if (CallBase *CB = dyn_cast<CallBase>(V)) {
7077 Value *Returned = CB->getReturnedArgOperand();
7078 if (Returned)
7079 AddWork(Returned);
7080 else
7081 return nullptr;
7082 } else {
7083 return nullptr;
7084 }
7085 } while (!Worklist.empty());
7086
7087 return Result;
7088}
7089
7091 const Value *V, bool AllowLifetime, bool AllowDroppable) {
7092 for (const User *U : V->users()) {
7094 if (!II)
7095 return false;
7096
7097 if (AllowLifetime && II->isLifetimeStartOrEnd())
7098 continue;
7099
7100 if (AllowDroppable && II->isDroppable())
7101 continue;
7102
7103 return false;
7104 }
7105 return true;
7106}
7107
7110 V, /* AllowLifetime */ true, /* AllowDroppable */ false);
7111}
7114 V, /* AllowLifetime */ true, /* AllowDroppable */ true);
7115}
7116
7118 if (auto *II = dyn_cast<IntrinsicInst>(I))
7119 return isTriviallyVectorizable(II->getIntrinsicID());
7120 auto *Shuffle = dyn_cast<ShuffleVectorInst>(I);
7121 return (!Shuffle || Shuffle->isSelect()) &&
7123}
7124
7126 const Instruction *Inst, const Instruction *CtxI, AssumptionCache *AC,
7127 const DominatorTree *DT, const TargetLibraryInfo *TLI, bool UseVariableInfo,
7128 bool IgnoreUBImplyingAttrs) {
7129 return isSafeToSpeculativelyExecuteWithOpcode(Inst->getOpcode(), Inst, CtxI,
7130 AC, DT, TLI, UseVariableInfo,
7131 IgnoreUBImplyingAttrs);
7132}
7133
7135 unsigned Opcode, const Instruction *Inst, const Instruction *CtxI,
7136 AssumptionCache *AC, const DominatorTree *DT, const TargetLibraryInfo *TLI,
7137 bool UseVariableInfo, bool IgnoreUBImplyingAttrs) {
7138#ifndef NDEBUG
7139 if (Inst->getOpcode() != Opcode) {
7140 // Check that the operands are actually compatible with the Opcode override.
7141 auto hasEqualReturnAndLeadingOperandTypes =
7142 [](const Instruction *Inst, unsigned NumLeadingOperands) {
7143 if (Inst->getNumOperands() < NumLeadingOperands)
7144 return false;
7145 const Type *ExpectedType = Inst->getType();
7146 for (unsigned ItOp = 0; ItOp < NumLeadingOperands; ++ItOp)
7147 if (Inst->getOperand(ItOp)->getType() != ExpectedType)
7148 return false;
7149 return true;
7150 };
7152 hasEqualReturnAndLeadingOperandTypes(Inst, 2));
7153 assert(!Instruction::isUnaryOp(Opcode) ||
7154 hasEqualReturnAndLeadingOperandTypes(Inst, 1));
7155 }
7156#endif
7157
7158 switch (Opcode) {
7159 default:
7160 return true;
7161 case Instruction::UDiv:
7162 case Instruction::URem: {
7163 // x / y is undefined if y == 0.
7164 const APInt *V;
7165 if (match(Inst->getOperand(1), m_APInt(V)))
7166 return *V != 0;
7167 return false;
7168 }
7169 case Instruction::SDiv:
7170 case Instruction::SRem: {
7171 // x / y is undefined if y == 0 or x == INT_MIN and y == -1
7172 const APInt *Numerator, *Denominator;
7173 if (!match(Inst->getOperand(1), m_APInt(Denominator)))
7174 return false;
7175 // We cannot hoist this division if the denominator is 0.
7176 if (*Denominator == 0)
7177 return false;
7178 // It's safe to hoist if the denominator is not 0 or -1.
7179 if (!Denominator->isAllOnes())
7180 return true;
7181 // At this point we know that the denominator is -1. It is safe to hoist as
7182 // long we know that the numerator is not INT_MIN.
7183 if (match(Inst->getOperand(0), m_APInt(Numerator)))
7184 return !Numerator->isMinSignedValue();
7185 // The numerator *might* be MinSignedValue.
7186 return false;
7187 }
7188 case Instruction::Load: {
7189 if (!UseVariableInfo)
7190 return false;
7191
7192 const LoadInst *LI = dyn_cast<LoadInst>(Inst);
7193 if (!LI)
7194 return false;
7195 if (mustSuppressSpeculation(*LI))
7196 return false;
7197 const DataLayout &DL = LI->getDataLayout();
7199 LI->getType(), LI->getAlign(), DL,
7200 CtxI, AC, DT, TLI);
7201 }
7202 case Instruction::Call: {
7203 auto *CI = dyn_cast<const CallInst>(Inst);
7204 if (!CI)
7205 return false;
7206 const Function *Callee = CI->getCalledFunction();
7207
7208 // The called function could have undefined behavior or side-effects, even
7209 // if marked readnone nounwind.
7210 if (!Callee || !Callee->isSpeculatable())
7211 return false;
7212 // Since the operands may be changed after hoisting, undefined behavior may
7213 // be triggered by some UB-implying attributes.
7214 return IgnoreUBImplyingAttrs || !CI->hasUBImplyingAttrs();
7215 }
7216 case Instruction::VAArg:
7217 case Instruction::Alloca:
7218 case Instruction::Invoke:
7219 case Instruction::CallBr:
7220 case Instruction::PHI:
7221 case Instruction::Store:
7222 case Instruction::Ret:
7223 case Instruction::Br:
7224 case Instruction::IndirectBr:
7225 case Instruction::Switch:
7226 case Instruction::Unreachable:
7227 case Instruction::Fence:
7228 case Instruction::AtomicRMW:
7229 case Instruction::AtomicCmpXchg:
7230 case Instruction::LandingPad:
7231 case Instruction::Resume:
7232 case Instruction::CatchSwitch:
7233 case Instruction::CatchPad:
7234 case Instruction::CatchRet:
7235 case Instruction::CleanupPad:
7236 case Instruction::CleanupRet:
7237 return false; // Misc instructions which have effects
7238 }
7239}
7240
7242 if (I.mayReadOrWriteMemory())
7243 // Memory dependency possible
7244 return true;
7246 // Can't move above a maythrow call or infinite loop. Or if an
7247 // inalloca alloca, above a stacksave call.
7248 return true;
7250 // 1) Can't reorder two inf-loop calls, even if readonly
7251 // 2) Also can't reorder an inf-loop call below a instruction which isn't
7252 // safe to speculative execute. (Inverse of above)
7253 return true;
7254 return false;
7255}
7256
7257/// Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
7271
7272/// Combine constant ranges from computeConstantRange() and computeKnownBits().
7275 bool ForSigned,
7276 const SimplifyQuery &SQ) {
7277 ConstantRange CR1 =
7278 ConstantRange::fromKnownBits(V.getKnownBits(SQ), ForSigned);
7279 ConstantRange CR2 = computeConstantRange(V, ForSigned, SQ.IIQ.UseInstrInfo);
7282 return CR1.intersectWith(CR2, RangeType);
7283}
7284
7286 const Value *RHS,
7287 const SimplifyQuery &SQ,
7288 bool IsNSW) {
7289 ConstantRange LHSRange =
7290 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7291 ConstantRange RHSRange =
7292 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7293
7294 // mul nsw of two non-negative numbers is also nuw.
7295 if (IsNSW && LHSRange.isAllNonNegative() && RHSRange.isAllNonNegative())
7297
7298 return mapOverflowResult(LHSRange.unsignedMulMayOverflow(RHSRange));
7299}
7300
7302 const Value *RHS,
7303 const SimplifyQuery &SQ) {
7304 // Multiplying n * m significant bits yields a result of n + m significant
7305 // bits. If the total number of significant bits does not exceed the
7306 // result bit width (minus 1), there is no overflow.
7307 // This means if we have enough leading sign bits in the operands
7308 // we can guarantee that the result does not overflow.
7309 // Ref: "Hacker's Delight" by Henry Warren
7310 unsigned BitWidth = LHS->getType()->getScalarSizeInBits();
7311
7312 // Note that underestimating the number of sign bits gives a more
7313 // conservative answer.
7314 unsigned SignBits =
7315 ::ComputeNumSignBits(LHS, SQ) + ::ComputeNumSignBits(RHS, SQ);
7316
7317 // First handle the easy case: if we have enough sign bits there's
7318 // definitely no overflow.
7319 if (SignBits > BitWidth + 1)
7321
7322 // There are two ambiguous cases where there can be no overflow:
7323 // SignBits == BitWidth + 1 and
7324 // SignBits == BitWidth
7325 // The second case is difficult to check, therefore we only handle the
7326 // first case.
7327 if (SignBits == BitWidth + 1) {
7328 // It overflows only when both arguments are negative and the true
7329 // product is exactly the minimum negative number.
7330 // E.g. mul i16 with 17 sign bits: 0xff00 * 0xff80 = 0x8000
7331 // For simplicity we just check if at least one side is not negative.
7332 KnownBits LHSKnown = computeKnownBits(LHS, SQ);
7333 KnownBits RHSKnown = computeKnownBits(RHS, SQ);
7334 if (LHSKnown.isNonNegative() || RHSKnown.isNonNegative())
7336 }
7338}
7339
7342 const WithCache<const Value *> &RHS,
7343 const SimplifyQuery &SQ) {
7344 ConstantRange LHSRange =
7345 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7346 ConstantRange RHSRange =
7347 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7348 return mapOverflowResult(LHSRange.unsignedAddMayOverflow(RHSRange));
7349}
7350
7351static OverflowResult
7354 const AddOperator *Add, const SimplifyQuery &SQ) {
7355 if (Add && Add->hasNoSignedWrap()) {
7357 }
7358
7359 // If LHS and RHS each have at least two sign bits, the addition will look
7360 // like
7361 //
7362 // XX..... +
7363 // YY.....
7364 //
7365 // If the carry into the most significant position is 0, X and Y can't both
7366 // be 1 and therefore the carry out of the addition is also 0.
7367 //
7368 // If the carry into the most significant position is 1, X and Y can't both
7369 // be 0 and therefore the carry out of the addition is also 1.
7370 //
7371 // Since the carry into the most significant position is always equal to
7372 // the carry out of the addition, there is no signed overflow.
7373 if (::ComputeNumSignBits(LHS, SQ) > 1 && ::ComputeNumSignBits(RHS, SQ) > 1)
7375
7376 ConstantRange LHSRange =
7377 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/true, SQ);
7378 ConstantRange RHSRange =
7379 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/true, SQ);
7380 OverflowResult OR =
7381 mapOverflowResult(LHSRange.signedAddMayOverflow(RHSRange));
7383 return OR;
7384
7385 // The remaining code needs Add to be available. Early returns if not so.
7386 if (!Add)
7388
7389 // If the sign of Add is the same as at least one of the operands, this add
7390 // CANNOT overflow. If this can be determined from the known bits of the
7391 // operands the above signedAddMayOverflow() check will have already done so.
7392 // The only other way to improve on the known bits is from an assumption, so
7393 // call computeKnownBitsFromContext() directly.
7394 bool LHSOrRHSKnownNonNegative =
7395 (LHSRange.isAllNonNegative() || RHSRange.isAllNonNegative());
7396 bool LHSOrRHSKnownNegative =
7397 (LHSRange.isAllNegative() || RHSRange.isAllNegative());
7398 if (LHSOrRHSKnownNonNegative || LHSOrRHSKnownNegative) {
7399 KnownBits AddKnown(LHSRange.getBitWidth());
7400 computeKnownBitsFromContext(Add, AddKnown, SQ);
7401 if ((AddKnown.isNonNegative() && LHSOrRHSKnownNonNegative) ||
7402 (AddKnown.isNegative() && LHSOrRHSKnownNegative))
7404 }
7405
7407}
7408
7410 const Value *RHS,
7411 const SimplifyQuery &SQ) {
7412 // X - (X % ?)
7413 // The remainder of a value can't have greater magnitude than itself,
7414 // so the subtraction can't overflow.
7415
7416 // X - (X -nuw ?)
7417 // In the minimal case, this would simplify to "?", so there's no subtract
7418 // at all. But if this analysis is used to peek through casts, for example,
7419 // then determining no-overflow may allow other transforms.
7420
7421 // TODO: There are other patterns like this.
7422 // See simplifyICmpWithBinOpOnLHS() for candidates.
7423 if (match(RHS, m_URem(m_Specific(LHS), m_Value())) ||
7424 match(RHS, m_NUWSub(m_Specific(LHS), m_Value())))
7425 if (isGuaranteedNotToBeUndef(LHS, SQ.AC, SQ.CxtI, SQ.DT))
7427
7428 if (auto C = isImpliedByDomCondition(CmpInst::ICMP_UGE, LHS, RHS, SQ.CxtI,
7429 SQ.DL)) {
7430 if (*C)
7433 }
7434
7435 ConstantRange LHSRange =
7436 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/false, SQ);
7437 ConstantRange RHSRange =
7438 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/false, SQ);
7439 return mapOverflowResult(LHSRange.unsignedSubMayOverflow(RHSRange));
7440}
7441
7443 const Value *RHS,
7444 const SimplifyQuery &SQ) {
7445 // X - (X % ?)
7446 // The remainder of a value can't have greater magnitude than itself,
7447 // so the subtraction can't overflow.
7448
7449 // X - (X -nsw ?)
7450 // In the minimal case, this would simplify to "?", so there's no subtract
7451 // at all. But if this analysis is used to peek through casts, for example,
7452 // then determining no-overflow may allow other transforms.
7453 if (match(RHS, m_SRem(m_Specific(LHS), m_Value())) ||
7454 match(RHS, m_NSWSub(m_Specific(LHS), m_Value())))
7455 if (isGuaranteedNotToBeUndef(LHS, SQ.AC, SQ.CxtI, SQ.DT))
7457
7458 // If LHS and RHS each have at least two sign bits, the subtraction
7459 // cannot overflow.
7460 if (::ComputeNumSignBits(LHS, SQ) > 1 && ::ComputeNumSignBits(RHS, SQ) > 1)
7462
7463 ConstantRange LHSRange =
7464 computeConstantRangeIncludingKnownBits(LHS, /*ForSigned=*/true, SQ);
7465 ConstantRange RHSRange =
7466 computeConstantRangeIncludingKnownBits(RHS, /*ForSigned=*/true, SQ);
7467 return mapOverflowResult(LHSRange.signedSubMayOverflow(RHSRange));
7468}
7469
7471 const DominatorTree &DT) {
7472 SmallVector<const BranchInst *, 2> GuardingBranches;
7474
7475 for (const User *U : WO->users()) {
7476 if (const auto *EVI = dyn_cast<ExtractValueInst>(U)) {
7477 assert(EVI->getNumIndices() == 1 && "Obvious from CI's type");
7478
7479 if (EVI->getIndices()[0] == 0)
7480 Results.push_back(EVI);
7481 else {
7482 assert(EVI->getIndices()[0] == 1 && "Obvious from CI's type");
7483
7484 for (const auto *U : EVI->users())
7485 if (const auto *B = dyn_cast<BranchInst>(U)) {
7486 assert(B->isConditional() && "How else is it using an i1?");
7487 GuardingBranches.push_back(B);
7488 }
7489 }
7490 } else {
7491 // We are using the aggregate directly in a way we don't want to analyze
7492 // here (storing it to a global, say).
7493 return false;
7494 }
7495 }
7496
7497 auto AllUsesGuardedByBranch = [&](const BranchInst *BI) {
7498 BasicBlockEdge NoWrapEdge(BI->getParent(), BI->getSuccessor(1));
7499 if (!NoWrapEdge.isSingleEdge())
7500 return false;
7501
7502 // Check if all users of the add are provably no-wrap.
7503 for (const auto *Result : Results) {
7504 // If the extractvalue itself is not executed on overflow, the we don't
7505 // need to check each use separately, since domination is transitive.
7506 if (DT.dominates(NoWrapEdge, Result->getParent()))
7507 continue;
7508
7509 for (const auto &RU : Result->uses())
7510 if (!DT.dominates(NoWrapEdge, RU))
7511 return false;
7512 }
7513
7514 return true;
7515 };
7516
7517 return llvm::any_of(GuardingBranches, AllUsesGuardedByBranch);
7518}
7519
7520/// Shifts return poison if shiftwidth is larger than the bitwidth.
7521static bool shiftAmountKnownInRange(const Value *ShiftAmount) {
7522 auto *C = dyn_cast<Constant>(ShiftAmount);
7523 if (!C)
7524 return false;
7525
7526 // Shifts return poison if shiftwidth is larger than the bitwidth.
7528 if (auto *FVTy = dyn_cast<FixedVectorType>(C->getType())) {
7529 unsigned NumElts = FVTy->getNumElements();
7530 for (unsigned i = 0; i < NumElts; ++i)
7531 ShiftAmounts.push_back(C->getAggregateElement(i));
7532 } else if (isa<ScalableVectorType>(C->getType()))
7533 return false; // Can't tell, just return false to be safe
7534 else
7535 ShiftAmounts.push_back(C);
7536
7537 bool Safe = llvm::all_of(ShiftAmounts, [](const Constant *C) {
7538 auto *CI = dyn_cast_or_null<ConstantInt>(C);
7539 return CI && CI->getValue().ult(C->getType()->getIntegerBitWidth());
7540 });
7541
7542 return Safe;
7543}
7544
7550
7552 return (unsigned(Kind) & unsigned(UndefPoisonKind::PoisonOnly)) != 0;
7553}
7554
7556 return (unsigned(Kind) & unsigned(UndefPoisonKind::UndefOnly)) != 0;
7557}
7558
7560 bool ConsiderFlagsAndMetadata) {
7561
7562 if (ConsiderFlagsAndMetadata && includesPoison(Kind) &&
7563 Op->hasPoisonGeneratingAnnotations())
7564 return true;
7565
7566 unsigned Opcode = Op->getOpcode();
7567
7568 // Check whether opcode is a poison/undef-generating operation
7569 switch (Opcode) {
7570 case Instruction::Shl:
7571 case Instruction::AShr:
7572 case Instruction::LShr:
7573 return includesPoison(Kind) && !shiftAmountKnownInRange(Op->getOperand(1));
7574 case Instruction::FPToSI:
7575 case Instruction::FPToUI:
7576 // fptosi/ui yields poison if the resulting value does not fit in the
7577 // destination type.
7578 return true;
7579 case Instruction::Call:
7580 if (auto *II = dyn_cast<IntrinsicInst>(Op)) {
7581 switch (II->getIntrinsicID()) {
7582 // NOTE: Use IntrNoCreateUndefOrPoison when possible.
7583 case Intrinsic::ctlz:
7584 case Intrinsic::cttz:
7585 case Intrinsic::abs:
7586 // We're not considering flags so it is safe to just return false.
7587 return false;
7588 case Intrinsic::sshl_sat:
7589 case Intrinsic::ushl_sat:
7590 if (!includesPoison(Kind) ||
7591 shiftAmountKnownInRange(II->getArgOperand(1)))
7592 return false;
7593 break;
7594 }
7595 }
7596 [[fallthrough]];
7597 case Instruction::CallBr:
7598 case Instruction::Invoke: {
7599 const auto *CB = cast<CallBase>(Op);
7600 return !CB->hasRetAttr(Attribute::NoUndef) &&
7601 !CB->hasFnAttr(Attribute::NoCreateUndefOrPoison);
7602 }
7603 case Instruction::InsertElement:
7604 case Instruction::ExtractElement: {
7605 // If index exceeds the length of the vector, it returns poison
7606 auto *VTy = cast<VectorType>(Op->getOperand(0)->getType());
7607 unsigned IdxOp = Op->getOpcode() == Instruction::InsertElement ? 2 : 1;
7608 auto *Idx = dyn_cast<ConstantInt>(Op->getOperand(IdxOp));
7609 if (includesPoison(Kind))
7610 return !Idx ||
7611 Idx->getValue().uge(VTy->getElementCount().getKnownMinValue());
7612 return false;
7613 }
7614 case Instruction::ShuffleVector: {
7616 ? cast<ConstantExpr>(Op)->getShuffleMask()
7617 : cast<ShuffleVectorInst>(Op)->getShuffleMask();
7618 return includesPoison(Kind) && is_contained(Mask, PoisonMaskElem);
7619 }
7620 case Instruction::FNeg:
7621 case Instruction::PHI:
7622 case Instruction::Select:
7623 case Instruction::ExtractValue:
7624 case Instruction::InsertValue:
7625 case Instruction::Freeze:
7626 case Instruction::ICmp:
7627 case Instruction::FCmp:
7628 case Instruction::GetElementPtr:
7629 return false;
7630 case Instruction::AddrSpaceCast:
7631 return true;
7632 default: {
7633 const auto *CE = dyn_cast<ConstantExpr>(Op);
7634 if (isa<CastInst>(Op) || (CE && CE->isCast()))
7635 return false;
7636 else if (Instruction::isBinaryOp(Opcode))
7637 return false;
7638 // Be conservative and return true.
7639 return true;
7640 }
7641 }
7642}
7643
7645 bool ConsiderFlagsAndMetadata) {
7646 return ::canCreateUndefOrPoison(Op, UndefPoisonKind::UndefOrPoison,
7647 ConsiderFlagsAndMetadata);
7648}
7649
7650bool llvm::canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata) {
7651 return ::canCreateUndefOrPoison(Op, UndefPoisonKind::PoisonOnly,
7652 ConsiderFlagsAndMetadata);
7653}
7654
7655static bool directlyImpliesPoison(const Value *ValAssumedPoison, const Value *V,
7656 unsigned Depth) {
7657 if (ValAssumedPoison == V)
7658 return true;
7659
7660 const unsigned MaxDepth = 2;
7661 if (Depth >= MaxDepth)
7662 return false;
7663
7664 if (const auto *I = dyn_cast<Instruction>(V)) {
7665 if (any_of(I->operands(), [=](const Use &Op) {
7666 return propagatesPoison(Op) &&
7667 directlyImpliesPoison(ValAssumedPoison, Op, Depth + 1);
7668 }))
7669 return true;
7670
7671 // V = extractvalue V0, idx
7672 // V2 = extractvalue V0, idx2
7673 // V0's elements are all poison or not. (e.g., add_with_overflow)
7674 const WithOverflowInst *II;
7676 (match(ValAssumedPoison, m_ExtractValue(m_Specific(II))) ||
7677 llvm::is_contained(II->args(), ValAssumedPoison)))
7678 return true;
7679 }
7680 return false;
7681}
7682
7683static bool impliesPoison(const Value *ValAssumedPoison, const Value *V,
7684 unsigned Depth) {
7685 if (isGuaranteedNotToBePoison(ValAssumedPoison))
7686 return true;
7687
7688 if (directlyImpliesPoison(ValAssumedPoison, V, /* Depth */ 0))
7689 return true;
7690
7691 const unsigned MaxDepth = 2;
7692 if (Depth >= MaxDepth)
7693 return false;
7694
7695 const auto *I = dyn_cast<Instruction>(ValAssumedPoison);
7696 if (I && !canCreatePoison(cast<Operator>(I))) {
7697 return all_of(I->operands(), [=](const Value *Op) {
7698 return impliesPoison(Op, V, Depth + 1);
7699 });
7700 }
7701 return false;
7702}
7703
7704bool llvm::impliesPoison(const Value *ValAssumedPoison, const Value *V) {
7705 return ::impliesPoison(ValAssumedPoison, V, /* Depth */ 0);
7706}
7707
7708static bool programUndefinedIfUndefOrPoison(const Value *V, bool PoisonOnly);
7709
7711 const Value *V, AssumptionCache *AC, const Instruction *CtxI,
7712 const DominatorTree *DT, unsigned Depth, UndefPoisonKind Kind) {
7714 return false;
7715
7716 if (isa<MetadataAsValue>(V))
7717 return false;
7718
7719 if (const auto *A = dyn_cast<Argument>(V)) {
7720 if (A->hasAttribute(Attribute::NoUndef) ||
7721 A->hasAttribute(Attribute::Dereferenceable) ||
7722 A->hasAttribute(Attribute::DereferenceableOrNull))
7723 return true;
7724 }
7725
7726 if (auto *C = dyn_cast<Constant>(V)) {
7727 if (isa<PoisonValue>(C))
7728 return !includesPoison(Kind);
7729
7730 if (isa<UndefValue>(C))
7731 return !includesUndef(Kind);
7732
7735 return true;
7736
7737 if (C->getType()->isVectorTy()) {
7738 if (isa<ConstantExpr>(C)) {
7739 // Scalable vectors can use a ConstantExpr to build a splat.
7740 if (Constant *SplatC = C->getSplatValue())
7741 if (isa<ConstantInt>(SplatC) || isa<ConstantFP>(SplatC))
7742 return true;
7743 } else {
7744 if (includesUndef(Kind) && C->containsUndefElement())
7745 return false;
7746 if (includesPoison(Kind) && C->containsPoisonElement())
7747 return false;
7748 return !C->containsConstantExpression();
7749 }
7750 }
7751 }
7752
7753 // Strip cast operations from a pointer value.
7754 // Note that stripPointerCastsSameRepresentation can strip off getelementptr
7755 // inbounds with zero offset. To guarantee that the result isn't poison, the
7756 // stripped pointer is checked as it has to be pointing into an allocated
7757 // object or be null `null` to ensure `inbounds` getelement pointers with a
7758 // zero offset could not produce poison.
7759 // It can strip off addrspacecast that do not change bit representation as
7760 // well. We believe that such addrspacecast is equivalent to no-op.
7761 auto *StrippedV = V->stripPointerCastsSameRepresentation();
7762 if (isa<AllocaInst>(StrippedV) || isa<GlobalVariable>(StrippedV) ||
7763 isa<Function>(StrippedV) || isa<ConstantPointerNull>(StrippedV))
7764 return true;
7765
7766 auto OpCheck = [&](const Value *V) {
7767 return isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth + 1, Kind);
7768 };
7769
7770 if (auto *Opr = dyn_cast<Operator>(V)) {
7771 // If the value is a freeze instruction, then it can never
7772 // be undef or poison.
7773 if (isa<FreezeInst>(V))
7774 return true;
7775
7776 if (const auto *CB = dyn_cast<CallBase>(V)) {
7777 if (CB->hasRetAttr(Attribute::NoUndef) ||
7778 CB->hasRetAttr(Attribute::Dereferenceable) ||
7779 CB->hasRetAttr(Attribute::DereferenceableOrNull))
7780 return true;
7781 }
7782
7783 if (!::canCreateUndefOrPoison(Opr, Kind,
7784 /*ConsiderFlagsAndMetadata=*/true)) {
7785 if (const auto *PN = dyn_cast<PHINode>(V)) {
7786 unsigned Num = PN->getNumIncomingValues();
7787 bool IsWellDefined = true;
7788 for (unsigned i = 0; i < Num; ++i) {
7789 if (PN == PN->getIncomingValue(i))
7790 continue;
7791 auto *TI = PN->getIncomingBlock(i)->getTerminator();
7792 if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI,
7793 DT, Depth + 1, Kind)) {
7794 IsWellDefined = false;
7795 break;
7796 }
7797 }
7798 if (IsWellDefined)
7799 return true;
7800 } else if (auto *Splat = isa<ShuffleVectorInst>(Opr) ? getSplatValue(Opr)
7801 : nullptr) {
7802 // For splats we only need to check the value being splatted.
7803 if (OpCheck(Splat))
7804 return true;
7805 } else if (all_of(Opr->operands(), OpCheck))
7806 return true;
7807 }
7808 }
7809
7810 if (auto *I = dyn_cast<LoadInst>(V))
7811 if (I->hasMetadata(LLVMContext::MD_noundef) ||
7812 I->hasMetadata(LLVMContext::MD_dereferenceable) ||
7813 I->hasMetadata(LLVMContext::MD_dereferenceable_or_null))
7814 return true;
7815
7817 return true;
7818
7819 // CxtI may be null or a cloned instruction.
7820 if (!CtxI || !CtxI->getParent() || !DT)
7821 return false;
7822
7823 auto *DNode = DT->getNode(CtxI->getParent());
7824 if (!DNode)
7825 // Unreachable block
7826 return false;
7827
7828 // If V is used as a branch condition before reaching CtxI, V cannot be
7829 // undef or poison.
7830 // br V, BB1, BB2
7831 // BB1:
7832 // CtxI ; V cannot be undef or poison here
7833 auto *Dominator = DNode->getIDom();
7834 // This check is purely for compile time reasons: we can skip the IDom walk
7835 // if what we are checking for includes undef and the value is not an integer.
7836 if (!includesUndef(Kind) || V->getType()->isIntegerTy())
7837 while (Dominator) {
7838 auto *TI = Dominator->getBlock()->getTerminator();
7839
7840 Value *Cond = nullptr;
7841 if (auto BI = dyn_cast_or_null<BranchInst>(TI)) {
7842 if (BI->isConditional())
7843 Cond = BI->getCondition();
7844 } else if (auto SI = dyn_cast_or_null<SwitchInst>(TI)) {
7845 Cond = SI->getCondition();
7846 }
7847
7848 if (Cond) {
7849 if (Cond == V)
7850 return true;
7851 else if (!includesUndef(Kind) && isa<Operator>(Cond)) {
7852 // For poison, we can analyze further
7853 auto *Opr = cast<Operator>(Cond);
7854 if (any_of(Opr->operands(), [V](const Use &U) {
7855 return V == U && propagatesPoison(U);
7856 }))
7857 return true;
7858 }
7859 }
7860
7861 Dominator = Dominator->getIDom();
7862 }
7863
7864 if (AC && getKnowledgeValidInContext(V, {Attribute::NoUndef}, *AC, CtxI, DT))
7865 return true;
7866
7867 return false;
7868}
7869
7871 const Instruction *CtxI,
7872 const DominatorTree *DT,
7873 unsigned Depth) {
7874 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7876}
7877
7879 const Instruction *CtxI,
7880 const DominatorTree *DT, unsigned Depth) {
7881 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7883}
7884
7886 const Instruction *CtxI,
7887 const DominatorTree *DT, unsigned Depth) {
7888 return ::isGuaranteedNotToBeUndefOrPoison(V, AC, CtxI, DT, Depth,
7890}
7891
7892/// Return true if undefined behavior would provably be executed on the path to
7893/// OnPathTo if Root produced a posion result. Note that this doesn't say
7894/// anything about whether OnPathTo is actually executed or whether Root is
7895/// actually poison. This can be used to assess whether a new use of Root can
7896/// be added at a location which is control equivalent with OnPathTo (such as
7897/// immediately before it) without introducing UB which didn't previously
7898/// exist. Note that a false result conveys no information.
7900 Instruction *OnPathTo,
7901 DominatorTree *DT) {
7902 // Basic approach is to assume Root is poison, propagate poison forward
7903 // through all users we can easily track, and then check whether any of those
7904 // users are provable UB and must execute before out exiting block might
7905 // exit.
7906
7907 // The set of all recursive users we've visited (which are assumed to all be
7908 // poison because of said visit)
7911 Worklist.push_back(Root);
7912 while (!Worklist.empty()) {
7913 const Instruction *I = Worklist.pop_back_val();
7914
7915 // If we know this must trigger UB on a path leading our target.
7916 if (mustTriggerUB(I, KnownPoison) && DT->dominates(I, OnPathTo))
7917 return true;
7918
7919 // If we can't analyze propagation through this instruction, just skip it
7920 // and transitive users. Safe as false is a conservative result.
7921 if (I != Root && !any_of(I->operands(), [&KnownPoison](const Use &U) {
7922 return KnownPoison.contains(U) && propagatesPoison(U);
7923 }))
7924 continue;
7925
7926 if (KnownPoison.insert(I).second)
7927 for (const User *User : I->users())
7928 Worklist.push_back(cast<Instruction>(User));
7929 }
7930
7931 // Might be non-UB, or might have a path we couldn't prove must execute on
7932 // way to exiting bb.
7933 return false;
7934}
7935
7937 const SimplifyQuery &SQ) {
7938 return ::computeOverflowForSignedAdd(Add->getOperand(0), Add->getOperand(1),
7939 Add, SQ);
7940}
7941
7944 const WithCache<const Value *> &RHS,
7945 const SimplifyQuery &SQ) {
7946 return ::computeOverflowForSignedAdd(LHS, RHS, nullptr, SQ);
7947}
7948
7950 // Note: An atomic operation isn't guaranteed to return in a reasonable amount
7951 // of time because it's possible for another thread to interfere with it for an
7952 // arbitrary length of time, but programs aren't allowed to rely on that.
7953
7954 // If there is no successor, then execution can't transfer to it.
7955 if (isa<ReturnInst>(I))
7956 return false;
7958 return false;
7959
7960 // Note: Do not add new checks here; instead, change Instruction::mayThrow or
7961 // Instruction::willReturn.
7962 //
7963 // FIXME: Move this check into Instruction::willReturn.
7964 if (isa<CatchPadInst>(I)) {
7965 switch (classifyEHPersonality(I->getFunction()->getPersonalityFn())) {
7966 default:
7967 // A catchpad may invoke exception object constructors and such, which
7968 // in some languages can be arbitrary code, so be conservative by default.
7969 return false;
7971 // For CoreCLR, it just involves a type test.
7972 return true;
7973 }
7974 }
7975
7976 // An instruction that returns without throwing must transfer control flow
7977 // to a successor.
7978 return !I->mayThrow() && I->willReturn();
7979}
7980
7982 // TODO: This is slightly conservative for invoke instruction since exiting
7983 // via an exception *is* normal control for them.
7984 for (const Instruction &I : *BB)
7986 return false;
7987 return true;
7988}
7989
7996
7999 assert(ScanLimit && "scan limit must be non-zero");
8000 for (const Instruction &I : Range) {
8001 if (--ScanLimit == 0)
8002 return false;
8004 return false;
8005 }
8006 return true;
8007}
8008
8010 const Loop *L) {
8011 // The loop header is guaranteed to be executed for every iteration.
8012 //
8013 // FIXME: Relax this constraint to cover all basic blocks that are
8014 // guaranteed to be executed at every iteration.
8015 if (I->getParent() != L->getHeader()) return false;
8016
8017 for (const Instruction &LI : *L->getHeader()) {
8018 if (&LI == I) return true;
8019 if (!isGuaranteedToTransferExecutionToSuccessor(&LI)) return false;
8020 }
8021 llvm_unreachable("Instruction not contained in its own parent basic block.");
8022}
8023
8025 switch (IID) {
8026 // TODO: Add more intrinsics.
8027 case Intrinsic::sadd_with_overflow:
8028 case Intrinsic::ssub_with_overflow:
8029 case Intrinsic::smul_with_overflow:
8030 case Intrinsic::uadd_with_overflow:
8031 case Intrinsic::usub_with_overflow:
8032 case Intrinsic::umul_with_overflow:
8033 // If an input is a vector containing a poison element, the
8034 // two output vectors (calculated results, overflow bits)'
8035 // corresponding lanes are poison.
8036 return true;
8037 case Intrinsic::ctpop:
8038 case Intrinsic::ctlz:
8039 case Intrinsic::cttz:
8040 case Intrinsic::abs:
8041 case Intrinsic::smax:
8042 case Intrinsic::smin:
8043 case Intrinsic::umax:
8044 case Intrinsic::umin:
8045 case Intrinsic::scmp:
8046 case Intrinsic::is_fpclass:
8047 case Intrinsic::ptrmask:
8048 case Intrinsic::ucmp:
8049 case Intrinsic::bitreverse:
8050 case Intrinsic::bswap:
8051 case Intrinsic::sadd_sat:
8052 case Intrinsic::ssub_sat:
8053 case Intrinsic::sshl_sat:
8054 case Intrinsic::uadd_sat:
8055 case Intrinsic::usub_sat:
8056 case Intrinsic::ushl_sat:
8057 case Intrinsic::smul_fix:
8058 case Intrinsic::smul_fix_sat:
8059 case Intrinsic::umul_fix:
8060 case Intrinsic::umul_fix_sat:
8061 case Intrinsic::pow:
8062 case Intrinsic::powi:
8063 case Intrinsic::sin:
8064 case Intrinsic::sinh:
8065 case Intrinsic::cos:
8066 case Intrinsic::cosh:
8067 case Intrinsic::sincos:
8068 case Intrinsic::sincospi:
8069 case Intrinsic::tan:
8070 case Intrinsic::tanh:
8071 case Intrinsic::asin:
8072 case Intrinsic::acos:
8073 case Intrinsic::atan:
8074 case Intrinsic::atan2:
8075 case Intrinsic::canonicalize:
8076 case Intrinsic::sqrt:
8077 case Intrinsic::exp:
8078 case Intrinsic::exp2:
8079 case Intrinsic::exp10:
8080 case Intrinsic::log:
8081 case Intrinsic::log2:
8082 case Intrinsic::log10:
8083 case Intrinsic::modf:
8084 case Intrinsic::floor:
8085 case Intrinsic::ceil:
8086 case Intrinsic::trunc:
8087 case Intrinsic::rint:
8088 case Intrinsic::nearbyint:
8089 case Intrinsic::round:
8090 case Intrinsic::roundeven:
8091 case Intrinsic::lrint:
8092 case Intrinsic::llrint:
8093 case Intrinsic::fshl:
8094 case Intrinsic::fshr:
8095 return true;
8096 default:
8097 return false;
8098 }
8099}
8100
8101bool llvm::propagatesPoison(const Use &PoisonOp) {
8102 const Operator *I = cast<Operator>(PoisonOp.getUser());
8103 switch (I->getOpcode()) {
8104 case Instruction::Freeze:
8105 case Instruction::PHI:
8106 case Instruction::Invoke:
8107 return false;
8108 case Instruction::Select:
8109 return PoisonOp.getOperandNo() == 0;
8110 case Instruction::Call:
8111 if (auto *II = dyn_cast<IntrinsicInst>(I))
8112 return intrinsicPropagatesPoison(II->getIntrinsicID());
8113 return false;
8114 case Instruction::ICmp:
8115 case Instruction::FCmp:
8116 case Instruction::GetElementPtr:
8117 return true;
8118 default:
8120 return true;
8121
8122 // Be conservative and return false.
8123 return false;
8124 }
8125}
8126
8127/// Enumerates all operands of \p I that are guaranteed to not be undef or
8128/// poison. If the callback \p Handle returns true, stop processing and return
8129/// true. Otherwise, return false.
8130template <typename CallableT>
8132 const CallableT &Handle) {
8133 switch (I->getOpcode()) {
8134 case Instruction::Store:
8135 if (Handle(cast<StoreInst>(I)->getPointerOperand()))
8136 return true;
8137 break;
8138
8139 case Instruction::Load:
8140 if (Handle(cast<LoadInst>(I)->getPointerOperand()))
8141 return true;
8142 break;
8143
8144 // Since dereferenceable attribute imply noundef, atomic operations
8145 // also implicitly have noundef pointers too
8146 case Instruction::AtomicCmpXchg:
8148 return true;
8149 break;
8150
8151 case Instruction::AtomicRMW:
8152 if (Handle(cast<AtomicRMWInst>(I)->getPointerOperand()))
8153 return true;
8154 break;
8155
8156 case Instruction::Call:
8157 case Instruction::Invoke: {
8158 const CallBase *CB = cast<CallBase>(I);
8159 if (CB->isIndirectCall() && Handle(CB->getCalledOperand()))
8160 return true;
8161 for (unsigned i = 0; i < CB->arg_size(); ++i)
8162 if ((CB->paramHasAttr(i, Attribute::NoUndef) ||
8163 CB->paramHasAttr(i, Attribute::Dereferenceable) ||
8164 CB->paramHasAttr(i, Attribute::DereferenceableOrNull)) &&
8165 Handle(CB->getArgOperand(i)))
8166 return true;
8167 break;
8168 }
8169 case Instruction::Ret:
8170 if (I->getFunction()->hasRetAttribute(Attribute::NoUndef) &&
8171 Handle(I->getOperand(0)))
8172 return true;
8173 break;
8174 case Instruction::Switch:
8175 if (Handle(cast<SwitchInst>(I)->getCondition()))
8176 return true;
8177 break;
8178 case Instruction::Br: {
8179 auto *BR = cast<BranchInst>(I);
8180 if (BR->isConditional() && Handle(BR->getCondition()))
8181 return true;
8182 break;
8183 }
8184 default:
8185 break;
8186 }
8187
8188 return false;
8189}
8190
8191/// Enumerates all operands of \p I that are guaranteed to not be poison.
8192template <typename CallableT>
8194 const CallableT &Handle) {
8195 if (handleGuaranteedWellDefinedOps(I, Handle))
8196 return true;
8197 switch (I->getOpcode()) {
8198 // Divisors of these operations are allowed to be partially undef.
8199 case Instruction::UDiv:
8200 case Instruction::SDiv:
8201 case Instruction::URem:
8202 case Instruction::SRem:
8203 return Handle(I->getOperand(1));
8204 default:
8205 return false;
8206 }
8207}
8208
8210 const SmallPtrSetImpl<const Value *> &KnownPoison) {
8212 I, [&](const Value *V) { return KnownPoison.count(V); });
8213}
8214
8216 bool PoisonOnly) {
8217 // We currently only look for uses of values within the same basic
8218 // block, as that makes it easier to guarantee that the uses will be
8219 // executed given that Inst is executed.
8220 //
8221 // FIXME: Expand this to consider uses beyond the same basic block. To do
8222 // this, look out for the distinction between post-dominance and strong
8223 // post-dominance.
8224 const BasicBlock *BB = nullptr;
8226 if (const auto *Inst = dyn_cast<Instruction>(V)) {
8227 BB = Inst->getParent();
8228 Begin = Inst->getIterator();
8229 Begin++;
8230 } else if (const auto *Arg = dyn_cast<Argument>(V)) {
8231 if (Arg->getParent()->isDeclaration())
8232 return false;
8233 BB = &Arg->getParent()->getEntryBlock();
8234 Begin = BB->begin();
8235 } else {
8236 return false;
8237 }
8238
8239 // Limit number of instructions we look at, to avoid scanning through large
8240 // blocks. The current limit is chosen arbitrarily.
8241 unsigned ScanLimit = 32;
8242 BasicBlock::const_iterator End = BB->end();
8243
8244 if (!PoisonOnly) {
8245 // Since undef does not propagate eagerly, be conservative & just check
8246 // whether a value is directly passed to an instruction that must take
8247 // well-defined operands.
8248
8249 for (const auto &I : make_range(Begin, End)) {
8250 if (--ScanLimit == 0)
8251 break;
8252
8253 if (handleGuaranteedWellDefinedOps(&I, [V](const Value *WellDefinedOp) {
8254 return WellDefinedOp == V;
8255 }))
8256 return true;
8257
8259 break;
8260 }
8261 return false;
8262 }
8263
8264 // Set of instructions that we have proved will yield poison if Inst
8265 // does.
8266 SmallPtrSet<const Value *, 16> YieldsPoison;
8268
8269 YieldsPoison.insert(V);
8270 Visited.insert(BB);
8271
8272 while (true) {
8273 for (const auto &I : make_range(Begin, End)) {
8274 if (--ScanLimit == 0)
8275 return false;
8276 if (mustTriggerUB(&I, YieldsPoison))
8277 return true;
8279 return false;
8280
8281 // If an operand is poison and propagates it, mark I as yielding poison.
8282 for (const Use &Op : I.operands()) {
8283 if (YieldsPoison.count(Op) && propagatesPoison(Op)) {
8284 YieldsPoison.insert(&I);
8285 break;
8286 }
8287 }
8288
8289 // Special handling for select, which returns poison if its operand 0 is
8290 // poison (handled in the loop above) *or* if both its true/false operands
8291 // are poison (handled here).
8292 if (I.getOpcode() == Instruction::Select &&
8293 YieldsPoison.count(I.getOperand(1)) &&
8294 YieldsPoison.count(I.getOperand(2))) {
8295 YieldsPoison.insert(&I);
8296 }
8297 }
8298
8299 BB = BB->getSingleSuccessor();
8300 if (!BB || !Visited.insert(BB).second)
8301 break;
8302
8303 Begin = BB->getFirstNonPHIIt();
8304 End = BB->end();
8305 }
8306 return false;
8307}
8308
8310 return ::programUndefinedIfUndefOrPoison(Inst, false);
8311}
8312
8314 return ::programUndefinedIfUndefOrPoison(Inst, true);
8315}
8316
8317static bool isKnownNonNaN(const Value *V, FastMathFlags FMF) {
8318 if (FMF.noNaNs())
8319 return true;
8320
8321 if (auto *C = dyn_cast<ConstantFP>(V))
8322 return !C->isNaN();
8323
8324 if (auto *C = dyn_cast<ConstantDataVector>(V)) {
8325 if (!C->getElementType()->isFloatingPointTy())
8326 return false;
8327 for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) {
8328 if (C->getElementAsAPFloat(I).isNaN())
8329 return false;
8330 }
8331 return true;
8332 }
8333
8335 return true;
8336
8337 return false;
8338}
8339
8340static bool isKnownNonZero(const Value *V) {
8341 if (auto *C = dyn_cast<ConstantFP>(V))
8342 return !C->isZero();
8343
8344 if (auto *C = dyn_cast<ConstantDataVector>(V)) {
8345 if (!C->getElementType()->isFloatingPointTy())
8346 return false;
8347 for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) {
8348 if (C->getElementAsAPFloat(I).isZero())
8349 return false;
8350 }
8351 return true;
8352 }
8353
8354 return false;
8355}
8356
8357/// Match clamp pattern for float types without care about NaNs or signed zeros.
8358/// Given non-min/max outer cmp/select from the clamp pattern this
8359/// function recognizes if it can be substitued by a "canonical" min/max
8360/// pattern.
8362 Value *CmpLHS, Value *CmpRHS,
8363 Value *TrueVal, Value *FalseVal,
8364 Value *&LHS, Value *&RHS) {
8365 // Try to match
8366 // X < C1 ? C1 : Min(X, C2) --> Max(C1, Min(X, C2))
8367 // X > C1 ? C1 : Max(X, C2) --> Min(C1, Max(X, C2))
8368 // and return description of the outer Max/Min.
8369
8370 // First, check if select has inverse order:
8371 if (CmpRHS == FalseVal) {
8372 std::swap(TrueVal, FalseVal);
8373 Pred = CmpInst::getInversePredicate(Pred);
8374 }
8375
8376 // Assume success now. If there's no match, callers should not use these anyway.
8377 LHS = TrueVal;
8378 RHS = FalseVal;
8379
8380 const APFloat *FC1;
8381 if (CmpRHS != TrueVal || !match(CmpRHS, m_APFloat(FC1)) || !FC1->isFinite())
8382 return {SPF_UNKNOWN, SPNB_NA, false};
8383
8384 const APFloat *FC2;
8385 switch (Pred) {
8386 case CmpInst::FCMP_OLT:
8387 case CmpInst::FCMP_OLE:
8388 case CmpInst::FCMP_ULT:
8389 case CmpInst::FCMP_ULE:
8390 if (match(FalseVal, m_OrdOrUnordFMin(m_Specific(CmpLHS), m_APFloat(FC2))) &&
8391 *FC1 < *FC2)
8392 return {SPF_FMAXNUM, SPNB_RETURNS_ANY, false};
8393 break;
8394 case CmpInst::FCMP_OGT:
8395 case CmpInst::FCMP_OGE:
8396 case CmpInst::FCMP_UGT:
8397 case CmpInst::FCMP_UGE:
8398 if (match(FalseVal, m_OrdOrUnordFMax(m_Specific(CmpLHS), m_APFloat(FC2))) &&
8399 *FC1 > *FC2)
8400 return {SPF_FMINNUM, SPNB_RETURNS_ANY, false};
8401 break;
8402 default:
8403 break;
8404 }
8405
8406 return {SPF_UNKNOWN, SPNB_NA, false};
8407}
8408
8409/// Recognize variations of:
8410/// CLAMP(v,l,h) ==> ((v) < (l) ? (l) : ((v) > (h) ? (h) : (v)))
8412 Value *CmpLHS, Value *CmpRHS,
8413 Value *TrueVal, Value *FalseVal) {
8414 // Swap the select operands and predicate to match the patterns below.
8415 if (CmpRHS != TrueVal) {
8416 Pred = ICmpInst::getSwappedPredicate(Pred);
8417 std::swap(TrueVal, FalseVal);
8418 }
8419 const APInt *C1;
8420 if (CmpRHS == TrueVal && match(CmpRHS, m_APInt(C1))) {
8421 const APInt *C2;
8422 // (X <s C1) ? C1 : SMIN(X, C2) ==> SMAX(SMIN(X, C2), C1)
8423 if (match(FalseVal, m_SMin(m_Specific(CmpLHS), m_APInt(C2))) &&
8424 C1->slt(*C2) && Pred == CmpInst::ICMP_SLT)
8425 return {SPF_SMAX, SPNB_NA, false};
8426
8427 // (X >s C1) ? C1 : SMAX(X, C2) ==> SMIN(SMAX(X, C2), C1)
8428 if (match(FalseVal, m_SMax(m_Specific(CmpLHS), m_APInt(C2))) &&
8429 C1->sgt(*C2) && Pred == CmpInst::ICMP_SGT)
8430 return {SPF_SMIN, SPNB_NA, false};
8431
8432 // (X <u C1) ? C1 : UMIN(X, C2) ==> UMAX(UMIN(X, C2), C1)
8433 if (match(FalseVal, m_UMin(m_Specific(CmpLHS), m_APInt(C2))) &&
8434 C1->ult(*C2) && Pred == CmpInst::ICMP_ULT)
8435 return {SPF_UMAX, SPNB_NA, false};
8436
8437 // (X >u C1) ? C1 : UMAX(X, C2) ==> UMIN(UMAX(X, C2), C1)
8438 if (match(FalseVal, m_UMax(m_Specific(CmpLHS), m_APInt(C2))) &&
8439 C1->ugt(*C2) && Pred == CmpInst::ICMP_UGT)
8440 return {SPF_UMIN, SPNB_NA, false};
8441 }
8442 return {SPF_UNKNOWN, SPNB_NA, false};
8443}
8444
8445/// Recognize variations of:
8446/// a < c ? min(a,b) : min(b,c) ==> min(min(a,b),min(b,c))
8448 Value *CmpLHS, Value *CmpRHS,
8449 Value *TVal, Value *FVal,
8450 unsigned Depth) {
8451 // TODO: Allow FP min/max with nnan/nsz.
8452 assert(CmpInst::isIntPredicate(Pred) && "Expected integer comparison");
8453
8454 Value *A = nullptr, *B = nullptr;
8455 SelectPatternResult L = matchSelectPattern(TVal, A, B, nullptr, Depth + 1);
8456 if (!SelectPatternResult::isMinOrMax(L.Flavor))
8457 return {SPF_UNKNOWN, SPNB_NA, false};
8458
8459 Value *C = nullptr, *D = nullptr;
8460 SelectPatternResult R = matchSelectPattern(FVal, C, D, nullptr, Depth + 1);
8461 if (L.Flavor != R.Flavor)
8462 return {SPF_UNKNOWN, SPNB_NA, false};
8463
8464 // We have something like: x Pred y ? min(a, b) : min(c, d).
8465 // Try to match the compare to the min/max operations of the select operands.
8466 // First, make sure we have the right compare predicate.
8467 switch (L.Flavor) {
8468 case SPF_SMIN:
8469 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) {
8470 Pred = ICmpInst::getSwappedPredicate(Pred);
8471 std::swap(CmpLHS, CmpRHS);
8472 }
8473 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
8474 break;
8475 return {SPF_UNKNOWN, SPNB_NA, false};
8476 case SPF_SMAX:
8477 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
8478 Pred = ICmpInst::getSwappedPredicate(Pred);
8479 std::swap(CmpLHS, CmpRHS);
8480 }
8481 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE)
8482 break;
8483 return {SPF_UNKNOWN, SPNB_NA, false};
8484 case SPF_UMIN:
8485 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE) {
8486 Pred = ICmpInst::getSwappedPredicate(Pred);
8487 std::swap(CmpLHS, CmpRHS);
8488 }
8489 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE)
8490 break;
8491 return {SPF_UNKNOWN, SPNB_NA, false};
8492 case SPF_UMAX:
8493 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
8494 Pred = ICmpInst::getSwappedPredicate(Pred);
8495 std::swap(CmpLHS, CmpRHS);
8496 }
8497 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
8498 break;
8499 return {SPF_UNKNOWN, SPNB_NA, false};
8500 default:
8501 return {SPF_UNKNOWN, SPNB_NA, false};
8502 }
8503
8504 // If there is a common operand in the already matched min/max and the other
8505 // min/max operands match the compare operands (either directly or inverted),
8506 // then this is min/max of the same flavor.
8507
8508 // a pred c ? m(a, b) : m(c, b) --> m(m(a, b), m(c, b))
8509 // ~c pred ~a ? m(a, b) : m(c, b) --> m(m(a, b), m(c, b))
8510 if (D == B) {
8511 if ((CmpLHS == A && CmpRHS == C) || (match(C, m_Not(m_Specific(CmpLHS))) &&
8512 match(A, m_Not(m_Specific(CmpRHS)))))
8513 return {L.Flavor, SPNB_NA, false};
8514 }
8515 // a pred d ? m(a, b) : m(b, d) --> m(m(a, b), m(b, d))
8516 // ~d pred ~a ? m(a, b) : m(b, d) --> m(m(a, b), m(b, d))
8517 if (C == B) {
8518 if ((CmpLHS == A && CmpRHS == D) || (match(D, m_Not(m_Specific(CmpLHS))) &&
8519 match(A, m_Not(m_Specific(CmpRHS)))))
8520 return {L.Flavor, SPNB_NA, false};
8521 }
8522 // b pred c ? m(a, b) : m(c, a) --> m(m(a, b), m(c, a))
8523 // ~c pred ~b ? m(a, b) : m(c, a) --> m(m(a, b), m(c, a))
8524 if (D == A) {
8525 if ((CmpLHS == B && CmpRHS == C) || (match(C, m_Not(m_Specific(CmpLHS))) &&
8526 match(B, m_Not(m_Specific(CmpRHS)))))
8527 return {L.Flavor, SPNB_NA, false};
8528 }
8529 // b pred d ? m(a, b) : m(a, d) --> m(m(a, b), m(a, d))
8530 // ~d pred ~b ? m(a, b) : m(a, d) --> m(m(a, b), m(a, d))
8531 if (C == A) {
8532 if ((CmpLHS == B && CmpRHS == D) || (match(D, m_Not(m_Specific(CmpLHS))) &&
8533 match(B, m_Not(m_Specific(CmpRHS)))))
8534 return {L.Flavor, SPNB_NA, false};
8535 }
8536
8537 return {SPF_UNKNOWN, SPNB_NA, false};
8538}
8539
8540/// If the input value is the result of a 'not' op, constant integer, or vector
8541/// splat of a constant integer, return the bitwise-not source value.
8542/// TODO: This could be extended to handle non-splat vector integer constants.
8544 Value *NotV;
8545 if (match(V, m_Not(m_Value(NotV))))
8546 return NotV;
8547
8548 const APInt *C;
8549 if (match(V, m_APInt(C)))
8550 return ConstantInt::get(V->getType(), ~(*C));
8551
8552 return nullptr;
8553}
8554
8555/// Match non-obvious integer minimum and maximum sequences.
8557 Value *CmpLHS, Value *CmpRHS,
8558 Value *TrueVal, Value *FalseVal,
8559 Value *&LHS, Value *&RHS,
8560 unsigned Depth) {
8561 // Assume success. If there's no match, callers should not use these anyway.
8562 LHS = TrueVal;
8563 RHS = FalseVal;
8564
8565 SelectPatternResult SPR = matchClamp(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal);
8567 return SPR;
8568
8569 SPR = matchMinMaxOfMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, Depth);
8571 return SPR;
8572
8573 // Look through 'not' ops to find disguised min/max.
8574 // (X > Y) ? ~X : ~Y ==> (~X < ~Y) ? ~X : ~Y ==> MIN(~X, ~Y)
8575 // (X < Y) ? ~X : ~Y ==> (~X > ~Y) ? ~X : ~Y ==> MAX(~X, ~Y)
8576 if (CmpLHS == getNotValue(TrueVal) && CmpRHS == getNotValue(FalseVal)) {
8577 switch (Pred) {
8578 case CmpInst::ICMP_SGT: return {SPF_SMIN, SPNB_NA, false};
8579 case CmpInst::ICMP_SLT: return {SPF_SMAX, SPNB_NA, false};
8580 case CmpInst::ICMP_UGT: return {SPF_UMIN, SPNB_NA, false};
8581 case CmpInst::ICMP_ULT: return {SPF_UMAX, SPNB_NA, false};
8582 default: break;
8583 }
8584 }
8585
8586 // (X > Y) ? ~Y : ~X ==> (~X < ~Y) ? ~Y : ~X ==> MAX(~Y, ~X)
8587 // (X < Y) ? ~Y : ~X ==> (~X > ~Y) ? ~Y : ~X ==> MIN(~Y, ~X)
8588 if (CmpLHS == getNotValue(FalseVal) && CmpRHS == getNotValue(TrueVal)) {
8589 switch (Pred) {
8590 case CmpInst::ICMP_SGT: return {SPF_SMAX, SPNB_NA, false};
8591 case CmpInst::ICMP_SLT: return {SPF_SMIN, SPNB_NA, false};
8592 case CmpInst::ICMP_UGT: return {SPF_UMAX, SPNB_NA, false};
8593 case CmpInst::ICMP_ULT: return {SPF_UMIN, SPNB_NA, false};
8594 default: break;
8595 }
8596 }
8597
8598 if (Pred != CmpInst::ICMP_SGT && Pred != CmpInst::ICMP_SLT)
8599 return {SPF_UNKNOWN, SPNB_NA, false};
8600
8601 const APInt *C1;
8602 if (!match(CmpRHS, m_APInt(C1)))
8603 return {SPF_UNKNOWN, SPNB_NA, false};
8604
8605 // An unsigned min/max can be written with a signed compare.
8606 const APInt *C2;
8607 if ((CmpLHS == TrueVal && match(FalseVal, m_APInt(C2))) ||
8608 (CmpLHS == FalseVal && match(TrueVal, m_APInt(C2)))) {
8609 // Is the sign bit set?
8610 // (X <s 0) ? X : MAXVAL ==> (X >u MAXVAL) ? X : MAXVAL ==> UMAX
8611 // (X <s 0) ? MAXVAL : X ==> (X >u MAXVAL) ? MAXVAL : X ==> UMIN
8612 if (Pred == CmpInst::ICMP_SLT && C1->isZero() && C2->isMaxSignedValue())
8613 return {CmpLHS == TrueVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};
8614
8615 // Is the sign bit clear?
8616 // (X >s -1) ? MINVAL : X ==> (X <u MINVAL) ? MINVAL : X ==> UMAX
8617 // (X >s -1) ? X : MINVAL ==> (X <u MINVAL) ? X : MINVAL ==> UMIN
8618 if (Pred == CmpInst::ICMP_SGT && C1->isAllOnes() && C2->isMinSignedValue())
8619 return {CmpLHS == FalseVal ? SPF_UMAX : SPF_UMIN, SPNB_NA, false};
8620 }
8621
8622 return {SPF_UNKNOWN, SPNB_NA, false};
8623}
8624
8625bool llvm::isKnownNegation(const Value *X, const Value *Y, bool NeedNSW,
8626 bool AllowPoison) {
8627 assert(X && Y && "Invalid operand");
8628
8629 auto IsNegationOf = [&](const Value *X, const Value *Y) {
8630 if (!match(X, m_Neg(m_Specific(Y))))
8631 return false;
8632
8633 auto *BO = cast<BinaryOperator>(X);
8634 if (NeedNSW && !BO->hasNoSignedWrap())
8635 return false;
8636
8637 auto *Zero = cast<Constant>(BO->getOperand(0));
8638 if (!AllowPoison && !Zero->isNullValue())
8639 return false;
8640
8641 return true;
8642 };
8643
8644 // X = -Y or Y = -X
8645 if (IsNegationOf(X, Y) || IsNegationOf(Y, X))
8646 return true;
8647
8648 // X = sub (A, B), Y = sub (B, A) || X = sub nsw (A, B), Y = sub nsw (B, A)
8649 Value *A, *B;
8650 return (!NeedNSW && (match(X, m_Sub(m_Value(A), m_Value(B))) &&
8651 match(Y, m_Sub(m_Specific(B), m_Specific(A))))) ||
8652 (NeedNSW && (match(X, m_NSWSub(m_Value(A), m_Value(B))) &&
8654}
8655
8656bool llvm::isKnownInversion(const Value *X, const Value *Y) {
8657 // Handle X = icmp pred A, B, Y = icmp pred A, C.
8658 Value *A, *B, *C;
8659 CmpPredicate Pred1, Pred2;
8660 if (!match(X, m_ICmp(Pred1, m_Value(A), m_Value(B))) ||
8661 !match(Y, m_c_ICmp(Pred2, m_Specific(A), m_Value(C))))
8662 return false;
8663
8664 // They must both have samesign flag or not.
8665 if (Pred1.hasSameSign() != Pred2.hasSameSign())
8666 return false;
8667
8668 if (B == C)
8669 return Pred1 == ICmpInst::getInversePredicate(Pred2);
8670
8671 // Try to infer the relationship from constant ranges.
8672 const APInt *RHSC1, *RHSC2;
8673 if (!match(B, m_APInt(RHSC1)) || !match(C, m_APInt(RHSC2)))
8674 return false;
8675
8676 // Sign bits of two RHSCs should match.
8677 if (Pred1.hasSameSign() && RHSC1->isNonNegative() != RHSC2->isNonNegative())
8678 return false;
8679
8680 const auto CR1 = ConstantRange::makeExactICmpRegion(Pred1, *RHSC1);
8681 const auto CR2 = ConstantRange::makeExactICmpRegion(Pred2, *RHSC2);
8682
8683 return CR1.inverse() == CR2;
8684}
8685
8687 SelectPatternNaNBehavior NaNBehavior,
8688 bool Ordered) {
8689 switch (Pred) {
8690 default:
8691 return {SPF_UNKNOWN, SPNB_NA, false}; // Equality.
8692 case ICmpInst::ICMP_UGT:
8693 case ICmpInst::ICMP_UGE:
8694 return {SPF_UMAX, SPNB_NA, false};
8695 case ICmpInst::ICMP_SGT:
8696 case ICmpInst::ICMP_SGE:
8697 return {SPF_SMAX, SPNB_NA, false};
8698 case ICmpInst::ICMP_ULT:
8699 case ICmpInst::ICMP_ULE:
8700 return {SPF_UMIN, SPNB_NA, false};
8701 case ICmpInst::ICMP_SLT:
8702 case ICmpInst::ICMP_SLE:
8703 return {SPF_SMIN, SPNB_NA, false};
8704 case FCmpInst::FCMP_UGT:
8705 case FCmpInst::FCMP_UGE:
8706 case FCmpInst::FCMP_OGT:
8707 case FCmpInst::FCMP_OGE:
8708 return {SPF_FMAXNUM, NaNBehavior, Ordered};
8709 case FCmpInst::FCMP_ULT:
8710 case FCmpInst::FCMP_ULE:
8711 case FCmpInst::FCMP_OLT:
8712 case FCmpInst::FCMP_OLE:
8713 return {SPF_FMINNUM, NaNBehavior, Ordered};
8714 }
8715}
8716
8717std::optional<std::pair<CmpPredicate, Constant *>>
8720 "Only for relational integer predicates.");
8721 if (isa<UndefValue>(C))
8722 return std::nullopt;
8723
8724 Type *Type = C->getType();
8725 bool IsSigned = ICmpInst::isSigned(Pred);
8726
8728 bool WillIncrement =
8729 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
8730
8731 // Check if the constant operand can be safely incremented/decremented
8732 // without overflowing/underflowing.
8733 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
8734 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
8735 };
8736
8737 Constant *SafeReplacementConstant = nullptr;
8738 if (auto *CI = dyn_cast<ConstantInt>(C)) {
8739 // Bail out if the constant can't be safely incremented/decremented.
8740 if (!ConstantIsOk(CI))
8741 return std::nullopt;
8742 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
8743 unsigned NumElts = FVTy->getNumElements();
8744 for (unsigned i = 0; i != NumElts; ++i) {
8745 Constant *Elt = C->getAggregateElement(i);
8746 if (!Elt)
8747 return std::nullopt;
8748
8749 if (isa<UndefValue>(Elt))
8750 continue;
8751
8752 // Bail out if we can't determine if this constant is min/max or if we
8753 // know that this constant is min/max.
8754 auto *CI = dyn_cast<ConstantInt>(Elt);
8755 if (!CI || !ConstantIsOk(CI))
8756 return std::nullopt;
8757
8758 if (!SafeReplacementConstant)
8759 SafeReplacementConstant = CI;
8760 }
8761 } else if (isa<VectorType>(C->getType())) {
8762 // Handle scalable splat
8763 Value *SplatC = C->getSplatValue();
8764 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
8765 // Bail out if the constant can't be safely incremented/decremented.
8766 if (!CI || !ConstantIsOk(CI))
8767 return std::nullopt;
8768 } else {
8769 // ConstantExpr?
8770 return std::nullopt;
8771 }
8772
8773 // It may not be safe to change a compare predicate in the presence of
8774 // undefined elements, so replace those elements with the first safe constant
8775 // that we found.
8776 // TODO: in case of poison, it is safe; let's replace undefs only.
8777 if (C->containsUndefOrPoisonElement()) {
8778 assert(SafeReplacementConstant && "Replacement constant not set");
8779 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
8780 }
8781
8783
8784 // Increment or decrement the constant.
8785 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
8786 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
8787
8788 return std::make_pair(NewPred, NewC);
8789}
8790
8792 FastMathFlags FMF,
8793 Value *CmpLHS, Value *CmpRHS,
8794 Value *TrueVal, Value *FalseVal,
8795 Value *&LHS, Value *&RHS,
8796 unsigned Depth) {
8797 bool HasMismatchedZeros = false;
8798 if (CmpInst::isFPPredicate(Pred)) {
8799 // IEEE-754 ignores the sign of 0.0 in comparisons. So if the select has one
8800 // 0.0 operand, set the compare's 0.0 operands to that same value for the
8801 // purpose of identifying min/max. Disregard vector constants with undefined
8802 // elements because those can not be back-propagated for analysis.
8803 Value *OutputZeroVal = nullptr;
8804 if (match(TrueVal, m_AnyZeroFP()) && !match(FalseVal, m_AnyZeroFP()) &&
8805 !cast<Constant>(TrueVal)->containsUndefOrPoisonElement())
8806 OutputZeroVal = TrueVal;
8807 else if (match(FalseVal, m_AnyZeroFP()) && !match(TrueVal, m_AnyZeroFP()) &&
8808 !cast<Constant>(FalseVal)->containsUndefOrPoisonElement())
8809 OutputZeroVal = FalseVal;
8810
8811 if (OutputZeroVal) {
8812 if (match(CmpLHS, m_AnyZeroFP()) && CmpLHS != OutputZeroVal) {
8813 HasMismatchedZeros = true;
8814 CmpLHS = OutputZeroVal;
8815 }
8816 if (match(CmpRHS, m_AnyZeroFP()) && CmpRHS != OutputZeroVal) {
8817 HasMismatchedZeros = true;
8818 CmpRHS = OutputZeroVal;
8819 }
8820 }
8821 }
8822
8823 LHS = CmpLHS;
8824 RHS = CmpRHS;
8825
8826 // Signed zero may return inconsistent results between implementations.
8827 // (0.0 <= -0.0) ? 0.0 : -0.0 // Returns 0.0
8828 // minNum(0.0, -0.0) // May return -0.0 or 0.0 (IEEE 754-2008 5.3.1)
8829 // Therefore, we behave conservatively and only proceed if at least one of the
8830 // operands is known to not be zero or if we don't care about signed zero.
8831 switch (Pred) {
8832 default: break;
8835 if (!HasMismatchedZeros)
8836 break;
8837 [[fallthrough]];
8840 if (!FMF.noSignedZeros() && !isKnownNonZero(CmpLHS) &&
8841 !isKnownNonZero(CmpRHS))
8842 return {SPF_UNKNOWN, SPNB_NA, false};
8843 }
8844
8845 SelectPatternNaNBehavior NaNBehavior = SPNB_NA;
8846 bool Ordered = false;
8847
8848 // When given one NaN and one non-NaN input:
8849 // - maxnum/minnum (C99 fmaxf()/fminf()) return the non-NaN input.
8850 // - A simple C99 (a < b ? a : b) construction will return 'b' (as the
8851 // ordered comparison fails), which could be NaN or non-NaN.
8852 // so here we discover exactly what NaN behavior is required/accepted.
8853 if (CmpInst::isFPPredicate(Pred)) {
8854 bool LHSSafe = isKnownNonNaN(CmpLHS, FMF);
8855 bool RHSSafe = isKnownNonNaN(CmpRHS, FMF);
8856
8857 if (LHSSafe && RHSSafe) {
8858 // Both operands are known non-NaN.
8859 NaNBehavior = SPNB_RETURNS_ANY;
8860 Ordered = CmpInst::isOrdered(Pred);
8861 } else if (CmpInst::isOrdered(Pred)) {
8862 // An ordered comparison will return false when given a NaN, so it
8863 // returns the RHS.
8864 Ordered = true;
8865 if (LHSSafe)
8866 // LHS is non-NaN, so if RHS is NaN then NaN will be returned.
8867 NaNBehavior = SPNB_RETURNS_NAN;
8868 else if (RHSSafe)
8869 NaNBehavior = SPNB_RETURNS_OTHER;
8870 else
8871 // Completely unsafe.
8872 return {SPF_UNKNOWN, SPNB_NA, false};
8873 } else {
8874 Ordered = false;
8875 // An unordered comparison will return true when given a NaN, so it
8876 // returns the LHS.
8877 if (LHSSafe)
8878 // LHS is non-NaN, so if RHS is NaN then non-NaN will be returned.
8879 NaNBehavior = SPNB_RETURNS_OTHER;
8880 else if (RHSSafe)
8881 NaNBehavior = SPNB_RETURNS_NAN;
8882 else
8883 // Completely unsafe.
8884 return {SPF_UNKNOWN, SPNB_NA, false};
8885 }
8886 }
8887
8888 if (TrueVal == CmpRHS && FalseVal == CmpLHS) {
8889 std::swap(CmpLHS, CmpRHS);
8890 Pred = CmpInst::getSwappedPredicate(Pred);
8891 if (NaNBehavior == SPNB_RETURNS_NAN)
8892 NaNBehavior = SPNB_RETURNS_OTHER;
8893 else if (NaNBehavior == SPNB_RETURNS_OTHER)
8894 NaNBehavior = SPNB_RETURNS_NAN;
8895 Ordered = !Ordered;
8896 }
8897
8898 // ([if]cmp X, Y) ? X : Y
8899 if (TrueVal == CmpLHS && FalseVal == CmpRHS)
8900 return getSelectPattern(Pred, NaNBehavior, Ordered);
8901
8902 if (isKnownNegation(TrueVal, FalseVal)) {
8903 // Sign-extending LHS does not change its sign, so TrueVal/FalseVal can
8904 // match against either LHS or sext(LHS).
8905 auto MaybeSExtCmpLHS =
8906 m_CombineOr(m_Specific(CmpLHS), m_SExt(m_Specific(CmpLHS)));
8907 auto ZeroOrAllOnes = m_CombineOr(m_ZeroInt(), m_AllOnes());
8908 auto ZeroOrOne = m_CombineOr(m_ZeroInt(), m_One());
8909 if (match(TrueVal, MaybeSExtCmpLHS)) {
8910 // Set the return values. If the compare uses the negated value (-X >s 0),
8911 // swap the return values because the negated value is always 'RHS'.
8912 LHS = TrueVal;
8913 RHS = FalseVal;
8914 if (match(CmpLHS, m_Neg(m_Specific(FalseVal))))
8915 std::swap(LHS, RHS);
8916
8917 // (X >s 0) ? X : -X or (X >s -1) ? X : -X --> ABS(X)
8918 // (-X >s 0) ? -X : X or (-X >s -1) ? -X : X --> ABS(X)
8919 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes))
8920 return {SPF_ABS, SPNB_NA, false};
8921
8922 // (X >=s 0) ? X : -X or (X >=s 1) ? X : -X --> ABS(X)
8923 if (Pred == ICmpInst::ICMP_SGE && match(CmpRHS, ZeroOrOne))
8924 return {SPF_ABS, SPNB_NA, false};
8925
8926 // (X <s 0) ? X : -X or (X <s 1) ? X : -X --> NABS(X)
8927 // (-X <s 0) ? -X : X or (-X <s 1) ? -X : X --> NABS(X)
8928 if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne))
8929 return {SPF_NABS, SPNB_NA, false};
8930 }
8931 else if (match(FalseVal, MaybeSExtCmpLHS)) {
8932 // Set the return values. If the compare uses the negated value (-X >s 0),
8933 // swap the return values because the negated value is always 'RHS'.
8934 LHS = FalseVal;
8935 RHS = TrueVal;
8936 if (match(CmpLHS, m_Neg(m_Specific(TrueVal))))
8937 std::swap(LHS, RHS);
8938
8939 // (X >s 0) ? -X : X or (X >s -1) ? -X : X --> NABS(X)
8940 // (-X >s 0) ? X : -X or (-X >s -1) ? X : -X --> NABS(X)
8941 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, ZeroOrAllOnes))
8942 return {SPF_NABS, SPNB_NA, false};
8943
8944 // (X <s 0) ? -X : X or (X <s 1) ? -X : X --> ABS(X)
8945 // (-X <s 0) ? X : -X or (-X <s 1) ? X : -X --> ABS(X)
8946 if (Pred == ICmpInst::ICMP_SLT && match(CmpRHS, ZeroOrOne))
8947 return {SPF_ABS, SPNB_NA, false};
8948 }
8949 }
8950
8951 if (CmpInst::isIntPredicate(Pred))
8952 return matchMinMax(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS, Depth);
8953
8954 // According to (IEEE 754-2008 5.3.1), minNum(0.0, -0.0) and similar
8955 // may return either -0.0 or 0.0, so fcmp/select pair has stricter
8956 // semantics than minNum. Be conservative in such case.
8957 if (NaNBehavior != SPNB_RETURNS_ANY ||
8958 (!FMF.noSignedZeros() && !isKnownNonZero(CmpLHS) &&
8959 !isKnownNonZero(CmpRHS)))
8960 return {SPF_UNKNOWN, SPNB_NA, false};
8961
8962 return matchFastFloatClamp(Pred, CmpLHS, CmpRHS, TrueVal, FalseVal, LHS, RHS);
8963}
8964
8966 Instruction::CastOps *CastOp) {
8967 const DataLayout &DL = CmpI->getDataLayout();
8968
8969 Constant *CastedTo = nullptr;
8970 switch (*CastOp) {
8971 case Instruction::ZExt:
8972 if (CmpI->isUnsigned())
8973 CastedTo = ConstantExpr::getTrunc(C, SrcTy);
8974 break;
8975 case Instruction::SExt:
8976 if (CmpI->isSigned())
8977 CastedTo = ConstantExpr::getTrunc(C, SrcTy, true);
8978 break;
8979 case Instruction::Trunc:
8980 Constant *CmpConst;
8981 if (match(CmpI->getOperand(1), m_Constant(CmpConst)) &&
8982 CmpConst->getType() == SrcTy) {
8983 // Here we have the following case:
8984 //
8985 // %cond = cmp iN %x, CmpConst
8986 // %tr = trunc iN %x to iK
8987 // %narrowsel = select i1 %cond, iK %t, iK C
8988 //
8989 // We can always move trunc after select operation:
8990 //
8991 // %cond = cmp iN %x, CmpConst
8992 // %widesel = select i1 %cond, iN %x, iN CmpConst
8993 // %tr = trunc iN %widesel to iK
8994 //
8995 // Note that C could be extended in any way because we don't care about
8996 // upper bits after truncation. It can't be abs pattern, because it would
8997 // look like:
8998 //
8999 // select i1 %cond, x, -x.
9000 //
9001 // So only min/max pattern could be matched. Such match requires widened C
9002 // == CmpConst. That is why set widened C = CmpConst, condition trunc
9003 // CmpConst == C is checked below.
9004 CastedTo = CmpConst;
9005 } else {
9006 unsigned ExtOp = CmpI->isSigned() ? Instruction::SExt : Instruction::ZExt;
9007 CastedTo = ConstantFoldCastOperand(ExtOp, C, SrcTy, DL);
9008 }
9009 break;
9010 case Instruction::FPTrunc:
9011 CastedTo = ConstantFoldCastOperand(Instruction::FPExt, C, SrcTy, DL);
9012 break;
9013 case Instruction::FPExt:
9014 CastedTo = ConstantFoldCastOperand(Instruction::FPTrunc, C, SrcTy, DL);
9015 break;
9016 case Instruction::FPToUI:
9017 CastedTo = ConstantFoldCastOperand(Instruction::UIToFP, C, SrcTy, DL);
9018 break;
9019 case Instruction::FPToSI:
9020 CastedTo = ConstantFoldCastOperand(Instruction::SIToFP, C, SrcTy, DL);
9021 break;
9022 case Instruction::UIToFP:
9023 CastedTo = ConstantFoldCastOperand(Instruction::FPToUI, C, SrcTy, DL);
9024 break;
9025 case Instruction::SIToFP:
9026 CastedTo = ConstantFoldCastOperand(Instruction::FPToSI, C, SrcTy, DL);
9027 break;
9028 default:
9029 break;
9030 }
9031
9032 if (!CastedTo)
9033 return nullptr;
9034
9035 // Make sure the cast doesn't lose any information.
9036 Constant *CastedBack =
9037 ConstantFoldCastOperand(*CastOp, CastedTo, C->getType(), DL);
9038 if (CastedBack && CastedBack != C)
9039 return nullptr;
9040
9041 return CastedTo;
9042}
9043
9044/// Helps to match a select pattern in case of a type mismatch.
9045///
9046/// The function processes the case when type of true and false values of a
9047/// select instruction differs from type of the cmp instruction operands because
9048/// of a cast instruction. The function checks if it is legal to move the cast
9049/// operation after "select". If yes, it returns the new second value of
9050/// "select" (with the assumption that cast is moved):
9051/// 1. As operand of cast instruction when both values of "select" are same cast
9052/// instructions.
9053/// 2. As restored constant (by applying reverse cast operation) when the first
9054/// value of the "select" is a cast operation and the second value is a
9055/// constant. It is implemented in lookThroughCastConst().
9056/// 3. As one operand is cast instruction and the other is not. The operands in
9057/// sel(cmp) are in different type integer.
9058/// NOTE: We return only the new second value because the first value could be
9059/// accessed as operand of cast instruction.
9060static Value *lookThroughCast(CmpInst *CmpI, Value *V1, Value *V2,
9061 Instruction::CastOps *CastOp) {
9062 auto *Cast1 = dyn_cast<CastInst>(V1);
9063 if (!Cast1)
9064 return nullptr;
9065
9066 *CastOp = Cast1->getOpcode();
9067 Type *SrcTy = Cast1->getSrcTy();
9068 if (auto *Cast2 = dyn_cast<CastInst>(V2)) {
9069 // If V1 and V2 are both the same cast from the same type, look through V1.
9070 if (*CastOp == Cast2->getOpcode() && SrcTy == Cast2->getSrcTy())
9071 return Cast2->getOperand(0);
9072 return nullptr;
9073 }
9074
9075 auto *C = dyn_cast<Constant>(V2);
9076 if (C)
9077 return lookThroughCastConst(CmpI, SrcTy, C, CastOp);
9078
9079 Value *CastedTo = nullptr;
9080 if (*CastOp == Instruction::Trunc) {
9081 if (match(CmpI->getOperand(1), m_ZExtOrSExt(m_Specific(V2)))) {
9082 // Here we have the following case:
9083 // %y_ext = sext iK %y to iN
9084 // %cond = cmp iN %x, %y_ext
9085 // %tr = trunc iN %x to iK
9086 // %narrowsel = select i1 %cond, iK %tr, iK %y
9087 //
9088 // We can always move trunc after select operation:
9089 // %y_ext = sext iK %y to iN
9090 // %cond = cmp iN %x, %y_ext
9091 // %widesel = select i1 %cond, iN %x, iN %y_ext
9092 // %tr = trunc iN %widesel to iK
9093 assert(V2->getType() == Cast1->getType() &&
9094 "V2 and Cast1 should be the same type.");
9095 CastedTo = CmpI->getOperand(1);
9096 }
9097 }
9098
9099 return CastedTo;
9100}
9102 Instruction::CastOps *CastOp,
9103 unsigned Depth) {
9105 return {SPF_UNKNOWN, SPNB_NA, false};
9106
9108 if (!SI) return {SPF_UNKNOWN, SPNB_NA, false};
9109
9110 CmpInst *CmpI = dyn_cast<CmpInst>(SI->getCondition());
9111 if (!CmpI) return {SPF_UNKNOWN, SPNB_NA, false};
9112
9113 Value *TrueVal = SI->getTrueValue();
9114 Value *FalseVal = SI->getFalseValue();
9115
9117 CmpI, TrueVal, FalseVal, LHS, RHS,
9118 isa<FPMathOperator>(SI) ? SI->getFastMathFlags() : FastMathFlags(),
9119 CastOp, Depth);
9120}
9121
9123 CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS,
9124 FastMathFlags FMF, Instruction::CastOps *CastOp, unsigned Depth) {
9125 CmpInst::Predicate Pred = CmpI->getPredicate();
9126 Value *CmpLHS = CmpI->getOperand(0);
9127 Value *CmpRHS = CmpI->getOperand(1);
9128 if (isa<FPMathOperator>(CmpI) && CmpI->hasNoNaNs())
9129 FMF.setNoNaNs();
9130
9131 // Bail out early.
9132 if (CmpI->isEquality())
9133 return {SPF_UNKNOWN, SPNB_NA, false};
9134
9135 // Deal with type mismatches.
9136 if (CastOp && CmpLHS->getType() != TrueVal->getType()) {
9137 if (Value *C = lookThroughCast(CmpI, TrueVal, FalseVal, CastOp)) {
9138 // If this is a potential fmin/fmax with a cast to integer, then ignore
9139 // -0.0 because there is no corresponding integer value.
9140 if (*CastOp == Instruction::FPToSI || *CastOp == Instruction::FPToUI)
9141 FMF.setNoSignedZeros();
9142 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS,
9143 cast<CastInst>(TrueVal)->getOperand(0), C,
9144 LHS, RHS, Depth);
9145 }
9146 if (Value *C = lookThroughCast(CmpI, FalseVal, TrueVal, CastOp)) {
9147 // If this is a potential fmin/fmax with a cast to integer, then ignore
9148 // -0.0 because there is no corresponding integer value.
9149 if (*CastOp == Instruction::FPToSI || *CastOp == Instruction::FPToUI)
9150 FMF.setNoSignedZeros();
9151 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS,
9152 C, cast<CastInst>(FalseVal)->getOperand(0),
9153 LHS, RHS, Depth);
9154 }
9155 }
9156 return ::matchSelectPattern(Pred, FMF, CmpLHS, CmpRHS, TrueVal, FalseVal,
9157 LHS, RHS, Depth);
9158}
9159
9161 if (SPF == SPF_SMIN) return ICmpInst::ICMP_SLT;
9162 if (SPF == SPF_UMIN) return ICmpInst::ICMP_ULT;
9163 if (SPF == SPF_SMAX) return ICmpInst::ICMP_SGT;
9164 if (SPF == SPF_UMAX) return ICmpInst::ICMP_UGT;
9165 if (SPF == SPF_FMINNUM)
9166 return Ordered ? FCmpInst::FCMP_OLT : FCmpInst::FCMP_ULT;
9167 if (SPF == SPF_FMAXNUM)
9168 return Ordered ? FCmpInst::FCMP_OGT : FCmpInst::FCMP_UGT;
9169 llvm_unreachable("unhandled!");
9170}
9171
9173 switch (SPF) {
9175 return Intrinsic::umin;
9177 return Intrinsic::umax;
9179 return Intrinsic::smin;
9181 return Intrinsic::smax;
9182 default:
9183 llvm_unreachable("Unexpected SPF");
9184 }
9185}
9186
9188 if (SPF == SPF_SMIN) return SPF_SMAX;
9189 if (SPF == SPF_UMIN) return SPF_UMAX;
9190 if (SPF == SPF_SMAX) return SPF_SMIN;
9191 if (SPF == SPF_UMAX) return SPF_UMIN;
9192 llvm_unreachable("unhandled!");
9193}
9194
9196 switch (MinMaxID) {
9197 case Intrinsic::smax: return Intrinsic::smin;
9198 case Intrinsic::smin: return Intrinsic::smax;
9199 case Intrinsic::umax: return Intrinsic::umin;
9200 case Intrinsic::umin: return Intrinsic::umax;
9201 // Please note that next four intrinsics may produce the same result for
9202 // original and inverted case even if X != Y due to NaN is handled specially.
9203 case Intrinsic::maximum: return Intrinsic::minimum;
9204 case Intrinsic::minimum: return Intrinsic::maximum;
9205 case Intrinsic::maxnum: return Intrinsic::minnum;
9206 case Intrinsic::minnum: return Intrinsic::maxnum;
9207 case Intrinsic::maximumnum:
9208 return Intrinsic::minimumnum;
9209 case Intrinsic::minimumnum:
9210 return Intrinsic::maximumnum;
9211 default: llvm_unreachable("Unexpected intrinsic");
9212 }
9213}
9214
9216 switch (SPF) {
9219 case SPF_UMAX: return APInt::getMaxValue(BitWidth);
9220 case SPF_UMIN: return APInt::getMinValue(BitWidth);
9221 default: llvm_unreachable("Unexpected flavor");
9222 }
9223}
9224
9225std::pair<Intrinsic::ID, bool>
9227 // Check if VL contains select instructions that can be folded into a min/max
9228 // vector intrinsic and return the intrinsic if it is possible.
9229 // TODO: Support floating point min/max.
9230 bool AllCmpSingleUse = true;
9231 SelectPatternResult SelectPattern;
9232 SelectPattern.Flavor = SPF_UNKNOWN;
9233 if (all_of(VL, [&SelectPattern, &AllCmpSingleUse](Value *I) {
9234 Value *LHS, *RHS;
9235 auto CurrentPattern = matchSelectPattern(I, LHS, RHS);
9236 if (!SelectPatternResult::isMinOrMax(CurrentPattern.Flavor))
9237 return false;
9238 if (SelectPattern.Flavor != SPF_UNKNOWN &&
9239 SelectPattern.Flavor != CurrentPattern.Flavor)
9240 return false;
9241 SelectPattern = CurrentPattern;
9242 AllCmpSingleUse &=
9244 return true;
9245 })) {
9246 switch (SelectPattern.Flavor) {
9247 case SPF_SMIN:
9248 return {Intrinsic::smin, AllCmpSingleUse};
9249 case SPF_UMIN:
9250 return {Intrinsic::umin, AllCmpSingleUse};
9251 case SPF_SMAX:
9252 return {Intrinsic::smax, AllCmpSingleUse};
9253 case SPF_UMAX:
9254 return {Intrinsic::umax, AllCmpSingleUse};
9255 case SPF_FMAXNUM:
9256 return {Intrinsic::maxnum, AllCmpSingleUse};
9257 case SPF_FMINNUM:
9258 return {Intrinsic::minnum, AllCmpSingleUse};
9259 default:
9260 llvm_unreachable("unexpected select pattern flavor");
9261 }
9262 }
9263 return {Intrinsic::not_intrinsic, false};
9264}
9265
9266template <typename InstTy>
9267static bool matchTwoInputRecurrence(const PHINode *PN, InstTy *&Inst,
9268 Value *&Init, Value *&OtherOp) {
9269 // Handle the case of a simple two-predecessor recurrence PHI.
9270 // There's a lot more that could theoretically be done here, but
9271 // this is sufficient to catch some interesting cases.
9272 // TODO: Expand list -- gep, uadd.sat etc.
9273 if (PN->getNumIncomingValues() != 2)
9274 return false;
9275
9276 for (unsigned I = 0; I != 2; ++I) {
9277 if (auto *Operation = dyn_cast<InstTy>(PN->getIncomingValue(I));
9278 Operation && Operation->getNumOperands() >= 2) {
9279 Value *LHS = Operation->getOperand(0);
9280 Value *RHS = Operation->getOperand(1);
9281 if (LHS != PN && RHS != PN)
9282 continue;
9283
9284 Inst = Operation;
9285 Init = PN->getIncomingValue(!I);
9286 OtherOp = (LHS == PN) ? RHS : LHS;
9287 return true;
9288 }
9289 }
9290 return false;
9291}
9292
9293template <typename InstTy>
9294static bool matchThreeInputRecurrence(const PHINode *PN, InstTy *&Inst,
9295 Value *&Init, Value *&OtherOp0,
9296 Value *&OtherOp1) {
9297 if (PN->getNumIncomingValues() != 2)
9298 return false;
9299
9300 for (unsigned I = 0; I != 2; ++I) {
9301 if (auto *Operation = dyn_cast<InstTy>(PN->getIncomingValue(I));
9302 Operation && Operation->getNumOperands() >= 3) {
9303 Value *Op0 = Operation->getOperand(0);
9304 Value *Op1 = Operation->getOperand(1);
9305 Value *Op2 = Operation->getOperand(2);
9306
9307 if (Op0 != PN && Op1 != PN && Op2 != PN)
9308 continue;
9309
9310 Inst = Operation;
9311 Init = PN->getIncomingValue(!I);
9312 if (Op0 == PN) {
9313 OtherOp0 = Op1;
9314 OtherOp1 = Op2;
9315 } else if (Op1 == PN) {
9316 OtherOp0 = Op0;
9317 OtherOp1 = Op2;
9318 } else {
9319 OtherOp0 = Op0;
9320 OtherOp1 = Op1;
9321 }
9322 return true;
9323 }
9324 }
9325 return false;
9326}
9328 Value *&Start, Value *&Step) {
9329 // We try to match a recurrence of the form:
9330 // %iv = [Start, %entry], [%iv.next, %backedge]
9331 // %iv.next = binop %iv, Step
9332 // Or:
9333 // %iv = [Start, %entry], [%iv.next, %backedge]
9334 // %iv.next = binop Step, %iv
9335 return matchTwoInputRecurrence(P, BO, Start, Step);
9336}
9337
9339 Value *&Start, Value *&Step) {
9340 BinaryOperator *BO = nullptr;
9341 P = dyn_cast<PHINode>(I->getOperand(0));
9342 if (!P)
9343 P = dyn_cast<PHINode>(I->getOperand(1));
9344 return P && matchSimpleRecurrence(P, BO, Start, Step) && BO == I;
9345}
9346
9348 PHINode *&P, Value *&Init,
9349 Value *&OtherOp) {
9350 // Binary intrinsics only supported for now.
9351 if (I->arg_size() != 2 || I->getType() != I->getArgOperand(0)->getType() ||
9352 I->getType() != I->getArgOperand(1)->getType())
9353 return false;
9354
9355 IntrinsicInst *II = nullptr;
9356 P = dyn_cast<PHINode>(I->getArgOperand(0));
9357 if (!P)
9358 P = dyn_cast<PHINode>(I->getArgOperand(1));
9359
9360 return P && matchTwoInputRecurrence(P, II, Init, OtherOp) && II == I;
9361}
9362
9364 PHINode *&P, Value *&Init,
9365 Value *&OtherOp0,
9366 Value *&OtherOp1) {
9367 if (I->arg_size() != 3 || I->getType() != I->getArgOperand(0)->getType() ||
9368 I->getType() != I->getArgOperand(1)->getType() ||
9369 I->getType() != I->getArgOperand(2)->getType())
9370 return false;
9371 IntrinsicInst *II = nullptr;
9372 P = dyn_cast<PHINode>(I->getArgOperand(0));
9373 if (!P) {
9374 P = dyn_cast<PHINode>(I->getArgOperand(1));
9375 if (!P)
9376 P = dyn_cast<PHINode>(I->getArgOperand(2));
9377 }
9378 return P && matchThreeInputRecurrence(P, II, Init, OtherOp0, OtherOp1) &&
9379 II == I;
9380}
9381
9382/// Return true if "icmp Pred LHS RHS" is always true.
9384 const Value *RHS) {
9385 if (ICmpInst::isTrueWhenEqual(Pred) && LHS == RHS)
9386 return true;
9387
9388 switch (Pred) {
9389 default:
9390 return false;
9391
9392 case CmpInst::ICMP_SLE: {
9393 const APInt *C;
9394
9395 // LHS s<= LHS +_{nsw} C if C >= 0
9396 // LHS s<= LHS | C if C >= 0
9397 if (match(RHS, m_NSWAdd(m_Specific(LHS), m_APInt(C))) ||
9399 return !C->isNegative();
9400
9401 // LHS s<= smax(LHS, V) for any V
9403 return true;
9404
9405 // smin(RHS, V) s<= RHS for any V
9407 return true;
9408
9409 // Match A to (X +_{nsw} CA) and B to (X +_{nsw} CB)
9410 const Value *X;
9411 const APInt *CLHS, *CRHS;
9412 if (match(LHS, m_NSWAddLike(m_Value(X), m_APInt(CLHS))) &&
9414 return CLHS->sle(*CRHS);
9415
9416 return false;
9417 }
9418
9419 case CmpInst::ICMP_ULE: {
9420 // LHS u<= LHS +_{nuw} V for any V
9421 if (match(RHS, m_c_Add(m_Specific(LHS), m_Value())) &&
9423 return true;
9424
9425 // LHS u<= LHS | V for any V
9426 if (match(RHS, m_c_Or(m_Specific(LHS), m_Value())))
9427 return true;
9428
9429 // LHS u<= umax(LHS, V) for any V
9431 return true;
9432
9433 // RHS >> V u<= RHS for any V
9434 if (match(LHS, m_LShr(m_Specific(RHS), m_Value())))
9435 return true;
9436
9437 // RHS u/ C_ugt_1 u<= RHS
9438 const APInt *C;
9439 if (match(LHS, m_UDiv(m_Specific(RHS), m_APInt(C))) && C->ugt(1))
9440 return true;
9441
9442 // RHS & V u<= RHS for any V
9444 return true;
9445
9446 // umin(RHS, V) u<= RHS for any V
9448 return true;
9449
9450 // Match A to (X +_{nuw} CA) and B to (X +_{nuw} CB)
9451 const Value *X;
9452 const APInt *CLHS, *CRHS;
9453 if (match(LHS, m_NUWAddLike(m_Value(X), m_APInt(CLHS))) &&
9455 return CLHS->ule(*CRHS);
9456
9457 return false;
9458 }
9459 }
9460}
9461
9462/// Return true if "icmp Pred BLHS BRHS" is true whenever "icmp Pred
9463/// ALHS ARHS" is true. Otherwise, return std::nullopt.
9464static std::optional<bool>
9466 const Value *ARHS, const Value *BLHS, const Value *BRHS) {
9467 switch (Pred) {
9468 default:
9469 return std::nullopt;
9470
9471 case CmpInst::ICMP_SLT:
9472 case CmpInst::ICMP_SLE:
9473 if (isTruePredicate(CmpInst::ICMP_SLE, BLHS, ALHS) &&
9475 return true;
9476 return std::nullopt;
9477
9478 case CmpInst::ICMP_SGT:
9479 case CmpInst::ICMP_SGE:
9480 if (isTruePredicate(CmpInst::ICMP_SLE, ALHS, BLHS) &&
9482 return true;
9483 return std::nullopt;
9484
9485 case CmpInst::ICMP_ULT:
9486 case CmpInst::ICMP_ULE:
9487 if (isTruePredicate(CmpInst::ICMP_ULE, BLHS, ALHS) &&
9489 return true;
9490 return std::nullopt;
9491
9492 case CmpInst::ICMP_UGT:
9493 case CmpInst::ICMP_UGE:
9494 if (isTruePredicate(CmpInst::ICMP_ULE, ALHS, BLHS) &&
9496 return true;
9497 return std::nullopt;
9498 }
9499}
9500
9501/// Return true if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is true.
9502/// Return false if "icmp LPred X, LCR" implies "icmp RPred X, RCR" is false.
9503/// Otherwise, return std::nullopt if we can't infer anything.
9504static std::optional<bool>
9506 CmpPredicate RPred, const ConstantRange &RCR) {
9507 auto CRImpliesPred = [&](ConstantRange CR,
9508 CmpInst::Predicate Pred) -> std::optional<bool> {
9509 // If all true values for lhs and true for rhs, lhs implies rhs
9510 if (CR.icmp(Pred, RCR))
9511 return true;
9512
9513 // If there is no overlap, lhs implies not rhs
9514 if (CR.icmp(CmpInst::getInversePredicate(Pred), RCR))
9515 return false;
9516
9517 return std::nullopt;
9518 };
9519 if (auto Res = CRImpliesPred(ConstantRange::makeAllowedICmpRegion(LPred, LCR),
9520 RPred))
9521 return Res;
9522 if (LPred.hasSameSign() ^ RPred.hasSameSign()) {
9524 : LPred.dropSameSign();
9526 : RPred.dropSameSign();
9527 return CRImpliesPred(ConstantRange::makeAllowedICmpRegion(LPred, LCR),
9528 RPred);
9529 }
9530 return std::nullopt;
9531}
9532
9533/// Return true if LHS implies RHS (expanded to its components as "R0 RPred R1")
9534/// is true. Return false if LHS implies RHS is false. Otherwise, return
9535/// std::nullopt if we can't infer anything.
9536static std::optional<bool>
9537isImpliedCondICmps(CmpPredicate LPred, const Value *L0, const Value *L1,
9538 CmpPredicate RPred, const Value *R0, const Value *R1,
9539 const DataLayout &DL, bool LHSIsTrue) {
9540 // The rest of the logic assumes the LHS condition is true. If that's not the
9541 // case, invert the predicate to make it so.
9542 if (!LHSIsTrue)
9543 LPred = ICmpInst::getInverseCmpPredicate(LPred);
9544
9545 // We can have non-canonical operands, so try to normalize any common operand
9546 // to L0/R0.
9547 if (L0 == R1) {
9548 std::swap(R0, R1);
9549 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9550 }
9551 if (R0 == L1) {
9552 std::swap(L0, L1);
9553 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9554 }
9555 if (L1 == R1) {
9556 // If we have L0 == R0 and L1 == R1, then make L1/R1 the constants.
9557 if (L0 != R0 || match(L0, m_ImmConstant())) {
9558 std::swap(L0, L1);
9559 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9560 std::swap(R0, R1);
9561 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9562 }
9563 }
9564
9565 // See if we can infer anything if operand-0 matches and we have at least one
9566 // constant.
9567 const APInt *Unused;
9568 if (L0 == R0 && (match(L1, m_APInt(Unused)) || match(R1, m_APInt(Unused)))) {
9569 // Potential TODO: We could also further use the constant range of L0/R0 to
9570 // further constraint the constant ranges. At the moment this leads to
9571 // several regressions related to not transforming `multi_use(A + C0) eq/ne
9572 // C1` (see discussion: D58633).
9574 L1, ICmpInst::isSigned(LPred), /* UseInstrInfo=*/true, /*AC=*/nullptr,
9575 /*CxtI=*/nullptr, /*DT=*/nullptr, MaxAnalysisRecursionDepth - 1);
9577 R1, ICmpInst::isSigned(RPred), /* UseInstrInfo=*/true, /*AC=*/nullptr,
9578 /*CxtI=*/nullptr, /*DT=*/nullptr, MaxAnalysisRecursionDepth - 1);
9579 // Even if L1/R1 are not both constant, we can still sometimes deduce
9580 // relationship from a single constant. For example X u> Y implies X != 0.
9581 if (auto R = isImpliedCondCommonOperandWithCR(LPred, LCR, RPred, RCR))
9582 return R;
9583 // If both L1/R1 were exact constant ranges and we didn't get anything
9584 // here, we won't be able to deduce this.
9585 if (match(L1, m_APInt(Unused)) && match(R1, m_APInt(Unused)))
9586 return std::nullopt;
9587 }
9588
9589 // Can we infer anything when the two compares have matching operands?
9590 if (L0 == R0 && L1 == R1)
9591 return ICmpInst::isImpliedByMatchingCmp(LPred, RPred);
9592
9593 // It only really makes sense in the context of signed comparison for "X - Y
9594 // must be positive if X >= Y and no overflow".
9595 // Take SGT as an example: L0:x > L1:y and C >= 0
9596 // ==> R0:(x -nsw y) < R1:(-C) is false
9597 CmpInst::Predicate SignedLPred = LPred.getPreferredSignedPredicate();
9598 if ((SignedLPred == ICmpInst::ICMP_SGT ||
9599 SignedLPred == ICmpInst::ICMP_SGE) &&
9600 match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
9601 if (match(R1, m_NonPositive()) &&
9602 ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == false)
9603 return false;
9604 }
9605
9606 // Take SLT as an example: L0:x < L1:y and C <= 0
9607 // ==> R0:(x -nsw y) < R1:(-C) is true
9608 if ((SignedLPred == ICmpInst::ICMP_SLT ||
9609 SignedLPred == ICmpInst::ICMP_SLE) &&
9610 match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
9611 if (match(R1, m_NonNegative()) &&
9612 ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == true)
9613 return true;
9614 }
9615
9616 // a - b == NonZero -> a != b
9617 // ptrtoint(a) - ptrtoint(b) == NonZero -> a != b
9618 const APInt *L1C;
9619 Value *A, *B;
9620 if (LPred == ICmpInst::ICMP_EQ && ICmpInst::isEquality(RPred) &&
9621 match(L1, m_APInt(L1C)) && !L1C->isZero() &&
9622 match(L0, m_Sub(m_Value(A), m_Value(B))) &&
9623 ((A == R0 && B == R1) || (A == R1 && B == R0) ||
9628 return RPred.dropSameSign() == ICmpInst::ICMP_NE;
9629 }
9630
9631 // L0 = R0 = L1 + R1, L0 >=u L1 implies R0 >=u R1, L0 <u L1 implies R0 <u R1
9632 if (L0 == R0 &&
9633 (LPred == ICmpInst::ICMP_ULT || LPred == ICmpInst::ICMP_UGE) &&
9634 (RPred == ICmpInst::ICMP_ULT || RPred == ICmpInst::ICMP_UGE) &&
9635 match(L0, m_c_Add(m_Specific(L1), m_Specific(R1))))
9636 return CmpPredicate::getMatching(LPred, RPred).has_value();
9637
9638 if (auto P = CmpPredicate::getMatching(LPred, RPred))
9639 return isImpliedCondOperands(*P, L0, L1, R0, R1);
9640
9641 return std::nullopt;
9642}
9643
9644/// Return true if LHS implies RHS (expanded to its components as "R0 RPred R1")
9645/// is true. Return false if LHS implies RHS is false. Otherwise, return
9646/// std::nullopt if we can't infer anything.
9647static std::optional<bool>
9649 FCmpInst::Predicate RPred, const Value *R0, const Value *R1,
9650 const DataLayout &DL, bool LHSIsTrue) {
9651 // The rest of the logic assumes the LHS condition is true. If that's not the
9652 // case, invert the predicate to make it so.
9653 if (!LHSIsTrue)
9654 LPred = FCmpInst::getInversePredicate(LPred);
9655
9656 // We can have non-canonical operands, so try to normalize any common operand
9657 // to L0/R0.
9658 if (L0 == R1) {
9659 std::swap(R0, R1);
9660 RPred = FCmpInst::getSwappedPredicate(RPred);
9661 }
9662 if (R0 == L1) {
9663 std::swap(L0, L1);
9664 LPred = FCmpInst::getSwappedPredicate(LPred);
9665 }
9666 if (L1 == R1) {
9667 // If we have L0 == R0 and L1 == R1, then make L1/R1 the constants.
9668 if (L0 != R0 || match(L0, m_ImmConstant())) {
9669 std::swap(L0, L1);
9670 LPred = ICmpInst::getSwappedCmpPredicate(LPred);
9671 std::swap(R0, R1);
9672 RPred = ICmpInst::getSwappedCmpPredicate(RPred);
9673 }
9674 }
9675
9676 // Can we infer anything when the two compares have matching operands?
9677 if (L0 == R0 && L1 == R1) {
9678 if ((LPred & RPred) == LPred)
9679 return true;
9680 if ((LPred & ~RPred) == LPred)
9681 return false;
9682 }
9683
9684 // See if we can infer anything if operand-0 matches and we have at least one
9685 // constant.
9686 const APFloat *L1C, *R1C;
9687 if (L0 == R0 && match(L1, m_APFloat(L1C)) && match(R1, m_APFloat(R1C))) {
9688 if (std::optional<ConstantFPRange> DomCR =
9690 if (std::optional<ConstantFPRange> ImpliedCR =
9692 if (ImpliedCR->contains(*DomCR))
9693 return true;
9694 }
9695 if (std::optional<ConstantFPRange> ImpliedCR =
9697 FCmpInst::getInversePredicate(RPred), *R1C)) {
9698 if (ImpliedCR->contains(*DomCR))
9699 return false;
9700 }
9701 }
9702 }
9703
9704 return std::nullopt;
9705}
9706
9707/// Return true if LHS implies RHS is true. Return false if LHS implies RHS is
9708/// false. Otherwise, return std::nullopt if we can't infer anything. We
9709/// expect the RHS to be an icmp and the LHS to be an 'and', 'or', or a 'select'
9710/// instruction.
9711static std::optional<bool>
9713 const Value *RHSOp0, const Value *RHSOp1,
9714 const DataLayout &DL, bool LHSIsTrue, unsigned Depth) {
9715 // The LHS must be an 'or', 'and', or a 'select' instruction.
9716 assert((LHS->getOpcode() == Instruction::And ||
9717 LHS->getOpcode() == Instruction::Or ||
9718 LHS->getOpcode() == Instruction::Select) &&
9719 "Expected LHS to be 'and', 'or', or 'select'.");
9720
9721 assert(Depth <= MaxAnalysisRecursionDepth && "Hit recursion limit");
9722
9723 // If the result of an 'or' is false, then we know both legs of the 'or' are
9724 // false. Similarly, if the result of an 'and' is true, then we know both
9725 // legs of the 'and' are true.
9726 const Value *ALHS, *ARHS;
9727 if ((!LHSIsTrue && match(LHS, m_LogicalOr(m_Value(ALHS), m_Value(ARHS)))) ||
9728 (LHSIsTrue && match(LHS, m_LogicalAnd(m_Value(ALHS), m_Value(ARHS))))) {
9729 // FIXME: Make this non-recursion.
9730 if (std::optional<bool> Implication = isImpliedCondition(
9731 ALHS, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue, Depth + 1))
9732 return Implication;
9733 if (std::optional<bool> Implication = isImpliedCondition(
9734 ARHS, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue, Depth + 1))
9735 return Implication;
9736 return std::nullopt;
9737 }
9738 return std::nullopt;
9739}
9740
9741std::optional<bool>
9743 const Value *RHSOp0, const Value *RHSOp1,
9744 const DataLayout &DL, bool LHSIsTrue, unsigned Depth) {
9745 // Bail out when we hit the limit.
9747 return std::nullopt;
9748
9749 // A mismatch occurs when we compare a scalar cmp to a vector cmp, for
9750 // example.
9751 if (RHSOp0->getType()->isVectorTy() != LHS->getType()->isVectorTy())
9752 return std::nullopt;
9753
9754 assert(LHS->getType()->isIntOrIntVectorTy(1) &&
9755 "Expected integer type only!");
9756
9757 // Match not
9758 if (match(LHS, m_Not(m_Value(LHS))))
9759 LHSIsTrue = !LHSIsTrue;
9760
9761 // Both LHS and RHS are icmps.
9762 if (RHSOp0->getType()->getScalarType()->isIntOrPtrTy()) {
9763 if (const auto *LHSCmp = dyn_cast<ICmpInst>(LHS))
9764 return isImpliedCondICmps(LHSCmp->getCmpPredicate(),
9765 LHSCmp->getOperand(0), LHSCmp->getOperand(1),
9766 RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue);
9767 const Value *V;
9768 if (match(LHS, m_NUWTrunc(m_Value(V))))
9770 ConstantInt::get(V->getType(), 0), RHSPred,
9771 RHSOp0, RHSOp1, DL, LHSIsTrue);
9772 } else {
9773 assert(RHSOp0->getType()->isFPOrFPVectorTy() &&
9774 "Expected floating point type only!");
9775 if (const auto *LHSCmp = dyn_cast<FCmpInst>(LHS))
9776 return isImpliedCondFCmps(LHSCmp->getPredicate(), LHSCmp->getOperand(0),
9777 LHSCmp->getOperand(1), RHSPred, RHSOp0, RHSOp1,
9778 DL, LHSIsTrue);
9779 }
9780
9781 /// The LHS should be an 'or', 'and', or a 'select' instruction. We expect
9782 /// the RHS to be an icmp.
9783 /// FIXME: Add support for and/or/select on the RHS.
9784 if (const Instruction *LHSI = dyn_cast<Instruction>(LHS)) {
9785 if ((LHSI->getOpcode() == Instruction::And ||
9786 LHSI->getOpcode() == Instruction::Or ||
9787 LHSI->getOpcode() == Instruction::Select))
9788 return isImpliedCondAndOr(LHSI, RHSPred, RHSOp0, RHSOp1, DL, LHSIsTrue,
9789 Depth);
9790 }
9791 return std::nullopt;
9792}
9793
9794std::optional<bool> llvm::isImpliedCondition(const Value *LHS, const Value *RHS,
9795 const DataLayout &DL,
9796 bool LHSIsTrue, unsigned Depth) {
9797 // LHS ==> RHS by definition
9798 if (LHS == RHS)
9799 return LHSIsTrue;
9800
9801 // Match not
9802 bool InvertRHS = false;
9803 if (match(RHS, m_Not(m_Value(RHS)))) {
9804 if (LHS == RHS)
9805 return !LHSIsTrue;
9806 InvertRHS = true;
9807 }
9808
9809 if (const ICmpInst *RHSCmp = dyn_cast<ICmpInst>(RHS)) {
9810 if (auto Implied = isImpliedCondition(
9811 LHS, RHSCmp->getCmpPredicate(), RHSCmp->getOperand(0),
9812 RHSCmp->getOperand(1), DL, LHSIsTrue, Depth))
9813 return InvertRHS ? !*Implied : *Implied;
9814 return std::nullopt;
9815 }
9816 if (const FCmpInst *RHSCmp = dyn_cast<FCmpInst>(RHS)) {
9817 if (auto Implied = isImpliedCondition(
9818 LHS, RHSCmp->getPredicate(), RHSCmp->getOperand(0),
9819 RHSCmp->getOperand(1), DL, LHSIsTrue, Depth))
9820 return InvertRHS ? !*Implied : *Implied;
9821 return std::nullopt;
9822 }
9823
9824 const Value *V;
9825 if (match(RHS, m_NUWTrunc(m_Value(V)))) {
9826 if (auto Implied = isImpliedCondition(LHS, CmpInst::ICMP_NE, V,
9827 ConstantInt::get(V->getType(), 0), DL,
9828 LHSIsTrue, Depth))
9829 return InvertRHS ? !*Implied : *Implied;
9830 return std::nullopt;
9831 }
9832
9834 return std::nullopt;
9835
9836 // LHS ==> (RHS1 || RHS2) if LHS ==> RHS1 or LHS ==> RHS2
9837 // LHS ==> !(RHS1 && RHS2) if LHS ==> !RHS1 or LHS ==> !RHS2
9838 const Value *RHS1, *RHS2;
9839 if (match(RHS, m_LogicalOr(m_Value(RHS1), m_Value(RHS2)))) {
9840 if (std::optional<bool> Imp =
9841 isImpliedCondition(LHS, RHS1, DL, LHSIsTrue, Depth + 1))
9842 if (*Imp == true)
9843 return !InvertRHS;
9844 if (std::optional<bool> Imp =
9845 isImpliedCondition(LHS, RHS2, DL, LHSIsTrue, Depth + 1))
9846 if (*Imp == true)
9847 return !InvertRHS;
9848 }
9849 if (match(RHS, m_LogicalAnd(m_Value(RHS1), m_Value(RHS2)))) {
9850 if (std::optional<bool> Imp =
9851 isImpliedCondition(LHS, RHS1, DL, LHSIsTrue, Depth + 1))
9852 if (*Imp == false)
9853 return InvertRHS;
9854 if (std::optional<bool> Imp =
9855 isImpliedCondition(LHS, RHS2, DL, LHSIsTrue, Depth + 1))
9856 if (*Imp == false)
9857 return InvertRHS;
9858 }
9859
9860 return std::nullopt;
9861}
9862
9863// Returns a pair (Condition, ConditionIsTrue), where Condition is a branch
9864// condition dominating ContextI or nullptr, if no condition is found.
9865static std::pair<Value *, bool>
9867 if (!ContextI || !ContextI->getParent())
9868 return {nullptr, false};
9869
9870 // TODO: This is a poor/cheap way to determine dominance. Should we use a
9871 // dominator tree (eg, from a SimplifyQuery) instead?
9872 const BasicBlock *ContextBB = ContextI->getParent();
9873 const BasicBlock *PredBB = ContextBB->getSinglePredecessor();
9874 if (!PredBB)
9875 return {nullptr, false};
9876
9877 // We need a conditional branch in the predecessor.
9878 Value *PredCond;
9879 BasicBlock *TrueBB, *FalseBB;
9880 if (!match(PredBB->getTerminator(), m_Br(m_Value(PredCond), TrueBB, FalseBB)))
9881 return {nullptr, false};
9882
9883 // The branch should get simplified. Don't bother simplifying this condition.
9884 if (TrueBB == FalseBB)
9885 return {nullptr, false};
9886
9887 assert((TrueBB == ContextBB || FalseBB == ContextBB) &&
9888 "Predecessor block does not point to successor?");
9889
9890 // Is this condition implied by the predecessor condition?
9891 return {PredCond, TrueBB == ContextBB};
9892}
9893
9894std::optional<bool> llvm::isImpliedByDomCondition(const Value *Cond,
9895 const Instruction *ContextI,
9896 const DataLayout &DL) {
9897 assert(Cond->getType()->isIntOrIntVectorTy(1) && "Condition must be bool");
9898 auto PredCond = getDomPredecessorCondition(ContextI);
9899 if (PredCond.first)
9900 return isImpliedCondition(PredCond.first, Cond, DL, PredCond.second);
9901 return std::nullopt;
9902}
9903
9905 const Value *LHS,
9906 const Value *RHS,
9907 const Instruction *ContextI,
9908 const DataLayout &DL) {
9909 auto PredCond = getDomPredecessorCondition(ContextI);
9910 if (PredCond.first)
9911 return isImpliedCondition(PredCond.first, Pred, LHS, RHS, DL,
9912 PredCond.second);
9913 return std::nullopt;
9914}
9915
9917 APInt &Upper, const InstrInfoQuery &IIQ,
9918 bool PreferSignedRange) {
9919 unsigned Width = Lower.getBitWidth();
9920 const APInt *C;
9921 switch (BO.getOpcode()) {
9922 case Instruction::Sub:
9923 if (match(BO.getOperand(0), m_APInt(C))) {
9924 bool HasNSW = IIQ.hasNoSignedWrap(&BO);
9925 bool HasNUW = IIQ.hasNoUnsignedWrap(&BO);
9926
9927 // If the caller expects a signed compare, then try to use a signed range.
9928 // Otherwise if both no-wraps are set, use the unsigned range because it
9929 // is never larger than the signed range. Example:
9930 // "sub nuw nsw i8 -2, x" is unsigned [0, 254] vs. signed [-128, 126].
9931 // "sub nuw nsw i8 2, x" is unsigned [0, 2] vs. signed [-125, 127].
9932 if (PreferSignedRange && HasNSW && HasNUW)
9933 HasNUW = false;
9934
9935 if (HasNUW) {
9936 // 'sub nuw c, x' produces [0, C].
9937 Upper = *C + 1;
9938 } else if (HasNSW) {
9939 if (C->isNegative()) {
9940 // 'sub nsw -C, x' produces [SINT_MIN, -C - SINT_MIN].
9942 Upper = *C - APInt::getSignedMaxValue(Width);
9943 } else {
9944 // Note that sub 0, INT_MIN is not NSW. It techically is a signed wrap
9945 // 'sub nsw C, x' produces [C - SINT_MAX, SINT_MAX].
9946 Lower = *C - APInt::getSignedMaxValue(Width);
9948 }
9949 }
9950 }
9951 break;
9952 case Instruction::Add:
9953 if (match(BO.getOperand(1), m_APInt(C)) && !C->isZero()) {
9954 bool HasNSW = IIQ.hasNoSignedWrap(&BO);
9955 bool HasNUW = IIQ.hasNoUnsignedWrap(&BO);
9956
9957 // If the caller expects a signed compare, then try to use a signed
9958 // range. Otherwise if both no-wraps are set, use the unsigned range
9959 // because it is never larger than the signed range. Example: "add nuw
9960 // nsw i8 X, -2" is unsigned [254,255] vs. signed [-128, 125].
9961 if (PreferSignedRange && HasNSW && HasNUW)
9962 HasNUW = false;
9963
9964 if (HasNUW) {
9965 // 'add nuw x, C' produces [C, UINT_MAX].
9966 Lower = *C;
9967 } else if (HasNSW) {
9968 if (C->isNegative()) {
9969 // 'add nsw x, -C' produces [SINT_MIN, SINT_MAX - C].
9971 Upper = APInt::getSignedMaxValue(Width) + *C + 1;
9972 } else {
9973 // 'add nsw x, +C' produces [SINT_MIN + C, SINT_MAX].
9974 Lower = APInt::getSignedMinValue(Width) + *C;
9975 Upper = APInt::getSignedMaxValue(Width) + 1;
9976 }
9977 }
9978 }
9979 break;
9980
9981 case Instruction::And:
9982 if (match(BO.getOperand(1), m_APInt(C)))
9983 // 'and x, C' produces [0, C].
9984 Upper = *C + 1;
9985 // X & -X is a power of two or zero. So we can cap the value at max power of
9986 // two.
9987 if (match(BO.getOperand(0), m_Neg(m_Specific(BO.getOperand(1)))) ||
9988 match(BO.getOperand(1), m_Neg(m_Specific(BO.getOperand(0)))))
9989 Upper = APInt::getSignedMinValue(Width) + 1;
9990 break;
9991
9992 case Instruction::Or:
9993 if (match(BO.getOperand(1), m_APInt(C)))
9994 // 'or x, C' produces [C, UINT_MAX].
9995 Lower = *C;
9996 break;
9997
9998 case Instruction::AShr:
9999 if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
10000 // 'ashr x, C' produces [INT_MIN >> C, INT_MAX >> C].
10002 Upper = APInt::getSignedMaxValue(Width).ashr(*C) + 1;
10003 } else if (match(BO.getOperand(0), m_APInt(C))) {
10004 unsigned ShiftAmount = Width - 1;
10005 if (!C->isZero() && IIQ.isExact(&BO))
10006 ShiftAmount = C->countr_zero();
10007 if (C->isNegative()) {
10008 // 'ashr C, x' produces [C, C >> (Width-1)]
10009 Lower = *C;
10010 Upper = C->ashr(ShiftAmount) + 1;
10011 } else {
10012 // 'ashr C, x' produces [C >> (Width-1), C]
10013 Lower = C->ashr(ShiftAmount);
10014 Upper = *C + 1;
10015 }
10016 }
10017 break;
10018
10019 case Instruction::LShr:
10020 if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
10021 // 'lshr x, C' produces [0, UINT_MAX >> C].
10022 Upper = APInt::getAllOnes(Width).lshr(*C) + 1;
10023 } else if (match(BO.getOperand(0), m_APInt(C))) {
10024 // 'lshr C, x' produces [C >> (Width-1), C].
10025 unsigned ShiftAmount = Width - 1;
10026 if (!C->isZero() && IIQ.isExact(&BO))
10027 ShiftAmount = C->countr_zero();
10028 Lower = C->lshr(ShiftAmount);
10029 Upper = *C + 1;
10030 }
10031 break;
10032
10033 case Instruction::Shl:
10034 if (match(BO.getOperand(0), m_APInt(C))) {
10035 if (IIQ.hasNoUnsignedWrap(&BO)) {
10036 // 'shl nuw C, x' produces [C, C << CLZ(C)]
10037 Lower = *C;
10038 Upper = Lower.shl(Lower.countl_zero()) + 1;
10039 } else if (BO.hasNoSignedWrap()) { // TODO: What if both nuw+nsw?
10040 if (C->isNegative()) {
10041 // 'shl nsw C, x' produces [C << CLO(C)-1, C]
10042 unsigned ShiftAmount = C->countl_one() - 1;
10043 Lower = C->shl(ShiftAmount);
10044 Upper = *C + 1;
10045 } else {
10046 // 'shl nsw C, x' produces [C, C << CLZ(C)-1]
10047 unsigned ShiftAmount = C->countl_zero() - 1;
10048 Lower = *C;
10049 Upper = C->shl(ShiftAmount) + 1;
10050 }
10051 } else {
10052 // If lowbit is set, value can never be zero.
10053 if ((*C)[0])
10054 Lower = APInt::getOneBitSet(Width, 0);
10055 // If we are shifting a constant the largest it can be is if the longest
10056 // sequence of consecutive ones is shifted to the highbits (breaking
10057 // ties for which sequence is higher). At the moment we take a liberal
10058 // upper bound on this by just popcounting the constant.
10059 // TODO: There may be a bitwise trick for it longest/highest
10060 // consecutative sequence of ones (naive method is O(Width) loop).
10061 Upper = APInt::getHighBitsSet(Width, C->popcount()) + 1;
10062 }
10063 } else if (match(BO.getOperand(1), m_APInt(C)) && C->ult(Width)) {
10064 Upper = APInt::getBitsSetFrom(Width, C->getZExtValue()) + 1;
10065 }
10066 break;
10067
10068 case Instruction::SDiv:
10069 if (match(BO.getOperand(1), m_APInt(C))) {
10070 APInt IntMin = APInt::getSignedMinValue(Width);
10071 APInt IntMax = APInt::getSignedMaxValue(Width);
10072 if (C->isAllOnes()) {
10073 // 'sdiv x, -1' produces [INT_MIN + 1, INT_MAX]
10074 // where C != -1 and C != 0 and C != 1
10075 Lower = IntMin + 1;
10076 Upper = IntMax + 1;
10077 } else if (C->countl_zero() < Width - 1) {
10078 // 'sdiv x, C' produces [INT_MIN / C, INT_MAX / C]
10079 // where C != -1 and C != 0 and C != 1
10080 Lower = IntMin.sdiv(*C);
10081 Upper = IntMax.sdiv(*C);
10082 if (Lower.sgt(Upper))
10084 Upper = Upper + 1;
10085 assert(Upper != Lower && "Upper part of range has wrapped!");
10086 }
10087 } else if (match(BO.getOperand(0), m_APInt(C))) {
10088 if (C->isMinSignedValue()) {
10089 // 'sdiv INT_MIN, x' produces [INT_MIN, INT_MIN / -2].
10090 Lower = *C;
10091 Upper = Lower.lshr(1) + 1;
10092 } else {
10093 // 'sdiv C, x' produces [-|C|, |C|].
10094 Upper = C->abs() + 1;
10095 Lower = (-Upper) + 1;
10096 }
10097 }
10098 break;
10099
10100 case Instruction::UDiv:
10101 if (match(BO.getOperand(1), m_APInt(C)) && !C->isZero()) {
10102 // 'udiv x, C' produces [0, UINT_MAX / C].
10103 Upper = APInt::getMaxValue(Width).udiv(*C) + 1;
10104 } else if (match(BO.getOperand(0), m_APInt(C))) {
10105 // 'udiv C, x' produces [0, C].
10106 Upper = *C + 1;
10107 }
10108 break;
10109
10110 case Instruction::SRem:
10111 if (match(BO.getOperand(1), m_APInt(C))) {
10112 // 'srem x, C' produces (-|C|, |C|).
10113 Upper = C->abs();
10114 Lower = (-Upper) + 1;
10115 } else if (match(BO.getOperand(0), m_APInt(C))) {
10116 if (C->isNegative()) {
10117 // 'srem -|C|, x' produces [-|C|, 0].
10118 Upper = 1;
10119 Lower = *C;
10120 } else {
10121 // 'srem |C|, x' produces [0, |C|].
10122 Upper = *C + 1;
10123 }
10124 }
10125 break;
10126
10127 case Instruction::URem:
10128 if (match(BO.getOperand(1), m_APInt(C)))
10129 // 'urem x, C' produces [0, C).
10130 Upper = *C;
10131 else if (match(BO.getOperand(0), m_APInt(C)))
10132 // 'urem C, x' produces [0, C].
10133 Upper = *C + 1;
10134 break;
10135
10136 default:
10137 break;
10138 }
10139}
10140
10142 bool UseInstrInfo) {
10143 unsigned Width = II.getType()->getScalarSizeInBits();
10144 const APInt *C;
10145 switch (II.getIntrinsicID()) {
10146 case Intrinsic::ctlz:
10147 case Intrinsic::cttz: {
10148 APInt Upper(Width, Width);
10149 if (!UseInstrInfo || !match(II.getArgOperand(1), m_One()))
10150 Upper += 1;
10151 // Maximum of set/clear bits is the bit width.
10153 }
10154 case Intrinsic::ctpop:
10155 // Maximum of set/clear bits is the bit width.
10157 APInt(Width, Width) + 1);
10158 case Intrinsic::uadd_sat:
10159 // uadd.sat(x, C) produces [C, UINT_MAX].
10160 if (match(II.getOperand(0), m_APInt(C)) ||
10161 match(II.getOperand(1), m_APInt(C)))
10163 break;
10164 case Intrinsic::sadd_sat:
10165 if (match(II.getOperand(0), m_APInt(C)) ||
10166 match(II.getOperand(1), m_APInt(C))) {
10167 if (C->isNegative())
10168 // sadd.sat(x, -C) produces [SINT_MIN, SINT_MAX + (-C)].
10170 APInt::getSignedMaxValue(Width) + *C +
10171 1);
10172
10173 // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
10175 APInt::getSignedMaxValue(Width) + 1);
10176 }
10177 break;
10178 case Intrinsic::usub_sat:
10179 // usub.sat(C, x) produces [0, C].
10180 if (match(II.getOperand(0), m_APInt(C)))
10181 return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
10182
10183 // usub.sat(x, C) produces [0, UINT_MAX - C].
10184 if (match(II.getOperand(1), m_APInt(C)))
10186 APInt::getMaxValue(Width) - *C + 1);
10187 break;
10188 case Intrinsic::ssub_sat:
10189 if (match(II.getOperand(0), m_APInt(C))) {
10190 if (C->isNegative())
10191 // ssub.sat(-C, x) produces [SINT_MIN, -SINT_MIN + (-C)].
10193 *C - APInt::getSignedMinValue(Width) +
10194 1);
10195
10196 // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
10198 APInt::getSignedMaxValue(Width) + 1);
10199 } else if (match(II.getOperand(1), m_APInt(C))) {
10200 if (C->isNegative())
10201 // ssub.sat(x, -C) produces [SINT_MIN - (-C), SINT_MAX]:
10203 APInt::getSignedMaxValue(Width) + 1);
10204
10205 // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
10207 APInt::getSignedMaxValue(Width) - *C +
10208 1);
10209 }
10210 break;
10211 case Intrinsic::umin:
10212 case Intrinsic::umax:
10213 case Intrinsic::smin:
10214 case Intrinsic::smax:
10215 if (!match(II.getOperand(0), m_APInt(C)) &&
10216 !match(II.getOperand(1), m_APInt(C)))
10217 break;
10218
10219 switch (II.getIntrinsicID()) {
10220 case Intrinsic::umin:
10221 return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
10222 case Intrinsic::umax:
10224 case Intrinsic::smin:
10226 *C + 1);
10227 case Intrinsic::smax:
10229 APInt::getSignedMaxValue(Width) + 1);
10230 default:
10231 llvm_unreachable("Must be min/max intrinsic");
10232 }
10233 break;
10234 case Intrinsic::abs:
10235 // If abs of SIGNED_MIN is poison, then the result is [0..SIGNED_MAX],
10236 // otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
10237 if (match(II.getOperand(1), m_One()))
10239 APInt::getSignedMaxValue(Width) + 1);
10240
10242 APInt::getSignedMinValue(Width) + 1);
10243 case Intrinsic::vscale:
10244 if (!II.getParent() || !II.getFunction())
10245 break;
10246 return getVScaleRange(II.getFunction(), Width);
10247 default:
10248 break;
10249 }
10250
10251 return ConstantRange::getFull(Width);
10252}
10253
10255 const InstrInfoQuery &IIQ) {
10256 unsigned BitWidth = SI.getType()->getScalarSizeInBits();
10257 const Value *LHS = nullptr, *RHS = nullptr;
10259 if (R.Flavor == SPF_UNKNOWN)
10260 return ConstantRange::getFull(BitWidth);
10261
10262 if (R.Flavor == SelectPatternFlavor::SPF_ABS) {
10263 // If the negation part of the abs (in RHS) has the NSW flag,
10264 // then the result of abs(X) is [0..SIGNED_MAX],
10265 // otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
10266 if (match(RHS, m_Neg(m_Specific(LHS))) &&
10270
10273 }
10274
10275 if (R.Flavor == SelectPatternFlavor::SPF_NABS) {
10276 // The result of -abs(X) is <= 0.
10278 APInt(BitWidth, 1));
10279 }
10280
10281 const APInt *C;
10282 if (!match(LHS, m_APInt(C)) && !match(RHS, m_APInt(C)))
10283 return ConstantRange::getFull(BitWidth);
10284
10285 switch (R.Flavor) {
10286 case SPF_UMIN:
10288 case SPF_UMAX:
10290 case SPF_SMIN:
10292 *C + 1);
10293 case SPF_SMAX:
10296 default:
10297 return ConstantRange::getFull(BitWidth);
10298 }
10299}
10300
10302 // The maximum representable value of a half is 65504. For floats the maximum
10303 // value is 3.4e38 which requires roughly 129 bits.
10304 unsigned BitWidth = I->getType()->getScalarSizeInBits();
10305 if (!I->getOperand(0)->getType()->getScalarType()->isHalfTy())
10306 return;
10307 if (isa<FPToSIInst>(I) && BitWidth >= 17) {
10308 Lower = APInt(BitWidth, -65504, true);
10309 Upper = APInt(BitWidth, 65505);
10310 }
10311
10312 if (isa<FPToUIInst>(I) && BitWidth >= 16) {
10313 // For a fptoui the lower limit is left as 0.
10314 Upper = APInt(BitWidth, 65505);
10315 }
10316}
10317
10319 bool UseInstrInfo, AssumptionCache *AC,
10320 const Instruction *CtxI,
10321 const DominatorTree *DT,
10322 unsigned Depth) {
10323 assert(V->getType()->isIntOrIntVectorTy() && "Expected integer instruction");
10324
10326 return ConstantRange::getFull(V->getType()->getScalarSizeInBits());
10327
10328 if (auto *C = dyn_cast<Constant>(V))
10329 return C->toConstantRange();
10330
10331 unsigned BitWidth = V->getType()->getScalarSizeInBits();
10332 InstrInfoQuery IIQ(UseInstrInfo);
10333 ConstantRange CR = ConstantRange::getFull(BitWidth);
10334 if (auto *BO = dyn_cast<BinaryOperator>(V)) {
10335 APInt Lower = APInt(BitWidth, 0);
10336 APInt Upper = APInt(BitWidth, 0);
10337 // TODO: Return ConstantRange.
10338 setLimitsForBinOp(*BO, Lower, Upper, IIQ, ForSigned);
10340 } else if (auto *II = dyn_cast<IntrinsicInst>(V))
10341 CR = getRangeForIntrinsic(*II, UseInstrInfo);
10342 else if (auto *SI = dyn_cast<SelectInst>(V)) {
10344 SI->getTrueValue(), ForSigned, UseInstrInfo, AC, CtxI, DT, Depth + 1);
10346 SI->getFalseValue(), ForSigned, UseInstrInfo, AC, CtxI, DT, Depth + 1);
10347 CR = CRTrue.unionWith(CRFalse);
10349 } else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V)) {
10350 APInt Lower = APInt(BitWidth, 0);
10351 APInt Upper = APInt(BitWidth, 0);
10352 // TODO: Return ConstantRange.
10355 } else if (const auto *A = dyn_cast<Argument>(V))
10356 if (std::optional<ConstantRange> Range = A->getRange())
10357 CR = *Range;
10358
10359 if (auto *I = dyn_cast<Instruction>(V)) {
10360 if (auto *Range = IIQ.getMetadata(I, LLVMContext::MD_range))
10362
10363 if (const auto *CB = dyn_cast<CallBase>(V))
10364 if (std::optional<ConstantRange> Range = CB->getRange())
10365 CR = CR.intersectWith(*Range);
10366 }
10367
10368 if (CtxI && AC) {
10369 // Try to restrict the range based on information from assumptions.
10370 for (auto &AssumeVH : AC->assumptionsFor(V)) {
10371 if (!AssumeVH)
10372 continue;
10373 CallInst *I = cast<CallInst>(AssumeVH);
10374 assert(I->getParent()->getParent() == CtxI->getParent()->getParent() &&
10375 "Got assumption for the wrong function!");
10376 assert(I->getIntrinsicID() == Intrinsic::assume &&
10377 "must be an assume intrinsic");
10378
10379 if (!isValidAssumeForContext(I, CtxI, DT))
10380 continue;
10381 Value *Arg = I->getArgOperand(0);
10382 ICmpInst *Cmp = dyn_cast<ICmpInst>(Arg);
10383 // Currently we just use information from comparisons.
10384 if (!Cmp || Cmp->getOperand(0) != V)
10385 continue;
10386 // TODO: Set "ForSigned" parameter via Cmp->isSigned()?
10387 ConstantRange RHS =
10388 computeConstantRange(Cmp->getOperand(1), /* ForSigned */ false,
10389 UseInstrInfo, AC, I, DT, Depth + 1);
10390 CR = CR.intersectWith(
10391 ConstantRange::makeAllowedICmpRegion(Cmp->getPredicate(), RHS));
10392 }
10393 }
10394
10395 return CR;
10396}
10397
10398static void
10400 function_ref<void(Value *)> InsertAffected) {
10401 assert(V != nullptr);
10402 if (isa<Argument>(V) || isa<GlobalValue>(V)) {
10403 InsertAffected(V);
10404 } else if (auto *I = dyn_cast<Instruction>(V)) {
10405 InsertAffected(V);
10406
10407 // Peek through unary operators to find the source of the condition.
10408 Value *Op;
10410 m_Trunc(m_Value(Op))))) {
10412 InsertAffected(Op);
10413 }
10414 }
10415}
10416
10418 Value *Cond, bool IsAssume, function_ref<void(Value *)> InsertAffected) {
10419 auto AddAffected = [&InsertAffected](Value *V) {
10420 addValueAffectedByCondition(V, InsertAffected);
10421 };
10422
10423 auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS) {
10424 if (IsAssume) {
10425 AddAffected(LHS);
10426 AddAffected(RHS);
10427 } else if (match(RHS, m_Constant()))
10428 AddAffected(LHS);
10429 };
10430
10431 SmallVector<Value *, 8> Worklist;
10433 Worklist.push_back(Cond);
10434 while (!Worklist.empty()) {
10435 Value *V = Worklist.pop_back_val();
10436 if (!Visited.insert(V).second)
10437 continue;
10438
10439 CmpPredicate Pred;
10440 Value *A, *B, *X;
10441
10442 if (IsAssume) {
10443 AddAffected(V);
10444 if (match(V, m_Not(m_Value(X))))
10445 AddAffected(X);
10446 }
10447
10448 if (match(V, m_LogicalOp(m_Value(A), m_Value(B)))) {
10449 // assume(A && B) is split to -> assume(A); assume(B);
10450 // assume(!(A || B)) is split to -> assume(!A); assume(!B);
10451 // Finally, assume(A || B) / assume(!(A && B)) generally don't provide
10452 // enough information to be worth handling (intersection of information as
10453 // opposed to union).
10454 if (!IsAssume) {
10455 Worklist.push_back(A);
10456 Worklist.push_back(B);
10457 }
10458 } else if (match(V, m_ICmp(Pred, m_Value(A), m_Value(B)))) {
10459 bool HasRHSC = match(B, m_ConstantInt());
10460 if (ICmpInst::isEquality(Pred)) {
10461 AddAffected(A);
10462 if (IsAssume)
10463 AddAffected(B);
10464 if (HasRHSC) {
10465 Value *Y;
10466 // (X << C) or (X >>_s C) or (X >>_u C).
10467 if (match(A, m_Shift(m_Value(X), m_ConstantInt())))
10468 AddAffected(X);
10469 // (X & C) or (X | C).
10470 else if (match(A, m_And(m_Value(X), m_Value(Y))) ||
10471 match(A, m_Or(m_Value(X), m_Value(Y)))) {
10472 AddAffected(X);
10473 AddAffected(Y);
10474 }
10475 // X - Y
10476 else if (match(A, m_Sub(m_Value(X), m_Value(Y)))) {
10477 AddAffected(X);
10478 AddAffected(Y);
10479 }
10480 }
10481 } else {
10482 AddCmpOperands(A, B);
10483 if (HasRHSC) {
10484 // Handle (A + C1) u< C2, which is the canonical form of
10485 // A > C3 && A < C4.
10487 AddAffected(X);
10488
10489 if (ICmpInst::isUnsigned(Pred)) {
10490 Value *Y;
10491 // X & Y u> C -> X >u C && Y >u C
10492 // X | Y u< C -> X u< C && Y u< C
10493 // X nuw+ Y u< C -> X u< C && Y u< C
10494 if (match(A, m_And(m_Value(X), m_Value(Y))) ||
10495 match(A, m_Or(m_Value(X), m_Value(Y))) ||
10496 match(A, m_NUWAdd(m_Value(X), m_Value(Y)))) {
10497 AddAffected(X);
10498 AddAffected(Y);
10499 }
10500 // X nuw- Y u> C -> X u> C
10501 if (match(A, m_NUWSub(m_Value(X), m_Value())))
10502 AddAffected(X);
10503 }
10504 }
10505
10506 // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
10507 // by computeKnownFPClass().
10509 if (Pred == ICmpInst::ICMP_SLT && match(B, m_Zero()))
10510 InsertAffected(X);
10511 else if (Pred == ICmpInst::ICMP_SGT && match(B, m_AllOnes()))
10512 InsertAffected(X);
10513 }
10514 }
10515
10516 if (HasRHSC && match(A, m_Intrinsic<Intrinsic::ctpop>(m_Value(X))))
10517 AddAffected(X);
10518 } else if (match(V, m_FCmp(Pred, m_Value(A), m_Value(B)))) {
10519 AddCmpOperands(A, B);
10520
10521 // fcmp fneg(x), y
10522 // fcmp fabs(x), y
10523 // fcmp fneg(fabs(x)), y
10524 if (match(A, m_FNeg(m_Value(A))))
10525 AddAffected(A);
10526 if (match(A, m_FAbs(m_Value(A))))
10527 AddAffected(A);
10528
10530 m_Value()))) {
10531 // Handle patterns that computeKnownFPClass() support.
10532 AddAffected(A);
10533 } else if (!IsAssume && match(V, m_Trunc(m_Value(X)))) {
10534 // Assume is checked here as X is already added above for assumes in
10535 // addValueAffectedByCondition
10536 AddAffected(X);
10537 } else if (!IsAssume && match(V, m_Not(m_Value(X)))) {
10538 // Assume is checked here to avoid issues with ephemeral values
10539 Worklist.push_back(X);
10540 }
10541 }
10542}
10543
10545 // (X >> C) or/add (X & mask(C) != 0)
10546 if (const auto *BO = dyn_cast<BinaryOperator>(V)) {
10547 if (BO->getOpcode() == Instruction::Add ||
10548 BO->getOpcode() == Instruction::Or) {
10549 const Value *X;
10550 const APInt *C1, *C2;
10551 if (match(BO, m_c_BinOp(m_LShr(m_Value(X), m_APInt(C1)),
10555 m_Zero())))) &&
10556 C2->popcount() == C1->getZExtValue())
10557 return X;
10558 }
10559 }
10560 return nullptr;
10561}
10562
10564 return const_cast<Value *>(stripNullTest(const_cast<const Value *>(V)));
10565}
10566
10569 unsigned MaxCount, bool AllowUndefOrPoison) {
10572 auto Push = [&](const Value *V) -> bool {
10573 Constant *C;
10574 if (match(const_cast<Value *>(V), m_ImmConstant(C))) {
10575 if (!AllowUndefOrPoison && !isGuaranteedNotToBeUndefOrPoison(C))
10576 return false;
10577 // Check existence first to avoid unnecessary allocations.
10578 if (Constants.contains(C))
10579 return true;
10580 if (Constants.size() == MaxCount)
10581 return false;
10582 Constants.insert(C);
10583 return true;
10584 }
10585
10586 if (auto *Inst = dyn_cast<Instruction>(V)) {
10587 if (Visited.insert(Inst).second)
10588 Worklist.push_back(Inst);
10589 return true;
10590 }
10591 return false;
10592 };
10593 if (!Push(V))
10594 return false;
10595 while (!Worklist.empty()) {
10596 const Instruction *CurInst = Worklist.pop_back_val();
10597 switch (CurInst->getOpcode()) {
10598 case Instruction::Select:
10599 if (!Push(CurInst->getOperand(1)))
10600 return false;
10601 if (!Push(CurInst->getOperand(2)))
10602 return false;
10603 break;
10604 case Instruction::PHI:
10605 for (Value *IncomingValue : cast<PHINode>(CurInst)->incoming_values()) {
10606 // Fast path for recurrence PHI.
10607 if (IncomingValue == CurInst)
10608 continue;
10609 if (!Push(IncomingValue))
10610 return false;
10611 }
10612 break;
10613 default:
10614 return false;
10615 }
10616 }
10617 return true;
10618}
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 isAbsoluteValueLessEqualOne(const Value *V)
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 matchThreeInputRecurrence(const PHINode *PN, InstTy *&Inst, Value *&Init, Value *&OtherOp0, Value *&OtherOp1)
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
bool isFinite() const
Definition APFloat.h:1521
bool isNaN() const
Definition APFloat.h:1514
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1193
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1153
bool isInteger() const
Definition APFloat.h:1533
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition APFloat.h:1134
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:1421
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:1555
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1406
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1685
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1400
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:1345
unsigned ceilLogBase2() const
Definition APInt.h:1779
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1208
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
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:1503
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition APInt.h:1256
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1655
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1411
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:768
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1173
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1643
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1613
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:1776
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
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:1157
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1137
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:1403
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
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:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
void clearSignBit()
Set the sign bit to 0.
Definition APInt.h:1464
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:105
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:261
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
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
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 * 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...
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 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 isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:74
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:23
bool noSignedZeros() const
Definition FMF.h:70
bool noInfs() const
Definition FMF.h:69
void setNoSignedZeros(bool B=true)
Definition FMF.h:87
void setNoNaNs(bool B=true)
Definition FMF.h:81
bool noNaNs() const
Definition FMF.h:68
const BasicBlock & getEntryBlock() const
Definition Function.h:809
bool hasNoSync() const
Determine if the call can synchroize with other threads.
Definition Function.h:645
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:133
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:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
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:591
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
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
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
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition Type.h:311
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition Type.h:142
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 isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:156
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:761
iterator_range< user_iterator > users()
Definition Value.h:427
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:2278
@ 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.
cstfp_pred_ty< custom_checkfn< APFloat > > m_CheckedFp(function_ref< bool(const APFloat &)> CheckFn)
Match a float or vector where CheckFn(ele) for each element is true.
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:668
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:1739
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:1669
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:2554
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:2208
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:1601
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:1746
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 bool matchSimpleTernaryIntrinsicRecurrence(const IntrinsicInst *I, PHINode *&P, Value *&Init, Value *&OtherOp0, Value *&OtherOp1)
Attempt to match a simple value-accumulating recurrence of the form: llvm.intrinsic....
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:1947
LLVM_ABI bool isKnownIntegral(const Value *V, const SimplifyQuery &SQ, FastMathFlags FMF)
Return true if the floating-point value V is known to be an integer value.
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.
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:317
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:192
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:271
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
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
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:267
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:258
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:290
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:167
KnownBits byteSwap() const
Definition KnownBits.h:538
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:305
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:86
KnownBits reverseBits() const
Definition KnownBits.h:542
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:178
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:337
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
bool isEven() const
Return if the value is known even (the low bit is 0).
Definition KnownBits.h:164
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:241
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:327
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:186
unsigned countMinTrailingOnes() const
Returns the minimum number of trailing one bits.
Definition KnownBits.h:261
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:363
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:202
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:264
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:61
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:342
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:369
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:296
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:235
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:173
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI std::optional< bool > 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:212
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 LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv x, x.
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.
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd x, x.
void copysign(const KnownFPClass &Sign)
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass fsub(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fsub.
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 fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
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 cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass ldexp(const KnownFPClass &Src, const KnownBits &N, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp.
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
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for mantissa component of frexp.
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.
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
void propagateNaN(const KnownFPClass &Src, bool PreserveSign=false)
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc)
Propagate known class for fptrunc.
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.
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.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
LLVM_ABI bool isKnownNeverLogicalNegZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a negative zero.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass frem_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem.
static LLVM_ABI KnownFPClass powi(const KnownFPClass &Src, const KnownBits &N)
Propagate known class for powi.
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