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