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
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
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
2637static bool isByValArg(const Value *V) {
2638 const Argument *A = dyn_cast<Argument>(V);
2639 return A && A->hasByValAttr();
2640}
2641
2642static bool isDereferenceableArg(const Value *V) {
2643 const Argument *A = dyn_cast<Argument>(V);
2644 return A && A->getType()->isPointerTy() && A->getDereferenceableBytes() > 0;
2645}
2646
2647/// Return true if the underlying object (storage) must be disjoint from
2648/// storage returned by any noalias return call.
2649static bool isAllocDisjoint(const Value *V) {
2650 // For allocas, we consider only static ones (dynamic
2651 // allocas might be transformed into calls to malloc not simultaneously
2652 // live with the compared-to allocation). For globals, we exclude symbols
2653 // that might be resolve lazily to symbols in another dynamically-loaded
2654 // library (and, thus, could be malloc'ed by the implementation).
2655 if (const AllocaInst *AI = dyn_cast<AllocaInst>(V))
2656 return AI->isStaticAlloca();
2657 if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
2658 return (GV->hasLocalLinkage() || GV->hasHiddenVisibility() ||
2659 GV->hasProtectedVisibility() || GV->hasGlobalUnnamedAddr()) &&
2660 !GV->isThreadLocal();
2661 // Byval arguments point to storage accessible to the caller, which is
2662 // disjoint from the allocated storage returned by a noalias pointer.
2663 // TODO: possibly extend this to `dereferenceable(N)` arguments once the LLVM
2664 // allocator model and its interaction with `noalias` on return values is
2665 // clarified.
2666 return isByValArg(V);
2667}
2668
2669/// Return true if V1 and V2 are each the base of some distict storage region
2670/// [V, object_size(V)] which do not overlap. Note that zero sized regions
2671/// *are* possible, and that zero sized regions do not overlap with any other.
2672static bool haveNonOverlappingStorage(const Value *V1, const Value *V2) {
2673 // Global variables always exist, so they always exist during the lifetime
2674 // of each other and all allocas. Global variables themselves usually have
2675 // non-overlapping storage, but since their addresses are constants, the
2676 // case involving two globals does not reach here and is instead handled in
2677 // constant folding.
2678 //
2679 // Two different allocas usually have different addresses...
2680 //
2681 // However, if there's an @llvm.stackrestore dynamically in between two
2682 // allocas, they may have the same address. It's tempting to reduce the
2683 // scope of the problem by only looking at *static* allocas here. That would
2684 // cover the majority of allocas while significantly reducing the likelihood
2685 // of having an @llvm.stackrestore pop up in the middle. However, it's not
2686 // actually impossible for an @llvm.stackrestore to pop up in the middle of
2687 // an entry block. Also, if we have a block that's not attached to a
2688 // function, we can't tell if it's "static" under the current definition.
2689 // Theoretically, this problem could be fixed by creating a new kind of
2690 // instruction kind specifically for static allocas. Such a new instruction
2691 // could be required to be at the top of the entry block, thus preventing it
2692 // from being subject to a @llvm.stackrestore. Instcombine could even
2693 // convert regular allocas into these special allocas. It'd be nifty.
2694 // However, until then, this problem remains open.
2695 //
2696 // So, we'll assume that two non-empty allocas have different addresses
2697 // for now.
2698 //
2699 // Furthermore, an argument marked with the `dereferenceable(N)` attribute is
2700 // guaranteed to point to N loadable bytes. Such a pointer cannot be a
2701 // one-past-the-end pointer whose address happens to coincide with the start
2702 // of another object (e.g., an alloca), as loading from a one-past-the-end
2703 // address would be UB (thus, in contrast with the premise).
2704
2705 // Byval args are backed by storage that does not overlap with allocas,
2706 // globals, other byval args, or any dereferenceable argument.
2707 if (isByValArg(V1))
2708 return isa<AllocaInst>(V2) || isa<GlobalVariable>(V2) || isByValArg(V2) ||
2710 if (isByValArg(V2))
2713
2714 if ((isDereferenceableArg(V1) && isa<AllocaInst>(V2)) ||
2716 return true;
2717
2718 return isa<AllocaInst>(V1) &&
2720}
2721
2722// A significant optimization not implemented here is assuming that alloca
2723// addresses are not equal to incoming argument values. They don't *alias*,
2724// as we say, but that doesn't mean they aren't equal, so we take a
2725// conservative approach.
2726//
2727// This is inspired in part by C++11 5.10p1:
2728// "Two pointers of the same type compare equal if and only if they are both
2729// null, both point to the same function, or both represent the same
2730// address."
2731//
2732// This is pretty permissive.
2733//
2734// It's also partly due to C11 6.5.9p6:
2735// "Two pointers compare equal if and only if both are null pointers, both are
2736// pointers to the same object (including a pointer to an object and a
2737// subobject at its beginning) or function, both are pointers to one past the
2738// last element of the same array object, or one is a pointer to one past the
2739// end of one array object and the other is a pointer to the start of a
2740// different array object that happens to immediately follow the first array
2741// object in the address space.)
2742//
2743// C11's version is more restrictive, however there's no reason why an argument
2744// couldn't be a one-past-the-end value for a stack object in the caller and be
2745// equal to the beginning of a stack object in the callee.
2746//
2747// If the C and C++ standards are ever made sufficiently restrictive in this
2748// area, it may be possible to update LLVM's semantics accordingly and reinstate
2749// this optimization.
2751 const SimplifyQuery &Q) {
2752 assert(LHS->getType() == RHS->getType() && "Must have same types");
2753 const DataLayout &DL = Q.DL;
2754 const TargetLibraryInfo *TLI = Q.TLI;
2755
2756 // We fold equality and unsigned predicates on pointer comparisons, but forbid
2757 // signed predicates since a GEP with inbounds could cross the sign boundary.
2758 if (CmpInst::isSigned(Pred))
2759 return nullptr;
2760
2761 // We have to switch to a signed predicate to handle negative indices from
2762 // the base pointer.
2763 Pred = ICmpInst::getSignedPredicate(Pred);
2764
2765 // Strip off any constant offsets so that we can reason about them.
2766 // It's tempting to use getUnderlyingObject or even just stripInBoundsOffsets
2767 // here and compare base addresses like AliasAnalysis does, however there are
2768 // numerous hazards. AliasAnalysis and its utilities rely on special rules
2769 // governing loads and stores which don't apply to icmps. Also, AliasAnalysis
2770 // doesn't need to guarantee pointer inequality when it says NoAlias.
2771
2772 // Even if an non-inbounds GEP occurs along the path we can still optimize
2773 // equality comparisons concerning the result.
2774 bool AllowNonInbounds = ICmpInst::isEquality(Pred);
2775 unsigned IndexSize = DL.getIndexTypeSizeInBits(LHS->getType());
2776 APInt LHSOffset(IndexSize, 0), RHSOffset(IndexSize, 0);
2777 LHS = LHS->stripAndAccumulateConstantOffsets(DL, LHSOffset, AllowNonInbounds);
2778 RHS = RHS->stripAndAccumulateConstantOffsets(DL, RHSOffset, AllowNonInbounds);
2779
2780 // If LHS and RHS are related via constant offsets to the same base
2781 // value, we can replace it with an icmp which just compares the offsets.
2782 if (LHS == RHS)
2783 return ConstantInt::get(getCompareTy(LHS),
2784 ICmpInst::compare(LHSOffset, RHSOffset, Pred));
2785
2786 // Various optimizations for (in)equality comparisons.
2787 if (ICmpInst::isEquality(Pred)) {
2788 // Different non-empty allocations that exist at the same time have
2789 // different addresses (if the program can tell). If the offsets are
2790 // within the bounds of their allocations (and not one-past-the-end,
2791 // so inbounds is not sufficient), and their allocations aren't the same,
2792 // the pointers are not equal.
2794 // Size of object V, falling back to `dereferenceable(N)` attribute on an
2795 // argument when getObjectSize cannot determine a concrete size.
2796 auto GetKnownSize = [&](Value *V, uint64_t &Size) {
2797 bool CanBeNull;
2798 Size = V->getPointerDereferenceableBytes(DL, CanBeNull,
2799 /*CanBeFreed=*/nullptr);
2800 return Size != 0 && !CanBeNull;
2801 };
2802
2803 uint64_t LHSSize, RHSSize;
2804 if (GetKnownSize(LHS, LHSSize) && GetKnownSize(RHS, RHSSize)) {
2805 APInt Dist = LHSOffset - RHSOffset;
2806 if (Dist.isNonNegative() ? Dist.ult(LHSSize) : (-Dist).ult(RHSSize))
2807 return ConstantInt::get(getCompareTy(LHS),
2809 }
2810 }
2811
2812 // If one side of the equality comparison must come from a noalias call
2813 // (meaning a system memory allocation function), and the other side must
2814 // come from a pointer that cannot overlap with dynamically-allocated
2815 // memory within the lifetime of the current function (allocas, byval
2816 // arguments, globals), then determine the comparison result here.
2817 SmallVector<const Value *, 8> LHSUObjs, RHSUObjs;
2818 getUnderlyingObjects(LHS, LHSUObjs);
2819 getUnderlyingObjects(RHS, RHSUObjs);
2820
2821 // Is the set of underlying objects all noalias calls?
2822 auto IsNoAliasCall = [](ArrayRef<const Value *> Objects) {
2823 return all_of(Objects, isNoAliasCall);
2824 };
2825
2826 // Is the set of underlying objects all things which must be disjoint from
2827 // noalias calls. We assume that indexing from such disjoint storage
2828 // into the heap is undefined, and thus offsets can be safely ignored.
2829 auto IsAllocDisjoint = [](ArrayRef<const Value *> Objects) {
2830 return all_of(Objects, ::isAllocDisjoint);
2831 };
2832
2833 if ((IsNoAliasCall(LHSUObjs) && IsAllocDisjoint(RHSUObjs)) ||
2834 (IsNoAliasCall(RHSUObjs) && IsAllocDisjoint(LHSUObjs)))
2835 return ConstantInt::get(getCompareTy(LHS),
2837
2838 // Fold comparisons for non-escaping pointer even if the allocation call
2839 // cannot be elided. We cannot fold malloc comparison to null. Also, the
2840 // dynamic allocation call could be either of the operands. Note that
2841 // the other operand can not be based on the alloc - if it were, then
2842 // the cmp itself would be a capture.
2843 Value *MI = nullptr;
2844 if (isAllocLikeFn(LHS, TLI) && llvm::isKnownNonZero(RHS, Q))
2845 MI = LHS;
2846 else if (isAllocLikeFn(RHS, TLI) && llvm::isKnownNonZero(LHS, Q))
2847 MI = RHS;
2848 if (MI) {
2849 // FIXME: This is incorrect, see PR54002. While we can assume that the
2850 // allocation is at an address that makes the comparison false, this
2851 // requires that *all* comparisons to that address be false, which
2852 // InstSimplify cannot guarantee.
2853 struct CustomCaptureTracker : public CaptureTracker {
2854 bool Captured = false;
2855 void tooManyUses() override { Captured = true; }
2856 Action captured(const Use *U, UseCaptureInfo CI) override {
2857 // TODO(captures): Use UseCaptureInfo.
2858 if (auto *ICmp = dyn_cast<ICmpInst>(U->getUser())) {
2859 // Comparison against value stored in global variable. Given the
2860 // pointer does not escape, its value cannot be guessed and stored
2861 // separately in a global variable.
2862 unsigned OtherIdx = 1 - U->getOperandNo();
2863 auto *LI = dyn_cast<LoadInst>(ICmp->getOperand(OtherIdx));
2864 if (LI && isa<GlobalVariable>(LI->getPointerOperand()))
2865 return Continue;
2866 }
2867
2868 Captured = true;
2869 return Stop;
2870 }
2871 };
2872 CustomCaptureTracker Tracker;
2873 PointerMayBeCaptured(MI, &Tracker);
2874 if (!Tracker.Captured)
2875 return ConstantInt::get(getCompareTy(LHS),
2877 }
2878 }
2879
2880 // Otherwise, fail.
2881 return nullptr;
2882}
2883
2884/// Fold an icmp when its operands have i1 scalar type.
2886 const SimplifyQuery &Q) {
2887 Type *ITy = getCompareTy(LHS); // The return type.
2888 Type *OpTy = LHS->getType(); // The operand type.
2889 if (!OpTy->isIntOrIntVectorTy(1))
2890 return nullptr;
2891
2892 // A boolean compared to true/false can be reduced in 14 out of the 20
2893 // (10 predicates * 2 constants) possible combinations. The other
2894 // 6 cases require a 'not' of the LHS.
2895
2896 auto ExtractNotLHS = [](Value *V) -> Value * {
2897 Value *X;
2898 if (match(V, m_Not(m_Value(X))))
2899 return X;
2900 return nullptr;
2901 };
2902
2903 if (match(RHS, m_Zero())) {
2904 switch (Pred) {
2905 case CmpInst::ICMP_NE: // X != 0 -> X
2906 case CmpInst::ICMP_UGT: // X >u 0 -> X
2907 case CmpInst::ICMP_SLT: // X <s 0 -> X
2908 return LHS;
2909
2910 case CmpInst::ICMP_EQ: // not(X) == 0 -> X != 0 -> X
2911 case CmpInst::ICMP_ULE: // not(X) <=u 0 -> X >u 0 -> X
2912 case CmpInst::ICMP_SGE: // not(X) >=s 0 -> X <s 0 -> X
2913 if (Value *X = ExtractNotLHS(LHS))
2914 return X;
2915 break;
2916
2917 case CmpInst::ICMP_ULT: // X <u 0 -> false
2918 case CmpInst::ICMP_SGT: // X >s 0 -> false
2919 return getFalse(ITy);
2920
2921 case CmpInst::ICMP_UGE: // X >=u 0 -> true
2922 case CmpInst::ICMP_SLE: // X <=s 0 -> true
2923 return getTrue(ITy);
2924
2925 default:
2926 break;
2927 }
2928 } else if (match(RHS, m_One())) {
2929 switch (Pred) {
2930 case CmpInst::ICMP_EQ: // X == 1 -> X
2931 case CmpInst::ICMP_UGE: // X >=u 1 -> X
2932 case CmpInst::ICMP_SLE: // X <=s -1 -> X
2933 return LHS;
2934
2935 case CmpInst::ICMP_NE: // not(X) != 1 -> X == 1 -> X
2936 case CmpInst::ICMP_ULT: // not(X) <=u 1 -> X >=u 1 -> X
2937 case CmpInst::ICMP_SGT: // not(X) >s 1 -> X <=s -1 -> X
2938 if (Value *X = ExtractNotLHS(LHS))
2939 return X;
2940 break;
2941
2942 case CmpInst::ICMP_UGT: // X >u 1 -> false
2943 case CmpInst::ICMP_SLT: // X <s -1 -> false
2944 return getFalse(ITy);
2945
2946 case CmpInst::ICMP_ULE: // X <=u 1 -> true
2947 case CmpInst::ICMP_SGE: // X >=s -1 -> true
2948 return getTrue(ITy);
2949
2950 default:
2951 break;
2952 }
2953 }
2954
2955 switch (Pred) {
2956 default:
2957 break;
2958 case ICmpInst::ICMP_UGE:
2959 if (isImpliedCondition(RHS, LHS, Q.DL).value_or(false))
2960 return getTrue(ITy);
2961 break;
2962 case ICmpInst::ICMP_SGE:
2963 /// For signed comparison, the values for an i1 are 0 and -1
2964 /// respectively. This maps into a truth table of:
2965 /// LHS | RHS | LHS >=s RHS | LHS implies RHS
2966 /// 0 | 0 | 1 (0 >= 0) | 1
2967 /// 0 | 1 | 1 (0 >= -1) | 1
2968 /// 1 | 0 | 0 (-1 >= 0) | 0
2969 /// 1 | 1 | 1 (-1 >= -1) | 1
2970 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false))
2971 return getTrue(ITy);
2972 break;
2973 case ICmpInst::ICMP_ULE:
2974 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false))
2975 return getTrue(ITy);
2976 break;
2977 case ICmpInst::ICMP_SLE:
2978 /// SLE follows the same logic as SGE with the LHS and RHS swapped.
2979 if (isImpliedCondition(RHS, LHS, Q.DL).value_or(false))
2980 return getTrue(ITy);
2981 break;
2982 }
2983
2984 return nullptr;
2985}
2986
2987/// Check if RHS is zero or can be transformed to an equivalent zero comparison.
2988/// E.g., icmp sgt X, -1 --> icmp sge X, 0
2989static bool matchEquivZeroRHS(CmpPredicate &Pred, const Value *RHS) {
2990 // icmp [pred] X, 0 --> as-is
2991 if (match(RHS, m_Zero()))
2992 return true;
2993
2994 // Handle comparisons with -1 (all ones)
2995 if (match(RHS, m_AllOnes())) {
2996 switch (Pred) {
2997 case ICmpInst::ICMP_SGT:
2998 // icmp sgt X, -1 --> icmp sge X, 0
2999 Pred = ICmpInst::ICMP_SGE;
3000 return true;
3001 case ICmpInst::ICMP_SLE:
3002 // icmp sle X, -1 --> icmp slt X, 0
3003 Pred = ICmpInst::ICMP_SLT;
3004 return true;
3005 // Note: unsigned comparisons with -1 (UINT_MAX) are not handled here:
3006 // - icmp ugt X, -1 is always false (nothing > UINT_MAX)
3007 // - icmp ule X, -1 is always true (everything <= UINT_MAX)
3008 default:
3009 return false;
3010 }
3011 }
3012
3013 // Handle comparisons with 1
3014 if (match(RHS, m_One())) {
3015 switch (Pred) {
3016 case ICmpInst::ICMP_SGE:
3017 // icmp sge X, 1 --> icmp sgt X, 0
3018 Pred = ICmpInst::ICMP_SGT;
3019 return true;
3020 case ICmpInst::ICMP_UGE:
3021 // icmp uge X, 1 --> icmp ugt X, 0
3022 Pred = ICmpInst::ICMP_UGT;
3023 return true;
3024 case ICmpInst::ICMP_SLT:
3025 // icmp slt X, 1 --> icmp sle X, 0
3026 Pred = ICmpInst::ICMP_SLE;
3027 return true;
3028 case ICmpInst::ICMP_ULT:
3029 // icmp ult X, 1 --> icmp ule X, 0
3030 Pred = ICmpInst::ICMP_ULE;
3031 return true;
3032 default:
3033 return false;
3034 }
3035 }
3036
3037 return false;
3038}
3039
3040/// Try hard to fold icmp with zero RHS because this is a common case.
3041/// Note that, this function also handles the equivalent zero RHS, e.g.,
3042/// icmp sgt X, -1 --> icmp sge X, 0
3044 const SimplifyQuery &Q) {
3045 // Check if RHS is zero or can be transformed to an equivalent zero comparison
3046 if (!matchEquivZeroRHS(Pred, RHS))
3047 return nullptr;
3048
3049 Type *ITy = getCompareTy(LHS); // The return type.
3050 switch (Pred) {
3051 default:
3052 llvm_unreachable("Unknown ICmp predicate!");
3053 case ICmpInst::ICMP_ULT:
3054 return getFalse(ITy);
3055 case ICmpInst::ICMP_UGE:
3056 return getTrue(ITy);
3057 case ICmpInst::ICMP_EQ:
3058 case ICmpInst::ICMP_ULE:
3059 if (isKnownNonZero(LHS, Q))
3060 return getFalse(ITy);
3061 break;
3062 case ICmpInst::ICMP_NE:
3063 case ICmpInst::ICMP_UGT:
3064 if (isKnownNonZero(LHS, Q))
3065 return getTrue(ITy);
3066 break;
3067 case ICmpInst::ICMP_SLT: {
3068 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3069 if (LHSKnown.isNegative())
3070 return getTrue(ITy);
3071 if (LHSKnown.isNonNegative())
3072 return getFalse(ITy);
3073 break;
3074 }
3075 case ICmpInst::ICMP_SLE: {
3076 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3077 if (LHSKnown.isNegative())
3078 return getTrue(ITy);
3079 if (LHSKnown.isNonNegative() && isKnownNonZero(LHS, Q))
3080 return getFalse(ITy);
3081 break;
3082 }
3083 case ICmpInst::ICMP_SGE: {
3084 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3085 if (LHSKnown.isNegative())
3086 return getFalse(ITy);
3087 if (LHSKnown.isNonNegative())
3088 return getTrue(ITy);
3089 break;
3090 }
3091 case ICmpInst::ICMP_SGT: {
3092 KnownBits LHSKnown = computeKnownBits(LHS, Q);
3093 if (LHSKnown.isNegative())
3094 return getFalse(ITy);
3095 if (LHSKnown.isNonNegative() && isKnownNonZero(LHS, Q))
3096 return getTrue(ITy);
3097 break;
3098 }
3099 }
3100
3101 return nullptr;
3102}
3103
3105 Value *RHS, const SimplifyQuery &Q) {
3106 Type *ITy = getCompareTy(RHS); // The return type.
3107
3108 Value *X;
3109 const APInt *C;
3110 if (!match(RHS, m_APIntAllowPoison(C)))
3111 return nullptr;
3112
3113 // Sign-bit checks can be optimized to true/false after unsigned
3114 // floating-point casts:
3115 // icmp slt (bitcast (uitofp X)), 0 --> false
3116 // icmp sgt (bitcast (uitofp X)), -1 --> true
3118 bool TrueIfSigned;
3119 if (isSignBitCheck(Pred, *C, TrueIfSigned))
3120 return ConstantInt::getBool(ITy, !TrueIfSigned);
3121 }
3122
3123 // Rule out tautological comparisons (eg., ult 0 or uge 0).
3125 if (RHS_CR.isEmptySet())
3126 return ConstantInt::getFalse(ITy);
3127 if (RHS_CR.isFullSet())
3128 return ConstantInt::getTrue(ITy);
3129
3131 if (!LHS_CR.isFullSet()) {
3132 if (RHS_CR.contains(LHS_CR))
3133 return ConstantInt::getTrue(ITy);
3134 if (RHS_CR.inverse().contains(LHS_CR))
3135 return ConstantInt::getFalse(ITy);
3136 }
3137
3138 // (mul nuw/nsw X, MulC) != C --> true (if C is not a multiple of MulC)
3139 // (mul nuw/nsw X, MulC) == C --> false (if C is not a multiple of MulC)
3140 const APInt *MulC;
3141 if (Q.IIQ.UseInstrInfo && ICmpInst::isEquality(Pred) &&
3143 *MulC != 0 && C->urem(*MulC) != 0) ||
3145 *MulC != 0 && C->srem(*MulC) != 0)))
3146 return ConstantInt::get(ITy, Pred == ICmpInst::ICMP_NE);
3147
3148 if (Pred == ICmpInst::ICMP_UGE && C->isOne() && isKnownNonZero(LHS, Q))
3149 return ConstantInt::getTrue(ITy);
3150
3151 return nullptr;
3152}
3153
3155
3156/// Get values V_i such that V uge V_i (GreaterEq) or V ule V_i (LowerEq).
3159 const SimplifyQuery &Q,
3160 unsigned Depth = 0) {
3161 if (!Res.insert(V).second)
3162 return;
3163
3164 // Can be increased if useful.
3165 if (++Depth > 1)
3166 return;
3167
3168 auto *I = dyn_cast<Instruction>(V);
3169 if (!I)
3170 return;
3171
3172 Value *X, *Y;
3174 if (match(I, m_Or(m_Value(X), m_Value(Y))) ||
3178 }
3179 // X * Y >= X --> true
3180 if (match(I, m_NUWMul(m_Value(X), m_Value(Y)))) {
3181 if (isKnownNonZero(X, Q))
3183 if (isKnownNonZero(Y, Q))
3185 }
3186 } else {
3188 switch (I->getOpcode()) {
3189 case Instruction::And:
3190 getUnsignedMonotonicValues(Res, I->getOperand(0), Type, Q, Depth);
3191 getUnsignedMonotonicValues(Res, I->getOperand(1), Type, Q, Depth);
3192 break;
3193 case Instruction::URem:
3194 case Instruction::UDiv:
3195 case Instruction::LShr:
3196 getUnsignedMonotonicValues(Res, I->getOperand(0), Type, Q, Depth);
3197 break;
3198 case Instruction::Call:
3201 break;
3202 default:
3203 break;
3204 }
3205 }
3206}
3207
3209 Value *RHS,
3210 const SimplifyQuery &Q) {
3211 if (Pred != ICmpInst::ICMP_UGE && Pred != ICmpInst::ICMP_ULT)
3212 return nullptr;
3213
3214 // We have LHS uge GreaterValues and LowerValues uge RHS. If any of the
3215 // GreaterValues and LowerValues are the same, it follows that LHS uge RHS.
3216 SmallPtrSet<Value *, 4> GreaterValues;
3217 SmallPtrSet<Value *, 4> LowerValues;
3220 for (Value *GV : GreaterValues)
3221 if (LowerValues.contains(GV))
3223 Pred == ICmpInst::ICMP_UGE);
3224 return nullptr;
3225}
3226
3228 Value *RHS, const SimplifyQuery &Q,
3229 unsigned MaxRecurse) {
3230 Type *ITy = getCompareTy(RHS); // The return type.
3231
3232 Value *Y = nullptr;
3233 // icmp pred (or X, Y), X
3234 if (match(LBO, m_c_Or(m_Value(Y), m_Specific(RHS)))) {
3235 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
3236 KnownBits RHSKnown = computeKnownBits(RHS, Q);
3237 KnownBits YKnown = computeKnownBits(Y, Q);
3238 if (RHSKnown.isNonNegative() && YKnown.isNegative())
3239 return Pred == ICmpInst::ICMP_SLT ? getTrue(ITy) : getFalse(ITy);
3240 if (RHSKnown.isNegative() || YKnown.isNonNegative())
3241 return Pred == ICmpInst::ICMP_SLT ? getFalse(ITy) : getTrue(ITy);
3242 }
3243 }
3244
3245 // icmp pred (urem X, Y), Y
3246 if (match(LBO, m_URem(m_Value(), m_Specific(RHS)))) {
3247 switch (Pred) {
3248 default:
3249 break;
3250 case ICmpInst::ICMP_SGT:
3251 case ICmpInst::ICMP_SGE: {
3253 if (!Known.isNonNegative())
3254 break;
3255 [[fallthrough]];
3256 }
3257 case ICmpInst::ICMP_EQ:
3258 case ICmpInst::ICMP_UGT:
3259 case ICmpInst::ICMP_UGE:
3260 return getFalse(ITy);
3261 case ICmpInst::ICMP_SLT:
3262 case ICmpInst::ICMP_SLE: {
3264 if (!Known.isNonNegative())
3265 break;
3266 [[fallthrough]];
3267 }
3268 case ICmpInst::ICMP_NE:
3269 case ICmpInst::ICMP_ULT:
3270 case ICmpInst::ICMP_ULE:
3271 return getTrue(ITy);
3272 }
3273 }
3274
3275 // If x is nonzero:
3276 // x >>u C <u x --> true for C != 0.
3277 // x >>u C != x --> true for C != 0.
3278 // x >>u C >=u x --> false for C != 0.
3279 // x >>u C == x --> false for C != 0.
3280 // x udiv C <u x --> true for C != 1.
3281 // x udiv C != x --> true for C != 1.
3282 // x udiv C >=u x --> false for C != 1.
3283 // x udiv C == x --> false for C != 1.
3284 // TODO: allow non-constant shift amount/divisor
3285 const APInt *C;
3286 if ((match(LBO, m_LShr(m_Specific(RHS), m_APInt(C))) && *C != 0) ||
3287 (match(LBO, m_UDiv(m_Specific(RHS), m_APInt(C))) && *C != 1)) {
3288 if (isKnownNonZero(RHS, Q)) {
3289 switch (Pred) {
3290 default:
3291 break;
3292 case ICmpInst::ICMP_EQ:
3293 case ICmpInst::ICMP_UGE:
3294 case ICmpInst::ICMP_UGT:
3295 return getFalse(ITy);
3296 case ICmpInst::ICMP_NE:
3297 case ICmpInst::ICMP_ULT:
3298 case ICmpInst::ICMP_ULE:
3299 return getTrue(ITy);
3300 }
3301 }
3302 }
3303
3304 // (x*C1)/C2 <= x for C1 <= C2.
3305 // This holds even if the multiplication overflows: Assume that x != 0 and
3306 // arithmetic is modulo M. For overflow to occur we must have C1 >= M/x and
3307 // thus C2 >= M/x. It follows that (x*C1)/C2 <= (M-1)/C2 <= ((M-1)*x)/M < x.
3308 //
3309 // Additionally, either the multiplication and division might be represented
3310 // as shifts:
3311 // (x*C1)>>C2 <= x for C1 < 2**C2.
3312 // (x<<C1)/C2 <= x for 2**C1 < C2.
3313 const APInt *C1, *C2;
3314 if ((match(LBO, m_UDiv(m_Mul(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3315 C1->ule(*C2)) ||
3316 (match(LBO, m_LShr(m_Mul(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3317 C1->ule(APInt(C2->getBitWidth(), 1) << *C2)) ||
3318 (match(LBO, m_UDiv(m_Shl(m_Specific(RHS), m_APInt(C1)), m_APInt(C2))) &&
3319 (APInt(C1->getBitWidth(), 1) << *C1).ule(*C2))) {
3320 if (Pred == ICmpInst::ICMP_UGT)
3321 return getFalse(ITy);
3322 if (Pred == ICmpInst::ICMP_ULE)
3323 return getTrue(ITy);
3324 }
3325
3326 // (sub C, X) == X, C is odd --> false
3327 // (sub C, X) != X, C is odd --> true
3328 if (match(LBO, m_Sub(m_APIntAllowPoison(C), m_Specific(RHS))) &&
3329 (*C & 1) == 1 && ICmpInst::isEquality(Pred))
3330 return (Pred == ICmpInst::ICMP_EQ) ? getFalse(ITy) : getTrue(ITy);
3331
3332 return nullptr;
3333}
3334
3335// If only one of the icmp's operands has NSW flags, try to prove that:
3336//
3337// icmp slt/sgt/sle/sge (x + C1), (x +nsw C2)
3338//
3339// is equivalent to:
3340//
3341// icmp slt/sgt/sle/sge C1, C2
3342//
3343// which is true if x + C2 has the NSW flags set and:
3344// *) C1 <= C2 && C1 >= 0, or
3345// *) C2 <= C1 && C1 <= 0.
3346//
3348 const InstrInfoQuery &IIQ) {
3349 // TODO: support other predicates.
3350 if (!ICmpInst::isSigned(Pred) || !IIQ.UseInstrInfo)
3351 return false;
3352
3353 // Canonicalize nsw add as RHS.
3354 if (!match(RHS, m_NSWAdd(m_Value(), m_Value())))
3355 std::swap(LHS, RHS);
3356 if (!match(RHS, m_NSWAdd(m_Value(), m_Value())))
3357 return false;
3358
3359 Value *X;
3360 const APInt *C1, *C2;
3361 if (!match(LHS, m_Add(m_Value(X), m_APInt(C1))) ||
3362 !match(RHS, m_Add(m_Specific(X), m_APInt(C2))))
3363 return false;
3364
3365 return (C1->sle(*C2) && C1->isNonNegative()) ||
3366 (C2->sle(*C1) && C1->isNonPositive());
3367}
3368
3369/// TODO: A large part of this logic is duplicated in InstCombine's
3370/// foldICmpBinOp(). We should be able to share that and avoid the code
3371/// duplication.
3373 const SimplifyQuery &Q,
3374 unsigned MaxRecurse) {
3377 if (MaxRecurse && (LBO || RBO)) {
3378 // Analyze the case when either LHS or RHS is an add instruction.
3379 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
3380 // LHS = A + B (or A and B are null); RHS = C + D (or C and D are null).
3381 bool NoLHSWrapProblem = false, NoRHSWrapProblem = false;
3382 if (LBO && LBO->getOpcode() == Instruction::Add) {
3383 A = LBO->getOperand(0);
3384 B = LBO->getOperand(1);
3385 NoLHSWrapProblem =
3386 ICmpInst::isEquality(Pred) ||
3387 (CmpInst::isUnsigned(Pred) &&
3389 (CmpInst::isSigned(Pred) &&
3391 }
3392 if (RBO && RBO->getOpcode() == Instruction::Add) {
3393 C = RBO->getOperand(0);
3394 D = RBO->getOperand(1);
3395 NoRHSWrapProblem =
3396 ICmpInst::isEquality(Pred) ||
3397 (CmpInst::isUnsigned(Pred) &&
3399 (CmpInst::isSigned(Pred) &&
3401 }
3402
3403 // icmp (X+Y), X -> icmp Y, 0 for equalities or if there is no overflow.
3404 if ((A == RHS || B == RHS) && NoLHSWrapProblem)
3405 if (Value *V = simplifyICmpInst(Pred, A == RHS ? B : A,
3406 Constant::getNullValue(RHS->getType()), Q,
3407 MaxRecurse - 1))
3408 return V;
3409
3410 // icmp X, (X+Y) -> icmp 0, Y for equalities or if there is no overflow.
3411 if ((C == LHS || D == LHS) && NoRHSWrapProblem)
3412 if (Value *V =
3414 C == LHS ? D : C, Q, MaxRecurse - 1))
3415 return V;
3416
3417 // icmp (X+Y), (X+Z) -> icmp Y,Z for equalities or if there is no overflow.
3418 bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
3420 if (A && C && (A == C || A == D || B == C || B == D) && CanSimplify) {
3421 // Determine Y and Z in the form icmp (X+Y), (X+Z).
3422 Value *Y, *Z;
3423 if (A == C) {
3424 // C + B == C + D -> B == D
3425 Y = B;
3426 Z = D;
3427 } else if (A == D) {
3428 // D + B == C + D -> B == C
3429 Y = B;
3430 Z = C;
3431 } else if (B == C) {
3432 // A + C == C + D -> A == D
3433 Y = A;
3434 Z = D;
3435 } else {
3436 assert(B == D);
3437 // A + D == C + D -> A == C
3438 Y = A;
3439 Z = C;
3440 }
3441 if (Value *V = simplifyICmpInst(Pred, Y, Z, Q, MaxRecurse - 1))
3442 return V;
3443 }
3444 }
3445
3446 if (LBO)
3447 if (Value *V = simplifyICmpWithBinOpOnLHS(Pred, LBO, RHS, Q, MaxRecurse))
3448 return V;
3449
3450 if (RBO)
3452 ICmpInst::getSwappedPredicate(Pred), RBO, LHS, Q, MaxRecurse))
3453 return V;
3454
3455 // 0 - (zext X) pred C
3456 if (!CmpInst::isUnsigned(Pred) && match(LHS, m_Neg(m_ZExt(m_Value())))) {
3457 const APInt *C;
3458 if (match(RHS, m_APInt(C))) {
3459 if (C->isStrictlyPositive()) {
3460 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_NE)
3462 if (Pred == ICmpInst::ICMP_SGE || Pred == ICmpInst::ICMP_EQ)
3464 }
3465 if (C->isNonNegative()) {
3466 if (Pred == ICmpInst::ICMP_SLE)
3468 if (Pred == ICmpInst::ICMP_SGT)
3470 }
3471 }
3472 }
3473
3474 // If C2 is a power-of-2 and C is not:
3475 // (C2 << X) == C --> false
3476 // (C2 << X) != C --> true
3477 const APInt *C;
3478 if (match(LHS, m_Shl(m_Power2(), m_Value())) &&
3479 match(RHS, m_APIntAllowPoison(C)) && !C->isPowerOf2()) {
3480 // C2 << X can equal zero in some circumstances.
3481 // This simplification might be unsafe if C is zero.
3482 //
3483 // We know it is safe if:
3484 // - The shift is nsw. We can't shift out the one bit.
3485 // - The shift is nuw. We can't shift out the one bit.
3486 // - C2 is one.
3487 // - C isn't zero.
3490 match(LHS, m_Shl(m_One(), m_Value())) || !C->isZero()) {
3491 if (Pred == ICmpInst::ICMP_EQ)
3493 if (Pred == ICmpInst::ICMP_NE)
3495 }
3496 }
3497
3498 // If C is a power-of-2:
3499 // (C << X) >u 0x8000 --> false
3500 // (C << X) <=u 0x8000 --> true
3501 if (match(LHS, m_Shl(m_Power2(), m_Value())) && match(RHS, m_SignMask())) {
3502 if (Pred == ICmpInst::ICMP_UGT)
3504 if (Pred == ICmpInst::ICMP_ULE)
3506 }
3507
3508 if (!MaxRecurse || !LBO || !RBO || LBO->getOpcode() != RBO->getOpcode())
3509 return nullptr;
3510
3511 if (LBO->getOperand(0) == RBO->getOperand(0)) {
3512 switch (LBO->getOpcode()) {
3513 default:
3514 break;
3515 case Instruction::Shl: {
3516 bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO);
3517 bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO);
3518 if (!NUW || (ICmpInst::isSigned(Pred) && !NSW) ||
3519 !isKnownNonZero(LBO->getOperand(0), Q))
3520 break;
3521 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(1),
3522 RBO->getOperand(1), Q, MaxRecurse - 1))
3523 return V;
3524 break;
3525 }
3526 // If C1 & C2 == C1, A = X and/or C1, B = X and/or C2:
3527 // icmp ule A, B -> true
3528 // icmp ugt A, B -> false
3529 // icmp sle A, B -> true (C1 and C2 are the same sign)
3530 // icmp sgt A, B -> false (C1 and C2 are the same sign)
3531 case Instruction::And:
3532 case Instruction::Or: {
3533 const APInt *C1, *C2;
3534 if (ICmpInst::isRelational(Pred) &&
3535 match(LBO->getOperand(1), m_APInt(C1)) &&
3536 match(RBO->getOperand(1), m_APInt(C2))) {
3537 if (!C1->isSubsetOf(*C2)) {
3538 std::swap(C1, C2);
3539 Pred = ICmpInst::getSwappedPredicate(Pred);
3540 }
3541 if (C1->isSubsetOf(*C2)) {
3542 if (Pred == ICmpInst::ICMP_ULE)
3544 if (Pred == ICmpInst::ICMP_UGT)
3546 if (C1->isNonNegative() == C2->isNonNegative()) {
3547 if (Pred == ICmpInst::ICMP_SLE)
3549 if (Pred == ICmpInst::ICMP_SGT)
3551 }
3552 }
3553 }
3554 break;
3555 }
3556 }
3557 }
3558
3559 if (LBO->getOperand(1) == RBO->getOperand(1)) {
3560 switch (LBO->getOpcode()) {
3561 default:
3562 break;
3563 case Instruction::UDiv:
3564 case Instruction::LShr:
3565 if (ICmpInst::isSigned(Pred) || !Q.IIQ.isExact(LBO) ||
3566 !Q.IIQ.isExact(RBO))
3567 break;
3568 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3569 RBO->getOperand(0), Q, MaxRecurse - 1))
3570 return V;
3571 break;
3572 case Instruction::SDiv:
3573 if (!ICmpInst::isEquality(Pred) || !Q.IIQ.isExact(LBO) ||
3574 !Q.IIQ.isExact(RBO))
3575 break;
3576 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3577 RBO->getOperand(0), Q, MaxRecurse - 1))
3578 return V;
3579 break;
3580 case Instruction::AShr:
3581 if (!Q.IIQ.isExact(LBO) || !Q.IIQ.isExact(RBO))
3582 break;
3583 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3584 RBO->getOperand(0), Q, MaxRecurse - 1))
3585 return V;
3586 break;
3587 case Instruction::Shl: {
3588 bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO);
3589 bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO);
3590 if (!NUW && !NSW)
3591 break;
3592 if (!NSW && ICmpInst::isSigned(Pred))
3593 break;
3594 if (Value *V = simplifyICmpInst(Pred, LBO->getOperand(0),
3595 RBO->getOperand(0), Q, MaxRecurse - 1))
3596 return V;
3597 break;
3598 }
3599 }
3600 }
3601 return nullptr;
3602}
3603
3604/// simplify integer comparisons where at least one operand of the compare
3605/// matches an integer min/max idiom.
3607 const SimplifyQuery &Q,
3608 unsigned MaxRecurse) {
3609 Type *ITy = getCompareTy(LHS); // The return type.
3610 Value *A, *B;
3612 CmpInst::Predicate EqP; // Chosen so that "A == max/min(A,B)" iff "A EqP B".
3613
3614 // Signed variants on "max(a,b)>=a -> true".
3615 if (match(LHS, m_SMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
3616 if (A != RHS)
3617 std::swap(A, B); // smax(A, B) pred A.
3618 EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
3619 // We analyze this as smax(A, B) pred A.
3620 P = Pred;
3621 } else if (match(RHS, m_SMax(m_Value(A), m_Value(B))) &&
3622 (A == LHS || B == LHS)) {
3623 if (A != LHS)
3624 std::swap(A, B); // A pred smax(A, B).
3625 EqP = CmpInst::ICMP_SGE; // "A == smax(A, B)" iff "A sge B".
3626 // We analyze this as smax(A, B) swapped-pred A.
3628 } else if (match(LHS, m_SMin(m_Value(A), m_Value(B))) &&
3629 (A == RHS || B == RHS)) {
3630 if (A != RHS)
3631 std::swap(A, B); // smin(A, B) pred A.
3632 EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
3633 // We analyze this as smax(-A, -B) swapped-pred -A.
3634 // Note that we do not need to actually form -A or -B thanks to EqP.
3636 } else if (match(RHS, m_SMin(m_Value(A), m_Value(B))) &&
3637 (A == LHS || B == LHS)) {
3638 if (A != LHS)
3639 std::swap(A, B); // A pred smin(A, B).
3640 EqP = CmpInst::ICMP_SLE; // "A == smin(A, B)" iff "A sle B".
3641 // We analyze this as smax(-A, -B) pred -A.
3642 // Note that we do not need to actually form -A or -B thanks to EqP.
3643 P = Pred;
3644 }
3646 // Cases correspond to "max(A, B) p A".
3647 switch (P) {
3648 default:
3649 break;
3650 case CmpInst::ICMP_EQ:
3651 case CmpInst::ICMP_SLE:
3652 // Equivalent to "A EqP B". This may be the same as the condition tested
3653 // in the max/min; if so, we can just return that.
3654 if (Value *V = extractEquivalentCondition(LHS, EqP, A, B))
3655 return V;
3656 if (Value *V = extractEquivalentCondition(RHS, EqP, A, B))
3657 return V;
3658 // Otherwise, see if "A EqP B" simplifies.
3659 if (MaxRecurse)
3660 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1))
3661 return V;
3662 break;
3663 case CmpInst::ICMP_NE:
3664 case CmpInst::ICMP_SGT: {
3666 // Equivalent to "A InvEqP B". This may be the same as the condition
3667 // tested in the max/min; if so, we can just return that.
3668 if (Value *V = extractEquivalentCondition(LHS, InvEqP, A, B))
3669 return V;
3670 if (Value *V = extractEquivalentCondition(RHS, InvEqP, A, B))
3671 return V;
3672 // Otherwise, see if "A InvEqP B" simplifies.
3673 if (MaxRecurse)
3674 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1))
3675 return V;
3676 break;
3677 }
3678 case CmpInst::ICMP_SGE:
3679 // Always true.
3680 return getTrue(ITy);
3681 case CmpInst::ICMP_SLT:
3682 // Always false.
3683 return getFalse(ITy);
3684 }
3685 }
3686
3687 // Unsigned variants on "max(a,b)>=a -> true".
3689 if (match(LHS, m_UMax(m_Value(A), m_Value(B))) && (A == RHS || B == RHS)) {
3690 if (A != RHS)
3691 std::swap(A, B); // umax(A, B) pred A.
3692 EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
3693 // We analyze this as umax(A, B) pred A.
3694 P = Pred;
3695 } else if (match(RHS, m_UMax(m_Value(A), m_Value(B))) &&
3696 (A == LHS || B == LHS)) {
3697 if (A != LHS)
3698 std::swap(A, B); // A pred umax(A, B).
3699 EqP = CmpInst::ICMP_UGE; // "A == umax(A, B)" iff "A uge B".
3700 // We analyze this as umax(A, B) swapped-pred A.
3702 } else if (match(LHS, m_UMin(m_Value(A), m_Value(B))) &&
3703 (A == RHS || B == RHS)) {
3704 if (A != RHS)
3705 std::swap(A, B); // umin(A, B) pred A.
3706 EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
3707 // We analyze this as umax(-A, -B) swapped-pred -A.
3708 // Note that we do not need to actually form -A or -B thanks to EqP.
3710 } else if (match(RHS, m_UMin(m_Value(A), m_Value(B))) &&
3711 (A == LHS || B == LHS)) {
3712 if (A != LHS)
3713 std::swap(A, B); // A pred umin(A, B).
3714 EqP = CmpInst::ICMP_ULE; // "A == umin(A, B)" iff "A ule B".
3715 // We analyze this as umax(-A, -B) pred -A.
3716 // Note that we do not need to actually form -A or -B thanks to EqP.
3717 P = Pred;
3718 }
3720 // Cases correspond to "max(A, B) p A".
3721 switch (P) {
3722 default:
3723 break;
3724 case CmpInst::ICMP_EQ:
3725 case CmpInst::ICMP_ULE:
3726 // Equivalent to "A EqP B". This may be the same as the condition tested
3727 // in the max/min; if so, we can just return that.
3728 if (Value *V = extractEquivalentCondition(LHS, EqP, A, B))
3729 return V;
3730 if (Value *V = extractEquivalentCondition(RHS, EqP, A, B))
3731 return V;
3732 // Otherwise, see if "A EqP B" simplifies.
3733 if (MaxRecurse)
3734 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1))
3735 return V;
3736 break;
3737 case CmpInst::ICMP_NE:
3738 case CmpInst::ICMP_UGT: {
3740 // Equivalent to "A InvEqP B". This may be the same as the condition
3741 // tested in the max/min; if so, we can just return that.
3742 if (Value *V = extractEquivalentCondition(LHS, InvEqP, A, B))
3743 return V;
3744 if (Value *V = extractEquivalentCondition(RHS, InvEqP, A, B))
3745 return V;
3746 // Otherwise, see if "A InvEqP B" simplifies.
3747 if (MaxRecurse)
3748 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1))
3749 return V;
3750 break;
3751 }
3752 case CmpInst::ICMP_UGE:
3753 return getTrue(ITy);
3754 case CmpInst::ICMP_ULT:
3755 return getFalse(ITy);
3756 }
3757 }
3758
3759 // Comparing 1 each of min/max with a common operand?
3760 // Canonicalize min operand to RHS.
3761 if (match(LHS, m_UMin(m_Value(), m_Value())) ||
3762 match(LHS, m_SMin(m_Value(), m_Value()))) {
3763 std::swap(LHS, RHS);
3764 Pred = ICmpInst::getSwappedPredicate(Pred);
3765 }
3766
3767 Value *C, *D;
3768 if (match(LHS, m_SMax(m_Value(A), m_Value(B))) &&
3769 match(RHS, m_SMin(m_Value(C), m_Value(D))) &&
3770 (A == C || A == D || B == C || B == D)) {
3771 // smax(A, B) >=s smin(A, D) --> true
3772 if (Pred == CmpInst::ICMP_SGE)
3773 return getTrue(ITy);
3774 // smax(A, B) <s smin(A, D) --> false
3775 if (Pred == CmpInst::ICMP_SLT)
3776 return getFalse(ITy);
3777 } else if (match(LHS, m_UMax(m_Value(A), m_Value(B))) &&
3778 match(RHS, m_UMin(m_Value(C), m_Value(D))) &&
3779 (A == C || A == D || B == C || B == D)) {
3780 // umax(A, B) >=u umin(A, D) --> true
3781 if (Pred == CmpInst::ICMP_UGE)
3782 return getTrue(ITy);
3783 // umax(A, B) <u umin(A, D) --> false
3784 if (Pred == CmpInst::ICMP_ULT)
3785 return getFalse(ITy);
3786 }
3787
3788 return nullptr;
3789}
3790
3792 Value *LHS, Value *RHS,
3793 const SimplifyQuery &Q) {
3794 // Gracefully handle instructions that have not been inserted yet.
3795 if (!Q.AC || !Q.CxtI)
3796 return nullptr;
3797
3798 for (Value *AssumeBaseOp : {LHS, RHS}) {
3799 for (auto &AssumeVH : Q.AC->assumptionsFor(AssumeBaseOp)) {
3800 if (!AssumeVH)
3801 continue;
3802
3803 CallInst *Assume = cast<CallInst>(AssumeVH);
3804 if (std::optional<bool> Imp = isImpliedCondition(
3805 Assume->getArgOperand(0), Predicate, LHS, RHS, Q.DL))
3806 if (isValidAssumeForContext(Assume, Q))
3807 return ConstantInt::get(getCompareTy(LHS), *Imp);
3808 }
3809 }
3810
3811 return nullptr;
3812}
3813
3815 Value *RHS) {
3817 if (!II)
3818 return nullptr;
3819
3820 switch (II->getIntrinsicID()) {
3821 case Intrinsic::uadd_sat:
3822 // uadd.sat(X, Y) uge X + Y
3823 if (match(RHS, m_c_Add(m_Specific(II->getArgOperand(0)),
3824 m_Specific(II->getArgOperand(1))))) {
3825 if (Pred == ICmpInst::ICMP_UGE)
3827 if (Pred == ICmpInst::ICMP_ULT)
3829 }
3830 return nullptr;
3831 case Intrinsic::usub_sat:
3832 // usub.sat(X, Y) ule X - Y
3833 if (match(RHS, m_Sub(m_Specific(II->getArgOperand(0)),
3834 m_Specific(II->getArgOperand(1))))) {
3835 if (Pred == ICmpInst::ICMP_ULE)
3837 if (Pred == ICmpInst::ICMP_UGT)
3839 }
3840 return nullptr;
3841 default:
3842 return nullptr;
3843 }
3844}
3845
3846/// Helper method to get range from metadata or attribute.
3847static std::optional<ConstantRange> getRange(Value *V,
3848 const InstrInfoQuery &IIQ) {
3850 if (MDNode *MD = IIQ.getMetadata(I, LLVMContext::MD_range))
3851 return getConstantRangeFromMetadata(*MD);
3852
3853 if (const Argument *A = dyn_cast<Argument>(V))
3854 return A->getRange();
3855 else if (const CallBase *CB = dyn_cast<CallBase>(V))
3856 return CB->getRange();
3857
3858 return std::nullopt;
3859}
3860
3861/// Given operands for an ICmpInst, see if we can fold the result.
3862/// If not, this returns null.
3864 const SimplifyQuery &Q, unsigned MaxRecurse) {
3865 assert(CmpInst::isIntPredicate(Pred) && "Not an integer compare!");
3866
3867 if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
3868 if (Constant *CRHS = dyn_cast<Constant>(RHS))
3869 return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL, Q.TLI);
3870
3871 // If we have a constant, make sure it is on the RHS.
3872 std::swap(LHS, RHS);
3873 Pred = CmpInst::getSwappedPredicate(Pred);
3874 }
3875 assert(!isa<UndefValue>(LHS) && "Unexpected icmp undef,%X");
3876
3877 Type *ITy = getCompareTy(LHS); // The return type.
3878
3879 // icmp poison, X -> poison
3880 if (isa<PoisonValue>(RHS))
3881 return PoisonValue::get(ITy);
3882
3883 // For EQ and NE, we can always pick a value for the undef to make the
3884 // predicate pass or fail, so we can return undef.
3885 // Matches behavior in llvm::ConstantFoldCompareInstruction.
3886 if (Q.isUndefValue(RHS) && ICmpInst::isEquality(Pred))
3887 return UndefValue::get(ITy);
3888
3889 // icmp X, X -> true/false
3890 // icmp X, undef -> true/false because undef could be X.
3891 if (LHS == RHS || Q.isUndefValue(RHS))
3892 return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred));
3893
3894 if (Value *V = simplifyICmpOfBools(Pred, LHS, RHS, Q))
3895 return V;
3896
3897 // TODO: Sink/common this with other potentially expensive calls that use
3898 // ValueTracking? See comment below for isKnownNonEqual().
3899 if (Value *V = simplifyICmpWithZero(Pred, LHS, RHS, Q))
3900 return V;
3901
3902 if (Value *V = simplifyICmpWithConstant(Pred, LHS, RHS, Q))
3903 return V;
3904
3905 // If both operands have range metadata, use the metadata
3906 // to simplify the comparison.
3907 if (std::optional<ConstantRange> RhsCr = getRange(RHS, Q.IIQ))
3908 if (std::optional<ConstantRange> LhsCr = getRange(LHS, Q.IIQ)) {
3909 if (LhsCr->icmp(Pred, *RhsCr))
3910 return ConstantInt::getTrue(ITy);
3911
3912 if (LhsCr->icmp(CmpInst::getInversePredicate(Pred), *RhsCr))
3913 return ConstantInt::getFalse(ITy);
3914 }
3915
3916 // Compare of cast, for example (zext X) != 0 -> X != 0
3919 Value *SrcOp = LI->getOperand(0);
3920 Type *SrcTy = SrcOp->getType();
3921 Type *DstTy = LI->getType();
3922
3923 // Turn icmp (ptrtoint/ptrtoaddr x), (ptrtoint/ptrtoaddr/constant) into a
3924 // compare of the input if the integer type is the same size as the
3925 // pointer address type (icmp only compares the address of the pointer).
3926 if (MaxRecurse && (isa<PtrToIntInst, PtrToAddrInst>(LI)) &&
3927 Q.DL.getAddressType(SrcTy) == DstTy) {
3928 if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
3929 // Transfer the cast to the constant.
3930 if (Value *V = simplifyICmpInst(Pred, SrcOp,
3931 ConstantExpr::getIntToPtr(RHSC, SrcTy),
3932 Q, MaxRecurse - 1))
3933 return V;
3935 auto *RI = cast<CastInst>(RHS);
3936 if (RI->getOperand(0)->getType() == SrcTy)
3937 // Compare without the cast.
3938 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q,
3939 MaxRecurse - 1))
3940 return V;
3941 }
3942 }
3943
3944 if (isa<ZExtInst>(LHS)) {
3945 // Turn icmp (zext X), (zext Y) into a compare of X and Y if they have the
3946 // same type.
3947 if (ZExtInst *RI = dyn_cast<ZExtInst>(RHS)) {
3948 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
3949 // Compare X and Y. Note that signed predicates become unsigned.
3950 if (Value *V =
3952 RI->getOperand(0), Q, MaxRecurse - 1))
3953 return V;
3954 }
3955 // Fold (zext X) ule (sext X), (zext X) sge (sext X) to true.
3956 else if (SExtInst *RI = dyn_cast<SExtInst>(RHS)) {
3957 if (SrcOp == RI->getOperand(0)) {
3958 if (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_SGE)
3959 return ConstantInt::getTrue(ITy);
3960 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_SLT)
3961 return ConstantInt::getFalse(ITy);
3962 }
3963 }
3964 // Turn icmp (zext X), Cst into a compare of X and Cst if Cst is extended
3965 // too. If not, then try to deduce the result of the comparison.
3966 else if (match(RHS, m_ImmConstant())) {
3968 assert(C != nullptr);
3969
3970 // Compute the constant that would happen if we truncated to SrcTy then
3971 // reextended to DstTy.
3972 Constant *Trunc =
3973 ConstantFoldCastOperand(Instruction::Trunc, C, SrcTy, Q.DL);
3974 assert(Trunc && "Constant-fold of ImmConstant should not fail");
3975 Constant *RExt =
3976 ConstantFoldCastOperand(CastInst::ZExt, Trunc, DstTy, Q.DL);
3977 assert(RExt && "Constant-fold of ImmConstant should not fail");
3978 Constant *AnyEq =
3980 assert(AnyEq && "Constant-fold of ImmConstant should not fail");
3981
3982 // If the re-extended constant didn't change any of the elements then
3983 // this is effectively also a case of comparing two zero-extended
3984 // values.
3985 if (AnyEq->isAllOnesValue() && MaxRecurse)
3987 SrcOp, Trunc, Q, MaxRecurse - 1))
3988 return V;
3989
3990 // Otherwise the upper bits of LHS are zero while RHS has a non-zero bit
3991 // there. Use this to work out the result of the comparison.
3992 if (AnyEq->isNullValue()) {
3993 switch (Pred) {
3994 default:
3995 llvm_unreachable("Unknown ICmp predicate!");
3996 // LHS <u RHS.
3997 case ICmpInst::ICMP_EQ:
3998 case ICmpInst::ICMP_UGT:
3999 case ICmpInst::ICMP_UGE:
4000 return Constant::getNullValue(ITy);
4001
4002 case ICmpInst::ICMP_NE:
4003 case ICmpInst::ICMP_ULT:
4004 case ICmpInst::ICMP_ULE:
4005 return Constant::getAllOnesValue(ITy);
4006
4007 // LHS is non-negative. If RHS is negative then LHS >s LHS. If RHS
4008 // is non-negative then LHS <s RHS.
4009 case ICmpInst::ICMP_SGT:
4010 case ICmpInst::ICMP_SGE:
4013 Q.DL);
4014 case ICmpInst::ICMP_SLT:
4015 case ICmpInst::ICMP_SLE:
4018 Q.DL);
4019 }
4020 }
4021 }
4022 }
4023
4024 if (isa<SExtInst>(LHS)) {
4025 // Turn icmp (sext X), (sext Y) into a compare of X and Y if they have the
4026 // same type.
4027 if (SExtInst *RI = dyn_cast<SExtInst>(RHS)) {
4028 if (MaxRecurse && SrcTy == RI->getOperand(0)->getType())
4029 // Compare X and Y. Note that the predicate does not change.
4030 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q,
4031 MaxRecurse - 1))
4032 return V;
4033 }
4034 // Fold (sext X) uge (zext X), (sext X) sle (zext X) to true.
4035 else if (ZExtInst *RI = dyn_cast<ZExtInst>(RHS)) {
4036 if (SrcOp == RI->getOperand(0)) {
4037 if (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_SLE)
4038 return ConstantInt::getTrue(ITy);
4039 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_SGT)
4040 return ConstantInt::getFalse(ITy);
4041 }
4042 }
4043 // Turn icmp (sext X), Cst into a compare of X and Cst if Cst is extended
4044 // too. If not, then try to deduce the result of the comparison.
4045 else if (match(RHS, m_ImmConstant())) {
4047
4048 // Compute the constant that would happen if we truncated to SrcTy then
4049 // reextended to DstTy.
4050 Constant *Trunc =
4051 ConstantFoldCastOperand(Instruction::Trunc, C, SrcTy, Q.DL);
4052 assert(Trunc && "Constant-fold of ImmConstant should not fail");
4053 Constant *RExt =
4054 ConstantFoldCastOperand(CastInst::SExt, Trunc, DstTy, Q.DL);
4055 assert(RExt && "Constant-fold of ImmConstant should not fail");
4056 Constant *AnyEq =
4058 assert(AnyEq && "Constant-fold of ImmConstant should not fail");
4059
4060 // If the re-extended constant didn't change then this is effectively
4061 // also a case of comparing two sign-extended values.
4062 if (AnyEq->isAllOnesValue() && MaxRecurse)
4063 if (Value *V =
4064 simplifyICmpInst(Pred, SrcOp, Trunc, Q, MaxRecurse - 1))
4065 return V;
4066
4067 // Otherwise the upper bits of LHS are all equal, while RHS has varying
4068 // bits there. Use this to work out the result of the comparison.
4069 if (AnyEq->isNullValue()) {
4070 switch (Pred) {
4071 default:
4072 llvm_unreachable("Unknown ICmp predicate!");
4073 case ICmpInst::ICMP_EQ:
4074 return Constant::getNullValue(ITy);
4075 case ICmpInst::ICMP_NE:
4076 return Constant::getAllOnesValue(ITy);
4077
4078 // If RHS is non-negative then LHS <s RHS. If RHS is negative then
4079 // LHS >s RHS.
4080 case ICmpInst::ICMP_SGT:
4081 case ICmpInst::ICMP_SGE:
4084 Q.DL);
4085 case ICmpInst::ICMP_SLT:
4086 case ICmpInst::ICMP_SLE:
4089 Q.DL);
4090
4091 // If LHS is non-negative then LHS <u RHS. If LHS is negative then
4092 // LHS >u RHS.
4093 case ICmpInst::ICMP_UGT:
4094 case ICmpInst::ICMP_UGE:
4095 // Comparison is true iff the LHS <s 0.
4096 if (MaxRecurse)
4098 Constant::getNullValue(SrcTy), Q,
4099 MaxRecurse - 1))
4100 return V;
4101 break;
4102 case ICmpInst::ICMP_ULT:
4103 case ICmpInst::ICMP_ULE:
4104 // Comparison is true iff the LHS >=s 0.
4105 if (MaxRecurse)
4107 Constant::getNullValue(SrcTy), Q,
4108 MaxRecurse - 1))
4109 return V;
4110 break;
4111 }
4112 }
4113 }
4114 }
4115 }
4116
4117 // icmp eq|ne X, Y -> false|true if X != Y
4118 // This is potentially expensive, and we have already computedKnownBits for
4119 // compares with 0 above here, so only try this for a non-zero compare.
4120 if (ICmpInst::isEquality(Pred) && !match(RHS, m_Zero()) &&
4121 isKnownNonEqual(LHS, RHS, Q)) {
4122 return Pred == ICmpInst::ICMP_NE ? getTrue(ITy) : getFalse(ITy);
4123 }
4124
4125 if (Value *V = simplifyICmpWithBinOp(Pred, LHS, RHS, Q, MaxRecurse))
4126 return V;
4127
4128 if (Value *V = simplifyICmpWithMinMax(Pred, LHS, RHS, Q, MaxRecurse))
4129 return V;
4130
4132 return V;
4135 return V;
4136
4137 if (Value *V = simplifyICmpUsingMonotonicValues(Pred, LHS, RHS, Q))
4138 return V;
4141 return V;
4142
4143 if (Value *V = simplifyICmpWithDominatingAssume(Pred, LHS, RHS, Q))
4144 return V;
4145
4146 if (std::optional<bool> Res =
4147 isImpliedByDomCondition(Pred, LHS, RHS, Q.CxtI, Q.DL))
4148 return ConstantInt::getBool(ITy, *Res);
4149
4150 // Simplify comparisons of related pointers using a powerful, recursive
4151 // GEP-walk when we have target data available..
4152 if (LHS->getType()->isPointerTy())
4153 if (auto *C = computePointerICmp(Pred, LHS, RHS, Q))
4154 return C;
4155
4156 // If the comparison is with the result of a select instruction, check whether
4157 // comparing with either branch of the select always yields the same value.
4159 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
4160 return V;
4161
4162 // If the comparison is with the result of a phi instruction, check whether
4163 // doing the compare with each incoming phi value yields a common result.
4165 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
4166 return V;
4167
4168 return nullptr;
4169}
4170
4172 const SimplifyQuery &Q) {
4173 return ::simplifyICmpInst(Predicate, LHS, RHS, Q, RecursionLimit);
4174}
4175
4176/// Given operands for an FCmpInst, see if we can fold the result.
4177/// If not, this returns null.
4179 FastMathFlags FMF, const SimplifyQuery &Q,
4180 unsigned MaxRecurse) {
4181 assert(CmpInst::isFPPredicate(Pred) && "Not an FP compare!");
4182
4183 if (Constant *CLHS = dyn_cast<Constant>(LHS)) {
4184 if (Constant *CRHS = dyn_cast<Constant>(RHS)) {
4185 // if the folding isn't successfull, fall back to the rest of the logic
4186 if (auto *Result = ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL,
4187 Q.TLI, Q.CxtI))
4188 return Result;
4189 } else {
4190 // If we have a constant, make sure it is on the RHS.
4191 std::swap(LHS, RHS);
4192 Pred = CmpInst::getSwappedPredicate(Pred);
4193 }
4194 }
4195
4196 // Fold trivial predicates.
4197 Type *RetTy = getCompareTy(LHS);
4198 if (Pred == FCmpInst::FCMP_FALSE)
4199 return getFalse(RetTy);
4200 if (Pred == FCmpInst::FCMP_TRUE)
4201 return getTrue(RetTy);
4202
4203 // fcmp pred x, poison and fcmp pred poison, x
4204 // fold to poison
4206 return PoisonValue::get(RetTy);
4207
4208 // fcmp pred x, undef and fcmp pred undef, x
4209 // fold to true if unordered, false if ordered
4210 if (Q.isUndefValue(LHS) || Q.isUndefValue(RHS)) {
4211 // Choosing NaN for the undef will always make unordered comparison succeed
4212 // and ordered comparison fail.
4213 return ConstantInt::get(RetTy, CmpInst::isUnordered(Pred));
4214 }
4215
4216 // fcmp x,x -> true/false. Not all compares are foldable.
4217 if (LHS == RHS) {
4218 if (CmpInst::isTrueWhenEqual(Pred))
4219 return getTrue(RetTy);
4220 if (CmpInst::isFalseWhenEqual(Pred))
4221 return getFalse(RetTy);
4222 }
4223
4224 // Fold (un)ordered comparison if we can determine there are no NaNs.
4225 //
4226 // This catches the 2 variable input case, constants are handled below as a
4227 // class-like compare.
4228 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
4231
4232 if (FMF.noNaNs() ||
4233 (RHSClass.isKnownNeverNaN() && LHSClass.isKnownNeverNaN()))
4234 return ConstantInt::get(RetTy, Pred == FCmpInst::FCMP_ORD);
4235
4236 if (RHSClass.isKnownAlwaysNaN() || LHSClass.isKnownAlwaysNaN())
4237 return ConstantInt::get(RetTy, Pred == CmpInst::FCMP_UNO);
4238 }
4239
4240 if (std::optional<bool> Res =
4241 isImpliedByDomCondition(Pred, LHS, RHS, Q.CxtI, Q.DL))
4242 return ConstantInt::getBool(RetTy, *Res);
4243
4244 const APFloat *C = nullptr;
4246 std::optional<KnownFPClass> FullKnownClassLHS;
4247
4248 // Lazily compute the possible classes for LHS. Avoid computing it twice if
4249 // RHS is a 0.
4250 auto computeLHSClass = [=, &FullKnownClassLHS](FPClassTest InterestedFlags =
4251 fcAllFlags) {
4252 if (FullKnownClassLHS)
4253 return *FullKnownClassLHS;
4254 return computeKnownFPClass(LHS, FMF, InterestedFlags, Q);
4255 };
4256
4257 if (C && Q.CxtI) {
4258 // Fold out compares that express a class test.
4259 //
4260 // FIXME: Should be able to perform folds without context
4261 // instruction. Always pass in the context function?
4262
4263 const Function *ParentF = Q.CxtI->getFunction();
4264 auto [ClassVal, ClassTest] = fcmpToClassTest(Pred, *ParentF, LHS, C);
4265 if (ClassVal) {
4266 FullKnownClassLHS = computeLHSClass();
4267 if ((FullKnownClassLHS->KnownFPClasses & ClassTest) == fcNone)
4268 return getFalse(RetTy);
4269 if ((FullKnownClassLHS->KnownFPClasses & ~ClassTest) == fcNone)
4270 return getTrue(RetTy);
4271 }
4272 }
4273
4274 // Handle fcmp with constant RHS.
4275 if (C) {
4276 // TODO: If we always required a context function, we wouldn't need to
4277 // special case nans.
4278 if (C->isNaN())
4279 return ConstantInt::get(RetTy, CmpInst::isUnordered(Pred));
4280
4281 // TODO: Need version fcmpToClassTest which returns implied class when the
4282 // compare isn't a complete class test. e.g. > 1.0 implies fcPositive, but
4283 // isn't implementable as a class call.
4284 if (C->isNegative() && !C->isNegZero()) {
4286
4287 // TODO: We can catch more cases by using a range check rather than
4288 // relying on CannotBeOrderedLessThanZero.
4289 switch (Pred) {
4290 case FCmpInst::FCMP_UGE:
4291 case FCmpInst::FCMP_UGT:
4292 case FCmpInst::FCMP_UNE: {
4293 KnownFPClass KnownClass = computeLHSClass(Interested);
4294
4295 // (X >= 0) implies (X > C) when (C < 0)
4296 if (KnownClass.cannotBeOrderedLessThanZero())
4297 return getTrue(RetTy);
4298 break;
4299 }
4300 case FCmpInst::FCMP_OEQ:
4301 case FCmpInst::FCMP_OLE:
4302 case FCmpInst::FCMP_OLT: {
4303 KnownFPClass KnownClass = computeLHSClass(Interested);
4304
4305 // (X >= 0) implies !(X < C) when (C < 0)
4306 if (KnownClass.cannotBeOrderedLessThanZero())
4307 return getFalse(RetTy);
4308 break;
4309 }
4310 default:
4311 break;
4312 }
4313 }
4314 // Check FCmp of [min/maxnum or min/maximumnum with const] with other const.
4315 const APFloat *C2;
4316 bool IsMax = match(LHS, m_FMaxNum_or_FMaximumNum(m_Value(), m_APFloat(C2)));
4317 bool IsMin = match(LHS, m_FMinNum_or_FMinimumNum(m_Value(), m_APFloat(C2)));
4318 if ((IsMax && *C2 > *C) || (IsMin && *C2 < *C)) {
4319 // The ordered relationship and min/maxnum or min/maximumnum guarantee
4320 // that we do not have NaN constants, so ordered/unordered preds are
4321 // handled the same.
4322 switch (Pred) {
4323 case FCmpInst::FCMP_OEQ:
4324 case FCmpInst::FCMP_UEQ:
4325 // minnum(X, LesserC) == C --> false
4326 // maxnum(X, GreaterC) == C --> false
4327 return getFalse(RetTy);
4328 case FCmpInst::FCMP_ONE:
4329 case FCmpInst::FCMP_UNE:
4330 // minnum(X, LesserC) != C --> true
4331 // maxnum(X, GreaterC) != C --> true
4332 return getTrue(RetTy);
4333 case FCmpInst::FCMP_OGE:
4334 case FCmpInst::FCMP_UGE:
4335 case FCmpInst::FCMP_OGT:
4336 case FCmpInst::FCMP_UGT:
4337 // minnum(X, LesserC) >= C --> false
4338 // minnum(X, LesserC) > C --> false
4339 // maxnum(X, GreaterC) >= C --> true
4340 // maxnum(X, GreaterC) > C --> true
4341 return ConstantInt::get(RetTy, IsMax);
4342 case FCmpInst::FCMP_OLE:
4343 case FCmpInst::FCMP_ULE:
4344 case FCmpInst::FCMP_OLT:
4345 case FCmpInst::FCMP_ULT:
4346 // minnum(X, LesserC) <= C --> true
4347 // minnum(X, LesserC) < C --> true
4348 // maxnum(X, GreaterC) <= C --> false
4349 // maxnum(X, GreaterC) < C --> false
4350 return ConstantInt::get(RetTy, !IsMax);
4351 default:
4352 // TRUE/FALSE/ORD/UNO should be handled before this.
4353 llvm_unreachable("Unexpected fcmp predicate");
4354 }
4355 }
4356 }
4357
4358 // TODO: Could fold this with above if there were a matcher which returned all
4359 // classes in a non-splat vector.
4360 if (match(RHS, m_AnyZeroFP())) {
4361 switch (Pred) {
4362 case FCmpInst::FCMP_OGE:
4363 case FCmpInst::FCMP_ULT: {
4365 if (!FMF.noNaNs())
4366 Interested |= fcNan;
4367
4368 KnownFPClass Known = computeLHSClass(Interested);
4369
4370 // Positive or zero X >= 0.0 --> true
4371 // Positive or zero X < 0.0 --> false
4372 if ((FMF.noNaNs() || Known.isKnownNeverNaN()) &&
4373 Known.cannotBeOrderedLessThanZero())
4374 return Pred == FCmpInst::FCMP_OGE ? getTrue(RetTy) : getFalse(RetTy);
4375 break;
4376 }
4377 case FCmpInst::FCMP_UGE:
4378 case FCmpInst::FCMP_OLT: {
4380 KnownFPClass Known = computeLHSClass(Interested);
4381
4382 // Positive or zero or nan X >= 0.0 --> true
4383 // Positive or zero or nan X < 0.0 --> false
4384 if (Known.cannotBeOrderedLessThanZero())
4385 return Pred == FCmpInst::FCMP_UGE ? getTrue(RetTy) : getFalse(RetTy);
4386 break;
4387 }
4388 default:
4389 break;
4390 }
4391 }
4392
4393 // If the comparison is with the result of a select instruction, check whether
4394 // comparing with either branch of the select always yields the same value.
4396 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse))
4397 return V;
4398
4399 // If the comparison is with the result of a phi instruction, check whether
4400 // doing the compare with each incoming phi value yields a common result.
4402 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse))
4403 return V;
4404
4405 return nullptr;
4406}
4407
4409 FastMathFlags FMF, const SimplifyQuery &Q) {
4410 return ::simplifyFCmpInst(Predicate, LHS, RHS, FMF, Q, RecursionLimit);
4411}
4412
4414 ArrayRef<std::pair<Value *, Value *>> Ops,
4415 const SimplifyQuery &Q,
4416 bool AllowRefinement,
4418 unsigned MaxRecurse) {
4419 assert((AllowRefinement || !Q.CanUseUndef) &&
4420 "If AllowRefinement=false then CanUseUndef=false");
4421 for (const auto &OpAndRepOp : Ops) {
4422 // We cannot replace a constant, and shouldn't even try.
4423 if (isa<Constant>(OpAndRepOp.first))
4424 return nullptr;
4425
4426 // Trivial replacement.
4427 if (V == OpAndRepOp.first)
4428 return OpAndRepOp.second;
4429 }
4430
4431 if (!MaxRecurse--)
4432 return nullptr;
4433
4434 auto *I = dyn_cast<Instruction>(V);
4435 if (!I)
4436 return nullptr;
4437
4438 // The arguments of a phi node might refer to a value from a previous
4439 // cycle iteration.
4440 if (isa<PHINode>(I))
4441 return nullptr;
4442
4443 // Don't fold away llvm.is.constant checks based on assumptions.
4445 return nullptr;
4446
4447 // Don't simplify freeze.
4448 if (isa<FreezeInst>(I))
4449 return nullptr;
4450
4451 for (const auto &OpAndRepOp : Ops) {
4452 // For vector types, the simplification must hold per-lane, so forbid
4453 // potentially cross-lane operations like shufflevector.
4454 if (OpAndRepOp.first->getType()->isVectorTy() &&
4456 return nullptr;
4457 }
4458
4459 // Replace Op with RepOp in instruction operands.
4461 bool AnyReplaced = false;
4462 for (Value *InstOp : I->operands()) {
4463 if (Value *NewInstOp = simplifyWithOpsReplaced(
4464 InstOp, Ops, Q, AllowRefinement, DropFlags, MaxRecurse)) {
4465 NewOps.push_back(NewInstOp);
4466 AnyReplaced = InstOp != NewInstOp;
4467 } else {
4468 NewOps.push_back(InstOp);
4469 }
4470
4471 // Bail out if any operand is undef and SimplifyQuery disables undef
4472 // simplification. Constant folding currently doesn't respect this option.
4473 if (isa<UndefValue>(NewOps.back()) && !Q.CanUseUndef)
4474 return nullptr;
4475 }
4476
4477 if (!AnyReplaced)
4478 return nullptr;
4479
4480 if (!AllowRefinement) {
4481 // General InstSimplify functions may refine the result, e.g. by returning
4482 // a constant for a potentially poison value. To avoid this, implement only
4483 // a few non-refining but profitable transforms here.
4484
4485 if (auto *BO = dyn_cast<BinaryOperator>(I)) {
4486 unsigned Opcode = BO->getOpcode();
4487 // id op x -> x, x op id -> x
4488 // Exclude floats, because x op id may produce a different NaN value.
4489 if (!BO->getType()->isFPOrFPVectorTy()) {
4490 if (NewOps[0] == ConstantExpr::getBinOpIdentity(Opcode, I->getType()))
4491 return NewOps[1];
4492 if (NewOps[1] == ConstantExpr::getBinOpIdentity(Opcode, I->getType(),
4493 /* RHS */ true))
4494 return NewOps[0];
4495 }
4496
4497 // x & x -> x, x | x -> x
4498 if ((Opcode == Instruction::And || Opcode == Instruction::Or) &&
4499 NewOps[0] == NewOps[1]) {
4500 // or disjoint x, x results in poison.
4501 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(BO)) {
4502 if (PDI->isDisjoint()) {
4503 if (!DropFlags)
4504 return nullptr;
4505 DropFlags->push_back(BO);
4506 }
4507 }
4508 return NewOps[0];
4509 }
4510
4511 // x - x -> 0, x ^ x -> 0. This is non-refining, because x is non-poison
4512 // by assumption and this case never wraps, so nowrap flags can be
4513 // ignored.
4514 if ((Opcode == Instruction::Sub || Opcode == Instruction::Xor) &&
4515 NewOps[0] == NewOps[1] &&
4516 any_of(Ops, [=](const auto &Rep) { return NewOps[0] == Rep.second; }))
4517 return Constant::getNullValue(I->getType());
4518
4519 // If we are substituting an absorber constant into a binop and extra
4520 // poison can't leak if we remove the select -- because both operands of
4521 // the binop are based on the same value -- then it may be safe to replace
4522 // the value with the absorber constant. Examples:
4523 // (Op == 0) ? 0 : (Op & -Op) --> Op & -Op
4524 // (Op == 0) ? 0 : (Op * (binop Op, C)) --> Op * (binop Op, C)
4525 // (Op == -1) ? -1 : (Op | (binop C, Op) --> Op | (binop C, Op)
4526 Constant *Absorber = ConstantExpr::getBinOpAbsorber(Opcode, I->getType());
4527 if ((NewOps[0] == Absorber || NewOps[1] == Absorber) &&
4528 any_of(Ops,
4529 [=](const auto &Rep) { return impliesPoison(BO, Rep.first); }))
4530 return Absorber;
4531 }
4532
4533 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4534 // `x == y ? 0 : ucmp(x, y)` where under the replacement y -> x,
4535 // `ucmp(x, x)` becomes `0`.
4536 if ((II->getIntrinsicID() == Intrinsic::scmp ||
4537 II->getIntrinsicID() == Intrinsic::ucmp) &&
4538 NewOps[0] == NewOps[1]) {
4539 if (II->hasPoisonGeneratingAnnotations()) {
4540 if (!DropFlags)
4541 return nullptr;
4542
4543 DropFlags->push_back(II);
4544 }
4545
4546 return ConstantInt::get(I->getType(), 0);
4547 }
4548
4549 if (auto *MMI = dyn_cast<MinMaxIntrinsic>(II)) {
4550 const APInt Identity = MMI->getIdentity();
4551
4552 Value *Result = nullptr;
4553 if (match(NewOps[0], m_SpecificInt(Identity)))
4554 Result = NewOps[1];
4555 else if (match(NewOps[1], m_SpecificInt(Identity)))
4556 Result = NewOps[0];
4557
4558 if (Result) {
4559 if (II->hasPoisonGeneratingAnnotations()) {
4560 if (!DropFlags)
4561 return nullptr;
4562
4563 DropFlags->push_back(II);
4564 }
4565
4566 return Result;
4567 }
4568 }
4569 }
4570
4572 // getelementptr x, 0 -> x.
4573 // This never returns poison, even if inbounds is set.
4574 if (NewOps.size() == 2 && match(NewOps[1], m_Zero()))
4575 return NewOps[0];
4576 }
4577 } else {
4578 // The simplification queries below may return the original value. Consider:
4579 // %div = udiv i32 %arg, %arg2
4580 // %mul = mul nsw i32 %div, %arg2
4581 // %cmp = icmp eq i32 %mul, %arg
4582 // %sel = select i1 %cmp, i32 %div, i32 undef
4583 // Replacing %arg by %mul, %div becomes "udiv i32 %mul, %arg2", which
4584 // simplifies back to %arg. This can only happen because %mul does not
4585 // dominate %div. To ensure a consistent return value contract, we make sure
4586 // that this case returns nullptr as well.
4587 auto PreventSelfSimplify = [V](Value *Simplified) {
4588 return Simplified != V ? Simplified : nullptr;
4589 };
4590
4591 return PreventSelfSimplify(
4592 ::simplifyInstructionWithOperands(I, NewOps, Q, MaxRecurse));
4593 }
4594
4595 // If all operands are constant after substituting Op for RepOp then we can
4596 // constant fold the instruction.
4598 for (Value *NewOp : NewOps) {
4599 if (Constant *ConstOp = dyn_cast<Constant>(NewOp))
4600 ConstOps.push_back(ConstOp);
4601 else
4602 return nullptr;
4603 }
4604
4605 // Consider:
4606 // %cmp = icmp eq i32 %x, 2147483647
4607 // %add = add nsw i32 %x, 1
4608 // %sel = select i1 %cmp, i32 -2147483648, i32 %add
4609 //
4610 // We can't replace %sel with %add unless we strip away the flags (which
4611 // will be done in InstCombine).
4612 // TODO: This may be unsound, because it only catches some forms of
4613 // refinement.
4614 if (!AllowRefinement) {
4615 auto *II = dyn_cast<IntrinsicInst>(I);
4616 if (canCreatePoison(cast<Operator>(I), !DropFlags)) {
4617 // abs cannot create poison if the value is known to never be int_min.
4618 if (II && II->getIntrinsicID() == Intrinsic::abs) {
4619 if (!ConstOps[0]->isNotMinSignedValue())
4620 return nullptr;
4621 } else
4622 return nullptr;
4623 }
4624
4625 if (DropFlags && II) {
4626 // If we're going to change the poison flag of abs/ctz to false, also
4627 // perform constant folding that way, so we get an integer instead of a
4628 // poison value here.
4629 switch (II->getIntrinsicID()) {
4630 case Intrinsic::abs:
4631 case Intrinsic::ctlz:
4632 case Intrinsic::cttz:
4633 ConstOps[1] = ConstantInt::getFalse(I->getContext());
4634 break;
4635 default:
4636 break;
4637 }
4638 }
4639
4640 Constant *Res = ConstantFoldInstOperands(I, ConstOps, Q.DL, Q.TLI,
4641 /*AllowNonDeterministic=*/false);
4642 if (DropFlags && Res && I->hasPoisonGeneratingAnnotations())
4643 DropFlags->push_back(I);
4644 return Res;
4645 }
4646
4647 return ConstantFoldInstOperands(I, ConstOps, Q.DL, Q.TLI,
4648 /*AllowNonDeterministic=*/false);
4649}
4650
4652 const SimplifyQuery &Q,
4653 bool AllowRefinement,
4655 unsigned MaxRecurse) {
4656 return simplifyWithOpsReplaced(V, {{Op, RepOp}}, Q, AllowRefinement,
4657 DropFlags, MaxRecurse);
4658}
4659
4661 const SimplifyQuery &Q,
4662 bool AllowRefinement,
4663 SmallVectorImpl<Instruction *> *DropFlags) {
4664 // If refinement is disabled, also disable undef simplifications (which are
4665 // always refinements) in SimplifyQuery.
4666 if (!AllowRefinement)
4667 return ::simplifyWithOpReplaced(V, Op, RepOp, Q.getWithoutUndef(),
4668 AllowRefinement, DropFlags, RecursionLimit);
4669 return ::simplifyWithOpReplaced(V, Op, RepOp, Q, AllowRefinement, DropFlags,
4671}
4672
4673/// Try to simplify a select instruction when its condition operand is an
4674/// integer comparison where one operand of the compare is a constant.
4675static Value *simplifySelectBitTest(Value *TrueVal, Value *FalseVal, Value *X,
4676 const APInt *Y, bool TrueWhenUnset) {
4677 const APInt *C;
4678
4679 // (X & Y) == 0 ? X & ~Y : X --> X
4680 // (X & Y) != 0 ? X & ~Y : X --> X & ~Y
4681 if (FalseVal == X && match(TrueVal, m_And(m_Specific(X), m_APInt(C))) &&
4682 *Y == ~*C)
4683 return TrueWhenUnset ? FalseVal : TrueVal;
4684
4685 // (X & Y) == 0 ? X : X & ~Y --> X & ~Y
4686 // (X & Y) != 0 ? X : X & ~Y --> X
4687 if (TrueVal == X && match(FalseVal, m_And(m_Specific(X), m_APInt(C))) &&
4688 *Y == ~*C)
4689 return TrueWhenUnset ? FalseVal : TrueVal;
4690
4691 if (Y->isPowerOf2()) {
4692 // (X & Y) == 0 ? X | Y : X --> X | Y
4693 // (X & Y) != 0 ? X | Y : X --> X
4694 if (FalseVal == X && match(TrueVal, m_Or(m_Specific(X), m_APInt(C))) &&
4695 *Y == *C) {
4696 // We can't return the or if it has the disjoint flag.
4697 if (TrueWhenUnset && cast<PossiblyDisjointInst>(TrueVal)->isDisjoint())
4698 return nullptr;
4699 return TrueWhenUnset ? TrueVal : FalseVal;
4700 }
4701
4702 // (X & Y) == 0 ? X : X | Y --> X
4703 // (X & Y) != 0 ? X : X | Y --> X | Y
4704 if (TrueVal == X && match(FalseVal, m_Or(m_Specific(X), m_APInt(C))) &&
4705 *Y == *C) {
4706 // We can't return the or if it has the disjoint flag.
4707 if (!TrueWhenUnset && cast<PossiblyDisjointInst>(FalseVal)->isDisjoint())
4708 return nullptr;
4709 return TrueWhenUnset ? TrueVal : FalseVal;
4710 }
4711 }
4712
4713 return nullptr;
4714}
4715
4716static Value *simplifyCmpSelOfMaxMin(Value *CmpLHS, Value *CmpRHS,
4717 CmpPredicate Pred, Value *TVal,
4718 Value *FVal) {
4719 // Canonicalize common cmp+sel operand as CmpLHS.
4720 if (CmpRHS == TVal || CmpRHS == FVal) {
4721 std::swap(CmpLHS, CmpRHS);
4722 Pred = ICmpInst::getSwappedPredicate(Pred);
4723 }
4724
4725 // Canonicalize common cmp+sel operand as TVal.
4726 if (CmpLHS == FVal) {
4727 std::swap(TVal, FVal);
4728 Pred = ICmpInst::getInversePredicate(Pred);
4729 }
4730
4731 // A vector select may be shuffling together elements that are equivalent
4732 // based on the max/min/select relationship.
4733 Value *X = CmpLHS, *Y = CmpRHS;
4734 bool PeekedThroughSelectShuffle = false;
4735 auto *Shuf = dyn_cast<ShuffleVectorInst>(FVal);
4736 if (Shuf && Shuf->isSelect()) {
4737 if (Shuf->getOperand(0) == Y)
4738 FVal = Shuf->getOperand(1);
4739 else if (Shuf->getOperand(1) == Y)
4740 FVal = Shuf->getOperand(0);
4741 else
4742 return nullptr;
4743 PeekedThroughSelectShuffle = true;
4744 }
4745
4746 // (X pred Y) ? X : max/min(X, Y)
4747 auto *MMI = dyn_cast<MinMaxIntrinsic>(FVal);
4748 if (!MMI || TVal != X ||
4750 return nullptr;
4751
4752 // (X > Y) ? X : max(X, Y) --> max(X, Y)
4753 // (X >= Y) ? X : max(X, Y) --> max(X, Y)
4754 // (X < Y) ? X : min(X, Y) --> min(X, Y)
4755 // (X <= Y) ? X : min(X, Y) --> min(X, Y)
4756 //
4757 // The equivalence allows a vector select (shuffle) of max/min and Y. Ex:
4758 // (X > Y) ? X : (Z ? max(X, Y) : Y)
4759 // If Z is true, this reduces as above, and if Z is false:
4760 // (X > Y) ? X : Y --> max(X, Y)
4761 ICmpInst::Predicate MMPred = MMI->getPredicate();
4762 if (MMPred == CmpInst::getStrictPredicate(Pred))
4763 return MMI;
4764
4765 // Other transforms are not valid with a shuffle.
4766 if (PeekedThroughSelectShuffle)
4767 return nullptr;
4768
4769 // (X == Y) ? X : max/min(X, Y) --> max/min(X, Y)
4770 if (Pred == CmpInst::ICMP_EQ)
4771 return MMI;
4772
4773 // (X != Y) ? X : max/min(X, Y) --> X
4774 if (Pred == CmpInst::ICMP_NE)
4775 return X;
4776
4777 // (X < Y) ? X : max(X, Y) --> X
4778 // (X <= Y) ? X : max(X, Y) --> X
4779 // (X > Y) ? X : min(X, Y) --> X
4780 // (X >= Y) ? X : min(X, Y) --> X
4782 if (MMPred == CmpInst::getStrictPredicate(InvPred))
4783 return X;
4784
4785 return nullptr;
4786}
4787
4788/// An alternative way to test if a bit is set or not.
4789/// uses e.g. sgt/slt or trunc instead of eq/ne.
4790static Value *simplifySelectWithBitTest(Value *CondVal, Value *TrueVal,
4791 Value *FalseVal) {
4792 if (auto Res = decomposeBitTest(CondVal))
4793 return simplifySelectBitTest(TrueVal, FalseVal, Res->X, &Res->Mask,
4794 Res->Pred == ICmpInst::ICMP_EQ);
4795
4796 return nullptr;
4797}
4798
4799/// Try to simplify a select instruction when its condition operand is an
4800/// integer equality or floating-point equivalence comparison.
4802 ArrayRef<std::pair<Value *, Value *>> Replacements, Value *TrueVal,
4803 Value *FalseVal, const SimplifyQuery &Q, unsigned MaxRecurse) {
4804 Value *SimplifiedFalseVal =
4805 simplifyWithOpsReplaced(FalseVal, Replacements, Q.getWithoutUndef(),
4806 /* AllowRefinement */ false,
4807 /* DropFlags */ nullptr, MaxRecurse);
4808 if (!SimplifiedFalseVal)
4809 SimplifiedFalseVal = FalseVal;
4810
4811 Value *SimplifiedTrueVal =
4812 simplifyWithOpsReplaced(TrueVal, Replacements, Q,
4813 /* AllowRefinement */ true,
4814 /* DropFlags */ nullptr, MaxRecurse);
4815 if (!SimplifiedTrueVal)
4816 SimplifiedTrueVal = TrueVal;
4817
4818 if (SimplifiedFalseVal == SimplifiedTrueVal)
4819 return FalseVal;
4820
4821 return nullptr;
4822}
4823
4824/// Try to simplify a select instruction when its condition operand is an
4825/// integer comparison.
4826static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
4827 Value *FalseVal,
4828 const SimplifyQuery &Q,
4829 unsigned MaxRecurse) {
4830 CmpPredicate Pred;
4831 Value *CmpLHS, *CmpRHS;
4832 if (!match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
4833 return nullptr;
4834
4835 if (Value *V = simplifyCmpSelOfMaxMin(CmpLHS, CmpRHS, Pred, TrueVal, FalseVal))
4836 return V;
4837
4838 // Canonicalize ne to eq predicate.
4839 if (Pred == ICmpInst::ICMP_NE) {
4840 Pred = ICmpInst::ICMP_EQ;
4841 std::swap(TrueVal, FalseVal);
4842 }
4843
4844 // Check for integer min/max with a limit constant:
4845 // X > MIN_INT ? X : MIN_INT --> X
4846 // X < MAX_INT ? X : MAX_INT --> X
4847 if (TrueVal->getType()->isIntOrIntVectorTy()) {
4848 Value *X, *Y;
4850 matchDecomposedSelectPattern(cast<ICmpInst>(CondVal), TrueVal, FalseVal,
4851 X, Y)
4852 .Flavor;
4853 if (SelectPatternResult::isMinOrMax(SPF) && Pred == getMinMaxPred(SPF)) {
4855 X->getType()->getScalarSizeInBits());
4856 if (match(Y, m_SpecificInt(LimitC)))
4857 return X;
4858 }
4859 }
4860
4861 if (Pred == ICmpInst::ICMP_EQ && match(CmpRHS, m_Zero())) {
4862 Value *X;
4863 const APInt *Y;
4864 if (match(CmpLHS, m_And(m_Value(X), m_APInt(Y))))
4865 if (Value *V = simplifySelectBitTest(TrueVal, FalseVal, X, Y,
4866 /*TrueWhenUnset=*/true))
4867 return V;
4868
4869 // Test for a bogus zero-shift-guard-op around funnel-shift or rotate.
4870 Value *ShAmt;
4871 auto isFsh = m_CombineOr(m_FShl(m_Value(X), m_Value(), m_Value(ShAmt)),
4872 m_FShr(m_Value(), m_Value(X), m_Value(ShAmt)));
4873 // (ShAmt == 0) ? fshl(X, *, ShAmt) : X --> X
4874 // (ShAmt == 0) ? fshr(*, X, ShAmt) : X --> X
4875 if (match(TrueVal, isFsh) && FalseVal == X && CmpLHS == ShAmt)
4876 return X;
4877
4878 // Test for a zero-shift-guard-op around rotates. These are used to
4879 // avoid UB from oversized shifts in raw IR rotate patterns, but the
4880 // intrinsics do not have that problem.
4881 // We do not allow this transform for the general funnel shift case because
4882 // that would not preserve the poison safety of the original code.
4883 auto isRotate =
4885 m_FShr(m_Value(X), m_Deferred(X), m_Value(ShAmt)));
4886 // (ShAmt == 0) ? X : fshl(X, X, ShAmt) --> fshl(X, X, ShAmt)
4887 // (ShAmt == 0) ? X : fshr(X, X, ShAmt) --> fshr(X, X, ShAmt)
4888 if (match(FalseVal, isRotate) && TrueVal == X && CmpLHS == ShAmt &&
4889 Pred == ICmpInst::ICMP_EQ)
4890 return FalseVal;
4891
4892 // X == 0 ? abs(X) : -abs(X) --> -abs(X)
4893 // X == 0 ? -abs(X) : abs(X) --> abs(X)
4894 if (match(TrueVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))) &&
4896 return FalseVal;
4897 if (match(TrueVal,
4899 match(FalseVal, m_Intrinsic<Intrinsic::abs>(m_Specific(CmpLHS))))
4900 return FalseVal;
4901 }
4902
4903 // If we have a scalar equality comparison, then we know the value in one of
4904 // the arms of the select. See if substituting this value into the arm and
4905 // simplifying the result yields the same value as the other arm.
4906 if (Pred == ICmpInst::ICMP_EQ) {
4907 if (CmpLHS->getType()->isIntOrIntVectorTy() ||
4908 canReplacePointersIfEqual(CmpLHS, CmpRHS, Q.DL))
4909 if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, TrueVal,
4910 FalseVal, Q, MaxRecurse))
4911 return V;
4912 if (CmpLHS->getType()->isIntOrIntVectorTy() ||
4913 canReplacePointersIfEqual(CmpRHS, CmpLHS, Q.DL))
4914 if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, TrueVal,
4915 FalseVal, Q, MaxRecurse))
4916 return V;
4917
4918 Value *X;
4919 Value *Y;
4920 // select((X | Y) == 0 ? X : 0) --> 0 (commuted 2 ways)
4921 if (match(CmpLHS, m_Or(m_Value(X), m_Value(Y))) &&
4922 match(CmpRHS, m_Zero())) {
4923 // (X | Y) == 0 implies X == 0 and Y == 0.
4925 {{X, CmpRHS}, {Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4926 return V;
4927 }
4928
4929 // select((X & Y) == -1 ? X : -1) --> -1 (commuted 2 ways)
4930 if (match(CmpLHS, m_And(m_Value(X), m_Value(Y))) &&
4931 match(CmpRHS, m_AllOnes())) {
4932 // (X & Y) == -1 implies X == -1 and Y == -1.
4934 {{X, CmpRHS}, {Y, CmpRHS}}, TrueVal, FalseVal, Q, MaxRecurse))
4935 return V;
4936 }
4937 }
4938
4939 return nullptr;
4940}
4941
4942/// Try to simplify a select instruction when its condition operand is a
4943/// floating-point comparison.
4945 FastMathFlags FMF, const SimplifyQuery &Q,
4946 unsigned MaxRecurse) {
4947 CmpPredicate Pred;
4948 Value *CmpLHS, *CmpRHS;
4949 if (!match(Cond, m_FCmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS))))
4950 return nullptr;
4952
4953 bool IsEquiv = I->isEquivalence();
4954 if (I->isEquivalence(/*Invert=*/true)) {
4955 std::swap(T, F);
4956 Pred = FCmpInst::getInversePredicate(Pred);
4957 IsEquiv = true;
4958 }
4959
4960 // This transforms is safe if at least one operand is known to not be zero.
4961 // Otherwise, the select can change the sign of a zero operand.
4962 if (IsEquiv) {
4963 if (Value *V = simplifySelectWithEquivalence({{CmpLHS, CmpRHS}}, T, F, Q,
4964 MaxRecurse))
4965 return V;
4966 if (Value *V = simplifySelectWithEquivalence({{CmpRHS, CmpLHS}}, T, F, Q,
4967 MaxRecurse))
4968 return V;
4969 }
4970
4971 // Canonicalize CmpLHS to be T, and CmpRHS to be F, if they're swapped.
4972 if (CmpLHS == F && CmpRHS == T)
4973 std::swap(CmpLHS, CmpRHS);
4974
4975 if (CmpLHS != T || CmpRHS != F)
4976 return nullptr;
4977
4978 // This transform is also safe if we do not have (do not care about) -0.0.
4979 if (FMF.noSignedZeros()) {
4980 // (T == F) ? T : F --> F
4981 if (Pred == FCmpInst::FCMP_OEQ)
4982 return F;
4983
4984 // (T != F) ? T : F --> T
4985 if (Pred == FCmpInst::FCMP_UNE)
4986 return T;
4987 }
4988
4989 return nullptr;
4990}
4991
4992/// Look for the following pattern and simplify %to_fold to %identicalPhi.
4993/// Here %phi, %to_fold and %phi.next perform the same functionality as
4994/// %identicalPhi and hence the select instruction %to_fold can be folded
4995/// into %identicalPhi.
4996///
4997/// BB1:
4998/// %identicalPhi = phi [ X, %BB0 ], [ %identicalPhi.next, %BB1 ]
4999/// %phi = phi [ X, %BB0 ], [ %phi.next, %BB1 ]
5000/// ...
5001/// %identicalPhi.next = select %cmp, %val, %identicalPhi
5002/// (or select %cmp, %identicalPhi, %val)
5003/// %to_fold = select %cmp2, %identicalPhi, %phi
5004/// %phi.next = select %cmp, %val, %to_fold
5005/// (or select %cmp, %to_fold, %val)
5006///
5007/// Prove that %phi and %identicalPhi are the same by induction:
5008///
5009/// Base case: Both %phi and %identicalPhi are equal on entry to the loop.
5010/// Inductive case:
5011/// Suppose %phi and %identicalPhi are equal at iteration i.
5012/// We look at their values at iteration i+1 which are %phi.next and
5013/// %identicalPhi.next. They would have become different only when %cmp is
5014/// false and the corresponding values %to_fold and %identicalPhi differ
5015/// (similar reason for the other "or" case in the bracket).
5016///
5017/// The only condition when %to_fold and %identicalPh could differ is when %cmp2
5018/// is false and %to_fold is %phi, which contradicts our inductive hypothesis
5019/// that %phi and %identicalPhi are equal. Thus %phi and %identicalPhi are
5020/// always equal at iteration i+1.
5022 if (PN.getParent() != IdenticalPN.getParent())
5023 return false;
5024 if (PN.getNumIncomingValues() != 2)
5025 return false;
5026
5027 // Check that only the backedge incoming value is different.
5028 unsigned DiffVals = 0;
5029 BasicBlock *DiffValBB = nullptr;
5030 for (unsigned i = 0; i < 2; i++) {
5031 BasicBlock *PredBB = PN.getIncomingBlock(i);
5032 if (PN.getIncomingValue(i) !=
5033 IdenticalPN.getIncomingValueForBlock(PredBB)) {
5034 DiffVals++;
5035 DiffValBB = PredBB;
5036 }
5037 }
5038 if (DiffVals != 1)
5039 return false;
5040 // Now check that the backedge incoming values are two select
5041 // instructions with the same condition. Either their true
5042 // values are the same, or their false values are the same.
5043 auto *SI = dyn_cast<SelectInst>(PN.getIncomingValueForBlock(DiffValBB));
5044 auto *IdenticalSI =
5045 dyn_cast<SelectInst>(IdenticalPN.getIncomingValueForBlock(DiffValBB));
5046 if (!SI || !IdenticalSI)
5047 return false;
5048 if (SI->getCondition() != IdenticalSI->getCondition())
5049 return false;
5050
5051 SelectInst *SIOtherVal = nullptr;
5052 Value *IdenticalSIOtherVal = nullptr;
5053 if (SI->getTrueValue() == IdenticalSI->getTrueValue()) {
5054 SIOtherVal = dyn_cast<SelectInst>(SI->getFalseValue());
5055 IdenticalSIOtherVal = IdenticalSI->getFalseValue();
5056 } else if (SI->getFalseValue() == IdenticalSI->getFalseValue()) {
5057 SIOtherVal = dyn_cast<SelectInst>(SI->getTrueValue());
5058 IdenticalSIOtherVal = IdenticalSI->getTrueValue();
5059 } else {
5060 return false;
5061 }
5062
5063 // Now check that the other values in select, i.e., %to_fold and
5064 // %identicalPhi, are essentially the same value.
5065 if (!SIOtherVal || IdenticalSIOtherVal != &IdenticalPN)
5066 return false;
5067 if (!(SIOtherVal->getTrueValue() == &IdenticalPN &&
5068 SIOtherVal->getFalseValue() == &PN) &&
5069 !(SIOtherVal->getTrueValue() == &PN &&
5070 SIOtherVal->getFalseValue() == &IdenticalPN))
5071 return false;
5072 return true;
5073}
5074
5075/// Given operands for a SelectInst, see if we can fold the result.
5076/// If not, this returns null.
5077static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
5078 FastMathFlags FMF, const SimplifyQuery &Q,
5079 unsigned MaxRecurse) {
5080 if (auto *CondC = dyn_cast<Constant>(Cond)) {
5081 if (auto *TrueC = dyn_cast<Constant>(TrueVal))
5082 if (auto *FalseC = dyn_cast<Constant>(FalseVal))
5083 if (Constant *C = ConstantFoldSelectInstruction(CondC, TrueC, FalseC))
5084 return C;
5085
5086 // select poison, X, Y -> poison
5087 if (isa<PoisonValue>(CondC))
5088 return PoisonValue::get(TrueVal->getType());
5089
5090 // select undef, X, Y -> X or Y
5091 if (Q.isUndefValue(CondC))
5092 return isa<Constant>(FalseVal) ? FalseVal : TrueVal;
5093
5094 // select true, X, Y --> X
5095 // select false, X, Y --> Y
5096 // For vectors, allow undef/poison elements in the condition to match the
5097 // defined elements, so we can eliminate the select.
5098 if (match(CondC, m_One()))
5099 return TrueVal;
5100 if (match(CondC, m_Zero()))
5101 return FalseVal;
5102 }
5103
5104 assert(Cond->getType()->isIntOrIntVectorTy(1) &&
5105 "Select must have bool or bool vector condition");
5106 assert(TrueVal->getType() == FalseVal->getType() &&
5107 "Select must have same types for true/false ops");
5108
5109 if (Cond->getType() == TrueVal->getType()) {
5110 // select i1 Cond, i1 true, i1 false --> i1 Cond
5111 if (match(TrueVal, m_One()) && match(FalseVal, m_ZeroInt()))
5112 return Cond;
5113
5114 // (X && Y) ? X : Y --> Y (commuted 2 ways)
5115 if (match(Cond, m_c_LogicalAnd(m_Specific(TrueVal), m_Specific(FalseVal))))
5116 return FalseVal;
5117
5118 // (X || Y) ? X : Y --> X (commuted 2 ways)
5119 if (match(Cond, m_c_LogicalOr(m_Specific(TrueVal), m_Specific(FalseVal))))
5120 return TrueVal;
5121
5122 // (X || Y) ? false : X --> false (commuted 2 ways)
5123 if (match(Cond, m_c_LogicalOr(m_Specific(FalseVal), m_Value())) &&
5124 match(TrueVal, m_ZeroInt()))
5125 return ConstantInt::getFalse(Cond->getType());
5126
5127 // Match patterns that end in logical-and.
5128 if (match(FalseVal, m_ZeroInt())) {
5129 // !(X || Y) && X --> false (commuted 2 ways)
5130 if (match(Cond, m_Not(m_c_LogicalOr(m_Specific(TrueVal), m_Value()))))
5131 return ConstantInt::getFalse(Cond->getType());
5132 // X && !(X || Y) --> false (commuted 2 ways)
5133 if (match(TrueVal, m_Not(m_c_LogicalOr(m_Specific(Cond), m_Value()))))
5134 return ConstantInt::getFalse(Cond->getType());
5135
5136 // (X || Y) && Y --> Y (commuted 2 ways)
5137 if (match(Cond, m_c_LogicalOr(m_Specific(TrueVal), m_Value())))
5138 return TrueVal;
5139 // Y && (X || Y) --> Y (commuted 2 ways)
5140 if (match(TrueVal, m_c_LogicalOr(m_Specific(Cond), m_Value())))
5141 return Cond;
5142
5143 // (X || Y) && (X || !Y) --> X (commuted 8 ways)
5144 Value *X, *Y;
5147 return X;
5148 if (match(TrueVal, m_c_LogicalOr(m_Value(X), m_Not(m_Value(Y)))) &&
5150 return X;
5151 }
5152
5153 // Match patterns that end in logical-or.
5154 if (match(TrueVal, m_One())) {
5155 // !(X && Y) || X --> true (commuted 2 ways)
5156 if (match(Cond, m_Not(m_c_LogicalAnd(m_Specific(FalseVal), m_Value()))))
5157 return ConstantInt::getTrue(Cond->getType());
5158 // X || !(X && Y) --> true (commuted 2 ways)
5159 if (match(FalseVal, m_Not(m_c_LogicalAnd(m_Specific(Cond), m_Value()))))
5160 return ConstantInt::getTrue(Cond->getType());
5161
5162 // (X && Y) || Y --> Y (commuted 2 ways)
5163 if (match(Cond, m_c_LogicalAnd(m_Specific(FalseVal), m_Value())))
5164 return FalseVal;
5165 // Y || (X && Y) --> Y (commuted 2 ways)
5166 if (match(FalseVal, m_c_LogicalAnd(m_Specific(Cond), m_Value())))
5167 return Cond;
5168 }
5169 }
5170
5171 // select ?, X, X -> X
5172 if (TrueVal == FalseVal)
5173 return TrueVal;
5174
5175 if (Cond == TrueVal) {
5176 // select i1 X, i1 X, i1 false --> X (logical-and)
5177 if (match(FalseVal, m_ZeroInt()))
5178 return Cond;
5179 // select i1 X, i1 X, i1 true --> true
5180 if (match(FalseVal, m_One()))
5181 return ConstantInt::getTrue(Cond->getType());
5182 }
5183 if (Cond == FalseVal) {
5184 // select i1 X, i1 true, i1 X --> X (logical-or)
5185 if (match(TrueVal, m_One()))
5186 return Cond;
5187 // select i1 X, i1 false, i1 X --> false
5188 if (match(TrueVal, m_ZeroInt()))
5189 return ConstantInt::getFalse(Cond->getType());
5190 }
5191
5192 // If the true or false value is poison, we can fold to the other value.
5193 // If the true or false value is undef, we can fold to the other value as
5194 // long as the other value isn't poison.
5195 // select ?, poison, X -> X
5196 // select ?, undef, X -> X
5197 if (isa<PoisonValue>(TrueVal) ||
5198 (Q.isUndefValue(TrueVal) && impliesPoison(FalseVal, Cond)))
5199 return FalseVal;
5200 // select ?, X, poison -> X
5201 // select ?, X, undef -> X
5202 if (isa<PoisonValue>(FalseVal) ||
5203 (Q.isUndefValue(FalseVal) && impliesPoison(TrueVal, Cond)))
5204 return TrueVal;
5205
5206 // Deal with partial undef vector constants: select ?, VecC, VecC' --> VecC''
5207 Constant *TrueC, *FalseC;
5208 if (isa<FixedVectorType>(TrueVal->getType()) &&
5209 match(TrueVal, m_Constant(TrueC)) &&
5210 match(FalseVal, m_Constant(FalseC))) {
5211 unsigned NumElts =
5212 cast<FixedVectorType>(TrueC->getType())->getNumElements();
5214 for (unsigned i = 0; i != NumElts; ++i) {
5215 // Bail out on incomplete vector constants.
5216 Constant *TEltC = TrueC->getAggregateElement(i);
5217 Constant *FEltC = FalseC->getAggregateElement(i);
5218 if (!TEltC || !FEltC)
5219 break;
5220
5221 // If the elements match (undef or not), that value is the result. If only
5222 // one element is undef, choose the defined element as the safe result.
5223 if (TEltC == FEltC)
5224 NewC.push_back(TEltC);
5225 else if (isa<PoisonValue>(TEltC) ||
5226 (Q.isUndefValue(TEltC) && isGuaranteedNotToBePoison(FEltC)))
5227 NewC.push_back(FEltC);
5228 else if (isa<PoisonValue>(FEltC) ||
5229 (Q.isUndefValue(FEltC) && isGuaranteedNotToBePoison(TEltC)))
5230 NewC.push_back(TEltC);
5231 else
5232 break;
5233 }
5234 if (NewC.size() == NumElts)
5235 return ConstantVector::get(NewC);
5236 }
5237
5238 if (Value *V =
5239 simplifySelectWithICmpCond(Cond, TrueVal, FalseVal, Q, MaxRecurse))
5240 return V;
5241
5242 if (Value *V = simplifySelectWithBitTest(Cond, TrueVal, FalseVal))
5243 return V;
5244
5245 if (Value *V =
5246 simplifySelectWithFCmp(Cond, TrueVal, FalseVal, FMF, Q, MaxRecurse))
5247 return V;
5248
5249 std::optional<bool> Imp = isImpliedByDomCondition(Cond, Q.CxtI, Q.DL);
5250 if (Imp)
5251 return *Imp ? TrueVal : FalseVal;
5252 // Look for same PHIs in the true and false values.
5253 if (auto *TruePHI = dyn_cast<PHINode>(TrueVal))
5254 if (auto *FalsePHI = dyn_cast<PHINode>(FalseVal)) {
5255 if (isSelectWithIdenticalPHI(*TruePHI, *FalsePHI))
5256 return FalseVal;
5257 if (isSelectWithIdenticalPHI(*FalsePHI, *TruePHI))
5258 return TrueVal;
5259 }
5260 return nullptr;
5261}
5262
5264 FastMathFlags FMF, const SimplifyQuery &Q) {
5265 return ::simplifySelectInst(Cond, TrueVal, FalseVal, FMF, Q, RecursionLimit);
5266}
5267
5268/// Given operands for an GetElementPtrInst, see if we can fold the result.
5269/// If not, this returns null.
5270static Value *simplifyGEPInst(Type *SrcTy, Value *Ptr,
5272 const SimplifyQuery &Q, unsigned) {
5273 // The type of the GEP pointer operand.
5274 unsigned AS =
5275 cast<PointerType>(Ptr->getType()->getScalarType())->getAddressSpace();
5276
5277 // getelementptr P -> P.
5278 if (Indices.empty())
5279 return Ptr;
5280
5281 // Compute the (pointer) type returned by the GEP instruction.
5282 Type *LastType = GetElementPtrInst::getIndexedType(SrcTy, Indices);
5283 Type *GEPTy = Ptr->getType();
5284 if (!GEPTy->isVectorTy()) {
5285 for (Value *Op : Indices) {
5286 // If one of the operands is a vector, the result type is a vector of
5287 // pointers. All vector operands must have the same number of elements.
5288 if (VectorType *VT = dyn_cast<VectorType>(Op->getType())) {
5289 GEPTy = VectorType::get(GEPTy, VT->getElementCount());
5290 break;
5291 }
5292 }
5293 }
5294
5295 // All-zero GEP is a no-op, unless it performs a vector splat.
5296 if (Ptr->getType() == GEPTy && all_of(Indices, match_fn(m_Zero())))
5297 return Ptr;
5298
5299 // getelementptr poison, idx -> poison
5300 // getelementptr baseptr, poison -> poison
5301 if (isa<PoisonValue>(Ptr) || any_of(Indices, IsaPred<PoisonValue>))
5302 return PoisonValue::get(GEPTy);
5303
5304 // getelementptr undef, idx -> undef
5305 if (Q.isUndefValue(Ptr))
5306 return UndefValue::get(GEPTy);
5307
5308 bool IsScalableVec =
5309 SrcTy->isScalableTy() || any_of(Indices, [](const Value *V) {
5310 return isa<ScalableVectorType>(V->getType());
5311 });
5312
5313 if (Indices.size() == 1) {
5314 Type *Ty = SrcTy;
5315 if (!IsScalableVec && Ty->isSized()) {
5316 Value *P;
5317 uint64_t C;
5318 uint64_t TyAllocSize = Q.DL.getTypeAllocSize(Ty);
5319 // getelementptr P, N -> P if P points to a type of zero size.
5320 if (TyAllocSize == 0 && Ptr->getType() == GEPTy)
5321 return Ptr;
5322
5323 // The following transforms are only safe if the ptrtoint cast
5324 // doesn't truncate the address of the pointers. The non-address bits
5325 // must be the same, as the underlying objects are the same.
5326 if (Indices[0]->getType()->getScalarSizeInBits() >=
5327 Q.DL.getAddressSizeInBits(AS)) {
5328 auto CanSimplify = [GEPTy, &P, Ptr]() -> bool {
5329 return P->getType() == GEPTy &&
5331 };
5332 // getelementptr V, (sub P, V) -> P if P points to a type of size 1.
5333 if (TyAllocSize == 1 &&
5334 match(Indices[0], m_Sub(m_PtrToIntOrAddr(m_Value(P)),
5335 m_PtrToIntOrAddr(m_Specific(Ptr)))) &&
5336 CanSimplify())
5337 return P;
5338
5339 // getelementptr V, (ashr (sub P, V), C) -> P if P points to a type of
5340 // size 1 << C.
5341 if (match(Indices[0], m_AShr(m_Sub(m_PtrToIntOrAddr(m_Value(P)),
5343 m_ConstantInt(C))) &&
5344 TyAllocSize == 1ULL << C && CanSimplify())
5345 return P;
5346
5347 // getelementptr V, (sdiv (sub P, V), C) -> P if P points to a type of
5348 // size C.
5349 if (match(Indices[0], m_SDiv(m_Sub(m_PtrToIntOrAddr(m_Value(P)),
5351 m_SpecificInt(TyAllocSize))) &&
5352 CanSimplify())
5353 return P;
5354 }
5355 }
5356 }
5357
5358 if (!IsScalableVec && Q.DL.getTypeAllocSize(LastType) == 1 &&
5359 all_of(Indices.drop_back(1), match_fn(m_Zero()))) {
5360 unsigned IdxWidth =
5362 if (Q.DL.getTypeSizeInBits(Indices.back()->getType()) == IdxWidth) {
5363 APInt BasePtrOffset(IdxWidth, 0);
5364 Value *StrippedBasePtr =
5365 Ptr->stripAndAccumulateInBoundsConstantOffsets(Q.DL, BasePtrOffset);
5366
5367 // Avoid creating inttoptr of zero here: While LLVMs treatment of
5368 // inttoptr is generally conservative, this particular case is folded to
5369 // a null pointer, which will have incorrect provenance.
5370
5371 // gep (gep V, C), (sub 0, V) -> C
5372 if (match(Indices.back(),
5373 m_Neg(m_PtrToInt(m_Specific(StrippedBasePtr)))) &&
5374 !BasePtrOffset.isZero()) {
5375 auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset);
5376 return ConstantExpr::getIntToPtr(CI, GEPTy);
5377 }
5378 // gep (gep V, C), (xor V, -1) -> C-1
5379 if (match(Indices.back(),
5380 m_Xor(m_PtrToInt(m_Specific(StrippedBasePtr)), m_AllOnes())) &&
5381 !BasePtrOffset.isOne()) {
5382 auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset - 1);
5383 return ConstantExpr::getIntToPtr(CI, GEPTy);
5384 }
5385 }
5386 }
5387
5388 // Check to see if this is constant foldable.
5389 if (!isa<Constant>(Ptr) || !all_of(Indices, IsaPred<Constant>))
5390 return nullptr;
5391
5393 return ConstantFoldGetElementPtr(SrcTy, cast<Constant>(Ptr), std::nullopt,
5394 Indices);
5395
5396 auto *CE =
5397 ConstantExpr::getGetElementPtr(SrcTy, cast<Constant>(Ptr), Indices, NW);
5398 return ConstantFoldConstant(CE, Q.DL);
5399}
5400
5402 GEPNoWrapFlags NW, const SimplifyQuery &Q) {
5403 return ::simplifyGEPInst(SrcTy, Ptr, Indices, NW, Q, RecursionLimit);
5404}
5405
5406/// Given operands for an InsertValueInst, see if we can fold the result.
5407/// If not, this returns null.
5409 ArrayRef<unsigned> Idxs,
5410 const SimplifyQuery &Q, unsigned) {
5411 if (Constant *CAgg = dyn_cast<Constant>(Agg))
5412 if (Constant *CVal = dyn_cast<Constant>(Val))
5413 return ConstantFoldInsertValueInstruction(CAgg, CVal, Idxs);
5414
5415 // insertvalue x, poison, n -> x
5416 // insertvalue x, undef, n -> x if x cannot be poison
5417 if (isa<PoisonValue>(Val) ||
5418 (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Agg)))
5419 return Agg;
5420
5421 // insertvalue x, (extractvalue y, n), n
5423 if (EV->getAggregateOperand()->getType() == Agg->getType() &&
5424 EV->getIndices() == Idxs) {
5425 // insertvalue poison, (extractvalue y, n), n -> y
5426 // insertvalue undef, (extractvalue y, n), n -> y if y cannot be poison
5427 if (isa<PoisonValue>(Agg) ||
5428 (Q.isUndefValue(Agg) &&
5429 isGuaranteedNotToBePoison(EV->getAggregateOperand())))
5430 return EV->getAggregateOperand();
5431
5432 // insertvalue y, (extractvalue y, n), n -> y
5433 if (Agg == EV->getAggregateOperand())
5434 return Agg;
5435 }
5436
5437 return nullptr;
5438}
5439
5441 ArrayRef<unsigned> Idxs,
5442 const SimplifyQuery &Q) {
5443 return ::simplifyInsertValueInst(Agg, Val, Idxs, Q, RecursionLimit);
5444}
5445
5447 const SimplifyQuery &Q) {
5448 // Try to constant fold.
5449 auto *VecC = dyn_cast<Constant>(Vec);
5450 auto *ValC = dyn_cast<Constant>(Val);
5451 auto *IdxC = dyn_cast<Constant>(Idx);
5452 if (VecC && ValC && IdxC)
5453 return ConstantExpr::getInsertElement(VecC, ValC, IdxC);
5454
5455 // For fixed-length vector, fold into poison if index is out of bounds.
5456 if (auto *CI = dyn_cast<ConstantInt>(Idx)) {
5457 if (isa<FixedVectorType>(Vec->getType()) &&
5458 CI->uge(cast<FixedVectorType>(Vec->getType())->getNumElements()))
5459 return PoisonValue::get(Vec->getType());
5460 }
5461
5462 // If index is undef, it might be out of bounds (see above case)
5463 if (Q.isUndefValue(Idx))
5464 return PoisonValue::get(Vec->getType());
5465
5466 // If the scalar is poison, or it is undef and there is no risk of
5467 // propagating poison from the vector value, simplify to the vector value.
5468 if (isa<PoisonValue>(Val) ||
5469 (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Vec)))
5470 return Vec;
5471
5472 // Inserting the splatted value into a constant splat does nothing.
5473 if (VecC && ValC && VecC->getSplatValue() == ValC)
5474 return Vec;
5475
5476 // If we are extracting a value from a vector, then inserting it into the same
5477 // place, that's the input vector:
5478 // insertelt Vec, (extractelt Vec, Idx), Idx --> Vec
5479 if (match(Val, m_ExtractElt(m_Specific(Vec), m_Specific(Idx))))
5480 return Vec;
5481
5482 return nullptr;
5483}
5484
5485/// Given operands for an ExtractValueInst, see if we can fold the result.
5486/// If not, this returns null.
5488 const SimplifyQuery &, unsigned) {
5489 if (auto *CAgg = dyn_cast<Constant>(Agg))
5490 return ConstantFoldExtractValueInstruction(CAgg, Idxs);
5491
5492 // extractvalue x, (insertvalue y, elt, n), n -> elt
5493 unsigned NumIdxs = Idxs.size();
5495 for (auto *IVI = dyn_cast<InsertValueInst>(Agg); IVI != nullptr;
5496 IVI = dyn_cast<InsertValueInst>(IVI->getAggregateOperand())) {
5497 // Protect against insertvalue cycles in unreachable code.
5498 if (!VisitedSet.insert(IVI).second)
5499 break;
5500
5501 ArrayRef<unsigned> InsertValueIdxs = IVI->getIndices();
5502 unsigned NumInsertValueIdxs = InsertValueIdxs.size();
5503 unsigned NumCommonIdxs = std::min(NumInsertValueIdxs, NumIdxs);
5504 if (InsertValueIdxs.slice(0, NumCommonIdxs) ==
5505 Idxs.slice(0, NumCommonIdxs)) {
5506 if (NumIdxs == NumInsertValueIdxs)
5507 return IVI->getInsertedValueOperand();
5508 break;
5509 }
5510 }
5511
5512 // Simplify umul_with_overflow where one operand is 1.
5513 Value *V;
5514 if (Idxs.size() == 1 &&
5515 (match(Agg,
5518 m_Value(V))))) {
5519 if (Idxs[0] == 0)
5520 return V;
5521 assert(Idxs[0] == 1 && "invalid index");
5522 return getFalse(CmpInst::makeCmpResultType(V->getType()));
5523 }
5524
5525 return nullptr;
5526}
5527
5529 const SimplifyQuery &Q) {
5530 return ::simplifyExtractValueInst(Agg, Idxs, Q, RecursionLimit);
5531}
5532
5533/// Given operands for an ExtractElementInst, see if we can fold the result.
5534/// If not, this returns null.
5536 const SimplifyQuery &Q, unsigned) {
5537 auto *VecVTy = cast<VectorType>(Vec->getType());
5538 if (auto *CVec = dyn_cast<Constant>(Vec)) {
5539 if (auto *CIdx = dyn_cast<Constant>(Idx))
5540 return ConstantExpr::getExtractElement(CVec, CIdx);
5541
5542 if (Q.isUndefValue(Vec))
5543 return UndefValue::get(VecVTy->getElementType());
5544 }
5545
5546 // An undef extract index can be arbitrarily chosen to be an out-of-range
5547 // index value, which would result in the instruction being poison.
5548 if (Q.isUndefValue(Idx))
5549 return PoisonValue::get(VecVTy->getElementType());
5550
5551 // If extracting a specified index from the vector, see if we can recursively
5552 // find a previously computed scalar that was inserted into the vector.
5553 if (auto *IdxC = dyn_cast<ConstantInt>(Idx)) {
5554 // For fixed-length vector, fold into undef if index is out of bounds.
5555 unsigned MinNumElts = VecVTy->getElementCount().getKnownMinValue();
5556 if (isa<FixedVectorType>(VecVTy) && IdxC->getValue().uge(MinNumElts))
5557 return PoisonValue::get(VecVTy->getElementType());
5558 // Handle case where an element is extracted from a splat.
5559 if (IdxC->getValue().ult(MinNumElts))
5560 if (auto *Splat = getSplatValue(Vec))
5561 return Splat;
5562 if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue()))
5563 return Elt;
5564 } else {
5565 // extractelt x, (insertelt y, elt, n), n -> elt
5566 // If the possibly-variable indices are trivially known to be equal
5567 // (because they are the same operand) then use the value that was
5568 // inserted directly.
5569 auto *IE = dyn_cast<InsertElementInst>(Vec);
5570 if (IE && IE->getOperand(2) == Idx)
5571 return IE->getOperand(1);
5572
5573 // The index is not relevant if our vector is a splat.
5574 if (Value *Splat = getSplatValue(Vec))
5575 return Splat;
5576 }
5577 return nullptr;
5578}
5579
5581 const SimplifyQuery &Q) {
5582 return ::simplifyExtractElementInst(Vec, Idx, Q, RecursionLimit);
5583}
5584
5585/// See if we can fold the given phi. If not, returns null.
5587 const SimplifyQuery &Q) {
5588 // WARNING: no matter how worthwhile it may seem, we can not perform PHI CSE
5589 // here, because the PHI we may succeed simplifying to was not
5590 // def-reachable from the original PHI!
5591
5592 // If all of the PHI's incoming values are the same then replace the PHI node
5593 // with the common value.
5594 Value *CommonValue = nullptr;
5595 bool HasPoisonInput = false;
5596 bool HasUndefInput = false;
5597 for (Value *Incoming : IncomingValues) {
5598 // If the incoming value is the phi node itself, it can safely be skipped.
5599 if (Incoming == PN)
5600 continue;
5601 if (isa<PoisonValue>(Incoming)) {
5602 HasPoisonInput = true;
5603 continue;
5604 }
5605 if (Q.isUndefValue(Incoming)) {
5606 // Remember that we saw an undef value, but otherwise ignore them.
5607 HasUndefInput = true;
5608 continue;
5609 }
5610 if (CommonValue && Incoming != CommonValue)
5611 return nullptr; // Not the same, bail out.
5612 CommonValue = Incoming;
5613 }
5614
5615 // If CommonValue is null then all of the incoming values were either undef,
5616 // poison or equal to the phi node itself.
5617 if (!CommonValue)
5618 return HasUndefInput ? UndefValue::get(PN->getType())
5619 : PoisonValue::get(PN->getType());
5620
5621 if (HasPoisonInput || HasUndefInput) {
5622 // If we have a PHI node like phi(X, undef, X), where X is defined by some
5623 // instruction, we cannot return X as the result of the PHI node unless it
5624 // dominates the PHI block.
5625 if (!valueDominatesPHI(CommonValue, PN, Q.DT))
5626 return nullptr;
5627
5628 // Make sure we do not replace an undef value with poison.
5629 if (HasUndefInput &&
5630 !isGuaranteedNotToBePoison(CommonValue, Q.AC, Q.CxtI, Q.DT))
5631 return nullptr;
5632 return CommonValue;
5633 }
5634
5635 return CommonValue;
5636}
5637
5638static Value *simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
5639 const SimplifyQuery &Q, unsigned MaxRecurse) {
5640 if (auto *C = dyn_cast<Constant>(Op))
5641 return ConstantFoldCastOperand(CastOpc, C, Ty, Q.DL);
5642
5643 if (auto *CI = dyn_cast<CastInst>(Op)) {
5644 auto *Src = CI->getOperand(0);
5645 Type *SrcTy = Src->getType();
5646 Type *MidTy = CI->getType();
5647 Type *DstTy = Ty;
5648 if (Src->getType() == Ty) {
5649 auto FirstOp = CI->getOpcode();
5650 auto SecondOp = static_cast<Instruction::CastOps>(CastOpc);
5651 if (CastInst::isEliminableCastPair(FirstOp, SecondOp, SrcTy, MidTy, DstTy,
5652 &Q.DL) == Instruction::BitCast)
5653 return Src;
5654 }
5655 }
5656
5657 // bitcast x -> x
5658 if (CastOpc == Instruction::BitCast)
5659 if (Op->getType() == Ty)
5660 return Op;
5661
5662 // ptrtoint (ptradd (Ptr, X - ptrtoint(Ptr))) -> X
5663 Value *Ptr, *X;
5664 if ((CastOpc == Instruction::PtrToInt || CastOpc == Instruction::PtrToAddr) &&
5665 match(Op,
5666 m_PtrAdd(m_Value(Ptr),
5668 X->getType() == Ty && Ty == Q.DL.getIndexType(Ptr->getType()))
5669 return X;
5670
5671 // Fold a value-preserving zext/sext of a trunc back to the original value.
5672 if (CastOpc == Instruction::ZExt || CastOpc == Instruction::SExt) {
5673 if (auto *Trunc = dyn_cast<TruncInst>(Op)) {
5674 Value *Src = Trunc->getOperand(0);
5675 bool NoWrap = CastOpc == Instruction::ZExt ? Trunc->hasNoUnsignedWrap()
5676 : Trunc->hasNoSignedWrap();
5677 if (Src->getType() == Ty && NoWrap)
5678 return Src;
5679 }
5680 }
5681
5682 return nullptr;
5683}
5684
5685Value *llvm::simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
5686 const SimplifyQuery &Q) {
5687 return ::simplifyCastInst(CastOpc, Op, Ty, Q, RecursionLimit);
5688}
5689
5690/// For the given destination element of a shuffle, peek through shuffles to
5691/// match a root vector source operand that contains that element in the same
5692/// vector lane (ie, the same mask index), so we can eliminate the shuffle(s).
5693static Value *foldIdentityShuffles(int DestElt, Value *Op0, Value *Op1,
5694 int MaskVal, Value *RootVec,
5695 unsigned MaxRecurse) {
5696 if (!MaxRecurse--)
5697 return nullptr;
5698
5699 // Bail out if any mask value is undefined. That kind of shuffle may be
5700 // simplified further based on demanded bits or other folds.
5701 if (MaskVal == -1)
5702 return nullptr;
5703
5704 // The mask value chooses which source operand we need to look at next.
5705 int InVecNumElts = cast<FixedVectorType>(Op0->getType())->getNumElements();
5706 int RootElt = MaskVal;
5707 Value *SourceOp = Op0;
5708 if (MaskVal >= InVecNumElts) {
5709 RootElt = MaskVal - InVecNumElts;
5710 SourceOp = Op1;
5711 }
5712
5713 // If the source operand is a shuffle itself, look through it to find the
5714 // matching root vector.
5715 if (auto *SourceShuf = dyn_cast<ShuffleVectorInst>(SourceOp)) {
5716 return foldIdentityShuffles(
5717 DestElt, SourceShuf->getOperand(0), SourceShuf->getOperand(1),
5718 SourceShuf->getMaskValue(RootElt), RootVec, MaxRecurse);
5719 }
5720
5721 // The source operand is not a shuffle. Initialize the root vector value for
5722 // this shuffle if that has not been done yet.
5723 if (!RootVec)
5724 RootVec = SourceOp;
5725
5726 // Give up as soon as a source operand does not match the existing root value.
5727 if (RootVec != SourceOp)
5728 return nullptr;
5729
5730 // The element must be coming from the same lane in the source vector
5731 // (although it may have crossed lanes in intermediate shuffles).
5732 if (RootElt != DestElt)
5733 return nullptr;
5734
5735 return RootVec;
5736}
5737
5739 ArrayRef<int> Mask, Type *RetTy,
5740 const SimplifyQuery &Q,
5741 unsigned MaxRecurse) {
5742 if (all_of(Mask, equal_to(PoisonMaskElem)))
5743 return PoisonValue::get(RetTy);
5744
5745 auto *InVecTy = cast<VectorType>(Op0->getType());
5746 unsigned MaskNumElts = Mask.size();
5747 ElementCount InVecEltCount = InVecTy->getElementCount();
5748
5749 bool Scalable = InVecEltCount.isScalable();
5750
5751 SmallVector<int, 32> Indices;
5752 Indices.assign(Mask.begin(), Mask.end());
5753
5754 // Canonicalization: If mask does not select elements from an input vector,
5755 // replace that input vector with poison.
5756 if (!Scalable) {
5757 bool MaskSelects0 = false, MaskSelects1 = false;
5758 unsigned InVecNumElts = InVecEltCount.getKnownMinValue();
5759 for (unsigned i = 0; i != MaskNumElts; ++i) {
5760 if (Indices[i] == -1)
5761 continue;
5762 if ((unsigned)Indices[i] < InVecNumElts)
5763 MaskSelects0 = true;
5764 else
5765 MaskSelects1 = true;
5766 }
5767 if (!MaskSelects0)
5768 Op0 = PoisonValue::get(InVecTy);
5769 if (!MaskSelects1)
5770 Op1 = PoisonValue::get(InVecTy);
5771 }
5772
5773 auto *Op0Const = dyn_cast<Constant>(Op0);
5774 auto *Op1Const = dyn_cast<Constant>(Op1);
5775
5776 // If all operands are constant, constant fold the shuffle. This
5777 // transformation depends on the value of the mask which is not known at
5778 // compile time for scalable vectors
5779 if (Op0Const && Op1Const)
5780 return ConstantExpr::getShuffleVector(Op0Const, Op1Const, Mask);
5781
5782 // Canonicalization: if only one input vector is constant, it shall be the
5783 // second one. This transformation depends on the value of the mask which
5784 // is not known at compile time for scalable vectors
5785 if (!Scalable && Op0Const && !Op1Const) {
5786 std::swap(Op0, Op1);
5788 InVecEltCount.getKnownMinValue());
5789 }
5790
5791 // A splat of an inserted scalar constant becomes a vector constant:
5792 // shuf (inselt ?, C, IndexC), undef, <IndexC, IndexC...> --> <C, C...>
5793 // NOTE: We may have commuted above, so analyze the updated Indices, not the
5794 // original mask constant.
5795 // NOTE: This transformation depends on the value of the mask which is not
5796 // known at compile time for scalable vectors
5797 Constant *C;
5798 ConstantInt *IndexC;
5799 if (!Scalable && match(Op0, m_InsertElt(m_Value(), m_Constant(C),
5800 m_ConstantInt(IndexC)))) {
5801 // Match a splat shuffle mask of the insert index allowing undef elements.
5802 int InsertIndex = IndexC->getZExtValue();
5803 if (all_of(Indices, [InsertIndex](int MaskElt) {
5804 return MaskElt == InsertIndex || MaskElt == -1;
5805 })) {
5806 assert(isa<UndefValue>(Op1) && "Expected undef operand 1 for splat");
5807
5808 // Shuffle mask poisons become poison constant result elements.
5809 SmallVector<Constant *, 16> VecC(MaskNumElts, C);
5810 for (unsigned i = 0; i != MaskNumElts; ++i)
5811 if (Indices[i] == -1)
5812 VecC[i] = PoisonValue::get(C->getType());
5813 return ConstantVector::get(VecC);
5814 }
5815 }
5816
5817 // A shuffle of a splat is always the splat itself. Legal if the shuffle's
5818 // value type is same as the input vectors' type.
5819 if (auto *OpShuf = dyn_cast<ShuffleVectorInst>(Op0))
5820 if (Q.isUndefValue(Op1) && RetTy == InVecTy &&
5821 all_equal(OpShuf->getShuffleMask()))
5822 return Op0;
5823
5824 // All remaining transformation depend on the value of the mask, which is
5825 // not known at compile time for scalable vectors.
5826 if (Scalable)
5827 return nullptr;
5828
5829 // Don't fold a shuffle with undef mask elements. This may get folded in a
5830 // better way using demanded bits or other analysis.
5831 // TODO: Should we allow this?
5832 if (is_contained(Indices, -1))
5833 return nullptr;
5834
5835 // Check if every element of this shuffle can be mapped back to the
5836 // corresponding element of a single root vector. If so, we don't need this
5837 // shuffle. This handles simple identity shuffles as well as chains of
5838 // shuffles that may widen/narrow and/or move elements across lanes and back.
5839 Value *RootVec = nullptr;
5840 for (unsigned i = 0; i != MaskNumElts; ++i) {
5841 // Note that recursion is limited for each vector element, so if any element
5842 // exceeds the limit, this will fail to simplify.
5843 RootVec =
5844 foldIdentityShuffles(i, Op0, Op1, Indices[i], RootVec, MaxRecurse);
5845
5846 // We can't replace a widening/narrowing shuffle with one of its operands.
5847 if (!RootVec || RootVec->getType() != RetTy)
5848 return nullptr;
5849 }
5850 return RootVec;
5851}
5852
5853/// Given operands for a ShuffleVectorInst, fold the result or return null.
5855 ArrayRef<int> Mask, Type *RetTy,
5856 const SimplifyQuery &Q) {
5857 return ::simplifyShuffleVectorInst(Op0, Op1, Mask, RetTy, Q, RecursionLimit);
5858}
5859
5861 const SimplifyQuery &Q) {
5862 if (auto *C = dyn_cast<Constant>(Op))
5863 return ConstantFoldUnaryOpOperand(Opcode, C, Q.DL);
5864 return nullptr;
5865}
5866
5867/// Given the operand for an FNeg, see if we can fold the result. If not, this
5868/// returns null.
5870 const SimplifyQuery &Q, unsigned MaxRecurse) {
5871 if (Constant *C = foldConstant(Instruction::FNeg, Op, Q))
5872 return C;
5873
5874 Value *X;
5875 // fneg (fneg X) ==> X
5876 if (match(Op, m_FNeg(m_Value(X))))
5877 return X;
5878
5879 return nullptr;
5880}
5881
5883 const SimplifyQuery &Q) {
5884 return ::simplifyFNegInst(Op, FMF, Q, RecursionLimit);
5885}
5886
5887/// Try to propagate existing NaN values when possible. If not, replace the
5888/// constant or elements in the constant with a canonical NaN.
5890 Type *Ty = In->getType();
5891 if (auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
5892 unsigned NumElts = VecTy->getNumElements();
5893 SmallVector<Constant *, 32> NewC(NumElts);
5894 for (unsigned i = 0; i != NumElts; ++i) {
5895 Constant *EltC = In->getAggregateElement(i);
5896 // Poison elements propagate. NaN propagates except signaling is quieted.
5897 // Replace unknown or undef elements with canonical NaN.
5898 if (EltC && isa<PoisonValue>(EltC))
5899 NewC[i] = EltC;
5900 else if (EltC && EltC->isNaN())
5901 NewC[i] = ConstantFP::get(
5902 EltC->getType(), cast<ConstantFP>(EltC)->getValue().makeQuiet());
5903 else
5904 NewC[i] = ConstantFP::getNaN(VecTy->getElementType());
5905 }
5906 return ConstantVector::get(NewC);
5907 }
5908
5909 // If it is not a fixed vector, but not a simple NaN either, return a
5910 // canonical NaN.
5911 if (!In->isNaN())
5912 return ConstantFP::getNaN(Ty);
5913
5914 // If we known this is a NaN, and it's scalable vector, we must have a splat
5915 // on our hands. Grab that before splatting a QNaN constant.
5916 if (isa<ScalableVectorType>(Ty)) {
5917 auto *Splat = In->getSplatValue();
5918 assert(Splat && Splat->isNaN() &&
5919 "Found a scalable-vector NaN but not a splat");
5920 In = Splat;
5921 }
5922
5923 // Propagate an existing QNaN constant. If it is an SNaN, make it quiet, but
5924 // preserve the sign/payload.
5925 return ConstantFP::get(Ty, cast<ConstantFP>(In)->getValue().makeQuiet());
5926}
5927
5928/// Perform folds that are common to any floating-point operation. This implies
5929/// transforms based on poison/undef/NaN because the operation itself makes no
5930/// difference to the result.
5932 const SimplifyQuery &Q,
5933 fp::ExceptionBehavior ExBehavior,
5934 RoundingMode Rounding) {
5935 // Poison is independent of anything else. It always propagates from an
5936 // operand to a math result.
5938 return PoisonValue::get(Ops[0]->getType());
5939
5940 for (Value *V : Ops) {
5941 bool IsNan = match(V, m_NaN());
5942 bool IsInf = match(V, m_Inf());
5943 bool IsUndef = Q.isUndefValue(V);
5944
5945 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
5946 // (an undef operand can be chosen to be Nan/Inf), then the result of
5947 // this operation is poison.
5948 if (FMF.noNaNs() && (IsNan || IsUndef))
5949 return PoisonValue::get(V->getType());
5950 if (FMF.noInfs() && (IsInf || IsUndef))
5951 return PoisonValue::get(V->getType());
5952
5953 if (isDefaultFPEnvironment(ExBehavior, Rounding)) {
5954 // Undef does not propagate because undef means that all bits can take on
5955 // any value. If this is undef * NaN for example, then the result values
5956 // (at least the exponent bits) are limited. Assume the undef is a
5957 // canonical NaN and propagate that.
5958 if (IsUndef)
5959 return ConstantFP::getNaN(V->getType());
5960 if (IsNan)
5961 return propagateNaN(cast<Constant>(V));
5962 } else if (ExBehavior != fp::ebStrict) {
5963 if (IsNan)
5964 return propagateNaN(cast<Constant>(V));
5965 }
5966 }
5967 return nullptr;
5968}
5969
5970/// Given operands for an FAdd, see if we can fold the result. If not, this
5971/// returns null.
5972static Value *
5974 const SimplifyQuery &Q, unsigned MaxRecurse,
5977 if (isDefaultFPEnvironment(ExBehavior, Rounding))
5978 if (Constant *C = foldOrCommuteConstant(Instruction::FAdd, Op0, Op1, Q))
5979 return C;
5980
5981 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
5982 return C;
5983
5984 // fadd X, -0 ==> X
5985 // With strict/constrained FP, we have these possible edge cases that do
5986 // not simplify to Op0:
5987 // fadd SNaN, -0.0 --> QNaN
5988 // fadd +0.0, -0.0 --> -0.0 (but only with round toward negative)
5989 if (canIgnoreSNaN(ExBehavior, FMF) &&
5991 FMF.noSignedZeros()))
5992 if (match(Op1, m_NegZeroFP()))
5993 return Op0;
5994
5995 // fadd X, 0 ==> X, when we know X is not -0
5996 if (canIgnoreSNaN(ExBehavior, FMF))
5997 if (match(Op1, m_PosZeroFP()) &&
5998 (FMF.noSignedZeros() || cannotBeNegativeZero(Op0, Q)))
5999 return Op0;
6000
6001 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6002 return nullptr;
6003
6004 if (FMF.noNaNs()) {
6005 // With nnan: X + {+/-}Inf --> {+/-}Inf
6006 if (match(Op1, m_Inf()))
6007 return Op1;
6008
6009 // With nnan: -X + X --> 0.0 (and commuted variant)
6010 // We don't have to explicitly exclude infinities (ninf): INF + -INF == NaN.
6011 // Negative zeros are allowed because we always end up with positive zero:
6012 // X = -0.0: (-0.0 - (-0.0)) + (-0.0) == ( 0.0) + (-0.0) == 0.0
6013 // X = -0.0: ( 0.0 - (-0.0)) + (-0.0) == ( 0.0) + (-0.0) == 0.0
6014 // X = 0.0: (-0.0 - ( 0.0)) + ( 0.0) == (-0.0) + ( 0.0) == 0.0
6015 // X = 0.0: ( 0.0 - ( 0.0)) + ( 0.0) == ( 0.0) + ( 0.0) == 0.0
6016 if (match(Op0, m_FSub(m_AnyZeroFP(), m_Specific(Op1))) ||
6017 match(Op1, m_FSub(m_AnyZeroFP(), m_Specific(Op0))))
6018 return ConstantFP::getZero(Op0->getType());
6019
6020 if (match(Op0, m_FNeg(m_Specific(Op1))) ||
6021 match(Op1, m_FNeg(m_Specific(Op0))))
6022 return ConstantFP::getZero(Op0->getType());
6023 }
6024
6025 // (X - Y) + Y --> X
6026 // Y + (X - Y) --> X
6027 Value *X;
6028 if (FMF.noSignedZeros() && FMF.allowReassoc() &&
6029 (match(Op0, m_FSub(m_Value(X), m_Specific(Op1))) ||
6030 match(Op1, m_FSub(m_Value(X), m_Specific(Op0)))))
6031 return X;
6032
6033 return nullptr;
6034}
6035
6036/// Given operands for an FSub, see if we can fold the result. If not, this
6037/// returns null.
6038static Value *
6040 const SimplifyQuery &Q, unsigned MaxRecurse,
6043 if (isDefaultFPEnvironment(ExBehavior, Rounding))
6044 if (Constant *C = foldOrCommuteConstant(Instruction::FSub, Op0, Op1, Q))
6045 return C;
6046
6047 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
6048 return C;
6049
6050 // fsub X, +0 ==> X
6051 if (canIgnoreSNaN(ExBehavior, FMF) &&
6053 FMF.noSignedZeros()))
6054 if (match(Op1, m_PosZeroFP()))
6055 return Op0;
6056
6057 // fsub X, -0 ==> X, when we know X is not -0
6058 if (canIgnoreSNaN(ExBehavior, FMF))
6059 if (match(Op1, m_NegZeroFP()) &&
6060 (FMF.noSignedZeros() || cannotBeNegativeZero(Op0, Q)))
6061 return Op0;
6062
6063 // fsub -0.0, (fsub -0.0, X) ==> X
6064 // fsub -0.0, (fneg X) ==> X
6065 Value *X;
6066 if (canIgnoreSNaN(ExBehavior, FMF))
6067 if (match(Op0, m_NegZeroFP()) && match(Op1, m_FNeg(m_Value(X))))
6068 return X;
6069
6070 // fsub 0.0, (fsub 0.0, X) ==> X if signed zeros are ignored.
6071 // fsub 0.0, (fneg X) ==> X if signed zeros are ignored.
6072 if (canIgnoreSNaN(ExBehavior, FMF))
6073 if (FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()) &&
6074 (match(Op1, m_FSub(m_AnyZeroFP(), m_Value(X))) ||
6075 match(Op1, m_FNeg(m_Value(X)))))
6076 return X;
6077
6078 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6079 return nullptr;
6080
6081 if (FMF.noNaNs()) {
6082 // fsub nnan x, x ==> 0.0
6083 if (Op0 == Op1)
6084 return Constant::getNullValue(Op0->getType());
6085
6086 // With nnan: {+/-}Inf - X --> {+/-}Inf
6087 if (match(Op0, m_Inf()))
6088 return Op0;
6089
6090 // With nnan: X - {+/-}Inf --> {-/+}Inf
6091 if (match(Op1, m_Inf()))
6092 return foldConstant(Instruction::FNeg, Op1, Q);
6093 }
6094
6095 // Y - (Y - X) --> X
6096 // (X + Y) - Y --> X
6097 if (FMF.noSignedZeros() && FMF.allowReassoc() &&
6098 (match(Op1, m_FSub(m_Specific(Op0), m_Value(X))) ||
6099 match(Op0, m_c_FAdd(m_Specific(Op1), m_Value(X)))))
6100 return X;
6101
6102 return nullptr;
6103}
6104
6106 const SimplifyQuery &Q, unsigned MaxRecurse,
6107 fp::ExceptionBehavior ExBehavior,
6108 RoundingMode Rounding) {
6109 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
6110 return C;
6111
6112 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6113 return nullptr;
6114
6115 // Canonicalize special constants as operand 1.
6116 if (match(Op0, m_FPOne()) || match(Op0, m_AnyZeroFP()))
6117 std::swap(Op0, Op1);
6118
6119 // X * 1.0 --> X
6120 if (match(Op1, m_FPOne()))
6121 return Op0;
6122
6123 if (match(Op1, m_AnyZeroFP())) {
6124 // X * 0.0 --> 0.0 (with nnan and nsz)
6125 if (FMF.noNaNs() && FMF.noSignedZeros())
6126 return ConstantFP::getZero(Op0->getType());
6127
6129 if (Known.isKnownNever(fcInf | fcNan)) {
6130 // if nsz is set, return 0.0
6131 if (FMF.noSignedZeros())
6132 return ConstantFP::getZero(Op0->getType());
6133 // +normal number * (-)0.0 --> (-)0.0
6134 if (Known.SignBit == false)
6135 return Op1;
6136 // -normal number * (-)0.0 --> -(-)0.0
6137 if (Known.SignBit == true)
6138 return foldConstant(Instruction::FNeg, Op1, Q);
6139 }
6140 }
6141
6142 // sqrt(X) * sqrt(X) --> X, if we can:
6143 // 1. Remove the intermediate rounding (reassociate).
6144 // 2. Ignore non-zero negative numbers because sqrt would produce NAN.
6145 // 3. Ignore -0.0 because sqrt(-0.0) == -0.0, but -0.0 * -0.0 == 0.0.
6146 Value *X;
6147 if (Op0 == Op1 && match(Op0, m_Sqrt(m_Value(X))) && FMF.allowReassoc() &&
6148 FMF.noNaNs() && FMF.noSignedZeros())
6149 return X;
6150
6151 return nullptr;
6152}
6153
6154/// Given the operands for an FMul, see if we can fold the result
6155static Value *
6157 const SimplifyQuery &Q, unsigned MaxRecurse,
6160 if (isDefaultFPEnvironment(ExBehavior, Rounding))
6161 if (Constant *C = foldOrCommuteConstant(Instruction::FMul, Op0, Op1, Q))
6162 return C;
6163
6164 // Now apply simplifications that do not require rounding.
6165 return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding);
6166}
6167
6169 const SimplifyQuery &Q,
6170 fp::ExceptionBehavior ExBehavior,
6171 RoundingMode Rounding) {
6172 return ::simplifyFAddInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6173 Rounding);
6174}
6175
6177 const SimplifyQuery &Q,
6178 fp::ExceptionBehavior ExBehavior,
6179 RoundingMode Rounding) {
6180 return ::simplifyFSubInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6181 Rounding);
6182}
6183
6185 const SimplifyQuery &Q,
6186 fp::ExceptionBehavior ExBehavior,
6187 RoundingMode Rounding) {
6188 return ::simplifyFMulInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6189 Rounding);
6190}
6191
6193 const SimplifyQuery &Q,
6194 fp::ExceptionBehavior ExBehavior,
6195 RoundingMode Rounding) {
6196 return ::simplifyFMAFMul(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6197 Rounding);
6198}
6199
6200static Value *
6202 const SimplifyQuery &Q, unsigned,
6205 if (isDefaultFPEnvironment(ExBehavior, Rounding))
6206 if (Constant *C = foldOrCommuteConstant(Instruction::FDiv, Op0, Op1, Q))
6207 return C;
6208
6209 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
6210 return C;
6211
6212 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6213 return nullptr;
6214
6215 // X / 1.0 -> X
6216 if (match(Op1, m_FPOne()))
6217 return Op0;
6218
6219 // 0 / X -> 0
6220 // Requires that NaNs are off (X could be zero) and signed zeroes are
6221 // ignored (X could be positive or negative, so the output sign is unknown).
6222 if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()))
6223 return ConstantFP::getZero(Op0->getType());
6224
6225 if (FMF.noNaNs()) {
6226 // X / X -> 1.0 is legal when NaNs are ignored.
6227 // We can ignore infinities because INF/INF is NaN.
6228 if (Op0 == Op1)
6229 return ConstantFP::get(Op0->getType(), 1.0);
6230
6231 // (X * Y) / Y --> X if we can reassociate to the above form.
6232 Value *X;
6233 if (FMF.allowReassoc() && match(Op0, m_c_FMul(m_Value(X), m_Specific(Op1))))
6234 return X;
6235
6236 // -X / X -> -1.0 and
6237 // X / -X -> -1.0 are legal when NaNs are ignored.
6238 // We can ignore signed zeros because +-0.0/+-0.0 is NaN and ignored.
6239 if (match(Op0, m_FNegNSZ(m_Specific(Op1))) ||
6240 match(Op1, m_FNegNSZ(m_Specific(Op0))))
6241 return ConstantFP::get(Op0->getType(), -1.0);
6242
6243 // nnan ninf X / [-]0.0 -> poison
6244 if (FMF.noInfs() && match(Op1, m_AnyZeroFP()))
6245 return PoisonValue::get(Op1->getType());
6246 }
6247
6248 return nullptr;
6249}
6250
6252 const SimplifyQuery &Q,
6253 fp::ExceptionBehavior ExBehavior,
6254 RoundingMode Rounding) {
6255 return ::simplifyFDivInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6256 Rounding);
6257}
6258
6259static Value *
6261 const SimplifyQuery &Q, unsigned,
6264 if (isDefaultFPEnvironment(ExBehavior, Rounding))
6265 if (Constant *C = foldOrCommuteConstant(Instruction::FRem, Op0, Op1, Q))
6266 return C;
6267
6268 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding))
6269 return C;
6270
6271 if (!isDefaultFPEnvironment(ExBehavior, Rounding))
6272 return nullptr;
6273
6274 // Unlike fdiv, the result of frem always matches the sign of the dividend.
6275 // The constant match may include undef elements in a vector, so return a full
6276 // zero constant as the result.
6277 if (FMF.noNaNs()) {
6278 // +0 % X -> 0
6279 if (match(Op0, m_PosZeroFP()))
6280 return ConstantFP::getZero(Op0->getType());
6281 // -0 % X -> -0
6282 if (match(Op0, m_NegZeroFP()))
6283 return ConstantFP::getNegativeZero(Op0->getType());
6284 }
6285
6286 return nullptr;
6287}
6288
6290 const SimplifyQuery &Q,
6291 fp::ExceptionBehavior ExBehavior,
6292 RoundingMode Rounding) {
6293 return ::simplifyFRemInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior,
6294 Rounding);
6295}
6296
6297//=== Helper functions for higher up the class hierarchy.
6298
6299/// Given the operand for a UnaryOperator, see if we can fold the result.
6300/// If not, this returns null.
6301static Value *simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q,
6302 unsigned MaxRecurse) {
6303 switch (Opcode) {
6304 case Instruction::FNeg:
6305 return simplifyFNegInst(Op, FastMathFlags(), Q, MaxRecurse);
6306 default:
6307 llvm_unreachable("Unexpected opcode");
6308 }
6309}
6310
6311/// Given the operand for a UnaryOperator, see if we can fold the result.
6312/// If not, this returns null.
6313/// Try to use FastMathFlags when folding the result.
6314static Value *simplifyFPUnOp(unsigned Opcode, Value *Op,
6315 const FastMathFlags &FMF, const SimplifyQuery &Q,
6316 unsigned MaxRecurse) {
6317 switch (Opcode) {
6318 case Instruction::FNeg:
6319 return simplifyFNegInst(Op, FMF, Q, MaxRecurse);
6320 default:
6321 return simplifyUnOp(Opcode, Op, Q, MaxRecurse);
6322 }
6323}
6324
6325Value *llvm::simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q) {
6326 return ::simplifyUnOp(Opcode, Op, Q, RecursionLimit);
6327}
6328
6330 const SimplifyQuery &Q) {
6331 return ::simplifyFPUnOp(Opcode, Op, FMF, Q, RecursionLimit);
6332}
6333
6334/// Given operands for a BinaryOperator, see if we can fold the result.
6335/// If not, this returns null.
6336static Value *simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6337 const SimplifyQuery &Q, unsigned MaxRecurse) {
6338 switch (Opcode) {
6339 case Instruction::Add:
6340 return simplifyAddInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6341 MaxRecurse);
6342 case Instruction::Sub:
6343 return simplifySubInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6344 MaxRecurse);
6345 case Instruction::Mul:
6346 return simplifyMulInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6347 MaxRecurse);
6348 case Instruction::SDiv:
6349 return simplifySDivInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6350 case Instruction::UDiv:
6351 return simplifyUDivInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6352 case Instruction::SRem:
6353 return simplifySRemInst(LHS, RHS, Q, MaxRecurse);
6354 case Instruction::URem:
6355 return simplifyURemInst(LHS, RHS, Q, MaxRecurse);
6356 case Instruction::Shl:
6357 return simplifyShlInst(LHS, RHS, /* IsNSW */ false, /* IsNUW */ false, Q,
6358 MaxRecurse);
6359 case Instruction::LShr:
6360 return simplifyLShrInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6361 case Instruction::AShr:
6362 return simplifyAShrInst(LHS, RHS, /* IsExact */ false, Q, MaxRecurse);
6363 case Instruction::And:
6364 return simplifyAndInst(LHS, RHS, Q, MaxRecurse);
6365 case Instruction::Or:
6366 return simplifyOrInst(LHS, RHS, Q, MaxRecurse);
6367 case Instruction::Xor:
6368 return simplifyXorInst(LHS, RHS, Q, MaxRecurse);
6369 case Instruction::FAdd:
6370 return simplifyFAddInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6371 case Instruction::FSub:
6372 return simplifyFSubInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6373 case Instruction::FMul:
6374 return simplifyFMulInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6375 case Instruction::FDiv:
6376 return simplifyFDivInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6377 case Instruction::FRem:
6378 return simplifyFRemInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6379 default:
6380 llvm_unreachable("Unexpected opcode");
6381 }
6382}
6383
6384/// Given operands for a BinaryOperator, see if we can fold the result.
6385/// If not, this returns null.
6386/// Try to use FastMathFlags when folding the result.
6387static Value *simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6388 const FastMathFlags &FMF, const SimplifyQuery &Q,
6389 unsigned MaxRecurse) {
6390 switch (Opcode) {
6391 case Instruction::FAdd:
6392 return simplifyFAddInst(LHS, RHS, FMF, Q, MaxRecurse);
6393 case Instruction::FSub:
6394 return simplifyFSubInst(LHS, RHS, FMF, Q, MaxRecurse);
6395 case Instruction::FMul:
6396 return simplifyFMulInst(LHS, RHS, FMF, Q, MaxRecurse);
6397 case Instruction::FDiv:
6398 return simplifyFDivInst(LHS, RHS, FMF, Q, MaxRecurse);
6399 default:
6400 return simplifyBinOp(Opcode, LHS, RHS, Q, MaxRecurse);
6401 }
6402}
6403
6404Value *llvm::simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6405 const SimplifyQuery &Q) {
6406 return ::simplifyBinOp(Opcode, LHS, RHS, Q, RecursionLimit);
6407}
6408
6409Value *llvm::simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
6410 FastMathFlags FMF, const SimplifyQuery &Q) {
6411 return ::simplifyBinOp(Opcode, LHS, RHS, FMF, Q, RecursionLimit);
6412}
6413
6414/// Given operands for a CmpInst, see if we can fold the result.
6416 const SimplifyQuery &Q, unsigned MaxRecurse) {
6418 return simplifyICmpInst(Predicate, LHS, RHS, Q, MaxRecurse);
6419 return simplifyFCmpInst(Predicate, LHS, RHS, FastMathFlags(), Q, MaxRecurse);
6420}
6421
6423 const SimplifyQuery &Q) {
6424 return ::simplifyCmpInst(Predicate, LHS, RHS, Q, RecursionLimit);
6425}
6426
6428 switch (ID) {
6429 default:
6430 return false;
6431
6432 // Unary idempotent: f(f(x)) = f(x)
6433 case Intrinsic::fabs:
6434 case Intrinsic::floor:
6435 case Intrinsic::ceil:
6436 case Intrinsic::trunc:
6437 case Intrinsic::rint:
6438 case Intrinsic::nearbyint:
6439 case Intrinsic::round:
6440 case Intrinsic::roundeven:
6441 case Intrinsic::canonicalize:
6442 case Intrinsic::arithmetic_fence:
6443 return true;
6444 }
6445}
6446
6447/// Return true if the intrinsic rounds a floating-point value to an integral
6448/// floating-point value (not an integer type).
6450 switch (ID) {
6451 default:
6452 return false;
6453
6454 case Intrinsic::floor:
6455 case Intrinsic::ceil:
6456 case Intrinsic::trunc:
6457 case Intrinsic::rint:
6458 case Intrinsic::nearbyint:
6459 case Intrinsic::round:
6460 case Intrinsic::roundeven:
6461 return true;
6462 }
6463}
6464
6466 const DataLayout &DL) {
6467 GlobalValue *PtrSym;
6468 APInt PtrOffset;
6469 if (!IsConstantOffsetFromGlobal(Ptr, PtrSym, PtrOffset, DL))
6470 return nullptr;
6471
6472 Type *Int32Ty = Type::getInt32Ty(Ptr->getContext());
6473
6474 auto *OffsetConstInt = dyn_cast<ConstantInt>(Offset);
6475 if (!OffsetConstInt || OffsetConstInt->getBitWidth() > 64)
6476 return nullptr;
6477
6478 APInt OffsetInt = OffsetConstInt->getValue().sextOrTrunc(
6479 DL.getIndexTypeSizeInBits(Ptr->getType()));
6480 if (OffsetInt.srem(4) != 0)
6481 return nullptr;
6482
6483 Constant *Loaded =
6484 ConstantFoldLoadFromConstPtr(Ptr, Int32Ty, std::move(OffsetInt), DL);
6485 if (!Loaded)
6486 return nullptr;
6487
6488 auto *LoadedCE = dyn_cast<ConstantExpr>(Loaded);
6489 if (!LoadedCE)
6490 return nullptr;
6491
6492 if (LoadedCE->getOpcode() == Instruction::Trunc) {
6493 LoadedCE = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6494 if (!LoadedCE)
6495 return nullptr;
6496 }
6497
6498 if (LoadedCE->getOpcode() != Instruction::Sub)
6499 return nullptr;
6500
6501 auto *LoadedLHS = dyn_cast<ConstantExpr>(LoadedCE->getOperand(0));
6502 if (!LoadedLHS || LoadedLHS->getOpcode() != Instruction::PtrToInt)
6503 return nullptr;
6504 auto *LoadedLHSPtr = LoadedLHS->getOperand(0);
6505
6506 Constant *LoadedRHS = LoadedCE->getOperand(1);
6507 GlobalValue *LoadedRHSSym;
6508 APInt LoadedRHSOffset;
6509 if (!IsConstantOffsetFromGlobal(LoadedRHS, LoadedRHSSym, LoadedRHSOffset,
6510 DL) ||
6511 PtrSym != LoadedRHSSym || PtrOffset != LoadedRHSOffset)
6512 return nullptr;
6513
6514 return LoadedLHSPtr;
6515}
6516
6517// TODO: Need to pass in FastMathFlags
6518static Value *simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q,
6519 bool IsStrict) {
6520 // ldexp(poison, x) -> poison
6521 // ldexp(x, poison) -> poison
6522 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1))
6523 return Op0;
6524
6525 // ldexp(undef, x) -> nan
6526 if (Q.isUndefValue(Op0))
6527 return ConstantFP::getNaN(Op0->getType());
6528
6529 if (!IsStrict) {
6530 // TODO: Could insert a canonicalize for strict
6531
6532 // ldexp(x, undef) -> x
6533 if (Q.isUndefValue(Op1))
6534 return Op0;
6535 }
6536
6537 const APFloat *C = nullptr;
6539
6540 // These cases should be safe, even with strictfp.
6541 // ldexp(0.0, x) -> 0.0
6542 // ldexp(-0.0, x) -> -0.0
6543 // ldexp(inf, x) -> inf
6544 // ldexp(-inf, x) -> -inf
6545 if (C && (C->isZero() || C->isInfinity()))
6546 return Op0;
6547
6548 // These are canonicalization dropping, could do it if we knew how we could
6549 // ignore denormal flushes and target handling of nan payload bits.
6550 if (IsStrict)
6551 return nullptr;
6552
6553 // TODO: Could quiet this with strictfp if the exception mode isn't strict.
6554 if (C && C->isNaN())
6555 return ConstantFP::get(Op0->getType(), C->makeQuiet());
6556
6557 // ldexp(x, 0) -> x
6558
6559 // TODO: Could fold this if we know the exception mode isn't
6560 // strict, we know the denormal mode and other target modes.
6561 if (match(Op1, PatternMatch::m_ZeroInt()))
6562 return Op0;
6563
6564 return nullptr;
6565}
6566
6568 FastMathFlags FMF,
6569 const SimplifyQuery &Q) {
6570 // Idempotent functions return the same result when called repeatedly.
6571 if (isIdempotent(IID))
6572 if (auto *II = dyn_cast<IntrinsicInst>(Op0))
6573 if (II->getIntrinsicID() == IID)
6574 return II;
6575
6576 if (removesFPFraction(IID)) {
6577 // Converting from int or calling a rounding function always results in a
6578 // finite integral number or infinity. For those inputs, rounding functions
6579 // always return the same value, so the (2nd) rounding is eliminated. Ex:
6580 // floor (sitofp x) -> sitofp x
6581 // round (ceil x) -> ceil x
6582 auto *II = dyn_cast<IntrinsicInst>(Op0);
6583 if ((II && removesFPFraction(II->getIntrinsicID())) ||
6584 match(Op0, m_IToFP(m_Value())))
6585 return Op0;
6586 }
6587
6588 Value *X;
6589 switch (IID) {
6590 case Intrinsic::fabs: {
6591 KnownFPClass KnownClass = computeKnownFPClass(Op0, fcAllFlags, Q);
6592 if (KnownClass.SignBit == false)
6593 return Op0;
6594
6595 if (KnownClass.cannotBeOrderedLessThanZero() &&
6596 KnownClass.isKnownNeverNaN() && FMF.noSignedZeros())
6597 return Op0;
6598
6599 break;
6600 }
6601 case Intrinsic::bswap:
6602 // bswap(bswap(x)) -> x
6603 if (match(Op0, m_BSwap(m_Value(X))))
6604 return X;
6605 break;
6606 case Intrinsic::bitreverse:
6607 // bitreverse(bitreverse(x)) -> x
6608 if (match(Op0, m_BitReverse(m_Value(X))))
6609 return X;
6610 break;
6611 case Intrinsic::ctpop: {
6612 // ctpop(X) -> 1 iff X is non-zero power of 2.
6613 if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ false, Q.AC, Q.CxtI, Q.DT))
6614 return ConstantInt::get(Op0->getType(), 1);
6615 // If everything but the lowest bit is zero, that bit is the pop-count. Ex:
6616 // ctpop(and X, 1) --> and X, 1
6617 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6619 Q))
6620 return Op0;
6621 break;
6622 }
6623 case Intrinsic::exp:
6624 // exp(log(x)) -> x
6625 if (FMF.allowReassoc() &&
6627 return X;
6628 break;
6629 case Intrinsic::exp2:
6630 // exp2(log2(x)) -> x
6631 if (FMF.allowReassoc() &&
6633 return X;
6634 break;
6635 case Intrinsic::exp10:
6636 // exp10(log10(x)) -> x
6637 if (FMF.allowReassoc() &&
6639 return X;
6640 break;
6641 case Intrinsic::log:
6642 // log(exp(x)) -> x
6643 if (FMF.allowReassoc() &&
6645 return X;
6646 break;
6647 case Intrinsic::log2:
6648 // log2(exp2(x)) -> x
6649 if (FMF.allowReassoc() &&
6651 match(Op0,
6653 return X;
6654 break;
6655 case Intrinsic::log10:
6656 // log10(pow(10.0, x)) -> x
6657 // log10(exp10(x)) -> x
6658 if (FMF.allowReassoc() &&
6660 match(Op0,
6662 return X;
6663 break;
6664 case Intrinsic::vector_reverse:
6665 // vector.reverse(vector.reverse(x)) -> x
6666 if (match(Op0, m_VecReverse(m_Value(X))))
6667 return X;
6668 // vector.reverse(splat(X)) -> splat(X)
6669 if (isSplatValue(Op0))
6670 return Op0;
6671 break;
6672 case Intrinsic::structured_gep:
6673 return Op0;
6674 default:
6675 break;
6676 }
6677
6678 return nullptr;
6679}
6680
6681/// Given a min/max intrinsic, see if it can be removed based on having an
6682/// operand that is another min/max intrinsic with shared operand(s). The caller
6683/// is expected to swap the operand arguments to handle commutation.
6685 Value *X, *Y;
6686 if (!match(Op0, m_MaxOrMin(m_Value(X), m_Value(Y))))
6687 return nullptr;
6688
6689 auto *MM0 = dyn_cast<IntrinsicInst>(Op0);
6690 if (!MM0)
6691 return nullptr;
6692 Intrinsic::ID IID0 = MM0->getIntrinsicID();
6693
6694 if (Op1 == X || Op1 == Y ||
6696 // max (max X, Y), X --> max X, Y
6697 if (IID0 == IID)
6698 return MM0;
6699 // max (min X, Y), X --> X
6700 if (IID0 == getInverseMinMaxIntrinsic(IID))
6701 return Op1;
6702 }
6703 return nullptr;
6704}
6705
6706/// Given a min/max intrinsic, see if it can be removed based on having an
6707/// operand that is another min/max intrinsic with shared operand(s). The caller
6708/// is expected to swap the operand arguments to handle commutation.
6710 Value *Op1) {
6711 auto IsMinimumMaximumIntrinsic = [](Intrinsic::ID ID) {
6712 switch (ID) {
6713 case Intrinsic::maxnum:
6714 case Intrinsic::minnum:
6715 case Intrinsic::maximum:
6716 case Intrinsic::minimum:
6717 case Intrinsic::maximumnum:
6718 case Intrinsic::minimumnum:
6719 return true;
6720 default:
6721 return false;
6722 }
6723 };
6724
6725 assert(IsMinimumMaximumIntrinsic(IID) && "Unsupported intrinsic");
6726
6727 auto *M0 = dyn_cast<IntrinsicInst>(Op0);
6728 // If Op0 is not the same intrinsic as IID, do not process.
6729 // This is a difference with integer min/max handling. We do not process the
6730 // case like max(min(X,Y),min(X,Y)) => min(X,Y). But it can be handled by GVN.
6731 if (!M0 || M0->getIntrinsicID() != IID)
6732 return nullptr;
6733 Value *X0 = M0->getOperand(0);
6734 Value *Y0 = M0->getOperand(1);
6735 // Simple case, m(m(X,Y), X) => m(X, Y)
6736 // m(m(X,Y), Y) => m(X, Y)
6737 // For minimum/maximum, X is NaN => m(NaN, Y) == NaN and m(NaN, NaN) == NaN.
6738 // For minimum/maximum, Y is NaN => m(X, NaN) == NaN and m(NaN, NaN) == NaN.
6739 // For minnum/maxnum, X is NaN => m(NaN, Y) == Y and m(Y, Y) == Y.
6740 // For minnum/maxnum, Y is NaN => m(X, NaN) == X and m(X, NaN) == X.
6741 if (X0 == Op1 || Y0 == Op1)
6742 return M0;
6743
6744 auto *M1 = dyn_cast<IntrinsicInst>(Op1);
6745 if (!M1 || !IsMinimumMaximumIntrinsic(M1->getIntrinsicID()))
6746 return nullptr;
6747 Value *X1 = M1->getOperand(0);
6748 Value *Y1 = M1->getOperand(1);
6749 Intrinsic::ID IID1 = M1->getIntrinsicID();
6750 // we have a case m(m(X,Y),m'(X,Y)) taking into account m' is commutative.
6751 // if m' is m or inversion of m => m(m(X,Y),m'(X,Y)) == m(X,Y).
6752 // For minimum/maximum, X is NaN => m(NaN,Y) == m'(NaN, Y) == NaN.
6753 // For minimum/maximum, Y is NaN => m(X,NaN) == m'(X, NaN) == NaN.
6754 // For minnum/maxnum, X is NaN => m(NaN,Y) == m'(NaN, Y) == Y.
6755 // For minnum/maxnum, Y is NaN => m(X,NaN) == m'(X, NaN) == X.
6756 if ((X0 == X1 && Y0 == Y1) || (X0 == Y1 && Y0 == X1))
6757 if (IID1 == IID || getInverseMinMaxIntrinsic(IID1) == IID)
6758 return M0;
6759
6760 return nullptr;
6761}
6762
6767 // For undef/poison, we can choose to either propgate undef/poison or
6768 // use the LHS value depending on what will allow more optimization.
6770};
6771// Get the optimized value for a min/max instruction with a single constant
6772// input (either undef or scalar constantFP). The result may indicate to
6773// use the non-const LHS value, use a new constant value instead (with NaNs
6774// quieted), or to choose either option in the case of undef/poison.
6776 const Intrinsic::ID IID,
6777 FastMathFlags FMF,
6778 Constant **OutNewConstVal) {
6779 assert(OutNewConstVal != nullptr);
6780
6781 bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
6782 bool PropagateSNaN = IID == Intrinsic::minnum || IID == Intrinsic::maxnum;
6783 bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
6784 IID == Intrinsic::minimumnum;
6785
6786 // min/max(x, poison) -> either x or poison
6787 if (isa<UndefValue>(RHSConst)) {
6788 *OutNewConstVal = const_cast<Constant *>(RHSConst);
6790 }
6791
6792 const ConstantFP *CFP = dyn_cast<ConstantFP>(RHSConst);
6793 if (!CFP)
6795 APFloat CAPF = CFP->getValueAPF();
6796
6797 // minnum(x, qnan) -> x
6798 // maxnum(x, qnan) -> x
6799 // minnum(x, snan) -> qnan
6800 // maxnum(x, snan) -> qnan
6801 // minimum(X, nan) -> qnan
6802 // maximum(X, nan) -> qnan
6803 // minimumnum(X, nan) -> x
6804 // maximumnum(X, nan) -> x
6805 if (CAPF.isNaN()) {
6806 if (PropagateNaN || (PropagateSNaN && CAPF.isSignaling())) {
6807 *OutNewConstVal = ConstantFP::get(CFP->getType(), CAPF.makeQuiet());
6809 }
6811 }
6812
6813 if (CAPF.isInfinity() || (FMF.noInfs() && CAPF.isLargest())) {
6814 // minnum(X, -inf) -> -inf (ignoring sNaN -> qNaN propagation)
6815 // maxnum(X, +inf) -> +inf (ignoring sNaN -> qNaN propagation)
6816 // minimum(X, -inf) -> -inf if nnan
6817 // maximum(X, +inf) -> +inf if nnan
6818 // minimumnum(X, -inf) -> -inf
6819 // maximumnum(X, +inf) -> +inf
6820 if (CAPF.isNegative() == IsMin && (!PropagateNaN || FMF.noNaNs())) {
6821 *OutNewConstVal = const_cast<Constant *>(RHSConst);
6823 }
6824
6825 // minnum(X, +inf) -> X if nnan
6826 // maxnum(X, -inf) -> X if nnan
6827 // minimum(X, +inf) -> X (ignoring quieting of sNaNs)
6828 // maximum(X, -inf) -> X (ignoring quieting of sNaNs)
6829 // minimumnum(X, +inf) -> X if nnan
6830 // maximumnum(X, -inf) -> X if nnan
6831 if (CAPF.isNegative() != IsMin && (PropagateNaN || FMF.noNaNs()))
6833 }
6835}
6836
6838 Value *Op0, Value *Op1) {
6839 Constant *C0 = dyn_cast<Constant>(Op0);
6840 Constant *C1 = dyn_cast<Constant>(Op1);
6841 unsigned Width = ReturnType->getPrimitiveSizeInBits();
6842
6843 // All false predicate or reduction of neutral values ==> neutral result.
6844 switch (IID) {
6845 case Intrinsic::aarch64_sve_eorv:
6846 case Intrinsic::aarch64_sve_orv:
6847 case Intrinsic::aarch64_sve_saddv:
6848 case Intrinsic::aarch64_sve_uaddv:
6849 case Intrinsic::aarch64_sve_umaxv:
6850 if ((C0 && C0->isNullValue()) || (C1 && C1->isNullValue()))
6851 return ConstantInt::get(ReturnType, 0);
6852 break;
6853 case Intrinsic::aarch64_sve_andv:
6854 case Intrinsic::aarch64_sve_uminv:
6855 if ((C0 && C0->isNullValue()) || (C1 && C1->isAllOnesValue()))
6856 return ConstantInt::get(ReturnType, APInt::getMaxValue(Width));
6857 break;
6858 case Intrinsic::aarch64_sve_smaxv:
6859 if ((C0 && C0->isNullValue()) || (C1 && C1->isMinSignedValue()))
6860 return ConstantInt::get(ReturnType, APInt::getSignedMinValue(Width));
6861 break;
6862 case Intrinsic::aarch64_sve_sminv:
6863 if ((C0 && C0->isNullValue()) || (C1 && C1->isMaxSignedValue()))
6864 return ConstantInt::get(ReturnType, APInt::getSignedMaxValue(Width));
6865 break;
6866 }
6867
6868 switch (IID) {
6869 case Intrinsic::aarch64_sve_andv:
6870 case Intrinsic::aarch64_sve_orv:
6871 case Intrinsic::aarch64_sve_smaxv:
6872 case Intrinsic::aarch64_sve_sminv:
6873 case Intrinsic::aarch64_sve_umaxv:
6874 case Intrinsic::aarch64_sve_uminv:
6875 // sve_reduce_##(all, splat(X)) ==> X
6876 if (C0 && C0->isAllOnesValue()) {
6877 if (Value *SplatVal = getSplatValue(Op1)) {
6878 assert(SplatVal->getType() == ReturnType && "Unexpected result type!");
6879 return SplatVal;
6880 }
6881 }
6882 break;
6883 case Intrinsic::aarch64_sve_eorv:
6884 // sve_reduce_xor(all, splat(X)) ==> 0
6885 if (C0 && C0->isAllOnesValue())
6886 if (getSplatValue(Op1))
6887 return ConstantInt::get(ReturnType, 0);
6888 break;
6889 }
6890
6891 return nullptr;
6892}
6893
6895 Value *Op0, Value *Op1, FastMathFlags FMF,
6896 const SimplifyQuery &Q) {
6897 unsigned BitWidth = ReturnType->getScalarSizeInBits();
6898 switch (IID) {
6899 case Intrinsic::get_active_lane_mask: {
6900 if (match(Op1, m_Zero()))
6901 return ConstantInt::getFalse(ReturnType);
6902
6903 if (!Q.CxtI)
6904 break;
6905
6906 const Function *F = Q.CxtI->getFunction();
6907 auto *ScalableTy = dyn_cast<ScalableVectorType>(ReturnType);
6908 Attribute Attr = F->getFnAttribute(Attribute::VScaleRange);
6909 if (ScalableTy && Attr.isValid()) {
6910 std::optional<unsigned> VScaleMax = Attr.getVScaleRangeMax();
6911 if (!VScaleMax)
6912 break;
6913 uint64_t MaxPossibleMaskElements =
6914 (uint64_t)ScalableTy->getMinNumElements() * (*VScaleMax);
6915
6916 const APInt *Op1Val;
6917 if (match(Op0, m_Zero()) && match(Op1, m_APInt(Op1Val)) &&
6918 Op1Val->uge(MaxPossibleMaskElements))
6919 return ConstantInt::getAllOnesValue(ReturnType);
6920 }
6921 break;
6922 }
6923 case Intrinsic::abs:
6924 // abs(abs(x)) -> abs(x). We don't need to worry about the nsw arg here.
6925 // It is always ok to pick the earlier abs. We'll just lose nsw if its only
6926 // on the outer abs.
6928 return Op0;
6929 break;
6930
6931 case Intrinsic::cttz: {
6932 Value *X;
6933 if (match(Op0, m_Shl(m_One(), m_Value(X))))
6934 return X;
6935 break;
6936 }
6937 case Intrinsic::ctlz: {
6938 Value *X;
6939 if (match(Op0, m_LShr(m_Negative(), m_Value(X))))
6940 return X;
6941 if (match(Op0, m_AShr(m_Negative(), m_Value())))
6942 return Constant::getNullValue(ReturnType);
6943 break;
6944 }
6945 case Intrinsic::pdep: {
6946 if (match(Op0, m_Zero()))
6947 return Constant::getNullValue(ReturnType);
6948 if (match(Op1, m_Zero()))
6949 return Constant::getNullValue(ReturnType);
6950 if (match(Op1, m_AllOnes()))
6951 return Op0;
6952 break;
6953 }
6954 case Intrinsic::pext: {
6955 if (match(Op0, m_Zero()))
6956 return Constant::getNullValue(ReturnType);
6957 if (match(Op1, m_Zero()))
6958 return Constant::getNullValue(ReturnType);
6959 if (match(Op1, m_AllOnes()))
6960 return Op0;
6961 break;
6962 }
6963 case Intrinsic::ptrmask: {
6964 // NOTE: We can't apply this simplifications based on the value of Op1
6965 // because we need to preserve provenance.
6966 if (Q.isUndefValue(Op0) || match(Op0, m_Zero()))
6967 return Constant::getNullValue(Op0->getType());
6968
6970 Q.DL.getIndexTypeSizeInBits(Op0->getType()) &&
6971 "Invalid mask width");
6972 // If index-width (mask size) is less than pointer-size then mask is
6973 // 1-extended.
6974 if (match(Op1, m_PtrToIntOrAddr(m_Specific(Op0))))
6975 return Op0;
6976
6977 // NOTE: We may have attributes associated with the return value of the
6978 // llvm.ptrmask intrinsic that will be lost when we just return the
6979 // operand. We should try to preserve them.
6980 if (match(Op1, m_AllOnes()) || Q.isUndefValue(Op1))
6981 return Op0;
6982
6983 Constant *C;
6984 if (match(Op1, m_ImmConstant(C))) {
6985 KnownBits PtrKnown = computeKnownBits(Op0, Q);
6986 // See if we only masking off bits we know are already zero due to
6987 // alignment.
6988 APInt IrrelevantPtrBits =
6989 PtrKnown.Zero.zextOrTrunc(C->getType()->getScalarSizeInBits());
6991 Instruction::Or, C, ConstantInt::get(C->getType(), IrrelevantPtrBits),
6992 Q.DL);
6993 if (C != nullptr && C->isAllOnesValue())
6994 return Op0;
6995 }
6996 break;
6997 }
6998 case Intrinsic::smax:
6999 case Intrinsic::smin:
7000 case Intrinsic::umax:
7001 case Intrinsic::umin: {
7002 // If the arguments are the same, this is a no-op.
7003 if (Op0 == Op1)
7004 return Op0;
7005
7006 // Canonicalize immediate constant operand as Op1.
7007 if (match(Op0, m_ImmConstant()))
7008 std::swap(Op0, Op1);
7009
7010 // Assume undef is the limit value.
7011 if (Q.isUndefValue(Op1))
7012 return ConstantInt::get(
7014
7015 const APInt *C;
7016 if (match(Op1, m_APIntAllowPoison(C))) {
7017 // Clamp to limit value. For example:
7018 // umax(i8 %x, i8 255) --> 255
7020 return ConstantInt::get(ReturnType, *C);
7021
7022 // If the constant op is the opposite of the limit value, the other must
7023 // be larger/smaller or equal. For example:
7024 // umin(i8 %x, i8 255) --> %x
7027 return Op0;
7028
7029 // Remove nested call if constant operands allow it. Example:
7030 // max (max X, 7), 5 -> max X, 7
7031 auto *MinMax0 = dyn_cast<IntrinsicInst>(Op0);
7032 if (MinMax0 && MinMax0->getIntrinsicID() == IID) {
7033 // TODO: loosen undef/splat restrictions for vector constants.
7034 Value *M00 = MinMax0->getOperand(0), *M01 = MinMax0->getOperand(1);
7035 const APInt *InnerC;
7036 if ((match(M00, m_APInt(InnerC)) || match(M01, m_APInt(InnerC))) &&
7037 ICmpInst::compare(*InnerC, *C,
7040 return Op0;
7041 }
7042 }
7043
7044 if (Value *V = foldMinMaxSharedOp(IID, Op0, Op1))
7045 return V;
7046 if (Value *V = foldMinMaxSharedOp(IID, Op1, Op0))
7047 return V;
7048
7049 ICmpInst::Predicate Pred =
7051 if (isICmpTrue(Pred, Op0, Op1, Q.getWithoutUndef(), RecursionLimit))
7052 return Op0;
7053 if (isICmpTrue(Pred, Op1, Op0, Q.getWithoutUndef(), RecursionLimit))
7054 return Op1;
7055
7056 break;
7057 }
7058 case Intrinsic::scmp:
7059 case Intrinsic::ucmp: {
7060 // Fold to a constant if the relationship between operands can be
7061 // established with certainty
7062 if (isICmpTrue(CmpInst::ICMP_EQ, Op0, Op1, Q, RecursionLimit))
7063 return Constant::getNullValue(ReturnType);
7064
7065 ICmpInst::Predicate PredGT =
7066 IID == Intrinsic::scmp ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
7067 if (isICmpTrue(PredGT, Op0, Op1, Q, RecursionLimit))
7068 return ConstantInt::get(ReturnType, 1);
7069
7070 ICmpInst::Predicate PredLT =
7071 IID == Intrinsic::scmp ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
7072 if (isICmpTrue(PredLT, Op0, Op1, Q, RecursionLimit))
7073 return ConstantInt::getSigned(ReturnType, -1);
7074
7075 break;
7076 }
7077 case Intrinsic::usub_with_overflow:
7078 case Intrinsic::ssub_with_overflow:
7079 // X - X -> { 0, false }
7080 // X - undef -> { 0, false }
7081 // undef - X -> { 0, false }
7082 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
7083 return Constant::getNullValue(ReturnType);
7084 break;
7085 case Intrinsic::uadd_with_overflow:
7086 case Intrinsic::sadd_with_overflow:
7087 // X + undef -> { -1, false }
7088 // undef + x -> { -1, false }
7089 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) {
7090 return ConstantStruct::get(
7091 cast<StructType>(ReturnType),
7092 {Constant::getAllOnesValue(ReturnType->getStructElementType(0)),
7093 Constant::getNullValue(ReturnType->getStructElementType(1))});
7094 }
7095 break;
7096 case Intrinsic::umul_with_overflow:
7097 case Intrinsic::smul_with_overflow:
7098 // 0 * X -> { 0, false }
7099 // X * 0 -> { 0, false }
7100 if (match(Op0, m_Zero()) || match(Op1, m_Zero()))
7101 return Constant::getNullValue(ReturnType);
7102 // undef * X -> { 0, false }
7103 // X * undef -> { 0, false }
7104 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
7105 return Constant::getNullValue(ReturnType);
7106 break;
7107 case Intrinsic::uadd_sat:
7108 // sat(MAX + X) -> MAX
7109 // sat(X + MAX) -> MAX
7110 if (match(Op0, m_AllOnes()) || match(Op1, m_AllOnes()))
7111 return Constant::getAllOnesValue(ReturnType);
7112 [[fallthrough]];
7113 case Intrinsic::sadd_sat:
7114 // sat(X + undef) -> -1
7115 // sat(undef + X) -> -1
7116 // For unsigned: Assume undef is MAX, thus we saturate to MAX (-1).
7117 // For signed: Assume undef is ~X, in which case X + ~X = -1.
7118 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
7119 return Constant::getAllOnesValue(ReturnType);
7120
7121 // X + 0 -> X
7122 if (match(Op1, m_Zero()))
7123 return Op0;
7124 // 0 + X -> X
7125 if (match(Op0, m_Zero()))
7126 return Op1;
7127 break;
7128 case Intrinsic::usub_sat:
7129 // sat(0 - X) -> 0, sat(X - MAX) -> 0
7130 if (match(Op0, m_Zero()) || match(Op1, m_AllOnes()))
7131 return Constant::getNullValue(ReturnType);
7132 [[fallthrough]];
7133 case Intrinsic::ssub_sat:
7134 // X - X -> 0, X - undef -> 0, undef - X -> 0
7135 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1))
7136 return Constant::getNullValue(ReturnType);
7137 // X - 0 -> X
7138 if (match(Op1, m_Zero()))
7139 return Op0;
7140 break;
7141 case Intrinsic::load_relative:
7142 if (auto *C0 = dyn_cast<Constant>(Op0))
7143 if (auto *C1 = dyn_cast<Constant>(Op1))
7144 return simplifyRelativeLoad(C0, C1, Q.DL);
7145 break;
7146 case Intrinsic::powi:
7147 if (auto *Power = dyn_cast<ConstantInt>(Op1)) {
7148 // powi(x, 0) -> 1.0
7149 if (Power->isZero())
7150 return ConstantFP::get(Op0->getType(), 1.0);
7151 // powi(x, 1) -> x
7152 if (Power->isOne())
7153 return Op0;
7154 }
7155 break;
7156 case Intrinsic::ldexp:
7157 return simplifyLdexp(Op0, Op1, Q, false);
7158 case Intrinsic::copysign:
7159 // copysign X, X --> X
7160 if (Op0 == Op1)
7161 return Op0;
7162 // copysign -X, X --> X
7163 // copysign X, -X --> -X
7164 if (match(Op0, m_FNeg(m_Specific(Op1))) ||
7165 match(Op1, m_FNeg(m_Specific(Op0))))
7166 return Op1;
7167 break;
7168 case Intrinsic::is_fpclass: {
7169 uint64_t Mask = cast<ConstantInt>(Op1)->getZExtValue();
7170 // If all tests are made, it doesn't matter what the value is.
7171 if ((Mask & fcAllFlags) == fcAllFlags)
7172 return ConstantInt::get(ReturnType, true);
7173 if ((Mask & fcAllFlags) == 0)
7174 return ConstantInt::get(ReturnType, false);
7175 if (Q.isUndefValue(Op0))
7176 return UndefValue::get(ReturnType);
7177 break;
7178 }
7179 case Intrinsic::maxnum:
7180 case Intrinsic::minnum:
7181 case Intrinsic::maximum:
7182 case Intrinsic::minimum:
7183 case Intrinsic::maximumnum:
7184 case Intrinsic::minimumnum: {
7185 // In several cases here, we deviate from exact IEEE 754 semantics
7186 // to enable optimizations (as allowed by the LLVM IR spec).
7187 //
7188 // For instance, we may return one of the arguments unmodified instead of
7189 // inserting an llvm.canonicalize to transform input sNaNs into qNaNs,
7190 // or may assume all NaN inputs are qNaNs.
7191
7192 // If the arguments are the same, this is a no-op (ignoring NaN quieting)
7193 if (Op0 == Op1)
7194 return Op0;
7195
7196 // Canonicalize constant operand as Op1.
7197 if (isa<Constant>(Op0))
7198 std::swap(Op0, Op1);
7199
7200 if (Constant *C = dyn_cast<Constant>(Op1)) {
7202 Constant *NewConst = nullptr;
7203
7204 if (VectorType *VTy = dyn_cast<VectorType>(C->getType())) {
7205 ElementCount ElemCount = VTy->getElementCount();
7206
7207 if (Constant *SplatVal = C->getSplatValue()) {
7208 // Handle splat vectors (including scalable vectors)
7209 OptResult = OptimizeConstMinMax(SplatVal, IID, FMF, &NewConst);
7210 if (OptResult == MinMaxOptResult::UseNewConstVal)
7211 NewConst = ConstantVector::getSplat(ElemCount, NewConst);
7212
7213 } else if (ElemCount.isFixed()) {
7214 // Storage to build up new const return value (with NaNs quieted)
7216
7217 // Check elementwise whether we can optimize to either a constant
7218 // value or return the LHS value. We cannot mix and match LHS +
7219 // constant elements, as this would require inserting a new
7220 // VectorShuffle instruction, which is not allowed in simplifyBinOp.
7221 OptResult = MinMaxOptResult::UseEither;
7222 for (unsigned i = 0; i != ElemCount.getFixedValue(); ++i) {
7223 auto *Elt = C->getAggregateElement(i);
7224 if (!Elt) {
7226 break;
7227 }
7228 auto ElemResult = OptimizeConstMinMax(Elt, IID, FMF, &NewConst);
7229 if (ElemResult == MinMaxOptResult::CannotOptimize ||
7230 (ElemResult != OptResult &&
7231 OptResult != MinMaxOptResult::UseEither &&
7232 ElemResult != MinMaxOptResult::UseEither)) {
7234 break;
7235 }
7236 NewC[i] = NewConst;
7237 if (ElemResult != MinMaxOptResult::UseEither)
7238 OptResult = ElemResult;
7239 }
7240 if (OptResult == MinMaxOptResult::UseNewConstVal)
7241 NewConst = ConstantVector::get(NewC);
7242 }
7243 } else {
7244 // Handle scalar inputs
7245 OptResult = OptimizeConstMinMax(C, IID, FMF, &NewConst);
7246 }
7247
7248 if (OptResult == MinMaxOptResult::UseOtherVal ||
7249 OptResult == MinMaxOptResult::UseEither)
7250 return Op0; // Return the other arg (ignoring NaN quieting)
7251 else if (OptResult == MinMaxOptResult::UseNewConstVal)
7252 return NewConst;
7253 }
7254
7255 // Min/max of the same operation with common operand:
7256 // m(m(X, Y)), X --> m(X, Y) (4 commuted variants)
7257 if (Value *V = foldMinimumMaximumSharedOp(IID, Op0, Op1))
7258 return V;
7259 if (Value *V = foldMinimumMaximumSharedOp(IID, Op1, Op0))
7260 return V;
7261
7262 break;
7263 }
7264 case Intrinsic::vector_extract: {
7265 // (extract_vector (insert_vector _, X, 0), 0) -> X
7266 unsigned IdxN = cast<ConstantInt>(Op1)->getZExtValue();
7267 Value *X = nullptr;
7269 m_Zero())) &&
7270 IdxN == 0 && X->getType() == ReturnType)
7271 return X;
7272
7273 break;
7274 }
7275
7276 case Intrinsic::aarch64_sve_andv:
7277 case Intrinsic::aarch64_sve_eorv:
7278 case Intrinsic::aarch64_sve_orv:
7279 case Intrinsic::aarch64_sve_saddv:
7280 case Intrinsic::aarch64_sve_smaxv:
7281 case Intrinsic::aarch64_sve_sminv:
7282 case Intrinsic::aarch64_sve_uaddv:
7283 case Intrinsic::aarch64_sve_umaxv:
7284 case Intrinsic::aarch64_sve_uminv:
7285 return simplifySVEIntReduction(IID, ReturnType, Op0, Op1);
7286 default:
7287 break;
7288 }
7289
7290 return nullptr;
7291}
7292
7293/// interleaveN(extractvalue(deinterleaveN(x), 0), ...,
7294/// extractvalue(deinterleaveN(x), N-1)) --> x
7296 ArrayRef<Value *> Args) {
7297 unsigned Factor = getInterleaveIntrinsicFactor(IID);
7298 if (!Factor || Factor != Args.size())
7299 return nullptr;
7300
7302 IntrinsicInst *DI = nullptr;
7303 for (unsigned Idx = 0; Idx != Factor; ++Idx) {
7304 auto *EV = dyn_cast<ExtractValueInst>(Args[Idx]);
7305 if (!EV || EV->getNumIndices() != 1 || *EV->idx_begin() != Idx)
7306 return nullptr;
7307
7308 auto *CurDI = dyn_cast<IntrinsicInst>(EV->getAggregateOperand());
7309 if (!CurDI || CurDI->getIntrinsicID() != DeinterleaveID)
7310 return nullptr;
7311
7312 if (!DI)
7313 DI = CurDI;
7314 else if (DI != CurDI)
7315 return nullptr;
7316 }
7317
7318 return DI->getArgOperand(0);
7319}
7320
7323 const SimplifyQuery &Q, Function *CxtF,
7324 fp::ExceptionBehavior ExBehavior,
7325 RoundingMode Rounding) {
7326 unsigned NumOperands = Args.size();
7329 return PoisonValue::get(ReturnType);
7330
7331 // Most of the intrinsics with no operands have some kind of side effect.
7332 // Don't simplify.
7333 if (!NumOperands) {
7334 switch (IID) {
7335 case Intrinsic::vscale: {
7336 if (!CxtF)
7337 return nullptr;
7338 ConstantRange CR = getVScaleRange(CxtF, 64);
7339 if (const APInt *C = CR.getSingleElement())
7340 return ConstantInt::get(ReturnType, C->getZExtValue());
7341 return nullptr;
7342 }
7343 default:
7344 return nullptr;
7345 }
7346 }
7347
7348 if (Value *V = simplifyIdentityInterleave(IID, Args))
7349 return V;
7350
7351 if (NumOperands == 1)
7352 return simplifyUnaryIntrinsic(IID, Args[0], FMF, Q);
7353
7354 if (NumOperands == 2)
7355 return simplifyBinaryIntrinsic(IID, ReturnType, Args[0], Args[1], FMF, Q);
7356
7357 // Handle intrinsics with 3 or more arguments.
7358 switch (IID) {
7359 case Intrinsic::masked_load:
7360 case Intrinsic::masked_gather: {
7361 Value *MaskArg = Args[1];
7362 Value *PassthruArg = Args[2];
7363 // If the mask is all zeros or poison, the "passthru" argument is the
7364 // result.
7365 if (match(MaskArg, m_ZeroOrPoison()))
7366 return PassthruArg;
7367 return nullptr;
7368 }
7369 case Intrinsic::fshl:
7370 case Intrinsic::fshr: {
7371 Value *Op0 = Args[0], *Op1 = Args[1], *ShAmtArg = Args[2];
7372
7373 // If both operands are undef, the result is undef.
7374 if (Q.isUndefValue(Op0) && Q.isUndefValue(Op1))
7375 return UndefValue::get(ReturnType);
7376
7377 // If shift amount is undef, assume it is zero.
7378 if (Q.isUndefValue(ShAmtArg))
7379 return Args[IID == Intrinsic::fshl ? 0 : 1];
7380
7381 const APInt *ShAmtC;
7382 if (match(ShAmtArg, m_APInt(ShAmtC))) {
7383 // If there's effectively no shift, return the 1st arg or 2nd arg.
7384 APInt BitWidth = APInt(ShAmtC->getBitWidth(), ShAmtC->getBitWidth());
7385 const APInt ShAmt = ShAmtC->urem(BitWidth);
7386 if (ShAmt.isZero())
7387 return Args[IID == Intrinsic::fshl ? 0 : 1];
7388
7389 // fshl (lshr X, C1), (shl X, C2), C1 -> X when C1 + C2 == BW
7390 // fshr (lshr X, C1), (shl X, C2), C2 -> X when C1 + C2 == BW
7391 const APInt *C1, *C2;
7392 Value *X;
7393 if (match(Op0, m_LShr(m_Value(X), m_APInt(C1))) &&
7394 match(Op1, m_Shl(m_Specific(X), m_APInt(C2))) &&
7395 *C1 + *C2 == BitWidth && ShAmt == *(IID == Intrinsic::fshl ? C1 : C2))
7396 return X;
7397 }
7398
7399 // Rotating zero by anything is zero.
7400 if (match(Op0, m_Zero()) && match(Op1, m_Zero()))
7401 return ConstantInt::getNullValue(ReturnType);
7402
7403 // Rotating -1 by anything is -1.
7404 if (match(Op0, m_AllOnes()) && match(Op1, m_AllOnes()))
7405 return ConstantInt::getAllOnesValue(ReturnType);
7406
7407 return nullptr;
7408 }
7409 case Intrinsic::experimental_constrained_fma:
7410 return simplifyFPOp(Args, {}, Q, ExBehavior, Rounding);
7411 case Intrinsic::fma:
7412 case Intrinsic::fmuladd:
7413 return simplifyFPOp(Args, {}, Q, fp::ebIgnore,
7415 case Intrinsic::smul_fix:
7416 case Intrinsic::smul_fix_sat: {
7417 Value *Op0 = Args[0];
7418 Value *Op1 = Args[1];
7419 Value *Op2 = Args[2];
7420
7421 // Canonicalize constant operand as Op1 (ConstantFolding handles the case
7422 // when both Op0 and Op1 are constant so we do not care about that special
7423 // case here).
7424 if (isa<Constant>(Op0))
7425 std::swap(Op0, Op1);
7426
7427 // X * 0 -> 0
7428 if (match(Op1, m_Zero()))
7429 return Constant::getNullValue(ReturnType);
7430
7431 // X * undef -> 0
7432 if (Q.isUndefValue(Op1))
7433 return Constant::getNullValue(ReturnType);
7434
7435 // X * (1 << Scale) -> X
7436 APInt ScaledOne =
7437 APInt::getOneBitSet(ReturnType->getScalarSizeInBits(),
7438 cast<ConstantInt>(Op2)->getZExtValue());
7439 if (ScaledOne.isNonNegative() && match(Op1, m_SpecificInt(ScaledOne)))
7440 return Op0;
7441
7442 return nullptr;
7443 }
7444 case Intrinsic::vector_insert: {
7445 Value *Vec = Args[0];
7446 Value *SubVec = Args[1];
7447 Value *Idx = Args[2];
7448
7449 // (insert_vector Y, (extract_vector X, 0), 0) -> X
7450 // where: Y is X, or Y is undef
7451 unsigned IdxN = cast<ConstantInt>(Idx)->getZExtValue();
7452 Value *X = nullptr;
7453 if (match(SubVec,
7455 (Q.isUndefValue(Vec) || Vec == X) && IdxN == 0 &&
7456 X->getType() == ReturnType)
7457 return X;
7458
7459 return nullptr;
7460 }
7461 case Intrinsic::vector_splice_right: {
7462 // splice.right(splice.left(poison, x, offset), poison, offset) -> x
7463 Value *X, *Offset = Args[2];
7466 isa<PoisonValue>(Args[1]))
7467 return X;
7468 [[fallthrough]];
7469 }
7470 case Intrinsic::vector_splice_left: {
7471 Value *Offset = Args[2];
7472 auto *Ty = cast<VectorType>(ReturnType);
7473 if (Q.isUndefValue(Offset))
7474 return PoisonValue::get(Ty);
7475
7476 unsigned BitWidth = Offset->getType()->getScalarSizeInBits();
7477 ConstantRange NumElts(
7478 APInt(BitWidth, Ty->getElementCount().getKnownMinValue()));
7479 if (Ty->isScalableTy())
7480 NumElts = NumElts.multiply(CxtF ? getVScaleRange(CxtF, BitWidth)
7481 : ConstantRange::getFull(BitWidth));
7482
7483 // If we know Offset > NumElts, simplify to poison.
7485 if (CR.getUnsignedMin().ugt(NumElts.getUnsignedMax()))
7486 return PoisonValue::get(Ty);
7487
7488 // splice.left(a, b, 0) --> a, splice.right(a, b, 0) --> b
7489 if (CR.isSingleElement() && CR.getSingleElement()->isZero())
7490 return IID == Intrinsic::vector_splice_left ? Args[0] : Args[1];
7491
7492 return nullptr;
7493 }
7494 case Intrinsic::experimental_constrained_fadd:
7495 return simplifyFAddInst(Args[0], Args[1], FMF, Q, ExBehavior, Rounding);
7496 case Intrinsic::experimental_constrained_fsub:
7497 return simplifyFSubInst(Args[0], Args[1], FMF, Q, ExBehavior, Rounding);
7498 case Intrinsic::experimental_constrained_fmul:
7499 return simplifyFMulInst(Args[0], Args[1], FMF, Q, ExBehavior, Rounding);
7500 case Intrinsic::experimental_constrained_fdiv:
7501 return simplifyFDivInst(Args[0], Args[1], FMF, Q, ExBehavior, Rounding);
7502 case Intrinsic::experimental_constrained_frem:
7503 return simplifyFRemInst(Args[0], Args[1], FMF, Q, ExBehavior, Rounding);
7504 case Intrinsic::experimental_constrained_ldexp:
7505 return simplifyLdexp(Args[0], Args[1], Q, true);
7506 case Intrinsic::experimental_vp_reverse: {
7507 Value *Vec = Args[0];
7508 Value *EVL = Args[2];
7509
7510 Value *X;
7511 // vp.reverse(vp.reverse(X)) == X (mask doesn't matter)
7513 m_Value(X), m_Value(), m_Specific(EVL))))
7514 return X;
7515
7516 // vp.reverse(splat(X)) -> splat(X) (regardless of mask and EVL)
7517 if (isSplatValue(Vec))
7518 return Vec;
7519 return nullptr;
7520 }
7521 default:
7522 return nullptr;
7523 }
7524}
7525
7527 const SimplifyQuery &Q) {
7528 // Operand bundles should not be in Args.
7529 assert(Call->arg_size() == Args.size());
7530 Intrinsic::ID IID = Call->getCalledFunction()->getIntrinsicID();
7531 Type *ReturnType = Call->getCalledFunction()->getReturnType();
7532
7533 switch (IID) {
7534 case Intrinsic::experimental_gc_relocate: {
7536 Value *DerivedPtr = GCR.getDerivedPtr();
7537 Value *BasePtr = GCR.getBasePtr();
7538
7539 // Undef is undef, even after relocation.
7540 if (isa<UndefValue>(DerivedPtr) || isa<UndefValue>(BasePtr)) {
7541 return UndefValue::get(GCR.getType());
7542 }
7543
7544 if (auto *PT = dyn_cast<PointerType>(GCR.getType())) {
7545 // For now, the assumption is that the relocation of null will be null
7546 // for most any collector. If this ever changes, a corresponding hook
7547 // should be added to GCStrategy and this code should check it first.
7548 if (isa<ConstantPointerNull>(DerivedPtr)) {
7549 // Use null-pointer of gc_relocate's type to replace it.
7550 return ConstantPointerNull::get(PT);
7551 }
7552 }
7553 return nullptr;
7554 }
7555 default: {
7556 // Use the default FP environment if none is found.
7559 if (auto *Constrained = dyn_cast<ConstrainedFPIntrinsic>(Call)) {
7560 ExBehavior = Constrained->getExceptionBehavior().value_or(ExBehavior);
7561 Rounding = Constrained->getRoundingMode().value_or(Rounding);
7562 }
7563 return simplifyIntrinsic(IID, ReturnType, Args,
7564 Call->getFastMathFlagsOrNone(), Q,
7565 Call->getFunction(), ExBehavior, Rounding);
7566 }
7567 }
7568}
7569
7571 const SimplifyQuery &Q) {
7572 auto *F = Call->getCalledFunction();
7573 if (!F || !canConstantFoldCallTo(Call, F))
7574 return nullptr;
7575
7576 SmallVector<Constant *, 4> ConstantArgs;
7577 ConstantArgs.reserve(Args.size());
7578 for (Value *Arg : Args) {
7580 if (!C) {
7581 if (isa<MetadataAsValue>(Arg))
7582 continue;
7583 return nullptr;
7584 }
7585 ConstantArgs.push_back(C);
7586 }
7587
7588 return ConstantFoldCall(Call, F, ConstantArgs, Q.TLI);
7589}
7590
7592 const SimplifyQuery &Q) {
7593 // Args should not contain operand bundle operands.
7594 assert(Call->arg_size() == Args.size());
7595
7596 // musttail calls can only be simplified if they are also DCEd.
7597 // As we can't guarantee this here, don't simplify them.
7598 if (Call->isMustTailCall())
7599 return nullptr;
7600
7601 // call undef -> poison
7602 // call null -> poison
7603 if (isa<UndefValue>(Callee) || isa<ConstantPointerNull>(Callee))
7604 return PoisonValue::get(Call->getType());
7605
7606 if (Value *V = tryConstantFoldCall(Call, Args, Q))
7607 return V;
7608
7609 auto *F = dyn_cast<Function>(Callee);
7610 if (F && F->isIntrinsic())
7611 if (Value *Ret = ::simplifyIntrinsic(Call, Args, Q))
7612 return Ret;
7613
7614 return nullptr;
7615}
7616
7619 SmallVector<Value *, 4> Args(Call->args());
7620 if (Value *V = tryConstantFoldCall(Call, Args, Q))
7621 return V;
7622 if (Value *Ret = ::simplifyIntrinsic(Call, Args, Q))
7623 return Ret;
7624 return nullptr;
7625}
7626
7627/// Given operands for a Freeze, see if we can fold the result.
7629 // Use a utility function defined in ValueTracking.
7631 return Op0;
7632 // We have room for improvement.
7633 return nullptr;
7634}
7635
7637 return ::simplifyFreezeInst(Op0, Q);
7638}
7639
7641 const SimplifyQuery &Q) {
7642 if (LI->isVolatile())
7643 return nullptr;
7644
7645 if (auto *PtrOpC = dyn_cast<Constant>(PtrOp))
7646 return ConstantFoldLoadFromConstPtr(PtrOpC, LI->getType(), Q.DL);
7647
7648 // We can only fold the load if it is from a constant global with definitive
7649 // initializer. Skip expensive logic if this is not the case.
7651 if (!GV || !GV->isConstant() || !GV->hasDefinitiveInitializer())
7652 return nullptr;
7653
7654 // If GlobalVariable's initializer is uniform, then return the constant
7655 // regardless of its offset.
7656 if (Constant *C = ConstantFoldLoadFromUniformValue(GV->getInitializer(),
7657 LI->getType(), Q.DL))
7658 return C;
7659
7660 // Try to convert operand into a constant by stripping offsets while looking
7661 // through invariant.group intrinsics.
7663 PtrOp = PtrOp->stripAndAccumulateConstantOffsets(
7664 Q.DL, Offset, /* AllowNonInbounts */ true,
7665 /* AllowInvariantGroup */ true);
7666 if (PtrOp == GV) {
7667 // Index size may have changed due to address space casts.
7668 Offset = Offset.sextOrTrunc(Q.DL.getIndexTypeSizeInBits(PtrOp->getType()));
7669 return ConstantFoldLoadFromConstPtr(GV, LI->getType(), std::move(Offset),
7670 Q.DL);
7671 }
7672
7673 return nullptr;
7674}
7675
7676/// See if we can compute a simplified version of this instruction.
7677/// If not, this returns null.
7678
7680 ArrayRef<Value *> NewOps,
7681 const SimplifyQuery &SQ,
7682 unsigned MaxRecurse) {
7683 assert(I->getFunction() && "instruction should be inserted in a function");
7684 assert((!SQ.CxtI || SQ.CxtI->getFunction() == I->getFunction()) &&
7685 "context instruction should be in the same function");
7686
7687 const SimplifyQuery Q = SQ.CxtI ? SQ : SQ.getWithInstruction(I);
7688
7689 switch (I->getOpcode()) {
7690 default:
7691 if (all_of(NewOps, IsaPred<Constant>)) {
7692 SmallVector<Constant *, 8> NewConstOps(NewOps.size());
7693 transform(NewOps, NewConstOps.begin(),
7694 [](Value *V) { return cast<Constant>(V); });
7695 return ConstantFoldInstOperands(I, NewConstOps, Q.DL, Q.TLI);
7696 }
7697 return nullptr;
7698 case Instruction::FNeg:
7699 return simplifyFNegInst(NewOps[0], I->getFastMathFlags(), Q, MaxRecurse);
7700 case Instruction::FAdd:
7701 return simplifyFAddInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7702 MaxRecurse);
7703 case Instruction::Add:
7704 return simplifyAddInst(
7705 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7706 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7707 case Instruction::FSub:
7708 return simplifyFSubInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7709 MaxRecurse);
7710 case Instruction::Sub:
7711 return simplifySubInst(
7712 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7713 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7714 case Instruction::FMul:
7715 return simplifyFMulInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7716 MaxRecurse);
7717 case Instruction::Mul:
7718 return simplifyMulInst(
7719 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7720 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7721 case Instruction::SDiv:
7722 return simplifySDivInst(NewOps[0], NewOps[1],
7724 MaxRecurse);
7725 case Instruction::UDiv:
7726 return simplifyUDivInst(NewOps[0], NewOps[1],
7728 MaxRecurse);
7729 case Instruction::FDiv:
7730 return simplifyFDivInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7731 MaxRecurse);
7732 case Instruction::SRem:
7733 return simplifySRemInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7734 case Instruction::URem:
7735 return simplifyURemInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7736 case Instruction::FRem:
7737 return simplifyFRemInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q,
7738 MaxRecurse);
7739 case Instruction::Shl:
7740 return simplifyShlInst(
7741 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)),
7742 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q, MaxRecurse);
7743 case Instruction::LShr:
7744 return simplifyLShrInst(NewOps[0], NewOps[1],
7746 MaxRecurse);
7747 case Instruction::AShr:
7748 return simplifyAShrInst(NewOps[0], NewOps[1],
7750 MaxRecurse);
7751 case Instruction::And:
7752 return simplifyAndInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7753 case Instruction::Or:
7754 return simplifyOrInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7755 case Instruction::Xor:
7756 return simplifyXorInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7757 case Instruction::ICmp:
7758 return simplifyICmpInst(cast<ICmpInst>(I)->getCmpPredicate(), NewOps[0],
7759 NewOps[1], Q, MaxRecurse);
7760 case Instruction::FCmp:
7761 return simplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(), NewOps[0],
7762 NewOps[1], I->getFastMathFlags(), Q, MaxRecurse);
7763 case Instruction::Select: {
7764 FastMathFlags FMF;
7765 if (auto *FPMO = dyn_cast<FPMathOperator>(I))
7766 FMF = FPMO->getFastMathFlags();
7767 return simplifySelectInst(NewOps[0], NewOps[1], NewOps[2], FMF, Q,
7768 MaxRecurse);
7769 }
7770 case Instruction::GetElementPtr: {
7771 auto *GEPI = cast<GetElementPtrInst>(I);
7772 return simplifyGEPInst(GEPI->getSourceElementType(), NewOps[0],
7773 ArrayRef(NewOps).slice(1), GEPI->getNoWrapFlags(), Q,
7774 MaxRecurse);
7775 }
7776 case Instruction::InsertValue: {
7778 return simplifyInsertValueInst(NewOps[0], NewOps[1], IV->getIndices(), Q,
7779 MaxRecurse);
7780 }
7781 case Instruction::InsertElement:
7782 return simplifyInsertElementInst(NewOps[0], NewOps[1], NewOps[2], Q);
7783 case Instruction::ExtractValue: {
7784 auto *EVI = cast<ExtractValueInst>(I);
7785 return simplifyExtractValueInst(NewOps[0], EVI->getIndices(), Q,
7786 MaxRecurse);
7787 }
7788 case Instruction::ExtractElement:
7789 return simplifyExtractElementInst(NewOps[0], NewOps[1], Q, MaxRecurse);
7790 case Instruction::ShuffleVector: {
7791 auto *SVI = cast<ShuffleVectorInst>(I);
7792 return simplifyShuffleVectorInst(NewOps[0], NewOps[1],
7793 SVI->getShuffleMask(), SVI->getType(), Q,
7794 MaxRecurse);
7795 }
7796 case Instruction::PHI:
7797 return simplifyPHINode(cast<PHINode>(I), NewOps, Q);
7798 case Instruction::Call:
7799 return simplifyCall(
7800 cast<CallInst>(I), NewOps.back(),
7801 NewOps.drop_back(1 + cast<CallInst>(I)->getNumTotalBundleOperands()), Q);
7802 case Instruction::Freeze:
7803 return llvm::simplifyFreezeInst(NewOps[0], Q);
7804#define HANDLE_CAST_INST(num, opc, clas) case Instruction::opc:
7805#include "llvm/IR/Instruction.def"
7806#undef HANDLE_CAST_INST
7807 return simplifyCastInst(I->getOpcode(), NewOps[0], I->getType(), Q,
7808 MaxRecurse);
7809 case Instruction::Alloca:
7810 // No simplifications for Alloca and it can't be constant folded.
7811 return nullptr;
7812 case Instruction::Load:
7813 return simplifyLoadInst(cast<LoadInst>(I), NewOps[0], Q);
7814 }
7815}
7816
7818 ArrayRef<Value *> NewOps,
7819 const SimplifyQuery &SQ) {
7820 assert(NewOps.size() == I->getNumOperands() &&
7821 "Number of operands should match the instruction!");
7822 return ::simplifyInstructionWithOperands(I, NewOps, SQ, RecursionLimit);
7823}
7824
7826 SmallVector<Value *, 8> Ops(I->operands());
7828
7829 /// If called on unreachable code, the instruction may simplify to itself.
7830 /// Make life easier for users by detecting that case here, and returning a
7831 /// safe value instead.
7832 return Result == I ? PoisonValue::get(I->getType()) : Result;
7833}
7834
7835/// Implementation of recursive simplification through an instruction's
7836/// uses.
7837///
7838/// This is the common implementation of the recursive simplification routines.
7839/// If we have a pre-simplified value in 'SimpleV', that is forcibly used to
7840/// replace the instruction 'I'. Otherwise, we simply add 'I' to the list of
7841/// instructions to process and attempt to simplify it using
7842/// InstructionSimplify. Recursively visited users which could not be
7843/// simplified themselves are to the optional UnsimplifiedUsers set for
7844/// further processing by the caller.
7845///
7846/// This routine returns 'true' only when *it* simplifies something. The passed
7847/// in simplified value does not count toward this.
7849 Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI,
7850 const DominatorTree *DT, AssumptionCache *AC,
7851 SmallSetVector<Instruction *, 8> *UnsimplifiedUsers = nullptr) {
7852 bool Simplified = false;
7854 const DataLayout &DL = I->getDataLayout();
7855
7856 // If we have an explicit value to collapse to, do that round of the
7857 // simplification loop by hand initially.
7858 if (SimpleV) {
7859 for (User *U : I->users())
7860 if (U != I)
7861 Worklist.insert(cast<Instruction>(U));
7862
7863 // Replace the instruction with its simplified value.
7864 I->replaceAllUsesWith(SimpleV);
7865
7866 if (!I->isEHPad() && !I->isTerminator() && !I->mayHaveSideEffects())
7867 I->eraseFromParent();
7868 } else {
7869 Worklist.insert(I);
7870 }
7871
7872 // Note that we must test the size on each iteration, the worklist can grow.
7873 for (unsigned Idx = 0; Idx != Worklist.size(); ++Idx) {
7874 I = Worklist[Idx];
7875
7876 // See if this instruction simplifies.
7877 SimpleV = simplifyInstruction(I, {DL, TLI, DT, AC});
7878 if (!SimpleV) {
7879 if (UnsimplifiedUsers)
7880 UnsimplifiedUsers->insert(I);
7881 continue;
7882 }
7883
7884 Simplified = true;
7885
7886 // Stash away all the uses of the old instruction so we can check them for
7887 // recursive simplifications after a RAUW. This is cheaper than checking all
7888 // uses of To on the recursive step in most cases.
7889 for (User *U : I->users())
7890 Worklist.insert(cast<Instruction>(U));
7891
7892 // Replace the instruction with its simplified value.
7893 I->replaceAllUsesWith(SimpleV);
7894
7895 if (!I->isEHPad() && !I->isTerminator() && !I->mayHaveSideEffects())
7896 I->eraseFromParent();
7897 }
7898 return Simplified;
7899}
7900
7902 Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI,
7903 const DominatorTree *DT, AssumptionCache *AC,
7904 SmallSetVector<Instruction *, 8> *UnsimplifiedUsers) {
7905 assert(I != SimpleV && "replaceAndRecursivelySimplify(X,X) is not valid!");
7906 assert(SimpleV && "Must provide a simplified value.");
7907 return replaceAndRecursivelySimplifyImpl(I, SimpleV, TLI, DT, AC,
7908 UnsimplifiedUsers);
7909}
7910
7911namespace llvm {
7913 auto *DTWP = P.getAnalysisIfAvailable<DominatorTreeWrapperPass>();
7914 auto *DT = DTWP ? &DTWP->getDomTree() : nullptr;
7915 auto *TLIWP = P.getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
7916 auto *TLI = TLIWP ? &TLIWP->getTLI(F) : nullptr;
7917 auto *ACWP = P.getAnalysisIfAvailable<AssumptionCacheTracker>();
7918 auto *AC = ACWP ? &ACWP->getAssumptionCache(F) : nullptr;
7919 return {F.getDataLayout(), TLI, DT, AC};
7920}
7921
7923 const DataLayout &DL) {
7924 return {DL, &AR.TLI, &AR.DT, &AR.AC};
7925}
7926
7927template <class T, class... TArgs>
7929 Function &F) {
7930 auto *DT = AM.template getCachedResult<DominatorTreeAnalysis>(F);
7931 auto *TLI = AM.template getCachedResult<TargetLibraryAnalysis>(F);
7932 auto *AC = AM.template getCachedResult<AssumptionAnalysis>(F);
7933 return {F.getDataLayout(), TLI, DT, AC};
7934}
7936 Function &);
7937
7939 if (!CanUseUndef)
7940 return false;
7941
7942 return match(V, m_Undef());
7943}
7944
7945} // namespace llvm
7946
7947void InstSimplifyFolder::anchor() {}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
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 * 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 * simplifyICmpUsingMonotonicValues(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
static bool isDereferenceableArg(const Value *V)
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 Value * simplifyIdentityInterleave(Intrinsic::ID IID, ArrayRef< Value * > Args)
interleaveN(extractvalue(deinterleaveN(x), 0), ..., extractvalue(deinterleaveN(x),...
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 bool isByValArg(const Value *V)
static Value * simplifyUnaryIntrinsic(Intrinsic::ID IID, Value *Op0, FastMathFlags FMF, const SimplifyQuery &Q)
static Constant * simplifyFPOp(ArrayRef< Value * > Ops, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior, RoundingMode Rounding)
Perform folds that are common to any floating-point operation.
static Value * threadCmpOverSelect(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
In the case of a comparison with a select instruction, try to simplify the comparison by seeing wheth...
static bool replaceAndRecursivelySimplifyImpl(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI, const DominatorTree *DT, AssumptionCache *AC, SmallSetVector< Instruction *, 8 > *UnsimplifiedUsers=nullptr)
Implementation of recursive simplification through an instruction's uses.
static bool isAllocDisjoint(const Value *V)
Return true if the underlying object (storage) must be disjoint from storage returned by any noalias ...
static Constant * getTrue(Type *Ty)
For a boolean type or a vector of boolean type, return true or a vector with every element true.
static bool isDivZero(Value *X, Value *Y, const SimplifyQuery &Q, unsigned MaxRecurse, bool IsSigned)
Return true if we can simplify X / Y to 0.
static Value * simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q, bool IsStrict)
static Value * simplifyLogicOfAddSub(Value *Op0, Value *Op1, Instruction::BinaryOps Opcode)
Given a bitwise logic op, check if the operands are add/sub with a common source value and inverted c...
static Value * simplifySelectWithBitTest(Value *CondVal, Value *TrueVal, Value *FalseVal)
An alternative way to test if a bit is set or not.
static Value * simplifyOrLogic(Value *X, Value *Y)
static Type * getCompareTy(Value *Op)
static Value * simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, const SimplifyQuery &Q)
static bool isICmpTrue(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q, unsigned MaxRecurse)
Given a predicate and two operands, return true if the comparison is true.
static Value * tryConstantFoldCall(CallBase *Call, ArrayRef< Value * > Args, const SimplifyQuery &Q)
static Value * simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType, Value *Op0, Value *Op1, FastMathFlags FMF, const SimplifyQuery &Q)
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 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:1565
APFloat makeQuiet() const
Assuming this is an IEEE-754 NaN value, quiet its signaling bit.
Definition APFloat.h:1402
bool isNaN() const
Definition APFloat.h:1563
bool isSignaling() const
Definition APFloat.h:1567
bool isLargest() const
Definition APFloat.h:1581
bool isInfinity() const
Definition APFloat.h:1562
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:1537
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:1191
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:1692
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1365
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
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:1258
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1175
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
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:1771
bool isMask(unsigned numBits) const
Definition APInt.h:489
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:1159
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1266
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:1230
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:409
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Value * getArgOperand(unsigned i) const
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:728
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
bool isFalseWhenEqual() const
This is just a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:833
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:999
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:1598
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:1470
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 ConstantFP * getNegativeZero(Type *Ty)
Definition Constants.h:458
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * 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
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
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.
Definition Constants.cpp:68
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...
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:306
DominatorTree & getDomTree()
Definition Dominators.h:314
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
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:67
bool noInfs() const
Definition FMF.h:66
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
bool noNaNs() const
Definition FMF.h:65
Represents calls to the gc.relocate intrinsic.
LLVM_ABI Value * getBasePtr() const
LLVM_ABI Value * getDerivedPtr() const
Represents flags for the getelementptr instruction/expression.
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
This instruction compares its operands according to the predicate given to the constructor.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
This instruction inserts a struct field of array element value into an aggregate value.
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.
A wrapper class for inspecting calls to intrinsic functions.
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:1069
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:288
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
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:368
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:232
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:727
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.
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
LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor)
Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.
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)
auto m_BSwap(const Opnd0 &Op0)
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)
auto m_BitReverse(const Opnd0 &Op0)
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.
cstfp_pred_ty< is_inf > m_Inf()
Match a positive or negative infinity FP constant.
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)
auto m_Poison()
Match an arbitrary poison constant.
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)
auto m_Sqrt(const Opnd0 &Op0)
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.
auto m_UMin(const Opnd0 &Op0, const Opnd1 &Op1)
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.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
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.
auto m_UMax(const Opnd0 &Op0, const Opnd1 &Op1)
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
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.
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.
auto m_Ctpop(const Opnd0 &Op0)
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)
auto m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
auto m_FMinNum_or_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
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)
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_FAbs(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)
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
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.
auto m_VecReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
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)
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)
auto m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
auto m_FMaxNum_or_FMaximumNum(const Opnd0 &Op0, const Opnd1 &Op1)
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:573
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
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.
@ Known
Known to have no common set bits.
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.
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:2173
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:2026
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI 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 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 unsigned getInterleaveIntrinsicFactor(Intrinsic::ID ID)
Returns the corresponding factor of llvm.vector.interleaveN intrinsics.
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 * simplifyIntrinsic(Intrinsic::ID IID, Type *ReturnType, ArrayRef< Value * > Args, FastMathFlags FMF, const SimplifyQuery &Q, Function *CxtF=nullptr, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an intrinsic, fold the result or return null.
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.
LLVM_ABI 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.
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:1947
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:2166
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:26
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...
LLVM_ABI 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:862
#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
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
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 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...
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.