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