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