LLVM 22.0.0git
InstructionSimplify.cpp
Go to the documentation of this file.
1//===- InstructionSimplify.cpp - Fold instruction operands ----------------===//
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 implements routines for folding instructions into simpler forms
10// that do not require creating new instructions. This does constant folding
11// ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
12// returning a constant ("and i32 %x, 0" -> "0") or an already existing value
13// ("and i32 %x, %x" -> "%x"). All operands are assumed to have already been
14// simplified: This is usually true and assuming it simplifies the logic (if
15// they have not been simplified then results are correct but maybe suboptimal).
16//
17//===----------------------------------------------------------------------===//
18
20
21#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/SetVector.h"
23#include "llvm/ADT/Statistic.h"
31#include "llvm/Analysis/Loads.h"
40#include "llvm/IR/DataLayout.h"
41#include "llvm/IR/Dominators.h"
42#include "llvm/IR/InstrTypes.h"
44#include "llvm/IR/Operator.h"
46#include "llvm/IR/Statepoint.h"
49#include <algorithm>
50#include <optional>
51using namespace llvm;
52using namespace llvm::PatternMatch;
53
54#define DEBUG_TYPE "instsimplify"
55
56enum { RecursionLimit = 3 };
57
58STATISTIC(NumExpand, "Number of expansions");
59STATISTIC(NumReassoc, "Number of reassociations");
60
61static Value *simplifyAndInst(Value *, Value *, const SimplifyQuery &,
62 unsigned);
63static Value *simplifyUnOp(unsigned, Value *, const SimplifyQuery &, unsigned);
64static Value *simplifyFPUnOp(unsigned, Value *, const FastMathFlags &,
65 const SimplifyQuery &, unsigned);
66static Value *simplifyBinOp(unsigned, Value *, Value *, const SimplifyQuery &,
67 unsigned);
68static Value *simplifyBinOp(unsigned, Value *, Value *, const FastMathFlags &,
69 const SimplifyQuery &, unsigned);
71 const SimplifyQuery &, unsigned);
73 const SimplifyQuery &Q, unsigned MaxRecurse);
74static Value *simplifyOrInst(Value *, Value *, const SimplifyQuery &, unsigned);
75static Value *simplifyXorInst(Value *, Value *, const SimplifyQuery &,
76 unsigned);
77static Value *simplifyCastInst(unsigned, Value *, Type *, const SimplifyQuery &,
78 unsigned);
80 GEPNoWrapFlags, const SimplifyQuery &, unsigned);
82 const SimplifyQuery &, unsigned);
84 ArrayRef<Value *> NewOps,
85 const SimplifyQuery &SQ,
86 unsigned MaxRecurse);
87
88/// For a boolean type or a vector of boolean type, return false or a vector
89/// with every element false.
90static Constant *getFalse(Type *Ty) { return ConstantInt::getFalse(Ty); }
91
92/// For a boolean type or a vector of boolean type, return true or a vector
93/// with every element true.
94static Constant *getTrue(Type *Ty) { return ConstantInt::getTrue(Ty); }
95
96/// isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
97static bool isSameCompare(Value *V, CmpPredicate Pred, Value *LHS, Value *RHS) {
98 CmpInst *Cmp = dyn_cast<CmpInst>(V);
99 if (!Cmp)
100 return false;
101 CmpInst::Predicate CPred = Cmp->getPredicate();
102 Value *CLHS = Cmp->getOperand(0), *CRHS = Cmp->getOperand(1);
103 if (CPred == Pred && CLHS == LHS && CRHS == RHS)
104 return true;
105 return CPred == CmpInst::getSwappedPredicate(Pred) && CLHS == RHS &&
106 CRHS == LHS;
107}
108
109/// Simplify comparison with true or false branch of select:
110/// %sel = select i1 %cond, i32 %tv, i32 %fv
111/// %cmp = icmp sle i32 %sel, %rhs
112/// Compose new comparison by substituting %sel with either %tv or %fv
113/// and see if it simplifies.
115 Value *Cond, const SimplifyQuery &Q,
116 unsigned MaxRecurse, Constant *TrueOrFalse) {
117 Value *SimplifiedCmp = simplifyCmpInst(Pred, LHS, RHS, Q, MaxRecurse);
118 if (SimplifiedCmp == Cond) {
119 // %cmp simplified to the select condition (%cond).
120 return TrueOrFalse;
121 } else if (!SimplifiedCmp && isSameCompare(Cond, Pred, LHS, RHS)) {
122 // It didn't simplify. However, if composed comparison is equivalent
123 // to the select condition (%cond) then we can replace it.
124 return TrueOrFalse;
125 }
126 return SimplifiedCmp;
127}
128
129/// Simplify comparison with true branch of select
131 Value *Cond, const SimplifyQuery &Q,
132 unsigned MaxRecurse) {
133 return simplifyCmpSelCase(Pred, LHS, RHS, Cond, Q, MaxRecurse,
134 getTrue(Cond->getType()));
135}
136
137/// Simplify comparison with false branch of select
139 Value *Cond, const SimplifyQuery &Q,
140 unsigned MaxRecurse) {
141 return simplifyCmpSelCase(Pred, LHS, RHS, Cond, Q, MaxRecurse,
142 getFalse(Cond->getType()));
143}
144
145/// We know comparison with both branches of select can be simplified, but they
146/// are not equal. This routine handles some logical simplifications.
148 Value *Cond,
149 const SimplifyQuery &Q,
150 unsigned MaxRecurse) {
151 // If the false value simplified to false, then the result of the compare
152 // is equal to "Cond && TCmp". This also catches the case when the false
153 // value simplified to false and the true value to true, returning "Cond".
154 // Folding select to and/or isn't poison-safe in general; impliesPoison
155 // checks whether folding it does not convert a well-defined value into
156 // poison.
157 if (match(FCmp, m_Zero()) && impliesPoison(TCmp, Cond))
158 if (Value *V = simplifyAndInst(Cond, TCmp, Q, MaxRecurse))
159 return V;
160 // If the true value simplified to true, then the result of the compare
161 // is equal to "Cond || FCmp".
162 if (match(TCmp, m_One()) && impliesPoison(FCmp, Cond))
163 if (Value *V = simplifyOrInst(Cond, FCmp, Q, MaxRecurse))
164 return V;
165 // Finally, if the false value simplified to true and the true value to
166 // false, then the result of the compare is equal to "!Cond".
167 if (match(FCmp, m_One()) && match(TCmp, m_Zero()))
168 if (Value *V = simplifyXorInst(
169 Cond, Constant::getAllOnesValue(Cond->getType()), Q, MaxRecurse))
170 return V;
171 return nullptr;
172}
173
174/// Does the given value dominate the specified phi node?
175static bool valueDominatesPHI(Value *V, PHINode *P, const DominatorTree *DT) {
177 if (!I)
178 // Arguments and constants dominate all instructions.
179 return true;
180
181 // If we have a DominatorTree then do a precise test.
182 if (DT)
183 return DT->dominates(I, P);
184
185 // Otherwise, if the instruction is in the entry block and is not an invoke,
186 // then it obviously dominates all phi nodes.
187 if (I->getParent()->isEntryBlock() && !isa<InvokeInst>(I) &&
189 return true;
190
191 return false;
192}
193
194/// Try to simplify a binary operator of form "V op OtherOp" where V is
195/// "(B0 opex B1)" by distributing 'op' across 'opex' as
196/// "(B0 op OtherOp) opex (B1 op OtherOp)".
198 Value *OtherOp, Instruction::BinaryOps OpcodeToExpand,
199 const SimplifyQuery &Q, unsigned MaxRecurse) {
200 auto *B = dyn_cast<BinaryOperator>(V);
201 if (!B || B->getOpcode() != OpcodeToExpand)
202 return nullptr;
203 Value *B0 = B->getOperand(0), *B1 = B->getOperand(1);
204 Value *L =
205 simplifyBinOp(Opcode, B0, OtherOp, Q.getWithoutUndef(), MaxRecurse);
206 if (!L)
207 return nullptr;
208 Value *R =
209 simplifyBinOp(Opcode, B1, OtherOp, Q.getWithoutUndef(), MaxRecurse);
210 if (!R)
211 return nullptr;
212
213 // Does the expanded pair of binops simplify to the existing binop?
214 if ((L == B0 && R == B1) ||
215 (Instruction::isCommutative(OpcodeToExpand) && L == B1 && R == B0)) {
216 ++NumExpand;
217 return B;
218 }
219
220 // Otherwise, return "L op' R" if it simplifies.
221 Value *S = simplifyBinOp(OpcodeToExpand, L, R, Q, MaxRecurse);
222 if (!S)
223 return nullptr;
224
225 ++NumExpand;
226 return S;
227}
228
229/// Try to simplify binops of form "A op (B op' C)" or the commuted variant by
230/// distributing op over op'.
232 Value *R,
233 Instruction::BinaryOps OpcodeToExpand,
234 const SimplifyQuery &Q,
235 unsigned MaxRecurse) {
236 // Recursion is always used, so bail out at once if we already hit the limit.
237 if (!MaxRecurse--)
238 return nullptr;
239
240 if (Value *V = expandBinOp(Opcode, L, R, OpcodeToExpand, Q, MaxRecurse))
241 return V;
242 if (Value *V = expandBinOp(Opcode, R, L, OpcodeToExpand, Q, MaxRecurse))
243 return V;
244 return nullptr;
245}
246
247/// Generic simplifications for associative binary operations.
248/// Returns the simpler value, or null if none was found.
250 Value *LHS, Value *RHS,
251 const SimplifyQuery &Q,
252 unsigned MaxRecurse) {
253 assert(Instruction::isAssociative(Opcode) && "Not an associative operation!");
254
255 // Recursion is always used, so bail out at once if we already hit the limit.
256 if (!MaxRecurse--)
257 return nullptr;
258
261
262 // Transform: "(A op B) op C" ==> "A op (B op C)" if it simplifies completely.
263 if (Op0 && Op0->getOpcode() == Opcode) {
264 Value *A = Op0->getOperand(0);
265 Value *B = Op0->getOperand(1);
266 Value *C = RHS;
267
268 // Does "B op C" simplify?
269 if (Value *V = simplifyBinOp(Opcode, B, C, Q, MaxRecurse)) {
270 // It does! Return "A op V" if it simplifies or is already available.
271 // If V equals B then "A op V" is just the LHS.
272 if (V == B)
273 return LHS;
274 // Otherwise return "A op V" if it simplifies.
275 if (Value *W = simplifyBinOp(Opcode, A, V, Q, MaxRecurse)) {
276 ++NumReassoc;
277 return W;
278 }
279 }
280 }
281
282 // Transform: "A op (B op C)" ==> "(A op B) op C" if it simplifies completely.
283 if (Op1 && Op1->getOpcode() == Opcode) {
284 Value *A = LHS;
285 Value *B = Op1->getOperand(0);
286 Value *C = Op1->getOperand(1);
287
288 // Does "A op B" simplify?
289 if (Value *V = simplifyBinOp(Opcode, A, B, Q, MaxRecurse)) {
290 // It does! Return "V op C" if it simplifies or is already available.
291 // If V equals B then "V op C" is just the RHS.
292 if (V == B)
293 return RHS;
294 // Otherwise return "V op C" if it simplifies.
295 if (Value *W = simplifyBinOp(Opcode, V, C, Q, MaxRecurse)) {
296 ++NumReassoc;
297 return W;
298 }
299 }
300 }
301
302 // The remaining transforms require commutativity as well as associativity.
303 if (!Instruction::isCommutative(Opcode))
304 return nullptr;
305
306 // Transform: "(A op B) op C" ==> "(C op A) op B" if it simplifies completely.
307 if (Op0 && Op0->getOpcode() == Opcode) {
308 Value *A = Op0->getOperand(0);
309 Value *B = Op0->getOperand(1);
310 Value *C = RHS;
311
312 // Does "C op A" simplify?
313 if (Value *V = simplifyBinOp(Opcode, C, A, Q, MaxRecurse)) {
314 // It does! Return "V op B" if it simplifies or is already available.
315 // If V equals A then "V op B" is just the LHS.
316 if (V == A)
317 return LHS;
318 // Otherwise return "V op B" if it simplifies.
319 if (Value *W = simplifyBinOp(Opcode, V, B, Q, MaxRecurse)) {
320 ++NumReassoc;
321 return W;
322 }
323 }
324 }
325
326 // Transform: "A op (B op C)" ==> "B op (C op A)" if it simplifies completely.
327 if (Op1 && Op1->getOpcode() == Opcode) {
328 Value *A = LHS;
329 Value *B = Op1->getOperand(0);
330 Value *C = Op1->getOperand(1);
331
332 // Does "C op A" simplify?
333 if (Value *V = simplifyBinOp(Opcode, C, A, Q, MaxRecurse)) {
334 // It does! Return "B op V" if it simplifies or is already available.
335 // If V equals C then "B op V" is just the RHS.
336 if (V == C)
337 return RHS;
338 // Otherwise return "B op V" if it simplifies.
339 if (Value *W = simplifyBinOp(Opcode, B, V, Q, MaxRecurse)) {
340 ++NumReassoc;
341 return W;
342 }
343 }
344 }
345
346 return nullptr;
347}
348
349/// In the case of a binary operation with a select instruction as an operand,
350/// try to simplify the binop by seeing whether evaluating it on both branches
351/// of the select results in the same value. Returns the common value if so,
352/// otherwise returns null.
354 Value *RHS, const SimplifyQuery &Q,
355 unsigned MaxRecurse) {
356 // Recursion is always used, so bail out at once if we already hit the limit.
357 if (!MaxRecurse--)
358 return nullptr;
359
360 SelectInst *SI;
361 if (isa<SelectInst>(LHS)) {
363 } else {
364 assert(isa<SelectInst>(RHS) && "No select instruction operand!");
366 }
367
368 // Evaluate the BinOp on the true and false branches of the select.
369 Value *TV;
370 Value *FV;
371 if (SI == LHS) {
372 TV = simplifyBinOp(Opcode, SI->getTrueValue(), RHS, Q, MaxRecurse);
373 FV = simplifyBinOp(Opcode, SI->getFalseValue(), RHS, Q, MaxRecurse);
374 } else {
375 TV = simplifyBinOp(Opcode, LHS, SI->getTrueValue(), Q, MaxRecurse);
376 FV = simplifyBinOp(Opcode, LHS, SI->getFalseValue(), Q, MaxRecurse);
377 }
378
379 // If they simplified to the same value, then return the common value.
380 // If they both failed to simplify then return null.
381 if (TV == FV)
382 return TV;
383
384 // If one branch simplified to undef, return the other one.
385 if (TV && Q.isUndefValue(TV))
386 return FV;
387 if (FV && Q.isUndefValue(FV))
388 return TV;
389
390 // If applying the operation did not change the true and false select values,
391 // then the result of the binop is the select itself.
392 if (TV == SI->getTrueValue() && FV == SI->getFalseValue())
393 return SI;
394
395 // If one branch simplified and the other did not, and the simplified
396 // value is equal to the unsimplified one, return the simplified value.
397 // For example, select (cond, X, X & Z) & Z -> X & Z.
398 if ((FV && !TV) || (TV && !FV)) {
399 // Check that the simplified value has the form "X op Y" where "op" is the
400 // same as the original operation.
401 Instruction *Simplified = dyn_cast<Instruction>(FV ? FV : TV);
402 if (Simplified && Simplified->getOpcode() == unsigned(Opcode) &&
403 !Simplified->hasPoisonGeneratingFlags()) {
404 // The value that didn't simplify is "UnsimplifiedLHS op UnsimplifiedRHS".
405 // We already know that "op" is the same as for the simplified value. See
406 // if the operands match too. If so, return the simplified value.
407 Value *UnsimplifiedBranch = FV ? SI->getTrueValue() : SI->getFalseValue();
408 Value *UnsimplifiedLHS = SI == LHS ? UnsimplifiedBranch : LHS;
409 Value *UnsimplifiedRHS = SI == LHS ? RHS : UnsimplifiedBranch;
410 if (Simplified->getOperand(0) == UnsimplifiedLHS &&
411 Simplified->getOperand(1) == UnsimplifiedRHS)
412 return Simplified;
413 if (Simplified->isCommutative() &&
414 Simplified->getOperand(1) == UnsimplifiedLHS &&
415 Simplified->getOperand(0) == UnsimplifiedRHS)
416 return Simplified;
417 }
418 }
419
420 return nullptr;
421}
422
423/// In the case of a comparison with a select instruction, try to simplify the
424/// comparison by seeing whether both branches of the select result in the same
425/// value. Returns the common value if so, otherwise returns null.
426/// For example, if we have:
427/// %tmp = select i1 %cmp, i32 1, i32 2
428/// %cmp1 = icmp sle i32 %tmp, 3
429/// We can simplify %cmp1 to true, because both branches of select are
430/// less than 3. We compose new comparison by substituting %tmp with both
431/// branches of select and see if it can be simplified.
433 const SimplifyQuery &Q, unsigned MaxRecurse) {
434 // Recursion is always used, so bail out at once if we already hit the limit.
435 if (!MaxRecurse--)
436 return nullptr;
437
438 // Make sure the select is on the LHS.
439 if (!isa<SelectInst>(LHS)) {
440 std::swap(LHS, RHS);
441 Pred = CmpInst::getSwappedPredicate(Pred);
442 }
443 assert(isa<SelectInst>(LHS) && "Not comparing with a select instruction!");
445 Value *Cond = SI->getCondition();
446 Value *TV = SI->getTrueValue();
447 Value *FV = SI->getFalseValue();
448
449 // Now that we have "cmp select(Cond, TV, FV), RHS", analyse it.
450 // Does "cmp TV, RHS" simplify?
451 Value *TCmp = simplifyCmpSelTrueCase(Pred, TV, RHS, Cond, Q, MaxRecurse);
452 if (!TCmp)
453 return nullptr;
454
455 // Does "cmp FV, RHS" simplify?
456 Value *FCmp = simplifyCmpSelFalseCase(Pred, FV, RHS, Cond, Q, MaxRecurse);
457 if (!FCmp)
458 return nullptr;
459
460 // If both sides simplified to the same value, then use it as the result of
461 // the original comparison.
462 if (TCmp == FCmp)
463 return TCmp;
464
465 // The remaining cases only make sense if the select condition has the same
466 // type as the result of the comparison, so bail out if this is not so.
467 if (Cond->getType()->isVectorTy() == RHS->getType()->isVectorTy())
468 return handleOtherCmpSelSimplifications(TCmp, FCmp, Cond, Q, MaxRecurse);
469
470 return nullptr;
471}
472
473/// In the case of a binary operation with an operand that is a PHI instruction,
474/// try to simplify the binop by seeing whether evaluating it on the incoming
475/// phi values yields the same result for every value. If so returns the common
476/// value, otherwise returns null.
478 Value *RHS, const SimplifyQuery &Q,
479 unsigned MaxRecurse) {
480 // Recursion is always used, so bail out at once if we already hit the limit.
481 if (!MaxRecurse--)
482 return nullptr;
483
484 PHINode *PI;
485 if (isa<PHINode>(LHS)) {
486 PI = cast<PHINode>(LHS);
487 // Bail out if RHS and the phi may be mutually interdependent due to a loop.
488 if (!valueDominatesPHI(RHS, PI, Q.DT))
489 return nullptr;
490 } else {
491 assert(isa<PHINode>(RHS) && "No PHI instruction operand!");
492 PI = cast<PHINode>(RHS);
493 // Bail out if LHS and the phi may be mutually interdependent due to a loop.
494 if (!valueDominatesPHI(LHS, PI, Q.DT))
495 return nullptr;
496 }
497
498 // Evaluate the BinOp on the incoming phi values.
499 Value *CommonValue = nullptr;
500 for (Use &Incoming : PI->incoming_values()) {
501 // If the incoming value is the phi node itself, it can safely be skipped.
502 if (Incoming == PI)
503 continue;
505 Value *V = PI == LHS
506 ? simplifyBinOp(Opcode, Incoming, RHS,
507 Q.getWithInstruction(InTI), MaxRecurse)
508 : simplifyBinOp(Opcode, LHS, Incoming,
509 Q.getWithInstruction(InTI), MaxRecurse);
510 // If the operation failed to simplify, or simplified to a different value
511 // to previously, then give up.
512 if (!V || (CommonValue && V != CommonValue))
513 return nullptr;
514 CommonValue = V;
515 }
516
517 return CommonValue;
518}
519
520/// In the case of a comparison with a PHI instruction, try to simplify the
521/// comparison by seeing whether comparing with all of the incoming phi values
522/// yields the same result every time. If so returns the common result,
523/// otherwise returns null.
525 const SimplifyQuery &Q, unsigned MaxRecurse) {
526 // Recursion is always used, so bail out at once if we already hit the limit.
527 if (!MaxRecurse--)
528 return nullptr;
529
530 // Make sure the phi is on the LHS.
531 if (!isa<PHINode>(LHS)) {
532 std::swap(LHS, RHS);
533 Pred = CmpInst::getSwappedPredicate(Pred);
534 }
535 assert(isa<PHINode>(LHS) && "Not comparing with a phi instruction!");
537
538 // Bail out if RHS and the phi may be mutually interdependent due to a loop.
539 if (!valueDominatesPHI(RHS, PI, Q.DT))
540 return nullptr;
541
542 // Evaluate the BinOp on the incoming phi values.
543 Value *CommonValue = nullptr;
544 for (unsigned u = 0, e = PI->getNumIncomingValues(); u < e; ++u) {
547 // If the incoming value is the phi node itself, it can safely be skipped.
548 if (Incoming == PI)
549 continue;
550 // Change the context instruction to the "edge" that flows into the phi.
551 // This is important because that is where incoming is actually "evaluated"
552 // even though it is used later somewhere else.
554 MaxRecurse);
555 // If the operation failed to simplify, or simplified to a different value
556 // to previously, then give up.
557 if (!V || (CommonValue && V != CommonValue))
558 return nullptr;
559 CommonValue = V;
560 }
561
562 return CommonValue;
563}
564
566 Value *&Op0, Value *&Op1,
567 const SimplifyQuery &Q) {
568 if (auto *CLHS = dyn_cast<Constant>(Op0)) {
569 if (auto *CRHS = dyn_cast<Constant>(Op1)) {
570 switch (Opcode) {
571 default:
572 break;
573 case Instruction::FAdd:
574 case Instruction::FSub:
575 case Instruction::FMul:
576 case Instruction::FDiv:
577 case Instruction::FRem:
578 if (Q.CxtI != nullptr)
579 return ConstantFoldFPInstOperands(Opcode, CLHS, CRHS, Q.DL, Q.CxtI);
580 }
581 return ConstantFoldBinaryOpOperands(Opcode, CLHS, CRHS, Q.DL);
582 }
583
584 // Canonicalize the constant to the RHS if this is a commutative operation.
585 if (Instruction::isCommutative(Opcode))
586 std::swap(Op0, Op1);
587 }
588 return nullptr;
589}
590
591/// Given operands for an Add, see if we can fold the result.
592/// If not, this returns null.
593static Value *simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
594 const SimplifyQuery &Q, unsigned MaxRecurse) {
595 if (Constant *C = foldOrCommuteConstant(Instruction::Add, Op0, Op1, Q))
596 return C;
597
598 // X + poison -> poison
599 if (isa<PoisonValue>(Op1))
600 return Op1;
601
602 // X + undef -> undef
603 if (Q.isUndefValue(Op1))
604 return Op1;
605
606 // X + 0 -> X
607 if (match(Op1, m_Zero()))
608 return Op0;
609
610 // If two operands are negative, return 0.
611 if (isKnownNegation(Op0, Op1))
612 return Constant::getNullValue(Op0->getType());
613
614 // X + (Y - X) -> Y
615 // (Y - X) + X -> Y
616 // Eg: X + -X -> 0
617 Value *Y = nullptr;
618 if (match(Op1, m_Sub(m_Value(Y), m_Specific(Op0))) ||
619 match(Op0, m_Sub(m_Value(Y), m_Specific(Op1))))
620 return Y;
621
622 // X + ~X -> -1 since ~X = -X-1
623 Type *Ty = Op0->getType();
624 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0))))
625 return Constant::getAllOnesValue(Ty);
626
627 // add nsw/nuw (xor Y, signmask), signmask --> Y
628 // The no-wrapping add guarantees that the top bit will be set by the add.
629 // Therefore, the xor must be clearing the already set sign bit of Y.
630 if ((IsNSW || IsNUW) && match(Op1, m_SignMask()) &&
631 match(Op0, m_Xor(m_Value(Y), m_SignMask())))
632 return Y;
633
634 // add nuw %x, -1 -> -1, because %x can only be 0.
635 if (IsNUW && match(Op1, m_AllOnes()))
636 return Op1; // Which is -1.
637
638 /// i1 add -> xor.
639 if (MaxRecurse && Op0->getType()->isIntOrIntVectorTy(1))
640 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1))
641 return V;
642
643 // Try some generic simplifications for associative operations.
644 if (Value *V =
645 simplifyAssociativeBinOp(Instruction::Add, Op0, Op1, Q, MaxRecurse))
646 return V;
647
648 // Threading Add over selects and phi nodes is pointless, so don't bother.
649 // Threading over the select in "A + select(cond, B, C)" means evaluating
650 // "A+B" and "A+C" and seeing if they are equal; but they are equal if and
651 // only if B and C are equal. If B and C are equal then (since we assume
652 // that operands have already been simplified) "select(cond, B, C)" should
653 // have been simplified to the common value of B and C already. Analysing
654 // "A+B" and "A+C" thus gains nothing, but costs compile time. Similarly
655 // for threading over phi nodes.
656
657 return nullptr;
658}
659
660Value *llvm::simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
661 const SimplifyQuery &Query) {
662 return ::simplifyAddInst(Op0, Op1, IsNSW, IsNUW, Query, RecursionLimit);
663}
664
665/// Compute the base pointer and cumulative constant offsets for V.
666///
667/// This strips all constant offsets off of V, leaving it the base pointer, and
668/// accumulates the total constant offset applied in the returned constant.
669/// It returns zero if there are no constant offsets applied.
670///
671/// This is very similar to stripAndAccumulateConstantOffsets(), except it
672/// normalizes the offset bitwidth to the stripped pointer type, not the
673/// original pointer type.
675 bool AllowNonInbounds = false) {
676 assert(V->getType()->isPtrOrPtrVectorTy());
677
678 APInt Offset = APInt::getZero(DL.getIndexTypeSizeInBits(V->getType()));
679 V = V->stripAndAccumulateConstantOffsets(DL, Offset, AllowNonInbounds);
680 // As that strip may trace through `addrspacecast`, need to sext or trunc
681 // the offset calculated.
682 return Offset.sextOrTrunc(DL.getIndexTypeSizeInBits(V->getType()));
683}
684
685/// Compute the constant difference between two pointer values.
686/// If the difference is not a constant, returns zero.
688 Value *RHS) {
691
692 // If LHS and RHS are not related via constant offsets to the same base
693 // value, there is nothing we can do here.
694 if (LHS != RHS)
695 return nullptr;
696
697 // Otherwise, the difference of LHS - RHS can be computed as:
698 // LHS - RHS
699 // = (LHSOffset + Base) - (RHSOffset + Base)
700 // = LHSOffset - RHSOffset
701 Constant *Res = ConstantInt::get(LHS->getContext(), LHSOffset - RHSOffset);
702 if (auto *VecTy = dyn_cast<VectorType>(LHS->getType()))
703 Res = ConstantVector::getSplat(VecTy->getElementCount(), Res);
704 return Res;
705}
706
707/// Test if there is a dominating equivalence condition for the
708/// two operands. If there is, try to reduce the binary operation
709/// between the two operands.
710/// Example: Op0 - Op1 --> 0 when Op0 == Op1
711static Value *simplifyByDomEq(unsigned Opcode, Value *Op0, Value *Op1,
712 const SimplifyQuery &Q, unsigned MaxRecurse) {
713 // Recursive run it can not get any benefit
714 if (MaxRecurse != RecursionLimit)
715 return nullptr;
716
717 std::optional<bool> Imp =
719 if (Imp && *Imp) {
720 Type *Ty = Op0->getType();
721 switch (Opcode) {
722 case Instruction::Sub:
723 case Instruction::Xor:
724 case Instruction::URem:
725 case Instruction::SRem:
726 return Constant::getNullValue(Ty);
727
728 case Instruction::SDiv:
729 case Instruction::UDiv:
730 return ConstantInt::get(Ty, 1);
731
732 case Instruction::And:
733 case Instruction::Or:
734 // Could be either one - choose Op1 since that's more likely a constant.
735 return Op1;
736 default:
737 break;
738 }
739 }
740 return nullptr;
741}
742
743/// Given operands for a Sub, see if we can fold the result.
744/// If not, this returns null.
745static Value *simplifySubInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
746 const SimplifyQuery &Q, unsigned MaxRecurse) {
747 if (Constant *C = foldOrCommuteConstant(Instruction::Sub, Op0, Op1, Q))
748 return C;
749
750 // X - poison -> poison
751 // poison - X -> poison
752 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
753 return PoisonValue::get(Op0->getType());
754
755 // X - undef -> undef
756 // undef - X -> undef
757 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
758 return UndefValue::get(Op0->getType());
759
760 // X - 0 -> X
761 if (match(Op1, m_Zero()))
762 return Op0;
763
764 // X - X -> 0
765 if (Op0 == Op1)
766 return Constant::getNullValue(Op0->getType());
767
768 // Is this a negation?
769 if (match(Op0, m_Zero())) {
770 // 0 - X -> 0 if the sub is NUW.
771 if (IsNUW)
772 return Constant::getNullValue(Op0->getType());
773
774 KnownBits Known = computeKnownBits(Op1, Q);
775 if (Known.Zero.isMaxSignedValue()) {
776 // Op1 is either 0 or the minimum signed value. If the sub is NSW, then
777 // Op1 must be 0 because negating the minimum signed value is undefined.
778 if (IsNSW)
779 return Constant::getNullValue(Op0->getType());
780
781 // 0 - X -> X if X is 0 or the minimum signed value.
782 return Op1;
783 }
784 }
785
786 // (X + Y) - Z -> X + (Y - Z) or Y + (X - Z) if everything simplifies.
787 // For example, (X + Y) - Y -> X; (Y + X) - Y -> X
788 Value *X = nullptr, *Y = nullptr, *Z = Op1;
789 if (MaxRecurse && match(Op0, m_Add(m_Value(X), m_Value(Y)))) { // (X + Y) - Z
790 // See if "V === Y - Z" simplifies.
791 if (Value *V = simplifyBinOp(Instruction::Sub, Y, Z, Q, MaxRecurse - 1))
792 // It does! Now see if "X + V" simplifies.
793 if (Value *W = simplifyBinOp(Instruction::Add, X, V, Q, MaxRecurse - 1)) {
794 // It does, we successfully reassociated!
795 ++NumReassoc;
796 return W;
797 }
798 // See if "V === X - Z" simplifies.
799 if (Value *V = simplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse - 1))
800 // It does! Now see if "Y + V" simplifies.
801 if (Value *W = simplifyBinOp(Instruction::Add, Y, V, Q, MaxRecurse - 1)) {
802 // It does, we successfully reassociated!
803 ++NumReassoc;
804 return W;
805 }
806 }
807
808 // X - (Y + Z) -> (X - Y) - Z or (X - Z) - Y if everything simplifies.
809 // For example, X - (X + 1) -> -1
810 X = Op0;
811 if (MaxRecurse && match(Op1, m_Add(m_Value(Y), m_Value(Z)))) { // X - (Y + Z)
812 // See if "V === X - Y" simplifies.
813 if (Value *V = simplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse - 1))
814 // It does! Now see if "V - Z" simplifies.
815 if (Value *W = simplifyBinOp(Instruction::Sub, V, Z, Q, MaxRecurse - 1)) {
816 // It does, we successfully reassociated!
817 ++NumReassoc;
818 return W;
819 }
820 // See if "V === X - Z" simplifies.
821 if (Value *V = simplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse - 1))
822 // It does! Now see if "V - Y" simplifies.
823 if (Value *W = simplifyBinOp(Instruction::Sub, V, Y, Q, MaxRecurse - 1)) {
824 // It does, we successfully reassociated!
825 ++NumReassoc;
826 return W;
827 }
828 }
829
830 // Z - (X - Y) -> (Z - X) + Y if everything simplifies.
831 // For example, X - (X - Y) -> Y.
832 Z = Op0;
833 if (MaxRecurse && match(Op1, m_Sub(m_Value(X), m_Value(Y)))) // Z - (X - Y)
834 // See if "V === Z - X" simplifies.
835 if (Value *V = simplifyBinOp(Instruction::Sub, Z, X, Q, MaxRecurse - 1))
836 // It does! Now see if "V + Y" simplifies.
837 if (Value *W = simplifyBinOp(Instruction::Add, V, Y, Q, MaxRecurse - 1)) {
838 // It does, we successfully reassociated!
839 ++NumReassoc;
840 return W;
841 }
842
843 // trunc(X) - trunc(Y) -> trunc(X - Y) if everything simplifies.
844 if (MaxRecurse && match(Op0, m_Trunc(m_Value(X))) &&
845 match(Op1, m_Trunc(m_Value(Y))))
846 if (X->getType() == Y->getType())
847 // See if "V === X - Y" simplifies.
848 if (Value *V = simplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse - 1))
849 // It does! Now see if "trunc V" simplifies.
850 if (Value *W = simplifyCastInst(Instruction::Trunc, V, Op0->getType(),
851 Q, MaxRecurse - 1))
852 // It does, return the simplified "trunc V".
853 return W;
854
855 // Variations on GEP(base, I, ...) - GEP(base, i, ...) -> GEP(null, I-i, ...).
856 if (match(Op0, m_PtrToInt(m_Value(X))) && match(Op1, m_PtrToInt(m_Value(Y))))
857 if (Constant *Result = computePointerDifference(Q.DL, X, Y))
858 return ConstantFoldIntegerCast(Result, Op0->getType(), /*IsSigned*/ true,
859 Q.DL);
860
861 // i1 sub -> xor.
862 if (MaxRecurse && Op0->getType()->isIntOrIntVectorTy(1))
863 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1))
864 return V;
865
866 // Threading Sub over selects and phi nodes is pointless, so don't bother.
867 // Threading over the select in "A - select(cond, B, C)" means evaluating
868 // "A-B" and "A-C" and seeing if they are equal; but they are equal if and
869 // only if B and C are equal. If B and C are equal then (since we assume
870 // that operands have already been simplified) "select(cond, B, C)" should
871 // have been simplified to the common value of B and C already. Analysing
872 // "A-B" and "A-C" thus gains nothing, but costs compile time. Similarly
873 // for threading over phi nodes.
874
875 if (Value *V = simplifyByDomEq(Instruction::Sub, Op0, Op1, Q, MaxRecurse))
876 return V;
877
878 // (sub nuw C_Mask, (xor X, C_Mask)) -> X
879 if (IsNUW) {
880 Value *X;
881 if (match(Op1, m_Xor(m_Value(X), m_Specific(Op0))) &&
882 match(Op0, m_LowBitMask()))
883 return X;
884 }
885
886 return nullptr;
887}
888
889Value *llvm::simplifySubInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
890 const SimplifyQuery &Q) {
891 return ::simplifySubInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit);
892}
893
894/// Given operands for a Mul, see if we can fold the result.
895/// If not, this returns null.
896static Value *simplifyMulInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
897 const SimplifyQuery &Q, unsigned MaxRecurse) {
898 if (Constant *C = foldOrCommuteConstant(Instruction::Mul, Op0, Op1, Q))
899 return C;
900
901 // X * poison -> poison
902 if (isa<PoisonValue>(Op1))
903 return Op1;
904
905 // X * undef -> 0
906 // X * 0 -> 0
907 if (Q.isUndefValue(Op1) || match(Op1, m_Zero()))
908 return Constant::getNullValue(Op0->getType());
909
910 // X * 1 -> X
911 if (match(Op1, m_One()))
912 return Op0;
913
914 // (X / Y) * Y -> X if the division is exact.
915 Value *X = nullptr;
916 if (Q.IIQ.UseInstrInfo &&
917 (match(Op0,
918 m_Exact(m_IDiv(m_Value(X), m_Specific(Op1)))) || // (X / Y) * Y
919 match(Op1, m_Exact(m_IDiv(m_Value(X), m_Specific(Op0)))))) // Y * (X / Y)
920 return X;
921
922 if (Op0->getType()->isIntOrIntVectorTy(1)) {
923 // mul i1 nsw is a special-case because -1 * -1 is poison (+1 is not
924 // representable). All other cases reduce to 0, so just return 0.
925 if (IsNSW)
926 return ConstantInt::getNullValue(Op0->getType());
927
928 // Treat "mul i1" as "and i1".
929 if (MaxRecurse)
930 if (Value *V = simplifyAndInst(Op0, Op1, Q, MaxRecurse - 1))
931 return V;
932 }
933
934 // Try some generic simplifications for associative operations.
935 if (Value *V =
936 simplifyAssociativeBinOp(Instruction::Mul, Op0, Op1, Q, MaxRecurse))
937 return V;
938
939 // Mul distributes over Add. Try some generic simplifications based on this.
940 if (Value *V = expandCommutativeBinOp(Instruction::Mul, Op0, Op1,
941 Instruction::Add, Q, MaxRecurse))
942 return V;
943
944 // If the operation is with the result of a select instruction, check whether
945 // operating on either branch of the select always yields the same value.
946 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
947 if (Value *V =
948 threadBinOpOverSelect(Instruction::Mul, Op0, Op1, Q, MaxRecurse))
949 return V;
950
951 // If the operation is with the result of a phi instruction, check whether
952 // operating on all incoming values of the phi always yields the same value.
953 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
954 if (Value *V =
955 threadBinOpOverPHI(Instruction::Mul, Op0, Op1, Q, MaxRecurse))
956 return V;
957
958 return nullptr;
959}
960
961Value *llvm::simplifyMulInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
962 const SimplifyQuery &Q) {
963 return ::simplifyMulInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit);
964}
965
966/// Given a predicate and two operands, return true if the comparison is true.
967/// This is a helper for div/rem simplification where we return some other value
968/// when we can prove a relationship between the operands.
970 const SimplifyQuery &Q, unsigned MaxRecurse) {
971 Value *V = simplifyICmpInst(Pred, LHS, RHS, Q, MaxRecurse);
973 return (C && C->isAllOnesValue());
974}
975
976/// Return true if we can simplify X / Y to 0. Remainder can adapt that answer
977/// to simplify X % Y to X.
978static bool isDivZero(Value *X, Value *Y, const SimplifyQuery &Q,
979 unsigned MaxRecurse, bool IsSigned) {
980 // Recursion is always used, so bail out at once if we already hit the limit.
981 if (!MaxRecurse--)
982 return false;
983
984 if (IsSigned) {
985 // (X srem Y) sdiv Y --> 0
986 if (match(X, m_SRem(m_Value(), m_Specific(Y))))
987 return true;
988
989 // |X| / |Y| --> 0
990 //
991 // We require that 1 operand is a simple constant. That could be extended to
992 // 2 variables if we computed the sign bit for each.
993 //
994 // Make sure that a constant is not the minimum signed value because taking
995 // the abs() of that is undefined.
996 Type *Ty = X->getType();
997 const APInt *C;
998 if (match(X, m_APInt(C)) && !C->isMinSignedValue()) {
999 // Is the variable divisor magnitude always greater than the constant
1000 // dividend magnitude?
1001 // |Y| > |C| --> Y < -abs(C) or Y > abs(C)
1002 Constant *PosDividendC = ConstantInt::get(Ty, C->abs());
1003 Constant *NegDividendC = ConstantInt::get(Ty, -C->abs());
1004 if (isICmpTrue(CmpInst::ICMP_SLT, Y, NegDividendC, Q, MaxRecurse) ||
1005 isICmpTrue(CmpInst::ICMP_SGT, Y, PosDividendC, Q, MaxRecurse))
1006 return true;
1007 }
1008 if (match(Y, m_APInt(C))) {
1009 // Special-case: we can't take the abs() of a minimum signed value. If
1010 // that's the divisor, then all we have to do is prove that the dividend
1011 // is also not the minimum signed value.
1012 if (C->isMinSignedValue())
1013 return isICmpTrue(CmpInst::ICMP_NE, X, Y, Q, MaxRecurse);
1014
1015 // Is the variable dividend magnitude always less than the constant
1016 // divisor magnitude?
1017 // |X| < |C| --> X > -abs(C) and X < abs(C)
1018 Constant *PosDivisorC = ConstantInt::get(Ty, C->abs());
1019 Constant *NegDivisorC = ConstantInt::get(Ty, -C->abs());
1020 if (isICmpTrue(CmpInst::ICMP_SGT, X, NegDivisorC, Q, MaxRecurse) &&
1021 isICmpTrue(CmpInst::ICMP_SLT, X, PosDivisorC, Q, MaxRecurse))
1022 return true;
1023 }
1024 return false;
1025 }
1026
1027 // IsSigned == false.
1028
1029 // Is the unsigned dividend known to be less than a constant divisor?
1030 // TODO: Convert this (and above) to range analysis
1031 // ("computeConstantRangeIncludingKnownBits")?
1032 const APInt *C;
1033 if (match(Y, m_APInt(C)) && computeKnownBits(X, Q).getMaxValue().ult(*C))
1034 return true;
1035
1036 // Try again for any divisor:
1037 // Is the dividend unsigned less than the divisor?
1038 return isICmpTrue(ICmpInst::ICMP_ULT, X, Y, Q, MaxRecurse);
1039}
1040
1041/// Check for common or similar folds of integer division or integer remainder.
1042/// This applies to all 4 opcodes (sdiv/udiv/srem/urem).
1044 Value *Op1, const SimplifyQuery &Q,
1045 unsigned MaxRecurse) {
1046 bool IsDiv = (Opcode == Instruction::SDiv || Opcode == Instruction::UDiv);
1047 bool IsSigned = (Opcode == Instruction::SDiv || Opcode == Instruction::SRem);
1048
1049 Type *Ty = Op0->getType();
1050
1051 // X / undef -> poison
1052 // X % undef -> poison
1053 if (Q.isUndefValue(Op1) || isa<PoisonValue>(Op1))
1054 return PoisonValue::get(Ty);
1055
1056 // X / 0 -> poison
1057 // X % 0 -> poison
1058 // We don't need to preserve faults!
1059 if (match(Op1, m_Zero()))
1060 return PoisonValue::get(Ty);
1061
1062 // poison / X -> poison
1063 // poison % X -> poison
1064 if (isa<PoisonValue>(Op0))
1065 return Op0;
1066
1067 // undef / X -> 0
1068 // undef % X -> 0
1069 if (Q.isUndefValue(Op0))
1070 return Constant::getNullValue(Ty);
1071
1072 // 0 / X -> 0
1073 // 0 % X -> 0
1074 if (match(Op0, m_Zero()))
1075 return Constant::getNullValue(Op0->getType());
1076
1077 // X / X -> 1
1078 // X % X -> 0
1079 if (Op0 == Op1)
1080 return IsDiv ? ConstantInt::get(Ty, 1) : Constant::getNullValue(Ty);
1081
1082 KnownBits Known = computeKnownBits(Op1, Q);
1083 // X / 0 -> poison
1084 // X % 0 -> poison
1085 // If the divisor is known to be zero, just return poison. This can happen in
1086 // some cases where its provable indirectly the denominator is zero but it's
1087 // not trivially simplifiable (i.e known zero through a phi node).
1088 if (Known.isZero())
1089 return PoisonValue::get(Ty);
1090
1091 // X / 1 -> X
1092 // X % 1 -> 0
1093 // If the divisor can only be zero or one, we can't have division-by-zero
1094 // or remainder-by-zero, so assume the divisor is 1.
1095 // e.g. 1, zext (i8 X), sdiv X (Y and 1)
1096 if (Known.countMinLeadingZeros() == Known.getBitWidth() - 1)
1097 return IsDiv ? Op0 : Constant::getNullValue(Ty);
1098
1099 // If X * Y does not overflow, then:
1100 // X * Y / Y -> X
1101 // X * Y % Y -> 0
1102 Value *X;
1103 if (match(Op0, m_c_Mul(m_Value(X), m_Specific(Op1)))) {
1105 // The multiplication can't overflow if it is defined not to, or if
1106 // X == A / Y for some A.
1107 if ((IsSigned && Q.IIQ.hasNoSignedWrap(Mul)) ||
1108 (!IsSigned && Q.IIQ.hasNoUnsignedWrap(Mul)) ||
1109 (IsSigned && match(X, m_SDiv(m_Value(), m_Specific(Op1)))) ||
1110 (!IsSigned && match(X, m_UDiv(m_Value(), m_Specific(Op1))))) {
1111 return IsDiv ? X : Constant::getNullValue(Op0->getType());
1112 }
1113 }
1114
1115 if (isDivZero(Op0, Op1, Q, MaxRecurse, IsSigned))
1116 return IsDiv ? Constant::getNullValue(Op0->getType()) : Op0;
1117
1118 if (Value *V = simplifyByDomEq(Opcode, Op0, Op1, Q, MaxRecurse))
1119 return V;
1120
1121 // If the operation is with the result of a select instruction, check whether
1122 // operating on either branch of the select always yields the same value.
1123 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
1124 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse))
1125 return V;
1126
1127 // If the operation is with the result of a phi instruction, check whether
1128 // operating on all incoming values of the phi always yields the same value.
1129 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
1130 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse))
1131 return V;
1132
1133 return nullptr;
1134}
1135
1136/// These are simplifications common to SDiv and UDiv.
1138 bool IsExact, const SimplifyQuery &Q,
1139 unsigned MaxRecurse) {
1140 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q))
1141 return C;
1142
1143 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q, MaxRecurse))
1144 return V;
1145
1146 const APInt *DivC;
1147 if (IsExact && match(Op1, m_APInt(DivC))) {
1148 // If this is an exact divide by a constant, then the dividend (Op0) must
1149 // have at least as many trailing zeros as the divisor to divide evenly. If
1150 // it has less trailing zeros, then the result must be poison.
1151 if (DivC->countr_zero()) {
1152 KnownBits KnownOp0 = computeKnownBits(Op0, Q);
1153 if (KnownOp0.countMaxTrailingZeros() < DivC->countr_zero())
1154 return PoisonValue::get(Op0->getType());
1155 }
1156
1157 // udiv exact (mul nsw X, C), C --> X
1158 // sdiv exact (mul nuw X, C), C --> X
1159 // where C is not a power of 2.
1160 Value *X;
1161 if (!DivC->isPowerOf2() &&
1162 (Opcode == Instruction::UDiv
1163 ? match(Op0, m_NSWMul(m_Value(X), m_Specific(Op1)))
1164 : match(Op0, m_NUWMul(m_Value(X), m_Specific(Op1)))))
1165 return X;
1166 }
1167
1168 return nullptr;
1169}
1170
1171/// These are simplifications common to SRem and URem.
1173 const SimplifyQuery &Q, unsigned MaxRecurse) {
1174 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q))
1175 return C;
1176
1177 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q, MaxRecurse))
1178 return V;
1179
1180 // (X << Y) % X -> 0
1181 if (Q.IIQ.UseInstrInfo) {
1182 if ((Opcode == Instruction::SRem &&
1183 match(Op0, m_NSWShl(m_Specific(Op1), m_Value()))) ||
1184 (Opcode == Instruction::URem &&
1185 match(Op0, m_NUWShl(m_Specific(Op1), m_Value()))))
1186 return Constant::getNullValue(Op0->getType());
1187
1188 const APInt *C0;
1189 if (match(Op1, m_APInt(C0))) {
1190 // (srem (mul nsw X, C1), C0) -> 0 if C1 s% C0 == 0
1191 // (urem (mul nuw X, C1), C0) -> 0 if C1 u% C0 == 0
1192 if (Opcode == Instruction::SRem
1193 ? match(Op0,
1194 m_NSWMul(m_Value(), m_CheckedInt([C0](const APInt &C) {
1195 return C.srem(*C0).isZero();
1196 })))
1197 : match(Op0,
1198 m_NUWMul(m_Value(), m_CheckedInt([C0](const APInt &C) {
1199 return C.urem(*C0).isZero();
1200 }))))
1201 return Constant::getNullValue(Op0->getType());
1202 }
1203 }
1204 return nullptr;
1205}
1206
1207/// Given operands for an SDiv, see if we can fold the result.
1208/// If not, this returns null.
1209static Value *simplifySDivInst(Value *Op0, Value *Op1, bool IsExact,
1210 const SimplifyQuery &Q, unsigned MaxRecurse) {
1211 // If two operands are negated and no signed overflow, return -1.
1212 if (isKnownNegation(Op0, Op1, /*NeedNSW=*/true))
1213 return Constant::getAllOnesValue(Op0->getType());
1214
1215 return simplifyDiv(Instruction::SDiv, Op0, Op1, IsExact, Q, MaxRecurse);
1216}
1217
1218Value *llvm::simplifySDivInst(Value *Op0, Value *Op1, bool IsExact,
1219 const SimplifyQuery &Q) {
1220 return ::simplifySDivInst(Op0, Op1, IsExact, Q, RecursionLimit);
1221}
1222
1223/// Given operands for a UDiv, see if we can fold the result.
1224/// If not, this returns null.
1225static Value *simplifyUDivInst(Value *Op0, Value *Op1, bool IsExact,
1226 const SimplifyQuery &Q, unsigned MaxRecurse) {
1227 return simplifyDiv(Instruction::UDiv, Op0, Op1, IsExact, Q, MaxRecurse);
1228}
1229
1230Value *llvm::simplifyUDivInst(Value *Op0, Value *Op1, bool IsExact,
1231 const SimplifyQuery &Q) {
1232 return ::simplifyUDivInst(Op0, Op1, IsExact, Q, RecursionLimit);
1233}
1234
1235/// Given operands for an SRem, see if we can fold the result.
1236/// If not, this returns null.
1237static Value *simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
1238 unsigned MaxRecurse) {
1239 // If the divisor is 0, the result is undefined, so assume the divisor is -1.
1240 // srem Op0, (sext i1 X) --> srem Op0, -1 --> 0
1241 Value *X;
1242 if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))
1243 return ConstantInt::getNullValue(Op0->getType());
1244
1245 // If the two operands are negated, return 0.
1246 if (isKnownNegation(Op0, Op1))
1247 return ConstantInt::getNullValue(Op0->getType());
1248
1249 return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse);
1250}
1251
1253 return ::simplifySRemInst(Op0, Op1, Q, RecursionLimit);
1254}
1255
1256/// Given operands for a URem, see if we can fold the result.
1257/// If not, this returns null.
1258static Value *simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
1259 unsigned MaxRecurse) {
1260 return simplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse);
1261}
1262
1264 return ::simplifyURemInst(Op0, Op1, Q, RecursionLimit);
1265}
1266
1267/// Returns true if a shift by \c Amount always yields poison.
1268static bool isPoisonShift(Value *Amount, const SimplifyQuery &Q) {
1269 Constant *C = dyn_cast<Constant>(Amount);
1270 if (!C)
1271 return false;
1272
1273 // X shift by undef -> poison because it may shift by the bitwidth.
1274 if (Q.isUndefValue(C))
1275 return true;
1276
1277 // Shifting by the bitwidth or more is poison. This covers scalars and
1278 // fixed/scalable vectors with splat constants.
1279 const APInt *AmountC;
1280 if (match(C, m_APInt(AmountC)) && AmountC->uge(AmountC->getBitWidth()))
1281 return true;
1282
1283 // Try harder for fixed-length vectors:
1284 // If all lanes of a vector shift are poison, the whole shift is poison.
1286 for (unsigned I = 0,
1287 E = cast<FixedVectorType>(C->getType())->getNumElements();
1288 I != E; ++I)
1289 if (!isPoisonShift(C->getAggregateElement(I), Q))
1290 return false;
1291 return true;
1292 }
1293
1294 return false;
1295}
1296
1297/// Given operands for an Shl, LShr or AShr, see if we can fold the result.
1298/// If not, this returns null.
1300 Value *Op1, bool IsNSW, const SimplifyQuery &Q,
1301 unsigned MaxRecurse) {
1302 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q))
1303 return C;
1304
1305 // poison shift by X -> poison
1306 if (isa<PoisonValue>(Op0))
1307 return Op0;
1308
1309 // 0 shift by X -> 0
1310 if (match(Op0, m_Zero()))
1311 return Constant::getNullValue(Op0->getType());
1312
1313 // X shift by 0 -> X
1314 // Shift-by-sign-extended bool must be shift-by-0 because shift-by-all-ones
1315 // would be poison.
1316 Value *X;
1317 if (match(Op1, m_Zero()) ||
1318 (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)))
1319 return Op0;
1320
1321 // Fold undefined shifts.
1322 if (isPoisonShift(Op1, Q))
1323 return PoisonValue::get(Op0->getType());
1324
1325 // If the operation is with the result of a select instruction, check whether
1326 // operating on either branch of the select always yields the same value.
1327 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
1328 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse))
1329 return V;
1330
1331 // If the operation is with the result of a phi instruction, check whether
1332 // operating on all incoming values of the phi always yields the same value.
1333 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
1334 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse))
1335 return V;
1336
1337 // If any bits in the shift amount make that value greater than or equal to
1338 // the number of bits in the type, the shift is undefined.
1339 KnownBits KnownAmt = computeKnownBits(Op1, Q);
1340 if (KnownAmt.getMinValue().uge(KnownAmt.getBitWidth()))
1341 return PoisonValue::get(Op0->getType());
1342
1343 // If all valid bits in the shift amount are known zero, the first operand is
1344 // unchanged.
1345 unsigned NumValidShiftBits = Log2_32_Ceil(KnownAmt.getBitWidth());
1346 if (KnownAmt.countMinTrailingZeros() >= NumValidShiftBits)
1347 return Op0;
1348
1349 // Check for nsw shl leading to a poison value.
1350 if (IsNSW) {
1351 assert(Opcode == Instruction::Shl && "Expected shl for nsw instruction");
1352 KnownBits KnownVal = computeKnownBits(Op0, Q);
1353 KnownBits KnownShl = KnownBits::shl(KnownVal, KnownAmt);
1354
1355 if (KnownVal.Zero.isSignBitSet())
1356 KnownShl.Zero.setSignBit();
1357 if (KnownVal.One.isSignBitSet())
1358 KnownShl.One.setSignBit();
1359
1360 if (KnownShl.hasConflict())
1361 return PoisonValue::get(Op0->getType());
1362 }
1363
1364 return nullptr;
1365}
1366
1367/// Given operands for an LShr or AShr, see if we can fold the result. If not,
1368/// this returns null.
1370 Value *Op1, bool IsExact,
1371 const SimplifyQuery &Q, unsigned MaxRecurse) {
1372 if (Value *V =
1373 simplifyShift(Opcode, Op0, Op1, /*IsNSW*/ false, Q, MaxRecurse))
1374 return V;
1375
1376 // X >> X -> 0
1377 if (Op0 == Op1)
1378 return Constant::getNullValue(Op0->getType());
1379
1380 // undef >> X -> 0
1381 // undef >> X -> undef (if it's exact)
1382 if (Q.isUndefValue(Op0))
1383 return IsExact ? Op0 : Constant::getNullValue(Op0->getType());
1384
1385 // The low bit cannot be shifted out of an exact shift if it is set.
1386 // TODO: Generalize by counting trailing zeros (see fold for exact division).
1387 if (IsExact) {
1388 KnownBits Op0Known = computeKnownBits(Op0, Q);
1389 if (Op0Known.One[0])
1390 return Op0;
1391 }
1392
1393 return nullptr;
1394}
1395
1396/// Given operands for an Shl, see if we can fold the result.
1397/// If not, this returns null.
1398static Value *simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
1399 const SimplifyQuery &Q, unsigned MaxRecurse) {
1400 if (Value *V =
1401 simplifyShift(Instruction::Shl, Op0, Op1, IsNSW, Q, MaxRecurse))
1402 return V;
1403
1404 Type *Ty = Op0->getType();
1405 // undef << X -> 0
1406 // undef << X -> undef if (if it's NSW/NUW)
1407 if (Q.isUndefValue(Op0))
1408 return IsNSW || IsNUW ? Op0 : Constant::getNullValue(Ty);
1409
1410 // (X >> A) << A -> X
1411 Value *X;
1412 if (Q.IIQ.UseInstrInfo &&
1413 match(Op0, m_Exact(m_Shr(m_Value(X), m_Specific(Op1)))))
1414 return X;
1415
1416 // shl nuw i8 C, %x -> C iff C has sign bit set.
1417 if (IsNUW && match(Op0, m_Negative()))
1418 return Op0;
1419 // NOTE: could use computeKnownBits() / LazyValueInfo,
1420 // but the cost-benefit analysis suggests it isn't worth it.
1421
1422 // "nuw" guarantees that only zeros are shifted out, and "nsw" guarantees
1423 // that the sign-bit does not change, so the only input that does not
1424 // produce poison is 0, and "0 << (bitwidth-1) --> 0".
1425 if (IsNSW && IsNUW &&
1426 match(Op1, m_SpecificInt(Ty->getScalarSizeInBits() - 1)))
1427 return Constant::getNullValue(Ty);
1428
1429 return nullptr;
1430}
1431
1432Value *llvm::simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW,
1433 const SimplifyQuery &Q) {
1434 return ::simplifyShlInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit);
1435}
1436
1437/// Given operands for an LShr, see if we can fold the result.
1438/// If not, this returns null.
1439static Value *simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact,
1440 const SimplifyQuery &Q, unsigned MaxRecurse) {
1441 if (Value *V = simplifyRightShift(Instruction::LShr, Op0, Op1, IsExact, Q,
1442 MaxRecurse))
1443 return V;
1444
1445 // (X << A) >> A -> X
1446 Value *X;
1447 if (Q.IIQ.UseInstrInfo && match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1))))
1448 return X;
1449
1450 // ((X << A) | Y) >> A -> X if effective width of Y is not larger than A.
1451 // We can return X as we do in the above case since OR alters no bits in X.
1452 // SimplifyDemandedBits in InstCombine can do more general optimization for
1453 // bit manipulation. This pattern aims to provide opportunities for other
1454 // optimizers by supporting a simple but common case in InstSimplify.
1455 Value *Y;
1456 const APInt *ShRAmt, *ShLAmt;
1457 if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(ShRAmt)) &&
1458 match(Op0, m_c_Or(m_NUWShl(m_Value(X), m_APInt(ShLAmt)), m_Value(Y))) &&
1459 *ShRAmt == *ShLAmt) {
1460 const KnownBits YKnown = computeKnownBits(Y, Q);
1461 const unsigned EffWidthY = YKnown.countMaxActiveBits();
1462 if (ShRAmt->uge(EffWidthY))
1463 return X;
1464 }
1465
1466 return nullptr;
1467}
1468
1469Value *llvm::simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact,
1470 const SimplifyQuery &Q) {
1471 return ::simplifyLShrInst(Op0, Op1, IsExact, Q, RecursionLimit);
1472}
1473
1474/// Given operands for an AShr, see if we can fold the result.
1475/// If not, this returns null.
1476static Value *simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact,
1477 const SimplifyQuery &Q, unsigned MaxRecurse) {
1478 if (Value *V = simplifyRightShift(Instruction::AShr, Op0, Op1, IsExact, Q,
1479 MaxRecurse))
1480 return V;
1481
1482 // -1 >>a X --> -1
1483 // (-1 << X) a>> X --> -1
1484 // We could return the original -1 constant to preserve poison elements.
1485 if (match(Op0, m_AllOnes()) ||
1486 match(Op0, m_Shl(m_AllOnes(), m_Specific(Op1))))
1487 return Constant::getAllOnesValue(Op0->getType());
1488
1489 // (X << A) >> A -> X
1490 Value *X;
1491 if (Q.IIQ.UseInstrInfo && match(Op0, m_NSWShl(m_Value(X), m_Specific(Op1))))
1492 return X;
1493
1494 // Arithmetic shifting an all-sign-bit value is a no-op.
1495 unsigned NumSignBits = ComputeNumSignBits(Op0, Q.DL, Q.AC, Q.CxtI, Q.DT);
1496 if (NumSignBits == Op0->getType()->getScalarSizeInBits())
1497 return Op0;
1498
1499 return nullptr;
1500}
1501
1502Value *llvm::simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact,
1503 const SimplifyQuery &Q) {
1504 return ::simplifyAShrInst(Op0, Op1, IsExact, Q, RecursionLimit);
1505}
1506
1507/// Commuted variants are assumed to be handled by calling this function again
1508/// with the parameters swapped.
1510 ICmpInst *UnsignedICmp, bool IsAnd,
1511 const SimplifyQuery &Q) {
1512 Value *X, *Y;
1513
1514 CmpPredicate EqPred;
1515 if (!match(ZeroICmp, m_ICmp(EqPred, m_Value(Y), m_Zero())) ||
1516 !ICmpInst::isEquality(EqPred))
1517 return nullptr;
1518
1519 CmpPredicate UnsignedPred;
1520
1521 Value *A, *B;
1522 // Y = (A - B);
1523 if (match(Y, m_Sub(m_Value(A), m_Value(B)))) {
1524 if (match(UnsignedICmp,
1525 m_c_ICmp(UnsignedPred, m_Specific(A), m_Specific(B))) &&
1526 ICmpInst::isUnsigned(UnsignedPred)) {
1527 // A >=/<= B || (A - B) != 0 <--> true
1528 if ((UnsignedPred == ICmpInst::ICMP_UGE ||
1529 UnsignedPred == ICmpInst::ICMP_ULE) &&
1530 EqPred == ICmpInst::ICMP_NE && !IsAnd)
1531 return ConstantInt::getTrue(UnsignedICmp->getType());
1532 // A </> B && (A - B) == 0 <--> false
1533 if ((UnsignedPred == ICmpInst::ICMP_ULT ||
1534 UnsignedPred == ICmpInst::ICMP_UGT) &&
1535 EqPred == ICmpInst::ICMP_EQ && IsAnd)
1536 return ConstantInt::getFalse(UnsignedICmp->getType());
1537
1538 // A </> B && (A - B) != 0 <--> A </> B
1539 // A </> B || (A - B) != 0 <--> (A - B) != 0
1540 if (EqPred == ICmpInst::ICMP_NE && (UnsignedPred == ICmpInst::ICMP_ULT ||
1541 UnsignedPred == ICmpInst::ICMP_UGT))
1542 return IsAnd ? UnsignedICmp : ZeroICmp;
1543
1544 // A <=/>= B && (A - B) == 0 <--> (A - B) == 0
1545 // A <=/>= B || (A - B) == 0 <--> A <=/>= B
1546 if (EqPred == ICmpInst::ICMP_EQ && (UnsignedPred == ICmpInst::ICMP_ULE ||
1547 UnsignedPred == ICmpInst::ICMP_UGE))
1548 return IsAnd ? ZeroICmp : UnsignedICmp;
1549 }
1550
1551 // Given Y = (A - B)
1552 // Y >= A && Y != 0 --> Y >= A iff B != 0
1553 // Y < A || Y == 0 --> Y < A iff B != 0
1554 if (match(UnsignedICmp,
1555 m_c_ICmp(UnsignedPred, m_Specific(Y), m_Specific(A)))) {
1556 if (UnsignedPred == ICmpInst::ICMP_UGE && IsAnd &&
1557 EqPred == ICmpInst::ICMP_NE && isKnownNonZero(B, Q))
1558 return UnsignedICmp;
1559 if (UnsignedPred == ICmpInst::ICMP_ULT && !IsAnd &&
1560 EqPred == ICmpInst::ICMP_EQ && isKnownNonZero(B, Q))
1561 return UnsignedICmp;
1562 }
1563 }
1564
1565 if (match(UnsignedICmp, m_ICmp(UnsignedPred, m_Value(X), m_Specific(Y))) &&
1566 ICmpInst::isUnsigned(UnsignedPred))
1567 ;
1568 else if (match(UnsignedICmp,
1569 m_ICmp(UnsignedPred, m_Specific(Y), m_Value(X))) &&
1570 ICmpInst::isUnsigned(UnsignedPred))
1571 UnsignedPred = ICmpInst::getSwappedPredicate(UnsignedPred);
1572 else
1573 return nullptr;
1574
1575 // X > Y && Y == 0 --> Y == 0 iff X != 0
1576 // X > Y || Y == 0 --> X > Y iff X != 0
1577 if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ &&
1578 isKnownNonZero(X, Q))
1579 return IsAnd ? ZeroICmp : UnsignedICmp;
1580
1581 // X <= Y && Y != 0 --> X <= Y iff X != 0
1582 // X <= Y || Y != 0 --> Y != 0 iff X != 0
1583 if (UnsignedPred == ICmpInst::ICMP_ULE && EqPred == ICmpInst::ICMP_NE &&
1584 isKnownNonZero(X, Q))
1585 return IsAnd ? UnsignedICmp : ZeroICmp;
1586
1587 // The transforms below here are expected to be handled more generally with
1588 // simplifyAndOrOfICmpsWithLimitConst() or in InstCombine's
1589 // foldAndOrOfICmpsWithConstEq(). If we are looking to trim optimizer overlap,
1590 // these are candidates for removal.
1591
1592 // X < Y && Y != 0 --> X < Y
1593 // X < Y || Y != 0 --> Y != 0
1594 if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_NE)
1595 return IsAnd ? UnsignedICmp : ZeroICmp;
1596
1597 // X >= Y && Y == 0 --> Y == 0
1598 // X >= Y || Y == 0 --> X >= Y
1599 if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ)
1600 return IsAnd ? ZeroICmp : UnsignedICmp;
1601
1602 // X < Y && Y == 0 --> false
1603 if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_EQ &&
1604 IsAnd)
1605 return getFalse(UnsignedICmp->getType());
1606
1607 // X >= Y || Y != 0 --> true
1608 if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_NE &&
1609 !IsAnd)
1610 return getTrue(UnsignedICmp->getType());
1611
1612 return nullptr;
1613}
1614
1615/// Test if a pair of compares with a shared operand and 2 constants has an
1616/// empty set intersection, full set union, or if one compare is a superset of
1617/// the other.
1619 bool IsAnd) {
1620 // Look for this pattern: {and/or} (icmp X, C0), (icmp X, C1)).
1621 if (Cmp0->getOperand(0) != Cmp1->getOperand(0))
1622 return nullptr;
1623
1624 const APInt *C0, *C1;
1625 if (!match(Cmp0->getOperand(1), m_APInt(C0)) ||
1626 !match(Cmp1->getOperand(1), m_APInt(C1)))
1627 return nullptr;
1628
1629 auto Range0 = ConstantRange::makeExactICmpRegion(Cmp0->getPredicate(), *C0);
1630 auto Range1 = ConstantRange::makeExactICmpRegion(Cmp1->getPredicate(), *C1);
1631
1632 // For and-of-compares, check if the intersection is empty:
1633 // (icmp X, C0) && (icmp X, C1) --> empty set --> false
1634 if (IsAnd && Range0.intersectWith(Range1).isEmptySet())
1635 return getFalse(Cmp0->getType());
1636
1637 // For or-of-compares, check if the union is full:
1638 // (icmp X, C0) || (icmp X, C1) --> full set --> true
1639 if (!IsAnd && Range0.unionWith(Range1).isFullSet())
1640 return getTrue(Cmp0->getType());
1641
1642 // Is one range a superset of the other?
1643 // If this is and-of-compares, take the smaller set:
1644 // (icmp sgt X, 4) && (icmp sgt X, 42) --> icmp sgt X, 42
1645 // If this is or-of-compares, take the larger set:
1646 // (icmp sgt X, 4) || (icmp sgt X, 42) --> icmp sgt X, 4
1647 if (Range0.contains(Range1))
1648 return IsAnd ? Cmp1 : Cmp0;
1649 if (Range1.contains(Range0))
1650 return IsAnd ? Cmp0 : Cmp1;
1651
1652 return nullptr;
1653}
1654
1656 const InstrInfoQuery &IIQ) {
1657 // (icmp (add V, C0), C1) & (icmp V, C0)
1658 CmpPredicate Pred0, Pred1;
1659 const APInt *C0, *C1;
1660 Value *V;
1661 if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_APInt(C0)), m_APInt(C1))))
1662 return nullptr;
1663
1664 if (!match(Op1, m_ICmp(Pred1, m_Specific(V), m_Value())))
1665 return nullptr;
1666
1667 auto *AddInst = cast<OverflowingBinaryOperator>(Op0->getOperand(0));
1668 if (AddInst->getOperand(1) != Op1->getOperand(1))
1669 return nullptr;
1670
1671 Type *ITy = Op0->getType();
1672 bool IsNSW = IIQ.hasNoSignedWrap(AddInst);
1673 bool IsNUW = IIQ.hasNoUnsignedWrap(AddInst);
1674
1675 const APInt Delta = *C1 - *C0;
1676 if (C0->isStrictlyPositive()) {
1677 if (Delta == 2) {
1678 if (Pred0 == ICmpInst::ICMP_ULT && Pred1 == ICmpInst::ICMP_SGT)
1679 return getFalse(ITy);
1680 if (Pred0 == ICmpInst::ICMP_SLT && Pred1 == ICmpInst::ICMP_SGT && IsNSW)
1681 return getFalse(ITy);
1682 }
1683 if (Delta == 1) {
1684 if (Pred0 == ICmpInst::ICMP_ULE && Pred1 == ICmpInst::ICMP_SGT)
1685 return getFalse(ITy);
1686 if (Pred0 == ICmpInst::ICMP_SLE && Pred1 == ICmpInst::ICMP_SGT && IsNSW)
1687 return getFalse(ITy);
1688 }
1689 }
1690 if (C0->getBoolValue() && IsNUW) {
1691 if (Delta == 2)
1692 if (Pred0 == ICmpInst::ICMP_ULT && Pred1 == ICmpInst::ICMP_UGT)
1693 return getFalse(ITy);
1694 if (Delta == 1)
1695 if (Pred0 == ICmpInst::ICMP_ULE && Pred1 == ICmpInst::ICMP_UGT)
1696 return getFalse(ITy);
1697 }
1698
1699 return nullptr;
1700}
1701
1702/// Try to simplify and/or of icmp with ctpop intrinsic.
1704 bool IsAnd) {
1705 CmpPredicate Pred0, Pred1;
1706 Value *X;
1707 const APInt *C;
1709 m_APInt(C))) ||
1710 !match(Cmp1, m_ICmp(Pred1, m_Specific(X), m_ZeroInt())) || C->isZero())
1711 return nullptr;
1712
1713 // (ctpop(X) == C) || (X != 0) --> X != 0 where C > 0
1714 if (!IsAnd && Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_NE)
1715 return Cmp1;
1716 // (ctpop(X) != C) && (X == 0) --> X == 0 where C > 0
1717 if (IsAnd && Pred0 == ICmpInst::ICMP_NE && Pred1 == ICmpInst::ICMP_EQ)
1718 return Cmp1;
1719
1720 return nullptr;
1721}
1722
1724 const SimplifyQuery &Q) {
1725 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, Q))
1726 return X;
1727 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/true, Q))
1728 return X;
1729
1730 if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, true))
1731 return X;
1732
1733 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op0, Op1, true))
1734 return X;
1735 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op1, Op0, true))
1736 return X;
1737
1738 if (Value *X = simplifyAndOfICmpsWithAdd(Op0, Op1, Q.IIQ))
1739 return X;
1740 if (Value *X = simplifyAndOfICmpsWithAdd(Op1, Op0, Q.IIQ))
1741 return X;
1742
1743 return nullptr;
1744}
1745
1747 const InstrInfoQuery &IIQ) {
1748 // (icmp (add V, C0), C1) | (icmp V, C0)
1749 CmpPredicate Pred0, Pred1;
1750 const APInt *C0, *C1;
1751 Value *V;
1752 if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_APInt(C0)), m_APInt(C1))))
1753 return nullptr;
1754
1755 if (!match(Op1, m_ICmp(Pred1, m_Specific(V), m_Value())))
1756 return nullptr;
1757
1758 auto *AddInst = cast<BinaryOperator>(Op0->getOperand(0));
1759 if (AddInst->getOperand(1) != Op1->getOperand(1))
1760 return nullptr;
1761
1762 Type *ITy = Op0->getType();
1763 bool IsNSW = IIQ.hasNoSignedWrap(AddInst);
1764 bool IsNUW = IIQ.hasNoUnsignedWrap(AddInst);
1765
1766 const APInt Delta = *C1 - *C0;
1767 if (C0->isStrictlyPositive()) {
1768 if (Delta == 2) {
1769 if (Pred0 == ICmpInst::ICMP_UGE && Pred1 == ICmpInst::ICMP_SLE)
1770 return getTrue(ITy);
1771 if (Pred0 == ICmpInst::ICMP_SGE && Pred1 == ICmpInst::ICMP_SLE && IsNSW)
1772 return getTrue(ITy);
1773 }
1774 if (Delta == 1) {
1775 if (Pred0 == ICmpInst::ICMP_UGT && Pred1 == ICmpInst::ICMP_SLE)
1776 return getTrue(ITy);
1777 if (Pred0 == ICmpInst::ICMP_SGT && Pred1 == ICmpInst::ICMP_SLE && IsNSW)
1778 return getTrue(ITy);
1779 }
1780 }
1781 if (C0->getBoolValue() && IsNUW) {
1782 if (Delta == 2)
1783 if (Pred0 == ICmpInst::ICMP_UGE && Pred1 == ICmpInst::ICMP_ULE)
1784 return getTrue(ITy);
1785 if (Delta == 1)
1786 if (Pred0 == ICmpInst::ICMP_UGT && Pred1 == ICmpInst::ICMP_ULE)
1787 return getTrue(ITy);
1788 }
1789
1790 return nullptr;
1791}
1792
1794 const SimplifyQuery &Q) {
1795 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false, Q))
1796 return X;
1797 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/false, Q))
1798 return X;
1799
1800 if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, false))
1801 return X;
1802
1803 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op0, Op1, false))
1804 return X;
1805 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op1, Op0, false))
1806 return X;
1807
1808 if (Value *X = simplifyOrOfICmpsWithAdd(Op0, Op1, Q.IIQ))
1809 return X;
1810 if (Value *X = simplifyOrOfICmpsWithAdd(Op1, Op0, Q.IIQ))
1811 return X;
1812
1813 return nullptr;
1814}
1815
1816/// Test if a pair of compares with a shared operand and 2 constants has an
1817/// empty set intersection, full set union, or if one compare is a superset of
1818/// the other.
1820 bool IsAnd) {
1821 // Look for this pattern: {and/or} (fcmp X, C0), (fcmp X, C1)).
1822 if (Cmp0->getOperand(0) != Cmp1->getOperand(0))
1823 return nullptr;
1824
1825 const APFloat *C0, *C1;
1826 if (!match(Cmp0->getOperand(1), m_APFloat(C0)) ||
1827 !match(Cmp1->getOperand(1), m_APFloat(C1)))
1828 return nullptr;
1829
1831 IsAnd ? Cmp0->getPredicate() : Cmp0->getInversePredicate(), *C0);
1833 IsAnd ? Cmp1->getPredicate() : Cmp1->getInversePredicate(), *C1);
1834
1835 if (!Range0 || !Range1)
1836 return nullptr;
1837
1838 // For and-of-compares, check if the intersection is empty:
1839 // (fcmp X, C0) && (fcmp X, C1) --> empty set --> false
1840 if (Range0->intersectWith(*Range1).isEmptySet())
1841 return ConstantInt::getBool(Cmp0->getType(), !IsAnd);
1842
1843 // Is one range a superset of the other?
1844 // If this is and-of-compares, take the smaller set:
1845 // (fcmp ogt X, 4) && (fcmp ogt X, 42) --> fcmp ogt X, 42
1846 // If this is or-of-compares, take the larger set:
1847 // (fcmp ogt X, 4) || (fcmp ogt X, 42) --> fcmp ogt X, 4
1848 if (Range0->contains(*Range1))
1849 return Cmp1;
1850 if (Range1->contains(*Range0))
1851 return Cmp0;
1852
1853 return nullptr;
1854}
1855
1857 FCmpInst *RHS, bool IsAnd) {
1858 Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
1859 Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
1860 if (LHS0->getType() != RHS0->getType())
1861 return nullptr;
1862
1863 FCmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
1864 auto AbsOrSelfLHS0 = m_CombineOr(m_Specific(LHS0), m_FAbs(m_Specific(LHS0)));
1865 if ((PredL == FCmpInst::FCMP_ORD || PredL == FCmpInst::FCMP_UNO) &&
1866 ((FCmpInst::isOrdered(PredR) && IsAnd) ||
1867 (FCmpInst::isUnordered(PredR) && !IsAnd))) {
1868 // (fcmp ord X, 0) & (fcmp o** X/abs(X), Y) --> fcmp o** X/abs(X), Y
1869 // (fcmp uno X, 0) & (fcmp o** X/abs(X), Y) --> false
1870 // (fcmp uno X, 0) | (fcmp u** X/abs(X), Y) --> fcmp u** X/abs(X), Y
1871 // (fcmp ord X, 0) | (fcmp u** X/abs(X), Y) --> true
1872 if ((match(RHS0, AbsOrSelfLHS0) || match(RHS1, AbsOrSelfLHS0)) &&
1873 match(LHS1, m_PosZeroFP()))
1874 return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
1875 ? static_cast<Value *>(RHS)
1876 : ConstantInt::getBool(LHS->getType(), !IsAnd);
1877 }
1878
1879 auto AbsOrSelfRHS0 = m_CombineOr(m_Specific(RHS0), m_FAbs(m_Specific(RHS0)));
1880 if ((PredR == FCmpInst::FCMP_ORD || PredR == FCmpInst::FCMP_UNO) &&
1881 ((FCmpInst::isOrdered(PredL) && IsAnd) ||
1882 (FCmpInst::isUnordered(PredL) && !IsAnd))) {
1883 // (fcmp o** X/abs(X), Y) & (fcmp ord X, 0) --> fcmp o** X/abs(X), Y
1884 // (fcmp o** X/abs(X), Y) & (fcmp uno X, 0) --> false
1885 // (fcmp u** X/abs(X), Y) | (fcmp uno X, 0) --> fcmp u** X/abs(X), Y
1886 // (fcmp u** X/abs(X), Y) | (fcmp ord X, 0) --> true
1887 if ((match(LHS0, AbsOrSelfRHS0) || match(LHS1, AbsOrSelfRHS0)) &&
1888 match(RHS1, m_PosZeroFP()))
1889 return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
1890 ? static_cast<Value *>(LHS)
1891 : ConstantInt::getBool(LHS->getType(), !IsAnd);
1892 }
1893
1894 if (auto *V = simplifyAndOrOfFCmpsWithConstants(LHS, RHS, IsAnd))
1895 return V;
1896
1897 return nullptr;
1898}
1899
1901 Value *Op1, bool IsAnd) {
1902 // Look through casts of the 'and' operands to find compares.
1903 auto *Cast0 = dyn_cast<CastInst>(Op0);
1904 auto *Cast1 = dyn_cast<CastInst>(Op1);
1905 if (Cast0 && Cast1 && Cast0->getOpcode() == Cast1->getOpcode() &&
1906 Cast0->getSrcTy() == Cast1->getSrcTy()) {
1907 Op0 = Cast0->getOperand(0);
1908 Op1 = Cast1->getOperand(0);
1909 }
1910
1911 Value *V = nullptr;
1912 auto *ICmp0 = dyn_cast<ICmpInst>(Op0);
1913 auto *ICmp1 = dyn_cast<ICmpInst>(Op1);
1914 if (ICmp0 && ICmp1)
1915 V = IsAnd ? simplifyAndOfICmps(ICmp0, ICmp1, Q)
1916 : simplifyOrOfICmps(ICmp0, ICmp1, Q);
1917
1918 auto *FCmp0 = dyn_cast<FCmpInst>(Op0);
1919 auto *FCmp1 = dyn_cast<FCmpInst>(Op1);
1920 if (FCmp0 && FCmp1)
1921 V = simplifyAndOrOfFCmps(Q, FCmp0, FCmp1, IsAnd);
1922
1923 if (!V)
1924 return nullptr;
1925 if (!Cast0)
1926 return V;
1927
1928 // If we looked through casts, we can only handle a constant simplification
1929 // because we are not allowed to create a cast instruction here.
1930 if (auto *C = dyn_cast<Constant>(V))
1931 return ConstantFoldCastOperand(Cast0->getOpcode(), C, Cast0->getType(),
1932 Q.DL);
1933
1934 return nullptr;
1935}
1936
1937static Value *simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp,
1938 const SimplifyQuery &Q,
1939 bool AllowRefinement,
1941 unsigned MaxRecurse);
1942
1943static Value *simplifyAndOrWithICmpEq(unsigned Opcode, Value *Op0, Value *Op1,
1944 const SimplifyQuery &Q,
1945 unsigned MaxRecurse) {
1946 assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
1947 "Must be and/or");
1948 CmpPredicate Pred;
1949 Value *A, *B;
1950 if (!match(Op0, m_ICmp(Pred, m_Value(A), m_Value(B))) ||
1951 !ICmpInst::isEquality(Pred))
1952 return nullptr;
1953
1954 auto Simplify = [&](Value *Res) -> Value * {
1955 Constant *Absorber = ConstantExpr::getBinOpAbsorber(Opcode, Res->getType());
1956
1957 // and (icmp eq a, b), x implies (a==b) inside x.
1958 // or (icmp ne a, b), x implies (a==b) inside x.
1959 // If x simplifies to true/false, we can simplify the and/or.
1960 if (Pred ==
1961 (Opcode == Instruction::And ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) {
1962 if (Res == Absorber)
1963 return Absorber;
1964 if (Res == ConstantExpr::getBinOpIdentity(Opcode, Res->getType()))
1965 return Op0;
1966 return nullptr;
1967 }
1968
1969 // If we have and (icmp ne a, b), x and for a==b we can simplify x to false,
1970 // then we can drop the icmp, as x will already be false in the case where
1971 // the icmp is false. Similar for or and true.
1972 if (Res == Absorber)
1973 return Op1;
1974 return nullptr;
1975 };
1976
1977 // In the final case (Res == Absorber with inverted predicate), it is safe to
1978 // refine poison during simplification, but not undef. For simplicity always
1979 // disable undef-based folds here.
1980 if (Value *Res = simplifyWithOpReplaced(Op1, A, B, Q.getWithoutUndef(),
1981 /* AllowRefinement */ true,
1982 /* DropFlags */ nullptr, MaxRecurse))
1983 return Simplify(Res);
1984 if (Value *Res = simplifyWithOpReplaced(Op1, B, A, Q.getWithoutUndef(),
1985 /* AllowRefinement */ true,
1986 /* DropFlags */ nullptr, MaxRecurse))
1987 return Simplify(Res);
1988
1989 return nullptr;
1990}
1991
1992/// Given a bitwise logic op, check if the operands are add/sub with a common
1993/// source value and inverted constant (identity: C - X -> ~(X + ~C)).
1995 Instruction::BinaryOps Opcode) {
1996 assert(Op0->getType() == Op1->getType() && "Mismatched binop types");
1997 assert(BinaryOperator::isBitwiseLogicOp(Opcode) && "Expected logic op");
1998 Value *X;
1999 Constant *C1, *C2;
2000 if ((match(Op0, m_Add(m_Value(X), m_Constant(C1))) &&
2001 match(Op1, m_Sub(m_Constant(C2), m_Specific(X)))) ||
2002 (match(Op1, m_Add(m_Value(X), m_Constant(C1))) &&
2003 match(Op0, m_Sub(m_Constant(C2), m_Specific(X))))) {
2004 if (ConstantExpr::getNot(C1) == C2) {
2005 // (X + C) & (~C - X) --> (X + C) & ~(X + C) --> 0
2006 // (X + C) | (~C - X) --> (X + C) | ~(X + C) --> -1
2007 // (X + C) ^ (~C - X) --> (X + C) ^ ~(X + C) --> -1
2008 Type *Ty = Op0->getType();
2009 return Opcode == Instruction::And ? ConstantInt::getNullValue(Ty)
2011 }
2012 }
2013 return nullptr;
2014}
2015
2016// Commutative patterns for and that will be tried with both operand orders.
2018 const SimplifyQuery &Q,
2019 unsigned MaxRecurse) {
2020 // ~A & A = 0
2021 if (match(Op0, m_Not(m_Specific(Op1))))
2022 return Constant::getNullValue(Op0->getType());
2023
2024 // (A | ?) & A = A
2025 if (match(Op0, m_c_Or(m_Specific(Op1), m_Value())))
2026 return Op1;
2027
2028 // (X | ~Y) & (X | Y) --> X
2029 Value *X, *Y;
2030 if (match(Op0, m_c_Or(m_Value(X), m_Not(m_Value(Y)))) &&
2031 match(Op1, m_c_Or(m_Specific(X), m_Specific(Y))))
2032 return X;
2033
2034 // If we have a multiplication overflow check that is being 'and'ed with a
2035 // check that one of the multipliers is not zero, we can omit the 'and', and
2036 // only keep the overflow check.
2037 if (isCheckForZeroAndMulWithOverflow(Op0, Op1, true))
2038 return Op1;
2039
2040 // -A & A = A if A is a power of two or zero.
2041 if (match(Op0, m_Neg(m_Specific(Op1))) &&
2042 isKnownToBeAPowerOfTwo(Op1, Q.DL, /*OrZero*/ true, Q.AC, Q.CxtI, Q.DT))
2043 return Op1;
2044
2045 // This is a similar pattern used for checking if a value is a power-of-2:
2046 // (A - 1) & A --> 0 (if A is a power-of-2 or 0)
2047 if (match(Op0, m_Add(m_Specific(Op1), m_AllOnes())) &&
2048 isKnownToBeAPowerOfTwo(Op1, Q.DL, /*OrZero*/ true, Q.AC, Q.CxtI, Q.DT))
2049 return Constant::getNullValue(Op1->getType());
2050
2051 // (x << N) & ((x << M) - 1) --> 0, where x is known to be a power of 2 and
2052 // M <= N.
2053 const APInt *Shift1, *Shift2;
2054 if (match(Op0, m_Shl(m_Value(X), m_APInt(Shift1))) &&
2055 match(Op1, m_Add(m_Shl(m_Specific(X), m_APInt(Shift2)), m_AllOnes())) &&
2056 isKnownToBeAPowerOfTwo(X, Q.DL, /*OrZero*/ true, Q.AC, Q.CxtI) &&
2057 Shift1->uge(*Shift2))
2058 return Constant::getNullValue(Op0->getType());
2059
2060 if (Value *V =
2061 simplifyAndOrWithICmpEq(Instruction::And, Op0, Op1, Q, MaxRecurse))
2062 return V;
2063
2064 return nullptr;
2065}
2066
2067/// Given operands for an And, see if we can fold the result.
2068/// If not, this returns null.
2069static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
2070 unsigned MaxRecurse) {
2071 if (Constant *C = foldOrCommuteConstant(Instruction::And, Op0, Op1, Q))
2072 return C;
2073
2074 // X & poison -> poison
2075 if (isa<PoisonValue>(Op1))
2076 return Op1;
2077
2078 // X & undef -> 0
2079 if (Q.isUndefValue(Op1))
2080 return Constant::getNullValue(Op0->getType());
2081
2082 // X & X = X
2083 if (Op0 == Op1)
2084 return Op0;
2085
2086 // X & 0 = 0
2087 if (match(Op1, m_Zero()))
2088 return Constant::getNullValue(Op0->getType());
2089
2090 // X & -1 = X
2091 if (match(Op1, m_AllOnes()))
2092 return Op0;
2093
2094 if (Value *Res = simplifyAndCommutative(Op0, Op1, Q, MaxRecurse))
2095 return Res;
2096 if (Value *Res = simplifyAndCommutative(Op1, Op0, Q, MaxRecurse))
2097 return Res;
2098
2099 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::And))
2100 return V;
2101
2102 // A mask that only clears known zeros of a shifted value is a no-op.
2103 const APInt *Mask;
2104 const APInt *ShAmt;
2105 Value *X, *Y;
2106 if (match(Op1, m_APInt(Mask))) {
2107 // If all bits in the inverted and shifted mask are clear:
2108 // and (shl X, ShAmt), Mask --> shl X, ShAmt
2109 if (match(Op0, m_Shl(m_Value(X), m_APInt(ShAmt))) &&
2110 (~(*Mask)).lshr(*ShAmt).isZero())
2111 return Op0;
2112
2113 // If all bits in the inverted and shifted mask are clear:
2114 // and (lshr X, ShAmt), Mask --> lshr X, ShAmt
2115 if (match(Op0, m_LShr(m_Value(X), m_APInt(ShAmt))) &&
2116 (~(*Mask)).shl(*ShAmt).isZero())
2117 return Op0;
2118 }
2119
2120 // and 2^x-1, 2^C --> 0 where x <= C.
2121 const APInt *PowerC;
2122 Value *Shift;
2123 if (match(Op1, m_Power2(PowerC)) &&
2124 match(Op0, m_Add(m_Value(Shift), m_AllOnes())) &&
2125 isKnownToBeAPowerOfTwo(Shift, Q.DL, /*OrZero*/ false, Q.AC, Q.CxtI,
2126 Q.DT)) {
2127 KnownBits Known = computeKnownBits(Shift, Q);
2128 // Use getActiveBits() to make use of the additional power of two knowledge
2129 if (PowerC->getActiveBits() >= Known.getMaxValue().getActiveBits())
2130 return ConstantInt::getNullValue(Op1->getType());
2131 }
2132
2133 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, true))
2134 return V;
2135
2136 // Try some generic simplifications for associative operations.
2137 if (Value *V =
2138 simplifyAssociativeBinOp(Instruction::And, Op0, Op1, Q, MaxRecurse))
2139 return V;
2140
2141 // And distributes over Or. Try some generic simplifications based on this.
2142 if (Value *V = expandCommutativeBinOp(Instruction::And, Op0, Op1,
2143 Instruction::Or, Q, MaxRecurse))
2144 return V;
2145
2146 // And distributes over Xor. Try some generic simplifications based on this.
2147 if (Value *V = expandCommutativeBinOp(Instruction::And, Op0, Op1,
2148 Instruction::Xor, Q, MaxRecurse))
2149 return V;
2150
2151 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) {
2152 if (Op0->getType()->isIntOrIntVectorTy(1)) {
2153 // A & (A && B) -> A && B
2154 if (match(Op1, m_Select(m_Specific(Op0), m_Value(), m_Zero())))
2155 return Op1;
2156 else if (match(Op0, m_Select(m_Specific(Op1), m_Value(), m_Zero())))
2157 return Op0;
2158 }
2159 // If the operation is with the result of a select instruction, check
2160 // whether operating on either branch of the select always yields the same
2161 // value.
2162 if (Value *V =
2163 threadBinOpOverSelect(Instruction::And, Op0, Op1, Q, MaxRecurse))
2164 return V;
2165 }
2166
2167 // If the operation is with the result of a phi instruction, check whether
2168 // operating on all incoming values of the phi always yields the same value.
2169 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
2170 if (Value *V =
2171 threadBinOpOverPHI(Instruction::And, Op0, Op1, Q, MaxRecurse))
2172 return V;
2173
2174 // Assuming the effective width of Y is not larger than A, i.e. all bits
2175 // from X and Y are disjoint in (X << A) | Y,
2176 // if the mask of this AND op covers all bits of X or Y, while it covers
2177 // no bits from the other, we can bypass this AND op. E.g.,
2178 // ((X << A) | Y) & Mask -> Y,
2179 // if Mask = ((1 << effective_width_of(Y)) - 1)
2180 // ((X << A) | Y) & Mask -> X << A,
2181 // if Mask = ((1 << effective_width_of(X)) - 1) << A
2182 // SimplifyDemandedBits in InstCombine can optimize the general case.
2183 // This pattern aims to help other passes for a common case.
2184 Value *XShifted;
2185 if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(Mask)) &&
2187 m_Value(XShifted)),
2188 m_Value(Y)))) {
2189 const unsigned Width = Op0->getType()->getScalarSizeInBits();
2190 const unsigned ShftCnt = ShAmt->getLimitedValue(Width);
2191 const KnownBits YKnown = computeKnownBits(Y, Q);
2192 const unsigned EffWidthY = YKnown.countMaxActiveBits();
2193 if (EffWidthY <= ShftCnt) {
2194 const KnownBits XKnown = computeKnownBits(X, Q);
2195 const unsigned EffWidthX = XKnown.countMaxActiveBits();
2196 const APInt EffBitsY = APInt::getLowBitsSet(Width, EffWidthY);
2197 const APInt EffBitsX = APInt::getLowBitsSet(Width, EffWidthX) << ShftCnt;
2198 // If the mask is extracting all bits from X or Y as is, we can skip
2199 // this AND op.
2200 if (EffBitsY.isSubsetOf(*Mask) && !EffBitsX.intersects(*Mask))
2201 return Y;
2202 if (EffBitsX.isSubsetOf(*Mask) && !EffBitsY.intersects(*Mask))
2203 return XShifted;
2204 }
2205 }
2206
2207 // ((X | Y) ^ X ) & ((X | Y) ^ Y) --> 0
2208 // ((X | Y) ^ Y ) & ((X | Y) ^ X) --> 0
2210 if (match(Op0, m_c_Xor(m_Value(X),
2212 m_c_Or(m_Deferred(X), m_Value(Y))))) &&
2214 return Constant::getNullValue(Op0->getType());
2215
2216 const APInt *C1;
2217 Value *A;
2218 // (A ^ C) & (A ^ ~C) -> 0
2219 if (match(Op0, m_Xor(m_Value(A), m_APInt(C1))) &&
2220 match(Op1, m_Xor(m_Specific(A), m_SpecificInt(~*C1))))
2221 return Constant::getNullValue(Op0->getType());
2222
2223 if (Op0->getType()->isIntOrIntVectorTy(1)) {
2224 if (std::optional<bool> Implied = isImpliedCondition(Op0, Op1, Q.DL)) {
2225 // If Op0 is true implies Op1 is true, then Op0 is a subset of Op1.
2226 if (*Implied == true)
2227 return Op0;
2228 // If Op0 is true implies Op1 is false, then they are not true together.
2229 if (*Implied == false)
2230 return ConstantInt::getFalse(Op0->getType());
2231 }
2232 if (std::optional<bool> Implied = isImpliedCondition(Op1, Op0, Q.DL)) {
2233 // If Op1 is true implies Op0 is true, then Op1 is a subset of Op0.
2234 if (*Implied)
2235 return Op1;
2236 // If Op1 is true implies Op0 is false, then they are not true together.
2237 if (!*Implied)
2238 return ConstantInt::getFalse(Op1->getType());
2239 }
2240 }
2241
2242 if (Value *V = simplifyByDomEq(Instruction::And, Op0, Op1, Q, MaxRecurse))
2243 return V;
2244
2245 return nullptr;
2246}
2247
2249 return ::simplifyAndInst(Op0, Op1, Q, RecursionLimit);
2250}
2251
2252// TODO: Many of these folds could use LogicalAnd/LogicalOr.
2254 assert(X->getType() == Y->getType() && "Expected same type for 'or' ops");
2255 Type *Ty = X->getType();
2256
2257 // X | ~X --> -1
2258 if (match(Y, m_Not(m_Specific(X))))
2260
2261 // X | ~(X & ?) = -1
2262 if (match(Y, m_Not(m_c_And(m_Specific(X), m_Value()))))
2264
2265 // X | (X & ?) --> X
2266 if (match(Y, m_c_And(m_Specific(X), m_Value())))
2267 return X;
2268
2269 Value *A, *B;
2270
2271 // (A ^ B) | (A | B) --> A | B
2272 // (A ^ B) | (B | A) --> B | A
2273 if (match(X, m_Xor(m_Value(A), m_Value(B))) &&
2275 return Y;
2276
2277 // ~(A ^ B) | (A | B) --> -1
2278 // ~(A ^ B) | (B | A) --> -1
2279 if (match(X, m_Not(m_Xor(m_Value(A), m_Value(B)))) &&
2282
2283 // (A & ~B) | (A ^ B) --> A ^ B
2284 // (~B & A) | (A ^ B) --> A ^ B
2285 // (A & ~B) | (B ^ A) --> B ^ A
2286 // (~B & A) | (B ^ A) --> B ^ A
2287 if (match(X, m_c_And(m_Value(A), m_Not(m_Value(B)))) &&
2289 return Y;
2290
2291 // (~A ^ B) | (A & B) --> ~A ^ B
2292 // (B ^ ~A) | (A & B) --> B ^ ~A
2293 // (~A ^ B) | (B & A) --> ~A ^ B
2294 // (B ^ ~A) | (B & A) --> B ^ ~A
2295 if (match(X, m_c_Xor(m_Not(m_Value(A)), m_Value(B))) &&
2297 return X;
2298
2299 // (~A | B) | (A ^ B) --> -1
2300 // (~A | B) | (B ^ A) --> -1
2301 // (B | ~A) | (A ^ B) --> -1
2302 // (B | ~A) | (B ^ A) --> -1
2303 if (match(X, m_c_Or(m_Not(m_Value(A)), m_Value(B))) &&
2306
2307 // (~A & B) | ~(A | B) --> ~A
2308 // (~A & B) | ~(B | A) --> ~A
2309 // (B & ~A) | ~(A | B) --> ~A
2310 // (B & ~A) | ~(B | A) --> ~A
2311 Value *NotA;
2313 m_Value(B))) &&
2315 return NotA;
2316 // The same is true of Logical And
2317 // TODO: This could share the logic of the version above if there was a
2318 // version of LogicalAnd that allowed more than just i1 types.
2320 m_Value(B))) &&
2322 return NotA;
2323
2324 // ~(A ^ B) | (A & B) --> ~(A ^ B)
2325 // ~(A ^ B) | (B & A) --> ~(A ^ B)
2326 Value *NotAB;
2328 m_Value(NotAB))) &&
2330 return NotAB;
2331
2332 // ~(A & B) | (A ^ B) --> ~(A & B)
2333 // ~(A & B) | (B ^ A) --> ~(A & B)
2335 m_Value(NotAB))) &&
2337 return NotAB;
2338
2339 return nullptr;
2340}
2341
2342/// Given operands for an Or, see if we can fold the result.
2343/// If not, this returns null.
2344static Value *simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
2345 unsigned MaxRecurse) {
2346 if (Constant *C = foldOrCommuteConstant(Instruction::Or, Op0, Op1, Q))
2347 return C;
2348
2349 // X | poison -> poison
2350 if (isa<PoisonValue>(Op1))
2351 return Op1;
2352
2353 // X | undef -> -1
2354 // X | -1 = -1
2355 // Do not return Op1 because it may contain undef elements if it's a vector.
2356 if (Q.isUndefValue(Op1) || match(Op1, m_AllOnes()))
2357 return Constant::getAllOnesValue(Op0->getType());
2358
2359 // X | X = X
2360 // X | 0 = X
2361 if (Op0 == Op1 || match(Op1, m_Zero()))
2362 return Op0;
2363
2364 if (Value *R = simplifyOrLogic(Op0, Op1))
2365 return R;
2366 if (Value *R = simplifyOrLogic(Op1, Op0))
2367 return R;
2368
2369 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::Or))
2370 return V;
2371
2372 // Rotated -1 is still -1:
2373 // (-1 << X) | (-1 >> (C - X)) --> -1
2374 // (-1 >> X) | (-1 << (C - X)) --> -1
2375 // ...with C <= bitwidth (and commuted variants).
2376 Value *X, *Y;
2377 if ((match(Op0, m_Shl(m_AllOnes(), m_Value(X))) &&
2378 match(Op1, m_LShr(m_AllOnes(), m_Value(Y)))) ||
2379 (match(Op1, m_Shl(m_AllOnes(), m_Value(X))) &&
2380 match(Op0, m_LShr(m_AllOnes(), m_Value(Y))))) {
2381 const APInt *C;
2382 if ((match(X, m_Sub(m_APInt(C), m_Specific(Y))) ||
2383 match(Y, m_Sub(m_APInt(C), m_Specific(X)))) &&
2384 C->ule(X->getType()->getScalarSizeInBits())) {
2385 return ConstantInt::getAllOnesValue(X->getType());
2386 }
2387 }
2388
2389 // A funnel shift (rotate) can be decomposed into simpler shifts. See if we
2390 // are mixing in another shift that is redundant with the funnel shift.
2391
2392 // (fshl X, ?, Y) | (shl X, Y) --> fshl X, ?, Y
2393 // (shl X, Y) | (fshl X, ?, Y) --> fshl X, ?, Y
2394 if (match(Op0,
2396 match(Op1, m_Shl(m_Specific(X), m_Specific(Y))))
2397 return Op0;
2398 if (match(Op1,
2400 match(Op0, m_Shl(m_Specific(X), m_Specific(Y))))
2401 return Op1;
2402
2403 // (fshr ?, X, Y) | (lshr X, Y) --> fshr ?, X, Y
2404 // (lshr X, Y) | (fshr ?, X, Y) --> fshr ?, X, Y
2405 if (match(Op0,
2407 match(Op1, m_LShr(m_Specific(X), m_Specific(Y))))
2408 return Op0;
2409 if (match(Op1,
2411 match(Op0, m_LShr(m_Specific(X), m_Specific(Y))))
2412 return Op1;
2413
2414 if (Value *V =
2415 simplifyAndOrWithICmpEq(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2416 return V;
2417 if (Value *V =
2418 simplifyAndOrWithICmpEq(Instruction::Or, Op1, Op0, Q, MaxRecurse))
2419 return V;
2420
2421 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false))
2422 return V;
2423
2424 // If we have a multiplication overflow check that is being 'and'ed with a
2425 // check that one of the multipliers is not zero, we can omit the 'and', and
2426 // only keep the overflow check.
2427 if (isCheckForZeroAndMulWithOverflow(Op0, Op1, false))
2428 return Op1;
2429 if (isCheckForZeroAndMulWithOverflow(Op1, Op0, false))
2430 return Op0;
2431
2432 // Try some generic simplifications for associative operations.
2433 if (Value *V =
2434 simplifyAssociativeBinOp(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2435 return V;
2436
2437 // Or distributes over And. Try some generic simplifications based on this.
2438 if (Value *V = expandCommutativeBinOp(Instruction::Or, Op0, Op1,
2439 Instruction::And, Q, MaxRecurse))
2440 return V;
2441
2442 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) {
2443 if (Op0->getType()->isIntOrIntVectorTy(1)) {
2444 // A | (A || B) -> A || B
2445 if (match(Op1, m_Select(m_Specific(Op0), m_One(), m_Value())))
2446 return Op1;
2447 else if (match(Op0, m_Select(m_Specific(Op1), m_One(), m_Value())))
2448 return Op0;
2449 }
2450 // If the operation is with the result of a select instruction, check
2451 // whether operating on either branch of the select always yields the same
2452 // value.
2453 if (Value *V =
2454 threadBinOpOverSelect(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2455 return V;
2456 }
2457
2458 // (A & C1)|(B & C2)
2459 Value *A, *B;
2460 const APInt *C1, *C2;
2461 if (match(Op0, m_And(m_Value(A), m_APInt(C1))) &&
2462 match(Op1, m_And(m_Value(B), m_APInt(C2)))) {
2463 if (*C1 == ~*C2) {
2464 // (A & C1)|(B & C2)
2465 // If we have: ((V + N) & C1) | (V & C2)
2466 // .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0
2467 // replace with V+N.
2468 Value *N;
2469 if (C2->isMask() && // C2 == 0+1+
2471 // Add commutes, try both ways.
2472 if (MaskedValueIsZero(N, *C2, Q))
2473 return A;
2474 }
2475 // Or commutes, try both ways.
2476 if (C1->isMask() && match(B, m_c_Add(m_Specific(A), m_Value(N)))) {
2477 // Add commutes, try both ways.
2478 if (MaskedValueIsZero(N, *C1, Q))
2479 return B;
2480 }
2481 }
2482 }
2483
2484 // If the operation is with the result of a phi instruction, check whether
2485 // operating on all incoming values of the phi always yields the same value.
2486 if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
2487 if (Value *V = threadBinOpOverPHI(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2488 return V;
2489
2490 // (A ^ C) | (A ^ ~C) -> -1, i.e. all bits set to one.
2491 if (match(Op0, m_Xor(m_Value(A), m_APInt(C1))) &&
2492 match(Op1, m_Xor(m_Specific(A), m_SpecificInt(~*C1))))
2493 return Constant::getAllOnesValue(Op0->getType());
2494
2495 if (Op0->getType()->isIntOrIntVectorTy(1)) {
2496 if (std::optional<bool> Implied =
2497 isImpliedCondition(Op0, Op1, Q.DL, false)) {
2498 // If Op0 is false implies Op1 is false, then Op1 is a subset of Op0.
2499 if (*Implied == false)
2500 return Op0;
2501 // If Op0 is false implies Op1 is true, then at least one is always true.
2502 if (*Implied == true)
2503 return ConstantInt::getTrue(Op0->getType());
2504 }
2505 if (std::optional<bool> Implied =
2506 isImpliedCondition(Op1, Op0, Q.DL, false)) {
2507 // If Op1 is false implies Op0 is false, then Op0 is a subset of Op1.
2508 if (*Implied == false)
2509 return Op1;
2510 // If Op1 is false implies Op0 is true, then at least one is always true.
2511 if (*Implied == true)
2512 return ConstantInt::getTrue(Op1->getType());
2513 }
2514 }
2515
2516 if (Value *V = simplifyByDomEq(Instruction::Or, Op0, Op1, Q, MaxRecurse))
2517 return V;
2518
2519 return nullptr;
2520}
2521
2523 return ::simplifyOrInst(Op0, Op1, Q, RecursionLimit);
2524}
2525
2526/// Given operands for a Xor, see if we can fold the result.
2527/// If not, this returns null.
2528static Value *simplifyXorInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
2529 unsigned MaxRecurse) {
2530 if (Constant *C = foldOrCommuteConstant(Instruction::Xor, Op0, Op1, Q))
2531 return C;
2532
2533 // X ^ poison -> poison
2534 if (isa<PoisonValue>(Op1))
2535 return Op1;
2536
2537 // A ^ undef -> undef
2538 if (Q.isUndefValue(Op1))
2539 return Op1;
2540
2541 // A ^ 0 = A
2542 if (match(Op1, m_Zero()))
2543 return Op0;
2544
2545 // A ^ A = 0
2546 if (Op0 == Op1)
2547 return Constant::getNullValue(Op0->getType());
2548
2549 // A ^ ~A = ~A ^ A = -1
2550 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0))))
2551 return Constant::getAllOnesValue(Op0->getType());
2552
2553 auto foldAndOrNot = [](Value *X, Value *Y) -> Value * {
2554 Value *A, *B;
2555 // (~A & B) ^ (A | B) --> A -- There are 8 commuted variants.
2556 if (match(X, m_c_And(m_Not(m_Value(A)), m_Value(B))) &&
2558 return A;
2559
2560 // (~A | B) ^ (A & B) --> ~A -- There are 8 commuted variants.
2561 // The 'not' op must contain a complete -1 operand (no undef elements for
2562 // vector) for the transform to be safe.
2563 Value *NotA;
2565 m_Value(B))) &&
2567 return NotA;
2568
2569 return nullptr;
2570 };
2571 if (Value *R = foldAndOrNot(Op0, Op1))
2572 return R;
2573 if (Value *R = foldAndOrNot(Op1, Op0))
2574 return R;
2575
2576 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::Xor))
2577 return V;
2578
2579 // Try some generic simplifications for associative operations.
2580 if (Value *V =
2581 simplifyAssociativeBinOp(Instruction::Xor, Op0, Op1, Q, MaxRecurse))
2582 return V;
2583
2584 // Threading Xor over selects and phi nodes is pointless, so don't bother.
2585 // Threading over the select in "A ^ select(cond, B, C)" means evaluating
2586 // "A^B" and "A^C" and seeing if they are equal; but they are equal if and
2587 // only if B and C are equal. If B and C are equal then (since we assume
2588 // that operands have already been simplified) "select(cond, B, C)" should
2589 // have been simplified to the common value of B and C already. Analysing
2590 // "A^B" and "A^C" thus gains nothing, but costs compile time. Similarly
2591 // for threading over phi nodes.
2592
2593 if (Value *V = simplifyByDomEq(Instruction::Xor, Op0, Op1, Q, MaxRecurse))
2594 return V;
2595
2596 // (xor (sub nuw C_Mask, X), C_Mask) -> X
2597 {
2598 Value *X;
2599 if (match(Op0, m_NUWSub(m_Specific(Op1), m_Value(X))) &&
2600 match(Op1, m_LowBitMask()))
2601 return X;
2602 }
2603
2604 return nullptr;
2605}
2606
2608 return ::simplifyXorInst(Op0, Op1, Q, RecursionLimit);
2609}
2610
2612 return CmpInst::makeCmpResultType(Op->getType());
2613}
2614
2615/// Rummage around inside V looking for something equivalent to the comparison
2616/// "LHS Pred RHS". Return such a value if found, otherwise return null.
2617/// Helper function for analyzing max/min idioms.
2619 Value *LHS, Value *RHS) {
2621 if (!SI)
2622 return nullptr;
2623 CmpInst *Cmp = dyn_cast<CmpInst>(SI->getCondition());
2624 if (!Cmp)
2625 return nullptr;
2626 Value *CmpLHS = Cmp->getOperand(0), *CmpRHS = Cmp->getOperand(1);
2627 if (Pred == Cmp->getPredicate() && LHS == CmpLHS && RHS == CmpRHS)
2628 return Cmp;
2629 if (Pred == CmpInst::getSwappedPredicate(Cmp->getPredicate()) &&
2630 LHS == CmpRHS && RHS == CmpLHS)
2631 return Cmp;
2632 return nullptr;
2633}
2634
2635/// Return true if the underlying object (storage) must be disjoint from
2636/// storage returned by any noalias return call.
2637static bool isAllocDisjoint(const Value *V) {
2638 // For allocas, we consider only static ones (dynamic
2639 // allocas might be transformed into calls to malloc not simultaneously
2640 // live with the compared-to allocation). For globals, we exclude symbols
2641 // that might be resolve lazily to symbols in another dynamically-loaded
2642 // library (and, thus, could be malloc'ed by the implementation).
2643 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V))
2644 return AI->isStaticAlloca();
2645 if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
2646 return (GV->hasLocalLinkage() || GV->hasHiddenVisibility() ||
2647 GV->hasProtectedVisibility() || GV->hasGlobalUnnamedAddr()) &&
2648 !GV->isThreadLocal();
2649 if (const Argument *A = dyn_cast<Argument>(V))
2650 return A->hasByValAttr();
2651 return false;
2652}
2653
2654/// Return true if V1 and V2 are each the base of some distict storage region
2655/// [V, object_size(V)] which do not overlap. Note that zero sized regions
2656/// *are* possible, and that zero sized regions do not overlap with any other.
2657static bool haveNonOverlappingStorage(const Value *V1, const Value *V2) {
2658 // Global variables always exist, so they always exist during the lifetime
2659 // of each other and all allocas. Global variables themselves usually have
2660 // non-overlapping storage, but since their addresses are constants, the
2661 // case involving two globals does not reach here and is instead handled in
2662 // constant folding.
2663 //
2664 // Two different allocas usually have different addresses...
2665 //
2666 // However, if there's an @llvm.stackrestore dynamically in between two
2667 // allocas, they may have the same address. It's tempting to reduce the
2668 // scope of the problem by only looking at *static* allocas here. That would
2669 // cover the majority of allocas while significantly reducing the likelihood
2670 // of having an @llvm.stackrestore pop up in the middle. However, it's not
2671 // actually impossible for an @llvm.stackrestore to pop up in the middle of
2672 // an entry block. Also, if we have a block that's not attached to a
2673 // function, we can't tell if it's "static" under the current definition.
2674 // Theoretically, this problem could be fixed by creating a new kind of
2675 // instruction kind specifically for static allocas. Such a new instruction
2676 // could be required to be at the top of the entry block, thus preventing it
2677 // from being subject to a @llvm.stackrestore. Instcombine could even
2678 // convert regular allocas into these special allocas. It'd be nifty.
2679 // However, until then, this problem remains open.
2680 //
2681 // So, we'll assume that two non-empty allocas have different addresses
2682 // for now.
2683 auto isByValArg = [](const Value *V) {
2684 const Argument *A = dyn_cast<Argument>(V);
2685 return A && A->hasByValAttr();
2686 };
2687
2688 // Byval args are backed by store which does not overlap with each other,
2689 // allocas, or globals.
2690 if (isByValArg(V1))
2691 return isa<AllocaInst>(V2) || isa<GlobalVariable>(V2) || isByValArg(V2);
2692 if (isByValArg(V2))
2693 return isa<AllocaInst>(V1) || isa<GlobalVariable>(V1) || isByValArg(V1);
2694
2695 return isa<AllocaInst>(V1) &&
2697}
2698
2699// A significant optimization not implemented here is assuming that alloca
2700// addresses are not equal to incoming argument values. They don't *alias*,
2701// as we say, but that doesn't mean they aren't equal, so we take a
2702// conservative approach.
2703//
2704// This is inspired in part by C++11 5.10p1:
2705// "Two pointers of the same type compare equal if and only if they are both
2706// null, both point to the same function, or both represent the same
2707// address."
2708//
2709// This is pretty permissive.
2710//
2711// It's also partly due to C11 6.5.9p6:
2712// "Two pointers compare equal if and only if both are null pointers, both are
2713// pointers to the same object (including a pointer to an object and a
2714// subobject at its beginning) or function, both are pointers to one past the
2715// last element of the same array object, or one is a pointer to one past the
2716// end of one array object and the other is a pointer to the start of a
2717// different array object that happens to immediately follow the first array
2718// object in the address space.)
2719//
2720// C11's version is more restrictive, however there's no reason why an argument
2721// couldn't be a one-past-the-end value for a stack object in the caller and be
2722// equal to the beginning of a stack object in the callee.
2723//
2724// If the C and C++ standards are ever made sufficiently restrictive in this
2725// area, it may be possible to update LLVM's semantics accordingly and reinstate
2726// this optimization.
2728 const SimplifyQuery &Q) {
2729 assert(LHS->getType() == RHS->getType() && "Must have same types");
2730 const DataLayout &DL = Q.DL;
2731 const TargetLibraryInfo *TLI = Q.TLI;
2732
2733 // We fold equality and unsigned predicates on pointer comparisons, but forbid
2734 // signed predicates since a GEP with inbounds could cross the sign boundary.
2735 if (CmpInst::isSigned(Pred))
2736 return nullptr;
2737
2738 // We have to switch to a signed predicate to handle negative indices from
2739 // the base pointer.
2740 Pred = ICmpInst::getSignedPredicate(Pred);
2741
2742 // Strip off any constant offsets so that we can reason about them.
2743 // It's tempting to use getUnderlyingObject or even just stripInBoundsOffsets
2744 // here and compare base addresses like AliasAnalysis does, however there are
2745 // numerous hazards. AliasAnalysis and its utilities rely on special rules
2746 // governing loads and stores which don't apply to icmps. Also, AliasAnalysis
2747 // doesn't need to guarantee pointer inequality when it says NoAlias.
2748
2749 // Even if an non-inbounds GEP occurs along the path we can still optimize
2750 // equality comparisons concerning the result.
2751 bool AllowNonInbounds = ICmpInst::isEquality(Pred);
2752 unsigned IndexSize = DL.getIndexTypeSizeInBits(LHS->getType());
2753 APInt LHSOffset(IndexSize, 0), RHSOffset(IndexSize, 0);
2754 LHS = LHS->stripAndAccumulateConstantOffsets(DL, LHSOffset, AllowNonInbounds);
2755 RHS = RHS->stripAndAccumulateConstantOffsets(DL, RHSOffset, AllowNonInbounds);
2756
2757 // If LHS and RHS are related via constant offsets to the same base
2758 // value, we can replace it with an icmp which just compares the offsets.
2759 if (LHS == RHS)
2760 return ConstantInt::get(getCompareTy(LHS),
2761 ICmpInst::compare(LHSOffset, RHSOffset, Pred));
2762
2763 // Various optimizations for (in)equality comparisons.
2764 if (ICmpInst::isEquality(Pred)) {
2765 // Different non-empty allocations that exist at the same time have
2766 // different addresses (if the program can tell). If the offsets are
2767 // within the bounds of their allocations (and not one-past-the-end!
2768 // so we can't use inbounds!), and their allocations aren't the same,
2769 // the pointers are not equal.
2771 uint64_t LHSSize, RHSSize;
2772 ObjectSizeOpts Opts;
2774 auto *F = [](Value *V) -> Function * {
2775 if (auto *I = dyn_cast<Instruction>(V))
2776 return I->getFunction();
2777 if (auto *A = dyn_cast<Argument>(V))
2778 return A->getParent();
2779 return nullptr;
2780 }(LHS);
2781 Opts.NullIsUnknownSize = F ? NullPointerIsDefined(F) : true;
2782 if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) && LHSSize != 0 &&
2783 getObjectSize(RHS, RHSSize, DL, TLI, Opts) && RHSSize != 0) {
2784 APInt Dist = LHSOffset - RHSOffset;
2785 if (Dist.isNonNegative() ? Dist.ult(LHSSize) : (-Dist).ult(RHSSize))
2786 return ConstantInt::get(getCompareTy(LHS),
2788 }
2789 }
2790
2791 // If one side of the equality comparison must come from a noalias call
2792 // (meaning a system memory allocation function), and the other side must
2793 // come from a pointer that cannot overlap with dynamically-allocated
2794 // memory within the lifetime of the current function (allocas, byval
2795 // arguments, globals), then determine the comparison result here.
2796 SmallVector<const Value *, 8> LHSUObjs, RHSUObjs;
2797 getUnderlyingObjects(LHS, LHSUObjs);
2798 getUnderlyingObjects(RHS, RHSUObjs);
2799
2800 // Is the set of underlying objects all noalias calls?
2801 auto IsNAC = [](ArrayRef<const Value *> Objects) {
2802 return all_of(Objects, isNoAliasCall);
2803 };
2804
2805 // Is the set of underlying objects all things which must be disjoint from
2806 // noalias calls. We assume that indexing from such disjoint storage
2807 // into the heap is undefined, and thus offsets can be safely ignored.
2808 auto IsAllocDisjoint = [](ArrayRef<const Value *> Objects) {
2809 return all_of(Objects, ::isAllocDisjoint);
2810 };
2811
2812 if ((IsNAC(LHSUObjs) && IsAllocDisjoint(RHSUObjs)) ||
2813 (IsNAC(RHSUObjs) && IsAllocDisjoint(LHSUObjs)))
2814 return ConstantInt::get(getCompareTy(LHS),
2816
2817 // Fold comparisons for non-escaping pointer even if the allocation call
2818 // cannot be elided. We cannot fold malloc comparison to null. Also, the
2819 // dynamic allocation call could be either of the operands. Note that
2820 // the other operand can not be based on the alloc - if it were, then
2821 // the cmp itself would be a capture.
2822 Value *MI = nullptr;
2823 if (isAllocLikeFn(LHS, TLI) && llvm::isKnownNonZero(RHS, Q))
2824 MI = LHS;
2825 else if (isAllocLikeFn(RHS, TLI) && llvm::isKnownNonZero(LHS, Q))
2826 MI = RHS;
2827 if (MI) {
2828 // FIXME: This is incorrect, see PR54002. While we can assume that the
2829 // allocation is at an address that makes the comparison false, this
2830 // requires that *all* comparisons to that address be false, which
2831 // InstSimplify cannot guarantee.
2832 struct CustomCaptureTracker : public CaptureTracker {
2833 bool Captured = false;
2834 void tooManyUses() override { Captured = true; }
2835 Action captured(const Use *U, UseCaptureInfo CI) override {
2836 // TODO(captures): Use UseCaptureInfo.
2837 if (auto *ICmp = dyn_cast<ICmpInst>(U->getUser())) {
2838 // Comparison against value stored in global variable. Given the
2839 // pointer does not escape, its value cannot be guessed and stored
2840 // separately in a global variable.
2841 unsigned OtherIdx = 1 - U->getOperandNo();
2842 auto *LI = dyn_cast<LoadInst>(ICmp->getOperand(OtherIdx));
2843 if (LI && isa<GlobalVariable>(LI->getPointerOperand()))
2844 return Continue;
2845 }
2846
2847 Captured = true;
2848 return Stop;
2849 }
2850 };
2851 CustomCaptureTracker Tracker;
2852 PointerMayBeCaptured(MI, &Tracker);
2853 if (!Tracker.Captured)
2854 return ConstantInt::get(getCompareTy(LHS),
2856 }
2857 }
2858
2859 // Otherwise, fail.
2860 return nullptr;
2861}
2862
2863/// Fold an icmp when its operands have i1 scalar type.
2865 const SimplifyQuery &Q) {
2866 Type *ITy = getCompareTy(LHS); // The return type.
2867 Type *OpTy = LHS->getType(); // The operand type.
2868 if (!OpTy->isIntOrIntVectorTy(1))
2869 return nullptr;
2870
2871 // A boolean compared to true/false can be reduced in 14 out of the 20
2872 // (10 predicates * 2 constants) possible combinations. The other
2873 // 6 cases require a 'not' of the LHS.
2874
2875 auto ExtractNotLHS = [](Value *V) -> Value * {
2876 Value *X;
2877 if (match(V, m_Not(m_Value(X))))
2878 return X;
2879 return nullptr;
2880 };
2881
2882 if (match(RHS, m_Zero())) {
2883 switch (Pred) {
2884 case CmpInst::ICMP_NE: // X != 0 -> X
2885 case CmpInst::ICMP_UGT: // X >u 0 -> X
2886 case CmpInst::ICMP_SLT: // X <s 0 -> X
2887 return LHS;
2888
2889 case CmpInst::ICMP_EQ: // not(X) == 0 -> X != 0 -> X
2890 case CmpInst::ICMP_ULE: // not(X) <=u 0 -> X >u 0 -> X
2891 case CmpInst::ICMP_SGE: // not(X) >=s 0 -> X <s 0 -> X
2892 if (Value *X = ExtractNotLHS(LHS))
2893 return X;
2894 break;
2895
2896 case CmpInst::ICMP_ULT: // X <u 0 -> false
2897 case CmpInst::ICMP_SGT: // X >s 0 -> false
2898 return getFalse(ITy);
2899
2900 case CmpInst::ICMP_UGE: // X >=u 0 -> true
2901 case CmpInst::ICMP_SLE: // X <=s 0 -> true
2902 return getTrue(ITy);
2903
2904 default:
2905 break;
2906 }
2907 } else if (match(RHS, m_One())) {
2908 switch (Pred) {
2909 case CmpInst::ICMP_EQ: // X == 1 -> X
2910 case CmpInst::ICMP_UGE: // X >=u 1 -> X
2911 case CmpInst::ICMP_SLE: // X <=s -1 -> X
2912 return LHS;
2913
2914 case CmpInst::ICMP_NE: // not(X) != 1 -> X == 1 -> X
2915 case CmpInst::ICMP_ULT: // not(X) <=u 1 -> X >=u 1 -> X
2916 case CmpInst::ICMP_SGT: // not(X) >s 1 -> X <=s -1 -> X
2917 if (Value *X = ExtractNotLHS(LHS))
2918 return X;
2919 break;
2920
2921 case CmpInst::ICMP_UGT: // X >u 1 -> false
2922 case CmpInst::ICMP_SLT: // X <s -1 -> false
2923 return getFalse(ITy);
2924
2925 case CmpInst::ICMP_ULE: // X <=u 1 -> true
2926 case CmpInst::ICMP_SGE: // X >=s -1 -> true
2927 return getTrue(ITy);
2928
2929 default:
2930 break;
2931 }
2932 }
2933
2934 switch (Pred) {
2935 default:
2936 break;
2937 case ICmpInst::ICMP_UGE:
2938 if (isImpliedCondition(RHS, LHS, Q.DL).value_or(false))
2939 return getTrue(ITy);
2940 break;
2941 case ICmpInst::ICMP_SGE:
2942 /// For signed comparison, the values for an i1 are 0 and -1
2943 /// respectively. This maps into a truth table of:
2944 /// LHS | RHS | LHS >=s RHS | LHS implies RHS
2945 /// 0 | 0 | 1 (0 >= 0) | 1
2946 /// 0 | 1 | 1 (0 >= -1) | 1
2947 /// 1 | 0 | 0 (-1 >= 0) | 0
2948 /// 1 | 1 | 1 (-1 >= -1) | 1
2949 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false))
2950 return getTrue(ITy);
2951 break;
2952 case ICmpInst::ICMP_ULE:
2953 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false))
2954 return getTrue(ITy);
2955 break;
2956 case ICmpInst::ICMP_SLE:
2957 /// SLE follows the same logic as SGE with the LHS and RHS swapped.
2958 if (isImpliedCondition(RHS, LHS, Q.DL).value_or(false))
2959 return getTrue(ITy);
2960 break;
2961 }
2962
2963 return nullptr;
2964}
2965
2966/// Try hard to fold icmp with zero RHS because this is a common case.
2968 const SimplifyQuery &Q) {
2969 if (!match(RHS, m_Zero()))
2970 return nullptr;
2971
2972 Type *ITy = getCompareTy(LHS); // The return type.
2973 switch (Pred) {
2974 default:
2975 llvm_unreachable("Unknown ICmp predicate!");
2976 case ICmpInst::ICMP_ULT:
2977 return getFalse(ITy);
2978 case ICmpInst::ICMP_UGE:
2979 return getTrue(ITy);
2980 case ICmpInst::ICMP_EQ:
2981 case ICmpInst::ICMP_ULE:
2982 if (isKnownNonZero(LHS, Q))
2983 return getFalse(ITy);
2984 break;
2985 case ICmpInst::ICMP_NE:
2986 case ICmpInst::ICMP_UGT:
2987 if (isKnownNonZero(LHS, Q))
2988 return getTrue(ITy);
2989 break;
2990 case ICmpInst::ICMP_SLT: {
2991 KnownBits LHSKnown = computeKnownBits(LHS, Q);
2992 if (LHSKnown.isNegative())
2993 return getTrue(ITy);
2994 if (LHSKnown.isNonNegative())
2995 return getFalse(ITy);
2996 break;
2997 }
2998 case ICmpInst::ICMP_SLE: {
2999 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3000 if (LHSKnown.isNegative())
3001 return getTrue(ITy);
3002 if (LHSKnown.isNonNegative() && isKnownNonZero(LHS, Q))
3003 return getFalse(ITy);
3004 break;
3005 }
3006 case ICmpInst::ICMP_SGE: {
3007 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3008 if (LHSKnown.isNegative())
3009 return getFalse(ITy);
3010 if (LHSKnown.isNonNegative())
3011 return getTrue(ITy);
3012 break;
3013 }
3014 case ICmpInst::ICMP_SGT: {
3015 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3016 if (LHSKnown.isNegative())
3017 return getFalse(ITy);
3018 if (LHSKnown.isNonNegative() && isKnownNonZero(LHS, Q))
3019 return getTrue(ITy);
3020 break;
3021 }
3022 }
3023
3024 return nullptr;
3025}
3026
3028 Value *RHS, const SimplifyQuery &Q) {
3029 Type *ITy = getCompareTy(RHS); // The return type.
3030
3031 Value *X;
3032 const APInt *C;
3033 if (!match(RHS, m_APIntAllowPoison(C)))
3034 return nullptr;
3035
3036 // Sign-bit checks can be optimized to true/false after unsigned
3037 // floating-point casts:
3038 // icmp slt (bitcast (uitofp X)), 0 --> false
3039 // icmp sgt (bitcast (uitofp X)), -1 --> true
3041 bool TrueIfSigned;
3042 if (isSignBitCheck(Pred, *C, TrueIfSigned))
3043 return ConstantInt::getBool(ITy, !TrueIfSigned);
3044 }
3045
3046 // Rule out tautological comparisons (eg., ult 0 or uge 0).
3048 if (RHS_CR.isEmptySet())
3049 return ConstantInt::getFalse(ITy);
3050 if (RHS_CR.isFullSet())
3051 return ConstantInt::getTrue(ITy);
3052
3053 ConstantRange LHS_CR =
3055 if (!LHS_CR.isFullSet()) {
3056 if (RHS_CR.contains(LHS_CR))
3057 return ConstantInt::getTrue(ITy);
3058 if (RHS_CR.inverse().contains(LHS_CR))
3059 return ConstantInt::getFalse(ITy);
3060 }
3061
3062 // (mul nuw/nsw X, MulC) != C --> true (if C is not a multiple of MulC)
3063 // (mul nuw/nsw X, MulC) == C --> false (if C is not a multiple of MulC)
3064 const APInt *MulC;
3065 if (Q.IIQ.UseInstrInfo && ICmpInst::isEquality(Pred) &&
3067 *MulC != 0 && C->urem(*MulC) != 0) ||
3069 *MulC != 0 && C->srem(*MulC) != 0)))
3070 return ConstantInt::get(ITy, Pred == ICmpInst::ICMP_NE);
3071
3072 if (Pred == ICmpInst::ICMP_UGE && C->isOne() && isKnownNonZero(LHS, Q))
3073 return ConstantInt::getTrue(ITy);
3074
3075 return nullptr;
3076}
3077
3079
3080/// Get values V_i such that V uge V_i (GreaterEq) or V ule V_i (LowerEq).
3083 const SimplifyQuery &Q,
3084 unsigned Depth = 0) {
3085 if (!Res.insert(V).second)
3086 return;
3087
3088 // Can be increased if useful.
3089 if (++Depth > 1)
3090 return;
3091
3092 auto *I = dyn_cast<Instruction>(V);
3093 if (!I)
3094 return;
3095
3096 Value *X, *Y;
3098 if (match(I, m_Or(m_Value(X), m_Value(Y))) ||
3102 }
3103 // X * Y >= X --> true
3104 if (match(I, m_NUWMul(m_Value(X), m_Value(Y)))) {
3105 if (isKnownNonZero(X, Q))
3107 if (isKnownNonZero(Y, Q))
3109 }
3110 } else {
3112 switch (I->getOpcode()) {
3113 case Instruction::And:
3114 getUnsignedMonotonicValues(Res, I->getOperand(0), Type, Q, Depth);
3115 getUnsignedMonotonicValues(Res, I->getOperand(1), Type, Q, Depth);
3116 break;
3117 case Instruction::URem:
3118 case Instruction::UDiv:
3119 case Instruction::LShr:
3120 getUnsignedMonotonicValues(Res, I->getOperand(0), Type, Q, Depth);
3121 break;
3122 case Instruction::Call:
3125 break;
3126 default:
3127 break;
3128 }
3129 }
3130}
3131
3133 Value *RHS,
3134 const SimplifyQuery &Q) {
3135 if (Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_ULT)
3136 return nullptr;
3137
3138 // We have LHS uge GreaterValues and LowerValues uge RHS. If any of the
3139 // GreaterValues and LowerValues are the same, it follows that LHS uge RHS.
3140 SmallPtrSet<Value *, 4> GreaterValues;
3141 SmallPtrSet<Value *, 4> LowerValues;
3144 for (Value *GV : GreaterValues)
3145 if (LowerValues.contains(GV))
3147 Pred == ICmpInst::ICMP_UGE);
3148 return nullptr;
3149}
3150
3152 Value *RHS, const SimplifyQuery &Q,
3153 unsigned MaxRecurse) {
3154 Type *ITy = getCompareTy(RHS); // The return type.
3155
3156 Value *Y = nullptr;
3157 // icmp pred (or X, Y), X
3158 if (match(LBO, m_c_Or(m_Value(Y), m_Specific(RHS)))) {
3159 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
3160 KnownBits RHSKnown = computeKnownBits(RHS, Q);
3161 KnownBits YKnown = computeKnownBits(Y, Q);
3162 if (RHSKnown.isNonNegative() && YKnown.isNegative())
3163 return Pred == ICmpInst::ICMP_SLT ? getTrue(ITy) : getFalse(ITy);
3164 if (RHSKnown.isNegative() || YKnown.isNonNegative())
3165 return Pred == ICmpInst::ICMP_SLT ? getFalse(ITy) : getTrue(ITy);
3166 }
3167 }
3168
3169 // icmp pred (urem X, Y), Y
3170 if (match(LBO, m_URem(m_Value(), m_Specific(RHS)))) {
3171 switch (Pred) {
3172 default:
3173 break;
3174 case ICmpInst::ICMP_SGT:
3175 case ICmpInst::ICMP_SGE: {
3176 KnownBits Known = computeKnownBits(RHS, Q);
3177 if (!Known.isNonNegative())
3178 break;
3179 [[fallthrough]];
3180 }
3181 case ICmpInst::ICMP_EQ:
3182 case ICmpInst::ICMP_UGT:
3183 case ICmpInst::ICMP_UGE:
3184 return getFalse(ITy);
3185 case ICmpInst::ICMP_SLT:
3186 case ICmpInst::ICMP_SLE: {
3187 KnownBits Known = computeKnownBits(RHS, Q);
3188 if (!Known.isNonNegative())
3189 break;
3190 [[fallthrough]];
3191 }
3192 case ICmpInst::ICMP_NE:
3193 case ICmpInst::ICMP_ULT:
3194 case ICmpInst::ICMP_ULE:
3195 return getTrue(ITy);
3196 }
3197 }
3198
3199 // If x is nonzero:
3200 // x >>u C <u x --> true for C != 0.
3201 // x >>u C != x --> true for C != 0.
3202 // x >>u C >=u x --> false for C != 0.
3203 // x >>u C == x --> false for C != 0.
3204 // x udiv C <u x --> true for C != 1.
3205 // x udiv C != x --> true for C != 1.
3206 // x udiv C >=u x --> false for C != 1.
3207 // x udiv C == x --> false for C != 1.
3208 // TODO: allow non-constant shift amount/divisor
3209 const APInt *C;
3210 if ((match(LBO, m_LShr(m_Specific(RHS), m_APInt(C))) && *C != 0) ||
3211 (match(LBO, m_UDiv(m_Specific(RHS), m_APInt(C))) && *C != 1)) {
3212 if (isKnownNonZero(RHS, Q)) {
3213 switch (Pred) {
3214 default:
3215 break;
3216 case ICmpInst::ICMP_EQ:
3217 case ICmpInst::ICMP_UGE:
3218 case ICmpInst::ICMP_UGT:
3219 return getFalse(ITy);
3220 case ICmpInst::ICMP_NE:
3221 case ICmpInst::ICMP_ULT:
3222 case ICmpInst::ICMP_ULE:
3223 return getTrue(ITy);
3224 }
3225 }
3226 }
3227
3228 // (x*C1)/C2 <= x for C1 <= C2.
3229 // This holds even if the multiplication overflows: Assume that x != 0 and
3230 // arithmetic is modulo M. For overflow to occur we must have C1 >= M/x and
3231 // thus C2 >= M/x. It follows that (x*C1)/C2 <= (M-1)/C2 <= ((M-1)*x)/M < x.
3232 //
3233 // Additionally, either the multiplication and division might be represented
3234 // as shifts:
3235 // (x*C1)>>C2 <= x for C1 < 2**C2.
3236 // (x<<C1)/C2 <= x for 2**C1 < C2.
3237 const APInt *C1, *C2;
3238 if ((match(LBO, m_UDiv(m_Mul(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3239 C1->ule(*C2)) ||
3240 (match(LBO, m_LShr(m_Mul(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3241 C1->ule(APInt(C2->getBitWidth(), 1) << *C2)) ||
3242 (match(LBO, m_UDiv(m_Shl(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3243 (APInt(C1->getBitWidth(), 1) << *C1).ule(*C2))) {
3244 if (Pred == ICmpInst::ICMP_UGT)
3245 return getFalse(ITy);
3246 if (Pred == ICmpInst::ICMP_ULE)
3247 return getTrue(ITy);
3248 }
3249
3250 // (sub C, X) == X, C is odd --> false
3251 // (sub C, X) != X, C is odd --> true
3252 if (match(LBO, m_Sub(m_APIntAllowPoison(C), m_Specific(RHS))) &&
3253 (*C & 1) == 1 && ICmpInst::isEquality(Pred))
3254 return (Pred == ICmpInst::ICMP_EQ) ? getFalse(ITy) : getTrue(ITy);
3255
3256 return nullptr;
3257}
3258
3259// If only one of the icmp's operands has NSW flags, try to prove that:
3260//
3261// icmp slt (x + C1), (x +nsw C2)
3262//
3263// is equivalent to:
3264//
3265// icmp slt C1, C2
3266//
3267// which is true if x + C2 has the NSW flags set and:
3268// *) C1 < C2 && C1 >= 0, or
3269// *) C2 < C1 && C1 <= 0.
3270//
3272 const InstrInfoQuery &IIQ) {
3273 // TODO: only support icmp slt for now.
3274 if (Pred != CmpInst::ICMP_SLT || !IIQ.UseInstrInfo)
3275 return false;
3276
3277 // Canonicalize nsw add as RHS.
3278 if (!match(RHS, m_NSWAdd(m_Value(), m_Value())))
3279 std::swap(LHS, RHS);
3280 if (!match(RHS, m_NSWAdd(m_Value(), m_Value())))
3281 return false;
3282
3283 Value *X;
3284 const APInt *C1, *C2;
3285 if (!match(LHS, m_Add(m_Value(X), m_APInt(C1))) ||
3286 !match(RHS, m_Add(m_Specific(X), m_APInt(C2))))
3287 return false;
3288
3289 return (C1->slt(*C2) && C1->isNonNegative()) ||
3290 (C2->slt(*C1) && C1->isNonPositive());
3291}
3292
3293/// TODO: A large part of this logic is duplicated in InstCombine's
3294/// foldICmpBinOp(). We should be able to share that and avoid the code
3295/// duplication.
3297 const SimplifyQuery &Q,
3298 unsigned MaxRecurse) {
3301 if (MaxRecurse && (LBO || RBO)) {
3302 // Analyze the case when either LHS or RHS is an add instruction.
3303 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
3304 // LHS = A + B (or A and B are null); RHS = C + D (or C and D are null).
3305 bool NoLHSWrapProblem = false, NoRHSWrapProblem = false;
3306 if (LBO && LBO->getOpcode() == Instruction::Add) {
3307 A = LBO->getOperand(0);
3308 B = LBO->getOperand(1);
3309 NoLHSWrapProblem =
3310 ICmpInst::isEquality(Pred) ||
3311 (CmpInst::isUnsigned(Pred) &&
3313 (CmpInst::isSigned(Pred) &&
3315 }
3316 if (RBO && RBO->getOpcode() == Instruction::Add) {
3317 C = RBO->getOperand(0);
3318 D = RBO->getOperand(1);
3319 NoRHSWrapProblem =
3320 ICmpInst::isEquality(Pred) ||
3321 (CmpInst::isUnsigned(Pred) &&
3323 (CmpInst::isSigned(Pred) &&
3325 }
3326
3327 // icmp (X+Y), X -> icmp Y, 0 for equalities or if there is no overflow.
3328 if ((A == RHS || B == RHS) && NoLHSWrapProblem)
3329 if (Value *V = simplifyICmpInst(Pred, A == RHS ? B : A,
3330 Constant::getNullValue(RHS->getType()), Q,
3331 MaxRecurse - 1))
3332 return V;
3333
3334 // icmp X, (X+Y) -> icmp 0, Y for equalities or if there is no overflow.
3335 if ((C == LHS || D == LHS) && NoRHSWrapProblem)
3336 if (Value *V =
3338 C == LHS ? D : C, Q, MaxRecurse - 1))
3339 return V;
3340
3341 // icmp (X+Y), (X+Z) -> icmp Y,Z for equalities or if there is no overflow.
3342 bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
3344 if (A && C && (A == C || A == D || B == C || B == D) && CanSimplify) {
3345 // Determine Y and Z in the form icmp (X+Y), (X+Z).
3346 Value *Y, *Z;
3347 if (A == C) {
3348 // C + B == C + D -> B == D
3349 Y = B;
3350 Z = D;
3351 } else if (A == D) {
3352 // D + B == C + D -> B == C
3353 Y = B;
3354 Z = C;
3355 } else if (B == C) {
3356 // A + C == C + D -> A == D
3357 Y = A;
3358 Z = D;
3359 } else {
3360 assert(B == D);
3361 // A + D == C + D -> A == C
3362 Y = A;
3363 Z = C;
3364 }
3365 if (Value *V = simplifyICmpInst(Pred, Y, Z, Q, MaxRecurse - 1))
3366 return V;
3367 }
3368 }
3369
3370 if (LBO)
3371 if (Value *V = simplifyICmpWithBinOpOnLHS(Pred, LBO, RHS, Q, MaxRecurse))
3372 return V;
3373
3374 if (RBO)
3376 ICmpInst::getSwappedPredicate(Pred), RBO, LHS, Q, MaxRecurse))
3377 return V;
3378
3379 // 0 - (zext X) pred C
3380 if (!CmpInst::isUnsigned(Pred) && match(LHS, m_Neg(m_ZExt(m_Value())))) {
3381 const APInt *C;
3382 if (match(RHS, m_APInt(C))) {
3383 if (C->isStrictlyPositive()) {
3384 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_NE)
3386 if (Pred == ICmpInst::ICMP_SGE || Pred == ICmpInst::ICMP_EQ)
3388 }
3389 if (C->isNonNegative()) {
3390 if (Pred == ICmpInst::ICMP_SLE)
3392 if (Pred == ICmpInst::ICMP_SGT)
3394 }
3395 }
3396 }
3397
3398 // If C2 is a power-of-2 and C is not:
3399 // (C2 << X) == C --> false
3400 // (C2 << X) != C --> true
3401 const APInt *C;
3402 if (match(LHS, m_Shl(m_Power2(), m_Value())) &&
3403 match(RHS, m_APIntAllowPoison(C)) && !C->isPowerOf2()) {
3404 // C2 << X can equal zero in some circumstances.
3405 // This simplification might be unsafe if C is zero.
3406 //
3407 // We know it is safe if:
3408 // - The shift is nsw. We can't shift out the one bit.
3409 // - The shift is nuw. We can't shift out the one bit.
3410 // - C2 is one.
3411 // - C isn't zero.
3414 match(LHS, m_Shl(m_One(), m_Value())) || !C->isZero()) {
3415 if (Pred == ICmpInst::ICMP_EQ)
3417 if (Pred == ICmpInst::ICMP_NE)
3419 }
3420 }
3421
3422 // If C is a power-of-2:
3423 // (C << X) >u 0x8000 --> false
3424 // (C << X) <=u 0x8000 --> true
3425 if (match(LHS, m_Shl(m_Power2(), m_Value())) && match(RHS, m_SignMask())) {
3426 if (Pred == ICmpInst::ICMP_UGT)
3428 if (Pred == ICmpInst::ICMP_ULE)
3430 }
3431
3432 if (!MaxRecurse || !LBO || !RBO || LBO->getOpcode() != RBO->getOpcode())
3433 return nullptr;
3434
3435 if (LBO->getOperand(0) == RBO->getOperand(0)) {
3436 switch (LBO->getOpcode()) {
3437 default:
3438 break;
3439 case Instruction::Shl: {
3440 bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO);
3441 bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO);
3442 if (!NUW || (ICmpInst::isSigned(Pred) && !NSW) ||
3443 !isKnownNonZero(LBO->getOperand(0), Q))
3444 break;
3445 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(1),
3446 RBO->getOperand(1), Q, MaxRecurse - 1))
3447 return V;
3448 break;
3449 }
3450 // If C1 & C2 == C1, A = X and/or C1, B = X and/or C2:
3451 // icmp ule A, B -> true
3452 // icmp ugt A, B -> false
3453 // icmp sle A, B -> true (C1 and C2 are the same sign)
3454 // icmp sgt A, B -> false (C1 and C2 are the same sign)
3455 case Instruction::And:
3456 case Instruction::Or: {
3457 const APInt *C1, *C2;
3458 if (ICmpInst::isRelational(Pred) &&
3459 match(LBO->getOperand(1), m_APInt(C1)) &&
3460 match(RBO->getOperand(1), m_APInt(C2))) {
3461 if (!C1->isSubsetOf(*C2)) {
3462 std::swap(C1, C2);
3463 Pred = ICmpInst::getSwappedPredicate(Pred);
3464 }
3465 if (C1->isSubsetOf(*C2)) {
3466 if (Pred == ICmpInst::ICMP_ULE)
3468 if (Pred == ICmpInst::ICMP_UGT)
3470 if (C1->isNonNegative() == C2->isNonNegative()) {
3471 if (Pred == ICmpInst::ICMP_SLE)
3473 if (Pred == ICmpInst::ICMP_SGT)
3475 }
3476 }
3477 }
3478 break;
3479 }
3480 }
3481 }
3482
3483 if (LBO->getOperand(1) == RBO->getOperand(1)) {
3484 switch (LBO->getOpcode()) {
3485 default:
3486 break;
3487 case Instruction::UDiv:
3488 case Instruction::LShr:
3489 if (ICmpInst::isSigned(Pred) || !Q.IIQ.isExact(LBO) ||
3490 !Q.IIQ.isExact(RBO))
3491 break;
3492 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3493 RBO->getOperand(0), Q, MaxRecurse - 1))
3494 return V;
3495 break;
3496 case Instruction::SDiv:
3497 if (!ICmpInst::isEquality(Pred) || !Q.IIQ.isExact(LBO) ||
3498 !Q.IIQ.isExact(RBO))
3499 break;
3500 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3501 RBO->getOperand(0), Q, MaxRecurse - 1))
3502 return V;
3503 break;
3504 case Instruction::AShr:
3505 if (!Q.IIQ.isExact(LBO) || !Q.IIQ.isExact(RBO))
3506 break;
3507 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3508 RBO->getOperand(0), Q, MaxRecurse - 1))
3509 return V;
3510 break;
3511 case Instruction::Shl: {
3512 bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO);
3513 bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO);
3514 if (!NUW && !NSW)
3515 break;
3516 if (!NSW && ICmpInst::isSigned(Pred))
3517 break;
3518 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3519 RBO->getOperand(0), Q, MaxRecurse - 1))
3520 return V;
3521 break;
3522 }
3523 }
3524 }
3525 return nullptr;
3526}
3527
3528/// simplify integer comparisons where at least one operand of the compare
3529/// matches an integer min/max idiom.
3531 const SimplifyQuery &Q,
3532 unsigned MaxRecurse) {
3533 Type *ITy = getCompareTy(LHS); // The return type.
3534 Value *A, *B;
3536 CmpInst::Predicate EqP; // Chosen so that "A == max/min(A,B)" iff "A EqP B".
3537
3538 // Signed variants on "max(a,b)>=a -> true".
3539 if (match(LHS, m_SMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
3540 if (A != RHS)
3541 std::swap(A, B); // smax(A, B) pred A.
3542 EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
3543 // We analyze this as smax(A, B) pred A.
3544 P = Pred;
3545 } else if (match(RHS, m_SMax(m_Value(A), m_Value(B))) &&
3546 (A == LHS || B == LHS)) {
3547 if (A != LHS)
3548 std::swap(A, B); // A pred smax(A, B).
3549 EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
3550 // We analyze this as smax(A, B) swapped-pred A.
3552 } else if (match(LHS, m_SMin(m_Value(A), m_Value(B))) &&
3553 (A == RHS || B == RHS)) {
3554 if (A != RHS)
3555 std::swap(A, B); // smin(A, B) pred A.
3556 EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
3557 // We analyze this as smax(-A, -B) swapped-pred -A.
3558 // Note that we do not need to actually form -A or -B thanks to EqP.
3560 } else if (match(RHS, m_SMin(m_Value(A), m_Value(B))) &&
3561 (A == LHS || B == LHS)) {
3562 if (A != LHS)
3563 std::swap(A, B); // A pred smin(A, B).
3564 EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
3565 // We analyze this as smax(-A, -B) pred -A.
3566 // Note that we do not need to actually form -A or -B thanks to EqP.
3567 P = Pred;
3568 }
3570 // Cases correspond to "max(A, B) p A".
3571 switch (P) {
3572 default:
3573 break;
3574 case CmpInst::ICMP_EQ:
3575 case CmpInst::ICMP_SLE:
3576 // Equivalent to "A EqP B". This may be the same as the condition tested
3577 // in the max/min; if so, we can just return that.
3578 if (Value *V = extractEquivalentCondition(LHS, EqP, A, B))
3579 return V;
3580 if (Value *V = extractEquivalentCondition(RHS, EqP, A, B))
3581 return V;
3582 // Otherwise, see if "A EqP B" simplifies.
3583 if (MaxRecurse)
3584 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1))
3585 return V;
3586 break;
3587 case CmpInst::ICMP_NE:
3588 case CmpInst::ICMP_SGT: {
3590 // Equivalent to "A InvEqP B". This may be the same as the condition
3591 // tested in the max/min; if so, we can just return that.
3592 if (Value *V = extractEquivalentCondition(LHS, InvEqP, A, B))
3593 return V;
3594 if (Value *V = extractEquivalentCondition(RHS, InvEqP, A, B))
3595 return V;
3596 // Otherwise, see if "A InvEqP B" simplifies.
3597 if (MaxRecurse)
3598 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1))
3599 return V;
3600 break;
3601 }
3602 case CmpInst::ICMP_SGE:
3603 // Always true.
3604 return getTrue(ITy);
3605 case CmpInst::ICMP_SLT:
3606 // Always false.
3607 return getFalse(ITy);
3608 }
3609 }
3610
3611 // Unsigned variants on "max(a,b)>=a -> true".
3613 if (match(LHS, m_UMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
3614 if (A != RHS)
3615 std::swap(A, B); // umax(A, B) pred A.
3616 EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
3617 // We analyze this as umax(A, B) pred A.
3618 P = Pred;
3619 } else if (match(RHS, m_UMax(m_Value(A), m_Value(B))) &&
3620 (A == LHS || B == LHS)) {
3621 if (A != LHS)
3622 std::swap(A, B); // A pred umax(A, B).
3623 EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
3624 // We analyze this as umax(A, B) swapped-pred A.
3626 } else if (match(LHS, m_UMin(m_Value(A), m_Value(B))) &&
3627 (A == RHS || B == RHS)) {
3628 if (A != RHS)
3629 std::swap(A, B); // umin(A, B) pred A.
3630 EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
3631 // We analyze this as umax(-A, -B) swapped-pred -A.
3632 // Note that we do not need to actually form -A or -B thanks to EqP.
3634 } else if (match(RHS, m_UMin(m_Value(A), m_Value(B))) &&
3635 (A == LHS || B == LHS)) {
3636 if (A != LHS)
3637 std::swap(A, B); // A pred umin(A, B).
3638 EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
3639 // We analyze this as umax(-A, -B) pred -A.
3640 // Note that we do not need to actually form -A or -B thanks to EqP.
3641 P = Pred;
3642 }
3644 // Cases correspond to "max(A, B) p A".
3645 switch (P) {
3646 default:
3647 break;
3648 case CmpInst::ICMP_EQ:
3649 case CmpInst::ICMP_ULE:
3650 // Equivalent to "A EqP B". This may be the same as the condition tested
3651 // in the max/min; if so, we can just return that.
3652 if (Value *V = extractEquivalentCondition(LHS, EqP, A, B))
3653 return V;
3654 if (Value *V = extractEquivalentCondition(RHS, EqP, A, B))
3655 return V;
3656 // Otherwise, see if "A EqP B" simplifies.
3657 if (MaxRecurse)
3658 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1))
3659 return V;
3660 break;
3661 case CmpInst::ICMP_NE:
3662 case CmpInst::ICMP_UGT: {
3664 // Equivalent to "A InvEqP B". This may be the same as the condition
3665 // tested in the max/min; if so, we can just return that.
3666 if (Value *V = extractEquivalentCondition(LHS, InvEqP, A, B))
3667 return V;
3668 if (Value *V = extractEquivalentCondition(RHS, InvEqP, A, B))
3669 return V;
3670 // Otherwise, see if "A InvEqP B" simplifies.
3671 if (MaxRecurse)
3672 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1))
3673 return V;
3674 break;
3675 }
3676 case CmpInst::ICMP_UGE:
3677 return getTrue(ITy);
3678 case CmpInst::ICMP_ULT:
3679 return getFalse(ITy);
3680 }
3681 }
3682
3683 // Comparing 1 each of min/max with a common operand?
3684 // Canonicalize min operand to RHS.
3685 if (match(LHS, m_UMin(m_Value(), m_Value())) ||
3686 match(LHS, m_SMin(m_Value(), m_Value()))) {
3687 std::swap(LHS, RHS);
3688 Pred = ICmpInst::getSwappedPredicate(Pred);
3689 }
3690
3691 Value *C, *D;
3692 if (match(LHS, m_SMax(m_Value(A), m_Value(B))) &&
3693 match(RHS, m_SMin(m_Value(C), m_Value(D))) &&
3694 (A == C || A == D || B == C || B == D)) {
3695 // smax(A, B) >=s smin(A, D) --> true
3696 if (Pred == CmpInst::ICMP_SGE)
3697 return getTrue(ITy);
3698 // smax(A, B) <s smin(A, D) --> false
3699 if (Pred == CmpInst::ICMP_SLT)
3700 return getFalse(ITy);
3701 } else if (match(LHS, m_UMax(m_Value(A), m_Value(B))) &&
3702 match(RHS, m_UMin(m_Value(C), m_Value(D))) &&
3703 (A == C || A == D || B == C || B == D)) {
3704 // umax(A, B) >=u umin(A, D) --> true
3705 if (Pred == CmpInst::ICMP_UGE)
3706 return getTrue(ITy);
3707 // umax(A, B) <u umin(A, D) --> false
3708 if (Pred == CmpInst::ICMP_ULT)
3709 return getFalse(ITy);
3710 }
3711
3712 return nullptr;
3713}
3714
3716 Value *LHS, Value *RHS,
3717 const SimplifyQuery &Q) {
3718 // Gracefully handle instructions that have not been inserted yet.
3719 if (!Q.AC || !Q.CxtI)
3720 return nullptr;
3721
3722 for (Value *AssumeBaseOp : {LHS, RHS}) {
3723 for (auto &AssumeVH : Q.AC->assumptionsFor(AssumeBaseOp)) {
3724 if (!AssumeVH)
3725 continue;
3726
3727 CallInst *Assume = cast<CallInst>(AssumeVH);
3728 if (std::optional<bool> Imp = isImpliedCondition(
3729 Assume->getArgOperand(0), Predicate, LHS, RHS, Q.DL))
3730 if (isValidAssumeForContext(Assume, Q.CxtI, Q.DT))
3731 return ConstantInt::get(getCompareTy(LHS), *Imp);
3732 }
3733 }
3734
3735 return nullptr;
3736}
3737
3739 Value *RHS) {
3741 if (!II)
3742 return nullptr;
3743
3744 switch (II->getIntrinsicID()) {
3745 case Intrinsic::uadd_sat:
3746 // uadd.sat(X, Y) uge X + Y
3747 if (match(RHS, m_c_Add(m_Specific(II->getArgOperand(0)),
3748 m_Specific(II->getArgOperand(1))))) {
3749 if (Pred == ICmpInst::ICMP_UGE)
3751 if (Pred == ICmpInst::ICMP_ULT)
3753 }
3754 return nullptr;
3755 case Intrinsic::usub_sat:
3756 // usub.sat(X, Y) ule X - Y
3757 if (match(RHS, m_Sub(m_Specific(II->getArgOperand(0)),
3758 m_Specific(II->getArgOperand(1))))) {
3759 if (Pred == ICmpInst::ICMP_ULE)
3761 if (Pred == ICmpInst::ICMP_UGT)
3763 }
3764 return nullptr;
3765 default:
3766 return nullptr;
3767 }
3768}
3769
3770/// Helper method to get range from metadata or attribute.
3771static std::optional<ConstantRange> getRange(Value *V,
3772 const InstrInfoQuery &IIQ) {
3774 if (MDNode *MD = IIQ.getMetadata(I, LLVMContext::MD_range))
3775 return getConstantRangeFromMetadata(*MD);
3776
3777 if (const Argument *A = dyn_cast<Argument>(V))
3778 return A->getRange();
3779 else if (const CallBase *CB = dyn_cast<CallBase>(V))
3780 return CB->getRange();
3781
3782 return std::nullopt;
3783}
3784
3785/// Given operands for an ICmpInst, see if we can fold the result.
3786/// If not, this returns null.
3788 const SimplifyQuery &Q, unsigned MaxRecurse) {
3789 assert(CmpInst::isIntPredicate(Pred) && "Not an integer compare!");
3790
3791 if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
3792 if (Constant *CRHS = dyn_cast<Constant>(RHS))
3793 return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL, Q.TLI);
3794
3795 // If we have a constant, make sure it is on the RHS.
3796 std::swap(LHS, RHS);
3797 Pred = CmpInst::getSwappedPredicate(Pred);
3798 }
3799 assert(!isa<UndefValue>(LHS) && "Unexpected icmp undef,%X");
3800
3801 Type *ITy = getCompareTy(LHS); // The return type.
3802
3803 // icmp poison, X -> poison
3804 if (isa<PoisonValue>(RHS))
3805 return PoisonValue::get(ITy);
3806
3807 // For EQ and NE, we can always pick a value for the undef to make the
3808 // predicate pass or fail, so we can return undef.
3809 // Matches behavior in llvm::ConstantFoldCompareInstruction.
3810 if (Q.isUndefValue(RHS) && ICmpInst::isEquality(Pred))
3811 return UndefValue::get(ITy);
3812
3813 // icmp X, X -> true/false
3814 // icmp X, undef -> true/false because undef could be X.
3815 if (LHS == RHS || Q.isUndefValue(RHS))
3816 return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred));
3817
3818 if (Value *V = simplifyICmpOfBools(Pred, LHS, RHS, Q))
3819 return V;
3820
3821 // TODO: Sink/common this with other potentially expensive calls that use
3822 // ValueTracking? See comment below for isKnownNonEqual().
3823 if (Value *V = simplifyICmpWithZero(Pred, LHS, RHS, Q))
3824 return V;
3825
3826 if (Value *V = simplifyICmpWithConstant(Pred, LHS, RHS, Q))
3827 return V;
3828
3829 // If both operands have range metadata, use the metadata
3830 // to simplify the comparison.
3831 if (std::optional<ConstantRange> RhsCr = getRange(RHS, Q.IIQ))
3832 if (std::optional<ConstantRange> LhsCr = getRange(LHS, Q.IIQ)) {
3833 if (LhsCr->icmp(Pred, *RhsCr))
3834 return ConstantInt::getTrue(ITy);
3835
3836 if (LhsCr->icmp(CmpInst::getInversePredicate(Pred), *RhsCr))
3837 return ConstantInt::getFalse(ITy);
3838 }
3839
3840 // Compare of cast, for example (zext X) != 0 -> X != 0
3843 Value *SrcOp = LI->getOperand(0);
3844 Type *SrcTy = SrcOp->getType();
3845 Type *DstTy = LI->getType();
3846
3847 // Turn icmp (ptrtoint x), (ptrtoint/constant) into a compare of the input
3848 // if the integer type is the same size as the pointer type.
3849 if (MaxRecurse && isa<PtrToIntInst>(LI) &&
3850 Q.DL.getTypeSizeInBits(SrcTy) == DstTy->getPrimitiveSizeInBits()) {
3851 if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
3852 // Transfer the cast to the constant.
3853 if (Value *V = simplifyICmpInst(Pred, SrcOp,
3854 ConstantExpr::getIntToPtr(RHSC, SrcTy),
3855 Q, MaxRecurse - 1))
3856 return V;
3857 } else if (PtrToIntInst *RI = dyn_cast<PtrToIntInst>(RHS)) {
3858 if (RI->getOperand(0)->getType() == SrcTy)
3859 // Compare without the cast.
3860 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q,
3861 MaxRecurse - 1))
3862 return V;
3863 }
3864 }
3865
3866 if (isa<ZExtInst>(LHS)) {
3867 // Turn icmp (zext X), (zext Y) into a compare of X and Y if they have the
3868 // same type.
3869 if (ZExtInst *RI = dyn_cast<ZExtInst>(RHS)) {
3870 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
3871 // Compare X and Y. Note that signed predicates become unsigned.
3872 if (Value *V =
3874 RI->getOperand(0), Q, MaxRecurse - 1))
3875 return V;
3876 }
3877 // Fold (zext X) ule (sext X), (zext X) sge (sext X) to true.
3878 else if (SExtInst *RI = dyn_cast<SExtInst>(RHS)) {
3879 if (SrcOp == RI->getOperand(0)) {
3880 if (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_SGE)
3881 return ConstantInt::getTrue(ITy);
3882 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_SLT)
3883 return ConstantInt::getFalse(ITy);
3884 }
3885 }
3886 // Turn icmp (zext X), Cst into a compare of X and Cst if Cst is extended
3887 // too. If not, then try to deduce the result of the comparison.
3888 else if (match(RHS, m_ImmConstant())) {
3890 assert(C != nullptr);
3891
3892 // Compute the constant that would happen if we truncated to SrcTy then
3893 // reextended to DstTy.
3894 Constant *Trunc =
3895 ConstantFoldCastOperand(Instruction::Trunc, C, SrcTy, Q.DL);
3896 assert(Trunc && "Constant-fold of ImmConstant should not fail");
3897 Constant *RExt =
3898 ConstantFoldCastOperand(CastInst::ZExt, Trunc, DstTy, Q.DL);
3899 assert(RExt && "Constant-fold of ImmConstant should not fail");
3900 Constant *AnyEq =
3902 assert(AnyEq && "Constant-fold of ImmConstant should not fail");
3903
3904 // If the re-extended constant didn't change any of the elements then
3905 // this is effectively also a case of comparing two zero-extended
3906 // values.
3907 if (AnyEq->isAllOnesValue() && MaxRecurse)
3909 SrcOp, Trunc, Q, MaxRecurse - 1))
3910 return V;
3911
3912 // Otherwise the upper bits of LHS are zero while RHS has a non-zero bit
3913 // there. Use this to work out the result of the comparison.
3914 if (AnyEq->isNullValue()) {
3915 switch (Pred) {
3916 default:
3917 llvm_unreachable("Unknown ICmp predicate!");
3918 // LHS <u RHS.
3919 case ICmpInst::ICMP_EQ:
3920 case ICmpInst::ICMP_UGT:
3921 case ICmpInst::ICMP_UGE:
3922 return Constant::getNullValue(ITy);
3923
3924 case ICmpInst::ICMP_NE:
3925 case ICmpInst::ICMP_ULT:
3926 case ICmpInst::ICMP_ULE:
3927 return Constant::getAllOnesValue(ITy);
3928
3929 // LHS is non-negative. If RHS is negative then LHS >s LHS. If RHS
3930 // is non-negative then LHS <s RHS.
3931 case ICmpInst::ICMP_SGT:
3932 case ICmpInst::ICMP_SGE:
3935 Q.DL);
3936 case ICmpInst::ICMP_SLT:
3937 case ICmpInst::ICMP_SLE:
3940 Q.DL);
3941 }
3942 }
3943 }
3944 }
3945
3946 if (isa<SExtInst>(LHS)) {
3947 // Turn icmp (sext X), (sext Y) into a compare of X and Y if they have the
3948 // same type.
3949 if (SExtInst *RI = dyn_cast<SExtInst>(RHS)) {
3950 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
3951 // Compare X and Y. Note that the predicate does not change.
3952 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q,
3953 MaxRecurse - 1))
3954 return V;
3955 }
3956 // Fold (sext X) uge (zext X), (sext X) sle (zext X) to true.
3957 else if (ZExtInst *RI = dyn_cast<ZExtInst>(RHS)) {
3958 if (SrcOp == RI->getOperand(0)) {
3959 if (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_SLE)
3960 return ConstantInt::getTrue(ITy);
3961 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_SGT)
3962 return ConstantInt::getFalse(ITy);
3963 }
3964 }
3965 // Turn icmp (sext X), Cst into a compare of X and Cst if Cst is extended
3966 // too. If not, then try to deduce the result of the comparison.
3967 else if (match(RHS, m_ImmConstant())) {
3969
3970 // Compute the constant that would happen if we truncated to SrcTy then
3971 // reextended to DstTy.
3972 Constant *Trunc =
3973 ConstantFoldCastOperand(Instruction::Trunc, C, SrcTy, Q.DL);
3974 assert(Trunc && "Constant-fold of ImmConstant should not fail");
3975 Constant *RExt =
3976 ConstantFoldCastOperand(CastInst::SExt, Trunc, DstTy, Q.DL);
3977 assert(RExt && "Constant-fold of ImmConstant should not fail");
3978 Constant *AnyEq =
3980 assert(AnyEq && "Constant-fold of ImmConstant should not fail");
3981
3982 // If the re-extended constant didn't change then this is effectively
3983 // also a case of comparing two sign-extended values.
3984 if (AnyEq->isAllOnesValue() && MaxRecurse)
3985 if (Value *V =
3986 simplifyICmpInst(Pred, SrcOp, Trunc, Q, MaxRecurse - 1))
3987 return V;
3988
3989 // Otherwise the upper bits of LHS are all equal, while RHS has varying
3990 // bits there. Use this to work out the result of the comparison.
3991 if (AnyEq->isNullValue()) {
3992 switch (Pred) {
3993 default:
3994 llvm_unreachable("Unknown ICmp predicate!");
3995 case ICmpInst::ICMP_EQ:
3996 return Constant::getNullValue(ITy);
3997 case ICmpInst::ICMP_NE:
3998 return Constant::getAllOnesValue(ITy);
3999
4000 // If RHS is non-negative then LHS <s RHS. If RHS is negative then
4001 // LHS >s RHS.
4002 case ICmpInst::ICMP_SGT:
4003 case ICmpInst::ICMP_SGE:
4006 Q.DL);
4007 case ICmpInst::ICMP_SLT:
4008 case ICmpInst::ICMP_SLE:
4011 Q.DL);
4012
4013 // If LHS is non-negative then LHS <u RHS. If LHS is negative then
4014 // LHS >u RHS.
4015 case ICmpInst::ICMP_UGT:
4016 case ICmpInst::ICMP_UGE:
4017 // Comparison is true iff the LHS <s 0.
4018 if (MaxRecurse)
4020 Constant::getNullValue(SrcTy), Q,
4021 MaxRecurse - 1))
4022 return V;
4023 break;
4024 case ICmpInst::ICMP_ULT:
4025 case ICmpInst::ICMP_ULE:
4026 // Comparison is true iff the LHS >=s 0.
4027 if (MaxRecurse)
4029 Constant::getNullValue(SrcTy), Q,
4030 MaxRecurse - 1))
4031 return V;
4032 break;
4033 }
4034 }
4035 }
4036 }
4037 }
4038
4039 // icmp eq|ne X, Y -> false|true if X != Y
4040 // This is potentially expensive, and we have already computedKnownBits for
4041 // compares with 0 above here, so only try this for a non-zero compare.
4042 if (ICmpInst::isEquality(Pred) && !match(RHS, m_Zero()) &&
4043 isKnownNonEqual(LHS, RHS, Q)) {
4044 return Pred == ICmpInst::ICMP_NE ? getTrue(ITy) : getFalse(ITy);
4045 }
4046
4047 if (Value *V = simplifyICmpWithBinOp(Pred, LHS, RHS, Q, MaxRecurse))
4048 return V;
4049
4050 if (Value *V = simplifyICmpWithMinMax(Pred, LHS, RHS, Q, MaxRecurse))
4051 return V;
4052
4054 return V;
4057 return V;
4058
4059 if (Value *V = simplifyICmpUsingMonotonicValues(Pred, LHS, RHS, Q))
4060 return V;
4063 return V;
4064
4065 if (Value *V = simplifyICmpWithDominatingAssume(Pred, LHS, RHS, Q))
4066 return V;
4067
4068 if (std::optional<bool> Res =
4069 isImpliedByDomCondition(Pred, LHS, RHS, Q.CxtI, Q.DL))
4070 return ConstantInt::getBool(ITy, *Res);
4071
4072 // Simplify comparisons of related pointers using a powerful, recursive
4073 // GEP-walk when we have target data available..
4074 if (LHS->getType()->isPointerTy())
4075 if (auto *C = computePointerICmp(Pred, LHS, RHS, Q))
4076 return C;
4077 if (auto *CLHS = dyn_cast<PtrToIntOperator>(LHS))
4078 if (auto *CRHS = dyn_cast<PtrToIntOperator>(RHS))
4079 if (CLHS->getPointerOperandType() == CRHS->getPointerOperandType() &&
4080 Q.DL.getTypeSizeInBits(CLHS->getPointerOperandType()) ==
4081 Q.DL.getTypeSizeInBits(CLHS->getType()))
4082 if (auto *C = computePointerICmp(Pred, CLHS->getPointerOperand(),
4083 CRHS->getPointerOperand(), Q))
4084 return C;
4085
4086 // If the comparison is with the result of a select instruction, check whether
4087 // comparing with either branch of the select always yields the same value.
4089 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
4090 return V;
4091
4092 // If the comparison is with the result of a phi instruction, check whether
4093 // doing the compare with each incoming phi value yields a common result.
4095 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
4096 return V;
4097
4098 return nullptr;
4099}
4100
4102 const SimplifyQuery &Q) {
4103 return ::simplifyICmpInst(Predicate, LHS, RHS, Q, RecursionLimit);
4104}
4105
4106/// Given operands for an FCmpInst, see if we can fold the result.
4107/// If not, this returns null.
4109 FastMathFlags FMF, const SimplifyQuery &Q,
4110 unsigned MaxRecurse) {
4111 assert(CmpInst::isFPPredicate(Pred) && "Not an FP compare!");
4112
4113 if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
4114 if (Constant *CRHS = dyn_cast<Constant>(RHS))
4115 return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL, Q.TLI,
4116 Q.CxtI);
4117
4118 // If we have a constant, make sure it is on the RHS.
4119 std::swap(LHS, RHS);
4120 Pred = CmpInst::getSwappedPredicate(Pred);
4121 }
4122
4123 // Fold trivial predicates.
4124 Type *RetTy = getCompareTy(LHS);
4125 if (Pred == FCmpInst::FCMP_FALSE)
4126 return getFalse(RetTy);
4127 if (Pred == FCmpInst::FCMP_TRUE)
4128 return getTrue(RetTy);
4129
4130 // fcmp pred x, poison and fcmp pred poison, x
4131 // fold to poison
4133 return PoisonValue::get(RetTy);
4134
4135 // fcmp pred x, undef and fcmp pred undef, x
4136 // fold to true if unordered, false if ordered
4137 if (Q.isUndefValue(LHS) || Q.isUndefValue(RHS)) {
4138 // Choosing NaN for the undef will always make unordered comparison succeed
4139 // and ordered comparison fail.
4140 return ConstantInt::get(RetTy, CmpInst::isUnordered(Pred));
4141 }
4142
4143 // fcmp x,x -> true/false. Not all compares are foldable.
4144 if (LHS == RHS) {
4145 if (CmpInst::isTrueWhenEqual(Pred))
4146 return getTrue(RetTy);
4147 if (CmpInst::isFalseWhenEqual(Pred))
4148 return getFalse(RetTy);
4149 }
4150
4151 // Fold (un)ordered comparison if we can determine there are no NaNs.
4152 //
4153 // This catches the 2 variable input case, constants are handled below as a
4154 // class-like compare.
4155 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
4158
4159 if (FMF.noNaNs() ||
4160 (RHSClass.isKnownNeverNaN() && LHSClass.isKnownNeverNaN()))
4161 return ConstantInt::get(RetTy, Pred == FCmpInst::FCMP_ORD);
4162
4163 if (RHSClass.isKnownAlwaysNaN() || LHSClass.isKnownAlwaysNaN())
4164 return ConstantInt::get(RetTy, Pred == CmpInst::FCMP_UNO);
4165 }
4166
4167 if (std::optional<bool> Res =
4168 isImpliedByDomCondition(Pred, LHS, RHS, Q.CxtI, Q.DL))
4169 return ConstantInt::getBool(RetTy, *Res);
4170
4171 const APFloat *C = nullptr;
4173 std::optional<KnownFPClass> FullKnownClassLHS;
4174
4175 // Lazily compute the possible classes for LHS. Avoid computing it twice if
4176 // RHS is a 0.
4177 auto computeLHSClass = [=, &FullKnownClassLHS](FPClassTest InterestedFlags =
4178 fcAllFlags) {
4179 if (FullKnownClassLHS)
4180 return *FullKnownClassLHS;
4181 return computeKnownFPClass(LHS, FMF, InterestedFlags, Q);
4182 };
4183
4184 if (C && Q.CxtI) {
4185 // Fold out compares that express a class test.
4186 //
4187 // FIXME: Should be able to perform folds without context
4188 // instruction. Always pass in the context function?
4189
4190 const Function *ParentF = Q.CxtI->getFunction();
4191 auto [ClassVal, ClassTest] = fcmpToClassTest(Pred, *ParentF, LHS, C);
4192 if (ClassVal) {
4193 FullKnownClassLHS = computeLHSClass();
4194 if ((FullKnownClassLHS->KnownFPClasses & ClassTest) == fcNone)
4195 return getFalse(RetTy);
4196 if ((FullKnownClassLHS->KnownFPClasses & ~ClassTest) == fcNone)
4197 return getTrue(RetTy);
4198 }
4199 }
4200
4201 // Handle fcmp with constant RHS.
4202 if (C) {
4203 // TODO: If we always required a context function, we wouldn't need to
4204 // special case nans.
4205 if (C->isNaN())
4206 return ConstantInt::get(RetTy, CmpInst::isUnordered(Pred));
4207
4208 // TODO: Need version fcmpToClassTest which returns implied class when the
4209 // compare isn't a complete class test. e.g. > 1.0 implies fcPositive, but
4210 // isn't implementable as a class call.
4211 if (C->isNegative() && !C->isNegZero()) {
4213
4214 // TODO: We can catch more cases by using a range check rather than
4215 // relying on CannotBeOrderedLessThanZero.
4216 switch (Pred) {
4217 case FCmpInst::FCMP_UGE:
4218 case FCmpInst::FCMP_UGT:
4219 case FCmpInst::FCMP_UNE: {
4220 KnownFPClass KnownClass = computeLHSClass(Interested);
4221
4222 // (X >= 0) implies (X > C) when (C < 0)
4223 if (KnownClass.cannotBeOrderedLessThanZero())
4224 return getTrue(RetTy);
4225 break;
4226 }
4227 case FCmpInst::FCMP_OEQ:
4228 case FCmpInst::FCMP_OLE:
4229 case FCmpInst::FCMP_OLT: {
4230 KnownFPClass KnownClass = computeLHSClass(Interested);
4231
4232 // (X >= 0) implies !(X < C) when (C < 0)
4233 if (KnownClass.cannotBeOrderedLessThanZero())
4234 return getFalse(RetTy);
4235 break;
4236 }
4237 default:
4238 break;
4239 }
4240 }
4241 // Check comparison of [minnum/maxnum with constant] with other constant.
4242 const APFloat *C2;
4244 *C2 < *C) ||
4246 *C2 > *C)) {
4247 bool IsMaxNum =
4248 cast<IntrinsicInst>(LHS)->getIntrinsicID() == Intrinsic::maxnum;
4249 // The ordered relationship and minnum/maxnum guarantee that we do not
4250 // have NaN constants, so ordered/unordered preds are handled the same.
4251 switch (Pred) {
4252 case FCmpInst::FCMP_OEQ:
4253 case FCmpInst::FCMP_UEQ:
4254 // minnum(X, LesserC) == C --> false
4255 // maxnum(X, GreaterC) == C --> false
4256 return getFalse(RetTy);
4257 case FCmpInst::FCMP_ONE:
4258 case FCmpInst::FCMP_UNE:
4259 // minnum(X, LesserC) != C --> true
4260 // maxnum(X, GreaterC) != C --> true
4261 return getTrue(RetTy);
4262 case FCmpInst::FCMP_OGE:
4263 case FCmpInst::FCMP_UGE:
4264 case FCmpInst::FCMP_OGT:
4265 case FCmpInst::FCMP_UGT:
4266 // minnum(X, LesserC) >= C --> false
4267 // minnum(X, LesserC) > C --> false
4268 // maxnum(X, GreaterC) >= C --> true
4269 // maxnum(X, GreaterC) > C --> true
4270 return ConstantInt::get(RetTy, IsMaxNum);
4271 case FCmpInst::FCMP_OLE:
4272 case FCmpInst::FCMP_ULE:
4273 case FCmpInst::FCMP_OLT:
4274 case FCmpInst::FCMP_ULT:
4275 // minnum(X, LesserC) <= C --> true
4276 // minnum(X, LesserC) < C --> true
4277 // maxnum(X, GreaterC) <= C --> false
4278 // maxnum(X, GreaterC) < C --> false
4279 return ConstantInt::get(RetTy, !IsMaxNum);
4280 default:
4281 // TRUE/FALSE/ORD/UNO should be handled before this.
4282 llvm_unreachable("Unexpected fcmp predicate");
4283 }
4284 }
4285 }
4286
4287 // TODO: Could fold this with above if there were a matcher which returned all
4288 // classes in a non-splat vector.
4289 if (match(RHS, m_AnyZeroFP())) {
4290 switch (Pred) {
4291 case FCmpInst::FCMP_OGE:
4292 case FCmpInst::FCMP_ULT: {
4294 if (!FMF.noNaNs())
4295 Interested |= fcNan;
4296
4297 KnownFPClass Known = computeLHSClass(Interested);
4298
4299 // Positive or zero X >= 0.0 --> true
4300 // Positive or zero X < 0.0 --> false
4301 if ((FMF.noNaNs() || Known.isKnownNeverNaN()) &&
4303 return Pred == FCmpInst::FCMP_OGE ? getTrue(RetTy) : getFalse(RetTy);
4304 break;
4305 }
4306 case FCmpInst::FCMP_UGE:
4307 case FCmpInst::FCMP_OLT: {
4309 KnownFPClass Known = computeLHSClass(Interested);
4310
4311 // Positive or zero or nan X >= 0.0 --> true
4312 // Positive or zero or nan X < 0.0 --> false
4313 if (Known.cannotBeOrderedLessThanZero())
4314 return Pred == FCmpInst::FCMP_UGE ? getTrue(RetTy) : getFalse(RetTy);
4315 break;
4316 }
4317 default:
4318 break;
4319 }
4320 }
4321
4322 // If the comparison is with the result of a select instruction, check whether
4323 // comparing with either branch of the select always yields the same value.
4325 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
4326 return V;
4327
4328 // If the comparison is with the result of a phi instruction, check whether
4329 // doing the compare with each incoming phi value yields a common result.
4331 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
4332 return V;
4333
4334 return nullptr;
4335}
4336
4338 FastMathFlags FMF, const SimplifyQuery &Q) {
4339 return ::simplifyFCmpInst(Predicate, LHS, RHS, FMF, Q, RecursionLimit);
4340}
4341
4343 ArrayRef<std::pair<Value *, Value *>> Ops,
4344 const SimplifyQuery &Q,
4345 bool AllowRefinement,
4347 unsigned MaxRecurse) {
4348 assert((AllowRefinement || !Q.CanUseUndef) &&
4349 "If AllowRefinement=false then CanUseUndef=false");
4350 for (const auto &OpAndRepOp : Ops) {
4351 // We cannot replace a constant, and shouldn't even try.
4352 if (isa<Constant>(OpAndRepOp.first))
4353 return nullptr;
4354
4355 // Trivial replacement.
4356 if (V == OpAndRepOp.first)
4357 return OpAndRepOp.second;
4358 }
4359
4360 if (!MaxRecurse--)
4361 return nullptr;
4362
4363 auto *I = dyn_cast<Instruction>(V);
4364 if (!I)
4365 return nullptr;
4366
4367 // The arguments of a phi node might refer to a value from a previous
4368 // cycle iteration.
4369 if (isa<PHINode>(I))
4370 return nullptr;
4371
4372 // Don't fold away llvm.is.constant checks based on assumptions.
4374 return nullptr;
4375
4376 // Don't simplify freeze.
4377 if (isa<FreezeInst>(I))
4378 return nullptr;
4379
4380 for (const auto &OpAndRepOp : Ops) {
4381 // For vector types, the simplification must hold per-lane, so forbid
4382 // potentially cross-lane operations like shufflevector.
4383 if (OpAndRepOp.first->getType()->isVectorTy() &&
4385 return nullptr;
4386 }
4387
4388 // Replace Op with RepOp in instruction operands.
4390 bool AnyReplaced = false;
4391 for (Value *InstOp : I->operands()) {
4392 if (Value *NewInstOp = simplifyWithOpsReplaced(
4393 InstOp, Ops, Q, AllowRefinement, DropFlags, MaxRecurse)) {
4394 NewOps.push_back(NewInstOp);
4395 AnyReplaced = InstOp != NewInstOp;
4396 } else {
4397 NewOps.push_back(InstOp);
4398 }
4399
4400 // Bail out if any operand is undef and SimplifyQuery disables undef
4401 // simplification. Constant folding currently doesn't respect this option.
4402 if (isa<UndefValue>(NewOps.back()) && !Q.CanUseUndef)
4403 return nullptr;
4404 }
4405
4406 if (!AnyReplaced)
4407 return nullptr;
4408
4409 if (!AllowRefinement) {
4410 // General InstSimplify functions may refine the result, e.g. by returning
4411 // a constant for a potentially poison value. To avoid this, implement only
4412 // a few non-refining but profitable transforms here.
4413
4414 if (auto *BO = dyn_cast<BinaryOperator>(I)) {
4415 unsigned Opcode = BO->getOpcode();
4416 // id op x -> x, x op id -> x
4417 // Exclude floats, because x op id may produce a different NaN value.
4418 if (!BO->getType()->isFPOrFPVectorTy()) {
4419 if (NewOps[0] == ConstantExpr::getBinOpIdentity(Opcode, I->getType()))
4420 return NewOps[1];
4421 if (NewOps[1] == ConstantExpr::getBinOpIdentity(Opcode, I->getType(),
4422 /* RHS */ true))
4423 return NewOps[0];
4424 }
4425
4426 // x & x -> x, x | x -> x
4427 if ((Opcode == Instruction::And || Opcode == Instruction::Or) &&
4428 NewOps[0] == NewOps[1]) {
4429 // or disjoint x, x results in poison.
4430 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(BO)) {
4431 if (PDI->isDisjoint()) {
4432 if (!DropFlags)
4433 return nullptr;
4434 DropFlags->push_back(BO);
4435 }
4436 }
4437 return NewOps[0];
4438 }
4439
4440 // x - x -> 0, x ^ x -> 0. This is non-refining, because x is non-poison
4441 // by assumption and this case never wraps, so nowrap flags can be
4442 // ignored.
4443 if ((Opcode == Instruction::Sub || Opcode == Instruction::Xor) &&
4444 NewOps[0] == NewOps[1] &&
4445 any_of(Ops, [=](const auto &Rep) { return NewOps[0] == Rep.second; }))
4446 return Constant::getNullValue(I->getType());
4447
4448 // If we are substituting an absorber constant into a binop and extra
4449 // poison can't leak if we remove the select -- because both operands of
4450 // the binop are based on the same value -- then it may be safe to replace
4451 // the value with the absorber constant. Examples:
4452 // (Op == 0) ? 0 : (Op & -Op) --> Op & -Op
4453 // (Op == 0) ? 0 : (Op * (binop Op, C)) --> Op * (binop Op, C)
4454 // (Op == -1) ? -1 : (Op | (binop C, Op) --> Op | (binop C, Op)
4455 Constant *Absorber = ConstantExpr::getBinOpAbsorber(Opcode, I->getType());
4456 if ((NewOps[0] == Absorber || NewOps[1] == Absorber) &&
4457 any_of(Ops,
4458 [=](const auto &Rep) { return impliesPoison(BO, Rep.first); }))
4459 return Absorber;
4460 }
4461
4463 // getelementptr x, 0 -> x.
4464 // This never returns poison, even if inbounds is set.
4465 if (NewOps.size() == 2 && match(NewOps[1], m_Zero()))
4466 return NewOps[0];
4467 }
4468 } else {
4469 // The simplification queries below may return the original value. Consider:
4470 // %div = udiv i32 %arg, %arg2
4471 // %mul = mul nsw i32 %div, %arg2
4472 // %cmp = icmp eq i32 %mul, %arg
4473 // %sel = select i1 %cmp, i32 %div, i32 undef
4474 // Replacing %arg by %mul, %div becomes "udiv i32 %mul, %arg2", which
4475 // simplifies back to %arg. This can only happen because %mul does not
4476 // dominate %div. To ensure a consistent return value contract, we make sure
4477 // that this case returns nullptr as well.
4478 auto PreventSelfSimplify = [V](Value *Simplified) {
4479 return Simplified != V ? Simplified : nullptr;
4480 };
4481
4482 return PreventSelfSimplify(
4483 ::simplifyInstructionWithOperands(I, NewOps, Q, MaxRecurse));
4484 }
4485
4486 // If all operands are constant after substituting Op for RepOp then we can
4487 // constant fold the instruction.
4489 for (Value *NewOp : NewOps) {
4490 if (Constant *ConstOp = dyn_cast<Constant>(NewOp))
4491 ConstOps.push_back(ConstOp);
4492 else
4493 return nullptr;
4494 }
4495
4496 // Consider:
4497 // %cmp = icmp eq i32 %x, 2147483647
4498 // %add = add nsw i32 %x, 1
4499 // %sel = select i1 %cmp, i32 -2147483648, i32 %add
4500 //
4501 // We can't replace %sel with %add unless we strip away the flags (which
4502 // will be done in InstCombine).
4503 // TODO: This may be unsound, because it only catches some forms of
4504 // refinement.
4505 if (!AllowRefinement) {
4506 if (canCreatePoison(cast<Operator>(I), !DropFlags)) {
4507 // abs cannot create poison if the value is known to never be int_min.
4508 if (auto *II = dyn_cast<IntrinsicInst>(I);
4509 II && II->getIntrinsicID() == Intrinsic::abs) {
4510 if (!ConstOps[0]->isNotMinSignedValue())
4511 return nullptr;
4512 } else
4513 return nullptr;
4514 }
4515 Constant *Res = ConstantFoldInstOperands(I, ConstOps, Q.DL, Q.TLI,
4516 /*AllowNonDeterministic=*/false);
4517 if (DropFlags && Res && I->hasPoisonGeneratingAnnotations())
4518 DropFlags->push_back(I);
4519 return Res;
4520 }
4521
4522 return ConstantFoldInstOperands(I, ConstOps, Q.DL, Q.TLI,
4523 /*AllowNonDeterministic=*/false);
4524}
4525
4527 const SimplifyQuery &Q,
4528 bool AllowRefinement,
4530 unsigned MaxRecurse) {
4531 return simplifyWithOpsReplaced(V, {{Op, RepOp}}, Q, AllowRefinement,
4532 DropFlags, MaxRecurse);
4533}
4534
4536 const SimplifyQuery &Q,
4537 bool AllowRefinement,
4538 SmallVectorImpl<Instruction *> *DropFlags) {
4539 // If refinement is disabled, also disable undef simplifications (which are
4540 // always refinements) in SimplifyQuery.
4541 if (!AllowRefinement)
4542 return ::simplifyWithOpReplaced(V, Op, RepOp, Q.getWithoutUndef(),
4543 AllowRefinement, DropFlags, RecursionLimit);
4544 return ::simplifyWithOpReplaced(V, Op, RepOp, Q, AllowRefinement, DropFlags,
4546}
4547
4548/// Try to simplify a select instruction when its condition operand is an
4549/// integer comparison where one operand of the compare is a constant.
4550static Value *simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X,
4551 const APInt *Y, bool TrueWhenUnset) {
4552 const APInt *C;
4553
4554 // (X & Y) == 0 ? X & ~Y : X --> X
4555 // (X & Y) != 0 ? X & ~Y : X --> X & ~Y
4556 if (FalseVal == X && match(TrueVal, m_And(m_Specific(X), m_APInt(C))) &&
4557 *Y == ~*C)
4558 return TrueWhenUnset ? FalseVal : TrueVal;
4559
4560 // (X & Y) == 0 ? X : X & ~Y --> X & ~Y
4561 // (X & Y) != 0 ? X : X & ~Y --> X
4562 if (TrueVal == X && match(FalseVal, m_And(m_Specific(X), m_APInt(C))) &&
4563 *Y == ~*C)
4564 return TrueWhenUnset ? FalseVal : TrueVal;
4565
4566 if (Y->isPowerOf2()) {
4567 // (X & Y) == 0 ? X | Y : X --> X | Y
4568 // (X & Y) != 0 ? X | Y : X --> X
4569 if (FalseVal == X && match(TrueVal, m_Or(m_Specific(X), m_APInt(C))) &&
4570 *Y == *C) {
4571 // We can't return the or if it has the disjoint flag.
4572 if (TrueWhenUnset && cast<PossiblyDisjointInst>(TrueVal)->isDisjoint())
4573 return nullptr;
4574 return TrueWhenUnset ? TrueVal : FalseVal;
4575 }
4576
4577 // (X & Y) == 0 ? X : X | Y --> X
4578 // (X & Y) != 0 ? X : X | Y --> X | Y
4579 if (TrueVal == X && match(FalseVal, m_Or(m_Specific(X), m_APInt(C))) &&
4580 *Y == *C) {
4581 // We can't return the or if it has the disjoint flag.
4582 if (!TrueWhenUnset && cast<PossiblyDisjointInst>(FalseVal)->isDisjoint())
4583 return nullptr;
4584 return TrueWhenUnset ? TrueVal : FalseVal;
4585 }
4586 }
4587
4588 return nullptr;
4589}
4590
4591static Value *simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS,
4592 CmpPredicate Pred, Value *TVal,
4593 Value *FVal) {
4594 // Canonicalize common cmp+sel operand as CmpLHS.
4595 if (CmpRHS == TVal || CmpRHS == FVal) {
4596 std::swap(CmpLHS, CmpRHS);
4597 Pred = ICmpInst::getSwappedPredicate(Pred);
4598 }
4599
4600 // Canonicalize common cmp+sel operand as TVal.
4601 if (CmpLHS == FVal) {
4602 std::swap(TVal, FVal);
4603 Pred = ICmpInst::getInversePredicate(Pred);
4604 }
4605
4606 // A vector select may be shuffling together elements that are equivalent
4607 // based on the max/min/select relationship.
4608 Value *X = CmpLHS, *Y = CmpRHS;
4609 bool PeekedThroughSelectShuffle = false;
4610 auto *Shuf = dyn_cast<ShuffleVectorInst>(FVal);
4611 if (Shuf && Shuf->isSelect()) {
4612 if (Shuf->getOperand(0) == Y)
4613 FVal = Shuf->getOperand(1);
4614 else if (Shuf->getOperand(1) == Y)
4615 FVal = Shuf->getOperand(0);
4616 else
4617 return nullptr;
4618 PeekedThroughSelectShuffle = true;
4619 }
4620
4621 // (X pred Y) ? X : max/min(X, Y)
4622 auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal);
4623 if (!MMI || TVal != X ||
4625 return nullptr;
4626
4627 // (X > Y) ? X : max(X, Y) --> max(X, Y)
4628 // (X >= Y) ? X : max(X, Y) --> max(X, Y)
4629 // (X < Y) ? X : min(X, Y) --> min(X, Y)
4630 // (X <= Y) ? X : min(X, Y) --> min(X, Y)
4631 //
4632 // The equivalence allows a vector select (shuffle) of max/min and Y. Ex:
4633 // (X > Y) ? X : (Z ? max(X, Y) : Y)
4634 // If Z is true, this reduces as above, and if Z is false:
4635 // (X > Y) ? X : Y --> max(X, Y)
4636 ICmpInst::Predicate MMPred = MMI->getPredicate();
4637 if (MMPred == CmpInst::getStrictPredicate(Pred))
4638 return MMI;
4639
4640 // Other transforms are not valid with a shuffle.
4641 if (PeekedThroughSelectShuffle)
4642 return nullptr;
4643
4644 // (X == Y) ? X : max/min(X, Y) --> max/min(X, Y)
4645 if (Pred == CmpInst::ICMP_EQ)
4646 return MMI;
4647
4648 // (X != Y) ? X : max/min(X, Y) --> X
4649 if (Pred == CmpInst::ICMP_NE)
4650 return X;
4651
4652 // (X < Y) ? X : max(X, Y) --> X
4653 // (X <= Y) ? X : max(X, Y) --> X
4654 // (X > Y) ? X : min(X, Y) --> X
4655 // (X >= Y) ? X : min(X, Y) --> X
4657 if (MMPred == CmpInst::getStrictPredicate(InvPred))
4658 return X;
4659
4660 return nullptr;
4661}
4662
4663/// An alternative way to test if a bit is set or not.
4664/// uses e.g. sgt/slt or trunc instead of eq/ne.
4665static Value *simplifySelectWithBitTest(Value *CondVal, Value *TrueVal,
4666 Value *FalseVal) {
4667 if (auto Res = decomposeBitTest(CondVal))
4668 return simplifySelectBitTest(TrueVal, FalseVal, Res->X, &Res->Mask,
4669 Res->Pred == ICmpInst::ICMP_EQ);
4670
4671 return nullptr;
4672}
4673
4674/// Try to simplify a select instruction when its condition operand is an
4675/// integer equality or floating-point equivalence comparison.
4677 ArrayRef<std::pair<Value *, Value *>> Replacements, Value *TrueVal,
4678 Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse) {
4679 Value *SimplifiedFalseVal =
4680 simplifyWithOpsReplaced(FalseVal, Replacements, Q.getWithoutUndef(),
4681 /* AllowRefinement */ false,
4682 /* DropFlags */ nullptr, MaxRecurse);
4683 if (!SimplifiedFalseVal)
4684 SimplifiedFalseVal = FalseVal;
4685
4686 Value *SimplifiedTrueVal =
4687 simplifyWithOpsReplaced(TrueVal, Replacements, Q,
4688 /* AllowRefinement */ true,
4689 /* DropFlags */ nullptr, MaxRecurse);
4690 if (!SimplifiedTrueVal)
4691 SimplifiedTrueVal = TrueVal;
4692
4693 if (SimplifiedFalseVal == SimplifiedTrueVal)
4694 return FalseVal;
4695
4696 return nullptr;
4697}
4698
4699/// Try to simplify a select instruction when its condition operand is an
4700/// integer comparison.
4701static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
4702 Value *FalseVal,
4703 const SimplifyQuery &Q,
4704 unsigned MaxRecurse) {
4705 CmpPredicate Pred;
4706 Value *CmpLHS, *CmpRHS;
4707 if (!match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
4708 return nullptr;
4709
4710 if (Value *V = simplifyCmpSelOfMaxMin(CmpLHS, CmpRHS, Pred, TrueVal, FalseVal))
4711 return V;
4712
4713 // Canonicalize ne to eq predicate.
4714 if (Pred == ICmpInst::ICMP_NE) {
4715 Pred = ICmpInst::ICMP_EQ;
4716 std::swap(TrueVal, FalseVal);
4717 }
4718
4719 // Check for integer min/max with a limit constant:
4720 // X > MIN_INT ? X : MIN_INT --> X
4721 // X < MAX_INT ? X : MAX_INT --> X
4722 if (TrueVal->getType()->isIntOrIntVectorTy()) {
4723 Value *X, *Y;
4725 matchDecomposedSelectPattern(cast<ICmpInst>(CondVal), TrueVal, FalseVal,
4726 X, Y)
4727 .Flavor;
4728 if (SelectPatternResult::isMinOrMax(SPF) && Pred == getMinMaxPred(SPF)) {
4730 X->getType()->getScalarSizeInBits());
4731 if (match(Y, m_SpecificInt(LimitC)))
4732 return X;
4733 }
4734 }
4735
4736 if (Pred == ICmpInst::ICMP_EQ && match(CmpRHS, m_Zero())) {
4737 Value *X;
4738 const APInt *Y;
4739 if (match(CmpLHS, m_And(m_Value(X), m_APInt(Y))))
4740 if (Value *V = simplifySelectBitTest(TrueVal, FalseVal, X, Y,
4741 /*TrueWhenUnset=*/true))
4742 return V;
4743
4744 // Test for a bogus zero-shift-guard-op around funnel-shift or rotate.
4745 Value *ShAmt;
4746 auto isFsh = m_CombineOr(m_FShl(m_Value(X), m_Value(), m_Value(ShAmt)),
4747 m_FShr(m_Value(), m_Value(X), m_Value(ShAmt)));
4748 // (ShAmt == 0) ? fshl(X, *, ShAmt) : X --> X
4749 // (ShAmt == 0) ? fshr(*, X, ShAmt) : X --> X
4750 if (match(TrueVal, isFsh) && FalseVal == X && CmpLHS == ShAmt)
4751 return X;
4752
4753 // Test for a zero-shift-guard-op around rotates. These are used to
4754 // avoid UB from oversized shifts in raw IR rotate patterns, but the
4755 // intrinsics do not have that problem.
4756 // We do not allow this transform for the general funnel shift case because
4757 // that would not preserve the poison safety of the original code.
4758 auto isRotate =
4760 m_FShr(m_Value(X), m_Deferred(X), m_Value(ShAmt)));
4761 // (ShAmt == 0) ? X : fshl(X, X, ShAmt) --> fshl(X, X, ShAmt)
4762 // (ShAmt == 0) ? X : fshr(X, X, ShAmt) --> fshr(X, X, ShAmt)
4763 if (match(FalseVal, isRotate) && TrueVal == X && CmpLHS == ShAmt &&
4764 Pred == ICmpInst::ICMP_EQ)
4765 return FalseVal;
4766
4767 // X == 0 ? abs(X) : -abs(X) --> -abs(X)
4768 // X == 0 ? -abs(X) : abs(X) --> abs(X)
4769 if (match(TrueVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))) &&
4771 return FalseVal;
4772 if (match(TrueVal,
4774 match(FalseVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))))
4775 return FalseVal;
4776 }
4777
4778 // If we have a scalar equality comparison, then we know the value in one of
4779 // the arms of the select. See if substituting this value into the arm and
4780 // simplifying the result yields the same value as the other arm.
4781 if (Pred == ICmpInst::ICMP_EQ) {
4782 if (CmpLHS->getType()->isIntOrIntVectorTy() ||
4783 canReplacePointersIfEqual(CmpLHS, CmpRHS, Q.DL))
4784 if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, TrueVal,
4785 FalseVal, Q, MaxRecurse))
4786 return V;
4787 if (CmpLHS->getType()->isIntOrIntVectorTy() ||
4788 canReplacePointersIfEqual(CmpRHS, CmpLHS, Q.DL))
4789 if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, TrueVal,
4790 FalseVal, Q, MaxRecurse))
4791 return V;
4792
4793 Value *X;
4794 Value *Y;
4795 // select((X | Y) == 0 ? X : 0) --> 0 (commuted 2 ways)
4796 if (match(CmpLHS, m_Or(m_Value(X), m_Value(Y))) &&
4797 match(CmpRHS, m_Zero())) {
4798 // (X | Y) == 0 implies X == 0 and Y == 0.
4800 {{X, CmpRHS}, {Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4801 return V;
4802 }
4803
4804 // select((X & Y) == -1 ? X : -1) --> -1 (commuted 2 ways)
4805 if (match(CmpLHS, m_And(m_Value(X), m_Value(Y))) &&
4806 match(CmpRHS, m_AllOnes())) {
4807 // (X & Y) == -1 implies X == -1 and Y == -1.
4809 {{X, CmpRHS}, {Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4810 return V;
4811 }
4812 }
4813
4814 return nullptr;
4815}
4816
4817/// Try to simplify a select instruction when its condition operand is a
4818/// floating-point comparison.
4820 const SimplifyQuery &Q,
4821 unsigned MaxRecurse) {
4822 CmpPredicate Pred;
4823 Value *CmpLHS, *CmpRHS;
4824 if (!match(Cond, m_FCmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
4825 return nullptr;
4827
4828 bool IsEquiv = I->isEquivalence();
4829 if (I->isEquivalence(/*Invert=*/true)) {
4830 std::swap(T, F);
4831 Pred = FCmpInst::getInversePredicate(Pred);
4832 IsEquiv = true;
4833 }
4834
4835 // This transforms is safe if at least one operand is known to not be zero.
4836 // Otherwise, the select can change the sign of a zero operand.
4837 if (IsEquiv) {
4838 if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, T, F, Q,
4839 MaxRecurse))
4840 return V;
4841 if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, T, F, Q,
4842 MaxRecurse))
4843 return V;
4844 }
4845
4846 // Canonicalize CmpLHS to be T, and CmpRHS to be F, if they're swapped.
4847 if (CmpLHS == F && CmpRHS == T)
4848 std::swap(CmpLHS, CmpRHS);
4849
4850 if (CmpLHS != T || CmpRHS != F)
4851 return nullptr;
4852
4853 // This transform is also safe if we do not have (do not care about) -0.0.
4854 if (Q.CxtI && isa<FPMathOperator>(Q.CxtI) && Q.CxtI->hasNoSignedZeros()) {
4855 // (T == F) ? T : F --> F
4856 if (Pred == FCmpInst::FCMP_OEQ)
4857 return F;
4858
4859 // (T != F) ? T : F --> T
4860 if (Pred == FCmpInst::FCMP_UNE)
4861 return T;
4862 }
4863
4864 return nullptr;
4865}
4866
4867/// Given operands for a SelectInst, see if we can fold the result.
4868/// If not, this returns null.
4869static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
4870 const SimplifyQuery &Q, unsigned MaxRecurse) {
4871 if (auto *CondC = dyn_cast<Constant>(Cond)) {
4872 if (auto *TrueC = dyn_cast<Constant>(TrueVal))
4873 if (auto *FalseC = dyn_cast<Constant>(FalseVal))
4874 if (Constant *C = ConstantFoldSelectInstruction(CondC, TrueC, FalseC))
4875 return C;
4876
4877 // select poison, X, Y -> poison
4878 if (isa<PoisonValue>(CondC))
4879 return PoisonValue::get(TrueVal->getType());
4880
4881 // select undef, X, Y -> X or Y
4882 if (Q.isUndefValue(CondC))
4883 return isa<Constant>(FalseVal) ? FalseVal : TrueVal;
4884
4885 // select true, X, Y --> X
4886 // select false, X, Y --> Y
4887 // For vectors, allow undef/poison elements in the condition to match the
4888 // defined elements, so we can eliminate the select.
4889 if (match(CondC, m_One()))
4890 return TrueVal;
4891 if (match(CondC, m_Zero()))
4892 return FalseVal;
4893 }
4894
4895 assert(Cond->getType()->isIntOrIntVectorTy(1) &&
4896 "Select must have bool or bool vector condition");
4897 assert(TrueVal->getType() == FalseVal->getType() &&
4898 "Select must have same types for true/false ops");
4899
4900 if (Cond->getType() == TrueVal->getType()) {
4901 // select i1 Cond, i1 true, i1 false --> i1 Cond
4902 if (match(TrueVal, m_One()) && match(FalseVal, m_ZeroInt()))
4903 return Cond;
4904
4905 // (X && Y) ? X : Y --> Y (commuted 2 ways)
4906 if (match(Cond, m_c_LogicalAnd(m_Specific(TrueVal), m_Specific(FalseVal))))
4907 return FalseVal;
4908
4909 // (X || Y) ? X : Y --> X (commuted 2 ways)
4910 if (match(Cond, m_c_LogicalOr(m_Specific(TrueVal), m_Specific(FalseVal))))
4911 return TrueVal;
4912
4913 // (X || Y) ? false : X --> false (commuted 2 ways)
4914 if (match(Cond, m_c_LogicalOr(m_Specific(FalseVal), m_Value())) &&
4915 match(TrueVal, m_ZeroInt()))
4916 return ConstantInt::getFalse(Cond->getType());
4917
4918 // Match patterns that end in logical-and.
4919 if (match(FalseVal, m_ZeroInt())) {
4920 // !(X || Y) && X --> false (commuted 2 ways)
4921 if (match(Cond, m_Not(m_c_LogicalOr(m_Specific(TrueVal), m_Value()))))
4922 return ConstantInt::getFalse(Cond->getType());
4923 // X && !(X || Y) --> false (commuted 2 ways)
4924 if (match(TrueVal, m_Not(m_c_LogicalOr(m_Specific(Cond), m_Value()))))
4925 return ConstantInt::getFalse(Cond->getType());
4926
4927 // (X || Y) && Y --> Y (commuted 2 ways)
4928 if (match(Cond, m_c_LogicalOr(m_Specific(TrueVal), m_Value())))
4929 return TrueVal;
4930 // Y && (X || Y) --> Y (commuted 2 ways)
4931 if (match(TrueVal, m_c_LogicalOr(m_Specific(Cond), m_Value())))
4932 return Cond;
4933
4934 // (X || Y) && (X || !Y) --> X (commuted 8 ways)
4935 Value *X, *Y;
4938 return X;
4939 if (match(TrueVal, m_c_LogicalOr(m_Value(X), m_Not(m_Value(Y)))) &&
4941 return X;
4942 }
4943
4944 // Match patterns that end in logical-or.
4945 if (match(TrueVal, m_One())) {
4946 // !(X && Y) || X --> true (commuted 2 ways)
4947 if (match(Cond, m_Not(m_c_LogicalAnd(m_Specific(FalseVal), m_Value()))))
4948 return ConstantInt::getTrue(Cond->getType());
4949 // X || !(X && Y) --> true (commuted 2 ways)
4950 if (match(FalseVal, m_Not(m_c_LogicalAnd(m_Specific(Cond), m_Value()))))
4951 return ConstantInt::getTrue(Cond->getType());
4952
4953 // (X && Y) || Y --> Y (commuted 2 ways)
4954 if (match(Cond, m_c_LogicalAnd(m_Specific(FalseVal), m_Value())))
4955 return FalseVal;
4956 // Y || (X && Y) --> Y (commuted 2 ways)
4957 if (match(FalseVal, m_c_LogicalAnd(m_Specific(Cond), m_Value())))
4958 return Cond;
4959 }
4960 }
4961
4962 // select ?, X, X -> X
4963 if (TrueVal == FalseVal)
4964 return TrueVal;
4965
4966 if (Cond == TrueVal) {
4967 // select i1 X, i1 X, i1 false --> X (logical-and)
4968 if (match(FalseVal, m_ZeroInt()))
4969 return Cond;
4970 // select i1 X, i1 X, i1 true --> true
4971 if (match(FalseVal, m_One()))
4972 return ConstantInt::getTrue(Cond->getType());
4973 }
4974 if (Cond == FalseVal) {
4975 // select i1 X, i1 true, i1 X --> X (logical-or)
4976 if (match(TrueVal, m_One()))
4977 return Cond;
4978 // select i1 X, i1 false, i1 X --> false
4979 if (match(TrueVal, m_ZeroInt()))
4980 return ConstantInt::getFalse(Cond->getType());
4981 }
4982
4983 // If the true or false value is poison, we can fold to the other value.
4984 // If the true or false value is undef, we can fold to the other value as
4985 // long as the other value isn't poison.
4986 // select ?, poison, X -> X
4987 // select ?, undef, X -> X
4988 if (isa<PoisonValue>(TrueVal) ||
4989 (Q.isUndefValue(TrueVal) && impliesPoison(FalseVal, Cond)))
4990 return FalseVal;
4991 // select ?, X, poison -> X
4992 // select ?, X, undef -> X
4993 if (isa<PoisonValue>(FalseVal) ||
4994 (Q.isUndefValue(FalseVal) && impliesPoison(TrueVal, Cond)))
4995 return TrueVal;
4996
4997 // Deal with partial undef vector constants: select ?, VecC, VecC' --> VecC''
4998 Constant *TrueC, *FalseC;
4999 if (isa<FixedVectorType>(TrueVal->getType()) &&
5000 match(TrueVal, m_Constant(TrueC)) &&
5001 match(FalseVal, m_Constant(FalseC))) {
5002 unsigned NumElts =
5003 cast<FixedVectorType>(TrueC->getType())->getNumElements();
5005 for (unsigned i = 0; i != NumElts; ++i) {
5006 // Bail out on incomplete vector constants.
5007 Constant *TEltC = TrueC->getAggregateElement(i);
5008 Constant *FEltC = FalseC->getAggregateElement(i);
5009 if (!TEltC || !FEltC)
5010 break;
5011
5012 // If the elements match (undef or not), that value is the result. If only
5013 // one element is undef, choose the defined element as the safe result.
5014 if (TEltC == FEltC)
5015 NewC.push_back(TEltC);
5016 else if (isa<PoisonValue>(TEltC) ||
5017 (Q.isUndefValue(TEltC) && isGuaranteedNotToBePoison(FEltC)))
5018 NewC.push_back(FEltC);
5019 else if (isa<PoisonValue>(FEltC) ||
5020 (Q.isUndefValue(FEltC) && isGuaranteedNotToBePoison(TEltC)))
5021 NewC.push_back(TEltC);
5022 else
5023 break;
5024 }
5025 if (NewC.size() == NumElts)
5026 return ConstantVector::get(NewC);
5027 }
5028
5029 if (Value *V =
5030 simplifySelectWithICmpCond(Cond, TrueVal, FalseVal, Q, MaxRecurse))
5031 return V;
5032
5033 if (Value *V = simplifySelectWithBitTest(Cond, TrueVal, FalseVal))
5034 return V;
5035
5036 if (Value *V = simplifySelectWithFCmp(Cond, TrueVal, FalseVal, Q, MaxRecurse))
5037 return V;
5038
5039 std::optional<bool> Imp = isImpliedByDomCondition(Cond, Q.CxtI, Q.DL);
5040 if (Imp)
5041 return *Imp ? TrueVal : FalseVal;
5042
5043 return nullptr;
5044}
5045
5047 const SimplifyQuery &Q) {
5048 return ::simplifySelectInst(Cond, TrueVal, FalseVal, Q, RecursionLimit);
5049}
5050
5051/// Given operands for an GetElementPtrInst, see if we can fold the result.
5052/// If not, this returns null.
5055 const SimplifyQuery &Q, unsigned) {
5056 // The type of the GEP pointer operand.
5057 unsigned AS =
5058 cast<PointerType>(Ptr->getType()->getScalarType())->getAddressSpace();
5059
5060 // getelementptr P -> P.
5061 if (Indices.empty())
5062 return Ptr;
5063
5064 // Compute the (pointer) type returned by the GEP instruction.
5065 Type *LastType = GetElementPtrInst::getIndexedType(SrcTy, Indices);
5066 Type *GEPTy = Ptr->getType();
5067 if (!GEPTy->isVectorTy()) {
5068 for (Value *Op : Indices) {
5069 // If one of the operands is a vector, the result type is a vector of
5070 // pointers. All vector operands must have the same number of elements.
5071 if (VectorType *VT = dyn_cast<VectorType>(Op->getType())) {
5072 GEPTy = VectorType::get(GEPTy, VT->getElementCount());
5073 break;
5074 }
5075 }
5076 }
5077
5078 // All-zero GEP is a no-op, unless it performs a vector splat.
5079 if (Ptr->getType() == GEPTy && all_of(Indices, match_fn(m_Zero())))
5080 return Ptr;
5081
5082 // getelementptr poison, idx -> poison
5083 // getelementptr baseptr, poison -> poison
5085 return PoisonValue::get(GEPTy);
5086
5087 // getelementptr undef, idx -> undef
5088 if (Q.isUndefValue(Ptr))
5089 return UndefValue::get(GEPTy);
5090
5091 bool IsScalableVec =
5092 SrcTy->isScalableTy() || any_of(Indices, [](const Value *V) {
5093 return isa<ScalableVectorType>(V->getType());
5094 });
5095
5096 if (Indices.size() == 1) {
5097 Type *Ty = SrcTy;
5098 if (!IsScalableVec && Ty->isSized()) {
5099 Value *P;
5100 uint64_t C;
5101 uint64_t TyAllocSize = Q.DL.getTypeAllocSize(Ty);
5102 // getelementptr P, N -> P if P points to a type of zero size.
5103 if (TyAllocSize == 0 && Ptr->getType() == GEPTy)
5104 return Ptr;
5105
5106 // The following transforms are only safe if the ptrtoint cast
5107 // doesn't truncate the pointers.
5108 if (Indices[0]->getType()->getScalarSizeInBits() ==
5109 Q.DL.getPointerSizeInBits(AS)) {
5110 auto CanSimplify = [GEPTy, &P, Ptr]() -> bool {
5111 return P->getType() == GEPTy &&
5113 };
5114 // getelementptr V, (sub P, V) -> P if P points to a type of size 1.
5115 if (TyAllocSize == 1 &&
5116 match(Indices[0],
5118 CanSimplify())
5119 return P;
5120
5121 // getelementptr V, (ashr (sub P, V), C) -> P if P points to a type of
5122 // size 1 << C.
5123 if (match(Indices[0], m_AShr(m_Sub(m_PtrToInt(m_Value(P)),
5125 m_ConstantInt(C))) &&
5126 TyAllocSize == 1ULL << C && CanSimplify())
5127 return P;
5128
5129 // getelementptr V, (sdiv (sub P, V), C) -> P if P points to a type of
5130 // size C.
5131 if (match(Indices[0], m_SDiv(m_Sub(m_PtrToInt(m_Value(P)),
5133 m_SpecificInt(TyAllocSize))) &&
5134 CanSimplify())
5135 return P;
5136 }
5137 }
5138 }
5139
5140 if (!IsScalableVec && Q.DL.getTypeAllocSize(LastType) == 1 &&
5141 all_of(Indices.drop_back(1), match_fn(m_Zero()))) {
5142 unsigned IdxWidth =
5143 Q.DL.getIndexSizeInBits(Ptr->getType()->getPointerAddressSpace());
5144 if (Q.DL.getTypeSizeInBits(Indices.back()->getType()) == IdxWidth) {
5145 APInt BasePtrOffset(IdxWidth, 0);
5146 Value *StrippedBasePtr =
5147 Ptr->stripAndAccumulateInBoundsConstantOffsets(Q.DL, BasePtrOffset);
5148
5149 // Avoid creating inttoptr of zero here: While LLVMs treatment of
5150 // inttoptr is generally conservative, this particular case is folded to
5151 // a null pointer, which will have incorrect provenance.
5152
5153 // gep (gep V, C), (sub 0, V) -> C
5154 if (match(Indices.back(),
5155 m_Neg(m_PtrToInt(m_Specific(StrippedBasePtr)))) &&
5156 !BasePtrOffset.isZero()) {
5157 auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset);
5158 return ConstantExpr::getIntToPtr(CI, GEPTy);
5159 }
5160 // gep (gep V, C), (xor V, -1) -> C-1
5161 if (match(Indices.back(),
5162 m_Xor(m_PtrToInt(m_Specific(StrippedBasePtr)), m_AllOnes())) &&
5163 !BasePtrOffset.isOne()) {
5164 auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset - 1);
5165 return ConstantExpr::getIntToPtr(CI, GEPTy);
5166 }
5167 }
5168 }
5169
5170 // Check to see if this is constant foldable.
5171 if (!isa<Constant>(Ptr) || !all_of(Indices, IsaPred<Constant>))
5172 return nullptr;
5173
5175 return ConstantFoldGetElementPtr(SrcTy, cast<Constant>(Ptr), std::nullopt,
5176 Indices);
5177
5178 auto *CE =
5180 return ConstantFoldConstant(CE, Q.DL);
5181}
5182
5184 GEPNoWrapFlags NW, const SimplifyQuery &Q) {
5185 return ::simplifyGEPInst(SrcTy, Ptr, Indices, NW, Q, RecursionLimit);
5186}
5187
5188/// Given operands for an InsertValueInst, see if we can fold the result.
5189/// If not, this returns null.
5191 ArrayRef<unsigned> Idxs,
5192 const SimplifyQuery &Q, unsigned) {
5193 if (Constant *CAgg = dyn_cast<Constant>(Agg))
5194 if (Constant *CVal = dyn_cast<Constant>(Val))
5195 return ConstantFoldInsertValueInstruction(CAgg, CVal, Idxs);
5196
5197 // insertvalue x, poison, n -> x
5198 // insertvalue x, undef, n -> x if x cannot be poison
5199 if (isa<PoisonValue>(Val) ||
5200 (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Agg)))
5201 return Agg;
5202
5203 // insertvalue x, (extractvalue y, n), n
5205 if (EV->getAggregateOperand()->getType() == Agg->getType() &&
5206 EV->getIndices() == Idxs) {
5207 // insertvalue poison, (extractvalue y, n), n -> y
5208 // insertvalue undef, (extractvalue y, n), n -> y if y cannot be poison
5209 if (isa<PoisonValue>(Agg) ||
5210 (Q.isUndefValue(Agg) &&
5211 isGuaranteedNotToBePoison(EV->getAggregateOperand())))
5212 return EV->getAggregateOperand();
5213
5214 // insertvalue y, (extractvalue y, n), n -> y
5215 if (Agg == EV->getAggregateOperand())
5216 return Agg;
5217 }
5218
5219 return nullptr;
5220}
5221
5223 ArrayRef<unsigned> Idxs,
5224 const SimplifyQuery &Q) {
5225 return ::simplifyInsertValueInst(Agg, Val, Idxs, Q, RecursionLimit);
5226}
5227
5229 const SimplifyQuery &Q) {
5230 // Try to constant fold.
5231 auto *VecC = dyn_cast<Constant>(Vec);
5232 auto *ValC = dyn_cast<Constant>(Val);
5233 auto *IdxC = dyn_cast<Constant>(Idx);
5234 if (VecC && ValC && IdxC)
5235 return ConstantExpr::getInsertElement(VecC, ValC, IdxC);
5236
5237 // For fixed-length vector, fold into poison if index is out of bounds.
5238 if (auto *CI = dyn_cast<ConstantInt>(Idx)) {
5239 if (isa<FixedVectorType>(Vec->getType()) &&
5240 CI->uge(cast<FixedVectorType>(Vec->getType())->getNumElements()))
5241 return PoisonValue::get(Vec->getType());
5242 }
5243
5244 // If index is undef, it might be out of bounds (see above case)
5245 if (Q.isUndefValue(Idx))
5246 return PoisonValue::get(Vec->getType());
5247
5248 // If the scalar is poison, or it is undef and there is no risk of
5249 // propagating poison from the vector value, simplify to the vector value.
5250 if (isa<PoisonValue>(Val) ||
5251 (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Vec)))
5252 return Vec;
5253
5254 // Inserting the splatted value into a constant splat does nothing.
5255 if (VecC && ValC && VecC->getSplatValue() == ValC)
5256 return Vec;
5257
5258 // If we are extracting a value from a vector, then inserting it into the same
5259 // place, that's the input vector:
5260 // insertelt Vec, (extractelt Vec, Idx), Idx --> Vec
5261 if (match(Val, m_ExtractElt(m_Specific(Vec), m_Specific(Idx))))
5262 return Vec;
5263
5264 return nullptr;
5265}
5266
5267/// Given operands for an ExtractValueInst, see if we can fold the result.
5268/// If not, this returns null.
5270 const SimplifyQuery &, unsigned) {
5271 if (auto *CAgg = dyn_cast<Constant>(Agg))
5272 return ConstantFoldExtractValueInstruction(CAgg, Idxs);
5273
5274 // extractvalue x, (insertvalue y, elt, n), n -> elt
5275 unsigned NumIdxs = Idxs.size();
5276 for (auto *IVI = dyn_cast<InsertValueInst>(Agg); IVI != nullptr;
5277 IVI = dyn_cast<InsertValueInst>(IVI->getAggregateOperand())) {
5278 ArrayRef<unsigned> InsertValueIdxs = IVI->getIndices();
5279 unsigned NumInsertValueIdxs = InsertValueIdxs.size();
5280 unsigned NumCommonIdxs = std::min(NumInsertValueIdxs, NumIdxs);
5281 if (InsertValueIdxs.slice(0, NumCommonIdxs) ==
5282 Idxs.slice(0, NumCommonIdxs)) {
5283 if (NumIdxs == NumInsertValueIdxs)
5284 return IVI->getInsertedValueOperand();
5285 break;
5286 }
5287 }
5288
5289 // Simplify umul_with_overflow where one operand is 1.
5290 Value *V;
5291 if (Idxs.size() == 1 &&
5292 (match(Agg,
5295 m_Value(V))))) {
5296 if (Idxs[0] == 0)
5297 return V;
5298 assert(Idxs[0] == 1 && "invalid index");
5299 return getFalse(CmpInst::makeCmpResultType(V->getType()));
5300 }
5301
5302 return nullptr;
5303}
5304
5306 const SimplifyQuery &Q) {
5307 return ::simplifyExtractValueInst(Agg, Idxs, Q, RecursionLimit);
5308}
5309
5310/// Given operands for an ExtractElementInst, see if we can fold the result.
5311/// If not, this returns null.
5313 const SimplifyQuery &Q, unsigned) {
5314 auto *VecVTy = cast<VectorType>(Vec->getType());
5315 if (auto *CVec = dyn_cast<Constant>(Vec)) {
5316 if (auto *CIdx = dyn_cast<Constant>(Idx))
5317 return ConstantExpr::getExtractElement(CVec, CIdx);
5318
5319 if (Q.isUndefValue(Vec))
5320 return UndefValue::get(VecVTy->getElementType());
5321 }
5322
5323 // An undef extract index can be arbitrarily chosen to be an out-of-range
5324 // index value, which would result in the instruction being poison.
5325 if (Q.isUndefValue(Idx))
5326 return PoisonValue::get(VecVTy->getElementType());
5327
5328 // If extracting a specified index from the vector, see if we can recursively
5329 // find a previously computed scalar that was inserted into the vector.
5330 if (auto *IdxC = dyn_cast<ConstantInt>(Idx)) {
5331 // For fixed-length vector, fold into undef if index is out of bounds.
5332 unsigned MinNumElts = VecVTy->getElementCount().getKnownMinValue();
5333 if (isa<FixedVectorType>(VecVTy) && IdxC->getValue().uge(MinNumElts))
5334 return PoisonValue::get(VecVTy->getElementType());
5335 // Handle case where an element is extracted from a splat.
5336 if (IdxC->getValue().ult(MinNumElts))
5337 if (auto *Splat = getSplatValue(Vec))
5338 return Splat;
5339 if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue()))
5340 return Elt;
5341 } else {
5342 // extractelt x, (insertelt y, elt, n), n -> elt
5343 // If the possibly-variable indices are trivially known to be equal
5344 // (because they are the same operand) then use the value that was
5345 // inserted directly.
5346 auto *IE = dyn_cast<InsertElementInst>(Vec);
5347 if (IE && IE->getOperand(2) == Idx)
5348 return IE->getOperand(1);
5349
5350 // The index is not relevant if our vector is a splat.
5351 if (Value *Splat = getSplatValue(Vec))
5352 return Splat;
5353 }
5354 return nullptr;
5355}
5356
5358 const SimplifyQuery &Q) {
5359 return ::simplifyExtractElementInst(Vec, Idx, Q, RecursionLimit);
5360}
5361
5362/// See if we can fold the given phi. If not, returns null.
5364 const SimplifyQuery &Q) {
5365 // WARNING: no matter how worthwhile it may seem, we can not perform PHI CSE
5366 // here, because the PHI we may succeed simplifying to was not
5367 // def-reachable from the original PHI!
5368
5369 // If all of the PHI's incoming values are the same then replace the PHI node
5370 // with the common value.
5371 Value *CommonValue = nullptr;
5372 bool HasPoisonInput = false;
5373 bool HasUndefInput = false;
5374 for (Value *Incoming : IncomingValues) {
5375 // If the incoming value is the phi node itself, it can safely be skipped.
5376 if (Incoming == PN)
5377 continue;
5379 HasPoisonInput = true;
5380 continue;
5381 }
5382 if (Q.isUndefValue(Incoming)) {
5383 // Remember that we saw an undef value, but otherwise ignore them.
5384 HasUndefInput = true;
5385 continue;
5386 }
5387 if (CommonValue && Incoming != CommonValue)
5388 return nullptr; // Not the same, bail out.
5389 CommonValue = Incoming;
5390 }
5391
5392 // If CommonValue is null then all of the incoming values were either undef,
5393 // poison or equal to the phi node itself.
5394 if (!CommonValue)
5395 return HasUndefInput ? UndefValue::get(PN->getType())
5396 : PoisonValue::get(PN->getType());
5397
5398 if (HasPoisonInput || HasUndefInput) {
5399 // If we have a PHI node like phi(X, undef, X), where X is defined by some
5400 // instruction, we cannot return X as the result of the PHI node unless it
5401 // dominates the PHI block.
5402 if (!valueDominatesPHI(CommonValue, PN, Q.DT))
5403 return nullptr;
5404
5405 // Make sure we do not replace an undef value with poison.
5406 if (HasUndefInput &&
5407 !isGuaranteedNotToBePoison(CommonValue, Q.AC, Q.CxtI, Q.DT))
5408 return nullptr;
5409 return CommonValue;
5410 }
5411
5412 return CommonValue;
5413}
5414
5415static Value *simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
5416 const SimplifyQuery &Q, unsigned MaxRecurse) {
5417 if (auto *C = dyn_cast<Constant>(Op))
5418 return ConstantFoldCastOperand(CastOpc, C, Ty, Q.DL);
5419
5420 if (auto *CI = dyn_cast<CastInst>(Op)) {
5421 auto *Src = CI->getOperand(0);
5422 Type *SrcTy = Src->getType();
5423 Type *MidTy = CI->getType();
5424 Type *DstTy = Ty;
5425 if (Src->getType() == Ty) {
5426 auto FirstOp = CI->getOpcode();
5427 auto SecondOp = static_cast<Instruction::CastOps>(CastOpc);
5428 Type *SrcIntPtrTy =
5429 SrcTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(SrcTy) : nullptr;
5430 Type *MidIntPtrTy =
5431 MidTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(MidTy) : nullptr;
5432 Type *DstIntPtrTy =
5433 DstTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(DstTy) : nullptr;
5434 if (CastInst::isEliminableCastPair(FirstOp, SecondOp, SrcTy, MidTy, DstTy,
5435 SrcIntPtrTy, MidIntPtrTy,
5436 DstIntPtrTy) == Instruction::BitCast)
5437 return Src;
5438 }
5439 }
5440
5441 // bitcast x -> x
5442 if (CastOpc == Instruction::BitCast)
5443 if (Op->getType() == Ty)
5444 return Op;
5445
5446 // ptrtoint (ptradd (Ptr, X - ptrtoint(Ptr))) -> X
5447 Value *Ptr, *X;
5448 if (CastOpc == Instruction::PtrToInt &&
5451 X->getType() == Ty && Ty == Q.DL.getIndexType(Ptr->getType()))
5452 return X;
5453
5454 return nullptr;
5455}
5456
5457Value *llvm::simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
5458 const SimplifyQuery &Q) {
5459 return ::simplifyCastInst(CastOpc, Op, Ty, Q, RecursionLimit);
5460}
5461
5462/// For the given destination element of a shuffle, peek through shuffles to
5463/// match a root vector source operand that contains that element in the same
5464/// vector lane (ie, the same mask index), so we can eliminate the shuffle(s).
5465static Value *foldIdentityShuffles(int DestElt, Value *Op0, Value *Op1,
5466 int MaskVal, Value *RootVec,
5467 unsigned MaxRecurse) {
5468 if (!MaxRecurse--)
5469 return nullptr;
5470
5471 // Bail out if any mask value is undefined. That kind of shuffle may be
5472 // simplified further based on demanded bits or other folds.
5473 if (MaskVal == -1)
5474 return nullptr;
5475
5476 // The mask value chooses which source operand we need to look at next.
5477 int InVecNumElts = cast<FixedVectorType>(Op0->getType())->getNumElements();
5478 int RootElt = MaskVal;
5479 Value *SourceOp = Op0;
5480 if (MaskVal >= InVecNumElts) {
5481 RootElt = MaskVal - InVecNumElts;
5482 SourceOp = Op1;
5483 }
5484
5485 // If the source operand is a shuffle itself, look through it to find the
5486 // matching root vector.
5487 if (auto *SourceShuf = dyn_cast<ShuffleVectorInst>(SourceOp)) {
5488 return foldIdentityShuffles(
5489 DestElt, SourceShuf->getOperand(0), SourceShuf->getOperand(1),
5490 SourceShuf->getMaskValue(RootElt), RootVec, MaxRecurse);
5491 }
5492
5493 // The source operand is not a shuffle. Initialize the root vector value for
5494 // this shuffle if that has not been done yet.
5495 if (!RootVec)
5496 RootVec = SourceOp;
5497
5498 // Give up as soon as a source operand does not match the existing root value.
5499 if (RootVec != SourceOp)
5500 return nullptr;
5501
5502 // The element must be coming from the same lane in the source vector
5503 // (although it may have crossed lanes in intermediate shuffles).
5504 if (RootElt != DestElt)
5505 return nullptr;
5506
5507 return RootVec;
5508}
5509
5511 ArrayRef<int> Mask, Type *RetTy,
5512 const SimplifyQuery &Q,
5513 unsigned MaxRecurse) {
5514 if (all_of(Mask, [](int Elem) { return Elem == PoisonMaskElem; }))
5515 return PoisonValue::get(RetTy);
5516
5517 auto *InVecTy = cast<VectorType>(Op0->getType());
5518 unsigned MaskNumElts = Mask.size();
5519 ElementCount InVecEltCount = InVecTy->getElementCount();
5520
5521 bool Scalable = InVecEltCount.isScalable();
5522
5523 SmallVector<int, 32> Indices;
5524 Indices.assign(Mask.begin(), Mask.end());
5525
5526 // Canonicalization: If mask does not select elements from an input vector,
5527 // replace that input vector with poison.
5528 if (!Scalable) {
5529 bool MaskSelects0 = false, MaskSelects1 = false;
5530 unsigned InVecNumElts = InVecEltCount.getKnownMinValue();
5531 for (unsigned i = 0; i != MaskNumElts; ++i) {
5532 if (Indices[i] == -1)
5533 continue;
5534 if ((unsigned)Indices[i] < InVecNumElts)
5535 MaskSelects0 = true;
5536 else
5537 MaskSelects1 = true;
5538 }
5539 if (!MaskSelects0)
5540 Op0 = PoisonValue::get(InVecTy);
5541 if (!MaskSelects1)
5542 Op1 = PoisonValue::get(InVecTy);
5543 }
5544
5545 auto *Op0Const = dyn_cast<Constant>(Op0);
5546 auto *Op1Const = dyn_cast<Constant>(Op1);
5547
5548 // If all operands are constant, constant fold the shuffle. This
5549 // transformation depends on the value of the mask which is not known at
5550 // compile time for scalable vectors
5551 if (Op0Const && Op1Const)
5552 return ConstantExpr::getShuffleVector(Op0Const, Op1Const, Mask);
5553
5554 // Canonicalization: if only one input vector is constant, it shall be the
5555 // second one. This transformation depends on the value of the mask which
5556 // is not known at compile time for scalable vectors
5557 if (!Scalable && Op0Const && !Op1Const) {
5558 std::swap(Op0, Op1);
5560 InVecEltCount.getKnownMinValue());
5561 }
5562
5563 // A splat of an inserted scalar constant becomes a vector constant:
5564 // shuf (inselt ?, C, IndexC), undef, <IndexC, IndexC...> --> <C, C...>
5565 // NOTE: We may have commuted above, so analyze the updated Indices, not the
5566 // original mask constant.
5567 // NOTE: This transformation depends on the value of the mask which is not
5568 // known at compile time for scalable vectors
5569 Constant *C;
5570 ConstantInt *IndexC;
5571 if (!Scalable && match(Op0, m_InsertElt(m_Value(), m_Constant(C),
5572 m_ConstantInt(IndexC)))) {
5573 // Match a splat shuffle mask of the insert index allowing undef elements.
5574 int InsertIndex = IndexC->getZExtValue();
5575 if (all_of(Indices, [InsertIndex](int MaskElt) {
5576 return MaskElt == InsertIndex || MaskElt == -1;
5577 })) {
5578 assert(isa<UndefValue>(Op1) && "Expected undef operand 1 for splat");
5579
5580 // Shuffle mask poisons become poison constant result elements.
5581 SmallVector<Constant *, 16> VecC(MaskNumElts, C);
5582 for (unsigned i = 0; i != MaskNumElts; ++i)
5583 if (Indices[i] == -1)
5584 VecC[i] = PoisonValue::get(C->getType());
5585 return ConstantVector::get(VecC);
5586 }
5587 }
5588
5589 // A shuffle of a splat is always the splat itself. Legal if the shuffle's
5590 // value type is same as the input vectors' type.
5591 if (auto *OpShuf = dyn_cast<ShuffleVectorInst>(Op0))
5592 if (Q.isUndefValue(Op1) && RetTy == InVecTy &&
5593 all_equal(OpShuf->getShuffleMask()))
5594 return Op0;
5595
5596 // All remaining transformation depend on the value of the mask, which is
5597 // not known at compile time for scalable vectors.
5598 if (Scalable)
5599 return nullptr;
5600
5601 // Don't fold a shuffle with undef mask elements. This may get folded in a
5602 // better way using demanded bits or other analysis.
5603 // TODO: Should we allow this?
5604 if (is_contained(Indices, -1))
5605 return nullptr;
5606
5607 // Check if every element of this shuffle can be mapped back to the
5608 // corresponding element of a single root vector. If so, we don't need this
5609 // shuffle. This handles simple identity shuffles as well as chains of
5610 // shuffles that may widen/narrow and/or move elements across lanes and back.
5611 Value *RootVec = nullptr;
5612 for (unsigned i = 0; i != MaskNumElts; ++i) {
5613 // Note that recursion is limited for each vector element, so if any element
5614 // exceeds the limit, this will fail to simplify.
5615 RootVec =
5616 foldIdentityShuffles(i, Op0, Op1, Indices[i], RootVec, MaxRecurse);
5617
5618 // We can't replace a widening/narrowing shuffle with one of its operands.
5619 if (!RootVec || RootVec->getType() != RetTy)
5620 return nullptr;
5621 }
5622 return RootVec;
5623}
5624
5625/// Given operands for a ShuffleVectorInst, fold the result or return null.
5627 ArrayRef<int> Mask, Type *RetTy,
5628 const SimplifyQuery &Q) {
5629 return ::simplifyShuffleVectorInst(Op0, Op1, Mask, RetTy, Q, RecursionLimit);
5630}
5631
5633 const SimplifyQuery &Q) {
5634 if (auto *C = dyn_cast<Constant>(Op))
5635 return ConstantFoldUnaryOpOperand(Opcode, C, Q.DL);
5636 return nullptr;
5637}
5638
5639/// Given the operand for an FNeg, see if we can fold the result. If not, this
5640/// returns null.
5642 const SimplifyQuery &Q, unsigned MaxRecurse) {
5643 if (Constant *C = foldConstant(Instruction::FNeg, Op, Q))
5644 return C;
5645
5646 Value *X;
5647 // fneg (fneg X) ==> X
5648 if (match(Op, m_FNeg(m_Value(X))))
5649 return X;
5650
5651 return nullptr;
5652}
5653
5655 const SimplifyQuery &Q) {
5656 return ::simplifyFNegInst(Op, FMF, Q, RecursionLimit);
5657}
5658
5659/// Try to propagate existing NaN values when possible. If not, replace the
5660/// constant or elements in the constant with a canonical NaN.
5662 Type *Ty = In->getType();
5663 if (auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
5664 unsigned NumElts = VecTy->getNumElements();
5665 SmallVector<Constant *, 32> NewC(NumElts);
5666 for (unsigned i = 0; i != NumElts; ++i) {
5667 Constant *EltC = In->getAggregateElement(i);
5668 // Poison elements propagate. NaN propagates except signaling is quieted.
5669 // Replace unknown or undef elements with canonical NaN.
5670 if (EltC && isa<PoisonValue>(EltC))
5671 NewC[i] = EltC;
5672 else if (EltC && EltC->isNaN())
5673 NewC[i] = ConstantFP::get(
5674 EltC->getType(), cast<ConstantFP>(EltC)->getValue().makeQuiet());
5675 else
5676 NewC[i] = ConstantFP::getNaN(VecTy->getElementType());
5677 }
5678 return ConstantVector::get(NewC);
5679 }
5680
5681 // If it is not a fixed vector, but not a simple NaN either, return a
5682 // canonical NaN.
5683 if (!In->isNaN())
5684 return ConstantFP::getNaN(Ty);
5685
5686 // If we known this is a NaN, and it's scalable vector, we must have a splat
5687 // on our hands. Grab that before splatting a QNaN constant.
5688 if (isa<ScalableVectorType>(Ty)) {
5689 auto *Splat = In->getSplatValue();
5690 assert(Splat && Splat->isNaN() &&
5691 "Found a scalable-vector NaN but not a splat");
5692 In = Splat;
5693 }
5694
5695 // Propagate an existing QNaN constant. If it is an SNaN, make it quiet, but
5696 // preserve the sign/payload.
5697 return ConstantFP::get(Ty, cast<ConstantFP>(In)->getValue().makeQuiet());
5698}
5699
5700/// Perform folds that are common to any floating-point operation. This implies
5701/// transforms based on poison/undef/NaN because the operation itself makes no
5702/// difference to the result.
5704 const SimplifyQuery &Q,
5705 fp::ExceptionBehavior ExBehavior,
5706 RoundingMode Rounding) {
5707 // Poison is independent of anything else. It always propagates from an
5708 // operand to a math result.
5710 return PoisonValue::get(Ops[0]->getType());
5711
5712 for (Value *V : Ops) {
5713 bool IsNan = match(V, m_NaN());
5714 bool IsInf = match(V, m_Inf());
5715 bool IsUndef = Q.isUndefValue(V);
5716
5717 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
5718 // (an undef operand can be chosen to be Nan/Inf), then the result of
5719 // this operation is poison.
5720 if (FMF.noNaNs() && (IsNan || IsUndef))
5721 return PoisonValue::get(V->getType());
5722 if (FMF.noInfs() && (IsInf || IsUndef))
5723 return PoisonValue::get(V->getType());
5724
5725 if (isDefaultFPEnvironment(ExBehavior, Rounding)) {
5726 // Undef does not propagate because undef means that all bits can take on
5727 // any value. If this is undef * NaN for example, then the result values
5728 // (at least the exponent bits) are limited. Assume the undef is a
5729 // canonical NaN and propagate that.
5730 if (IsUndef)
5731 return ConstantFP::getNaN(V->getType());
5732 if (IsNan)
5733 return propagateNaN(cast<Constant>(V));
5734 } else if (ExBehavior != fp::ebStrict) {
5735 if (IsNan)
5736 return propagateNaN(cast<Constant>(V));
5737 }
5738 }
5739 return nullptr;
5740}
5741
5742/// Given operands for an FAdd, see if we can fold the result. If not, this
5743/// returns null.
5744static Value *
5746 const SimplifyQuery &Q, unsigned MaxRecurse,
5749 if (isDefaultFPEnvironment(ExBehavior, Rounding))
5750 if (Constant *C = foldOrCommuteConstant(Instruction::FAdd, Op0, Op1, Q))
5751 return C;
5752
5753 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
5754 return C;
5755
5756 // fadd X, -0 ==> X
5757 // With strict/constrained FP, we have these possible edge cases that do
5758 // not simplify to Op0:
5759 // fadd SNaN, -0.0 --> QNaN
5760 // fadd +0.0, -0.0 --> -0.0 (but only with round toward negative)
5761 if (canIgnoreSNaN(ExBehavior, FMF) &&
5763 FMF.noSignedZeros()))
5764 if (match(Op1, m_NegZeroFP()))
5765 return Op0;
5766
5767 // fadd X, 0 ==> X, when we know X is not -0
5768 if (canIgnoreSNaN(ExBehavior, FMF))
5769 if (match(Op1, m_PosZeroFP()) &&
5770 (FMF.noSignedZeros() || cannotBeNegativeZero(Op0, Q)))
5771 return Op0;
5772
5773 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
5774 return nullptr;
5775
5776 if (FMF.noNaNs()) {
5777 // With nnan: X + {+/-}Inf --> {+/-}Inf
5778 if (match(Op1, m_Inf()))
5779 return Op1;
5780
5781 // With nnan: -X + X --> 0.0 (and commuted variant)
5782 // We don't have to explicitly exclude infinities (ninf): INF + -INF == NaN.
5783 // Negative zeros are allowed because we always end up with positive zero:
5784 // X = -0.0: (-0.0 - (-0.0)) + (-0.0) == ( 0.0) + (-0.0) == 0.0
5785 // X = -0.0: ( 0.0 - (-0.0)) + (-0.0) == ( 0.0) + (-0.0) == 0.0
5786 // X = 0.0: (-0.0 - ( 0.0)) + ( 0.0) == (-0.0) + ( 0.0) == 0.0
5787 // X = 0.0: ( 0.0 - ( 0.0)) + ( 0.0) == ( 0.0) + ( 0.0) == 0.0
5788 if (match(Op0, m_FSub(m_AnyZeroFP(), m_Specific(Op1))) ||
5789 match(Op1, m_FSub(m_AnyZeroFP(), m_Specific(Op0))))
5790 return ConstantFP::getZero(Op0->getType());
5791
5792 if (match(Op0, m_FNeg(m_Specific(Op1))) ||
5793 match(Op1, m_FNeg(m_Specific(Op0))))
5794 return ConstantFP::getZero(Op0->getType());
5795 }
5796
5797 // (X - Y) + Y --> X
5798 // Y + (X - Y) --> X
5799 Value *X;
5800 if (FMF.noSignedZeros() && FMF.allowReassoc() &&
5801 (match(Op0, m_FSub(m_Value(X), m_Specific(Op1))) ||
5802 match(Op1, m_FSub(m_Value(X), m_Specific(Op0)))))
5803 return X;
5804
5805 return nullptr;
5806}
5807
5808/// Given operands for an FSub, see if we can fold the result. If not, this
5809/// returns null.
5810static Value *
5812 const SimplifyQuery &Q, unsigned MaxRecurse,
5815 if (isDefaultFPEnvironment(ExBehavior, Rounding))
5816 if (Constant *C = foldOrCommuteConstant(Instruction::FSub, Op0, Op1, Q))
5817 return C;
5818
5819 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
5820 return C;
5821
5822 // fsub X, +0 ==> X
5823 if (canIgnoreSNaN(ExBehavior, FMF) &&
5825 FMF.noSignedZeros()))
5826 if (match(Op1, m_PosZeroFP()))
5827 return Op0;
5828
5829 // fsub X, -0 ==> X, when we know X is not -0
5830 if (canIgnoreSNaN(ExBehavior, FMF))
5831 if (match(Op1, m_NegZeroFP()) &&
5832 (FMF.noSignedZeros() || cannotBeNegativeZero(Op0, Q)))
5833 return Op0;
5834
5835 // fsub -0.0, (fsub -0.0, X) ==> X
5836 // fsub -0.0, (fneg X) ==> X
5837 Value *X;
5838 if (canIgnoreSNaN(ExBehavior, FMF))
5839 if (match(Op0, m_NegZeroFP()) && match(Op1, m_FNeg(m_Value(X))))
5840 return X;
5841
5842 // fsub 0.0, (fsub 0.0, X) ==> X if signed zeros are ignored.
5843 // fsub 0.0, (fneg X) ==> X if signed zeros are ignored.
5844 if (canIgnoreSNaN(ExBehavior, FMF))
5845 if (FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()) &&
5846 (match(Op1, m_FSub(m_AnyZeroFP(), m_Value(X))) ||
5847 match(Op1, m_FNeg(m_Value(X)))))
5848 return X;
5849
5850 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
5851 return nullptr;
5852
5853 if (FMF.noNaNs()) {
5854 // fsub nnan x, x ==> 0.0
5855 if (Op0 == Op1)
5856 return Constant::getNullValue(Op0->getType());
5857
5858 // With nnan: {+/-}Inf - X --> {+/-}Inf
5859 if (match(Op0, m_Inf()))
5860 return Op0;
5861
5862 // With nnan: X - {+/-}Inf --> {-/+}Inf
5863 if (match(Op1, m_Inf()))
5864 return foldConstant(Instruction::FNeg, Op1, Q);
5865 }
5866
5867 // Y - (Y - X) --> X
5868 // (X + Y) - Y --> X
5869 if (FMF.noSignedZeros() && FMF.allowReassoc() &&
5870 (match(Op1, m_FSub(m_Specific(Op0), m_Value(X))) ||
5871 match(Op0, m_c_FAdd(m_Specific(Op1), m_Value(X)))))
5872 return X;
5873
5874 return nullptr;
5875}
5876
5878 const SimplifyQuery &Q, unsigned MaxRecurse,
5879 fp::ExceptionBehavior ExBehavior,
5880 RoundingMode Rounding) {
5881 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
5882 return C;
5883
5884 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
5885 return nullptr;
5886
5887 // Canonicalize special constants as operand 1.
5888 if (match(Op0, m_FPOne()) || match(Op0, m_AnyZeroFP()))
5889 std::swap(Op0, Op1);
5890
5891 // X * 1.0 --> X
5892 if (match(Op1, m_FPOne()))
5893 return Op0;
5894
5895 if (match(Op1, m_AnyZeroFP())) {
5896 // X * 0.0 --> 0.0 (with nnan and nsz)
5897 if (FMF.noNaNs() && FMF.noSignedZeros())
5898 return ConstantFP::getZero(Op0->getType());
5899
5900 KnownFPClass Known = computeKnownFPClass(Op0, FMF, fcInf | fcNan, Q);
5901 if (Known.isKnownNever(fcInf | fcNan)) {
5902 // if nsz is set, return 0.0
5903 if (FMF.noSignedZeros())
5904 return ConstantFP::getZero(Op0->getType());
5905 // +normal number * (-)0.0 --> (-)0.0
5906 if (Known.SignBit == false)
5907 return Op1;
5908 // -normal number * (-)0.0 --> -(-)0.0
5909 if (Known.SignBit == true)
5910 return foldConstant(Instruction::FNeg, Op1, Q);
5911 }
5912 }
5913
5914 // sqrt(X) * sqrt(X) --> X, if we can:
5915 // 1. Remove the intermediate rounding (reassociate).
5916 // 2. Ignore non-zero negative numbers because sqrt would produce NAN.
5917 // 3. Ignore -0.0 because sqrt(-0.0) == -0.0, but -0.0 * -0.0 == 0.0.
5918 Value *X;
5919 if (Op0 == Op1 && match(Op0, m_Sqrt(m_Value(X))) && FMF.allowReassoc() &&
5920 FMF.noNaNs() && FMF.noSignedZeros())
5921 return X;
5922
5923 return nullptr;
5924}
5925
5926/// Given the operands for an FMul, see if we can fold the result
5927static Value *
5929 const SimplifyQuery &Q, unsigned MaxRecurse,
5932 if (isDefaultFPEnvironment(ExBehavior, Rounding))
5933 if (Constant *C = foldOrCommuteConstant(Instruction::FMul, Op0, Op1, Q))
5934 return C;
5935
5936 // Now apply simplifications that do not require rounding.
5937 return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding);
5938}
5939
5941 const SimplifyQuery &Q,
5942 fp::ExceptionBehavior ExBehavior,
5943 RoundingMode Rounding) {
5944 return ::simplifyFAddInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
5945 Rounding);
5946}
5947
5949 const SimplifyQuery &Q,
5950 fp::ExceptionBehavior ExBehavior,
5951 RoundingMode Rounding) {
5952 return ::simplifyFSubInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
5953 Rounding);
5954}
5955
5957 const SimplifyQuery &Q,
5958 fp::ExceptionBehavior ExBehavior,
5959 RoundingMode Rounding) {
5960 return ::simplifyFMulInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
5961 Rounding);
5962}
5963
5965 const SimplifyQuery &Q,
5966 fp::ExceptionBehavior ExBehavior,
5967 RoundingMode Rounding) {
5968 return ::simplifyFMAFMul(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
5969 Rounding);
5970}
5971
5972static Value *
5974 const SimplifyQuery &Q, unsigned,
5977 if (isDefaultFPEnvironment(ExBehavior, Rounding))
5978 if (Constant *C = foldOrCommuteConstant(Instruction::FDiv, Op0, Op1, Q))
5979 return C;
5980
5981 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
5982 return C;
5983
5984 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
5985 return nullptr;
5986
5987 // X / 1.0 -> X
5988 if (match(Op1, m_FPOne()))
5989 return Op0;
5990
5991 // 0 / X -> 0
5992 // Requires that NaNs are off (X could be zero) and signed zeroes are
5993 // ignored (X could be positive or negative, so the output sign is unknown).
5994 if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()))
5995 return ConstantFP::getZero(Op0->getType());
5996
5997 if (FMF.noNaNs()) {
5998 // X / X -> 1.0 is legal when NaNs are ignored.
5999 // We can ignore infinities because INF/INF is NaN.
6000 if (Op0 == Op1)
6001 return ConstantFP::get(Op0->getType(), 1.0);
6002
6003 // (X * Y) / Y --> X if we can reassociate to the above form.
6004 Value *X;
6005 if (FMF.allowReassoc() && match(Op0, m_c_FMul(m_Value(X), m_Specific(Op1))))
6006 return X;
6007
6008 // -X / X -> -1.0 and
6009 // X / -X -> -1.0 are legal when NaNs are ignored.
6010 // We can ignore signed zeros because +-0.0/+-0.0 is NaN and ignored.
6011 if (match(Op0, m_FNegNSZ(m_Specific(Op1))) ||
6012 match(Op1, m_FNegNSZ(m_Specific(Op0))))
6013 return ConstantFP::get(Op0->getType(), -1.0);
6014
6015 // nnan ninf X / [-]0.0 -> poison
6016 if (FMF.noInfs() && match(Op1, m_AnyZeroFP()))
6017 return PoisonValue::get(Op1->getType());
6018 }
6019
6020 return nullptr;
6021}
6022
6024 const SimplifyQuery &Q,
6025 fp::ExceptionBehavior ExBehavior,
6026 RoundingMode Rounding) {
6027 return ::simplifyFDivInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6028 Rounding);
6029}
6030
6031static Value *
6033 const SimplifyQuery &Q, unsigned,
6036 if (isDefaultFPEnvironment(ExBehavior, Rounding))
6037 if (Constant *C = foldOrCommuteConstant(Instruction::FRem, Op0, Op1, Q))
6038 return C;
6039
6040 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
6041 return C;
6042
6043 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6044 return nullptr;
6045
6046 // Unlike fdiv, the result of frem always matches the sign of the dividend.
6047 // The constant match may include undef elements in a vector, so return a full
6048 // zero constant as the result.
6049 if (FMF.noNaNs()) {
6050 // +0 % X -> 0
6051 if (match(Op0, m_PosZeroFP()))
6052 return ConstantFP::getZero(Op0->getType());
6053 // -0 % X -> -0
6054 if (match(Op0, m_NegZeroFP()))
6055 return ConstantFP::getNegativeZero(Op0->getType());
6056 }
6057
6058 return nullptr;
6059}
6060
6062 const SimplifyQuery &Q,
6063 fp::ExceptionBehavior ExBehavior,
6064 RoundingMode Rounding) {
6065 return ::simplifyFRemInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6066 Rounding);
6067}
6068
6069//=== Helper functions for higher up the class hierarchy.
6070
6071/// Given the operand for a UnaryOperator, see if we can fold the result.
6072/// If not, this returns null.
6073static Value *simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q,
6074 unsigned MaxRecurse) {
6075 switch (Opcode) {
6076 case Instruction::FNeg:
6077 return simplifyFNegInst(Op, FastMathFlags(), Q, MaxRecurse);
6078 default:
6079 llvm_unreachable("Unexpected opcode");
6080 }
6081}
6082
6083/// Given the operand for a UnaryOperator, see if we can fold the result.
6084/// If not, this returns null.
6085/// Try to use FastMathFlags when folding the result.
6086static Value *simplifyFPUnOp(unsigned Opcode, Value *Op,
6087 const FastMathFlags &FMF, const SimplifyQuery &Q,
6088 unsigned MaxRecurse) {
6089 switch (Opcode) {
6090 case Instruction::FNeg:
6091 return simplifyFNegInst(Op, FMF, Q, MaxRecurse);
6092 default:
6093 return simplifyUnOp(Opcode, Op, Q, MaxRecurse);
6094 }
6095}
6096
6097Value *llvm::simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q) {
6098 return ::simplifyUnOp(Opcode, Op, Q, RecursionLimit);
6099}
6100
6102 const SimplifyQuery &Q) {
6103 return ::simplifyFPUnOp(Opcode, Op, FMF, Q, RecursionLimit);
6104}
6105
6106/// Given operands for a BinaryOperator, see if we can fold the result.
6107/// If not, this returns null.
6108static Value *simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6109 const SimplifyQuery &Q, unsigned MaxRecurse) {
6110 switch (Opcode) {
6111 case Instruction::Add:
6112 return simplifyAddInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6113 MaxRecurse);
6114 case Instruction::Sub:
6115 return simplifySubInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6116 MaxRecurse);
6117 case Instruction::Mul:
6118 return simplifyMulInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6119 MaxRecurse);
6120 case Instruction::SDiv:
6121 return simplifySDivInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6122 case Instruction::UDiv:
6123 return simplifyUDivInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6124 case Instruction::SRem:
6125 return simplifySRemInst(LHS, RHS, Q, MaxRecurse);
6126 case Instruction::URem:
6127 return simplifyURemInst(LHS, RHS, Q, MaxRecurse);
6128 case Instruction::Shl:
6129 return simplifyShlInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6130 MaxRecurse);
6131 case Instruction::LShr:
6132 return simplifyLShrInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6133 case Instruction::AShr:
6134 return simplifyAShrInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6135 case Instruction::And:
6136 return simplifyAndInst(LHS, RHS, Q, MaxRecurse);
6137 case Instruction::Or:
6138 return simplifyOrInst(LHS, RHS, Q, MaxRecurse);
6139 case Instruction::Xor:
6140 return simplifyXorInst(LHS, RHS, Q, MaxRecurse);
6141 case Instruction::FAdd:
6142 return simplifyFAddInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6143 case Instruction::FSub:
6144 return simplifyFSubInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6145 case Instruction::FMul:
6146 return simplifyFMulInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6147 case Instruction::FDiv:
6148 return simplifyFDivInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6149 case Instruction::FRem:
6150 return simplifyFRemInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6151 default:
6152 llvm_unreachable("Unexpected opcode");
6153 }
6154}
6155
6156/// Given operands for a BinaryOperator, see if we can fold the result.
6157/// If not, this returns null.
6158/// Try to use FastMathFlags when folding the result.
6159static Value *simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6160 const FastMathFlags &FMF, const SimplifyQuery &Q,
6161 unsigned MaxRecurse) {
6162 switch (Opcode) {
6163 case Instruction::FAdd:
6164 return simplifyFAddInst(LHS, RHS, FMF, Q, MaxRecurse);
6165 case Instruction::FSub:
6166 return simplifyFSubInst(LHS, RHS, FMF, Q, MaxRecurse);
6167 case Instruction::FMul:
6168 return simplifyFMulInst(LHS, RHS, FMF, Q, MaxRecurse);
6169 case Instruction::FDiv:
6170 return simplifyFDivInst(LHS, RHS, FMF, Q, MaxRecurse);
6171 default:
6172 return simplifyBinOp(Opcode, LHS, RHS, Q, MaxRecurse);
6173 }
6174}
6175
6176Value *llvm::simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6177 const SimplifyQuery &Q) {
6178 return ::simplifyBinOp(Opcode, LHS, RHS, Q, RecursionLimit);
6179}
6180
6181Value *llvm::simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6182 FastMathFlags FMF, const SimplifyQuery &Q) {
6183 return ::simplifyBinOp(Opcode, LHS, RHS, FMF, Q, RecursionLimit);
6184}
6185
6186/// Given operands for a CmpInst, see if we can fold the result.
6188 const SimplifyQuery &Q, unsigned MaxRecurse) {
6190 return simplifyICmpInst(Predicate, LHS, RHS, Q, MaxRecurse);
6191 return simplifyFCmpInst(Predicate, LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6192}
6193
6195 const SimplifyQuery &Q) {
6196 return ::simplifyCmpInst(Predicate, LHS, RHS, Q, RecursionLimit);
6197}
6198
6200 switch (ID) {
6201 default:
6202 return false;
6203
6204 // Unary idempotent: f(f(x)) = f(x)
6205 case Intrinsic::fabs:
6206 case Intrinsic::floor:
6207 case Intrinsic::ceil:
6208 case Intrinsic::trunc:
6209 case Intrinsic::rint:
6210 case Intrinsic::nearbyint:
6211 case Intrinsic::round:
6212 case Intrinsic::roundeven:
6213 case Intrinsic::canonicalize:
6214 case Intrinsic::arithmetic_fence:
6215 return true;
6216 }
6217}
6218
6219/// Return true if the intrinsic rounds a floating-point value to an integral
6220/// floating-point value (not an integer type).
6222 switch (ID) {
6223 default:
6224 return false;
6225
6226 case Intrinsic::floor:
6227 case Intrinsic::ceil:
6228 case Intrinsic::trunc:
6229 case Intrinsic::rint:
6230 case Intrinsic::nearbyint:
6231 case Intrinsic::round:
6232 case Intrinsic::roundeven:
6233 return true;
6234 }
6235}
6236
6238 const DataLayout &DL) {
6239 GlobalValue *PtrSym;
6240 APInt PtrOffset;
6241 if (!IsConstantOffsetFromGlobal(Ptr, PtrSym, PtrOffset, DL))
6242 return nullptr;
6243
6244 Type *Int32Ty = Type::getInt32Ty(Ptr->getContext());
6245
6246 auto *OffsetConstInt = dyn_cast<ConstantInt>(Offset);
6247 if (!OffsetConstInt || OffsetConstInt->getBitWidth() > 64)
6248 return nullptr;
6249
6250 APInt OffsetInt = OffsetConstInt->getValue().sextOrTrunc(
6251 DL.getIndexTypeSizeInBits(Ptr->getType()));
6252 if (OffsetInt.srem(4) != 0)
6253 return nullptr;
6254
6255 Constant *Loaded =
6256 ConstantFoldLoadFromConstPtr(Ptr, Int32Ty, std::move(OffsetInt), DL);
6257 if (!Loaded)
6258 return nullptr;
6259
6260 auto *LoadedCE = dyn_cast<ConstantExpr>(Loaded);
6261 if (!LoadedCE)
6262 return nullptr;
6263
6264 if (LoadedCE->getOpcode() == Instruction::Trunc) {
6265 LoadedCE = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6266 if (!LoadedCE)
6267 return nullptr;
6268 }
6269
6270 if (LoadedCE->getOpcode() != Instruction::Sub)
6271 return nullptr;
6272
6273 auto *LoadedLHS = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6274 if (!LoadedLHS || LoadedLHS->getOpcode() != Instruction::PtrToInt)
6275 return nullptr;
6276 auto *LoadedLHSPtr = LoadedLHS->getOperand(0);
6277
6278 Constant *LoadedRHS = LoadedCE->getOperand(1);
6279 GlobalValue *LoadedRHSSym;
6280 APInt LoadedRHSOffset;
6281 if (!IsConstantOffsetFromGlobal(LoadedRHS, LoadedRHSSym, LoadedRHSOffset,
6282 DL) ||
6283 PtrSym != LoadedRHSSym || PtrOffset != LoadedRHSOffset)
6284 return nullptr;
6285
6286 return LoadedLHSPtr;
6287}
6288
6289// TODO: Need to pass in FastMathFlags
6290static Value *simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q,
6291 bool IsStrict) {
6292 // ldexp(poison, x) -> poison
6293 // ldexp(x, poison) -> poison
6294 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
6295 return Op0;
6296
6297 // ldexp(undef, x) -> nan
6298 if (Q.isUndefValue(Op0))
6299 return ConstantFP::getNaN(Op0->getType());
6300
6301 if (!IsStrict) {
6302 // TODO: Could insert a canonicalize for strict
6303
6304 // ldexp(x, undef) -> x
6305 if (Q.isUndefValue(Op1))
6306 return Op0;
6307 }
6308
6309 const APFloat *C = nullptr;
6311
6312 // These cases should be safe, even with strictfp.
6313 // ldexp(0.0, x) -> 0.0
6314 // ldexp(-0.0, x) -> -0.0
6315 // ldexp(inf, x) -> inf
6316 // ldexp(-inf, x) -> -inf
6317 if (C && (C->isZero() || C->isInfinity()))
6318 return Op0;
6319
6320 // These are canonicalization dropping, could do it if we knew how we could
6321 // ignore denormal flushes and target handling of nan payload bits.
6322 if (IsStrict)
6323 return nullptr;
6324
6325 // TODO: Could quiet this with strictfp if the exception mode isn't strict.
6326 if (C && C->isNaN())
6327 return ConstantFP::get(Op0->getType(), C->makeQuiet());
6328
6329 // ldexp(x, 0) -> x
6330
6331 // TODO: Could fold this if we know the exception mode isn't
6332 // strict, we know the denormal mode and other target modes.
6333 if (match(Op1, PatternMatch::m_ZeroInt()))
6334 return Op0;
6335
6336 return nullptr;
6337}
6338
6340 const SimplifyQuery &Q,
6341 const CallBase *Call) {
6342 // Idempotent functions return the same result when called repeatedly.
6343 Intrinsic::ID IID = F->getIntrinsicID();
6344 if (isIdempotent(IID))
6345 if (auto *II = dyn_cast<IntrinsicInst>(Op0))
6346 if (II->getIntrinsicID() == IID)
6347 return II;
6348
6349 if (removesFPFraction(IID)) {
6350 // Converting from int or calling a rounding function always results in a
6351 // finite integral number or infinity. For those inputs, rounding functions
6352 // always return the same value, so the (2nd) rounding is eliminated. Ex:
6353 // floor (sitofp x) -> sitofp x
6354 // round (ceil x) -> ceil x
6355 auto *II = dyn_cast<IntrinsicInst>(Op0);
6356 if ((II && removesFPFraction(II->getIntrinsicID())) ||
6357 match(Op0, m_SIToFP(m_Value())) || match(Op0, m_UIToFP(m_Value())))
6358 return Op0;
6359 }
6360
6361 Value *X;
6362 switch (IID) {
6363 case Intrinsic::fabs:
6364 if (computeKnownFPSignBit(Op0, Q) == false)
6365 return Op0;
6366 break;
6367 case Intrinsic::bswap:
6368 // bswap(bswap(x)) -> x
6369 if (match(Op0, m_BSwap(m_Value(X))))
6370 return X;
6371 break;
6372 case Intrinsic::bitreverse:
6373 // bitreverse(bitreverse(x)) -> x
6374 if (match(Op0, m_BitReverse(m_Value(X))))
6375 return X;
6376 break;
6377 case Intrinsic::ctpop: {
6378 // ctpop(X) -> 1 iff X is non-zero power of 2.
6379 if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ false, Q.AC, Q.CxtI, Q.DT))
6380 return ConstantInt::get(Op0->getType(), 1);
6381 // If everything but the lowest bit is zero, that bit is the pop-count. Ex:
6382 // ctpop(and X, 1) --> and X, 1
6383 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6385 Q))
6386 return Op0;
6387 break;
6388 }
6389 case Intrinsic::exp:
6390 // exp(log(x)) -> x
6391 if (Call->hasAllowReassoc() &&
6393 return X;
6394 break;
6395 case Intrinsic::exp2:
6396 // exp2(log2(x)) -> x
6397 if (Call->hasAllowReassoc() &&
6399 return X;
6400 break;
6401 case Intrinsic::exp10:
6402 // exp10(log10(x)) -> x
6403 if (Call->hasAllowReassoc() &&
6405 return X;
6406 break;
6407 case Intrinsic::log:
6408 // log(exp(x)) -> x
6409 if (Call->hasAllowReassoc() &&
6411 return X;
6412 break;
6413 case Intrinsic::log2:
6414 // log2(exp2(x)) -> x
6415 if (Call->hasAllowReassoc() &&
6417 match(Op0,
6419 return X;
6420 break;
6421 case Intrinsic::log10:
6422 // log10(pow(10.0, x)) -> x
6423 // log10(exp10(x)) -> x
6424 if (Call->hasAllowReassoc() &&
6426 match(Op0,
6428 return X;
6429 break;
6430 case Intrinsic::vector_reverse:
6431 // vector.reverse(vector.reverse(x)) -> x
6432 if (match(Op0, m_VecReverse(m_Value(X))))
6433 return X;
6434 // vector.reverse(splat(X)) -> splat(X)
6435 if (isSplatValue(Op0))
6436 return Op0;
6437 break;
6438 default:
6439 break;
6440 }
6441
6442 return nullptr;
6443}
6444
6445/// Given a min/max intrinsic, see if it can be removed based on having an
6446/// operand that is another min/max intrinsic with shared operand(s). The caller
6447/// is expected to swap the operand arguments to handle commutation.
6449 Value *X, *Y;
6450 if (!match(Op0, m_MaxOrMin(m_Value(X), m_Value(Y))))
6451 return nullptr;
6452
6453 auto *MM0 = dyn_cast<IntrinsicInst>(Op0);
6454 if (!MM0)
6455 return nullptr;
6456 Intrinsic::ID IID0 = MM0->getIntrinsicID();
6457
6458 if (Op1 == X || Op1 == Y ||
6460 // max (max X, Y), X --> max X, Y
6461 if (IID0 == IID)
6462 return MM0;
6463 // max (min X, Y), X --> X
6464 if (IID0 == getInverseMinMaxIntrinsic(IID))
6465 return Op1;
6466 }
6467 return nullptr;
6468}
6469
6470/// Given a min/max intrinsic, see if it can be removed based on having an
6471/// operand that is another min/max intrinsic with shared operand(s). The caller
6472/// is expected to swap the operand arguments to handle commutation.
6474 Value *Op1) {
6475 assert((IID == Intrinsic::maxnum || IID == Intrinsic::minnum ||
6476 IID == Intrinsic::maximum || IID == Intrinsic::minimum) &&
6477 "Unsupported intrinsic");
6478
6479 auto *M0 = dyn_cast<IntrinsicInst>(Op0);
6480 // If Op0 is not the same intrinsic as IID, do not process.
6481 // This is a difference with integer min/max handling. We do not process the
6482 // case like max(min(X,Y),min(X,Y)) => min(X,Y). But it can be handled by GVN.
6483 if (!M0 || M0->getIntrinsicID() != IID)
6484 return nullptr;
6485 Value *X0 = M0->getOperand(0);
6486 Value *Y0 = M0->getOperand(1);
6487 // Simple case, m(m(X,Y), X) => m(X, Y)
6488 // m(m(X,Y), Y) => m(X, Y)
6489 // For minimum/maximum, X is NaN => m(NaN, Y) == NaN and m(NaN, NaN) == NaN.
6490 // For minimum/maximum, Y is NaN => m(X, NaN) == NaN and m(NaN, NaN) == NaN.
6491 // For minnum/maxnum, X is NaN => m(NaN, Y) == Y and m(Y, Y) == Y.
6492 // For minnum/maxnum, Y is NaN => m(X, NaN) == X and m(X, NaN) == X.
6493 if (X0 == Op1 || Y0 == Op1)
6494 return M0;
6495
6496 auto *M1 = dyn_cast<IntrinsicInst>(Op1);
6497 if (!M1)
6498 return nullptr;
6499 Value *X1 = M1->getOperand(0);
6500 Value *Y1 = M1->getOperand(1);
6501 Intrinsic::ID IID1 = M1->getIntrinsicID();
6502 // we have a case m(m(X,Y),m'(X,Y)) taking into account m' is commutative.
6503 // if m' is m or inversion of m => m(m(X,Y),m'(X,Y)) == m(X,Y).
6504 // For minimum/maximum, X is NaN => m(NaN,Y) == m'(NaN, Y) == NaN.
6505 // For minimum/maximum, Y is NaN => m(X,NaN) == m'(X, NaN) == NaN.
6506 // For minnum/maxnum, X is NaN => m(NaN,Y) == m'(NaN, Y) == Y.
6507 // For minnum/maxnum, Y is NaN => m(X,NaN) == m'(X, NaN) == X.
6508 if ((X0 == X1 && Y0 == Y1) || (X0 == Y1 && Y0 == X1))
6509 if (IID1 == IID || getInverseMinMaxIntrinsic(IID1) == IID)
6510 return M0;
6511
6512 return nullptr;
6513}
6514
6516 Value *Op0, Value *Op1,
6517 const SimplifyQuery &Q,
6518 const CallBase *Call) {
6519 unsigned BitWidth = ReturnType->getScalarSizeInBits();
6520 switch (IID) {
6521 case Intrinsic::get_active_lane_mask: {
6522 if (match(Op1, m_Zero()))
6523 return ConstantInt::getFalse(ReturnType);
6524
6525 const Function *F = Call->getFunction();
6526 auto *ScalableTy = dyn_cast<ScalableVectorType>(ReturnType);
6527 Attribute Attr = F->getFnAttribute(Attribute::VScaleRange);
6528 if (ScalableTy && Attr.isValid()) {
6529 std::optional<unsigned> VScaleMax = Attr.getVScaleRangeMax();
6530 if (!VScaleMax)
6531 break;
6532 uint64_t MaxPossibleMaskElements =
6533 (uint64_t)ScalableTy->getMinNumElements() * (*VScaleMax);
6534
6535 const APInt *Op1Val;
6536 if (match(Op0, m_Zero()) && match(Op1, m_APInt(Op1Val)) &&
6537 Op1Val->uge(MaxPossibleMaskElements))
6538 return ConstantInt::getAllOnesValue(ReturnType);
6539 }
6540 break;
6541 }
6542 case Intrinsic::abs:
6543 // abs(abs(x)) -> abs(x). We don't need to worry about the nsw arg here.
6544 // It is always ok to pick the earlier abs. We'll just lose nsw if its only
6545 // on the outer abs.
6547 return Op0;
6548 break;
6549
6550 case Intrinsic::cttz: {
6551 Value *X;
6552 if (match(Op0, m_Shl(m_One(), m_Value(X))))
6553 return X;
6554 break;
6555 }
6556 case Intrinsic::ctlz: {
6557 Value *X;
6558 if (match(Op0, m_LShr(m_Negative(), m_Value(X))))
6559 return X;
6560 if (match(Op0, m_AShr(m_Negative(), m_Value())))
6561 return Constant::getNullValue(ReturnType);
6562 break;
6563 }
6564 case Intrinsic::ptrmask: {
6565 // NOTE: We can't apply this simplifications based on the value of Op1
6566 // because we need to preserve provenance.
6567 if (Q.isUndefValue(Op0) || match(Op0, m_Zero()))
6568 return Constant::getNullValue(Op0->getType());
6569
6571 Q.DL.getIndexTypeSizeInBits(Op0->getType()) &&
6572 "Invalid mask width");
6573 // If index-width (mask size) is less than pointer-size then mask is
6574 // 1-extended.
6575 if (match(Op1, m_PtrToInt(m_Specific(Op0))))
6576 return Op0;
6577
6578 // NOTE: We may have attributes associated with the return value of the
6579 // llvm.ptrmask intrinsic that will be lost when we just return the
6580 // operand. We should try to preserve them.
6581 if (match(Op1, m_AllOnes()) || Q.isUndefValue(Op1))
6582 return Op0;
6583
6584 Constant *C;
6585 if (match(Op1, m_ImmConstant(C))) {
6586 KnownBits PtrKnown = computeKnownBits(Op0, Q);
6587 // See if we only masking off bits we know are already zero due to
6588 // alignment.
6589 APInt IrrelevantPtrBits =
6590 PtrKnown.Zero.zextOrTrunc(C->getType()->getScalarSizeInBits());
6592 Instruction::Or, C, ConstantInt::get(C->getType(), IrrelevantPtrBits),
6593 Q.DL);
6594 if (C != nullptr && C->isAllOnesValue())
6595 return Op0;
6596 }
6597 break;
6598 }
6599 case Intrinsic::smax:
6600 case Intrinsic::smin:
6601 case Intrinsic::umax:
6602 case Intrinsic::umin: {
6603 // If the arguments are the same, this is a no-op.
6604 if (Op0 == Op1)
6605 return Op0;
6606
6607 // Canonicalize immediate constant operand as Op1.
6608 if (match(Op0, m_ImmConstant()))
6609 std::swap(Op0, Op1);
6610
6611 // Assume undef is the limit value.
6612 if (Q.isUndefValue(Op1))
6613 return ConstantInt::get(
6615
6616 const APInt *C;
6617 if (match(Op1, m_APIntAllowPoison(C))) {
6618 // Clamp to limit value. For example:
6619 // umax(i8 %x, i8 255) --> 255
6621 return ConstantInt::get(ReturnType, *C);
6622
6623 // If the constant op is the opposite of the limit value, the other must
6624 // be larger/smaller or equal. For example:
6625 // umin(i8 %x, i8 255) --> %x
6628 return Op0;
6629
6630 // Remove nested call if constant operands allow it. Example:
6631 // max (max X, 7), 5 -> max X, 7
6632 auto *MinMax0 = dyn_cast<IntrinsicInst>(Op0);
6633 if (MinMax0 && MinMax0->getIntrinsicID() == IID) {
6634 // TODO: loosen undef/splat restrictions for vector constants.
6635 Value *M00 = MinMax0->getOperand(0), *M01 = MinMax0->getOperand(1);
6636 const APInt *InnerC;
6637 if ((match(M00, m_APInt(InnerC)) || match(M01, m_APInt(InnerC))) &&
6638 ICmpInst::compare(*InnerC, *C,
6641 return Op0;
6642 }
6643 }
6644
6645 if (Value *V = foldMinMaxSharedOp(IID, Op0, Op1))
6646 return V;
6647 if (Value *V = foldMinMaxSharedOp(IID, Op1, Op0))
6648 return V;
6649
6650 ICmpInst::Predicate Pred =
6652 if (isICmpTrue(Pred, Op0, Op1, Q.getWithoutUndef(), RecursionLimit))
6653 return Op0;
6654 if (isICmpTrue(Pred, Op1, Op0, Q.getWithoutUndef(), RecursionLimit))
6655 return Op1;
6656
6657 break;
6658 }
6659 case Intrinsic::scmp:
6660 case Intrinsic::ucmp: {
6661 // Fold to a constant if the relationship between operands can be
6662 // established with certainty
6663 if (isICmpTrue(CmpInst::ICMP_EQ, Op0, Op1, Q, RecursionLimit))
6664 return Constant::getNullValue(ReturnType);
6665
6666 ICmpInst::Predicate PredGT =
6667 IID == Intrinsic::scmp ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
6668 if (isICmpTrue(PredGT, Op0, Op1, Q, RecursionLimit))
6669 return ConstantInt::get(ReturnType, 1);
6670
6671 ICmpInst::Predicate PredLT =
6672 IID == Intrinsic::scmp ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
6673 if (isICmpTrue(PredLT, Op0, Op1, Q, RecursionLimit))
6674 return ConstantInt::getSigned(ReturnType, -1);
6675
6676 break;
6677 }
6678 case Intrinsic::usub_with_overflow:
6679 case Intrinsic::ssub_with_overflow:
6680 // X - X -> { 0, false }
6681 // X - undef -> { 0, false }
6682 // undef - X -> { 0, false }
6683 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
6684 return Constant::getNullValue(ReturnType);
6685 break;
6686 case Intrinsic::uadd_with_overflow:
6687 case Intrinsic::sadd_with_overflow:
6688 // X + undef -> { -1, false }
6689 // undef + x -> { -1, false }
6690 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) {
6691 return ConstantStruct::get(
6692 cast<StructType>(ReturnType),
6693 {Constant::getAllOnesValue(ReturnType->getStructElementType(0)),
6694 Constant::getNullValue(ReturnType->getStructElementType(1))});
6695 }
6696 break;
6697 case Intrinsic::umul_with_overflow:
6698 case Intrinsic::smul_with_overflow:
6699 // 0 * X -> { 0, false }
6700 // X * 0 -> { 0, false }
6701 if (match(Op0, m_Zero()) || match(Op1, m_Zero()))
6702 return Constant::getNullValue(ReturnType);
6703 // undef * X -> { 0, false }
6704 // X * undef -> { 0, false }
6705 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
6706 return Constant::getNullValue(ReturnType);
6707 break;
6708 case Intrinsic::uadd_sat:
6709 // sat(MAX + X) -> MAX
6710 // sat(X + MAX) -> MAX
6711 if (match(Op0, m_AllOnes()) || match(Op1, m_AllOnes()))
6712 return Constant::getAllOnesValue(ReturnType);
6713 [[fallthrough]];
6714 case Intrinsic::sadd_sat:
6715 // sat(X + undef) -> -1
6716 // sat(undef + X) -> -1
6717 // For unsigned: Assume undef is MAX, thus we saturate to MAX (-1).
6718 // For signed: Assume undef is ~X, in which case X + ~X = -1.
6719 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
6720 return Constant::getAllOnesValue(ReturnType);
6721
6722 // X + 0 -> X
6723 if (match(Op1, m_Zero()))
6724 return Op0;
6725 // 0 + X -> X
6726 if (match(Op0, m_Zero()))
6727 return Op1;
6728 break;
6729 case Intrinsic::usub_sat:
6730 // sat(0 - X) -> 0, sat(X - MAX) -> 0
6731 if (match(Op0, m_Zero()) || match(Op1, m_AllOnes()))
6732 return Constant::getNullValue(ReturnType);
6733 [[fallthrough]];
6734 case Intrinsic::ssub_sat:
6735 // X - X -> 0, X - undef -> 0, undef - X -> 0
6736 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
6737 return Constant::getNullValue(ReturnType);
6738 // X - 0 -> X
6739 if (match(Op1, m_Zero()))
6740 return Op0;
6741 break;
6742 case Intrinsic::load_relative:
6743 if (auto *C0 = dyn_cast<Constant>(Op0))
6744 if (auto *C1 = dyn_cast<Constant>(Op1))
6745 return simplifyRelativeLoad(C0, C1, Q.DL);
6746 break;
6747 case Intrinsic::powi:
6748 if (auto *Power = dyn_cast<ConstantInt>(Op1)) {
6749 // powi(x, 0) -> 1.0
6750 if (Power->isZero())
6751 return ConstantFP::get(Op0->getType(), 1.0);
6752 // powi(x, 1) -> x
6753 if (Power->isOne())
6754 return Op0;
6755 }
6756 break;
6757 case Intrinsic::ldexp:
6758 return simplifyLdexp(Op0, Op1, Q, false);
6759 case Intrinsic::copysign:
6760 // copysign X, X --> X
6761 if (Op0 == Op1)
6762 return Op0;
6763 // copysign -X, X --> X
6764 // copysign X, -X --> -X
6765 if (match(Op0, m_FNeg(m_Specific(Op1))) ||
6766 match(Op1, m_FNeg(m_Specific(Op0))))
6767 return Op1;
6768 break;
6769 case Intrinsic::is_fpclass: {
6770 uint64_t Mask = cast<ConstantInt>(Op1)->getZExtValue();
6771 // If all tests are made, it doesn't matter what the value is.
6772 if ((Mask & fcAllFlags) == fcAllFlags)
6773 return ConstantInt::get(ReturnType, true);
6774 if ((Mask & fcAllFlags) == 0)
6775 return ConstantInt::get(ReturnType, false);
6776 if (Q.isUndefValue(Op0))
6777 return UndefValue::get(ReturnType);
6778 break;
6779 }
6780 case Intrinsic::maxnum:
6781 case Intrinsic::minnum:
6782 case Intrinsic::maximum:
6783 case Intrinsic::minimum: {
6784 // If the arguments are the same, this is a no-op.
6785 if (Op0 == Op1)
6786 return Op0;
6787
6788 // Canonicalize constant operand as Op1.
6789 if (isa<Constant>(Op0))
6790 std::swap(Op0, Op1);
6791
6792 // If an argument is undef, return the other argument.
6793 if (Q.isUndefValue(Op1))
6794 return Op0;
6795
6796 bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
6797 bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum;
6798
6799 // minnum(X, nan) -> X
6800 // maxnum(X, nan) -> X
6801 // minimum(X, nan) -> nan
6802 // maximum(X, nan) -> nan
6803 if (match(Op1, m_NaN()))
6804 return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0;
6805
6806 // In the following folds, inf can be replaced with the largest finite
6807 // float, if the ninf flag is set.
6808 const APFloat *C;
6809 if (match(Op1, m_APFloat(C)) &&
6810 (C->isInfinity() || (Call && Call->hasNoInfs() && C->isLargest()))) {
6811 // minnum(X, -inf) -> -inf
6812 // maxnum(X, +inf) -> +inf
6813 // minimum(X, -inf) -> -inf if nnan
6814 // maximum(X, +inf) -> +inf if nnan
6815 if (C->isNegative() == IsMin &&
6816 (!PropagateNaN || (Call && Call->hasNoNaNs())))
6817 return ConstantFP::get(ReturnType, *C);
6818
6819 // minnum(X, +inf) -> X if nnan
6820 // maxnum(X, -inf) -> X if nnan
6821 // minimum(X, +inf) -> X
6822 // maximum(X, -inf) -> X
6823 if (C->isNegative() != IsMin &&
6824 (PropagateNaN || (Call && Call->hasNoNaNs())))
6825 return Op0;
6826 }
6827
6828 // Min/max of the same operation with common operand:
6829 // m(m(X, Y)), X --> m(X, Y) (4 commuted variants)
6830 if (Value *V = foldMinimumMaximumSharedOp(IID, Op0, Op1))
6831 return V;
6832 if (Value *V = foldMinimumMaximumSharedOp(IID, Op1, Op0))
6833 return V;
6834
6835 break;
6836 }
6837 case Intrinsic::vector_extract: {
6838 // (extract_vector (insert_vector _, X, 0), 0) -> X
6839 unsigned IdxN = cast<ConstantInt>(Op1)->getZExtValue();
6840 Value *X = nullptr;
6842 m_Zero())) &&
6843 IdxN == 0 && X->getType() == ReturnType)
6844 return X;
6845
6846 break;
6847 }
6848 default:
6849 break;
6850 }
6851
6852 return nullptr;
6853}
6854
6856 ArrayRef<Value *> Args,
6857 const SimplifyQuery &Q) {
6858 // Operand bundles should not be in Args.
6859 assert(Call->arg_size() == Args.size());
6860 unsigned NumOperands = Args.size();
6861 Function *F = cast<Function>(Callee);
6862 Intrinsic::ID IID = F->getIntrinsicID();
6863
6866 return PoisonValue::get(F->getReturnType());
6867 // Most of the intrinsics with no operands have some kind of side effect.
6868 // Don't simplify.
6869 if (!NumOperands) {
6870 switch (IID) {
6871 case Intrinsic::vscale: {
6872 Type *RetTy = F->getReturnType();
6873 ConstantRange CR = getVScaleRange(Call->getFunction(), 64);
6874 if (const APInt *C = CR.getSingleElement())
6875 return ConstantInt::get(RetTy, C->getZExtValue());
6876 return nullptr;
6877 }
6878 default:
6879 return nullptr;
6880 }
6881 }
6882
6883 if (NumOperands == 1)
6884 return simplifyUnaryIntrinsic(F, Args[0], Q, Call);
6885
6886 if (NumOperands == 2)
6887 return simplifyBinaryIntrinsic(IID, F->getReturnType(), Args[0], Args[1], Q,
6888 Call);
6889
6890 // Handle intrinsics with 3 or more arguments.
6891 switch (IID) {
6892 case Intrinsic::masked_load:
6893 case Intrinsic::masked_gather: {
6894 Value *MaskArg = Args[2];
6895 Value *PassthruArg = Args[3];
6896 // If the mask is all zeros or undef, the "passthru" argument is the result.
6897 if (maskIsAllZeroOrUndef(MaskArg))
6898 return PassthruArg;
6899 return nullptr;
6900 }
6901 case Intrinsic::fshl:
6902 case Intrinsic::fshr: {
6903 Value *Op0 = Args[0], *Op1 = Args[1], *ShAmtArg = Args[2];
6904
6905 // If both operands are undef, the result is undef.
6906 if (Q.isUndefValue(Op0) && Q.isUndefValue(Op1))
6907 return UndefValue::get(F->getReturnType());
6908
6909 // If shift amount is undef, assume it is zero.
6910 if (Q.isUndefValue(ShAmtArg))
6911 return Args[IID == Intrinsic::fshl ? 0 : 1];
6912
6913 const APInt *ShAmtC;
6914 if (match(ShAmtArg, m_APInt(ShAmtC))) {
6915 // If there's effectively no shift, return the 1st arg or 2nd arg.
6916 APInt BitWidth = APInt(ShAmtC->getBitWidth(), ShAmtC->getBitWidth());
6917 if (ShAmtC->urem(BitWidth).isZero())
6918 return Args[IID == Intrinsic::fshl ? 0 : 1];
6919 }
6920
6921 // Rotating zero by anything is zero.
6922 if (match(Op0, m_Zero()) && match(Op1, m_Zero()))
6923 return ConstantInt::getNullValue(F->getReturnType());
6924
6925 // Rotating -1 by anything is -1.
6926 if (match(Op0, m_AllOnes()) && match(Op1, m_AllOnes()))
6927 return ConstantInt::getAllOnesValue(F->getReturnType());
6928
6929 return nullptr;
6930 }
6931 case Intrinsic::experimental_constrained_fma: {
6933 if (Value *V = simplifyFPOp(Args, {}, Q, *FPI->getExceptionBehavior(),
6934 *FPI->getRoundingMode()))
6935 return V;
6936 return nullptr;
6937 }
6938 case Intrinsic::fma:
6939 case Intrinsic::fmuladd: {
6940 if (Value *V = simplifyFPOp(Args, {}, Q, fp::ebIgnore,
6942 return V;
6943 return nullptr;
6944 }
6945 case Intrinsic::smul_fix:
6946 case Intrinsic::smul_fix_sat: {
6947 Value *Op0 = Args[0];
6948 Value *Op1 = Args[1];
6949 Value *Op2 = Args[2];
6950 Type *ReturnType = F->getReturnType();
6951
6952 // Canonicalize constant operand as Op1 (ConstantFolding handles the case
6953 // when both Op0 and Op1 are constant so we do not care about that special
6954 // case here).
6955 if (isa<Constant>(Op0))
6956 std::swap(Op0, Op1);
6957
6958 // X * 0 -> 0
6959 if (match(Op1, m_Zero()))
6960 return Constant::getNullValue(ReturnType);
6961
6962 // X * undef -> 0
6963 if (Q.isUndefValue(Op1))
6964 return Constant::getNullValue(ReturnType);
6965
6966 // X * (1 << Scale) -> X
6967 APInt ScaledOne =
6968 APInt::getOneBitSet(ReturnType->getScalarSizeInBits(),
6969 cast<ConstantInt>(Op2)->getZExtValue());
6970 if (ScaledOne.isNonNegative() && match(Op1, m_SpecificInt(ScaledOne)))
6971 return Op0;
6972
6973 return nullptr;
6974 }
6975 case Intrinsic::vector_insert: {
6976 Value *Vec = Args[0];
6977 Value *SubVec = Args[1];
6978 Value *Idx = Args[2];
6979 Type *ReturnType = F->getReturnType();
6980
6981 // (insert_vector Y, (extract_vector X, 0), 0) -> X
6982 // where: Y is X, or Y is undef
6983 unsigned IdxN = cast<ConstantInt>(Idx)->getZExtValue();
6984 Value *X = nullptr;
6985 if (match(SubVec,
6987 (Q.isUndefValue(Vec) || Vec == X) && IdxN == 0 &&
6988 X->getType() == ReturnType)
6989 return X;
6990
6991 return nullptr;
6992 }
6993 case Intrinsic::experimental_constrained_fadd: {
6995 return simplifyFAddInst(Args[0], Args[1], FPI->getFastMathFlags(), Q,
6996 *FPI->getExceptionBehavior(),
6997 *FPI->getRoundingMode());
6998 }
6999 case Intrinsic::experimental_constrained_fsub: {
7001 return simplifyFSubInst(Args[0], Args[1], FPI->getFastMathFlags(), Q,
7002 *FPI->getExceptionBehavior(),
7003 *FPI->getRoundingMode());
7004 }
7005 case Intrinsic::experimental_constrained_fmul: {
7007 return simplifyFMulInst(Args[0], Args[1], FPI->getFastMathFlags(), Q,
7008 *FPI->getExceptionBehavior(),
7009 *FPI->getRoundingMode());
7010 }
7011 case Intrinsic::experimental_constrained_fdiv: {
7013 return simplifyFDivInst(Args[0], Args[1], FPI->getFastMathFlags(), Q,
7014 *FPI->getExceptionBehavior(),
7015 *FPI->getRoundingMode());
7016 }
7017 case Intrinsic::experimental_constrained_frem: {
7019 return simplifyFRemInst(Args[0], Args[1], FPI->getFastMathFlags(), Q,
7020 *FPI->getExceptionBehavior(),
7021 *FPI->getRoundingMode());
7022 }
7023 case Intrinsic::experimental_constrained_ldexp:
7024 return simplifyLdexp(Args[0], Args[1], Q, true);
7025 case Intrinsic::experimental_gc_relocate: {
7027 Value *DerivedPtr = GCR.getDerivedPtr();
7028 Value *BasePtr = GCR.getBasePtr();
7029
7030 // Undef is undef, even after relocation.
7031 if (isa<UndefValue>(DerivedPtr) || isa<UndefValue>(BasePtr)) {
7032 return UndefValue::get(GCR.getType());
7033 }
7034
7035 if (auto *PT = dyn_cast<PointerType>(GCR.getType())) {
7036 // For now, the assumption is that the relocation of null will be null
7037 // for most any collector. If this ever changes, a corresponding hook
7038 // should be added to GCStrategy and this code should check it first.
7039 if (isa<ConstantPointerNull>(DerivedPtr)) {
7040 // Use null-pointer of gc_relocate's type to replace it.
7041 return ConstantPointerNull::get(PT);
7042 }
7043 }
7044 return nullptr;
7045 }
7046 case Intrinsic::experimental_vp_reverse: {
7047 Value *Vec = Call->getArgOperand(0);
7048 Value *Mask = Call->getArgOperand(1);
7049 Value *EVL = Call->getArgOperand(2);
7050
7051 Value *X;
7052 // vp.reverse(vp.reverse(X)) == X (with all ones mask and matching EVL)
7053 if (match(Mask, m_AllOnes()) &&
7055 m_Value(X), m_AllOnes(), m_Specific(EVL))))
7056 return X;
7057
7058 // vp.reverse(splat(X)) -> splat(X) (regardless of mask and EVL)
7059 if (isSplatValue(Vec))
7060 return Vec;
7061 return nullptr;
7062 }
7063 default:
7064 return nullptr;
7065 }
7066}
7067
7069 ArrayRef<Value *> Args,
7070 const SimplifyQuery &Q) {
7071 auto *F = dyn_cast<Function>(Callee);
7072 if (!F || !canConstantFoldCallTo(Call, F))
7073 return nullptr;
7074
7075 SmallVector<Constant *, 4> ConstantArgs;
7076 ConstantArgs.reserve(Args.size());
7077 for (Value *Arg : Args) {
7079 if (!C) {
7080 if (isa<MetadataAsValue>(Arg))
7081 continue;
7082 return nullptr;
7083 }
7084 ConstantArgs.push_back(C);
7085 }
7086
7087 return ConstantFoldCall(Call, F, ConstantArgs, Q.TLI);
7088}
7089
7091 const SimplifyQuery &Q) {
7092 // Args should not contain operand bundle operands.
7093 assert(Call->arg_size() == Args.size());
7094
7095 // musttail calls can only be simplified if they are also DCEd.
7096 // As we can't guarantee this here, don't simplify them.
7097 if (Call->isMustTailCall())
7098 return nullptr;
7099
7100 // call undef -> poison
7101 // call null -> poison
7102 if (isa<UndefValue>(Callee) || isa<ConstantPointerNull>(Callee))
7103 return PoisonValue::get(Call->getType());
7104
7105 if (Value *V = tryConstantFoldCall(Call, Callee, Args, Q))
7106 return V;
7107
7108 auto *F = dyn_cast<Function>(Callee);
7109 if (F && F->isIntrinsic())
7110 if (Value *Ret = simplifyIntrinsic(Call, Callee, Args, Q))
7111 return Ret;
7112
7113 return nullptr;
7114}
7115
7118 SmallVector<Value *, 4> Args(Call->args());
7119 if (Value *V = tryConstantFoldCall(Call, Call->getCalledOperand(), Args, Q))
7120 return V;
7121 if (Value *Ret = simplifyIntrinsic(Call, Call->getCalledOperand(), Args, Q))
7122 return Ret;
7123 return nullptr;
7124}
7125
7126/// Given operands for a Freeze, see if we can fold the result.
7128 // Use a utility function defined in ValueTracking.
7130 return Op0;
7131 // We have room for improvement.
7132 return nullptr;
7133}
7134
7136 return ::simplifyFreezeInst(Op0, Q);
7137}
7138
7140 const SimplifyQuery &Q) {
7141 if (LI->isVolatile())
7142 return nullptr;
7143
7144 if (auto *PtrOpC = dyn_cast<Constant>(PtrOp))
7145 return ConstantFoldLoadFromConstPtr(PtrOpC, LI->getType(), Q.DL);
7146
7147 // We can only fold the load if it is from a constant global with definitive
7148 // initializer. Skip expensive logic if this is not the case.
7150 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
7151 return nullptr;
7152
7153 // If GlobalVariable's initializer is uniform, then return the constant
7154 // regardless of its offset.
7155 if (Constant *C = ConstantFoldLoadFromUniformValue(GV->getInitializer(),
7156 LI->getType(), Q.DL))
7157 return C;
7158
7159 // Try to convert operand into a constant by stripping offsets while looking
7160 // through invariant.group intrinsics.
7162 PtrOp = PtrOp->stripAndAccumulateConstantOffsets(
7163 Q.DL, Offset, /* AllowNonInbounts */ true,
7164 /* AllowInvariantGroup */ true);
7165 if (PtrOp == GV) {
7166 // Index size may have changed due to address space casts.
7167 Offset = Offset.sextOrTrunc(Q.DL.getIndexTypeSizeInBits(PtrOp->getType()));
7168 return ConstantFoldLoadFromConstPtr(GV, LI->getType(), std::move(Offset),
7169 Q.DL);
7170 }
7171
7172 return nullptr;
7173}
7174
7175/// See if we can compute a simplified version of this instruction.
7176/// If not, this returns null.
7177
7179 ArrayRef<Value *> NewOps,
7180 const SimplifyQuery &SQ,
7181 unsigned MaxRecurse) {
7182 assert(I->getFunction() && "instruction should be inserted in a function");
7183 assert((!SQ.CxtI || SQ.CxtI->getFunction() == I->getFunction()) &&
7184 "context instruction should be in the same function");
7185
7186 const SimplifyQuery Q = SQ.CxtI ? SQ : SQ.getWithInstruction(I);
7187
7188 switch (I->getOpcode()) {
7189 default:
7190 if (all_of(NewOps, IsaPred<Constant>)) {
7191 SmallVector<Constant *, 8> NewConstOps(NewOps.size());
7192 transform(NewOps, NewConstOps.begin(),
7193 [](Value *V) { return cast<Constant>(V); });
7194 return ConstantFoldInstOperands(I, NewConstOps, Q.DL, Q.TLI);
7195 }
7196 return nullptr;
7197 case Instruction::FNeg:
7198 return simplifyFNegInst(NewOps[0], I->getFastMathFlags(), Q, MaxRecurse);
7199 case Instruction::FAdd:
7200 return simplifyFAddInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7201 MaxRecurse);
7202 case Instruction::Add:
7203 return simplifyAddInst(
7204 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7205 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7206 case Instruction::FSub:
7207 return simplifyFSubInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7208 MaxRecurse);
7209 case Instruction::Sub:
7210 return simplifySubInst(
7211 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7212 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7213 case Instruction::FMul:
7214 return simplifyFMulInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7215 MaxRecurse);
7216 case Instruction::Mul:
7217 return simplifyMulInst(
7218 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7219 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7220 case Instruction::SDiv:
7221 return simplifySDivInst(NewOps[0], NewOps[1],
7223 MaxRecurse);
7224 case Instruction::UDiv:
7225 return simplifyUDivInst(NewOps[0], NewOps[1],
7227 MaxRecurse);
7228 case Instruction::FDiv:
7229 return simplifyFDivInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7230 MaxRecurse);
7231 case Instruction::SRem:
7232 return simplifySRemInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7233 case Instruction::URem:
7234 return simplifyURemInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7235 case Instruction::FRem:
7236 return simplifyFRemInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7237 MaxRecurse);
7238 case Instruction::Shl:
7239 return simplifyShlInst(
7240 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7241 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7242 case Instruction::LShr:
7243 return simplifyLShrInst(NewOps[0], NewOps[1],
7245 MaxRecurse);
7246 case Instruction::AShr:
7247 return simplifyAShrInst(NewOps[0], NewOps[1],
7249 MaxRecurse);
7250 case Instruction::And:
7251 return simplifyAndInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7252 case Instruction::Or:
7253 return simplifyOrInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7254 case Instruction::Xor:
7255 return simplifyXorInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7256 case Instruction::ICmp:
7257 return simplifyICmpInst(cast<ICmpInst>(I)->getCmpPredicate(), NewOps[0],
7258 NewOps[1], Q, MaxRecurse);
7259 case Instruction::FCmp:
7260 return simplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(), NewOps[0],
7261 NewOps[1], I->getFastMathFlags(), Q, MaxRecurse);
7262 case Instruction::Select:
7263 return simplifySelectInst(NewOps[0], NewOps[1], NewOps[2], Q, MaxRecurse);
7264 case Instruction::GetElementPtr: {
7265 auto *GEPI = cast<GetElementPtrInst>(I);
7266 return simplifyGEPInst(GEPI->getSourceElementType(), NewOps[0],
7267 ArrayRef(NewOps).slice(1), GEPI->getNoWrapFlags(), Q,
7268 MaxRecurse);
7269 }
7270 case Instruction::InsertValue: {
7272 return simplifyInsertValueInst(NewOps[0], NewOps[1], IV->getIndices(), Q,
7273 MaxRecurse);
7274 }
7275 case Instruction::InsertElement:
7276 return simplifyInsertElementInst(NewOps[0], NewOps[1], NewOps[2], Q);
7277 case Instruction::ExtractValue: {
7278 auto *EVI = cast<ExtractValueInst>(I);
7279 return simplifyExtractValueInst(NewOps[0], EVI->getIndices(), Q,
7280 MaxRecurse);
7281 }
7282 case Instruction::ExtractElement:
7283 return simplifyExtractElementInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7284 case Instruction::ShuffleVector: {
7285 auto *SVI = cast<ShuffleVectorInst>(I);
7286 return simplifyShuffleVectorInst(NewOps[0], NewOps[1],
7287 SVI->getShuffleMask(), SVI->getType(), Q,
7288 MaxRecurse);
7289 }
7290 case Instruction::PHI:
7291 return simplifyPHINode(cast<PHINode>(I), NewOps, Q);
7292 case Instruction::Call:
7293 return simplifyCall(
7294 cast<CallInst>(I), NewOps.back(),
7295 NewOps.drop_back(1 + cast<CallInst>(I)->getNumTotalBundleOperands()), Q);
7296 case Instruction::Freeze:
7297 return llvm::simplifyFreezeInst(NewOps[0], Q);
7298#define HANDLE_CAST_INST(num, opc, clas) case Instruction::opc:
7299#include "llvm/IR/Instruction.def"
7300#undef HANDLE_CAST_INST
7301 return simplifyCastInst(I->getOpcode(), NewOps[0], I->getType(), Q,
7302 MaxRecurse);
7303 case Instruction::Alloca:
7304 // No simplifications for Alloca and it can't be constant folded.
7305 return nullptr;
7306 case Instruction::Load:
7307 return simplifyLoadInst(cast<LoadInst>(I), NewOps[0], Q);
7308 }
7309}
7310
7312 ArrayRef<Value *> NewOps,
7313 const SimplifyQuery &SQ) {
7314 assert(NewOps.size() == I->getNumOperands() &&
7315 "Number of operands should match the instruction!");
7316 return ::simplifyInstructionWithOperands(I, NewOps, SQ, RecursionLimit);
7317}
7318
7320 SmallVector<Value *, 8> Ops(I->operands());
7322
7323 /// If called on unreachable code, the instruction may simplify to itself.
7324 /// Make life easier for users by detecting that case here, and returning a
7325 /// safe value instead.
7326 return Result == I ? PoisonValue::get(I->getType()) : Result;
7327}
7328
7329/// Implementation of recursive simplification through an instruction's
7330/// uses.
7331///
7332/// This is the common implementation of the recursive simplification routines.
7333/// If we have a pre-simplified value in 'SimpleV', that is forcibly used to
7334/// replace the instruction 'I'. Otherwise, we simply add 'I' to the list of
7335/// instructions to process and attempt to simplify it using
7336/// InstructionSimplify. Recursively visited users which could not be
7337/// simplified themselves are to the optional UnsimplifiedUsers set for
7338/// further processing by the caller.
7339///
7340/// This routine returns 'true' only when *it* simplifies something. The passed
7341/// in simplified value does not count toward this.
7343 Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI,
7344 const DominatorTree *DT, AssumptionCache *AC,
7345 SmallSetVector<Instruction *, 8> *UnsimplifiedUsers = nullptr) {
7346 bool Simplified = false;
7348 const DataLayout &DL = I->getDataLayout();
7349
7350 // If we have an explicit value to collapse to, do that round of the
7351 // simplification loop by hand initially.
7352 if (SimpleV) {
7353 for (User *U : I->users())
7354 if (U != I)
7355 Worklist.insert(cast<Instruction>(U));
7356
7357 // Replace the instruction with its simplified value.
7358 I->replaceAllUsesWith(SimpleV);
7359
7360 if (!I->isEHPad() && !I->isTerminator() && !I->mayHaveSideEffects())
7361 I->eraseFromParent();
7362 } else {
7363 Worklist.insert(I);
7364 }
7365
7366 // Note that we must test the size on each iteration, the worklist can grow.
7367 for (unsigned Idx = 0; Idx != Worklist.size(); ++Idx) {
7368 I = Worklist[Idx];
7369
7370 // See if this instruction simplifies.
7371 SimpleV = simplifyInstruction(I, {DL, TLI, DT, AC});
7372 if (!SimpleV) {
7373 if (UnsimplifiedUsers)
7374 UnsimplifiedUsers->insert(I);
7375 continue;
7376 }
7377
7378 Simplified = true;
7379
7380 // Stash away all the uses of the old instruction so we can check them for
7381 // recursive simplifications after a RAUW. This is cheaper than checking all
7382 // uses of To on the recursive step in most cases.
7383 for (User *U : I->users())
7384 Worklist.insert(cast<Instruction>(U));
7385
7386 // Replace the instruction with its simplified value.
7387 I->replaceAllUsesWith(SimpleV);
7388
7389 if (!I->isEHPad() && !I->isTerminator() && !I->mayHaveSideEffects())
7390 I->eraseFromParent();
7391 }
7392 return Simplified;
7393}
7394
7396 Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI,
7397 const DominatorTree *DT, AssumptionCache *AC,
7398 SmallSetVector<Instruction *, 8> *UnsimplifiedUsers) {
7399 assert(I != SimpleV && "replaceAndRecursivelySimplify(X,X) is not valid!");
7400 assert(SimpleV && "Must provide a simplified value.");
7401 return replaceAndRecursivelySimplifyImpl(I, SimpleV, TLI, DT, AC,
7402 UnsimplifiedUsers);
7403}
7404
7405namespace llvm {
7407 auto *DTWP = P.getAnalysisIfAvailable<DominatorTreeWrapperPass>();
7408 auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;
7409 auto *TLIWP = P.getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
7410 auto *TLI = TLIWP ? &TLIWP->getTLI(F) : nullptr;
7411 auto *ACWP = P.getAnalysisIfAvailable<AssumptionCacheTracker>();
7412 auto *AC = ACWP ? &ACWP->getAssumptionCache(F) : nullptr;
7413 return {F.getDataLayout(), TLI, DT, AC};
7414}
7415
7417 const DataLayout &DL) {
7418 return {DL, &AR.TLI, &AR.DT, &AR.AC};
7419}
7420
7421template <class T, class... TArgs>
7423 Function &F) {
7424 auto *DT = AM.template getCachedResult<DominatorTreeAnalysis>(F);
7425 auto *TLI = AM.template getCachedResult<TargetLibraryAnalysis>(F);
7426 auto *AC = AM.template getCachedResult<AssumptionAnalysis>(F);
7427 return {F.getDataLayout(), TLI, DT, AC};
7428}
7430 Function &);
7431
7433 if (!CanUseUndef)
7434 return false;
7435
7436 return match(V, m_Undef());
7437}
7438
7439} // namespace llvm
7440
7441void InstSimplifyFolder::anchor() {}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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")
IRTranslator LLVM IR MI
static Value * simplifyCmpSelFalseCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
Simplify comparison with false branch of select.
static Value * simplifyCmpSelCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse, Constant *TrueOrFalse)
Simplify comparison with true or false branch of select: sel = select i1 cond, i32 tv,...
static Value * foldMinMaxSharedOp(Intrinsic::ID IID, Value *Op0, Value *Op1)
Given a min/max intrinsic, see if it can be removed based on having an operand that is another min/ma...
static Value * expandCommutativeBinOp(Instruction::BinaryOps Opcode, Value *L, Value *R, Instruction::BinaryOps OpcodeToExpand, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify binops of form "A op (B op' C)" or the commuted variant by distributing op over op'.
static Constant * foldOrCommuteConstant(Instruction::BinaryOps Opcode, Value *&Op0, Value *&Op1, const SimplifyQuery &Q)
static bool haveNonOverlappingStorage(const Value *V1, const Value *V2)
Return true if V1 and V2 are each the base of some distict storage region [V, object_size(V)] which d...
static Constant * foldConstant(Instruction::UnaryOps Opcode, Value *&Op, const SimplifyQuery &Q)
static Value * handleOtherCmpSelSimplifications(Value *TCmp, Value *FCmp, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
We know comparison with both branches of select can be simplified, but they are not equal.
static Value * threadCmpOverPHI(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a comparison with a PHI instruction, try to simplify the comparison by seeing whether ...
static Constant * propagateNaN(Constant *In)
Try to propagate existing NaN values when possible.
static Value * simplifyICmpOfBools(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Fold an icmp when its operands have i1 scalar type.
static Value * simplifyICmpWithBinOpOnLHS(CmpPredicate Pred, BinaryOperator *LBO, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
static void getUnsignedMonotonicValues(SmallPtrSetImpl< Value * > &Res, Value *V, MonotonicType Type, const SimplifyQuery &Q, unsigned Depth=0)
Get values V_i such that V uge V_i (GreaterEq) or V ule V_i (LowerEq).
static Value * simplifyRelativeLoad(Constant *Ptr, Constant *Offset, const DataLayout &DL)
static Value * simplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
These are simplifications common to SDiv and UDiv.
static Value * simplifyPHINode(PHINode *PN, ArrayRef< Value * > IncomingValues, const SimplifyQuery &Q)
See if we can fold the given phi. If not, returns null.
@ RecursionLimit
static bool isSameCompare(Value *V, CmpPredicate Pred, Value *LHS, Value *RHS)
isSameCompare - Is V equivalent to the comparison "LHS Pred RHS"?
static Value * simplifyAndCommutative(Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
static bool isIdempotent(Intrinsic::ID ID)
static std::optional< ConstantRange > getRange(Value *V, const InstrInfoQuery &IIQ)
Helper method to get range from metadata or attribute.
static Value * simplifyAndOrOfICmpsWithCtpop(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd)
Try to simplify and/or of icmp with ctpop intrinsic.
static Value * simplifyUnsignedRangeCheck(ICmpInst *ZeroICmp, ICmpInst *UnsignedICmp, bool IsAnd, const SimplifyQuery &Q)
Commuted variants are assumed to be handled by calling this function again with the parameters swappe...
static Value * tryConstantFoldCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
static Value * simplifyWithOpsReplaced(Value *V, ArrayRef< std::pair< Value *, Value * > > Ops, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags, unsigned MaxRecurse)
static Value * simplifyAndOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, const InstrInfoQuery &IIQ)
static Value * simplifyAndOrOfFCmpsWithConstants(FCmpInst *Cmp0, FCmpInst *Cmp1, bool IsAnd)
Test if a pair of compares with a shared operand and 2 constants has an empty set intersection,...
static Value * simplifyICmpWithMinMax(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
simplify integer comparisons where at least one operand of the compare matches an integer min/max idi...
static Value * simplifyCmpSelTrueCase(CmpPredicate Pred, Value *LHS, Value *RHS, Value *Cond, const SimplifyQuery &Q, unsigned MaxRecurse)
Simplify comparison with true branch of select.
static Value * simplifyIntrinsic(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
static Value * simplifyICmpUsingMonotonicValues(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static bool isPoisonShift(Value *Amount, const SimplifyQuery &Q)
Returns true if a shift by Amount always yields poison.
static APInt stripAndComputeConstantOffsets(const DataLayout &DL, Value *&V, bool AllowNonInbounds=false)
Compute the base pointer and cumulative constant offsets for V.
static Value * simplifyRightShift(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an LShr or AShr, see if we can fold the result.
static Value * simplifyICmpWithIntrinsicOnLHS(CmpPredicate Pred, Value *LHS, Value *RHS)
static Value * simplifyByDomEq(unsigned Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Test if there is a dominating equivalence condition for the two operands.
static Value * simplifyFPUnOp(unsigned, Value *, const FastMathFlags &, const SimplifyQuery &, unsigned)
Given the operand for a UnaryOperator, see if we can fold the result.
static Value * simplifyICmpWithBinOp(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
TODO: A large part of this logic is duplicated in InstCombine's foldICmpBinOp().
static Value * simplifyOrOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
static Value * expandBinOp(Instruction::BinaryOps Opcode, Value *V, Value *OtherOp, Instruction::BinaryOps OpcodeToExpand, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a binary operator of form "V op OtherOp" where V is "(B0 opex B1)" by distributing 'o...
static Value * simplifyICmpWithZero(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Try hard to fold icmp with zero RHS because this is a common case.
static Value * simplifySelectWithFCmp(Value *Cond, Value *T, Value *F, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is a floating-point comparison.
static Constant * getFalse(Type *Ty)
For a boolean type or a vector of boolean type, return false or a vector with every element false.
static Value * simplifyDivRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
Check for common or similar folds of integer division or integer remainder.
static bool removesFPFraction(Intrinsic::ID ID)
Return true if the intrinsic rounds a floating-point value to an integral floating-point value (not a...
static Value * simplifyOrOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, const InstrInfoQuery &IIQ)
static Value * simplifySelectWithEquivalence(ArrayRef< std::pair< Value *, Value * > > Replacements, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is an integer equality or floating-po...
static bool trySimplifyICmpWithAdds(CmpPredicate Pred, Value *LHS, Value *RHS, const InstrInfoQuery &IIQ)
static Value * simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X, const APInt *Y, bool TrueWhenUnset)
Try to simplify a select instruction when its condition operand is an integer comparison where one op...
static Value * simplifyAssociativeBinOp(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Generic simplifications for associative binary operations.
static Value * threadBinOpOverPHI(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a binary operation with an operand that is a PHI instruction, try to simplify the bino...
static Value * simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS, CmpPredicate Pred, Value *TVal, Value *FVal)
static Constant * simplifyFPOp(ArrayRef< Value * > Ops, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior, RoundingMode Rounding)
Perform folds that are common to any floating-point operation.
static Value * threadCmpOverSelect(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a comparison with a select instruction, try to simplify the comparison by seeing wheth...
static bool replaceAndRecursivelySimplifyImpl(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, const DominatorTree *DT, AssumptionCache *AC, SmallSetVector< Instruction *, 8 > *UnsimplifiedUsers=nullptr)
Implementation of recursive simplification through an instruction's uses.
static bool isAllocDisjoint(const Value *V)
Return true if the underlying object (storage) must be disjoint from storage returned by any noalias ...
static Constant * getTrue(Type *Ty)
For a boolean type or a vector of boolean type, return true or a vector with every element true.
static bool isDivZero(Value *X, Value *Y, const SimplifyQuery &Q, unsigned MaxRecurse, bool IsSigned)
Return true if we can simplify X / Y to 0.
static Value * simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q, bool IsStrict)
static Value * simplifyLogicOfAddSub(Value *Op0, Value *Op1, Instruction::BinaryOps Opcode)
Given a bitwise logic op, check if the operands are add/sub with a common source value and inverted c...
static Value * simplifySelectWithBitTest(Value *CondVal, Value *TrueVal, Value *FalseVal)
An alternative way to test if a bit is set or not.
static Value * simplifyOrLogic(Value *X, Value *Y)
static Type * getCompareTy(Value *Op)
static Value * simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
static bool isICmpTrue(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Given a predicate and two operands, return true if the comparison is true.
static Value * foldIdentityShuffles(int DestElt, Value *Op0, Value *Op1, int MaskVal, Value *RootVec, unsigned MaxRecurse)
For the given destination element of a shuffle, peek through shuffles to match a root vector source o...
static Value * simplifyAndOrOfFCmps(const SimplifyQuery &Q, FCmpInst *LHS, FCmpInst *RHS, bool IsAnd)
static Value * simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static Value * extractEquivalentCondition(Value *V, CmpPredicate Pred, Value *LHS, Value *RHS)
Rummage around inside V looking for something equivalent to the comparison "LHS Pred RHS".
static Value * simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0, Value *Op1, bool IsAnd)
static Value * threadBinOpOverSelect(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a binary operation with a select instruction as an operand, try to simplify the binop ...
static Constant * computePointerDifference(const DataLayout &DL, Value *LHS, Value *RHS)
Compute the constant difference between two pointer values.
static Value * simplifyAndOrOfICmpsWithConstants(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd)
Test if a pair of compares with a shared operand and 2 constants has an empty set intersection,...
static Value * simplifyAndOrWithICmpEq(unsigned Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
static Value * simplifyICmpWithDominatingAssume(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static Value * simplifyShift(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, bool IsNSW, const SimplifyQuery &Q, unsigned MaxRecurse)
Given operands for an Shl, LShr or AShr, see if we can fold the result.
static Constant * computePointerICmp(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static Value * simplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, const SimplifyQuery &Q, unsigned MaxRecurse)
These are simplifications common to SRem and URem.
static bool valueDominatesPHI(Value *V, PHINode *P, const DominatorTree *DT)
Does the given value dominate the specified phi node?
static Value * simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse)
Try to simplify a select instruction when its condition operand is an integer comparison.
static Value * foldMinimumMaximumSharedOp(Intrinsic::ID IID, Value *Op0, Value *Op1)
Given a min/max intrinsic, see if it can be removed based on having an operand that is another min/ma...
static Value * simplifyUnaryIntrinsic(Function *F, Value *Op0, const SimplifyQuery &Q, const CallBase *Call)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
This header provides classes for managing per-loop analyses.
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
#define T
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
static unsigned getScalarSizeInBits(Type *Ty)
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 SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1033
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1512
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:380
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1666
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1340
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1488
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1111
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition APInt.h:1249
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1639
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
Definition APInt.h:361
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1041
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:356
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:475
bool getBoolValue() const
Convert APInt to a boolean value.
Definition APInt.h:471
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1736
bool isMask(unsigned numBits) const
Definition APInt.h:488
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:405
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:334
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1150
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1257
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:440
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:306
bool isSignBitSet() const
Determine if sign bit of this APInt is set.
Definition APInt.h:341
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1130
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:296
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:200
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:389
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:239
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1221
an instruction to allocate memory on the stack
A container for analyses that lazily runs them and caches their results.
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:41
const T & back() const
back - Get the last element.
Definition ArrayRef.h:156
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
Definition ArrayRef.h:206
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:142
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:191
An immutable pass that tracks lazily created AssumptionCache objects.
AssumptionCache & getAssumptionCache(Function &F)
Get the cached assumptions for a function.
A cache of @llvm.assume calls within a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:223
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
BinaryOps getOpcode() const
Definition InstrTypes.h:374
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
static LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, Type *SrcIntPtrTy, Type *MidIntPtrTy, Type *DstIntPtrTy)
Determine how a pair of casts can be eliminated, if they can be at all.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:666
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:984
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:860
bool isFalseWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:950
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:678
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:681
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:695
@ ICMP_SLT
signed less than
Definition InstrTypes.h:707
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:708
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:684
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:693
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:682
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:683
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:702
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:701
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:705
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:692
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:686
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:689
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:703
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:690
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:685
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:687
@ ICMP_NE
not equal
Definition InstrTypes.h:700
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:706
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:694
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:704
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:691
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:680
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:688
bool isSigned() const
Definition InstrTypes.h:932
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:829
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:944
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:772
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:873
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:791
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:767
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:778
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:938
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
Definition Constants.h:1387
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
Definition Constants.h:1274
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
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...
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
static Constant * getNegativeZero(Type *Ty)
Definition Constants.h:315
static LLVM_ABI Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:131
static LLVM_ABI ConstantInt * getFalse(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:163
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
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 ConstantRange inverse() const
Return a new range that is the logical not of the current set.
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNaN() const
Return true if this is a floating-point NaN constant or a vector floating-point constant with all NaN...
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:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition DataLayout.h:479
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
unsigned getIndexSizeInBits(unsigned AS) const
The size in bits of indices used for address calculation in getelementptr and for addresses in the gi...
Definition DataLayout.h:487
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:760
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:322
DominatorTree & getDomTree()
Definition Dominators.h:330
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:165
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.
This instruction compares its operands according to the predicate given to the constructor.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:22
bool noSignedZeros() const
Definition FMF.h:67
bool noInfs() const
Definition FMF.h:66
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
bool noNaNs() const
Definition FMF.h:65
Represents calls to the gc.relocate intrinsic.
LLVM_ABI Value * getBasePtr() const
LLVM_ABI Value * getDerivedPtr() const
Represents flags for the getelementptr instruction/expression.
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
This instruction compares its operands according to the predicate given to the constructor.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
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.
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
static bool isBitwiseLogicOp(unsigned Opcode)
Determine if the Opcode is and/or/xor.
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
An instruction for reading from memory.
bool isVolatile() const
Return true if this is a load from a volatile memory location.
Metadata node.
Definition Metadata.h:1078
static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits)
Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values, so there is a certain thre...
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
op_range incoming_values()
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.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents a cast from a pointer to an integer.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:102
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:150
static void commuteShuffleMask(MutableArrayRef< int > Mask, unsigned InVecNumElts)
Change values in a shuffle permute mask assuming the two vector operands of length InVecNumElts have ...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
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.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:338
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetLibraryInfo & getTLI(const Function &F)
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:297
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:198
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:231
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:270
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
Value * getOperand(unsigned i) const
Definition User.h:232
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
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.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
This class represents zero extension of integer types.
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ 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.
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)
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FMul, true > m_c_FMul(const LHS &L, const RHS &R)
Matches FMul with LHS and RHS in either order.
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cstfp_pred_ty< is_inf > m_Inf()
Match a positive or negative infinity FP constant.
m_Intrinsic_Ty< Opnd0 >::Ty m_BitReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::FSub > m_FSub(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< cstfp_pred_ty< is_any_zero_fp >, RHS, Instruction::FSub > m_FNegNSZ(const RHS &X)
Match 'fneg X' as 'fsub +-0.0, X'.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
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.
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)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
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.
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...
ap_match< APFloat > m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
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.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
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.
cstfp_pred_ty< is_neg_zero_fp > m_NegZeroFP()
Match a floating-point negative zero.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
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()...
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
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)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
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.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > > > m_c_MaxOrMin(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
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)
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
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)
Exact_match< T > m_Exact(const T &SubPattern)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
BinaryOp_match< LHS, RHS, Instruction::FAdd, true > m_c_FAdd(const LHS &L, const RHS &R)
Matches FAdd with LHS and RHS in either order.
LogicalOp_match< LHS, RHS, Instruction::And, true > m_c_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
cstfp_pred_ty< is_nan > m_NaN()
Match an arbitrary NaN constant.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_BSwap(const Opnd0 &Op0)
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.
LogicalOp_match< LHS, RHS, Instruction::Or, true > m_c_LogicalOr(const LHS &L, const RHS &R)
Matches L || R with LHS and RHS in either order.
ThreeOps_match< Val_t, Elt_t, Idx_t, Instruction::InsertElement > m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx)
Matches InsertElementInst.
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.
MatchFunctor< Val, Pattern > 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::Mul, OverflowingBinaryOperator::NoSignedWrap > m_NSWMul(const LHS &L, const RHS &R)
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.
ExceptionBehavior
Exception behavior used for floating point operations.
Definition FPEnv.h:39
@ ebStrict
This corresponds to "fpexcept.strict".
Definition FPEnv.h:42
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition FPEnv.h:40
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
LLVM_ABI Value * simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a AShr, fold the result or return nulll.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:355
@ Offset
Definition DWP.cpp:477
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:1705
LLVM_ABI Value * simplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FMul, fold the result or return null.
LLVM_ABI Value * simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef< Value * > Indices, GEPNoWrapFlags NW, const SimplifyQuery &Q)
Given operands for a GetElementPtrInst, fold the result or return null.
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,...
LLVM_ABI bool canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
LLVM_ABI Value * simplifyFreezeInst(Value *Op, const SimplifyQuery &Q)
Given an operand for a Freeze, see if we can fold the result.
LLVM_ABI Constant * ConstantFoldFPInstOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL, const Instruction *I, bool AllowNonDeterministic=true)
Attempt to constant fold a floating point binary operation with the specified operands,...
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 bool canConstantFoldCallTo(const CallBase *Call, const Function *F)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
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:644
LLVM_ABI Value * simplifySDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for an SDiv, fold the result or return null.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:296
LLVM_ABI Value * simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q)
Given operand for a UnaryOperator, fold the result or return null.
bool isDefaultFPEnvironment(fp::ExceptionBehavior EB, RoundingMode RM)
Returns true if the exception handling behavior and rounding mode match what is used in the default f...
Definition FPEnv.h:68
LLVM_ABI Value * simplifyMulInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Mul, fold the result or return null.
LLVM_ABI bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
LLVM_ABI Value * simplifyInstructionWithOperands(Instruction *I, ArrayRef< Value * > NewOps, const SimplifyQuery &Q)
Like simplifyInstruction but the operands of I are replaced with NewOps.
LLVM_ABI Value * simplifyCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
Given a callsite, callee, and arguments, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
bool canRoundingModeBe(RoundingMode RM, RoundingMode QRM)
Returns true if the rounding mode RM may be QRM at compile time or at run time.
Definition FPEnv.h:80
LLVM_ABI bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
LLVM_ABI Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
LLVM_ABI Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
LLVM_ABI CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
LLVM_ABI Value * simplifyShuffleVectorInst(Value *Op0, Value *Op1, ArrayRef< int > Mask, Type *RetTy, const SimplifyQuery &Q)
Given operands for a ShuffleVectorInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCall(const CallBase *Call, Function *F, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldCall - Attempt to constant fold a call to the specified function with the specified argum...
LLVM_ABI Value * simplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Or, fold the result or return null.
LLVM_ABI Value * simplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Xor, fold the result or return null.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
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.
LLVM_ABI Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
LLVM_ABI bool isAllocLikeFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates memory (either malloc,...
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.
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
unsigned M1(unsigned Val)
Definition VE.h:377
LLVM_ABI Value * simplifySubInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Sub, fold the result or return null.
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:754
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition STLExtras.h:1948
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:1712
LLVM_ABI bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Compute the size of the object pointed by Ptr.
LLVM_ABI bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
LLVM_ABI Constant * ConstantFoldLoadFromUniformValue(Constant *C, Type *Ty, const DataLayout &DL)
If C is a uniform value where all bits are the same (either all zero, all ones, all undef or all pois...
LLVM_ABI SelectPatternFlavor getInverseMinMaxFlavor(SelectPatternFlavor SPF)
Return the inverse minimum/maximum flavor of the specified flavor.
LLVM_ABI bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, SmallSetVector< Instruction *, 8 > *UnsimplifiedUsers=nullptr)
Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively.
LLVM_ABI Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
SelectPatternFlavor
Specific patterns of select instructions we can match.
LLVM_ABI Value * simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for a Shl, fold the result or return null.
LLVM_ABI Value * simplifyFNegInst(Value *Op, FastMathFlags FMF, const SimplifyQuery &Q)
Given operand for an FNeg, fold the result or return null.
LLVM_ABI Value * simplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FSub, fold the result or return null.
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:853
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI Value * simplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FRem, fold the result or return null.
LLVM_ABI Value * simplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FAdd, fold the result or return null.
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 Value * simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, const SimplifyQuery &Q)
Given operands for a LShr, fold the result or return null.
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 Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
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 Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
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:548
LLVM_ABI bool intrinsicPropagatesPoison(Intrinsic::ID IID)
Return whether this intrinsic propagates poison for all operands.
LLVM_ABI Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ABI Value * simplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an InsertValueInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI Value * simplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FDiv, fold the result or return null.
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 Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
LLVM_ABI Value * simplifyFMAFMul(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for the multiplication of a FMA, fold the result or return null.
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 Value * simplifyConstrainedFPCall(CallBase *Call, const SimplifyQuery &Q)
Given a constrained FP intrinsic call, tries to compute its simplified version.
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
std::optional< DecomposedBitTest > decomposeBitTest(Value *Cond, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI Value * findScalarElement(Value *V, unsigned EltNo)
Given a vector and an element number, see if the scalar value is already around as a register,...
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.
LLVM_ABI Value * simplifyUDivInst(Value *LHS, Value *RHS, bool IsExact, const SimplifyQuery &Q)
Given operands for a UDiv, fold the result or return null.
DWARFExpression::Operation Op
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
LLVM_ABI Value * simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType, Value *Op0, Value *Op1, const SimplifyQuery &Q, const CallBase *Call)
Given operands for a BinaryIntrinsic, fold the result or return null.
RoundingMode
Rounding mode.
@ NearestTiesToEven
roundTiesToEven.
@ TowardNegative
roundTowardNegative.
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.
unsigned M0(unsigned Val)
Definition VE.h:376
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.
LLVM_ABI Value * simplifyInsertElementInst(Value *Vec, Value *Elt, Value *Idx, const SimplifyQuery &Q)
Given operands for an InsertElement, fold the result or return null.
constexpr unsigned BitWidth
LLVM_ABI Value * simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags=nullptr)
See if V simplifies when its operand Op is replaced with RepOp.
LLVM_ABI bool maskIsAllZeroOrUndef(Value *Mask)
Given a mask vector of i1, Return true if all of the elements of this predicate mask are known to be ...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:560
LLVM_ABI Value * simplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an SRem, fold the result or return null.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1877
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2088
LLVM_ABI Constant * ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val, ArrayRef< unsigned > Idxs)
ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue instruction with the spe...
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
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.
@ Continue
Definition DWP.h:22
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 Value * simplifyCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a CmpInst, fold the result or return null.
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 Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
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 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 const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)
std::pair< Value *, FPClassTest > fcmpToClassTest(FCmpInst::Predicate Pred, const Function &F, Value *LHS, Value *RHS, bool LookThroughSrc=true)
Returns a pair of values, which if passed to llvm.is.fpclass, returns the same result as an fcmp with...
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...
bool isCheckForZeroAndMulWithOverflow(Value *Op0, Value *Op1, bool IsAnd, Use *&Y)
Match one of the patterns up to the select/logic op: Op0 = icmp ne i4 X, 0 Agg = call { i4,...
bool canIgnoreSNaN(fp::ExceptionBehavior EB, FastMathFlags FMF)
Returns true if the possibility of a signaling NaN can be safely ignored.
Definition FPEnv.h:86
LLVM_ABI Value * simplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a URem, fold the result or return null.
LLVM_ABI Value * simplifyExtractElementInst(Value *Vec, Value *Idx, const SimplifyQuery &Q)
Given operands for an ExtractElementInst, fold the result or return null.
LLVM_ABI Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:831
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:869
#define N
This callback is used in conjunction with PointerMayBeCaptured.
virtual Action captured(const Use *U, UseCaptureInfo CI)=0
Use U directly captures CI.UseCC and additionally CI.ResultCC through the return value of the user of...
virtual void tooManyUses()=0
tooManyUses - The depth of traversal has breached a limit.
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
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 hasNoSignedWrap(const InstT *Op) const
bool hasNoUnsignedWrap(const InstT *Op) const
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
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:242
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:274
bool hasConflict() const
Returns true if there is conflicting information.
Definition KnownBits.h:51
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
Definition KnownBits.h:296
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:248
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:145
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:129
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
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).
bool isKnownAlwaysNaN() const
Return true if it's known this must always be a nan.
static constexpr FPClassTest OrderedLessThanZeroMask
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.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
Various options to control the behavior of getObjectSize.
bool NullIsUnknownSize
If this is true, null pointers in address space 0 will be treated as though they can't be evaluated.
Mode EvalMode
How we want to evaluate this object's size.
@ Min
Evaluate all branches of an unknown condition.
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
const Instruction * CxtI
bool CanUseUndef
Controls whether simplifications are allowed to constrain the range of possible values for uses of un...
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
LLVM_ABI bool isUndefValue(Value *V) const
If CanUseUndef is true, returns whether V is undef.
AssumptionCache * AC
const TargetLibraryInfo * TLI
SimplifyQuery getWithoutUndef() const
const InstrInfoQuery IIQ
Capture information for a specific Use.