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