LLVM 24.0.0git
InstCombineCompares.cpp
Go to the documentation of this file.
1//===- InstCombineCompares.cpp --------------------------------------------===//
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 the visitICmp and visitFCmp functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APFloat.h"
15#include "llvm/ADT/APSInt.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/Statistic.h"
22#include "llvm/Analysis/Loads.h"
26#include "llvm/IR/Constants.h"
27#include "llvm/IR/DataLayout.h"
28#include "llvm/IR/InstrTypes.h"
29#include "llvm/IR/Instruction.h"
35#include <bitset>
36
37using namespace llvm;
38using namespace PatternMatch;
39
40#define DEBUG_TYPE "instcombine"
41
42// How many times is a select replaced by one of its operands?
43STATISTIC(NumSel, "Number of select opts");
44
45namespace llvm {
47}
48
49/// Compute Result = In1+In2, returning true if the result overflowed for this
50/// type.
51static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
52 bool IsSigned = false) {
53 bool Overflow;
54 if (IsSigned)
55 Result = In1.sadd_ov(In2, Overflow);
56 else
57 Result = In1.uadd_ov(In2, Overflow);
58
59 return Overflow;
60}
61
62/// Compute Result = In1-In2, returning true if the result overflowed for this
63/// type.
64static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
65 bool IsSigned = false) {
66 bool Overflow;
67 if (IsSigned)
68 Result = In1.ssub_ov(In2, Overflow);
69 else
70 Result = In1.usub_ov(In2, Overflow);
71
72 return Overflow;
73}
74
75/// Given an icmp instruction, return true if any use of this comparison is a
76/// branch on sign bit comparison.
77static bool hasBranchUse(ICmpInst &I) {
78 for (auto *U : I.users())
79 if (isa<CondBrInst>(U))
80 return true;
81 return false;
82}
83
84/// Returns true if the exploded icmp can be expressed as a signed comparison
85/// to zero and updates the predicate accordingly.
86/// The signedness of the comparison is preserved.
87/// TODO: Refactor with decomposeBitTestICmp()?
88static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
89 if (!ICmpInst::isSigned(Pred))
90 return false;
91
92 if (C.isZero())
93 return ICmpInst::isRelational(Pred);
94
95 if (C.isOne()) {
96 if (Pred == ICmpInst::ICMP_SLT) {
97 Pred = ICmpInst::ICMP_SLE;
98 return true;
99 }
100 } else if (C.isAllOnes()) {
101 if (Pred == ICmpInst::ICMP_SGT) {
102 Pred = ICmpInst::ICMP_SGE;
103 return true;
104 }
105 }
106
107 return false;
108}
109
110/// This is called when we see this pattern:
111/// cmp pred (load (gep GV, ...)), cmpcst
112/// where GV is a global variable with a constant initializer. Try to simplify
113/// this into some simple computation that does not need the load. For example
114/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
115///
116/// If AndCst is non-null, then the loaded value is masked with that constant
117/// before doing the comparison. This handles cases like "A[i]&4 == 0".
119 LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst) {
121 if (LI->isVolatile() || !GV || !GV->isConstant() ||
122 !GV->hasDefinitiveInitializer())
123 return nullptr;
124
125 Type *EltTy = LI->getType();
126 TypeSize EltSize = DL.getTypeStoreSize(EltTy);
127 if (EltSize.isScalable())
128 return nullptr;
129
131 if (!Expr.Index || Expr.BasePtr != GV || Expr.Offset.getBitWidth() > 64)
132 return nullptr;
133
134 Constant *Init = GV->getInitializer();
135 TypeSize GlobalSize = DL.getTypeAllocSize(Init->getType());
136
137 Value *Idx = Expr.Index;
138 const APInt &Stride = Expr.Scale;
139 const APInt &ConstOffset = Expr.Offset;
140
141 // Allow an additional context offset, but only within the stride.
142 if (!ConstOffset.ult(Stride))
143 return nullptr;
144
145 // Don't handle overlapping loads for now.
146 if (!Stride.uge(EltSize.getFixedValue()))
147 return nullptr;
148
149 // Don't blow up on huge arrays.
150 uint64_t ArrayElementCount =
151 divideCeil((GlobalSize.getFixedValue() - ConstOffset.getZExtValue()),
152 Stride.getZExtValue());
153 if (ArrayElementCount > MaxArraySizeForCombine)
154 return nullptr;
155
156 enum { Overdefined = -3, Undefined = -2 };
157
158 // Variables for our state machines.
159
160 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
161 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
162 // and 87 is the second (and last) index. FirstTrueElement is -2 when
163 // undefined, otherwise set to the first true element. SecondTrueElement is
164 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
165 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
166
167 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
168 // form "i != 47 & i != 87". Same state transitions as for true elements.
169 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
170
171 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
172 /// define a state machine that triggers for ranges of values that the index
173 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
174 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
175 /// index in the range (inclusive). We use -2 for undefined here because we
176 /// use relative comparisons and don't want 0-1 to match -1.
177 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
178
179 // MagicBitvector - This is a magic bitvector where we set a bit if the
180 // comparison is true for element 'i'. If there are 64 elements or less in
181 // the array, this will fully represent all the comparison results.
182 uint64_t MagicBitvector = 0;
183
184 // Scan the array and see if one of our patterns matches.
185 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
186 APInt Offset = ConstOffset;
187 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i, Offset += Stride) {
189 if (!Elt)
190 return nullptr;
191
192 // If the element is masked, handle it.
193 if (AndCst) {
194 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
195 if (!Elt)
196 return nullptr;
197 }
198
199 // Find out if the comparison would be true or false for the i'th element.
201 CompareRHS, DL, &TLI);
202 if (!C)
203 return nullptr;
204
205 // If the result is undef for this element, ignore it.
206 if (isa<UndefValue>(C)) {
207 // Extend range state machines to cover this element in case there is an
208 // undef in the middle of the range.
209 if (TrueRangeEnd == (int)i - 1)
210 TrueRangeEnd = i;
211 if (FalseRangeEnd == (int)i - 1)
212 FalseRangeEnd = i;
213 continue;
214 }
215
216 // If we can't compute the result for any of the elements, we have to give
217 // up evaluating the entire conditional.
218 if (!isa<ConstantInt>(C))
219 return nullptr;
220
221 // Otherwise, we know if the comparison is true or false for this element,
222 // update our state machines.
223 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
224
225 // State machine for single/double/range index comparison.
226 if (IsTrueForElt) {
227 // Update the TrueElement state machine.
228 if (FirstTrueElement == Undefined)
229 FirstTrueElement = TrueRangeEnd = i; // First true element.
230 else {
231 // Update double-compare state machine.
232 if (SecondTrueElement == Undefined)
233 SecondTrueElement = i;
234 else
235 SecondTrueElement = Overdefined;
236
237 // Update range state machine.
238 if (TrueRangeEnd == (int)i - 1)
239 TrueRangeEnd = i;
240 else
241 TrueRangeEnd = Overdefined;
242 }
243 } else {
244 // Update the FalseElement state machine.
245 if (FirstFalseElement == Undefined)
246 FirstFalseElement = FalseRangeEnd = i; // First false element.
247 else {
248 // Update double-compare state machine.
249 if (SecondFalseElement == Undefined)
250 SecondFalseElement = i;
251 else
252 SecondFalseElement = Overdefined;
253
254 // Update range state machine.
255 if (FalseRangeEnd == (int)i - 1)
256 FalseRangeEnd = i;
257 else
258 FalseRangeEnd = Overdefined;
259 }
260 }
261
262 // If this element is in range, update our magic bitvector.
263 if (i < 64 && IsTrueForElt)
264 MagicBitvector |= 1ULL << i;
265
266 // If all of our states become overdefined, bail out early. Since the
267 // predicate is expensive, only check it every 8 elements. This is only
268 // really useful for really huge arrays.
269 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
270 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
271 FalseRangeEnd == Overdefined)
272 return nullptr;
273 }
274
275 // Now that we've scanned the entire array, emit our new comparison(s). We
276 // order the state machines in complexity of the generated code.
277
278 // If inbounds keyword is not present, Idx * Stride can overflow.
279 // Let's assume that Stride is 2 and the wanted value is at offset 0.
280 // Then, there are two possible values for Idx to match offset 0:
281 // 0x00..00, 0x80..00.
282 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
283 // comparison is false if Idx was 0x80..00.
284 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
285 auto MaskIdx = [&](Value *Idx) {
286 if (!Expr.Flags.isInBounds() && Stride.countr_zero() != 0) {
288 Mask = Builder.CreateLShr(Mask, Stride.countr_zero());
289 Idx = Builder.CreateAnd(Idx, Mask);
290 }
291 return Idx;
292 };
293
294 // If the comparison is only true for one or two elements, emit direct
295 // comparisons.
296 if (SecondTrueElement != Overdefined) {
297 Idx = MaskIdx(Idx);
298 // None true -> false.
299 if (FirstTrueElement == Undefined)
300 return replaceInstUsesWith(ICI, Builder.getFalse());
301
302 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
303
304 // True for one element -> 'i == 47'.
305 if (SecondTrueElement == Undefined)
306 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
307
308 // True for two elements -> 'i == 47 | i == 72'.
309 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
310 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
311 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
312 return BinaryOperator::CreateOr(C1, C2);
313 }
314
315 // If the comparison is only false for one or two elements, emit direct
316 // comparisons.
317 if (SecondFalseElement != Overdefined) {
318 Idx = MaskIdx(Idx);
319 // None false -> true.
320 if (FirstFalseElement == Undefined)
321 return replaceInstUsesWith(ICI, Builder.getTrue());
322
323 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
324
325 // False for one element -> 'i != 47'.
326 if (SecondFalseElement == Undefined)
327 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
328
329 // False for two elements -> 'i != 47 & i != 72'.
330 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
331 Value *SecondFalseIdx =
332 ConstantInt::get(Idx->getType(), SecondFalseElement);
333 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
334 return BinaryOperator::CreateAnd(C1, C2);
335 }
336
337 // If the comparison can be replaced with a range comparison for the elements
338 // where it is true, emit the range check.
339 if (TrueRangeEnd != Overdefined) {
340 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
341 Idx = MaskIdx(Idx);
342
343 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
344 if (FirstTrueElement) {
345 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstTrueElement);
346 Idx = Builder.CreateAdd(Idx, Offs);
347 }
348
349 Value *End =
350 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
351 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
352 }
353
354 // False range check.
355 if (FalseRangeEnd != Overdefined) {
356 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
357 Idx = MaskIdx(Idx);
358 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
359 if (FirstFalseElement) {
360 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstFalseElement);
361 Idx = Builder.CreateAdd(Idx, Offs);
362 }
363
364 Value *End =
365 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
366 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
367 }
368
369 // If a magic bitvector captures the entire comparison state
370 // of this load, replace it with computation that does:
371 // ((magic_cst >> i) & 1) != 0
372 {
373 Type *Ty = nullptr;
374
375 // Look for an appropriate type:
376 // - The type of Idx if the magic fits
377 // - The smallest fitting legal type
378 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
379 Ty = Idx->getType();
380 else
381 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
382
383 if (Ty) {
384 Idx = MaskIdx(Idx);
385 Value *V = Builder.CreateIntCast(Idx, Ty, false);
386 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
387 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
388 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
389 }
390 }
391
392 return nullptr;
393}
394
395/// Returns true if we can rewrite Start as a GEP with pointer Base
396/// and some integer offset. The nodes that need to be re-written
397/// for this transformation will be added to Explored.
399 const DataLayout &DL,
400 SetVector<Value *> &Explored) {
401 SmallVector<Value *, 16> WorkList(1, Start);
402 Explored.insert(Base);
403
404 // The following traversal gives us an order which can be used
405 // when doing the final transformation. Since in the final
406 // transformation we create the PHI replacement instructions first,
407 // we don't have to get them in any particular order.
408 //
409 // However, for other instructions we will have to traverse the
410 // operands of an instruction first, which means that we have to
411 // do a post-order traversal.
412 while (!WorkList.empty()) {
414
415 while (!WorkList.empty()) {
416 if (Explored.size() >= 100)
417 return false;
418
419 Value *V = WorkList.back();
420
421 if (Explored.contains(V)) {
422 WorkList.pop_back();
423 continue;
424 }
425
427 // We've found some value that we can't explore which is different from
428 // the base. Therefore we can't do this transformation.
429 return false;
430
431 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
432 // Only allow inbounds GEPs with at most one variable offset.
433 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
434 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
435 return false;
436
437 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
438 if (!Explored.contains(GEP->getOperand(0)))
439 WorkList.push_back(GEP->getOperand(0));
440 }
441
442 if (WorkList.back() == V) {
443 WorkList.pop_back();
444 // We've finished visiting this node, mark it as such.
445 Explored.insert(V);
446 }
447
448 if (auto *PN = dyn_cast<PHINode>(V)) {
449 // We cannot transform PHIs on unsplittable basic blocks.
450 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
451 return false;
452 Explored.insert(PN);
453 PHIs.insert(PN);
454 }
455 }
456
457 // Explore the PHI nodes further.
458 for (auto *PN : PHIs)
459 for (Value *Op : PN->incoming_values())
460 if (!Explored.contains(Op))
461 WorkList.push_back(Op);
462 }
463
464 // Make sure that we can do this. Since we can't insert GEPs in a basic
465 // block before a PHI node, we can't easily do this transformation if
466 // we have PHI node users of transformed instructions.
467 for (Value *Val : Explored) {
468 for (Value *Use : Val->uses()) {
469
470 auto *PHI = dyn_cast<PHINode>(Use);
471 auto *Inst = dyn_cast<Instruction>(Val);
472
473 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
474 !Explored.contains(PHI))
475 continue;
476
477 if (PHI->getParent() == Inst->getParent())
478 return false;
479 }
480 }
481 return true;
482}
483
484// Sets the appropriate insert point on Builder where we can add
485// a replacement Instruction for V (if that is possible).
486static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
487 bool Before = true) {
488 if (auto *PHI = dyn_cast<PHINode>(V)) {
489 BasicBlock *Parent = PHI->getParent();
490 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
491 return;
492 }
493 if (auto *I = dyn_cast<Instruction>(V)) {
494 if (!Before)
495 I = &*std::next(I->getIterator());
496 Builder.SetInsertPoint(I);
497 return;
498 }
499 if (auto *A = dyn_cast<Argument>(V)) {
500 // Set the insertion point in the entry block.
501 BasicBlock &Entry = A->getParent()->getEntryBlock();
502 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
503 return;
504 }
505 // Otherwise, this is a constant and we don't need to set a new
506 // insertion point.
507 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
508}
509
510/// Returns a re-written value of Start as an indexed GEP using Base as a
511/// pointer.
513 const DataLayout &DL,
514 SetVector<Value *> &Explored,
515 InstCombiner &IC) {
516 // Perform all the substitutions. This is a bit tricky because we can
517 // have cycles in our use-def chains.
518 // 1. Create the PHI nodes without any incoming values.
519 // 2. Create all the other values.
520 // 3. Add the edges for the PHI nodes.
521 // 4. Emit GEPs to get the original pointers.
522 // 5. Remove the original instructions.
523 Type *IndexType = IntegerType::get(
524 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
525
527 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
528
529 // Create the new PHI nodes, without adding any incoming values.
530 for (Value *Val : Explored) {
531 if (Val == Base)
532 continue;
533 // Create empty phi nodes. This avoids cyclic dependencies when creating
534 // the remaining instructions.
535 if (auto *PHI = dyn_cast<PHINode>(Val))
536 NewInsts[PHI] =
537 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
538 PHI->getName() + ".idx", PHI->getIterator());
539 }
540 IRBuilder<> Builder(Base->getContext());
541
542 // Create all the other instructions.
543 for (Value *Val : Explored) {
544 if (NewInsts.contains(Val))
545 continue;
546
547 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
548 setInsertionPoint(Builder, GEP);
549 Value *Op = NewInsts[GEP->getOperand(0)];
550 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
552 NewInsts[GEP] = OffsetV;
553 else
554 NewInsts[GEP] = Builder.CreateAdd(
555 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
556 /*NUW=*/NW.hasNoUnsignedWrap(),
557 /*NSW=*/NW.hasNoUnsignedSignedWrap());
558 continue;
559 }
560 if (isa<PHINode>(Val))
561 continue;
562
563 llvm_unreachable("Unexpected instruction type");
564 }
565
566 // Add the incoming values to the PHI nodes.
567 for (Value *Val : Explored) {
568 if (Val == Base)
569 continue;
570 // All the instructions have been created, we can now add edges to the
571 // phi nodes.
572 if (auto *PHI = dyn_cast<PHINode>(Val)) {
573 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
574 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
575 Value *NewIncoming = PHI->getIncomingValue(I);
576
577 auto It = NewInsts.find(NewIncoming);
578 if (It != NewInsts.end())
579 NewIncoming = It->second;
580
581 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
582 }
583 }
584 }
585
586 for (Value *Val : Explored) {
587 if (Val == Base)
588 continue;
589
590 setInsertionPoint(Builder, Val, false);
591 // Create GEP for external users.
592 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
593 Val->getName() + ".ptr", NW);
594 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
595 // Add old instruction to worklist for DCE. We don't directly remove it
596 // here because the original compare is one of the users.
598 }
599
600 return NewInsts[Start];
601}
602
603/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
604/// We can look through PHIs, GEPs and casts in order to determine a common base
605/// between GEPLHS and RHS.
608 const DataLayout &DL,
609 InstCombiner &IC) {
610 // FIXME: Support vector of pointers.
611 if (GEPLHS->getType()->isVectorTy())
612 return nullptr;
613
614 if (!GEPLHS->hasAllConstantIndices())
615 return nullptr;
616
617 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
618 Value *PtrBase =
620 /*AllowNonInbounds*/ false);
621
622 // Bail if we looked through addrspacecast.
623 if (PtrBase->getType() != GEPLHS->getType())
624 return nullptr;
625
626 // The set of nodes that will take part in this transformation.
627 SetVector<Value *> Nodes;
628 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
629 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
630 return nullptr;
631
632 // We know we can re-write this as
633 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
634 // Since we've only looked through inbouds GEPs we know that we
635 // can't have overflow on either side. We can therefore re-write
636 // this as:
637 // OFFSET1 cmp OFFSET2
638 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
639
640 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
641 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
642 // offset. Since Index is the offset of LHS to the base pointer, we will now
643 // compare the offsets instead of comparing the pointers.
645 IC.Builder.getInt(Offset), NewRHS);
646}
647
648/// Fold comparisons between a GEP instruction and something else. At this point
649/// we know that the GEP is on the LHS of the comparison.
652 // Don't transform signed compares of GEPs into index compares. Even if the
653 // GEP is inbounds, the final add of the base pointer can have signed overflow
654 // and would change the result of the icmp.
655 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
656 // the maximum signed value for the pointer type.
658 return nullptr;
659
660 // Look through bitcasts and addrspacecasts. We do not however want to remove
661 // 0 GEPs.
662 if (!isa<GetElementPtrInst>(RHS))
663 RHS = RHS->stripPointerCasts();
664
665 auto CanFold = [Cond](GEPNoWrapFlags NW) {
667 return true;
668
669 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
671 return NW != GEPNoWrapFlags::none();
672 };
673
674 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
675 if (!NW.hasNoUnsignedWrap()) {
676 // Convert signed to unsigned comparison.
677 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
678 }
679
680 auto *I = new ICmpInst(Cond, Op1, Op2);
681 I->setSameSign(NW.hasNoUnsignedSignedWrap());
682 return I;
683 };
684
686 if (Base.Ptr == RHS && CanFold(Base.LHSNW) && !Base.isExpensive()) {
687 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
688 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
689 Value *Offset =
690 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEPs=*/true);
691 return NewICmp(Base.LHSNW, Offset,
692 Constant::getNullValue(Offset->getType()));
693 }
694
695 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
697 !NullPointerIsDefined(I.getFunction(),
698 RHS->getType()->getPointerAddressSpace())) {
699 // For most address spaces, an allocation can't be placed at null, but null
700 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
701 // the only valid inbounds address derived from null, is null itself.
702 // Thus, we have four cases to consider:
703 // 1) Base == nullptr, Offset == 0 -> inbounds, null
704 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
705 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
706 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
707 //
708 // (Note if we're indexing a type of size 0, that simply collapses into one
709 // of the buckets above.)
710 //
711 // In general, we're allowed to make values less poison (i.e. remove
712 // sources of full UB), so in this case, we just select between the two
713 // non-poison cases (1 and 4 above).
714 //
715 // For vectors, we apply the same reasoning on a per-lane basis.
716 auto *Base = GEPLHS->getPointerOperand();
717 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
718 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
719 Base = Builder.CreateVectorSplat(EC, Base);
720 }
721 return new ICmpInst(Cond, Base,
723 cast<Constant>(RHS), Base->getType()));
724 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
725 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
726
727 // If the base pointers are different, but the indices are the same, just
728 // compare the base pointer.
729 if (GEPLHS->getOperand(0) != GEPRHS->getOperand(0)) {
730 bool IndicesTheSame =
731 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
732 GEPLHS->getPointerOperand()->getType() ==
733 GEPRHS->getPointerOperand()->getType() &&
734 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
735 if (IndicesTheSame)
736 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
737 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
738 IndicesTheSame = false;
739 break;
740 }
741
742 // If all indices are the same, just compare the base pointers.
743 Type *BaseType = GEPLHS->getOperand(0)->getType();
744 if (IndicesTheSame &&
745 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
746 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
747
748 // If we're comparing GEPs with two base pointers that only differ in type
749 // and both GEPs have only constant indices or just one use, then fold
750 // the compare with the adjusted indices.
751 // FIXME: Support vector of pointers.
752 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
753 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
754 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
755 GEPLHS->getOperand(0)->stripPointerCasts() ==
756 GEPRHS->getOperand(0)->stripPointerCasts() &&
757 !GEPLHS->getType()->isVectorTy()) {
758 Value *LOffset = EmitGEPOffset(GEPLHS);
759 Value *ROffset = EmitGEPOffset(GEPRHS);
760
761 // If we looked through an addrspacecast between different sized address
762 // spaces, the LHS and RHS pointers are different sized
763 // integers. Truncate to the smaller one.
764 Type *LHSIndexTy = LOffset->getType();
765 Type *RHSIndexTy = ROffset->getType();
766 if (LHSIndexTy != RHSIndexTy) {
767 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
768 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
769 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
770 } else
771 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
772 }
773
775 LOffset, ROffset);
776 return replaceInstUsesWith(I, Cmp);
777 }
778 }
779
780 if (GEPLHS->getOperand(0) == GEPRHS->getOperand(0) &&
781 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
782 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
783 // If the GEPs only differ by one index, compare it.
784 unsigned NumDifferences = 0; // Keep track of # differences.
785 unsigned DiffOperand = 0; // The operand that differs.
786 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
787 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
788 Type *LHSType = GEPLHS->getOperand(i)->getType();
789 Type *RHSType = GEPRHS->getOperand(i)->getType();
790 // FIXME: Better support for vector of pointers.
791 if (LHSType->getPrimitiveSizeInBits() !=
792 RHSType->getPrimitiveSizeInBits() ||
793 (GEPLHS->getType()->isVectorTy() &&
794 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
795 // Irreconcilable differences.
796 NumDifferences = 2;
797 break;
798 }
799
800 if (NumDifferences++)
801 break;
802 DiffOperand = i;
803 }
804
805 if (NumDifferences == 0) // SAME GEP?
806 return replaceInstUsesWith(
807 I, // No comparison is needed here.
808 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
809 // If two GEPs only differ by an index, compare them.
810 // Note that nowrap flags are always needed when comparing two indices.
811 else if (NumDifferences == 1 && NW != GEPNoWrapFlags::none()) {
812 Value *LHSV = GEPLHS->getOperand(DiffOperand);
813 Value *RHSV = GEPRHS->getOperand(DiffOperand);
814 return NewICmp(NW, LHSV, RHSV);
815 }
816 }
817
818 if (Base.Ptr && !Base.isExpensive()) {
819 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
820 bool DoFold = CanFold(Base.LHSNW & Base.RHSNW);
821
822 if (!DoFold && Base.Ptr->getType()->isPointerTy()) {
823 // Without the flags, we can still fold if the offsets are constant and
824 // they cross the base's alignment boundary the same number of times, so
825 // either both arguments will wrap, or none of them will.
826 unsigned BW = DL.getIndexTypeSizeInBits(GEPLHS->getType());
827 APInt Alignment = APInt(BW, Base.Ptr->getPointerAlignment(DL).value());
828 APInt LOff(BW, 0);
829 APInt ROff(BW, 0);
831 DL, LOff, /*AllowNonInbounds=*/true) == Base.Ptr &&
832 RHS->stripAndAccumulateConstantOffsets(
833 DL, ROff, /*AllowNonInbounds=*/true) == Base.Ptr)
834 DoFold =
837 }
838
839 if (DoFold) {
840 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
841 Value *L = EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy,
842 /*RewriteGEP=*/true);
843 Value *R = EmitGEPOffsets(Base.RHSGEPs, Base.RHSNW, IdxTy,
844 /*RewriteGEP=*/true);
845 return NewICmp(Base.LHSNW & Base.RHSNW, L, R);
846 }
847 }
848 }
849
850 // Try convert this to an indexed compare by looking through PHIs/casts as a
851 // last resort.
852 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
853}
854
856 // It would be tempting to fold away comparisons between allocas and any
857 // pointer not based on that alloca (e.g. an argument). However, even
858 // though such pointers cannot alias, they can still compare equal.
859 //
860 // But LLVM doesn't specify where allocas get their memory, so if the alloca
861 // doesn't escape we can argue that it's impossible to guess its value, and we
862 // can therefore act as if any such guesses are wrong.
863 //
864 // However, we need to ensure that this folding is consistent: We can't fold
865 // one comparison to false, and then leave a different comparison against the
866 // same value alone (as it might evaluate to true at runtime, leading to a
867 // contradiction). As such, this code ensures that all comparisons are folded
868 // at the same time, and there are no other escapes.
869
870 struct CmpCaptureTracker : public CaptureTracker {
871 AllocaInst *Alloca;
872 bool Captured = false;
873 /// The value of the map is a bit mask of which icmp operands the alloca is
874 /// used in.
876
877 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
878
879 void tooManyUses() override { Captured = true; }
880
881 Action captured(const Use *U, UseCaptureInfo CI) override {
882 // TODO(captures): Use UseCaptureInfo.
883 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
884 // We need to check that U is based *only* on the alloca, and doesn't
885 // have other contributions from a select/phi operand.
886 // TODO: We could check whether getUnderlyingObjects() reduces to one
887 // object, which would allow looking through phi nodes.
888 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
889 // Collect equality icmps of the alloca, and don't treat them as
890 // captures.
891 ICmps[ICmp] |= 1u << U->getOperandNo();
892 return Continue;
893 }
894
895 Captured = true;
896 return Stop;
897 }
898 };
899
900 CmpCaptureTracker Tracker(Alloca);
901 PointerMayBeCaptured(Alloca, &Tracker);
902 if (Tracker.Captured)
903 return false;
904
905 bool Changed = false;
906 for (auto [ICmp, Operands] : Tracker.ICmps) {
907 switch (Operands) {
908 case 1:
909 case 2: {
910 // The alloca is only used in one icmp operand. Assume that the
911 // equality is false.
912 auto *Res = ConstantInt::get(ICmp->getType(),
913 ICmp->getPredicate() == ICmpInst::ICMP_NE);
914 replaceInstUsesWith(*ICmp, Res);
916 Changed = true;
917 break;
918 }
919 case 3:
920 // Both icmp operands are based on the alloca, so this is comparing
921 // pointer offsets, without leaking any information about the address
922 // of the alloca. Ignore such comparisons.
923 break;
924 default:
925 llvm_unreachable("Cannot happen");
926 }
927 }
928
929 return Changed;
930}
931
932/// Fold "icmp pred (X+C), X".
934 CmpPredicate Pred) {
935 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
936 // so the values can never be equal. Similarly for all other "or equals"
937 // operators.
938 assert(!!C && "C should not be zero!");
939
940 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
941 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
942 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
943 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
944 Constant *R =
945 ConstantInt::get(X->getType(), APInt::getMaxValue(C.getBitWidth()) - C);
946 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
947 }
948
949 // (X+1) >u X --> X <u (0-1) --> X != 255
950 // (X+2) >u X --> X <u (0-2) --> X <u 254
951 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
952 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
953 return new ICmpInst(ICmpInst::ICMP_ULT, X,
954 ConstantInt::get(X->getType(), -C));
955
956 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
957
958 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
959 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
960 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
961 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
962 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
963 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
964 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
965 return new ICmpInst(ICmpInst::ICMP_SGT, X,
966 ConstantInt::get(X->getType(), SMax - C));
967
968 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
969 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
970 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
971 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
972 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
973 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
974
975 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
976 return new ICmpInst(ICmpInst::ICMP_SLT, X,
977 ConstantInt::get(X->getType(), SMax - (C - 1)));
978}
979
980/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
981/// (icmp eq/ne A, Log2(AP2/AP1)) ->
982/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
984 const APInt &AP1,
985 const APInt &AP2) {
986 assert(I.isEquality() && "Cannot fold icmp gt/lt");
987
988 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
989 if (I.getPredicate() == I.ICMP_NE)
990 Pred = CmpInst::getInversePredicate(Pred);
991 return new ICmpInst(Pred, LHS, RHS);
992 };
993
994 // Don't bother doing any work for cases which InstSimplify handles.
995 if (AP2.isZero())
996 return nullptr;
997
998 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
999 if (IsAShr) {
1000 if (AP2.isAllOnes())
1001 return nullptr;
1002 if (AP2.isNegative() != AP1.isNegative())
1003 return nullptr;
1004 if (AP2.sgt(AP1))
1005 return nullptr;
1006 }
1007
1008 if (!AP1)
1009 // 'A' must be large enough to shift out the highest set bit.
1010 return getICmp(I.ICMP_UGT, A,
1011 ConstantInt::get(A->getType(), AP2.logBase2()));
1012
1013 if (AP1 == AP2)
1014 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1015
1016 int Shift;
1017 if (IsAShr && AP1.isNegative())
1018 Shift = AP1.countl_one() - AP2.countl_one();
1019 else
1020 Shift = AP1.countl_zero() - AP2.countl_zero();
1021
1022 if (Shift > 0) {
1023 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1024 // There are multiple solutions if we are comparing against -1 and the LHS
1025 // of the ashr is not a power of two.
1026 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1027 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1028 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1029 } else if (AP1 == AP2.lshr(Shift)) {
1030 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1031 }
1032 }
1033
1034 // Shifting const2 will never be equal to const1.
1035 // FIXME: This should always be handled by InstSimplify?
1036 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1037 return replaceInstUsesWith(I, TorF);
1038}
1039
1040/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1041/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1043 const APInt &AP1,
1044 const APInt &AP2) {
1045 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1046
1047 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1048 if (I.getPredicate() == I.ICMP_NE)
1049 Pred = CmpInst::getInversePredicate(Pred);
1050 return new ICmpInst(Pred, LHS, RHS);
1051 };
1052
1053 // Don't bother doing any work for cases which InstSimplify handles.
1054 if (AP2.isZero())
1055 return nullptr;
1056
1057 unsigned AP2TrailingZeros = AP2.countr_zero();
1058
1059 if (!AP1 && AP2TrailingZeros != 0)
1060 return getICmp(
1061 I.ICMP_UGE, A,
1062 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1063
1064 if (AP1 == AP2)
1065 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1066
1067 // Get the distance between the lowest bits that are set.
1068 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1069
1070 if (Shift > 0 && AP2.shl(Shift) == AP1)
1071 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1072
1073 // Shifting const2 will never be equal to const1.
1074 // FIXME: This should always be handled by InstSimplify?
1075 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1076 return replaceInstUsesWith(I, TorF);
1077}
1078
1079/// The caller has matched a pattern of the form:
1080/// I = icmp ugt (add (add A, B), CI2), CI1
1081/// If this is of the form:
1082/// sum = a + b
1083/// if (sum+128 >u 255)
1084/// Then replace it with llvm.sadd.with.overflow.i8.
1085///
1087 ConstantInt *CI2, ConstantInt *CI1,
1088 InstCombinerImpl &IC) {
1089 // The transformation we're trying to do here is to transform this into an
1090 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1091 // with a narrower add, and discard the add-with-constant that is part of the
1092 // range check (if we can't eliminate it, this isn't profitable).
1093
1094 // In order to eliminate the add-with-constant, the compare can be its only
1095 // use.
1096 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1097 if (!AddWithCst->hasOneUse())
1098 return nullptr;
1099
1100 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1101 if (!CI2->getValue().isPowerOf2())
1102 return nullptr;
1103 unsigned NewWidth = CI2->getValue().countr_zero();
1104 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1105 return nullptr;
1106
1107 // The width of the new add formed is 1 more than the bias.
1108 ++NewWidth;
1109
1110 // Check to see that CI1 is an all-ones value with NewWidth bits.
1111 if (CI1->getBitWidth() == NewWidth ||
1112 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1113 return nullptr;
1114
1115 // This is only really a signed overflow check if the inputs have been
1116 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1117 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1118 if (IC.ComputeMaxSignificantBits(A, &I) > NewWidth ||
1119 IC.ComputeMaxSignificantBits(B, &I) > NewWidth)
1120 return nullptr;
1121
1122 // In order to replace the original add with a narrower
1123 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1124 // and truncates that discard the high bits of the add. Verify that this is
1125 // the case.
1126 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1127 for (User *U : OrigAdd->users()) {
1128 if (U == AddWithCst)
1129 continue;
1130
1131 // Only accept truncates for now. We would really like a nice recursive
1132 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1133 // chain to see which bits of a value are actually demanded. If the
1134 // original add had another add which was then immediately truncated, we
1135 // could still do the transformation.
1137 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1138 return nullptr;
1139 }
1140
1141 // If the pattern matches, truncate the inputs to the narrower type and
1142 // use the sadd_with_overflow intrinsic to efficiently compute both the
1143 // result and the overflow bit.
1144 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1146 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1147
1148 InstCombiner::BuilderTy &Builder = IC.Builder;
1149
1150 // Put the new code above the original add, in case there are any uses of the
1151 // add between the add and the compare.
1152 Builder.SetInsertPoint(OrigAdd);
1153
1154 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1155 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1156 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1157 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1158 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1159
1160 // The inner add was the result of the narrow add, zero extended to the
1161 // wider type. Replace it with the result computed by the intrinsic.
1162 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1163 IC.eraseInstFromFunction(*OrigAdd);
1164
1165 // The original icmp gets replaced with the overflow value.
1166 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1167}
1168
1169/// If we have:
1170/// icmp eq/ne (urem/srem %x, %y), 0
1171/// iff %y is a power-of-two, we can replace this with a bit test:
1172/// icmp eq/ne (and %x, (add %y, -1)), 0
1174 // This fold is only valid for equality predicates.
1175 if (!I.isEquality())
1176 return nullptr;
1177 CmpPredicate Pred;
1178 Value *X, *Y, *Zero;
1179 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1180 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1181 return nullptr;
1182 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
1183 return nullptr;
1184 // This may increase instruction count, we don't enforce that Y is a constant.
1185 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1186 Value *Masked = Builder.CreateAnd(X, Mask);
1187 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1188}
1189
1190/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1191/// by one-less-than-bitwidth into a sign test on the original value.
1193 Instruction *Val;
1194 CmpPredicate Pred;
1195 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1196 return nullptr;
1197
1198 Value *X;
1199 Type *XTy;
1200
1201 Constant *C;
1202 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1203 XTy = X->getType();
1204 unsigned XBitWidth = XTy->getScalarSizeInBits();
1206 APInt(XBitWidth, XBitWidth - 1))))
1207 return nullptr;
1208 } else if (isa<BinaryOperator>(Val) &&
1210 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1211 /*AnalyzeForSignBitExtraction=*/true))) {
1212 XTy = X->getType();
1213 } else
1214 return nullptr;
1215
1216 return ICmpInst::Create(Instruction::ICmp,
1220}
1221
1222// Handle icmp pred X, 0
1224 CmpInst::Predicate Pred = Cmp.getPredicate();
1225 if (!match(Cmp.getOperand(1), m_Zero()))
1226 return nullptr;
1227
1228 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1229 if (Pred == ICmpInst::ICMP_SGT) {
1230 Value *A, *B;
1231 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1232 if (isKnownPositive(A, SQ.getWithInstruction(&Cmp)))
1233 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1234 if (isKnownPositive(B, SQ.getWithInstruction(&Cmp)))
1235 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1236 }
1237 }
1238
1240 return New;
1241
1242 // Given:
1243 // icmp eq/ne (urem %x, %y), 0
1244 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1245 // icmp eq/ne %x, 0
1246 Value *X, *Y;
1247 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1248 ICmpInst::isEquality(Pred)) {
1249 KnownBits XKnown = computeKnownBits(X, &Cmp);
1250 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1251 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1252 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1253 }
1254
1255 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1256 // odd/non-zero/there is no overflow.
1257 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1258 ICmpInst::isEquality(Pred)) {
1259
1260 KnownBits XKnown = computeKnownBits(X, &Cmp);
1261 // if X % 2 != 0
1262 // (icmp eq/ne Y)
1263 if (XKnown.countMaxTrailingZeros() == 0)
1264 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1265
1266 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1267 // if Y % 2 != 0
1268 // (icmp eq/ne X)
1269 if (YKnown.countMaxTrailingZeros() == 0)
1270 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1271
1272 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1273 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1274 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1275 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1276 // but to avoid unnecessary work, first just if this is an obvious case.
1277
1278 // if X non-zero and NoOverflow(X * Y)
1279 // (icmp eq/ne Y)
1280 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1281 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1282
1283 // if Y non-zero and NoOverflow(X * Y)
1284 // (icmp eq/ne X)
1285 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1286 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1287 }
1288 // Note, we are skipping cases:
1289 // if Y % 2 != 0 AND X % 2 != 0
1290 // (false/true)
1291 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1292 // (false/true)
1293 // Those can be simplified later as we would have already replaced the (icmp
1294 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1295 // will fold to a constant elsewhere.
1296 }
1297
1298 // (icmp eq/ne f(X), 0) -> (icmp eq/ne X, 0)
1299 // where f(X) == 0 if and only if X == 0
1300 if (ICmpInst::isEquality(Pred))
1301 if (Value *Stripped = stripNullTest(Cmp.getOperand(0)))
1302 return new ICmpInst(Pred, Stripped,
1303 Constant::getNullValue(Stripped->getType()));
1304
1305 return nullptr;
1306}
1307
1308/// Fold icmp eq (num + mask) & ~mask, num
1309/// to
1310/// icmp eq (and num, mask), 0
1311/// Where mask is a low bit mask.
1313 Value *Num;
1314 CmpPredicate Pred;
1315 const APInt *Mask, *Neg;
1316
1317 if (!match(&Cmp,
1318 m_c_ICmp(Pred, m_Value(Num),
1320 m_LowBitMask(Mask))),
1321 m_APInt(Neg))))))
1322 return nullptr;
1323
1324 if (*Neg != ~*Mask)
1325 return nullptr;
1326
1327 if (!ICmpInst::isEquality(Pred))
1328 return nullptr;
1329
1330 // Create new icmp eq (num & mask), 0
1331 auto *NewAnd = Builder.CreateAnd(Num, *Mask);
1332 auto *Zero = Constant::getNullValue(Num->getType());
1333
1334 return new ICmpInst(Pred, NewAnd, Zero);
1335}
1336
1337/// Fold icmp Pred X, C.
1338/// TODO: This code structure does not make sense. The saturating add fold
1339/// should be moved to some other helper and extended as noted below (it is also
1340/// possible that code has been made unnecessary - do we canonicalize IR to
1341/// overflow/saturating intrinsics or not?).
1343 // Match the following pattern, which is a common idiom when writing
1344 // overflow-safe integer arithmetic functions. The source performs an addition
1345 // in wider type and explicitly checks for overflow using comparisons against
1346 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1347 //
1348 // TODO: This could probably be generalized to handle other overflow-safe
1349 // operations if we worked out the formulas to compute the appropriate magic
1350 // constants.
1351 //
1352 // sum = a + b
1353 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1354 CmpInst::Predicate Pred = Cmp.getPredicate();
1355 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1356 Value *A, *B;
1357 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1358 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1359 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1360 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1361 return Res;
1362
1363 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1365 if (!C)
1366 return nullptr;
1367
1368 if (auto *Phi = dyn_cast<PHINode>(Op0))
1369 if (all_of(Phi->operands(), IsaPred<Constant>)) {
1371 for (Value *V : Phi->incoming_values()) {
1372 Constant *Res =
1374 if (!Res)
1375 return nullptr;
1376 Ops.push_back(Res);
1377 }
1378 Builder.SetInsertPoint(Phi);
1379 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1380 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1381 NewPhi->addIncoming(V, Pred);
1382 return replaceInstUsesWith(Cmp, NewPhi);
1383 }
1384
1386 return R;
1387
1388 return nullptr;
1389}
1390
1391/// Canonicalize icmp instructions based on dominating conditions.
1393 // We already checked simple implication in InstSimplify, only handle complex
1394 // cases here.
1395 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1396 const APInt *C;
1397 if (!match(Y, m_APInt(C)))
1398 return nullptr;
1399
1400 CmpInst::Predicate Pred = Cmp.getPredicate();
1402
1403 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1404 const APInt *DomC) -> Instruction * {
1405 // We have 2 compares of a variable with constants. Calculate the constant
1406 // ranges of those compares to see if we can transform the 2nd compare:
1407 // DomBB:
1408 // DomCond = icmp DomPred X, DomC
1409 // br DomCond, CmpBB, FalseBB
1410 // CmpBB:
1411 // Cmp = icmp Pred X, C
1412 ConstantRange DominatingCR =
1413 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1414 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1415 ConstantRange Difference = DominatingCR.difference(CR);
1416 if (Intersection.isEmptySet())
1417 return replaceInstUsesWith(Cmp, Builder.getFalse());
1418 if (Difference.isEmptySet())
1419 return replaceInstUsesWith(Cmp, Builder.getTrue());
1420
1421 // Canonicalizing a sign bit comparison that gets used in a branch,
1422 // pessimizes codegen by generating branch on zero instruction instead
1423 // of a test and branch. So we avoid canonicalizing in such situations
1424 // because test and branch instruction has better branch displacement
1425 // than compare and branch instruction.
1426 bool UnusedBit;
1427 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1428 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1429 return nullptr;
1430
1431 // Avoid an infinite loop with min/max canonicalization.
1432 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1433 if (Cmp.hasOneUse() &&
1434 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1435 return nullptr;
1436
1437 if (const APInt *EqC = Intersection.getSingleElement())
1438 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1439 if (const APInt *NeC = Difference.getSingleElement())
1440 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1441 return nullptr;
1442 };
1443
1444 for (CondBrInst *BI : DC.conditionsFor(X)) {
1445 CmpPredicate DomPred;
1446 const APInt *DomC;
1447 if (!match(BI->getCondition(),
1448 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1449 continue;
1450
1451 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1452 if (DT.dominates(Edge0, Cmp.getParent())) {
1453 if (auto *V = handleDomCond(DomPred, DomC))
1454 return V;
1455 } else {
1456 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1457 if (DT.dominates(Edge1, Cmp.getParent()))
1458 if (auto *V =
1459 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1460 return V;
1461 }
1462 }
1463
1464 return nullptr;
1465}
1466
1467/// Fold icmp (trunc X), C.
1469 TruncInst *Trunc,
1470 const APInt &C) {
1471 ICmpInst::Predicate Pred = Cmp.getPredicate();
1472 Value *X = Trunc->getOperand(0);
1473 Type *SrcTy = X->getType();
1474 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1475 SrcBits = SrcTy->getScalarSizeInBits();
1476
1477 // Match (icmp pred (trunc nuw/nsw X), C)
1478 // Which we can convert to (icmp pred X, (sext/zext C))
1479 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1480 if (Trunc->hasNoSignedWrap())
1481 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1482 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1483 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1484 }
1485
1486 if (C.isOne() && C.getBitWidth() > 1) {
1487 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1488 Value *V = nullptr;
1489 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1490 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1491 ConstantInt::get(V->getType(), 1));
1492 }
1493
1494 // TODO: Handle non-equality predicates.
1495 Value *Y;
1496 const APInt *Pow2;
1497 if (Cmp.isEquality() && match(X, m_Shl(m_Power2(Pow2), m_Value(Y))) &&
1498 DstBits > Pow2->logBase2()) {
1499 // (trunc (Pow2 << Y) to iN) == 0 --> Y u>= N - log2(Pow2)
1500 // (trunc (Pow2 << Y) to iN) != 0 --> Y u< N - log2(Pow2)
1501 // iff N > log2(Pow2)
1502 if (C.isZero()) {
1503 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1504 return new ICmpInst(NewPred, Y,
1505 ConstantInt::get(SrcTy, DstBits - Pow2->logBase2()));
1506 }
1507 // (trunc (Pow2 << Y) to iN) == 2**C --> Y == C - log2(Pow2)
1508 // (trunc (Pow2 << Y) to iN) != 2**C --> Y != C - log2(Pow2)
1509 if (C.isPowerOf2())
1510 return new ICmpInst(
1511 Pred, Y, ConstantInt::get(SrcTy, C.logBase2() - Pow2->logBase2()));
1512 }
1513
1514 if (Cmp.isEquality() && (Trunc->hasOneUse() || Trunc->hasNoUnsignedWrap())) {
1515 // Canonicalize to a mask and wider compare if the wide type is suitable:
1516 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1517 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1518 Constant *Mask =
1519 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1520 Value *And = Trunc->hasNoUnsignedWrap() ? X : Builder.CreateAnd(X, Mask);
1521 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1522 return new ICmpInst(Pred, And, WideC);
1523 }
1524
1525 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1526 // of the high bits truncated out of x are known.
1528
1529 // If all the high bits are known, we can do this xform.
1530 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1531 // Pull in the high bits from known-ones set.
1532 APInt NewRHS = C.zext(SrcBits);
1533 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1534 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1535 }
1536 }
1537
1538 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1539 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1540 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1541 Value *ShOp;
1542 uint64_t ShAmt;
1543 bool TrueIfSigned;
1544 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1545 match(X, m_Shr(m_Value(ShOp), m_ConstantInt(ShAmt))) &&
1546 DstBits == SrcBits - ShAmt) {
1547 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1549 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1551 }
1552
1553 return nullptr;
1554}
1555
1556/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1557/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1560 const SimplifyQuery &Q) {
1561 Value *X, *Y;
1562 CmpPredicate Pred;
1563 bool YIsSExt = false;
1564 // Try to match icmp (trunc X), (trunc Y)
1565 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1566 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1567 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1568 if (Cmp.isSigned()) {
1569 // For signed comparisons, both truncs must be nsw.
1570 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1571 return nullptr;
1572 } else {
1573 // For unsigned and equality comparisons, either both must be nuw or
1574 // both must be nsw, we don't care which.
1575 if (!NoWrapFlags)
1576 return nullptr;
1577 }
1578
1579 if (X->getType() != Y->getType() &&
1580 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1581 return nullptr;
1582 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1583 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1584 std::swap(X, Y);
1585 Pred = Cmp.getSwappedPredicate(Pred);
1586 }
1587 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1588 }
1589 // Try to match icmp (trunc nuw X), (zext Y)
1590 else if (!Cmp.isSigned() &&
1591 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1592 m_OneUse(m_ZExt(m_Value(Y)))))) {
1593 // Can fold trunc nuw + zext for unsigned and equality predicates.
1594 }
1595 // Try to match icmp (trunc nsw X), (sext Y)
1596 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1598 // Can fold trunc nsw + zext/sext for all predicates.
1599 YIsSExt =
1600 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1601 } else
1602 return nullptr;
1603
1604 Type *TruncTy = Cmp.getOperand(0)->getType();
1605 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1606
1607 // If this transform will end up changing from desirable types -> undesirable
1608 // types skip it.
1609 if (isDesirableIntType(TruncBits) &&
1610 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1611 return nullptr;
1612
1613 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1614 return new ICmpInst(Pred, X, NewY);
1615}
1616
1617/// Fold icmp (xor X, Y), C.
1620 const APInt &C) {
1621 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1622 return I;
1623
1624 Value *X = Xor->getOperand(0);
1625 Value *Y = Xor->getOperand(1);
1626 const APInt *XorC;
1627 if (!match(Y, m_APInt(XorC)))
1628 return nullptr;
1629
1630 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1631 // fold the xor.
1632 ICmpInst::Predicate Pred = Cmp.getPredicate();
1633 bool TrueIfSigned = false;
1634 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1635
1636 // If the sign bit of the XorCst is not set, there is no change to
1637 // the operation, just stop using the Xor.
1638 if (!XorC->isNegative())
1639 return replaceOperand(Cmp, 0, X);
1640
1641 // Emit the opposite comparison.
1642 if (TrueIfSigned)
1643 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1644 ConstantInt::getAllOnesValue(X->getType()));
1645 else
1646 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1647 ConstantInt::getNullValue(X->getType()));
1648 }
1649
1650 if (Xor->hasOneUse()) {
1651 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1652 if (!Cmp.isEquality() && XorC->isSignMask()) {
1653 Pred = Cmp.getFlippedSignednessPredicate();
1654 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1655 }
1656
1657 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1658 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1659 Pred = Cmp.getFlippedSignednessPredicate();
1660 Pred = Cmp.getSwappedPredicate(Pred);
1661 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1662 }
1663 }
1664
1665 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1666 if (Pred == ICmpInst::ICMP_UGT) {
1667 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1668 if (*XorC == ~C && (C + 1).isPowerOf2())
1669 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1670 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1671 if (*XorC == C && (C + 1).isPowerOf2())
1672 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1673 }
1674 if (Pred == ICmpInst::ICMP_ULT) {
1675 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1676 if (*XorC == -C && C.isPowerOf2())
1677 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1678 ConstantInt::get(X->getType(), ~C));
1679 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1680 if (*XorC == C && (-C).isPowerOf2())
1681 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1682 ConstantInt::get(X->getType(), ~C));
1683 }
1684 return nullptr;
1685}
1686
1687/// For power-of-2 C:
1688/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1689/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1692 const APInt &C) {
1693 CmpInst::Predicate Pred = Cmp.getPredicate();
1694 APInt PowerOf2;
1695 if (Pred == ICmpInst::ICMP_ULT)
1696 PowerOf2 = C;
1697 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1698 PowerOf2 = C + 1;
1699 else
1700 return nullptr;
1701 if (!PowerOf2.isPowerOf2())
1702 return nullptr;
1703 Value *X;
1704 const APInt *ShiftC;
1706 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1707 return nullptr;
1708 uint64_t Shift = ShiftC->getLimitedValue();
1709 Type *XType = X->getType();
1710 if (Shift == 0 || PowerOf2.isMinSignedValue())
1711 return nullptr;
1712 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1713 APInt Bound =
1714 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1715 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1716}
1717
1718/// Fold icmp (and (sh X, Y), C2), C1.
1721 const APInt &C1,
1722 const APInt &C2) {
1723 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1724 if (!Shift || !Shift->isShift())
1725 return nullptr;
1726
1727 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1728 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1729 // code produced by the clang front-end, for bitfield access.
1730 // This seemingly simple opportunity to fold away a shift turns out to be
1731 // rather complicated. See PR17827 for details.
1732 unsigned ShiftOpcode = Shift->getOpcode();
1733 bool IsShl = ShiftOpcode == Instruction::Shl;
1734 const APInt *C3;
1735 if (match(Shift->getOperand(1), m_APInt(C3))) {
1736 APInt NewAndCst, NewCmpCst;
1737 bool AnyCmpCstBitsShiftedOut;
1738 if (ShiftOpcode == Instruction::Shl) {
1739 // For a left shift, we can fold if the comparison is not signed. We can
1740 // also fold a signed comparison if the mask value and comparison value
1741 // are not negative. These constraints may not be obvious, but we can
1742 // prove that they are correct using an SMT solver.
1743 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1744 return nullptr;
1745
1746 NewCmpCst = C1.lshr(*C3);
1747 NewAndCst = C2.lshr(*C3);
1748 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1749 } else if (ShiftOpcode == Instruction::LShr) {
1750 // For a logical right shift, we can fold if the comparison is not signed.
1751 // We can also fold a signed comparison if the shifted mask value and the
1752 // shifted comparison value are not negative. These constraints may not be
1753 // obvious, but we can prove that they are correct using an SMT solver.
1754 NewCmpCst = C1.shl(*C3);
1755 NewAndCst = C2.shl(*C3);
1756 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1757 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1758 return nullptr;
1759 } else {
1760 // For an arithmetic shift, check that both constants don't use (in a
1761 // signed sense) the top bits being shifted out.
1762 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1763 NewCmpCst = C1.shl(*C3);
1764 NewAndCst = C2.shl(*C3);
1765 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1766 if (NewAndCst.ashr(*C3) != C2)
1767 return nullptr;
1768 }
1769
1770 if (AnyCmpCstBitsShiftedOut) {
1771 // If we shifted bits out, the fold is not going to work out. As a
1772 // special case, check to see if this means that the result is always
1773 // true or false now.
1774 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1775 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1776 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1777 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1778 } else {
1779 Value *NewAnd = Builder.CreateAnd(
1780 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1781 return new ICmpInst(Cmp.getPredicate(), NewAnd,
1782 ConstantInt::get(And->getType(), NewCmpCst));
1783 }
1784 }
1785
1786 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1787 // preferable because it allows the C2 << Y expression to be hoisted out of a
1788 // loop if Y is invariant and X is not.
1789 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1790 !Shift->isArithmeticShift() &&
1791 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1792 // Compute C2 << Y.
1793 Value *NewShift =
1794 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1795 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1796
1797 // Compute X & (C2 << Y).
1798 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1799 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1800 }
1801
1802 return nullptr;
1803}
1804
1805/// Fold icmp (and X, C2), C1.
1808 const APInt &C1) {
1809 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1810
1811 // icmp ne (and X, 1), 0 --> trunc X to i1
1812 if (isICMP_NE && C1.isZero() && match(And->getOperand(1), m_One()))
1813 return new TruncInst(And->getOperand(0), Cmp.getType());
1814
1815 const APInt *C2;
1816 Value *X;
1817 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1818 return nullptr;
1819
1820 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1821 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1822 C2->isNegatedPowerOf2())
1823 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1824 ConstantInt::get(X->getType(), ~*C2));
1825 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1826 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1827 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1828 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1829 ConstantInt::get(X->getType(), -*C2));
1830
1831 // Don't perform the following transforms if the AND has multiple uses
1832 if (!And->hasOneUse())
1833 return nullptr;
1834
1835 if (Cmp.isEquality() && C1.isZero()) {
1836 // Restrict this fold to single-use 'and' (PR10267).
1837 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1838 if (C2->isSignMask()) {
1839 Constant *Zero = Constant::getNullValue(X->getType());
1840 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1841 return new ICmpInst(NewPred, X, Zero);
1842 }
1843
1844 APInt NewC2 = *C2;
1845 KnownBits Know = computeKnownBits(And->getOperand(0), And);
1846 // Set high zeros of C2 to allow matching negated power-of-2.
1847 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1848 Know.countMinLeadingZeros());
1849
1850 // Restrict this fold only for single-use 'and' (PR10267).
1851 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1852 if (NewC2.isNegatedPowerOf2()) {
1853 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1854 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1855 return new ICmpInst(NewPred, X, NegBOC);
1856 }
1857 }
1858
1859 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1860 // the input width without changing the value produced, eliminate the cast:
1861 //
1862 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1863 //
1864 // We can do this transformation if the constants do not have their sign bits
1865 // set or if it is an equality comparison. Extending a relational comparison
1866 // when we're checking the sign bit would not work.
1867 Value *W;
1868 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1869 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1870 // TODO: Is this a good transform for vectors? Wider types may reduce
1871 // throughput. Should this transform be limited (even for scalars) by using
1872 // shouldChangeType()?
1873 if (!Cmp.getType()->isVectorTy()) {
1874 Type *WideType = W->getType();
1875 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1876 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1877 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1878 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1879 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1880 }
1881 }
1882
1883 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1884 return I;
1885
1886 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1887 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1888 //
1889 // iff pred isn't signed
1890 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1891 match(And->getOperand(1), m_One())) {
1892 Constant *One = cast<Constant>(And->getOperand(1));
1893 Value *Or = And->getOperand(0);
1894 Value *A, *B, *LShr;
1895 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1896 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1897 unsigned UsesRemoved = 0;
1898 if (And->hasOneUse())
1899 ++UsesRemoved;
1900 if (Or->hasOneUse())
1901 ++UsesRemoved;
1902 if (LShr->hasOneUse())
1903 ++UsesRemoved;
1904
1905 // Compute A & ((1 << B) | 1)
1906 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1907 if (UsesRemoved >= RequireUsesRemoved) {
1908 Value *NewOr =
1909 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1910 /*HasNUW=*/true),
1911 One, Or->getName());
1912 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1913 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1914 }
1915 }
1916 }
1917
1918 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1919 // llvm.is.fpclass(X, fcInf|fcNan)
1920 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1921 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1922 // (icmp eq (and (bitcast X to int), ExponentMask), 0) -->
1923 // llvm.is.fpclass(X, fcSubnormal|fcZero)
1924 // (icmp ne (and (bitcast X to int), ExponentMask), 0) -->
1925 // llvm.is.fpclass(X, ~(fcSubnormal|fcZero))
1926 Value *V;
1927 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1928 Attribute::NoImplicitFloat) &&
1929 Cmp.isEquality() &&
1931 Type *FPType = V->getType()->getScalarType();
1932 if (FPType->isIEEELikeFPTy() && (C1.isZero() || C1 == *C2)) {
1933 APInt ExponentMask =
1934 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1935 if (*C2 == ExponentMask) {
1936 unsigned Mask = C1.isZero()
1939 if (isICMP_NE)
1940 Mask = ~Mask & fcAllFlags;
1941 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1942 }
1943 }
1944 }
1945
1946 return nullptr;
1947}
1948
1949/// Fold icmp (and X, Y), C.
1952 const APInt &C) {
1953 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1954 return I;
1955
1956 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1957 bool TrueIfNeg;
1958 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1959 // ((X - 1) & ~X) < 0 --> X == 0
1960 // ((X - 1) & ~X) >= 0 --> X != 0
1961 Value *X;
1962 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1963 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1964 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1965 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1966 }
1967 // (X & -X) < 0 --> X == MinSignedC
1968 // (X & -X) > -1 --> X != MinSignedC
1969 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1970 Constant *MinSignedC = ConstantInt::get(
1971 X->getType(),
1972 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1973 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1974 return new ICmpInst(NewPred, X, MinSignedC);
1975 }
1976 }
1977
1978 // TODO: These all require that Y is constant too, so refactor with the above.
1979
1980 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1981 Value *X = And->getOperand(0);
1982 Value *Y = And->getOperand(1);
1983 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1984 if (auto *LI = dyn_cast<LoadInst>(X))
1985 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1986 if (Instruction *Res = foldCmpLoadFromIndexedGlobal(LI, GEP, Cmp, C2))
1987 return Res;
1988
1989 if (!Cmp.isEquality())
1990 return nullptr;
1991
1992 // (X & -X) == 0 --> X == 0
1993 // (X & -X) != 0 --> X != 0
1994 // (X & -X) == 1 --> trunc X to i1
1995 // (X & -X) != 1 --> !(trunc X to i1)
1996 // Cmp is == or != by the check above.
1997 Value *MatchedX;
1998 // Match X & -X in either operand order.
1999 if (C.getBitWidth() > 1 && (C.isZero() || C.isOne()) &&
2000 match(And, m_c_And(m_Neg(m_Value(MatchedX)), m_Deferred(MatchedX)))) {
2001 // Preserve the predicate: (X & -X) ==/!= 0 --> X ==/!= 0.
2002 if (C.isZero())
2003 return new ICmpInst(Pred, MatchedX, Cmp.getOperand(1));
2004
2005 // (X & -X) == 1 iff the low bit of X is set.
2006 if (Pred == CmpInst::ICMP_EQ)
2007 return new TruncInst(MatchedX, Cmp.getType());
2008
2009 // The remaining case needs a trunc and not. Require the original and
2010 // to become dead to avoid increasing the instruction count.
2011 if (And->hasOneUse()) {
2012 Value *Trunc = Builder.CreateTrunc(MatchedX, Cmp.getType());
2013 return BinaryOperator::CreateNot(Trunc);
2014 }
2015 }
2016
2017 // X & -C == -C -> X > u ~C
2018 // X & -C != -C -> X <= u ~C
2019 // iff C is a power of 2
2020 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
2021 auto NewPred =
2023 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
2024 }
2025
2026 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
2027 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
2028 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
2029 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
2031 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
2032 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
2033 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
2034 Value *And = Builder.CreateAnd(TruncY, X);
2036 }
2037 return BinaryOperator::CreateAnd(TruncY, X);
2038 }
2039
2040 // (icmp eq/ne (and (shl -1, X), Y), 0)
2041 // -> (icmp eq/ne (lshr Y, X), 0)
2042 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
2043 // highly unlikely the non-zero case will ever show up in code.
2044 if (C.isZero() &&
2046 m_Value(Y))))) {
2047 Value *LShr = Builder.CreateLShr(Y, X);
2048 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
2049 }
2050
2051 // (icmp eq/ne (and (add A, Addend), Msk), C)
2052 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2053 {
2054 Value *A;
2055 const APInt *Addend, *Msk;
2057 m_LowBitMask(Msk)))) &&
2058 C.ule(*Msk)) {
2059 APInt NewComperand = (C - *Addend) & *Msk;
2060 Value *MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2061 return new ICmpInst(Pred, MaskA,
2062 ConstantInt::get(MaskA->getType(), NewComperand));
2063 }
2064 }
2065
2066 return nullptr;
2067}
2068
2069/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2071 InstCombiner::BuilderTy &Builder) {
2072 // Are we using xors or subs to bitwise check for a pair or pairs of
2073 // (in)equalities? Convert to a shorter form that has more potential to be
2074 // folded even further.
2075 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2076 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2077 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2078 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2079 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2080 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2082 SmallVector<Value *, 16> WorkList(1, Or);
2083
2084 while (!WorkList.empty()) {
2085 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2086 Value *Lhs, *Rhs;
2087
2088 if (match(OrOperatorArgument,
2089 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2090 CmpValues.emplace_back(Lhs, Rhs);
2091 return;
2092 }
2093
2094 if (match(OrOperatorArgument,
2095 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2096 CmpValues.emplace_back(Lhs, Rhs);
2097 return;
2098 }
2099
2100 WorkList.push_back(OrOperatorArgument);
2101 };
2102
2103 Value *CurrentValue = WorkList.pop_back_val();
2104 Value *OrOperatorLhs, *OrOperatorRhs;
2105
2106 if (!match(CurrentValue,
2107 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2108 return nullptr;
2109 }
2110
2111 MatchOrOperatorArgument(OrOperatorRhs);
2112 MatchOrOperatorArgument(OrOperatorLhs);
2113 }
2114
2115 ICmpInst::Predicate Pred = Cmp.getPredicate();
2116 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2117 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2118 CmpValues.rbegin()->second);
2119
2120 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2121 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2122 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2123 }
2124
2125 return LhsCmp;
2126}
2127
2128/// Fold icmp (or X, Y), C.
2131 const APInt &C) {
2132 ICmpInst::Predicate Pred = Cmp.getPredicate();
2133 if (C.isOne()) {
2134 // icmp slt signum(V) 1 --> icmp slt V, 1
2135 Value *V = nullptr;
2136 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2137 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2138 ConstantInt::get(V->getType(), 1));
2139 }
2140
2141 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2142
2143 // (icmp eq/ne (or disjoint x, C0), C1)
2144 // -> (icmp eq/ne x, C0^C1)
2145 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2146 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2147 Value *NewC =
2148 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2149 return new ICmpInst(Pred, OrOp0, NewC);
2150 }
2151
2152 const APInt *MaskC;
2153 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2154 if (*MaskC == C && (C + 1).isPowerOf2()) {
2155 // X | C == C --> X <=u C
2156 // X | C != C --> X >u C
2157 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2159 return new ICmpInst(Pred, OrOp0, OrOp1);
2160 }
2161
2162 // More general: canonicalize 'equality with set bits mask' to
2163 // 'equality with clear bits mask'.
2164 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2165 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2166 if (Or->hasOneUse()) {
2167 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2168 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2169 return new ICmpInst(Pred, And, NewC);
2170 }
2171 }
2172
2173 // (X | (X-1)) s< 0 --> X s< 1
2174 // (X | (X-1)) s> -1 --> X s> 0
2175 Value *X;
2176 bool TrueIfSigned;
2177 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2179 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2180 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2181 return new ICmpInst(NewPred, X, NewC);
2182 }
2183
2184 const APInt *OrC;
2185 // icmp(X | OrC, C) --> icmp(X, 0)
2186 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2187 switch (Pred) {
2188 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2189 case ICmpInst::ICMP_SLT:
2190 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2191 case ICmpInst::ICMP_SGE:
2192 if (OrC->sge(C))
2193 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2194 break;
2195 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2196 case ICmpInst::ICMP_SLE:
2197 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2198 case ICmpInst::ICMP_SGT:
2199 if (OrC->sgt(C))
2201 ConstantInt::getNullValue(X->getType()));
2202 break;
2203 default:
2204 break;
2205 }
2206 }
2207
2208 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2209 return nullptr;
2210
2211 Value *P, *Q;
2213 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2214 // -> and (icmp eq P, null), (icmp eq Q, null).
2215 Value *CmpP =
2216 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2217 Value *CmpQ =
2218 Builder.CreateICmp(Pred, Q, ConstantInt::getNullValue(Q->getType()));
2219 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2220 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2221 }
2222
2223 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2224 return replaceInstUsesWith(Cmp, V);
2225
2226 return nullptr;
2227}
2228
2229/// Fold icmp (mul X, Y), C.
2232 const APInt &C) {
2233 ICmpInst::Predicate Pred = Cmp.getPredicate();
2234 Type *MulTy = Mul->getType();
2235 Value *X = Mul->getOperand(0);
2236
2237 // If comparing a square with a constant, try simplifying to comparing square
2238 // roots.
2239 if (X == Mul->getOperand(1) && !Cmp.isSigned()) {
2240 APInt R = C.sqrtFloor();
2241 bool IsSqr = C == R * R;
2242
2243 // X * X eq/ne C
2244 if (Cmp.isEquality() &&
2245 (Mul->hasNoUnsignedWrap() || (Mul->hasNoSignedWrap() && C.isZero()))) {
2246
2247 // If constant is not a square, eq/ne is false/true respectively
2248 if (!IsSqr)
2249 return replaceInstUsesWith(
2250 Cmp,
2251 ConstantInt::getBool(Cmp.getType(), Pred == ICmpInst::ICMP_NE));
2252
2253 return new ICmpInst(Pred, X, ConstantInt::get(MulTy, R));
2254 }
2255
2256 // If the multiply does not wrap
2257 // X * X pred C --> X pred R
2258 if (Mul->hasNoUnsignedWrap()) {
2259
2260 if (IsSqr)
2261 return new ICmpInst(Pred, X, ConstantInt::get(MulTy, R));
2262
2263 // If C is not a square, we use floor/ceil of sqrt(C).
2264 //
2265 // If LT or LE, we need R to be an overestimate of sqrt(C),
2266 // then use the strict predicate (LT->LT, LE->LT).
2267 //
2268 // If GT or GE, we need R to be an underestimate of sqrt(C),
2269 // then use the strict predicate (GT->GT, GE->GT).
2270 //
2271 // R is already an underestimate of sqrt(C) due to sqrtFloor.
2272 if (ICmpInst::isLT(Pred) || ICmpInst::isLE(Pred))
2273 ++R;
2274
2275 return new ICmpInst(Cmp.getStrictPredicate(), X,
2276 ConstantInt::get(MulTy, R));
2277 }
2278 }
2279
2280 const APInt *MulC;
2281 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2282 return nullptr;
2283
2284 // If this is a test of the sign bit and the multiply is sign-preserving with
2285 // a constant operand, use the multiply LHS operand instead:
2286 // (X * +MulC) < 0 --> X < 0
2287 // (X * -MulC) < 0 --> X > 0
2288 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2289 if (MulC->isNegative())
2290 Pred = ICmpInst::getSwappedPredicate(Pred);
2291 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2292 }
2293
2294 if (MulC->isZero())
2295 return nullptr;
2296
2297 // If the multiply does not wrap or the constant is odd, try to divide the
2298 // compare constant by the multiplication factor.
2299 if (Cmp.isEquality()) {
2300 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2301 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2302 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2303 return new ICmpInst(Pred, X, NewC);
2304 }
2305
2306 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2307 // correct to transform if MulC * N == C including overflow. I.e with i8
2308 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2309 // miss that case.
2310 if (C.urem(*MulC).isZero()) {
2311 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2312 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2313 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2314 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2315 return new ICmpInst(Pred, X, NewC);
2316 }
2317 }
2318 }
2319
2320 // With a matching no-overflow guarantee, fold the constants:
2321 // (X * MulC) < C --> X < (C / MulC)
2322 // (X * MulC) > C --> X > (C / MulC)
2323 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2324 Constant *NewC = nullptr;
2325 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2326 // MININT / -1 --> overflow.
2327 if (C.isMinSignedValue() && MulC->isAllOnes())
2328 return nullptr;
2329 if (MulC->isNegative())
2330 Pred = ICmpInst::getSwappedPredicate(Pred);
2331
2332 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2333 NewC = ConstantInt::get(
2335 } else {
2336 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2337 "Unexpected predicate");
2338 NewC = ConstantInt::get(
2340 }
2341 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2342 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2343 NewC = ConstantInt::get(
2345 } else {
2346 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2347 "Unexpected predicate");
2348 NewC = ConstantInt::get(
2350 }
2351 }
2352
2353 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2354}
2355
2356/// Fold icmp (shl nuw C2, Y), C.
2358 const APInt &C) {
2359 Value *Y;
2360 const APInt *C2;
2361 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2362 return nullptr;
2363
2364 Type *ShiftType = Shl->getType();
2365 unsigned TypeBits = C.getBitWidth();
2366 ICmpInst::Predicate Pred = Cmp.getPredicate();
2367 if (Cmp.isUnsigned()) {
2368 if (C2->isZero() || C2->ugt(C))
2369 return nullptr;
2370 APInt Div, Rem;
2371 APInt::udivrem(C, *C2, Div, Rem);
2372 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2373
2374 // (1 << Y) pred C -> Y pred Log2(C)
2375 if (!CIsPowerOf2) {
2376 // (1 << Y) < 30 -> Y <= 4
2377 // (1 << Y) <= 30 -> Y <= 4
2378 // (1 << Y) >= 30 -> Y > 4
2379 // (1 << Y) > 30 -> Y > 4
2380 if (Pred == ICmpInst::ICMP_ULT)
2381 Pred = ICmpInst::ICMP_ULE;
2382 else if (Pred == ICmpInst::ICMP_UGE)
2383 Pred = ICmpInst::ICMP_UGT;
2384 }
2385
2386 unsigned CLog2 = Div.logBase2();
2387 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2388 } else if (Cmp.isSigned() && C2->isOne()) {
2389 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2390 // (1 << Y) > 0 -> Y != 31
2391 // (1 << Y) > C -> Y != 31 if C is negative.
2392 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2393 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2394
2395 // (1 << Y) < 0 -> Y == 31
2396 // (1 << Y) < 1 -> Y == 31
2397 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2398 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2399 if (Pred == ICmpInst::ICMP_SLT && (C - 1).sle(0))
2400 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2401 }
2402
2403 return nullptr;
2404}
2405
2406/// Fold icmp (shl X, Y), C.
2408 BinaryOperator *Shl,
2409 const APInt &C) {
2410 const APInt *ShiftVal;
2411 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2412 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2413
2414 ICmpInst::Predicate Pred = Cmp.getPredicate();
2415 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2416 // -> (icmp pred X, Csle0)
2417 //
2418 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2419 // so X's must be what is used.
2420 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2421 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2422
2423 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2424 // -> (icmp eq/ne X, 0)
2425 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2426 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2427 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2428
2429 // (icmp slt (shl nsw X, Y), 0/1)
2430 // -> (icmp slt X, 0/1)
2431 // (icmp sgt (shl nsw X, Y), 0/-1)
2432 // -> (icmp sgt X, 0/-1)
2433 //
2434 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2435 if (Shl->hasNoSignedWrap() &&
2436 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2437 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2438 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2439
2440 const APInt *ShiftAmt;
2441 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2442 return foldICmpShlLHSC(Cmp, Shl, C);
2443
2444 // Check that the shift amount is in range. If not, don't perform undefined
2445 // shifts. When the shift is visited, it will be simplified.
2446 unsigned TypeBits = C.getBitWidth();
2447 if (ShiftAmt->uge(TypeBits))
2448 return nullptr;
2449
2450 Value *X = Shl->getOperand(0);
2451 Type *ShType = Shl->getType();
2452
2453 // NSW guarantees that we are only shifting out sign bits from the high bits,
2454 // so we can ASHR the compare constant without needing a mask and eliminate
2455 // the shift.
2456 if (Shl->hasNoSignedWrap()) {
2457 if (Pred == ICmpInst::ICMP_SGT) {
2458 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2459 APInt ShiftedC = C.ashr(*ShiftAmt);
2460 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2461 }
2462 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2463 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2464 APInt ShiftedC = C.ashr(*ShiftAmt);
2465 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2466 }
2467 if (Pred == ICmpInst::ICMP_SLT) {
2468 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2469 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2470 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2471 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2472 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2473 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2474 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2475 }
2476 }
2477
2478 // NUW guarantees that we are only shifting out zero bits from the high bits,
2479 // so we can LSHR the compare constant without needing a mask and eliminate
2480 // the shift.
2481 if (Shl->hasNoUnsignedWrap()) {
2482 if (Pred == ICmpInst::ICMP_UGT) {
2483 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2484 APInt ShiftedC = C.lshr(*ShiftAmt);
2485 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2486 }
2487 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2488 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2489 APInt ShiftedC = C.lshr(*ShiftAmt);
2490 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2491 }
2492 if (Pred == ICmpInst::ICMP_ULT) {
2493 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2494 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2495 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2496 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2497 assert(C.ugt(0) && "ult 0 should have been eliminated");
2498 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2499 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2500 }
2501 }
2502
2503 if (Cmp.isEquality() && Shl->hasOneUse()) {
2504 // Strength-reduce the shift into an 'and'.
2505 Constant *Mask = ConstantInt::get(
2506 ShType,
2507 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2508 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2509 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2510 return new ICmpInst(Pred, And, LShrC);
2511 }
2512
2513 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2514 bool TrueIfSigned = false;
2515 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2516 // (X << 31) <s 0 --> (X & 1) != 0
2517 Constant *Mask = ConstantInt::get(
2518 ShType,
2519 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2520 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2521 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2522 And, Constant::getNullValue(ShType));
2523 }
2524
2525 // Simplify 'shl' inequality test into 'and' equality test.
2526 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2527 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2528 if ((C + 1).isPowerOf2() &&
2529 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2530 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2531 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2533 And, Constant::getNullValue(ShType));
2534 }
2535 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2536 if (C.isPowerOf2() &&
2537 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2538 Value *And =
2539 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2540 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2542 And, Constant::getNullValue(ShType));
2543 }
2544 }
2545
2546 // Transform (icmp pred iM (shl iM %v, N), C)
2547 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2548 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2549 // This enables us to get rid of the shift in favor of a trunc that may be
2550 // free on the target. It has the additional benefit of comparing to a
2551 // smaller constant that may be more target-friendly.
2552 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2553 if (Shl->hasOneUse() && Amt != 0 &&
2554 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2555 ICmpInst::Predicate CmpPred = Pred;
2556 APInt RHSC = C;
2557
2558 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2559 // Try the flipped strictness predicate.
2560 // e.g.:
2561 // icmp ult i64 (shl X, 32), 8589934593 ->
2562 // icmp ule i64 (shl X, 32), 8589934592 ->
2563 // icmp ule i32 (trunc X, i32), 2 ->
2564 // icmp ult i32 (trunc X, i32), 3
2565 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2566 Pred, ConstantInt::get(ShType->getContext(), C))) {
2567 CmpPred = FlippedStrictness->first;
2568 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2569 }
2570 }
2571
2572 if (RHSC.countr_zero() >= Amt) {
2573 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2574 Constant *NewC =
2575 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2576 return new ICmpInst(CmpPred,
2577 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2578 Shl->hasNoSignedWrap()),
2579 NewC);
2580 }
2581 }
2582
2583 return nullptr;
2584}
2585
2586/// Fold icmp ({al}shr X, Y), C.
2588 BinaryOperator *Shr,
2589 const APInt &C) {
2590 // An exact shr only shifts out zero bits, so:
2591 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2592 Value *X = Shr->getOperand(0);
2593 CmpInst::Predicate Pred = Cmp.getPredicate();
2594 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2595 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2596
2597 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2598 const APInt *ShiftValC;
2599 if (match(X, m_APInt(ShiftValC))) {
2600 if (Cmp.isEquality())
2601 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2602
2603 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2604 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2605 bool TrueIfSigned;
2606 if (!IsAShr && ShiftValC->isNegative() &&
2607 isSignBitCheck(Pred, C, TrueIfSigned))
2608 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2609 Shr->getOperand(1),
2610 ConstantInt::getNullValue(X->getType()));
2611
2612 // If the shifted constant is a power-of-2, test the shift amount directly:
2613 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2614 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2615 if (!IsAShr && ShiftValC->isPowerOf2() &&
2616 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2617 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2618 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2619 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2620
2621 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2622 unsigned ShiftLZ = ShiftValC->countl_zero();
2623 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2624 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2625 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2626 }
2627 }
2628
2629 const APInt *ShiftAmtC;
2630 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2631 return nullptr;
2632
2633 // Check that the shift amount is in range. If not, don't perform undefined
2634 // shifts. When the shift is visited it will be simplified.
2635 unsigned TypeBits = C.getBitWidth();
2636 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2637 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2638 return nullptr;
2639
2640 bool IsExact = Shr->isExact();
2641 Type *ShrTy = Shr->getType();
2642 // TODO: If we could guarantee that InstSimplify would handle all of the
2643 // constant-value-based preconditions in the folds below, then we could assert
2644 // those conditions rather than checking them. This is difficult because of
2645 // undef/poison (PR34838).
2646 if (IsAShr && Shr->hasOneUse()) {
2647 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2648 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2649 // When C - 1 is a power of two and the transform can be legally
2650 // performed, prefer this form so the produced constant is close to a
2651 // power of two.
2652 // icmp slt/ult (ashr exact X, ShAmtC), C
2653 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2654 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2655 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2656 }
2657 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2658 // When ShAmtC can be shifted losslessly:
2659 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2660 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2661 APInt ShiftedC = C.shl(ShAmtVal);
2662 if (ShiftedC.ashr(ShAmtVal) == C)
2663 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2664 }
2665 if (Pred == CmpInst::ICMP_SGT) {
2666 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2667 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2668 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2669 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2670 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2671 }
2672 if (Pred == CmpInst::ICMP_UGT) {
2673 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2674 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2675 // clause accounts for that pattern.
2676 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2677 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2678 (C + 1).shl(ShAmtVal).isMinSignedValue())
2679 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2680 }
2681
2682 // If the compare constant has significant bits above the lowest sign-bit,
2683 // then convert an unsigned cmp to a test of the sign-bit:
2684 // (ashr X, ShiftC) u> C --> X s< 0
2685 // (ashr X, ShiftC) u< C --> X s> -1
2686 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2687 if (Pred == CmpInst::ICMP_UGT) {
2688 return new ICmpInst(CmpInst::ICMP_SLT, X,
2690 }
2691 if (Pred == CmpInst::ICMP_ULT) {
2692 return new ICmpInst(CmpInst::ICMP_SGT, X,
2694 }
2695 }
2696 } else if (!IsAShr) {
2697 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2698 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2699 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2700 APInt ShiftedC = C.shl(ShAmtVal);
2701 if (ShiftedC.lshr(ShAmtVal) == C)
2702 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2703 }
2704 if (Pred == CmpInst::ICMP_UGT) {
2705 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2706 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2707 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2708 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2709 }
2710 }
2711
2712 if (!Cmp.isEquality())
2713 return nullptr;
2714
2715 // Handle equality comparisons of shift-by-constant.
2716
2717 // If the comparison constant changes with the shift, the comparison cannot
2718 // succeed (bits of the comparison constant cannot match the shifted value).
2719 // This should be known by InstSimplify and already be folded to true/false.
2720 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2721 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2722 "Expected icmp+shr simplify did not occur.");
2723
2724 // If the bits shifted out are known zero, compare the unshifted value:
2725 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2726 if (Shr->isExact())
2727 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2728
2729 if (Shr->hasOneUse()) {
2730 // Canonicalize the shift into an 'and':
2731 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2732 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2733 Constant *Mask = ConstantInt::get(ShrTy, Val);
2734 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2735 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2736 }
2737
2738 return nullptr;
2739}
2740
2742 BinaryOperator *SRem,
2743 const APInt &C) {
2744 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2745 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2746 // Canonicalize unsigned predicates to signed:
2747 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2748 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2749 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2750 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2751
2752 const APInt *DivisorC;
2753 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2754 return nullptr;
2755 if (DivisorC->isZero())
2756 return nullptr;
2757
2758 APInt NormalizedC = C;
2759 if (Pred == ICmpInst::ICMP_ULT) {
2760 assert(!NormalizedC.isZero() &&
2761 "ult X, 0 should have been simplified already.");
2762 --NormalizedC;
2763 }
2764 if (C.isNegative())
2765 NormalizedC.flipAllBits();
2766 if (!NormalizedC.uge(DivisorC->abs() - 1))
2767 return nullptr;
2768
2769 Type *Ty = SRem->getType();
2770 if (Pred == ICmpInst::ICMP_UGT)
2771 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2773 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2775 }
2776 // Match an 'is positive' or 'is negative' comparison of remainder by a
2777 // constant power-of-2 value:
2778 // (X % pow2C) sgt/slt 0
2779 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2780 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2781 return nullptr;
2782
2783 // TODO: The one-use check is standard because we do not typically want to
2784 // create longer instruction sequences, but this might be a special-case
2785 // because srem is not good for analysis or codegen.
2786 if (!SRem->hasOneUse())
2787 return nullptr;
2788
2789 const APInt *DivisorC;
2790 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2791 return nullptr;
2792
2793 // For cmp_sgt/cmp_slt only zero valued C is handled.
2794 // For cmp_eq/cmp_ne only positive valued C is handled.
2795 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2796 !C.isZero()) ||
2797 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2798 !C.isStrictlyPositive()))
2799 return nullptr;
2800
2801 // Mask off the sign bit and the modulo bits (low-bits).
2802 Type *Ty = SRem->getType();
2803 APInt SignMask = APInt::getSignMask(Ty->getScalarSizeInBits());
2804 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2805 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2806
2807 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2808 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2809
2810 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2811 // bit is set. Example:
2812 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2813 if (Pred == ICmpInst::ICMP_SGT)
2815
2816 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2817 // bit is set. Example:
2818 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2819 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2820}
2821
2822/// Fold icmp (udiv X, Y), C.
2824 BinaryOperator *UDiv,
2825 const APInt &C) {
2826 ICmpInst::Predicate Pred = Cmp.getPredicate();
2827 Value *X = UDiv->getOperand(0);
2828 Value *Y = UDiv->getOperand(1);
2829 Type *Ty = UDiv->getType();
2830
2831 const APInt *C2;
2832 if (!match(X, m_APInt(C2)))
2833 return nullptr;
2834
2835 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2836
2837 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2838 if (Pred == ICmpInst::ICMP_UGT) {
2839 assert(!C.isMaxValue() &&
2840 "icmp ugt X, UINT_MAX should have been simplified already.");
2841 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2842 ConstantInt::get(Ty, C2->udiv(C + 1)));
2843 }
2844
2845 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2846 if (Pred == ICmpInst::ICMP_ULT) {
2847 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2848 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2849 ConstantInt::get(Ty, C2->udiv(C)));
2850 }
2851
2852 return nullptr;
2853}
2854
2855/// Fold icmp ({su}div X, Y), C.
2857 BinaryOperator *Div,
2858 const APInt &C) {
2859 ICmpInst::Predicate Pred = Cmp.getPredicate();
2860 Value *X = Div->getOperand(0);
2861 Value *Y = Div->getOperand(1);
2862 Type *Ty = Div->getType();
2863 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2864
2865 // If unsigned division and the compare constant is bigger than
2866 // UMAX/2 (negative), there's only one pair of values that satisfies an
2867 // equality check, so eliminate the division:
2868 // (X u/ Y) == C --> (X == C) && (Y == 1)
2869 // (X u/ Y) != C --> (X != C) || (Y != 1)
2870 // Similarly, if signed division and the compare constant is exactly SMIN:
2871 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2872 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2873 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2874 (!DivIsSigned || C.isMinSignedValue())) {
2875 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2876 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2877 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2878 return BinaryOperator::Create(Logic, XBig, YOne);
2879 }
2880
2881 // Fold: icmp pred ([us]div X, C2), C -> range test
2882 // Fold this div into the comparison, producing a range check.
2883 // Determine, based on the divide type, what the range is being
2884 // checked. If there is an overflow on the low or high side, remember
2885 // it, otherwise compute the range [low, hi) bounding the new value.
2886 // See: InsertRangeTest above for the kinds of replacements possible.
2887 const APInt *C2;
2888 if (!match(Y, m_APInt(C2)))
2889 return nullptr;
2890
2891 // FIXME: If the operand types don't match the type of the divide
2892 // then don't attempt this transform. The code below doesn't have the
2893 // logic to deal with a signed divide and an unsigned compare (and
2894 // vice versa). This is because (x /s C2) <s C produces different
2895 // results than (x /s C2) <u C or (x /u C2) <s C or even
2896 // (x /u C2) <u C. Simply casting the operands and result won't
2897 // work. :( The if statement below tests that condition and bails
2898 // if it finds it.
2899 // However, when the divisor is a positive constant and the dividend is
2900 // known non-negative, sdiv is equivalent to udiv, so we can lower
2901 // DivIsSigned and proceed through the unsigned path.
2902 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned()) {
2903 if (!DivIsSigned || !C2->isStrictlyPositive() ||
2904 !isKnownNonNegative(X, SQ.getWithInstruction(&Cmp)))
2905 return nullptr;
2906 DivIsSigned = false;
2907 }
2908
2909 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2910 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2911 // division-by-constant cases should be present, we can not assert that they
2912 // have happened before we reach this icmp instruction.
2913 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2914 return nullptr;
2915
2916 // Compute Prod = C * C2. We are essentially solving an equation of
2917 // form X / C2 = C. We solve for X by multiplying C2 and C.
2918 // By solving for X, we can turn this into a range check instead of computing
2919 // a divide.
2920 APInt Prod = C * *C2;
2921
2922 // Determine if the product overflows by seeing if the product is not equal to
2923 // the divide. Make sure we do the same kind of divide as in the LHS
2924 // instruction that we're folding.
2925 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2926
2927 // If the division is known to be exact, then there is no remainder from the
2928 // divide, so the covered range size is unit, otherwise it is the divisor.
2929 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2930
2931 // Figure out the interval that is being checked. For example, a comparison
2932 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2933 // Compute this interval based on the constants involved and the signedness of
2934 // the compare/divide. This computes a half-open interval, keeping track of
2935 // whether either value in the interval overflows. After analysis each
2936 // overflow variable is set to 0 if it's corresponding bound variable is valid
2937 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2938 int LoOverflow = 0, HiOverflow = 0;
2939 APInt LoBound, HiBound;
2940
2941 if (!DivIsSigned) { // udiv
2942 // e.g. X/5 op 3 --> [15, 20)
2943 LoBound = Prod;
2944 HiOverflow = LoOverflow = ProdOV;
2945 if (!HiOverflow) {
2946 // If this is not an exact divide, then many values in the range collapse
2947 // to the same result value.
2948 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2949 }
2950 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2951 if (C.isZero()) { // (X / pos) op 0
2952 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2953 LoBound = -(RangeSize - 1);
2954 HiBound = RangeSize;
2955 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2956 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2957 HiOverflow = LoOverflow = ProdOV;
2958 if (!HiOverflow)
2959 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2960 } else { // (X / pos) op neg
2961 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2962 HiBound = Prod + 1;
2963 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2964 if (!LoOverflow) {
2965 APInt DivNeg = -RangeSize;
2966 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2967 }
2968 }
2969 } else if (C2->isNegative()) { // Divisor is < 0.
2970 if (Div->isExact())
2971 RangeSize.negate();
2972 if (C.isZero()) { // (X / neg) op 0
2973 // e.g. X/-5 op 0 --> [-4, 5)
2974 LoBound = RangeSize + 1;
2975 HiBound = -RangeSize;
2976 if (HiBound == *C2) { // -INTMIN = INTMIN
2977 HiOverflow = 1; // [INTMIN+1, overflow)
2978 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2979 }
2980 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2981 // e.g. X/-5 op 3 --> [-19, -14)
2982 HiBound = Prod + 1;
2983 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2984 if (!LoOverflow)
2985 LoOverflow =
2986 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2987 } else { // (X / neg) op neg
2988 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2989 LoOverflow = HiOverflow = ProdOV;
2990 if (!HiOverflow)
2991 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2992 }
2993
2994 // Dividing by a negative swaps the condition. LT <-> GT
2995 Pred = ICmpInst::getSwappedPredicate(Pred);
2996 }
2997
2998 switch (Pred) {
2999 default:
3000 llvm_unreachable("Unhandled icmp predicate!");
3001 case ICmpInst::ICMP_EQ:
3002 if (LoOverflow && HiOverflow)
3003 return replaceInstUsesWith(Cmp, Builder.getFalse());
3004 if (HiOverflow)
3005 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
3006 X, ConstantInt::get(Ty, LoBound));
3007 if (LoOverflow)
3008 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
3009 X, ConstantInt::get(Ty, HiBound));
3010 return replaceInstUsesWith(
3011 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
3012 case ICmpInst::ICMP_NE:
3013 if (LoOverflow && HiOverflow)
3014 return replaceInstUsesWith(Cmp, Builder.getTrue());
3015 if (HiOverflow)
3016 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
3017 X, ConstantInt::get(Ty, LoBound));
3018 if (LoOverflow)
3019 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
3020 X, ConstantInt::get(Ty, HiBound));
3021 return replaceInstUsesWith(
3022 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
3023 case ICmpInst::ICMP_ULT:
3024 case ICmpInst::ICMP_SLT:
3025 if (LoOverflow == +1) // Low bound is greater than input range.
3026 return replaceInstUsesWith(Cmp, Builder.getTrue());
3027 if (LoOverflow == -1) // Low bound is less than input range.
3028 return replaceInstUsesWith(Cmp, Builder.getFalse());
3029 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
3030 case ICmpInst::ICMP_UGT:
3031 case ICmpInst::ICMP_SGT:
3032 if (HiOverflow == +1) // High bound greater than input range.
3033 return replaceInstUsesWith(Cmp, Builder.getFalse());
3034 if (HiOverflow == -1) // High bound less than input range.
3035 return replaceInstUsesWith(Cmp, Builder.getTrue());
3036 if (Pred == ICmpInst::ICMP_UGT)
3037 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
3038 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
3039 }
3040
3041 return nullptr;
3042}
3043
3044/// Fold icmp (sub X, Y), C.
3047 const APInt &C) {
3048 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
3049 ICmpInst::Predicate Pred = Cmp.getPredicate();
3050 Type *Ty = Sub->getType();
3051
3052 // (SubC - Y) == C) --> Y == (SubC - C)
3053 // (SubC - Y) != C) --> Y != (SubC - C)
3054 Constant *SubC;
3055 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
3056 return new ICmpInst(Pred, Y,
3057 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
3058 }
3059
3060 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
3061 const APInt *C2;
3062 APInt SubResult;
3063 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
3064 bool HasNSW = Sub->hasNoSignedWrap();
3065 bool HasNUW = Sub->hasNoUnsignedWrap();
3066 if (match(X, m_APInt(C2)) &&
3067 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
3068 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
3069 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
3070
3071 // X - Y == 0 --> X == Y.
3072 // X - Y != 0 --> X != Y.
3073 // TODO: We allow this with multiple uses as long as the other uses are not
3074 // in phis. The phi use check is guarding against a codegen regression
3075 // for a loop test. If the backend could undo this (and possibly
3076 // subsequent transforms), we would not need this hack.
3077 if (Cmp.isEquality() && C.isZero() &&
3078 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
3079 return new ICmpInst(Pred, X, Y);
3080
3081 // The following transforms are only worth it if the only user of the subtract
3082 // is the icmp.
3083 // TODO: This is an artificial restriction for all of the transforms below
3084 // that only need a single replacement icmp. Can these use the phi test
3085 // like the transform above here?
3086 if (!Sub->hasOneUse())
3087 return nullptr;
3088
3089 if (Sub->hasNoSignedWrap()) {
3090 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3091 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3092 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3093
3094 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3095 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3096 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3097
3098 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3099 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3100 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3101
3102 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3103 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3104 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3105 }
3106
3107 if (!match(X, m_APInt(C2)))
3108 return nullptr;
3109
3110 // C2 - Y <u C -> (Y | (C - 1)) == C2
3111 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3112 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3113 (*C2 & (C - 1)) == (C - 1))
3114 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3115
3116 // C2 - Y >u C -> (Y | C) != C2
3117 // iff C2 & C == C and C + 1 is a power of 2
3118 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3119 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3120
3121 // We have handled special cases that reduce.
3122 // Canonicalize any remaining sub to add as:
3123 // (C2 - Y) > C --> (Y + ~C2) < ~C
3124 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3125 HasNUW, HasNSW);
3126 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3127}
3128
3129static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3130 Value *Op1, IRBuilderBase &Builder,
3131 bool HasOneUse) {
3132 auto FoldConstant = [&](bool Val) {
3133 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3134 if (Op0->getType()->isVectorTy())
3136 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3137 return Res;
3138 };
3139
3140 switch (Table.to_ulong()) {
3141 case 0: // 0 0 0 0
3142 return FoldConstant(false);
3143 case 1: // 0 0 0 1
3144 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3145 case 2: // 0 0 1 0
3146 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3147 case 3: // 0 0 1 1
3148 return Builder.CreateNot(Op0);
3149 case 4: // 0 1 0 0
3150 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3151 case 5: // 0 1 0 1
3152 return Builder.CreateNot(Op1);
3153 case 6: // 0 1 1 0
3154 return Builder.CreateXor(Op0, Op1);
3155 case 7: // 0 1 1 1
3156 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3157 case 8: // 1 0 0 0
3158 return Builder.CreateAnd(Op0, Op1);
3159 case 9: // 1 0 0 1
3160 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3161 case 10: // 1 0 1 0
3162 return Op1;
3163 case 11: // 1 0 1 1
3164 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3165 case 12: // 1 1 0 0
3166 return Op0;
3167 case 13: // 1 1 0 1
3168 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3169 case 14: // 1 1 1 0
3170 return Builder.CreateOr(Op0, Op1);
3171 case 15: // 1 1 1 1
3172 return FoldConstant(true);
3173 default:
3174 llvm_unreachable("Invalid Operation");
3175 }
3176 return nullptr;
3177}
3178
3180 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3181 Value *A, *B;
3182 Constant *C1, *C2, *C3, *C4;
3183 if (!match(BO->getOperand(0),
3185 !match(BO->getOperand(1),
3187 Cmp.getType() != A->getType() || Cmp.getType() != B->getType())
3188 return nullptr;
3189
3190 std::bitset<4> Table;
3191 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3192 Constant *L = First ? C1 : C2;
3193 Constant *R = Second ? C3 : C4;
3194 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3195 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3196 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3197 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3198 }
3199 return std::nullopt;
3200 };
3201
3202 for (unsigned I = 0; I < 4; ++I) {
3203 bool First = (I >> 1) & 1;
3204 bool Second = I & 1;
3205 if (auto Res = ComputeTable(First, Second))
3206 Table[I] = *Res;
3207 else
3208 return nullptr;
3209 }
3210
3211 // Synthesize optimal logic.
3212 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3213 return replaceInstUsesWith(Cmp, Cond);
3214 return nullptr;
3215}
3216
3217/// Fold icmp (add X, Y), C.
3220 const APInt &C) {
3221 Value *Y = Add->getOperand(1);
3222 Value *X = Add->getOperand(0);
3223 const CmpPredicate Pred = Cmp.getCmpPredicate();
3224
3225 // icmp ult (add nuw A, (lshr A, ShAmtC)), C --> icmp ult A, C
3226 // when C <= (1 << ShAmtC).
3227 const APInt *ShAmtC;
3228 Value *A;
3229 unsigned BitWidth = C.getBitWidth();
3230 if (Pred == ICmpInst::ICMP_ULT &&
3231 match(Add,
3232 m_c_NUWAdd(m_Value(A), m_LShr(m_Deferred(A), m_APInt(ShAmtC)))) &&
3233 ShAmtC->ult(BitWidth) &&
3234 C.ule(APInt::getOneBitSet(BitWidth, ShAmtC->getZExtValue())))
3235 return new ICmpInst(Pred, A, ConstantInt::get(A->getType(), C));
3236
3237 const APInt *C2;
3238 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3239 return nullptr;
3240
3241 // Fold icmp pred (add X, C2), C.
3242 Type *Ty = Add->getType();
3243
3244 // If the add does not wrap, we can always adjust the compare by subtracting
3245 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3246 // have been canonicalized to SGT/SLT/UGT/ULT.
3247 if (Add->hasNoUnsignedWrap() &&
3248 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT)) {
3249 bool Overflow;
3250 APInt NewC = C.usub_ov(*C2, Overflow);
3251 // If there is overflow, the result must be true or false.
3252 if (!Overflow)
3253 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3254 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3255 }
3256
3257 CmpInst::Predicate ChosenPred = Pred.getPreferredSignedPredicate();
3258
3259 if (Add->hasNoSignedWrap() &&
3260 (ChosenPred == ICmpInst::ICMP_SGT || ChosenPred == ICmpInst::ICMP_SLT)) {
3261 bool Overflow;
3262 APInt NewC = C.ssub_ov(*C2, Overflow);
3263 if (!Overflow)
3264 // icmp samesign ugt/ult (add nsw X, C2), C
3265 // -> icmp sgt/slt X, (C - C2)
3266 return new ICmpInst(ChosenPred, X, ConstantInt::get(Ty, NewC));
3267 }
3268
3269 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3270 C.isNonNegative() && (C - *C2).isNonNegative() &&
3271 computeConstantRange(X, /*ForSigned=*/true, SQ.getWithInstruction(&Cmp))
3272 .add(*C2)
3273 .isAllNonNegative())
3274 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3275 ConstantInt::get(Ty, C - *C2));
3276
3277 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3278 const APInt &Upper = CR.getUpper();
3279 const APInt &Lower = CR.getLower();
3280 if (Cmp.isSigned()) {
3281 if (Lower.isSignMask())
3282 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3283 if (Upper.isSignMask())
3284 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3285 } else {
3286 if (Lower.isMinValue())
3287 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3288 if (Upper.isMinValue())
3289 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3290 }
3291
3292 // This set of folds is intentionally placed after folds that use no-wrapping
3293 // flags because those folds are likely better for later analysis/codegen.
3294 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3295 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3296
3297 // Fold compare with offset to opposite sign compare if it eliminates offset:
3298 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3299 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3300 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3301
3302 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3303 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3304 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3305
3306 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3307 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3308 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3309
3310 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3311 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3312 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3313
3314 // (X + -1) <u C --> X <=u C (if X is never null)
3315 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3316 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3317 if (llvm::isKnownNonZero(X, Q))
3318 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3319 }
3320
3321 if (!Add->hasOneUse())
3322 return nullptr;
3323
3324 // X+C <u C2 -> (X & -C2) == C
3325 // iff C & (C2-1) == 0
3326 // C2 is a power of 2
3327 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3328 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3330
3331 // X+C2 <u C -> (X & C) == 2C
3332 // iff C == -(C2)
3333 // C2 is a power of 2
3334 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3335 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3336 ConstantInt::get(Ty, C * 2));
3337
3338 // X+C >u C2 -> (X & ~C2) != C
3339 // iff C & C2 == 0
3340 // C2+1 is a power of 2
3341 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3342 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3344
3345 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3346 // to the ult form.
3347 // X+C2 >u C -> X+(C2-C-1) <u ~C
3348 if (Pred == ICmpInst::ICMP_UGT)
3349 return new ICmpInst(ICmpInst::ICMP_ULT,
3350 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3351 ConstantInt::get(Ty, ~C));
3352
3353 // zext(V) + C2 pred C -> V + C3 pred' C4
3354 Value *V;
3355 if (match(X, m_ZExt(m_Value(V)))) {
3356 Type *NewCmpTy = V->getType();
3357 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3358 if (shouldChangeType(Ty, NewCmpTy)) {
3359 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3360 CmpInst::Predicate EquivPred;
3361 APInt EquivInt;
3362 APInt EquivOffset;
3363
3364 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3365 return new ICmpInst(
3366 EquivPred,
3367 EquivOffset.isZero()
3368 ? V
3369 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3370 ConstantInt::get(NewCmpTy, EquivInt));
3371 }
3372 }
3373
3374 return nullptr;
3375}
3376
3378 Value *&RHS, ConstantInt *&Less,
3379 ConstantInt *&Equal,
3380 ConstantInt *&Greater) {
3381 // TODO: Generalize this to work with other comparison idioms or ensure
3382 // they get canonicalized into this form.
3383
3384 // select i1 (a == b),
3385 // i32 Equal,
3386 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3387 // where Equal, Less and Greater are placeholders for any three constants.
3388 CmpPredicate PredA;
3389 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3390 !ICmpInst::isEquality(PredA))
3391 return false;
3392 Value *EqualVal = SI->getTrueValue();
3393 Value *UnequalVal = SI->getFalseValue();
3394 // We still can get non-canonical predicate here, so canonicalize.
3395 if (PredA == ICmpInst::ICMP_NE)
3396 std::swap(EqualVal, UnequalVal);
3397 if (!match(EqualVal, m_ConstantInt(Equal)))
3398 return false;
3399 CmpPredicate PredB;
3400 Value *LHS2, *RHS2;
3401 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3402 m_ConstantInt(Less), m_ConstantInt(Greater))))
3403 return false;
3404 // We can get predicate mismatch here, so canonicalize if possible:
3405 // First, ensure that 'LHS' match.
3406 if (LHS2 != LHS) {
3407 // x sgt y <--> y slt x
3408 std::swap(LHS2, RHS2);
3409 PredB = ICmpInst::getSwappedPredicate(PredB);
3410 }
3411 if (LHS2 != LHS)
3412 return false;
3413 // We also need to canonicalize 'RHS'.
3414 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3415 // x sgt C-1 <--> x sge C <--> not(x slt C)
3416 auto FlippedStrictness =
3418 if (!FlippedStrictness)
3419 return false;
3420 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3421 "basic correctness failure");
3422 RHS2 = FlippedStrictness->second;
3423 // And kind-of perform the result swap.
3424 std::swap(Less, Greater);
3425 PredB = ICmpInst::ICMP_SLT;
3426 }
3427 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3428}
3429
3432 ConstantInt *C) {
3433
3434 assert(C && "Cmp RHS should be a constant int!");
3435 // If we're testing a constant value against the result of a three way
3436 // comparison, the result can be expressed directly in terms of the
3437 // original values being compared. Note: We could possibly be more
3438 // aggressive here and remove the hasOneUse test. The original select is
3439 // really likely to simplify or sink when we remove a test of the result.
3440 Value *OrigLHS, *OrigRHS;
3441 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3442 if (Cmp.hasOneUse() &&
3443 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3444 C3GreaterThan)) {
3445 assert(C1LessThan && C2Equal && C3GreaterThan);
3446
3447 bool TrueWhenLessThan = ICmpInst::compare(
3448 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3449 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3450 Cmp.getPredicate());
3451 bool TrueWhenGreaterThan = ICmpInst::compare(
3452 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3453
3454 // This generates the new instruction that will replace the original Cmp
3455 // Instruction. Instead of enumerating the various combinations when
3456 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3457 // false, we rely on chaining of ORs and future passes of InstCombine to
3458 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3459
3460 // When none of the three constants satisfy the predicate for the RHS (C),
3461 // the entire original Cmp can be simplified to a false.
3462 Value *Cond = Builder.getFalse();
3463 if (TrueWhenLessThan)
3464 Cond = Builder.CreateOr(
3465 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3466 if (TrueWhenEqual)
3467 Cond = Builder.CreateOr(
3468 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3469 if (TrueWhenGreaterThan)
3470 Cond = Builder.CreateOr(
3471 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3472
3473 return replaceInstUsesWith(Cmp, Cond);
3474 }
3475 return nullptr;
3476}
3477
3479 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3480 if (!Bitcast)
3481 return nullptr;
3482
3483 ICmpInst::Predicate Pred = Cmp.getPredicate();
3484 Value *Op1 = Cmp.getOperand(1);
3485 Value *BCSrcOp = Bitcast->getOperand(0);
3486 Type *SrcType = Bitcast->getSrcTy();
3487 Type *DstType = Bitcast->getType();
3488
3489 // Make sure the bitcast doesn't change between scalar and vector and
3490 // doesn't change the number of vector elements.
3491 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3492 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3493 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3494 Value *X;
3495 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3496 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3497 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3498 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3499 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3500 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3501 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3502 match(Op1, m_Zero()))
3503 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3504
3505 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3506 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3507 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3508
3509 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3510 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3511 return new ICmpInst(Pred, X,
3512 ConstantInt::getAllOnesValue(X->getType()));
3513 }
3514
3515 // Zero-equality checks are preserved through unsigned floating-point casts:
3516 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3517 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3518 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3519 if (Cmp.isEquality() && match(Op1, m_Zero()))
3520 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3521
3522 const APInt *C;
3523 bool TrueIfSigned;
3524 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3525 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3526 // the FP extend/truncate because that cast does not change the sign-bit.
3527 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3528 // The sign-bit is always the most significant bit in those types.
3529 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3530 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3531 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3532 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3533 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3534 Type *XType = X->getType();
3535
3536 // We can't currently handle Power style floating point operations here.
3537 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3538 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3539 if (auto *XVTy = dyn_cast<VectorType>(XType))
3540 NewType = VectorType::get(NewType, XVTy->getElementCount());
3541 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3542 if (TrueIfSigned)
3543 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3544 ConstantInt::getNullValue(NewType));
3545 else
3546 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3548 }
3549 }
3550
3551 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3552 Type *FPType = SrcType->getScalarType();
3553 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3554 Attribute::NoImplicitFloat) &&
3555 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3556 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3557 if (Mask & (fcInf | fcZero)) {
3558 if (Pred == ICmpInst::ICMP_NE)
3559 Mask = ~Mask;
3560 return replaceInstUsesWith(Cmp,
3561 Builder.createIsFPClass(BCSrcOp, Mask));
3562 }
3563 }
3564 }
3565 }
3566
3567 const APInt *C;
3568 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3569 !SrcType->isIntOrIntVectorTy())
3570 return nullptr;
3571
3572 // If this is checking if all elements of a vector compare are set or not,
3573 // invert the casted vector equality compare and test if all compare
3574 // elements are clear or not. Compare against zero is generally easier for
3575 // analysis and codegen.
3576 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3577 // Example: are all elements equal? --> are zero elements not equal?
3578 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3579 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3580 if (Value *NotBCSrcOp =
3581 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3582 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3583 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3584 }
3585 }
3586
3587 // If this is checking if all elements of an extended vector are clear or not,
3588 // compare in a narrow type to eliminate the extend:
3589 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3590 Value *X;
3591 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3592 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3593 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3594 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3595 Value *NewCast = Builder.CreateBitCast(X, NewType);
3596 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3597 }
3598 }
3599
3600 // Folding: icmp <pred> iN X, C
3601 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3602 // and C is a splat of a K-bit pattern
3603 // and SC is a constant vector = <C', C', C', ..., C'>
3604 // Into:
3605 // %E = extractelement <M x iK> %vec, i32 C'
3606 // icmp <pred> iK %E, trunc(C)
3607 Value *Vec;
3608 ArrayRef<int> Mask;
3609 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3610 // Check whether every element of Mask is the same constant
3611 if (all_equal(Mask)) {
3612 auto *VecTy = cast<VectorType>(SrcType);
3613 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3614 if (C->isSplat(EltTy->getBitWidth())) {
3615 // Fold the icmp based on the value of C
3616 // If C is M copies of an iK sized bit pattern,
3617 // then:
3618 // => %E = extractelement <N x iK> %vec, i64 Elem
3619 // icmp <pred> iK %SplatVal, <pattern>
3620 Value *Extract = Builder.CreateExtractElement(Vec, Mask[0]);
3621 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3622 return new ICmpInst(Pred, Extract, NewC);
3623 }
3624 }
3625 }
3626 return nullptr;
3627}
3628
3629/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3630/// where X is some kind of instruction.
3632 const APInt *C;
3633
3634 if (match(Cmp.getOperand(1), m_APInt(C))) {
3635 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3636 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3637 return I;
3638
3639 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3640 // For now, we only support constant integers while folding the
3641 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3642 // similar to the cases handled by binary ops above.
3643 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3644 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3645 return I;
3646
3647 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3648 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3649 return I;
3650
3651 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3653 return I;
3654
3655 {
3656 // icmp slt/sgt (extractvalue (frexp X), 1), C -->
3657 // fcmp olt/oge (fabs X), 2^ExpVal
3658 // slt -> olt, ExpVal = C-1; sgt -> oge, ExpVal = C.
3659 Value *X;
3660 if (match(Cmp.getOperand(0),
3663 ICmpInst::Predicate Pred = Cmp.getPredicate();
3664 APInt Exp;
3665 FCmpInst::Predicate NewPred;
3666 bool ValidPred = true;
3667
3668 switch (Pred) {
3669 case ICmpInst::ICMP_SLT:
3670 NewPred = FCmpInst::FCMP_OLT;
3671 Exp = *C - 1;
3672 break;
3673 case ICmpInst::ICMP_SGT:
3674 NewPred = FCmpInst::FCMP_OGE;
3675 Exp = *C;
3676 break;
3677 default:
3678 ValidPred = false;
3679 break;
3680 }
3681
3682 if (ValidPred) {
3683 const fltSemantics &Sem =
3684 X->getType()->getScalarType()->getFltSemantics();
3685 int MaxExp = APFloat::semanticsMaxExponent(Sem);
3686
3687 if (!Exp.isNegative() && Exp.sle(MaxExp + 1) &&
3688 isKnownNeverInfOrNaN(X, SQ.getWithInstruction(&Cmp))) {
3689 int ExpVal = static_cast<int>(Exp.getSExtValue());
3690 APFloat CmpConst = scalbn(APFloat::getOne(Sem), ExpVal,
3692 Value *Fabs = Builder.CreateFAbs(X);
3693 return new FCmpInst(NewPred, Fabs,
3694 ConstantFP::get(X->getType(), CmpConst));
3695 }
3696 }
3697 }
3698 }
3699
3700 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3701 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3702 // TODO: This checks one-use, but that is not strictly necessary.
3703 Value *Cmp0 = Cmp.getOperand(0);
3704 Value *X, *Y;
3705 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3706 (match(Cmp0,
3708 m_Value(X), m_Value(Y)))) ||
3709 match(Cmp0,
3711 m_Value(X), m_Value(Y))))))
3712 return new ICmpInst(Cmp.getPredicate(), X, Y);
3713 }
3714
3715 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3717
3718 return nullptr;
3719}
3720
3721/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3722/// icmp eq/ne BO, C.
3724 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3725 // TODO: Some of these folds could work with arbitrary constants, but this
3726 // function is limited to scalar and vector splat constants.
3727 if (!Cmp.isEquality())
3728 return nullptr;
3729
3730 ICmpInst::Predicate Pred = Cmp.getPredicate();
3731 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3732 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3733 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3734
3735 switch (BO->getOpcode()) {
3736 case Instruction::SRem:
3737 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3738 if (C.isZero() && BO->hasOneUse()) {
3739 const APInt *BOC;
3740 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3741 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3742 return new ICmpInst(Pred, NewRem,
3744 }
3745 }
3746 break;
3747 case Instruction::Add: {
3748 // (A + C2) == C --> A == (C - C2)
3749 // (A + C2) != C --> A != (C - C2)
3750 // TODO: Remove the one-use limitation? See discussion in D58633.
3751 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3752 if (BO->hasOneUse())
3753 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3754 } else if (C.isZero()) {
3755 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3756 // efficiently invertible, or if the add has just this one use.
3757 if (Value *NegVal = dyn_castNegVal(BOp1))
3758 return new ICmpInst(Pred, BOp0, NegVal);
3759 if (Value *NegVal = dyn_castNegVal(BOp0))
3760 return new ICmpInst(Pred, NegVal, BOp1);
3761 if (BO->hasOneUse()) {
3762 // (add nuw A, B) != 0 -> (or A, B) != 0
3763 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3764 Value *Or = Builder.CreateOr(BOp0, BOp1);
3765 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3766 }
3767 Value *Neg = Builder.CreateNeg(BOp1);
3768 Neg->takeName(BO);
3769 return new ICmpInst(Pred, BOp0, Neg);
3770 }
3771 }
3772 break;
3773 }
3774 case Instruction::Xor:
3775 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3776 // For the xor case, we can xor two constants together, eliminating
3777 // the explicit xor.
3778 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3779 } else if (C.isZero()) {
3780 // Replace ((xor A, B) != 0) with (A != B)
3781 return new ICmpInst(Pred, BOp0, BOp1);
3782 }
3783 break;
3784 case Instruction::Or: {
3785 const APInt *BOC;
3786 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3787 // Comparing if all bits outside of a constant mask are set?
3788 // Replace (X | C) == -1 with (X & ~C) == ~C.
3789 // This removes the -1 constant.
3791 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3792 return new ICmpInst(Pred, And, NotBOC);
3793 }
3794 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3795 // -> (and cond, (icmp eq Other, 0))
3796 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3797 // -> (or cond, (icmp ne Other, 0))
3798 Value *Cond, *TV, *FV, *Other, *Sel;
3799 if (C.isZero() &&
3800 match(BO,
3803 m_Value(FV))),
3804 m_Value(Other)))) &&
3805 Cond->getType() == Cmp.getType()) {
3806 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3807 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3808 if (Pred == ICmpInst::ICMP_EQ
3809 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3810 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3811 Value *Cmp = Builder.CreateICmp(
3812 Pred, Other, Constant::getNullValue(Other->getType()));
3814 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3815 Cond);
3816 }
3817 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3818 // case we need to invert the select condition so we need to be careful to
3819 // avoid creating extra instructions.
3820 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3821 // -> (or (not cond), (icmp ne Other, 0))
3822 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3823 // -> (and (not cond), (icmp eq Other, 0))
3824 //
3825 // Only do this if the inner select has one use, in which case we are
3826 // replacing `select` with `(not cond)`. Otherwise, we will create more
3827 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3828 // cond was freely invertable, the select arms would have been inverted.
3829 if (Sel->hasOneUse() &&
3830 (Pred == ICmpInst::ICMP_EQ
3831 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3832 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3833 Value *NotCond = Builder.CreateNot(Cond);
3834 Value *Cmp = Builder.CreateICmp(
3835 Pred, Other, Constant::getNullValue(Other->getType()));
3837 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3838 NotCond);
3839 }
3840 }
3841 break;
3842 }
3843 case Instruction::UDiv:
3844 case Instruction::SDiv:
3845 if (BO->isExact()) {
3846 // div exact X, Y eq/ne 0 -> X eq/ne 0
3847 // div exact X, Y eq/ne 1 -> X eq/ne Y
3848 // div exact X, Y eq/ne C ->
3849 // if Y * C never-overflow && OneUse:
3850 // -> Y * C eq/ne X
3851 if (C.isZero())
3852 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3853 else if (C.isOne())
3854 return new ICmpInst(Pred, BOp0, BOp1);
3855 else if (BO->hasOneUse()) {
3857 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3858 Cmp.getOperand(1), BO);
3860 Value *YC =
3861 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3862 return new ICmpInst(Pred, YC, BOp0);
3863 }
3864 }
3865 }
3866 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3867 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3868 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3869 return new ICmpInst(NewPred, BOp1, BOp0);
3870 }
3871 break;
3872 default:
3873 break;
3874 }
3875 return nullptr;
3876}
3877
3879 const APInt &CRhs,
3880 InstCombiner::BuilderTy &Builder,
3881 const SimplifyQuery &Q) {
3882 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3883 "Non-ctpop intrin in ctpop fold");
3884 if (!CtpopLhs->hasOneUse())
3885 return nullptr;
3886
3887 // Power of 2 test:
3888 // isPow2OrZero : ctpop(X) u< 2
3889 // isPow2 : ctpop(X) == 1
3890 // NotPow2OrZero: ctpop(X) u> 1
3891 // NotPow2 : ctpop(X) != 1
3892 // If we know any bit of X can be folded to:
3893 // IsPow2 : X & (~Bit) == 0
3894 // NotPow2 : X & (~Bit) != 0
3895 const ICmpInst::Predicate Pred = I.getPredicate();
3896 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3897 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3898 Value *Op = CtpopLhs->getArgOperand(0);
3899 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3900 // No need to check for count > 1, that should be already constant folded.
3901 if (OpKnown.countMinPopulation() == 1) {
3902 Value *And = Builder.CreateAnd(
3903 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3904 return new ICmpInst(
3905 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3908 And, Constant::getNullValue(Op->getType()));
3909 }
3910 }
3911
3912 return nullptr;
3913}
3914
3915/// Fold an equality icmp with LLVM intrinsic and constant operand.
3917 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3918 Type *Ty = II->getType();
3919 unsigned BitWidth = C.getBitWidth();
3920 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3921
3922 switch (II->getIntrinsicID()) {
3923 case Intrinsic::abs:
3924 // abs(A) == 0 -> A == 0
3925 // abs(A) == INT_MIN -> A == INT_MIN
3926 if (C.isZero() || C.isMinSignedValue())
3927 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3928 break;
3929
3930 case Intrinsic::bswap:
3931 // bswap(A) == C -> A == bswap(C)
3932 return new ICmpInst(Pred, II->getArgOperand(0),
3933 ConstantInt::get(Ty, C.byteSwap()));
3934
3935 case Intrinsic::bitreverse:
3936 // bitreverse(A) == C -> A == bitreverse(C)
3937 return new ICmpInst(Pred, II->getArgOperand(0),
3938 ConstantInt::get(Ty, C.reverseBits()));
3939
3940 case Intrinsic::ctlz:
3941 case Intrinsic::cttz: {
3942 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3943 if (C == BitWidth)
3944 return new ICmpInst(Pred, II->getArgOperand(0),
3946
3947 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3948 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3949 // Limit to one use to ensure we don't increase instruction count.
3950 unsigned Num = C.getLimitedValue(BitWidth);
3951 if (Num != BitWidth && II->hasOneUse()) {
3952 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3953 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3954 : APInt::getHighBitsSet(BitWidth, Num + 1);
3955 APInt Mask2 = IsTrailing
3958 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3959 ConstantInt::get(Ty, Mask2));
3960 }
3961 break;
3962 }
3963
3964 case Intrinsic::ctpop: {
3965 // popcount(A) == 0 -> A == 0 and likewise for !=
3966 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3967 bool IsZero = C.isZero();
3968 if (IsZero || C == BitWidth)
3969 return new ICmpInst(Pred, II->getArgOperand(0),
3970 IsZero ? Constant::getNullValue(Ty)
3972
3973 break;
3974 }
3975
3976 case Intrinsic::fshl:
3977 case Intrinsic::fshr:
3978 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3979 const APInt *RotAmtC;
3980 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3981 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3982 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3983 return new ICmpInst(Pred, II->getArgOperand(0),
3984 II->getIntrinsicID() == Intrinsic::fshl
3985 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3986 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3987 }
3988 break;
3989
3990 case Intrinsic::umax:
3991 case Intrinsic::uadd_sat: {
3992 // uadd.sat(a, b) == 0 -> (a | b) == 0
3993 // umax(a, b) == 0 -> (a | b) == 0
3994 if (C.isZero() && II->hasOneUse()) {
3995 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3996 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3997 }
3998 break;
3999 }
4000
4001 case Intrinsic::ssub_sat:
4002 // ssub.sat(a, b) == 0 -> a == b
4003 //
4004 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4005 // (because 1 saturates to 0). Just skip the optimization for i1.
4006 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
4007 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4008 break;
4009 case Intrinsic::usub_sat: {
4010 // usub.sat(a, b) == 0 -> a <= b
4011 if (C.isZero()) {
4012 ICmpInst::Predicate NewPred =
4014 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
4015 }
4016 break;
4017 }
4018 default:
4019 break;
4020 }
4021
4022 return nullptr;
4023}
4024
4025/// Fold an icmp with LLVM intrinsics
4026static Instruction *
4028 InstCombiner::BuilderTy &Builder) {
4029 assert(Cmp.isEquality());
4030
4031 ICmpInst::Predicate Pred = Cmp.getPredicate();
4032 Value *Op0 = Cmp.getOperand(0);
4033 Value *Op1 = Cmp.getOperand(1);
4034 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
4035 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
4036 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
4037 return nullptr;
4038
4039 switch (IIOp0->getIntrinsicID()) {
4040 case Intrinsic::bswap:
4041 case Intrinsic::bitreverse:
4042 // If both operands are byte-swapped or bit-reversed, just compare the
4043 // original values.
4044 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
4045 case Intrinsic::fshl:
4046 case Intrinsic::fshr: {
4047 // If both operands are rotated by same amount, just compare the
4048 // original values.
4049 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
4050 break;
4051 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
4052 break;
4053 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
4054 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
4055
4056 // rotate(X, AmtX) == rotate(Y, AmtY)
4057 // -> rotate(X, AmtX - AmtY) == Y
4058 // Do this if either both rotates have one use or if only one has one use
4059 // and AmtX/AmtY are constants.
4060 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
4061 if (OneUses == 2 ||
4062 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
4063 match(IIOp1->getOperand(2), m_ImmConstant()))) {
4064 Value *SubAmt =
4065 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
4066 Value *CombinedRotate = Builder.CreateIntrinsic(
4067 Op0->getType(), IIOp0->getIntrinsicID(),
4068 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
4069 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
4070 }
4071 } break;
4072 default:
4073 break;
4074 }
4075
4076 return nullptr;
4077}
4078
4079/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
4080/// where X is some kind of instruction and C is AllowPoison.
4081/// TODO: Move more folds which allow poison to this function.
4084 const APInt &C) {
4085 const ICmpInst::Predicate Pred = Cmp.getPredicate();
4086 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
4087 switch (II->getIntrinsicID()) {
4088 default:
4089 break;
4090 case Intrinsic::fshl:
4091 case Intrinsic::fshr:
4092 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
4093 // (rot X, ?) == 0/-1 --> X == 0/-1
4094 if (C.isZero() || C.isAllOnes())
4095 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
4096 }
4097 break;
4098 }
4099 }
4100
4101 return nullptr;
4102}
4103
4104/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
4106 BinaryOperator *BO,
4107 const APInt &C) {
4108 switch (BO->getOpcode()) {
4109 case Instruction::Xor:
4110 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
4111 return I;
4112 break;
4113 case Instruction::And:
4114 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
4115 return I;
4116 break;
4117 case Instruction::Or:
4118 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
4119 return I;
4120 break;
4121 case Instruction::Mul:
4122 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
4123 return I;
4124 break;
4125 case Instruction::Shl:
4126 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4127 return I;
4128 break;
4129 case Instruction::LShr:
4130 case Instruction::AShr:
4131 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4132 return I;
4133 break;
4134 case Instruction::SRem:
4135 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4136 return I;
4137 break;
4138 case Instruction::UDiv:
4139 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4140 return I;
4141 [[fallthrough]];
4142 case Instruction::SDiv:
4143 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4144 return I;
4145 break;
4146 case Instruction::Sub:
4147 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4148 return I;
4149 break;
4150 case Instruction::Add:
4151 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4152 return I;
4153 break;
4154 default:
4155 break;
4156 }
4157
4158 // TODO: These folds could be refactored to be part of the above calls.
4160 return I;
4161
4162 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4163 // : C4), C5` pattern, by computing a truth table of the four constant
4164 // variants.
4166}
4167
4168static Instruction *
4170 const APInt &C,
4171 InstCombiner::BuilderTy &Builder) {
4172 // This transform may end up producing more than one instruction for the
4173 // intrinsic, so limit it to one user of the intrinsic.
4174 if (!II->hasOneUse())
4175 return nullptr;
4176
4177 // Let Y = [add/sub]_sat(X, C) pred C2
4178 // SatVal = The saturating value for the operation
4179 // WillWrap = Whether or not the operation will underflow / overflow
4180 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4181 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4182 //
4183 // When (SatVal pred C2) is true, then
4184 // Y = WillWrap ? true : ((X binop C) pred C2)
4185 // => Y = WillWrap || ((X binop C) pred C2)
4186 // else
4187 // Y = WillWrap ? false : ((X binop C) pred C2)
4188 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4189 // => Y = !WillWrap && ((X binop C) pred C2)
4190 Value *Op0 = II->getOperand(0);
4191 Value *Op1 = II->getOperand(1);
4192
4193 const APInt *COp1;
4194 // This transform only works when the intrinsic has an integral constant or
4195 // splat vector as the second operand.
4196 if (!match(Op1, m_APInt(COp1)))
4197 return nullptr;
4198
4199 APInt SatVal;
4200 switch (II->getIntrinsicID()) {
4201 default:
4203 "This function only works with usub_sat and uadd_sat for now!");
4204 case Intrinsic::uadd_sat:
4205 SatVal = APInt::getAllOnes(C.getBitWidth());
4206 break;
4207 case Intrinsic::usub_sat:
4208 SatVal = APInt::getZero(C.getBitWidth());
4209 break;
4210 }
4211
4212 // Check (SatVal pred C2)
4213 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4214
4215 // !WillWrap.
4217 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4218
4219 // WillWrap.
4220 if (SatValCheck)
4221 C1 = C1.inverse();
4222
4224 if (II->getBinaryOp() == Instruction::Add)
4225 C2 = C2.sub(*COp1);
4226 else
4227 C2 = C2.add(*COp1);
4228
4229 Instruction::BinaryOps CombiningOp =
4230 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4231
4232 std::optional<ConstantRange> Combination;
4233 if (CombiningOp == Instruction::BinaryOps::Or)
4234 Combination = C1.exactUnionWith(C2);
4235 else /* CombiningOp == Instruction::BinaryOps::And */
4236 Combination = C1.exactIntersectWith(C2);
4237
4238 if (!Combination)
4239 return nullptr;
4240
4241 CmpInst::Predicate EquivPred;
4242 APInt EquivInt;
4243 APInt EquivOffset;
4244
4245 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4246
4247 return new ICmpInst(
4248 EquivPred,
4249 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4250 ConstantInt::get(Op1->getType(), EquivInt));
4251}
4252
4253static Instruction *
4255 const APInt &C,
4256 InstCombiner::BuilderTy &Builder) {
4257 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4258 switch (Pred) {
4259 case ICmpInst::ICMP_EQ:
4260 case ICmpInst::ICMP_NE:
4261 if (C.isZero())
4262 NewPredicate = Pred;
4263 else if (C.isOne())
4264 NewPredicate =
4266 else if (C.isAllOnes())
4267 NewPredicate =
4269 break;
4270
4271 case ICmpInst::ICMP_SGT:
4272 if (C.isAllOnes())
4273 NewPredicate = ICmpInst::ICMP_UGE;
4274 else if (C.isZero())
4275 NewPredicate = ICmpInst::ICMP_UGT;
4276 break;
4277
4278 case ICmpInst::ICMP_SLT:
4279 if (C.isZero())
4280 NewPredicate = ICmpInst::ICMP_ULT;
4281 else if (C.isOne())
4282 NewPredicate = ICmpInst::ICMP_ULE;
4283 break;
4284
4285 case ICmpInst::ICMP_ULT:
4286 if (C.ugt(1))
4287 NewPredicate = ICmpInst::ICMP_UGE;
4288 break;
4289
4290 case ICmpInst::ICMP_UGT:
4291 if (!C.isZero() && !C.isAllOnes())
4292 NewPredicate = ICmpInst::ICMP_ULT;
4293 break;
4294
4295 default:
4296 break;
4297 }
4298
4299 if (!NewPredicate)
4300 return nullptr;
4301
4302 if (I->getIntrinsicID() == Intrinsic::scmp)
4303 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4304 Value *LHS = I->getOperand(0);
4305 Value *RHS = I->getOperand(1);
4306 return new ICmpInst(*NewPredicate, LHS, RHS);
4307}
4308
4309/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4312 const APInt &C) {
4313 ICmpInst::Predicate Pred = Cmp.getPredicate();
4314
4315 // Handle folds that apply for any kind of icmp.
4316 switch (II->getIntrinsicID()) {
4317 default:
4318 break;
4319 case Intrinsic::uadd_sat:
4320 case Intrinsic::usub_sat:
4321 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4322 Pred, cast<SaturatingInst>(II), C, Builder))
4323 return Folded;
4324 break;
4325 case Intrinsic::ctpop: {
4326 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4327 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4328 return R;
4329 } break;
4330 case Intrinsic::scmp:
4331 case Intrinsic::ucmp:
4332 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4333 return Folded;
4334 break;
4335 }
4336
4337 if (Cmp.isEquality())
4338 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4339
4340 Type *Ty = II->getType();
4341 unsigned BitWidth = C.getBitWidth();
4342 switch (II->getIntrinsicID()) {
4343 case Intrinsic::ctpop: {
4344 // (ctpop X > BitWidth - 1) --> X == -1
4345 Value *X = II->getArgOperand(0);
4346 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4347 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4349 // (ctpop X < BitWidth) --> X != -1
4350 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4351 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4353 break;
4354 }
4355 case Intrinsic::ctlz: {
4356 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4357 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4358 unsigned Num = C.getLimitedValue();
4359 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4360 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4361 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4362 }
4363
4364 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4365 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4366 unsigned Num = C.getLimitedValue();
4368 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4369 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4370 }
4371 break;
4372 }
4373 case Intrinsic::cttz: {
4374 // Limit to one use to ensure we don't increase instruction count.
4375 if (!II->hasOneUse())
4376 return nullptr;
4377
4378 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4379 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4380 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4381 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4382 Builder.CreateAnd(II->getArgOperand(0), Mask),
4384 }
4385
4386 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4387 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4388 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4389 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4390 Builder.CreateAnd(II->getArgOperand(0), Mask),
4392 }
4393 break;
4394 }
4395 case Intrinsic::ssub_sat:
4396 // ssub.sat(a, b) spred 0 -> a spred b
4397 //
4398 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4399 // (because 1 saturates to 0). Just skip the optimization for i1.
4400 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4401 if (C.isZero())
4402 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4403 // X s<= 0 is cannonicalized to X s< 1
4404 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4405 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4406 II->getArgOperand(1));
4407 // X s>= 0 is cannonicalized to X s> -1
4408 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4409 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4410 II->getArgOperand(1));
4411 }
4412 break;
4413 case Intrinsic::abs: {
4414 if (!II->hasOneUse())
4415 return nullptr;
4416
4417 Value *X = II->getArgOperand(0);
4418 bool IsIntMinPoison =
4419 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4420
4421 // If C >= 0:
4422 // abs(X) u> C --> X + C u> 2 * C
4423 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4424 return new ICmpInst(ICmpInst::ICMP_UGT,
4425 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4426 ConstantInt::get(Ty, 2 * C));
4427 }
4428
4429 // If abs(INT_MIN) is poison and C >= 1:
4430 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4431 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4432 return new ICmpInst(ICmpInst::ICMP_ULE,
4433 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4434 ConstantInt::get(Ty, 2 * (C - 1)));
4435 }
4436
4437 break;
4438 }
4439 default:
4440 break;
4441 }
4442
4443 return nullptr;
4444}
4445
4446/// Handle icmp with constant (but not simple integer constant) RHS.
4448 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4449 Constant *RHSC = dyn_cast<Constant>(Op1);
4451 if (!RHSC || !LHSI)
4452 return nullptr;
4453
4454 switch (LHSI->getOpcode()) {
4455 case Instruction::IntToPtr:
4456 // icmp pred inttoptr(X), null -> icmp pred X, null pointer value
4457 if (isa<ConstantPointerNull>(RHSC)) {
4458 Type *IntPtrTy = DL.getIntPtrType(RHSC->getType());
4459 if (IntPtrTy == LHSI->getOperand(0)->getType()) {
4460 APInt NullPtrValue =
4461 DL.getNullPtrValue(RHSC->getType()->getPointerAddressSpace());
4462 return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
4463 Constant::getIntegerValue(IntPtrTy, NullPtrValue));
4464 }
4465 }
4466 break;
4467
4468 case Instruction::Load:
4469 // Try to optimize things like "A[i] > 4" to index computations.
4470 if (GetElementPtrInst *GEP =
4472 if (Instruction *Res =
4474 return Res;
4475 break;
4476 }
4477
4478 return nullptr;
4479}
4480
4482 Value *RHS, const ICmpInst &I) {
4483 // Try to fold the comparison into the select arms, which will cause the
4484 // select to be converted into a logical and/or.
4485 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4486 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4487 return Res;
4488 if (std::optional<bool> Impl = isImpliedCondition(
4489 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4490 return ConstantInt::get(I.getType(), *Impl);
4491 return nullptr;
4492 };
4493
4494 ConstantInt *CI = nullptr;
4495 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4496 if (Op1)
4497 CI = dyn_cast<ConstantInt>(Op1);
4498
4499 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4500 if (Op2)
4501 CI = dyn_cast<ConstantInt>(Op2);
4502
4503 auto Simplifies = [&](Value *Op, unsigned Idx) {
4504 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4505 const APInt *Dummy;
4506 return Op ||
4507 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4508 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4509 };
4510
4511 // We only want to perform this transformation if it will not lead to
4512 // additional code. This is true if either both sides of the select
4513 // fold to a constant (in which case the icmp is replaced with a select
4514 // which will usually simplify) or this is the only user of the
4515 // select (in which case we are trading a select+icmp for a simpler
4516 // select+icmp) or all uses of the select can be replaced based on
4517 // dominance information ("Global cases").
4518 bool Transform = false;
4519 if (Op1 && Op2)
4520 Transform = true;
4521 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4522 // Local case
4523 if (SI->hasOneUse())
4524 Transform = true;
4525 // Global cases
4526 else if (CI && !CI->isZero())
4527 // When Op1 is constant try replacing select with second operand.
4528 // Otherwise Op2 is constant and try replacing select with first
4529 // operand.
4530 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4531 }
4532 if (Transform) {
4533 if (!Op1)
4534 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4535 if (!Op2)
4536 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4537 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4538 ProfcheckDisableMetadataFixes ? nullptr : SI);
4539 }
4540
4541 return nullptr;
4542}
4543
4544// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4545static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4546 unsigned Depth = 0) {
4547 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4548 return true;
4549 if (V->getType()->getScalarSizeInBits() == 1)
4550 return true;
4552 return false;
4553 Value *X;
4555 if (!I)
4556 return false;
4557 switch (I->getOpcode()) {
4558 case Instruction::ZExt:
4559 // ZExt(Mask) is a Mask.
4560 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4561 case Instruction::SExt:
4562 // SExt(Mask) is a Mask.
4563 // SExt(~Mask) is a ~Mask.
4564 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4565 case Instruction::And:
4566 case Instruction::Or:
4567 // Mask0 | Mask1 is a Mask.
4568 // Mask0 & Mask1 is a Mask.
4569 // ~Mask0 | ~Mask1 is a ~Mask.
4570 // ~Mask0 & ~Mask1 is a ~Mask.
4571 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4572 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4573 case Instruction::Xor:
4574 if (match(V, m_Not(m_Value(X))))
4575 return isMaskOrZero(X, !Not, Q, Depth);
4576
4577 // (X ^ -X) is a ~Mask
4578 if (Not)
4579 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4580 // (X ^ (X - 1)) is a Mask
4581 else
4582 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4583 case Instruction::Select:
4584 // c ? Mask0 : Mask1 is a Mask.
4585 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4586 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4587 case Instruction::Shl:
4588 // (~Mask) << X is a ~Mask.
4589 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4590 case Instruction::LShr:
4591 // Mask >> X is a Mask.
4592 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4593 case Instruction::AShr:
4594 // Mask s>> X is a Mask.
4595 // ~Mask s>> X is a ~Mask.
4596 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4597 case Instruction::Add:
4598 // Pow2 - 1 is a Mask.
4599 if (!Not && match(I->getOperand(1), m_AllOnes()))
4600 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4601 Q.AC, Q.CxtI, Q.DT, Depth);
4602 break;
4603 case Instruction::Sub:
4604 // -Pow2 is a ~Mask.
4605 if (Not && match(I->getOperand(0), m_Zero()))
4606 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4607 Q.AC, Q.CxtI, Q.DT, Depth);
4608 break;
4609 case Instruction::Call: {
4610 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4611 switch (II->getIntrinsicID()) {
4612 // min/max(Mask0, Mask1) is a Mask.
4613 // min/max(~Mask0, ~Mask1) is a ~Mask.
4614 case Intrinsic::umax:
4615 case Intrinsic::smax:
4616 case Intrinsic::umin:
4617 case Intrinsic::smin:
4618 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4619 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4620
4621 // In the context of masks, bitreverse(Mask) == ~Mask
4622 case Intrinsic::bitreverse:
4623 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4624 default:
4625 break;
4626 }
4627 }
4628 break;
4629 }
4630 default:
4631 break;
4632 }
4633 return false;
4634}
4635
4636/// Some comparisons can be simplified.
4637/// In this case, we are looking for comparisons that look like
4638/// a check for a lossy truncation.
4639/// Folds:
4640/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4641/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4642/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4643/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4644/// Where Mask is some pattern that produces all-ones in low bits:
4645/// (-1 >> y)
4646/// ((-1 << y) >> y) <- non-canonical, has extra uses
4647/// ~(-1 << y)
4648/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4649/// The Mask can be a constant, too.
4650/// For some predicates, the operands are commutative.
4651/// For others, x can only be on a specific side.
4653 Value *Op1, const SimplifyQuery &Q,
4654 InstCombiner &IC) {
4655
4656 ICmpInst::Predicate DstPred;
4657 switch (Pred) {
4659 // x & Mask == x
4660 // x & ~Mask == 0
4661 // ~x | Mask == -1
4662 // -> x u<= Mask
4663 // x & ~Mask == ~Mask
4664 // -> ~Mask u<= x
4666 break;
4668 // x & Mask != x
4669 // x & ~Mask != 0
4670 // ~x | Mask != -1
4671 // -> x u> Mask
4672 // x & ~Mask != ~Mask
4673 // -> ~Mask u> x
4675 break;
4677 // x & Mask u< x
4678 // -> x u> Mask
4679 // x & ~Mask u< ~Mask
4680 // -> ~Mask u> x
4682 break;
4684 // x & Mask u>= x
4685 // -> x u<= Mask
4686 // x & ~Mask u>= ~Mask
4687 // -> ~Mask u<= x
4689 break;
4691 // x & Mask s< x [iff Mask s>= 0]
4692 // -> x s> Mask
4693 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4694 // -> ~Mask s> x
4696 break;
4698 // x & Mask s>= x [iff Mask s>= 0]
4699 // -> x s<= Mask
4700 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4701 // -> ~Mask s<= x
4703 break;
4704 default:
4705 // We don't support sgt,sle
4706 // ult/ugt are simplified to true/false respectively.
4707 return nullptr;
4708 }
4709
4710 Value *X, *M;
4711 // Put search code in lambda for early positive returns.
4712 auto IsLowBitMask = [&]() {
4713 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4714 X = Op1;
4715 // Look for: x & Mask pred x
4716 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4717 return !ICmpInst::isSigned(Pred) ||
4718 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4719 }
4720
4721 // Look for: x & ~Mask pred ~Mask
4722 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4723 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4724 }
4725 return false;
4726 }
4727 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4728 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4729
4730 auto Check = [&]() {
4731 // Look for: ~x | Mask == -1
4732 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4733 if (Value *NotX =
4734 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4735 X = NotX;
4736 return true;
4737 }
4738 }
4739 return false;
4740 };
4741 if (Check())
4742 return true;
4743 std::swap(X, M);
4744 return Check();
4745 }
4746 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4747 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4748 auto Check = [&]() {
4749 // Look for: x & ~Mask == 0
4750 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4751 if (Value *NotM =
4752 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4753 M = NotM;
4754 return true;
4755 }
4756 }
4757 return false;
4758 };
4759 if (Check())
4760 return true;
4761 std::swap(X, M);
4762 return Check();
4763 }
4764 return false;
4765 };
4766
4767 if (!IsLowBitMask())
4768 return nullptr;
4769
4770 return IC.Builder.CreateICmp(DstPred, X, M);
4771}
4772
4773/// Some comparisons can be simplified.
4774/// In this case, we are looking for comparisons that look like
4775/// a check for a lossy signed truncation.
4776/// Folds: (MaskedBits is a constant.)
4777/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4778/// Into:
4779/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4780/// Where KeptBits = bitwidth(%x) - MaskedBits
4781static Value *
4783 InstCombiner::BuilderTy &Builder) {
4784 CmpPredicate SrcPred;
4785 Value *X;
4786 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4787 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4788 if (!match(&I, m_c_ICmp(SrcPred,
4790 m_APInt(C1))),
4791 m_Deferred(X))))
4792 return nullptr;
4793
4794 // Potential handling of non-splats: for each element:
4795 // * if both are undef, replace with constant 0.
4796 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4797 // * if both are not undef, and are different, bailout.
4798 // * else, only one is undef, then pick the non-undef one.
4799
4800 // The shift amount must be equal.
4801 if (*C0 != *C1)
4802 return nullptr;
4803 const APInt &MaskedBits = *C0;
4804 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4805
4806 ICmpInst::Predicate DstPred;
4807 switch (SrcPred) {
4809 // ((%x << MaskedBits) a>> MaskedBits) == %x
4810 // =>
4811 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4813 break;
4815 // ((%x << MaskedBits) a>> MaskedBits) != %x
4816 // =>
4817 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4819 break;
4820 // FIXME: are more folds possible?
4821 default:
4822 return nullptr;
4823 }
4824
4825 auto *XType = X->getType();
4826 const unsigned XBitWidth = XType->getScalarSizeInBits();
4827 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4828 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4829
4830 // KeptBits = bitwidth(%x) - MaskedBits
4831 const APInt KeptBits = BitWidth - MaskedBits;
4832 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4833 // ICmpCst = (1 << KeptBits)
4834 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4835 assert(ICmpCst.isPowerOf2());
4836 // AddCst = (1 << (KeptBits-1))
4837 const APInt AddCst = ICmpCst.lshr(1);
4838 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4839
4840 // T0 = add %x, AddCst
4841 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4842 // T1 = T0 DstPred ICmpCst
4843 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4844
4845 return T1;
4846}
4847
4848// Given pattern:
4849// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4850// we should move shifts to the same hand of 'and', i.e. rewrite as
4851// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4852// We are only interested in opposite logical shifts here.
4853// One of the shifts can be truncated.
4854// If we can, we want to end up creating 'lshr' shift.
4855static Value *
4857 InstCombiner::BuilderTy &Builder) {
4858 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4859 !I.getOperand(0)->hasOneUse())
4860 return nullptr;
4861
4862 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4863
4864 // Look for an 'and' of two logical shifts, one of which may be truncated.
4865 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4866 Instruction *XShift, *MaybeTruncation, *YShift;
4867 if (!match(
4868 I.getOperand(0),
4869 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4871 m_AnyLogicalShift, m_Instruction(YShift))),
4872 m_Instruction(MaybeTruncation)))))
4873 return nullptr;
4874
4875 // We potentially looked past 'trunc', but only when matching YShift,
4876 // therefore YShift must have the widest type.
4877 Instruction *WidestShift = YShift;
4878 // Therefore XShift must have the shallowest type.
4879 // Or they both have identical types if there was no truncation.
4880 Instruction *NarrowestShift = XShift;
4881
4882 Type *WidestTy = WidestShift->getType();
4883 Type *NarrowestTy = NarrowestShift->getType();
4884 assert(NarrowestTy == I.getOperand(0)->getType() &&
4885 "We did not look past any shifts while matching XShift though.");
4886 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4887
4888 // If YShift is a 'lshr', swap the shifts around.
4889 if (match(YShift, m_LShr(m_Value(), m_Value())))
4890 std::swap(XShift, YShift);
4891
4892 // The shifts must be in opposite directions.
4893 auto XShiftOpcode = XShift->getOpcode();
4894 if (XShiftOpcode == YShift->getOpcode())
4895 return nullptr; // Do not care about same-direction shifts here.
4896
4897 Value *X, *XShAmt, *Y, *YShAmt;
4898 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4899 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4900
4901 // If one of the values being shifted is a constant, then we will end with
4902 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4903 // however, we will need to ensure that we won't increase instruction count.
4904 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4905 // At least one of the hands of the 'and' should be one-use shift.
4906 if (!match(I.getOperand(0),
4907 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4908 return nullptr;
4909 if (HadTrunc) {
4910 // Due to the 'trunc', we will need to widen X. For that either the old
4911 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4912 if (!MaybeTruncation->hasOneUse() &&
4913 !NarrowestShift->getOperand(1)->hasOneUse())
4914 return nullptr;
4915 }
4916 }
4917
4918 // We have two shift amounts from two different shifts. The types of those
4919 // shift amounts may not match. If that's the case let's bailout now.
4920 if (XShAmt->getType() != YShAmt->getType())
4921 return nullptr;
4922
4923 // As input, we have the following pattern:
4924 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4925 // We want to rewrite that as:
4926 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4927 // While we know that originally (Q+K) would not overflow
4928 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4929 // shift amounts. so it may now overflow in smaller bitwidth.
4930 // To ensure that does not happen, we need to ensure that the total maximal
4931 // shift amount is still representable in that smaller bit width.
4932 unsigned MaximalPossibleTotalShiftAmount =
4933 (WidestTy->getScalarSizeInBits() - 1) +
4934 (NarrowestTy->getScalarSizeInBits() - 1);
4935 APInt MaximalRepresentableShiftAmount =
4937 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4938 return nullptr;
4939
4940 // Can we fold (XShAmt+YShAmt) ?
4941 auto *NewShAmt = dyn_cast_or_null<Constant>(
4942 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4943 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4944 if (!NewShAmt)
4945 return nullptr;
4946 if (NewShAmt->getType() != WidestTy) {
4947 NewShAmt =
4948 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4949 if (!NewShAmt)
4950 return nullptr;
4951 }
4952 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4953
4954 // Is the new shift amount smaller than the bit width?
4955 // FIXME: could also rely on ConstantRange.
4956 if (!match(NewShAmt,
4958 APInt(WidestBitWidth, WidestBitWidth))))
4959 return nullptr;
4960
4961 // An extra legality check is needed if we had trunc-of-lshr.
4962 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4963 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4964 WidestShift]() {
4965 // It isn't obvious whether it's worth it to analyze non-constants here.
4966 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4967 // If *any* of these preconditions matches we can perform the fold.
4968 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4969 ? NewShAmt->getSplatValue()
4970 : NewShAmt;
4971 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4972 if (NewShAmtSplat &&
4973 (NewShAmtSplat->isNullValue() ||
4974 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4975 return true;
4976 // We consider *min* leading zeros so a single outlier
4977 // blocks the transform as opposed to allowing it.
4978 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4980 unsigned MinLeadZero = Known.countMinLeadingZeros();
4981 // If the value being shifted has at most lowest bit set we can fold.
4982 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4983 if (MaxActiveBits <= 1)
4984 return true;
4985 // Precondition: NewShAmt u<= countLeadingZeros(C)
4986 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4987 return true;
4988 }
4989 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4991 unsigned MinLeadZero = Known.countMinLeadingZeros();
4992 // If the value being shifted has at most lowest bit set we can fold.
4993 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4994 if (MaxActiveBits <= 1)
4995 return true;
4996 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4997 if (NewShAmtSplat) {
4998 APInt AdjNewShAmt =
4999 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
5000 if (AdjNewShAmt.ule(MinLeadZero))
5001 return true;
5002 }
5003 }
5004 return false; // Can't tell if it's ok.
5005 };
5006 if (!CanFold())
5007 return nullptr;
5008 }
5009
5010 // All good, we can do this fold.
5011 X = Builder.CreateZExt(X, WidestTy);
5012 Y = Builder.CreateZExt(Y, WidestTy);
5013 // The shift is the same that was for X.
5014 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
5015 ? Builder.CreateLShr(X, NewShAmt)
5016 : Builder.CreateShl(X, NewShAmt);
5017 Value *T1 = Builder.CreateAnd(T0, Y);
5018 return Builder.CreateICmp(I.getPredicate(), T1,
5019 Constant::getNullValue(WidestTy));
5020}
5021
5022/// Fold
5023/// (-1 u/ x) u< y
5024/// ((x * y) ?/ x) != y
5025/// to
5026/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
5027/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
5028/// will mean that we are looking for the opposite answer.
5030 CmpPredicate Pred;
5031 Value *X, *Y;
5033 Instruction *Div;
5034 bool NeedNegation;
5035 // Look for: (-1 u/ x) u</u>= y
5036 if (!I.isEquality() &&
5037 match(&I, m_c_ICmp(Pred,
5039 m_Instruction(Div)),
5040 m_Value(Y)))) {
5041 Mul = nullptr;
5042
5043 // Are we checking that overflow does not happen, or does happen?
5044 switch (Pred) {
5046 NeedNegation = false;
5047 break; // OK
5049 NeedNegation = true;
5050 break; // OK
5051 default:
5052 return nullptr; // Wrong predicate.
5053 }
5054 } else // Look for: ((x * y) / x) !=/== y
5055 if (I.isEquality() &&
5056 match(&I, m_c_ICmp(Pred, m_Value(Y),
5059 m_Value(X)),
5061 m_Deferred(X))),
5062 m_Instruction(Div))))) {
5063 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
5064 } else
5065 return nullptr;
5066
5068 // If the pattern included (x * y), we'll want to insert new instructions
5069 // right before that original multiplication so that we can replace it.
5070 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
5071 if (MulHadOtherUses)
5072 Builder.SetInsertPoint(Mul);
5073
5074 Value *Call = Builder.CreateIntrinsic(
5075 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
5076 : Intrinsic::smul_with_overflow,
5077 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
5078
5079 // If the multiplication was used elsewhere, to ensure that we don't leave
5080 // "duplicate" instructions, replace uses of that original multiplication
5081 // with the multiplication result from the with.overflow intrinsic.
5082 if (MulHadOtherUses)
5083 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
5084
5085 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
5086 if (NeedNegation) // This technically increases instruction count.
5087 Res = Builder.CreateNot(Res, "mul.not.ov");
5088
5089 // If we replaced the mul, erase it. Do this after all uses of Builder,
5090 // as the mul is used as insertion point.
5091 if (MulHadOtherUses)
5093
5094 return Res;
5095}
5096
5098 InstCombiner::BuilderTy &Builder) {
5099 CmpPredicate Pred;
5100 Value *X;
5101 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
5102
5103 if (ICmpInst::isSigned(Pred))
5104 Pred = ICmpInst::getSwappedPredicate(Pred);
5105 else if (ICmpInst::isUnsigned(Pred))
5106 Pred = ICmpInst::getSignedPredicate(Pred);
5107 // else for equality-comparisons just keep the predicate.
5108
5109 return ICmpInst::Create(Instruction::ICmp, Pred, X,
5110 Constant::getNullValue(X->getType()), I.getName());
5111 }
5112
5113 // A value is not equal to its negation unless that value is 0 or
5114 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
5115 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
5116 ICmpInst::isEquality(Pred)) {
5117 Type *Ty = X->getType();
5118 uint32_t BitWidth = Ty->getScalarSizeInBits();
5119 Constant *MaxSignedVal =
5120 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
5121 Value *And = Builder.CreateAnd(X, MaxSignedVal);
5122 Constant *Zero = Constant::getNullValue(Ty);
5123 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
5124 }
5125
5126 return nullptr;
5127}
5128
5130 InstCombinerImpl &IC) {
5131 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5132 // Normalize and operand as operand 0.
5133 CmpInst::Predicate Pred = I.getPredicate();
5134 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
5135 std::swap(Op0, Op1);
5136 Pred = ICmpInst::getSwappedPredicate(Pred);
5137 }
5138
5139 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5140 return nullptr;
5141
5142 // (icmp (X & Y) u< X --> (X & Y) != X
5143 if (Pred == ICmpInst::ICMP_ULT)
5144 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5145
5146 // (icmp (X & Y) u>= X --> (X & Y) == X
5147 if (Pred == ICmpInst::ICMP_UGE)
5148 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5149
5150 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5151 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5152 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5153 // so don't do this fold.
5154 if (!match(Op1, m_ImmConstant()))
5155 if (auto *NotOp1 =
5156 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5157 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5158 Constant::getAllOnesValue(Op1->getType()));
5159 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5160 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5161 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5162 Constant::getNullValue(Op1->getType()));
5163 }
5164
5165 if (!ICmpInst::isSigned(Pred))
5166 return nullptr;
5167
5168 KnownBits KnownY = IC.computeKnownBits(A, &I);
5169 // (X & NegY) spred X --> (X & NegY) upred X
5170 if (KnownY.isNegative())
5171 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5172
5173 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5174 return nullptr;
5175
5176 if (KnownY.isNonNegative())
5177 // (X & PosY) s<= X --> X s>= 0
5178 // (X & PosY) s> X --> X s< 0
5179 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5180 Constant::getNullValue(Op1->getType()));
5181
5183 // (NegX & Y) s<= NegX --> Y s< 0
5184 // (NegX & Y) s> NegX --> Y s>= 0
5186 Constant::getNullValue(A->getType()));
5187
5188 return nullptr;
5189}
5190
5192 InstCombinerImpl &IC) {
5193 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5194
5195 // Normalize or operand as operand 0.
5196 CmpInst::Predicate Pred = I.getPredicate();
5197 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5198 std::swap(Op0, Op1);
5199 Pred = ICmpInst::getSwappedPredicate(Pred);
5200 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5201 return nullptr;
5202 }
5203
5204 // icmp (X | Y) u<= X --> (X | Y) == X
5205 if (Pred == ICmpInst::ICMP_ULE)
5206 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5207
5208 // icmp (X | Y) u> X --> (X | Y) != X
5209 if (Pred == ICmpInst::ICMP_UGT)
5210 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5211
5212 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5213 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5214 if (Value *NotOp1 = IC.getFreelyInverted(
5215 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5216 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5217 Constant::getNullValue(Op1->getType()));
5218 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5219 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5220 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5221 Constant::getAllOnesValue(Op1->getType()));
5222 }
5223 return nullptr;
5224}
5225
5227 InstCombinerImpl &IC) {
5228 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5229 // Normalize xor operand as operand 0.
5230 CmpInst::Predicate Pred = I.getPredicate();
5231 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5232 std::swap(Op0, Op1);
5233 Pred = ICmpInst::getSwappedPredicate(Pred);
5234 }
5235 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5236 return nullptr;
5237
5238 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5239 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5240 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5241 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5243 if (PredOut != Pred && isKnownNonZero(A, Q))
5244 return new ICmpInst(PredOut, Op0, Op1);
5245
5246 // These transform work when A is negative.
5247 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5248 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5249 if (match(A, m_Negative())) {
5250 CmpInst::Predicate NewPred;
5251 switch (ICmpInst::getStrictPredicate(Pred)) {
5252 default:
5253 return nullptr;
5254 case ICmpInst::ICMP_SLT:
5255 case ICmpInst::ICMP_UGT:
5256 NewPred = ICmpInst::ICMP_SLT;
5257 break;
5258 case ICmpInst::ICMP_SGT:
5259 case ICmpInst::ICMP_ULT:
5260 NewPred = ICmpInst::ICMP_SGE;
5261 break;
5262 }
5263 Constant *Const = Constant::getNullValue(Op0->getType());
5264 return new ICmpInst(NewPred, Op0, Const);
5265 }
5266
5267 return nullptr;
5268}
5269
5270/// Return true if X is a multiple of C.
5271/// TODO: Handle non-power-of-2 factors.
5272static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5273 if (C.isOne())
5274 return true;
5275
5276 if (!C.isPowerOf2())
5277 return false;
5278
5279 return MaskedValueIsZero(X, C - 1, Q);
5280}
5281
5282/// Try to fold icmp (binop), X or icmp X, (binop).
5283/// TODO: A large part of this logic is duplicated in InstSimplify's
5284/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5285/// duplication.
5287 const SimplifyQuery &SQ) {
5288 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5289 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5290
5291 // Special logic for binary operators.
5294 if (!BO0 && !BO1)
5295 return nullptr;
5296
5297 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5298 return NewICmp;
5299
5300 const CmpInst::Predicate Pred = I.getPredicate();
5301 Value *X;
5302
5303 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5304 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5305 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5306 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5307 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5308 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5309 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5310 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5311 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5312
5313 {
5314 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5315 Constant *C;
5316 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5317 m_ImmConstant(C)))) &&
5318 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5320 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5321 }
5322 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5323 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5324 m_ImmConstant(C)))) &&
5325 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5327 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5328 }
5329 }
5330
5331 // (icmp eq/ne (X, -P2), INT_MIN)
5332 // -> (icmp slt/sge X, INT_MIN + P2)
5333 if (ICmpInst::isEquality(Pred) && BO0 &&
5334 match(I.getOperand(1), m_SignMask()) &&
5336 // Will Constant fold.
5337 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5338 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5340 BO0->getOperand(0), NewC);
5341 }
5342
5343 {
5344 // Similar to above: an unsigned overflow comparison may use offset + mask:
5345 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5346 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5347 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5348 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5349 BinaryOperator *BO;
5350 const APInt *C;
5351 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5352 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5354 CmpInst::Predicate NewPred =
5356 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5357 return new ICmpInst(NewPred, Op1, Zero);
5358 }
5359
5360 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5361 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5363 CmpInst::Predicate NewPred =
5365 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5366 return new ICmpInst(NewPred, Op0, Zero);
5367 }
5368 }
5369
5370 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5371 bool Op0HasNUW = false, Op1HasNUW = false;
5372 bool Op0HasNSW = false, Op1HasNSW = false;
5373 // Analyze the case when either Op0 or Op1 is an add instruction.
5374 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5375 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5376 bool &HasNSW, bool &HasNUW) -> bool {
5378 HasNUW = BO.hasNoUnsignedWrap();
5379 HasNSW = BO.hasNoSignedWrap();
5380 return ICmpInst::isEquality(Pred) ||
5381 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5382 (CmpInst::isSigned(Pred) && HasNSW);
5383 } else if (BO.getOpcode() == Instruction::Or) {
5384 HasNUW = true;
5385 HasNSW = true;
5386 return true;
5387 } else {
5388 return false;
5389 }
5390 };
5391 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5392
5393 if (BO0) {
5394 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5395 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5396 }
5397 if (BO1) {
5398 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5399 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5400 }
5401
5402 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5403 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5404 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5405 return new ICmpInst(Pred, A == Op1 ? B : A,
5406 Constant::getNullValue(Op1->getType()));
5407
5408 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5409 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5410 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5411 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5412 C == Op0 ? D : C);
5413
5414 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5415 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5416 NoOp1WrapProblem) {
5417 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5418 Value *Y, *Z;
5419 if (A == C) {
5420 // C + B == C + D -> B == D
5421 Y = B;
5422 Z = D;
5423 } else if (A == D) {
5424 // D + B == C + D -> B == C
5425 Y = B;
5426 Z = C;
5427 } else if (B == C) {
5428 // A + C == C + D -> A == D
5429 Y = A;
5430 Z = D;
5431 } else {
5432 assert(B == D);
5433 // A + D == C + D -> A == C
5434 Y = A;
5435 Z = C;
5436 }
5437 return new ICmpInst(Pred, Y, Z);
5438 }
5439
5440 if (ICmpInst::isRelational(Pred)) {
5441 // Return if both X and Y is divisible by Z/-Z.
5442 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5443 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5444 bool IsNegative) -> bool {
5445 const APInt *OffsetC;
5446 if (!match(Z, m_APInt(OffsetC)))
5447 return false;
5448
5449 // Fast path for Z == 1/-1.
5450 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5451 return true;
5452
5453 APInt C = *OffsetC;
5454 if (IsNegative)
5455 C.negate();
5456 // Note: -INT_MIN is also negative.
5457 if (!C.isStrictlyPositive())
5458 return false;
5459
5460 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5461 };
5462
5463 // TODO: The subtraction-related identities shown below also hold, but
5464 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5465 // wouldn't happen even if they were implemented.
5466 //
5467 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5468 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5469 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5470 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5471
5472 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5473 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5474 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5475 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5476 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5477 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5478 if (A && NoOp0WrapProblem &&
5479 ShareCommonDivisor(A, Op1, B,
5480 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5482 Op1);
5483
5484 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5485 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5486 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5487 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5488 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5489 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5490 if (C && NoOp1WrapProblem &&
5491 ShareCommonDivisor(Op0, C, D,
5492 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5494 C);
5495 }
5496
5497 // if C1 has greater magnitude than C2:
5498 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5499 // s.t. C3 = C1 - C2
5500 //
5501 // if C2 has greater magnitude than C1:
5502 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5503 // s.t. C3 = C2 - C1
5504 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5505 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5506 const APInt *AP1, *AP2;
5507 // TODO: Support non-uniform vectors.
5508 // TODO: Allow poison passthrough if B or D's element is poison.
5509 if (match(B, m_APIntAllowPoison(AP1)) &&
5510 match(D, m_APIntAllowPoison(AP2)) &&
5511 AP1->isNegative() == AP2->isNegative()) {
5512 APInt AP1Abs = AP1->abs();
5513 APInt AP2Abs = AP2->abs();
5514 if (AP1Abs.uge(AP2Abs)) {
5515 APInt Diff = *AP1 - *AP2;
5516 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5517 Value *NewAdd = Builder.CreateAdd(
5518 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5519 return new ICmpInst(Pred, NewAdd, C);
5520 } else {
5521 APInt Diff = *AP2 - *AP1;
5522 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5523 Value *NewAdd = Builder.CreateAdd(
5524 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5525 return new ICmpInst(Pred, A, NewAdd);
5526 }
5527 }
5528 Constant *Cst1, *Cst2;
5529 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5530 ICmpInst::isEquality(Pred)) {
5531 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5532 Value *NewAdd = Builder.CreateAdd(C, Diff);
5533 return new ICmpInst(Pred, A, NewAdd);
5534 }
5535 }
5536
5537 // Analyze the case when either Op0 or Op1 is a sub instruction.
5538 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5539 A = nullptr;
5540 B = nullptr;
5541 C = nullptr;
5542 D = nullptr;
5543 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5544 A = BO0->getOperand(0);
5545 B = BO0->getOperand(1);
5546 }
5547 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5548 C = BO1->getOperand(0);
5549 D = BO1->getOperand(1);
5550 }
5551
5552 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5553 if (A == Op1 && NoOp0WrapProblem)
5554 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5555 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5556 if (C == Op0 && NoOp1WrapProblem)
5557 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5558
5559 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5560 // (A - B) u>/u<= A --> B u>/u<= A
5561 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5562 return new ICmpInst(Pred, B, A);
5563 // C u</u>= (C - D) --> C u</u>= D
5564 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5565 return new ICmpInst(Pred, C, D);
5566 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5567 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5568 isKnownNonZero(B, Q))
5570 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5571 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5572 isKnownNonZero(D, Q))
5574
5575 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5576 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5577 return new ICmpInst(Pred, A, C);
5578
5579 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5580 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5581 return new ICmpInst(Pred, D, B);
5582
5583 // icmp (0-X) < cst --> x > -cst
5584 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5585 Value *X;
5586 if (match(BO0, m_Neg(m_Value(X))))
5587 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5588 if (RHSC->isNotMinSignedValue())
5589 return new ICmpInst(I.getSwappedPredicate(), X,
5590 ConstantExpr::getNeg(RHSC));
5591 }
5592
5593 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5594 return R;
5595 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5596 return R;
5597
5598 {
5599 // Try to remove shared multiplier from comparison:
5600 // X * Z pred Y * Z
5601 Value *X, *Y, *Z;
5602 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5603 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5604 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5605 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5606 if (ICmpInst::isSigned(Pred)) {
5607 if (Op0HasNSW && Op1HasNSW) {
5608 KnownBits ZKnown = computeKnownBits(Z, &I);
5609 if (ZKnown.isStrictlyPositive())
5610 return new ICmpInst(Pred, X, Y);
5611 if (ZKnown.isNegative())
5612 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5614 SQ.getWithInstruction(&I));
5615 if (LessThan && match(LessThan, m_One()))
5616 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5617 Constant::getNullValue(Z->getType()));
5618 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5619 SQ.getWithInstruction(&I));
5620 if (GreaterThan && match(GreaterThan, m_One()))
5621 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5622 }
5623 } else {
5624 bool NonZero;
5625 if (ICmpInst::isEquality(Pred)) {
5626 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5627 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5628 isKnownNonEqual(X, Y, SQ))
5629 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5630
5631 KnownBits ZKnown = computeKnownBits(Z, &I);
5632 // if Z % 2 != 0
5633 // X * Z eq/ne Y * Z -> X eq/ne Y
5634 if (ZKnown.countMaxTrailingZeros() == 0)
5635 return new ICmpInst(Pred, X, Y);
5636 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5637 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5638 // X * Z eq/ne Y * Z -> X eq/ne Y
5639 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5640 return new ICmpInst(Pred, X, Y);
5641 } else
5642 NonZero = isKnownNonZero(Z, Q);
5643
5644 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5645 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5646 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5647 return new ICmpInst(Pred, X, Y);
5648 }
5649 }
5650 }
5651
5652 BinaryOperator *SRem = nullptr;
5653 // icmp (srem X, Y), Y
5654 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5655 SRem = BO0;
5656 // icmp Y, (srem X, Y)
5657 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5658 Op0 == BO1->getOperand(1))
5659 SRem = BO1;
5660 if (SRem) {
5661 // We don't check hasOneUse to avoid increasing register pressure because
5662 // the value we use is the same value this instruction was already using.
5663 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5664 default:
5665 break;
5666 case ICmpInst::ICMP_EQ:
5667 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5668 case ICmpInst::ICMP_NE:
5669 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5670 case ICmpInst::ICMP_SGT:
5671 case ICmpInst::ICMP_SGE:
5672 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5674 case ICmpInst::ICMP_SLT:
5675 case ICmpInst::ICMP_SLE:
5676 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5678 }
5679 }
5680
5681 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5682 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5683 BO0->getOperand(1) == BO1->getOperand(1)) {
5684 switch (BO0->getOpcode()) {
5685 default:
5686 break;
5687 case Instruction::Add:
5688 case Instruction::Sub:
5689 case Instruction::Xor: {
5690 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5691 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5692
5693 const APInt *C;
5694 if (match(BO0->getOperand(1), m_APInt(C))) {
5695 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5696 if (C->isSignMask()) {
5697 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5698 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5699 }
5700
5701 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5702 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5703 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5704 NewPred = I.getSwappedPredicate(NewPred);
5705 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5706 }
5707 }
5708 break;
5709 }
5710 case Instruction::Mul: {
5711 if (!I.isEquality())
5712 break;
5713
5714 const APInt *C;
5715 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5716 !C->isOne()) {
5717 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5718 // Mask = -1 >> count-trailing-zeros(C).
5719 if (unsigned TZs = C->countr_zero()) {
5720 Constant *Mask = ConstantInt::get(
5721 BO0->getType(),
5722 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5723 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5724 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5725 return new ICmpInst(Pred, And1, And2);
5726 }
5727 }
5728 break;
5729 }
5730 case Instruction::UDiv:
5731 case Instruction::LShr:
5732 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5733 break;
5734 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5735
5736 case Instruction::SDiv:
5737 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5738 !BO0->isExact() || !BO1->isExact())
5739 break;
5740 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5741
5742 case Instruction::AShr:
5743 if (!BO0->isExact() || !BO1->isExact())
5744 break;
5745 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5746
5747 case Instruction::Shl: {
5748 bool NUW = Op0HasNUW && Op1HasNUW;
5749 bool NSW = Op0HasNSW && Op1HasNSW;
5750 if (!NUW && !NSW)
5751 break;
5752 if (!NSW && I.isSigned())
5753 break;
5754 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5755 }
5756 }
5757 }
5758
5759 if (BO0) {
5760 // Transform A & (L - 1) `ult` L --> L != 0
5761 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5762 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5763
5764 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5765 auto *Zero = Constant::getNullValue(BO0->getType());
5766 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5767 }
5768 }
5769
5770 // For unsigned predicates / eq / ne:
5771 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5772 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5773 if (!ICmpInst::isSigned(Pred)) {
5774 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5775 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5776 Constant::getNullValue(Op1->getType()));
5777 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5778 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5779 Constant::getNullValue(Op0->getType()), Op0);
5780 }
5781
5783 return replaceInstUsesWith(I, V);
5784
5785 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5786 return R;
5787
5789 return replaceInstUsesWith(I, V);
5790
5792 return replaceInstUsesWith(I, V);
5793
5794 return nullptr;
5795}
5796
5797/// Fold icmp Pred min|max(X, Y), Z.
5800 Value *Z, CmpPredicate Pred) {
5801 Value *X = MinMax->getLHS();
5802 Value *Y = MinMax->getRHS();
5803 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5804 return nullptr;
5805 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5806 // Revert the transform signed pred -> unsigned pred
5807 // TODO: We can flip the signedness of predicate if both operands of icmp
5808 // are negative.
5809 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5810 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5812 } else
5813 return nullptr;
5814 }
5815 SimplifyQuery Q = SQ.getWithInstruction(&I);
5816 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5817 if (!Val)
5818 return std::nullopt;
5819 if (match(Val, m_One()))
5820 return true;
5821 if (match(Val, m_Zero()))
5822 return false;
5823 return std::nullopt;
5824 };
5825 // Remove samesign here since it is illegal to keep it when we speculatively
5826 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5827 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5828 // -46, -32)`. `X` is allowed to be non-negative here.
5829 Pred = Pred.dropSameSign();
5830 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5831 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5832 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5833 return nullptr;
5834 if (!CmpXZ.has_value()) {
5835 std::swap(X, Y);
5836 std::swap(CmpXZ, CmpYZ);
5837 }
5838
5839 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5840 if (CmpYZ.has_value())
5841 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5842 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5843 };
5844
5845 switch (Pred) {
5846 case ICmpInst::ICMP_EQ:
5847 case ICmpInst::ICMP_NE: {
5848 // If X == Z:
5849 // Expr Result
5850 // min(X, Y) == Z X <= Y
5851 // max(X, Y) == Z X >= Y
5852 // min(X, Y) != Z X > Y
5853 // max(X, Y) != Z X < Y
5854 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5855 ICmpInst::Predicate NewPred =
5856 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5857 if (Pred == ICmpInst::ICMP_NE)
5858 NewPred = ICmpInst::getInversePredicate(NewPred);
5859 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5860 }
5861 // Otherwise (X != Z):
5862 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5863 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5864 if (!MinMaxCmpXZ.has_value()) {
5865 std::swap(X, Y);
5866 std::swap(CmpXZ, CmpYZ);
5867 // Re-check pre-condition X != Z
5868 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5869 break;
5870 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5871 }
5872 if (!MinMaxCmpXZ.has_value())
5873 break;
5874 if (*MinMaxCmpXZ) {
5875 // Expr Fact Result
5876 // min(X, Y) == Z X < Z false
5877 // max(X, Y) == Z X > Z false
5878 // min(X, Y) != Z X < Z true
5879 // max(X, Y) != Z X > Z true
5880 return replaceInstUsesWith(
5881 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5882 } else {
5883 // Expr Fact Result
5884 // min(X, Y) == Z X > Z Y == Z
5885 // max(X, Y) == Z X < Z Y == Z
5886 // min(X, Y) != Z X > Z Y != Z
5887 // max(X, Y) != Z X < Z Y != Z
5888 return FoldIntoCmpYZ();
5889 }
5890 break;
5891 }
5892 case ICmpInst::ICMP_SLT:
5893 case ICmpInst::ICMP_ULT:
5894 case ICmpInst::ICMP_SLE:
5895 case ICmpInst::ICMP_ULE:
5896 case ICmpInst::ICMP_SGT:
5897 case ICmpInst::ICMP_UGT:
5898 case ICmpInst::ICMP_SGE:
5899 case ICmpInst::ICMP_UGE: {
5900 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5901 if (*CmpXZ) {
5902 if (IsSame) {
5903 // Expr Fact Result
5904 // min(X, Y) < Z X < Z true
5905 // min(X, Y) <= Z X <= Z true
5906 // max(X, Y) > Z X > Z true
5907 // max(X, Y) >= Z X >= Z true
5908 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5909 } else {
5910 // Expr Fact Result
5911 // max(X, Y) < Z X < Z Y < Z
5912 // max(X, Y) <= Z X <= Z Y <= Z
5913 // min(X, Y) > Z X > Z Y > Z
5914 // min(X, Y) >= Z X >= Z Y >= Z
5915 return FoldIntoCmpYZ();
5916 }
5917 } else {
5918 if (IsSame) {
5919 // Expr Fact Result
5920 // min(X, Y) < Z X >= Z Y < Z
5921 // min(X, Y) <= Z X > Z Y <= Z
5922 // max(X, Y) > Z X <= Z Y > Z
5923 // max(X, Y) >= Z X < Z Y >= Z
5924 return FoldIntoCmpYZ();
5925 } else {
5926 // Expr Fact Result
5927 // max(X, Y) < Z X >= Z false
5928 // max(X, Y) <= Z X > Z false
5929 // min(X, Y) > Z X <= Z false
5930 // min(X, Y) >= Z X < Z false
5931 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5932 }
5933 }
5934 break;
5935 }
5936 default:
5937 break;
5938 }
5939
5940 return nullptr;
5941}
5942
5943/// Match and fold patterns like:
5944/// icmp eq/ne X, min(max(X, Lo), Hi)
5945/// which represents a range check and can be represented as a ConstantRange.
5946///
5947/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5948/// (X - Lo) u< (Hi + 1 - Lo)
5949/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5950/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5952 MinMaxIntrinsic *Min) {
5953 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5954 return nullptr;
5955
5956 const APInt *Lo = nullptr, *Hi = nullptr;
5957 if (Min->isSigned()) {
5958 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5959 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5960 return nullptr;
5961 } else {
5962 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5963 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5964 return nullptr;
5965 }
5966
5969 APInt C, Offset;
5970 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5971 CR.getEquivalentICmp(Pred, C, Offset);
5972 else
5973 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5974
5975 if (!Offset.isZero())
5976 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5977
5978 return replaceInstUsesWith(
5979 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5980}
5981
5982// Canonicalize checking for a power-of-2-or-zero value:
5984 InstCombiner::BuilderTy &Builder) {
5985 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5986 const CmpInst::Predicate Pred = I.getPredicate();
5987 Value *A = nullptr;
5988 bool CheckIs;
5989 if (I.isEquality()) {
5990 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5991 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5992 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5993 m_Deferred(A)))) ||
5994 !match(Op1, m_ZeroInt()))
5995 A = nullptr;
5996
5997 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5998 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5999 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
6000 A = Op1;
6001 else if (match(Op1,
6003 A = Op0;
6004
6005 CheckIs = Pred == ICmpInst::ICMP_EQ;
6006 } else if (ICmpInst::isUnsigned(Pred)) {
6007 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
6008 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
6009
6010 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
6012 m_Specific(Op1))))) {
6013 A = Op1;
6014 CheckIs = Pred == ICmpInst::ICMP_UGE;
6015 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
6017 m_Specific(Op0))))) {
6018 A = Op0;
6019 CheckIs = Pred == ICmpInst::ICMP_ULE;
6020 }
6021 }
6022
6023 if (A) {
6024 Type *Ty = A->getType();
6025 Value *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
6026 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
6027 ConstantInt::get(Ty, 2))
6028 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
6029 ConstantInt::get(Ty, 1));
6030 }
6031
6032 return nullptr;
6033}
6034
6035/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
6036using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
6038 bool AllowRecursion) {
6040 if (!Inst || !Inst->hasOneUse())
6041 return;
6042
6043 switch (Inst->getOpcode()) {
6044 case Instruction::Add:
6045 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
6046 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
6047 break;
6048 case Instruction::Sub:
6049 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
6050 break;
6051 case Instruction::Xor:
6052 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
6053 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
6054 break;
6055 case Instruction::Shl:
6056 if (Inst->hasNoSignedWrap())
6057 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
6058 if (Inst->hasNoUnsignedWrap())
6059 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
6060 break;
6061 case Instruction::Select:
6062 if (AllowRecursion) {
6063 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
6064 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
6065 }
6066 break;
6067 default:
6068 break;
6069 }
6070}
6071
6073
6078
6080 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
6081 }
6083 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
6084 }
6085 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
6087 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
6088 }
6089 bool isValid() const { return Kind != OffsetKind::Invalid; }
6091 switch (Kind) {
6093 llvm_unreachable("Invalid offset result");
6094 case OffsetKind::Value:
6095 return V0;
6096 case OffsetKind::Select:
6097 return Builder.CreateSelect(
6098 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
6099 }
6100 llvm_unreachable("Unknown OffsetKind enum");
6101 }
6102};
6103
6104/// Offset both sides of an equality icmp to see if we can save some
6105/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
6106/// Note: This operation should not introduce poison.
6108 InstCombiner::BuilderTy &Builder,
6109 const SimplifyQuery &SQ) {
6110 assert(I.isEquality() && "Expected an equality icmp");
6111 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6112 if (!Op0->getType()->isIntOrIntVectorTy())
6113 return nullptr;
6114
6115 SmallVector<OffsetOp, 4> OffsetOps;
6116 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
6117 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
6118
6119 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
6120 switch (BinOpc) {
6121 // V = shl nsw X, RHS => X = ashr V, RHS
6122 case Instruction::AShr: {
6123 const APInt *CV, *CRHS;
6124 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6125 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
6127 return nullptr;
6128 break;
6129 }
6130 // V = shl nuw X, RHS => X = lshr V, RHS
6131 case Instruction::LShr: {
6132 const APInt *CV, *CRHS;
6133 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6134 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
6136 return nullptr;
6137 break;
6138 }
6139 default:
6140 break;
6141 }
6142
6143 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6144 if (!Simplified)
6145 return nullptr;
6146 // Reject constant expressions as they don't simplify things.
6147 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6148 return nullptr;
6149 // Check if the transformation introduces poison.
6150 return impliesPoison(RHS, V) ? Simplified : nullptr;
6151 };
6152
6153 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6154 Value *RHS) -> OffsetResult {
6155 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6156 if (!Sel->hasOneUse())
6157 return OffsetResult::invalid();
6158 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6159 if (!TrueVal)
6160 return OffsetResult::invalid();
6161 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6162 if (!FalseVal)
6163 return OffsetResult::invalid();
6164 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6165 }
6166 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6167 return OffsetResult::value(Simplified);
6168 return OffsetResult::invalid();
6169 };
6170
6171 for (auto [BinOp, RHS] : OffsetOps) {
6172 auto BinOpc = static_cast<unsigned>(BinOp);
6173
6174 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6175 if (!Op0Result.isValid())
6176 continue;
6177 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6178 if (!Op1Result.isValid())
6179 continue;
6180
6181 Value *NewLHS = Op0Result.materialize(Builder);
6182 Value *NewRHS = Op1Result.materialize(Builder);
6183 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6184 }
6185
6186 return nullptr;
6187}
6188
6190 if (!I.isEquality())
6191 return nullptr;
6192
6193 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6194 const CmpInst::Predicate Pred = I.getPredicate();
6195 Value *A, *B, *C, *D;
6196 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6197 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6198 Value *OtherVal = A == Op1 ? B : A;
6199 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6200 }
6201
6202 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6203 // A^c1 == C^c2 --> A == C^(c1^c2)
6204 ConstantInt *C1, *C2;
6205 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6206 Op1->hasOneUse()) {
6207 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6208 Value *Xor = Builder.CreateXor(C, NC);
6209 return new ICmpInst(Pred, A, Xor);
6210 }
6211
6212 // A^B == A^D -> B == D
6213 if (A == C)
6214 return new ICmpInst(Pred, B, D);
6215 if (A == D)
6216 return new ICmpInst(Pred, B, C);
6217 if (B == C)
6218 return new ICmpInst(Pred, A, D);
6219 if (B == D)
6220 return new ICmpInst(Pred, A, C);
6221 }
6222 }
6223
6224 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6225 // A == (A^B) -> B == 0
6226 Value *OtherVal = A == Op0 ? B : A;
6227 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6228 }
6229
6230 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6231 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6232 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6233 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6234
6235 if (A == C) {
6236 X = B;
6237 Y = D;
6238 Z = A;
6239 } else if (A == D) {
6240 X = B;
6241 Y = C;
6242 Z = A;
6243 } else if (B == C) {
6244 X = A;
6245 Y = D;
6246 Z = B;
6247 } else if (B == D) {
6248 X = A;
6249 Y = C;
6250 Z = B;
6251 }
6252
6253 if (X) {
6254 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6255 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6256 // instructions.
6257 const APInt *C0, *C1;
6258 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6259 (*C0 ^ *C1).isNegatedPowerOf2();
6260
6261 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6262 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6263 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6264 int UseCnt =
6265 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6266 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6267 if (XorIsNegP2 || UseCnt >= 2) {
6268 // Build (X^Y) & Z
6269 Op1 = Builder.CreateXor(X, Y);
6270 Op1 = Builder.CreateAnd(Op1, Z);
6271 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6272 }
6273 }
6274 }
6275
6276 {
6277 // Similar to above, but specialized for constant because invert is needed:
6278 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6279 Value *X, *Y;
6280 Constant *C;
6281 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6282 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6283 Value *Xor = Builder.CreateXor(X, Y);
6284 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6285 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6286 }
6287 }
6288
6289 if (match(Op1, m_ZExt(m_Value(A))) &&
6290 (Op0->hasOneUse() || Op1->hasOneUse())) {
6291 // (B & (Pow2C-1)) == zext A --> A == trunc B
6292 // (B & (Pow2C-1)) != zext A --> A != trunc B
6293 const APInt *MaskC;
6294 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6295 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6296 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6297 }
6298
6299 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6300 // For lshr and ashr pairs.
6301 const APInt *AP1, *AP2;
6302 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6303 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6304 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6305 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6306 if (*AP1 != *AP2)
6307 return nullptr;
6308 unsigned TypeBits = AP1->getBitWidth();
6309 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6310 if (ShAmt < TypeBits && ShAmt != 0) {
6311 ICmpInst::Predicate NewPred =
6313 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6314 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6315 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6316 }
6317 }
6318
6319 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6320 ConstantInt *Cst1;
6321 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6322 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6323 unsigned TypeBits = Cst1->getBitWidth();
6324 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6325 if (ShAmt < TypeBits && ShAmt != 0) {
6326 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6327 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6328 Value *And =
6329 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6330 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6331 }
6332 }
6333
6334 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6335 // "icmp (and X, mask), cst"
6336 uint64_t ShAmt = 0;
6337 if (Op0->hasOneUse() &&
6338 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6339 match(Op1, m_ConstantInt(Cst1)) &&
6340 // Only do this when A has multiple uses. This is most important to do
6341 // when it exposes other optimizations.
6342 !A->hasOneUse()) {
6343 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6344
6345 if (ShAmt < ASize) {
6346 APInt MaskV =
6348 MaskV <<= ShAmt;
6349
6350 APInt CmpV = Cst1->getValue().zext(ASize);
6351 CmpV <<= ShAmt;
6352
6353 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6354 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6355 }
6356 }
6357
6359 return ICmp;
6360
6361 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6362 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6363 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6364 // few steps of instcombine.
6365 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6366 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6368 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6369 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6371 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6372 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6374 Add, ConstantInt::get(A->getType(), C.shl(1)));
6375 }
6376
6377 // Canonicalize:
6378 // Assume B_Pow2 != 0
6379 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6380 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6381 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6382 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6383 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6385
6386 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6387 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6388 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6389 ConstantInt::getNullValue(Op1->getType()));
6390
6391 // Canonicalize:
6392 // icmp eq/ne X, OneUse(rotate-right(X))
6393 // -> icmp eq/ne X, rotate-left(X)
6394 // We generally try to convert rotate-right -> rotate-left, this just
6395 // canonicalizes another case.
6396 if (match(&I, m_c_ICmp(m_Value(A),
6398 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6399 return new ICmpInst(
6400 Pred, A,
6401 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6402
6403 // Canonicalize:
6404 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6405 Constant *Cst;
6408 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6409
6410 {
6411 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6412 auto m_Matcher =
6415 m_Sub(m_Value(B), m_Deferred(A)));
6416 std::optional<bool> IsZero = std::nullopt;
6417 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6418 m_Deferred(A))))
6419 IsZero = false;
6420 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6421 else if (match(&I,
6422 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6423 IsZero = true;
6424
6425 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6426 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6427 // -> (icmp eq/ne (and X, P2), 0)
6428 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6429 // -> (icmp eq/ne (and X, P2), P2)
6430 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6431 *IsZero ? A
6432 : ConstantInt::getNullValue(A->getType()));
6433 }
6434
6435 if (auto *Res = foldICmpEqualityWithOffset(
6436 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6437 return Res;
6438
6439 return nullptr;
6440}
6441
6443 ICmpInst::Predicate Pred = ICmp.getPredicate();
6444 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6445
6446 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6447 // The trunc masks high bits while the compare may effectively mask low bits.
6448 Value *X;
6449 const APInt *C;
6450 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6451 return nullptr;
6452
6453 // This matches patterns corresponding to tests of the signbit as well as:
6454 // (trunc X) pred C2 --> (X & Mask) == C
6455 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6456 /*AllowNonZeroC=*/true)) {
6457 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6458 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6459 return new ICmpInst(Res->Pred, And, C);
6460 }
6461
6462 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6463 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6464 if (II->getIntrinsicID() == Intrinsic::cttz ||
6465 II->getIntrinsicID() == Intrinsic::ctlz) {
6466 unsigned MaxRet = SrcBits;
6467 // If the "is_zero_poison" argument is set, then we know at least
6468 // one bit is set in the input, so the result is always at least one
6469 // less than the full bitwidth of that input.
6470 if (match(II->getArgOperand(1), m_One()))
6471 MaxRet--;
6472
6473 // Make sure the destination is wide enough to hold the largest output of
6474 // the intrinsic.
6475 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6476 if (Instruction *I =
6477 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6478 return I;
6479 }
6480 }
6481
6482 return nullptr;
6483}
6484
6486 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6487 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6488 Value *X;
6489 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6490 return nullptr;
6491
6492 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6493 bool IsSignedCmp = ICmp.isSigned();
6494
6495 // icmp Pred (ext X), (ext Y)
6496 Value *Y;
6497 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6498 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6499 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6500
6501 if (IsZext0 != IsZext1) {
6502 // If X and Y and both i1
6503 // (icmp eq/ne (zext X) (sext Y))
6504 // eq -> (icmp eq (or X, Y), 0)
6505 // ne -> (icmp ne (or X, Y), 0)
6506 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6507 Y->getType()->isIntOrIntVectorTy(1))
6508 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6509 Constant::getNullValue(X->getType()));
6510
6511 // If we have mismatched casts and zext has the nneg flag, we can
6512 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6513
6514 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6515 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6516
6517 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6518 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6519
6520 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6521 IsSignedExt = true;
6522 else
6523 return nullptr;
6524 }
6525
6526 // Not an extension from the same type?
6527 Type *XTy = X->getType(), *YTy = Y->getType();
6528 if (XTy != YTy) {
6529 // One of the casts must have one use because we are creating a new cast.
6530 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6531 return nullptr;
6532 // Extend the narrower operand to the type of the wider operand.
6533 CastInst::CastOps CastOpcode =
6534 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6535 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6536 X = Builder.CreateCast(CastOpcode, X, YTy);
6537 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6538 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6539 else
6540 return nullptr;
6541 }
6542
6543 // (zext X) == (zext Y) --> X == Y
6544 // (sext X) == (sext Y) --> X == Y
6545 if (ICmp.isEquality())
6546 return new ICmpInst(ICmp.getPredicate(), X, Y);
6547
6548 // A signed comparison of sign extended values simplifies into a
6549 // signed comparison.
6550 if (IsSignedCmp && IsSignedExt)
6551 return new ICmpInst(ICmp.getPredicate(), X, Y);
6552
6553 // The other three cases all fold into an unsigned comparison.
6554 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6555 }
6556
6557 // Below here, we are only folding a compare with constant.
6558 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6559 if (!C)
6560 return nullptr;
6561
6562 // If a lossless truncate is possible...
6563 Type *SrcTy = CastOp0->getSrcTy();
6564 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6565 if (Res) {
6566 if (ICmp.isEquality())
6567 return new ICmpInst(ICmp.getPredicate(), X, Res);
6568
6569 // A signed comparison of sign extended values simplifies into a
6570 // signed comparison.
6571 if (IsSignedExt && IsSignedCmp)
6572 return new ICmpInst(ICmp.getPredicate(), X, Res);
6573
6574 // The other three cases all fold into an unsigned comparison.
6575 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6576 }
6577
6578 // The re-extended constant changed, partly changed (in the case of a vector),
6579 // or could not be determined to be equal (in the case of a constant
6580 // expression), so the constant cannot be represented in the shorter type.
6581 // All the cases that fold to true or false will have already been handled
6582 // by simplifyICmpInst, so only deal with the tricky case.
6583 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6584 return nullptr;
6585
6586 // Is source op positive?
6587 // icmp ult (sext X), C --> icmp sgt X, -1
6588 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6590
6591 // Is source op negative?
6592 // icmp ugt (sext X), C --> icmp slt X, 0
6593 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6595}
6596
6597/// Handle icmp (cast x), (cast or constant).
6599 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6600 // icmp compares only pointer's value.
6601 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6602 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6603 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6604 if (SimplifiedOp0 || SimplifiedOp1)
6605 return new ICmpInst(ICmp.getPredicate(),
6606 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6607 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6608
6609 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6610 Value *Op1 = ICmp.getOperand(1);
6611 if (!CastOp0)
6612 return nullptr;
6613 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6614 return nullptr;
6615
6616 Value *Op0Src = CastOp0->getOperand(0);
6617 Type *SrcTy = CastOp0->getSrcTy();
6618 Type *DestTy = CastOp0->getDestTy();
6619
6620 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6621 // integer type is the same size as the pointer type.
6622 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6623 unsigned IntWidth = IntTy->getScalarType()->getIntegerBitWidth();
6624 unsigned IndexWidth = DL.getAddressSizeInBits(PtrTy);
6625 unsigned PtrWidth = DL.getPointerTypeSizeInBits(PtrTy);
6626 // For ptrtoint/inttoptr, we must check that IntWidth == IndexWidth and also
6627 // IndexWidth == PtrWidth to (not) handle non-integral pointers.
6628 return IntWidth == IndexWidth && IndexWidth == PtrWidth;
6629 };
6630 if (isa<PtrToIntInst, PtrToAddrInst>(CastOp0)) {
6631 bool HasPtrToInt = isa<PtrToIntInst>(CastOp0);
6632 Value *NewOp1 = nullptr;
6633 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(Op1)) {
6634 NewOp1 = PtrToIntOp1->getOperand(0);
6635 HasPtrToInt = true;
6636 } else if (auto *PtrToAddrOp1 = dyn_cast<PtrToAddrOperator>(Op1)) {
6637 NewOp1 = PtrToAddrOp1->getOperand(0);
6638 } else if (auto *RHSC = dyn_cast<Constant>(Op1)) {
6639 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6640 }
6641
6642 // For ptrtoaddr, IntWidth == IndexWidth is implied and we don't need to
6643 // check PtrWidth.
6644 if ((!HasPtrToInt || CompatibleSizes(SrcTy, DestTy)) &&
6645 (NewOp1 && NewOp1->getType() == Op0Src->getType()))
6646 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6647 }
6648
6649 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6650 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6651 CompatibleSizes(DestTy, SrcTy)) {
6652 Value *NewOp1 = nullptr;
6653 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(Op1)) {
6654 Value *IntSrc = IntToPtrOp1->getOperand(0);
6655 if (IntSrc->getType() == Op0Src->getType())
6656 NewOp1 = IntToPtrOp1->getOperand(0);
6657 } else if (auto *RHSC = dyn_cast<Constant>(Op1)) {
6658 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6659 }
6660
6661 if (NewOp1)
6662 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6663 }
6664
6665 if (Instruction *R = foldICmpWithTrunc(ICmp))
6666 return R;
6667
6668 return foldICmpWithZextOrSext(ICmp);
6669}
6670
6672 bool IsSigned) {
6673 switch (BinaryOp) {
6674 default:
6675 llvm_unreachable("Unsupported binary op");
6676 case Instruction::Add:
6677 case Instruction::Sub:
6678 return match(RHS, m_Zero());
6679 case Instruction::Mul:
6680 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6681 match(RHS, m_One());
6682 }
6683}
6684
6687 bool IsSigned, Value *LHS, Value *RHS,
6688 Instruction *CxtI) const {
6689 switch (BinaryOp) {
6690 default:
6691 llvm_unreachable("Unsupported binary op");
6692 case Instruction::Add:
6693 if (IsSigned)
6694 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6695 else
6696 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6697 case Instruction::Sub:
6698 if (IsSigned)
6699 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6700 else
6701 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6702 case Instruction::Mul:
6703 if (IsSigned)
6704 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6705 else
6706 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6707 }
6708}
6709
6710bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6711 bool IsSigned, Value *LHS,
6712 Value *RHS, Instruction &OrigI,
6713 Value *&Result,
6714 Constant *&Overflow) {
6715 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6716 std::swap(LHS, RHS);
6717
6718 // If the overflow check was an add followed by a compare, the insertion point
6719 // may be pointing to the compare. We want to insert the new instructions
6720 // before the add in case there are uses of the add between the add and the
6721 // compare.
6722 Builder.SetInsertPoint(&OrigI);
6723
6724 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6725 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6726 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6727
6728 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6729 Result = LHS;
6730 Overflow = ConstantInt::getFalse(OverflowTy);
6731 return true;
6732 }
6733
6734 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6736 return false;
6739 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6740 Result->takeName(&OrigI);
6741 Overflow = ConstantInt::getTrue(OverflowTy);
6742 return true;
6744 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6745 Result->takeName(&OrigI);
6746 Overflow = ConstantInt::getFalse(OverflowTy);
6747 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6748 if (IsSigned)
6749 Inst->setHasNoSignedWrap();
6750 else
6751 Inst->setHasNoUnsignedWrap();
6752 }
6753 return true;
6754 }
6755
6756 llvm_unreachable("Unexpected overflow result");
6757}
6758
6759/// Recognize and process idiom involving test for multiplication
6760/// overflow.
6761///
6762/// The caller has matched a pattern of the form:
6763/// I = cmp u (mul(zext A, zext B), V
6764/// The function checks if this is a test for overflow and if so replaces
6765/// multiplication with call to 'mul.with.overflow' intrinsic.
6766///
6767/// \param I Compare instruction.
6768/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6769/// the compare instruction. Must be of integer type.
6770/// \param OtherVal The other argument of compare instruction.
6771/// \returns Instruction which must replace the compare instruction, NULL if no
6772/// replacement required.
6774 const APInt *OtherVal,
6775 InstCombinerImpl &IC) {
6776 // Don't bother doing this transformation for pointers, don't do it for
6777 // vectors.
6778 if (!isa<IntegerType>(MulVal->getType()))
6779 return nullptr;
6780
6781 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6782 if (!MulInstr)
6783 return nullptr;
6784 assert(MulInstr->getOpcode() == Instruction::Mul);
6785
6786 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6787 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6788 assert(LHS->getOpcode() == Instruction::ZExt);
6789 assert(RHS->getOpcode() == Instruction::ZExt);
6790 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6791
6792 // Calculate type and width of the result produced by mul.with.overflow.
6793 Type *TyA = A->getType(), *TyB = B->getType();
6794 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6795 WidthB = TyB->getPrimitiveSizeInBits();
6796 unsigned MulWidth;
6797 Type *MulType;
6798 if (WidthB > WidthA) {
6799 MulWidth = WidthB;
6800 MulType = TyB;
6801 } else {
6802 MulWidth = WidthA;
6803 MulType = TyA;
6804 }
6805
6806 // In order to replace the original mul with a narrower mul.with.overflow,
6807 // all uses must ignore upper bits of the product. The number of used low
6808 // bits must be not greater than the width of mul.with.overflow.
6809 if (MulVal->hasNUsesOrMore(2))
6810 for (User *U : MulVal->users()) {
6811 if (U == &I)
6812 continue;
6813 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6814 // Check if truncation ignores bits above MulWidth.
6815 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6816 if (TruncWidth > MulWidth)
6817 return nullptr;
6818 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6819 // Check if AND ignores bits above MulWidth.
6820 if (BO->getOpcode() != Instruction::And)
6821 return nullptr;
6822 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6823 const APInt &CVal = CI->getValue();
6824 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6825 return nullptr;
6826 } else {
6827 // In this case we could have the operand of the binary operation
6828 // being defined in another block, and performing the replacement
6829 // could break the dominance relation.
6830 return nullptr;
6831 }
6832 } else {
6833 // Other uses prohibit this transformation.
6834 return nullptr;
6835 }
6836 }
6837
6838 // Recognize patterns
6839 switch (I.getPredicate()) {
6840 case ICmpInst::ICMP_UGT: {
6841 // Recognize pattern:
6842 // mulval = mul(zext A, zext B)
6843 // cmp ugt mulval, max
6844 APInt MaxVal = APInt::getMaxValue(MulWidth);
6845 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6846 if (MaxVal.eq(*OtherVal))
6847 break; // Recognized
6848 return nullptr;
6849 }
6850
6851 case ICmpInst::ICMP_ULT: {
6852 // Recognize pattern:
6853 // mulval = mul(zext A, zext B)
6854 // cmp ule mulval, max + 1
6855 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6856 if (MaxVal.eq(*OtherVal))
6857 break; // Recognized
6858 return nullptr;
6859 }
6860
6861 default:
6862 return nullptr;
6863 }
6864
6865 InstCombiner::BuilderTy &Builder = IC.Builder;
6866 Builder.SetInsertPoint(MulInstr);
6867
6868 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6869 Value *MulA = A, *MulB = B;
6870 if (WidthA < MulWidth)
6871 MulA = Builder.CreateZExt(A, MulType);
6872 if (WidthB < MulWidth)
6873 MulB = Builder.CreateZExt(B, MulType);
6874 Value *Call =
6875 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6876 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6877 IC.addToWorklist(MulInstr);
6878
6879 // If there are uses of mul result other than the comparison, we know that
6880 // they are truncation or binary AND. Change them to use result of
6881 // mul.with.overflow and adjust properly mask/size.
6882 if (MulVal->hasNUsesOrMore(2)) {
6883 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6884 for (User *U : make_early_inc_range(MulVal->users())) {
6885 if (U == &I)
6886 continue;
6887 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6888 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6889 IC.replaceInstUsesWith(*TI, Mul);
6890 else
6891 TI->setOperand(0, Mul);
6892 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6893 assert(BO->getOpcode() == Instruction::And);
6894 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6895 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6896 APInt ShortMask = CI->getValue().trunc(MulWidth);
6897 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6898 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6899 IC.replaceInstUsesWith(*BO, Zext);
6900 } else {
6901 llvm_unreachable("Unexpected Binary operation");
6902 }
6904 }
6905 }
6906
6907 // The original icmp gets replaced with the overflow value, maybe inverted
6908 // depending on predicate.
6909 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6910 Value *Res = Builder.CreateExtractValue(Call, 1);
6911 return BinaryOperator::CreateNot(Res);
6912 }
6913
6914 return ExtractValueInst::Create(Call, 1);
6915}
6916
6917/// When performing a comparison against a constant, it is possible that not all
6918/// the bits in the LHS are demanded. This helper method computes the mask that
6919/// IS demanded.
6921 const APInt *RHS;
6922 if (!match(I.getOperand(1), m_APInt(RHS)))
6924
6925 // If this is a normal comparison, it demands all bits. If it is a sign bit
6926 // comparison, it only demands the sign bit.
6927 bool UnusedBit;
6928 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6930
6931 switch (I.getPredicate()) {
6932 // For a UGT comparison, we don't care about any bits that
6933 // correspond to the trailing ones of the comparand. The value of these
6934 // bits doesn't impact the outcome of the comparison, because any value
6935 // greater than the RHS must differ in a bit higher than these due to carry.
6936 case ICmpInst::ICMP_UGT:
6937 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6938
6939 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6940 // Any value less than the RHS must differ in a higher bit because of carries.
6941 case ICmpInst::ICMP_ULT:
6942 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6943
6944 default:
6946 }
6947}
6948
6949/// Check that one use is in the same block as the definition and all
6950/// other uses are in blocks dominated by a given block.
6951///
6952/// \param DI Definition
6953/// \param UI Use
6954/// \param DB Block that must dominate all uses of \p DI outside
6955/// the parent block
6956/// \return true when \p UI is the only use of \p DI in the parent block
6957/// and all other uses of \p DI are in blocks dominated by \p DB.
6958///
6960 const Instruction *UI,
6961 const BasicBlock *DB) const {
6962 assert(DI && UI && "Instruction not defined\n");
6963 // Ignore incomplete definitions.
6964 if (!DI->getParent())
6965 return false;
6966 // DI and UI must be in the same block.
6967 if (DI->getParent() != UI->getParent())
6968 return false;
6969 // Protect from self-referencing blocks.
6970 if (DI->getParent() == DB)
6971 return false;
6972 for (const User *U : DI->users()) {
6973 auto *Usr = cast<Instruction>(U);
6974 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6975 return false;
6976 }
6977 return true;
6978}
6979
6980/// Return true when the instruction sequence within a block is select-cmp-br.
6982 const BasicBlock *BB = SI->getParent();
6983 if (!BB)
6984 return false;
6986 if (!BI)
6987 return false;
6988 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6989 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6990 return false;
6991 return true;
6992}
6993
6994/// True when a select result is replaced by one of its operands
6995/// in select-icmp sequence. This will eventually result in the elimination
6996/// of the select.
6997///
6998/// \param SI Select instruction
6999/// \param Icmp Compare instruction
7000/// \param SIOpd Operand that replaces the select
7001///
7002/// Notes:
7003/// - The replacement is global and requires dominator information
7004/// - The caller is responsible for the actual replacement
7005///
7006/// Example:
7007///
7008/// entry:
7009/// %4 = select i1 %3, %C* %0, %C* null
7010/// %5 = icmp eq %C* %4, null
7011/// br i1 %5, label %9, label %7
7012/// ...
7013/// ; <label>:7 ; preds = %entry
7014/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
7015/// ...
7016///
7017/// can be transformed to
7018///
7019/// %5 = icmp eq %C* %0, null
7020/// %6 = select i1 %3, i1 %5, i1 true
7021/// br i1 %6, label %9, label %7
7022/// ...
7023/// ; <label>:7 ; preds = %entry
7024/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
7025///
7026/// Similar when the first operand of the select is a constant or/and
7027/// the compare is for not equal rather than equal.
7028///
7029/// NOTE: The function is only called when the select and compare constants
7030/// are equal, the optimization can work only for EQ predicates. This is not a
7031/// major restriction since a NE compare should be 'normalized' to an equal
7032/// compare, which usually happens in the combiner and test case
7033/// select-cmp-br.ll checks for it.
7035 const ICmpInst *Icmp,
7036 const unsigned SIOpd) {
7037 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
7039 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
7040 // The check for the single predecessor is not the best that can be
7041 // done. But it protects efficiently against cases like when SI's
7042 // home block has two successors, Succ and Succ1, and Succ1 predecessor
7043 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
7044 // replaced can be reached on either path. So the uniqueness check
7045 // guarantees that the path all uses of SI (outside SI's parent) are on
7046 // is disjoint from all other paths out of SI. But that information
7047 // is more expensive to compute, and the trade-off here is in favor
7048 // of compile-time. It should also be noticed that we check for a single
7049 // predecessor and not only uniqueness. This to handle the situation when
7050 // Succ and Succ1 points to the same basic block.
7051 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
7052 NumSel++;
7053 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
7054 return true;
7055 }
7056 }
7057 return false;
7058}
7059
7060/// Try to fold the comparison based on range information we can get by checking
7061/// whether bits are known to be zero or one in the inputs.
7063 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7064 Type *Ty = Op0->getType();
7065 ICmpInst::Predicate Pred = I.getPredicate();
7066
7067 // Get scalar or pointer size.
7068 unsigned BitWidth = Ty->isIntOrIntVectorTy()
7069 ? Ty->getScalarSizeInBits()
7070 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
7071
7072 if (!BitWidth)
7073 return nullptr;
7074
7075 KnownBits Op0Known(BitWidth);
7076 KnownBits Op1Known(BitWidth);
7077
7078 {
7079 // Don't use dominating conditions when folding icmp using known bits. This
7080 // may convert signed into unsigned predicates in ways that other passes
7081 // (especially IndVarSimplify) may not be able to reliably undo.
7082 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
7084 Op0Known, Q))
7085 return &I;
7086
7087 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
7088 return &I;
7089 }
7090
7091 if (!isa<Constant>(Op0) && Op0Known.isConstant())
7092 return new ICmpInst(
7093 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
7094 if (!isa<Constant>(Op1) && Op1Known.isConstant())
7095 return new ICmpInst(
7096 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
7097
7098 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
7099 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
7100
7101 // Given the known and unknown bits, compute a range that the LHS could be
7102 // in. Compute the Min, Max and RHS values based on the known bits. For the
7103 // EQ and NE we use unsigned values.
7104 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
7105 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
7106 if (I.isSigned()) {
7107 Op0Min = Op0Known.getSignedMinValue();
7108 Op0Max = Op0Known.getSignedMaxValue();
7109 Op1Min = Op1Known.getSignedMinValue();
7110 Op1Max = Op1Known.getSignedMaxValue();
7111 } else {
7112 Op0Min = Op0Known.getMinValue();
7113 Op0Max = Op0Known.getMaxValue();
7114 Op1Min = Op1Known.getMinValue();
7115 Op1Max = Op1Known.getMaxValue();
7116 }
7117
7118 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
7119 // min/max canonical compare with some other compare. That could lead to
7120 // conflict with select canonicalization and infinite looping.
7121 // FIXME: This constraint may go away if min/max intrinsics are canonical.
7122 auto isMinMaxCmp = [&](Instruction &Cmp) {
7123 if (!Cmp.hasOneUse())
7124 return false;
7125 Value *A, *B;
7126 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
7128 return false;
7129 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
7130 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
7131 };
7132 if (!isMinMaxCmp(I)) {
7133 switch (Pred) {
7134 default:
7135 break;
7136 case ICmpInst::ICMP_ULT: {
7137 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
7138 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7139 const APInt *CmpC;
7140 if (match(Op1, m_APInt(CmpC))) {
7141 // A <u C -> A == C-1 if min(A)+1 == C
7142 if (*CmpC == Op0Min + 1)
7143 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7144 ConstantInt::get(Op1->getType(), *CmpC - 1));
7145 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7146 // exceeds the log2 of C.
7147 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7148 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7149 Constant::getNullValue(Op1->getType()));
7150 }
7151 break;
7152 }
7153 case ICmpInst::ICMP_UGT: {
7154 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7155 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7156 const APInt *CmpC;
7157 if (match(Op1, m_APInt(CmpC))) {
7158 // A >u C -> A == C+1 if max(a)-1 == C
7159 if (*CmpC == Op0Max - 1)
7160 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7161 ConstantInt::get(Op1->getType(), *CmpC + 1));
7162 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7163 // exceeds the log2 of C.
7164 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7165 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7166 Constant::getNullValue(Op1->getType()));
7167 }
7168 break;
7169 }
7170 case ICmpInst::ICMP_SLT: {
7171 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7172 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7173 const APInt *CmpC;
7174 if (match(Op1, m_APInt(CmpC))) {
7175 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7176 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7177 ConstantInt::get(Op1->getType(), *CmpC - 1));
7178 }
7179 break;
7180 }
7181 case ICmpInst::ICMP_SGT: {
7182 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7183 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7184 const APInt *CmpC;
7185 if (match(Op1, m_APInt(CmpC))) {
7186 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7187 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7188 ConstantInt::get(Op1->getType(), *CmpC + 1));
7189 }
7190 break;
7191 }
7192 }
7193 }
7194
7195 // Based on the range information we know about the LHS, see if we can
7196 // simplify this comparison. For example, (x&4) < 8 is always true.
7197 switch (Pred) {
7198 default:
7199 break;
7200 case ICmpInst::ICMP_EQ:
7201 case ICmpInst::ICMP_NE: {
7202 // If all bits are known zero except for one, then we know at most one bit
7203 // is set. If the comparison is against zero, then this is a check to see if
7204 // *that* bit is set.
7205 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7206 if (Op1Known.isZero()) {
7207 // If the LHS is an AND with the same constant, look through it.
7208 Value *LHS = nullptr;
7209 const APInt *LHSC;
7210 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7211 *LHSC != Op0KnownZeroInverted)
7212 LHS = Op0;
7213
7214 Value *X;
7215 const APInt *C1;
7216 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7217 Type *XTy = X->getType();
7218 unsigned Log2C1 = C1->countr_zero();
7219 APInt C2 = Op0KnownZeroInverted;
7220 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7221 if (C2Pow2.isPowerOf2()) {
7222 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7223 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7224 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7225 unsigned Log2C2 = C2Pow2.countr_zero();
7226 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7227 auto NewPred =
7229 return new ICmpInst(NewPred, X, CmpC);
7230 }
7231 }
7232 }
7233
7234 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7235 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7236 (Op0Known & Op1Known) == Op0Known)
7237 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7238 ConstantInt::getNullValue(Op1->getType()));
7239 break;
7240 }
7241 case ICmpInst::ICMP_SGE:
7242 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7243 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7244 break;
7245 case ICmpInst::ICMP_SLE:
7246 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7247 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7248 break;
7249 case ICmpInst::ICMP_UGE:
7250 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7251 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7252 break;
7253 case ICmpInst::ICMP_ULE:
7254 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7255 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7256 break;
7257 }
7258
7259 // Turn a signed comparison into an unsigned one if both operands are known to
7260 // have the same sign. Set samesign if possible (except for equality
7261 // predicates).
7262 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7263 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7264 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7265 I.setPredicate(I.getUnsignedPredicate());
7266 I.setSameSign();
7267 return &I;
7268 }
7269
7270 return nullptr;
7271}
7272
7273/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7274/// then try to reduce patterns based on that limit.
7276 Value *X, *Y;
7277 CmpPredicate Pred;
7278
7279 // X must be 0 and bool must be true for "ULT":
7280 // X <u (zext i1 Y) --> (X == 0) & Y
7281 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7282 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7283 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7284
7285 // X must be 0 or bool must be true for "ULE":
7286 // X <=u (sext i1 Y) --> (X == 0) | Y
7287 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7288 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7289 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7290
7291 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7292 CmpPredicate Pred1, Pred2;
7293 const APInt *C;
7294 Instruction *ExtI;
7295 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7298 m_APInt(C)))))) &&
7299 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7300 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7301 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7302 auto CreateRangeCheck = [&] {
7303 Value *CmpV1 =
7304 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7305 Value *CmpV2 = Builder.CreateICmp(
7306 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7308 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7309 CmpV1, CmpV2);
7310 };
7311 if (C->isZero()) {
7312 if (Pred2 == ICmpInst::ICMP_EQ) {
7313 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7314 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7315 return replaceInstUsesWith(
7316 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7317 } else if (!IsSExt || HasOneUse) {
7318 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7319 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7320 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7321 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7322 return CreateRangeCheck();
7323 }
7324 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7325 if (Pred2 == ICmpInst::ICMP_NE) {
7326 // icmp eq X, (zext (icmp ne X, 1)) --> false
7327 // icmp ne X, (zext (icmp ne X, 1)) --> true
7328 // icmp eq X, (sext (icmp ne X, -1)) --> false
7329 // icmp ne X, (sext (icmp ne X, -1)) --> true
7330 return replaceInstUsesWith(
7331 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7332 } else if (!IsSExt || HasOneUse) {
7333 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7334 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7335 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7336 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7337 return CreateRangeCheck();
7338 }
7339 } else {
7340 // when C != 0 && C != 1:
7341 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7342 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7343 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7344 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7345 // when C != 0 && C != -1:
7346 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7347 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7348 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7349 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7350 return ICmpInst::Create(
7351 Instruction::ICmp, Pred1, X,
7352 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7353 ? (IsSExt ? -1 : 1)
7354 : 0));
7355 }
7356 }
7357
7358 return nullptr;
7359}
7360
7361/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7362/// it into the appropriate icmp lt or icmp gt instruction. This transform
7363/// allows them to be folded in visitICmpInst.
7365 ICmpInst::Predicate Pred = I.getPredicate();
7366 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7368 return nullptr;
7369
7370 Value *Op0 = I.getOperand(0);
7371 Value *Op1 = I.getOperand(1);
7372 auto *Op1C = dyn_cast<Constant>(Op1);
7373 if (!Op1C)
7374 return nullptr;
7375
7376 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7377 if (!FlippedStrictness)
7378 return nullptr;
7379
7380 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7381}
7382
7383/// If we have a comparison with a non-canonical predicate, if we can update
7384/// all the users, invert the predicate and adjust all the users.
7386 // Is the predicate already canonical?
7387 CmpInst::Predicate Pred = I.getPredicate();
7389 return nullptr;
7390
7391 // Can all users be adjusted to predicate inversion?
7392 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7393 return nullptr;
7394
7395 // Ok, we can canonicalize comparison!
7396 // Let's first invert the comparison's predicate.
7397 I.setPredicate(CmpInst::getInversePredicate(Pred));
7398 I.setName(I.getName() + ".not");
7399
7400 // And, adapt users.
7402
7403 return &I;
7404}
7405
7406/// Integer compare with boolean values can always be turned into bitwise ops.
7408 InstCombiner::BuilderTy &Builder) {
7409 Value *A = I.getOperand(0), *B = I.getOperand(1);
7410 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7411
7412 // A boolean compared to true/false can be simplified to Op0/true/false in
7413 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7414 // Cases not handled by InstSimplify are always 'not' of Op0.
7415 if (match(B, m_Zero())) {
7416 switch (I.getPredicate()) {
7417 case CmpInst::ICMP_EQ: // A == 0 -> !A
7418 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7419 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7421 default:
7422 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7423 }
7424 } else if (match(B, m_One())) {
7425 switch (I.getPredicate()) {
7426 case CmpInst::ICMP_NE: // A != 1 -> !A
7427 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7428 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7430 default:
7431 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7432 }
7433 }
7434
7435 switch (I.getPredicate()) {
7436 default:
7437 llvm_unreachable("Invalid icmp instruction!");
7438 case ICmpInst::ICMP_EQ:
7439 // icmp eq i1 A, B -> ~(A ^ B)
7440 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7441
7442 case ICmpInst::ICMP_NE:
7443 // icmp ne i1 A, B -> A ^ B
7444 return BinaryOperator::CreateXor(A, B);
7445
7446 case ICmpInst::ICMP_UGT:
7447 // icmp ugt -> icmp ult
7448 std::swap(A, B);
7449 [[fallthrough]];
7450 case ICmpInst::ICMP_ULT:
7451 // icmp ult i1 A, B -> ~A & B
7452 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7453
7454 case ICmpInst::ICMP_SGT:
7455 // icmp sgt -> icmp slt
7456 std::swap(A, B);
7457 [[fallthrough]];
7458 case ICmpInst::ICMP_SLT:
7459 // icmp slt i1 A, B -> A & ~B
7460 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7461
7462 case ICmpInst::ICMP_UGE:
7463 // icmp uge -> icmp ule
7464 std::swap(A, B);
7465 [[fallthrough]];
7466 case ICmpInst::ICMP_ULE:
7467 // icmp ule i1 A, B -> ~A | B
7468 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7469
7470 case ICmpInst::ICMP_SGE:
7471 // icmp sge -> icmp sle
7472 std::swap(A, B);
7473 [[fallthrough]];
7474 case ICmpInst::ICMP_SLE:
7475 // icmp sle i1 A, B -> A | ~B
7476 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7477 }
7478}
7479
7480// Transform pattern like:
7481// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7482// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7483// Into:
7484// (X l>> Y) != 0
7485// (X l>> Y) == 0
7487 InstCombiner::BuilderTy &Builder) {
7488 CmpPredicate Pred, NewPred;
7489 Value *X, *Y;
7490 if (match(&Cmp,
7491 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7492 switch (Pred) {
7493 case ICmpInst::ICMP_ULE:
7494 NewPred = ICmpInst::ICMP_NE;
7495 break;
7496 case ICmpInst::ICMP_UGT:
7497 NewPred = ICmpInst::ICMP_EQ;
7498 break;
7499 default:
7500 return nullptr;
7501 }
7502 } else if (match(&Cmp, m_c_ICmp(Pred,
7505 m_Add(m_Shl(m_One(), m_Value(Y)),
7506 m_AllOnes()))),
7507 m_Value(X)))) {
7508 // The variant with 'add' is not canonical, (the variant with 'not' is)
7509 // we only get it because it has extra uses, and can't be canonicalized,
7510
7511 switch (Pred) {
7512 case ICmpInst::ICMP_ULT:
7513 NewPred = ICmpInst::ICMP_NE;
7514 break;
7515 case ICmpInst::ICMP_UGE:
7516 NewPred = ICmpInst::ICMP_EQ;
7517 break;
7518 default:
7519 return nullptr;
7520 }
7521 } else
7522 return nullptr;
7523
7524 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7525 Constant *Zero = Constant::getNullValue(NewX->getType());
7526 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7527}
7528
7530 InstCombiner::BuilderTy &Builder) {
7531 const CmpInst::Predicate Pred = Cmp.getPredicate();
7532 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7533 Value *V1, *V2;
7534
7535 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7536 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7537 if (auto *I = dyn_cast<Instruction>(V))
7538 I->copyIRFlags(&Cmp);
7539 Module *M = Cmp.getModule();
7541 M, Intrinsic::vector_reverse, V->getType());
7542 return CallInst::Create(F, V);
7543 };
7544
7545 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7546 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7547 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7548 (LHS->hasOneUse() || RHS->hasOneUse()))
7549 return createCmpReverse(Pred, V1, V2);
7550
7551 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7552 if (LHS->hasOneUse() && isSplatValue(RHS))
7553 return createCmpReverse(Pred, V1, RHS);
7554 }
7555 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7556 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7557 return createCmpReverse(Pred, LHS, V2);
7558
7559 ArrayRef<int> M;
7560 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7561 return nullptr;
7562
7563 // If both arguments of the cmp are shuffles that use the same mask and
7564 // shuffle within a single vector, move the shuffle after the cmp:
7565 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7566 Type *V1Ty = V1->getType();
7567 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7568 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7569 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7570 return new ShuffleVectorInst(NewCmp, M);
7571 }
7572
7573 // Try to canonicalize compare with splatted operand and splat constant.
7574 // TODO: We could generalize this for more than splats. See/use the code in
7575 // InstCombiner::foldVectorBinop().
7576 Constant *C;
7577 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7578 return nullptr;
7579
7580 // Length-changing splats are ok, so adjust the constants as needed:
7581 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7582 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7583 int MaskSplatIndex;
7584 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7585 // We allow poison in matching, but this transform removes it for safety.
7586 // Demanded elements analysis should be able to recover some/all of that.
7587 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7588 ScalarC);
7589 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7590 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7591 return new ShuffleVectorInst(NewCmp, NewM);
7592 }
7593
7594 return nullptr;
7595}
7596
7597// extract(uadd.with.overflow(A, B), 0) ult A
7598// -> extract(uadd.with.overflow(A, B), 1)
7600 CmpInst::Predicate Pred = I.getPredicate();
7601 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7602
7603 Value *UAddOv;
7604 Value *A, *B;
7605 auto UAddOvResultPat = m_ExtractValue<0>(
7607 if (match(Op0, UAddOvResultPat) &&
7608 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7609 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7610 (match(A, m_One()) || match(B, m_One()))) ||
7611 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7612 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7613 // extract(uadd.with.overflow(A, B), 0) < A
7614 // extract(uadd.with.overflow(A, 1), 0) == 0
7615 // extract(uadd.with.overflow(A, -1), 0) != -1
7616 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7617 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7618 (Op0 == A || Op0 == B))
7619 // A > extract(uadd.with.overflow(A, B), 0)
7620 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7621 else
7622 return nullptr;
7623
7624 return ExtractValueInst::Create(UAddOv, 1);
7625}
7626
7628 if (!I.getOperand(0)->getType()->isPointerTy() ||
7630 I.getParent()->getParent(),
7631 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7632 return nullptr;
7633 }
7634 Instruction *Op;
7635 if (match(I.getOperand(0), m_Instruction(Op)) &&
7636 match(I.getOperand(1), m_Zero()) &&
7637 Op->isLaunderOrStripInvariantGroup()) {
7638 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7639 Op->getOperand(0), I.getOperand(1));
7640 }
7641 return nullptr;
7642}
7643
7645 IRBuilderBase &Builder) {
7646 if (!ICmpInst::isEquality(I.getPredicate()))
7647 return nullptr;
7648
7649 // The caller puts constants after non-constants.
7650 Value *Op = I.getOperand(0);
7651 Value *Const = I.getOperand(1);
7652
7653 // For Cond an equality condition, fold
7654 //
7655 // icmp (eq|ne) (vreduce_(or|and) Op), (Zero|AllOnes) ->
7656 // icmp (eq|ne) Op, (Zero|AllOnes)
7657 //
7658 // with a bitcast.
7659 Value *Vec;
7660 if ((match(Const, m_ZeroInt()) &&
7662 m_Value(Vec))))) ||
7663 (match(Const, m_AllOnes()) &&
7665 m_Value(Vec)))))) {
7666 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
7667 if (!VecTy)
7668 return nullptr;
7669 Type *VecEltTy = VecTy->getElementType();
7670 unsigned ScalarBW =
7671 DL.getTypeSizeInBits(VecEltTy) * VecTy->getNumElements();
7672 if (!DL.fitsInLegalInteger(ScalarBW))
7673 return nullptr;
7674 Type *ScalarTy = IntegerType::get(I.getContext(), ScalarBW);
7675 Value *NewConst = match(Const, m_ZeroInt())
7676 ? ConstantInt::get(ScalarTy, 0)
7677 : ConstantInt::getAllOnesValue(ScalarTy);
7678 return CmpInst::Create(Instruction::ICmp, I.getPredicate(),
7679 Builder.CreateBitCast(Vec, ScalarTy), NewConst);
7680 }
7681 return nullptr;
7682}
7683
7684/// This function folds patterns produced by lowering of reduce idioms, such as
7685/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7686/// attempts to generate fewer number of scalar comparisons instead of vector
7687/// comparisons when possible.
7689 InstCombiner::BuilderTy &Builder,
7690 const DataLayout &DL) {
7691 if (I.getType()->isVectorTy())
7692 return nullptr;
7693 CmpPredicate OuterPred, InnerPred;
7694 Value *LHS, *RHS;
7695
7696 // Match lowering of @llvm.vector.reduce.and. Turn
7697 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7698 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7699 /// %res = icmp <pred> i8 %scalar_ne, 0
7700 ///
7701 /// into
7702 ///
7703 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7704 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7705 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7706 ///
7707 /// for <pred> in {ne, eq}.
7708 if (!match(&I, m_ICmp(OuterPred,
7710 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7711 m_Zero())))
7712 return nullptr;
7713 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7714 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7715 return nullptr;
7716 unsigned NumBits =
7717 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7718 // TODO: Relax this to "not wider than max legal integer type"?
7719 if (!DL.isLegalInteger(NumBits))
7720 return nullptr;
7721
7722 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7723 auto *ScalarTy = Builder.getIntNTy(NumBits);
7724 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7725 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7726 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7727 I.getName());
7728 }
7729
7730 return nullptr;
7731}
7732
7733// This helper will be called with icmp operands in both orders.
7735 Value *Op0, Value *Op1,
7736 ICmpInst &CxtI) {
7737 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7738 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7739 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7740 return NI;
7741
7742 if (auto *SI = dyn_cast<SelectInst>(Op0))
7743 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7744 return NI;
7745
7746 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7747 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7748 return Res;
7749
7750 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7751 return Res;
7752 }
7753
7754 {
7755 Value *X;
7756 const APInt *C;
7757 // icmp X+Cst, X
7758 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7759 return foldICmpAddOpConst(X, *C, Pred);
7760 }
7761
7762 // abs(X) >= X --> true
7763 // abs(X) u<= X --> true
7764 // abs(X) < X --> false
7765 // abs(X) u> X --> false
7766 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7767 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7768 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7769 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7770 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7771 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7772 {
7773 Value *X;
7774 Constant *C;
7776 match(Op1, m_Specific(X))) {
7777 Value *NullValue = Constant::getNullValue(X->getType());
7778 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7779 const APInt SMin =
7780 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7781 bool IsIntMinPosion = C->isAllOnesValue();
7782 switch (Pred) {
7783 case CmpInst::ICMP_ULE:
7784 case CmpInst::ICMP_SGE:
7785 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7786 case CmpInst::ICMP_UGT:
7787 case CmpInst::ICMP_SLT:
7789 case CmpInst::ICMP_UGE:
7790 case CmpInst::ICMP_SLE:
7791 case CmpInst::ICMP_EQ: {
7792 return replaceInstUsesWith(
7793 CxtI, IsIntMinPosion
7794 ? Builder.CreateICmpSGT(X, AllOnesValue)
7795 : Builder.CreateICmpULT(
7796 X, ConstantInt::get(X->getType(), SMin + 1)));
7797 }
7798 case CmpInst::ICMP_ULT:
7799 case CmpInst::ICMP_SGT:
7800 case CmpInst::ICMP_NE: {
7801 return replaceInstUsesWith(
7802 CxtI, IsIntMinPosion
7803 ? Builder.CreateICmpSLT(X, NullValue)
7804 : Builder.CreateICmpUGT(
7805 X, ConstantInt::get(X->getType(), SMin)));
7806 }
7807 default:
7808 llvm_unreachable("Invalid predicate!");
7809 }
7810 }
7811 }
7812
7813 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7814 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7815 return replaceInstUsesWith(CxtI, V);
7816
7817 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7818 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7819 {
7820 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7821 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7823 }
7824
7825 if (!ICmpInst::isUnsigned(Pred) &&
7826 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7827 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7829 }
7830 }
7831
7832 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7833 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7834 {
7835 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7836 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7838 }
7839
7840 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7841 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7842 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7844 }
7845 }
7846
7847 // icmp (shl nsw/nuw X, L), (add nsw/nuw (shl nsw/nuw Y, L), K)
7848 // -> icmp X, (add nsw/nuw Y, K >> L)
7849 // We use AShr for nsw and LShr for nuw to safely peel off the shift.
7850 Value *X;
7851 uint64_t ShAmt;
7852 if (match(Op0, m_NUWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7853 !CxtI.isSigned()) {
7854 if (ShAmt >= X->getType()->getScalarSizeInBits())
7855 return nullptr;
7856 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7857 ShiftSemantics::Unsigned, &CxtI)) {
7858 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7860 return new ICmpInst(Pred, X, NewOp1);
7861 }
7862 }
7863
7864 if (match(Op0, m_NSWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7865 !CxtI.isUnsigned()) {
7866 if (ShAmt >= X->getType()->getScalarSizeInBits())
7867 return nullptr;
7868 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7869 ShiftSemantics::Signed, &CxtI)) {
7870 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7872 return new ICmpInst(Pred, X, NewOp1);
7873 }
7874 }
7875 return nullptr;
7876}
7877
7879 bool Changed = false;
7880 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7881 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7882 unsigned Op0Cplxity = getComplexity(Op0);
7883 unsigned Op1Cplxity = getComplexity(Op1);
7884
7885 /// Orders the operands of the compare so that they are listed from most
7886 /// complex to least complex. This puts constants before unary operators,
7887 /// before binary operators.
7888 if (Op0Cplxity < Op1Cplxity) {
7889 I.swapOperands();
7890 std::swap(Op0, Op1);
7891 Changed = true;
7892 }
7893
7894 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7895 return replaceInstUsesWith(I, V);
7896
7897 // Comparing -val or val with non-zero is the same as just comparing val
7898 // ie, abs(val) != 0 -> val != 0
7899 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7900 Value *Cond, *SelectTrue, *SelectFalse;
7901 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7902 m_Value(SelectFalse)))) {
7903 if (Value *V = dyn_castNegVal(SelectTrue)) {
7904 if (V == SelectFalse)
7905 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7906 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7907 if (V == SelectTrue)
7908 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7909 }
7910 }
7911 }
7912
7914 return Res;
7915
7916 if (Op0->getType()->isIntOrIntVectorTy(1))
7918 return Res;
7919
7921 return Res;
7922
7924 return Res;
7925
7927 return Res;
7928
7930 return Res;
7931
7933 return Res;
7934
7936 return Res;
7937
7939 return Res;
7940
7941 // Test if the ICmpInst instruction is used exclusively by a select as
7942 // part of a minimum or maximum operation. If so, refrain from doing
7943 // any other folding. This helps out other analyses which understand
7944 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7945 // and CodeGen. And in this case, at least one of the comparison
7946 // operands has at least one user besides the compare (the select),
7947 // which would often largely negate the benefit of folding anyway.
7948 //
7949 // Do the same for the other patterns recognized by matchSelectPattern.
7950 if (I.hasOneUse())
7951 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7952 Value *A, *B;
7954 if (SPR.Flavor != SPF_UNKNOWN)
7955 return nullptr;
7956 }
7957
7958 // Do this after checking for min/max to prevent infinite looping.
7959 if (Instruction *Res = foldICmpWithZero(I))
7960 return Res;
7961
7962 Value *X;
7963 const APInt *C;
7964 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
7965 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7966 match(Op1, m_Not(m_Specific(X)))) {
7967 if (C->isNonNegative())
7968 return new ICmpInst(ICmpInst::ICMP_SLT, X,
7969 Constant::getNullValue(X->getType()));
7970 return new ICmpInst(ICmpInst::ICMP_UGT, X,
7971 ConstantInt::get(X->getType(), ~*C));
7972 }
7973
7974 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
7975 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7976 match(Op1, m_Not(m_Specific(X)))) {
7977 if (C->isNonNegative())
7978 return new ICmpInst(ICmpInst::ICMP_SGT, X,
7979 Constant::getAllOnesValue(X->getType()));
7980 return new ICmpInst(ICmpInst::ICMP_ULT, X,
7981 ConstantInt::get(X->getType(), ~*C));
7982 }
7983
7984 // FIXME: We only do this after checking for min/max to prevent infinite
7985 // looping caused by a reverse canonicalization of these patterns for min/max.
7986 // FIXME: The organization of folds is a mess. These would naturally go into
7987 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7988 // down here after the min/max restriction.
7989 ICmpInst::Predicate Pred = I.getPredicate();
7990 if (match(Op1, m_APInt(C))) {
7991 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7992 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7993 Constant *Zero = Constant::getNullValue(Op0->getType());
7994 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7995 }
7996
7997 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7998 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
8000 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
8001 }
8002 }
8003
8004 // The folds in here may rely on wrapping flags and special constants, so
8005 // they can break up min/max idioms in some cases but not seemingly similar
8006 // patterns.
8007 // FIXME: It may be possible to enhance select folding to make this
8008 // unnecessary. It may also be moot if we canonicalize to min/max
8009 // intrinsics.
8010 if (Instruction *Res = foldICmpBinOp(I, Q))
8011 return Res;
8012
8014 return Res;
8015
8016 // Try to match comparison as a sign bit test. Intentionally do this after
8017 // foldICmpInstWithConstant() to potentially let other folds to happen first.
8018 if (Instruction *New = foldSignBitTest(I))
8019 return New;
8020
8021 if (auto *PN = dyn_cast<PHINode>(Op0))
8022 if (Instruction *NV = foldOpIntoPhi(I, PN))
8023 return NV;
8024 if (auto *PN = dyn_cast<PHINode>(Op1))
8025 if (Instruction *NV = foldOpIntoPhi(I, PN))
8026 return NV;
8027
8029 return Res;
8030
8031 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
8032 return Res;
8033 if (Instruction *Res =
8034 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
8035 return Res;
8036
8037 if (I.isCommutative()) {
8038 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8039 replaceOperand(I, 0, Pair->first);
8040 replaceOperand(I, 1, Pair->second);
8041 return &I;
8042 }
8043 }
8044
8045 // Fold icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8046 // when all select arms are constants, via truth table.
8048 return R;
8049
8050 // In case of a comparison with two select instructions having the same
8051 // condition, check whether one of the resulting branches can be simplified.
8052 // If so, just compare the other branch and select the appropriate result.
8053 // For example:
8054 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
8055 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
8056 // %cmp2 = icmp slt i32 %tmp2, %tmp1
8057 // The icmp will result false for the false value of selects and the result
8058 // will depend upon the comparison of true values of selects if %cmp is
8059 // true. Thus, transform this into:
8060 // %cmp = icmp slt i32 %y, %z
8061 // %sel = select i1 %cond, i1 %cmp, i1 false
8062 // This handles similar cases to transform.
8063 {
8064 Value *Cond, *A, *B, *C, *D;
8065 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
8067 (Op0->hasOneUse() || Op1->hasOneUse())) {
8068 // Check whether comparison of TrueValues can be simplified
8069 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
8070 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
8071 return SelectInst::Create(
8072 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
8074 }
8075 // Check whether comparison of FalseValues can be simplified
8076 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
8077 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
8078 return SelectInst::Create(
8079 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
8081 }
8082 }
8083 }
8084
8085 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
8086 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
8087 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
8088 {
8089 Value *A, *B;
8090 CmpPredicate CmpPred;
8091 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
8093 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
8094 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
8095 bool I0NUW = I0->hasNoUnsignedWrap();
8096 bool I1NUW = I1->hasNoUnsignedWrap();
8097 bool I0NSW = I0->hasNoSignedWrap();
8098 bool I1NSW = I1->hasNoSignedWrap();
8099 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
8100 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
8101 (ICmpInst::isEquality(Pred) &&
8102 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
8103 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
8104 ConstantInt::get(Op0->getType(), 0));
8105 }
8106 }
8107 }
8108
8109 // Try to optimize equality comparisons against alloca-based pointers.
8110 if (Op0->getType()->isPointerTy() && I.isEquality()) {
8111 assert(Op1->getType()->isPointerTy() &&
8112 "Comparing pointer with non-pointer?");
8113 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
8114 if (foldAllocaCmp(Alloca))
8115 return nullptr;
8116 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
8117 if (foldAllocaCmp(Alloca))
8118 return nullptr;
8119 }
8120
8121 if (Instruction *Res = foldICmpBitCast(I))
8122 return Res;
8123
8124 // TODO: Hoist this above the min/max bailout.
8126 return R;
8127
8128 {
8129 Value *X, *Y;
8130 // Transform (X & ~Y) == 0 --> (X & Y) != 0
8131 // and (X & ~Y) != 0 --> (X & Y) == 0
8132 // if A is a power of 2.
8133 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
8134 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
8135 I.isEquality())
8136 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
8137 Op1);
8138
8139 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
8140 if (Op0->getType()->isIntOrIntVectorTy()) {
8141 bool ConsumesOp0, ConsumesOp1;
8142 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
8143 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
8144 (ConsumesOp0 || ConsumesOp1)) {
8145 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
8146 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
8147 assert(InvOp0 && InvOp1 &&
8148 "Mismatch between isFreeToInvert and getFreelyInverted");
8149 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
8150 }
8151 }
8152
8153 Instruction *AddI = nullptr;
8155 m_Instruction(AddI))) &&
8156 isa<IntegerType>(X->getType())) {
8157 Value *Result;
8158 Constant *Overflow;
8159 // m_UAddWithOverflow can match patterns that do not include an explicit
8160 // "add" instruction, so check the opcode of the matched op.
8161 if (AddI->getOpcode() == Instruction::Add &&
8162 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
8163 Result, Overflow)) {
8164 replaceInstUsesWith(*AddI, Result);
8165 eraseInstFromFunction(*AddI);
8166 return replaceInstUsesWith(I, Overflow);
8167 }
8168 }
8169
8170 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
8171 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
8172 match(Op1, m_APInt(C))) {
8173 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
8174 return R;
8175 }
8176
8177 // Signbit test folds
8178 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
8179 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
8180 Instruction *ExtI;
8181 if ((I.isUnsigned() || I.isEquality()) &&
8182 match(Op1,
8184 Y->getType()->getScalarSizeInBits() == 1 &&
8185 (Op0->hasOneUse() || Op1->hasOneUse())) {
8186 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
8187 Instruction *ShiftI;
8188 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
8190 OpWidth - 1))))) {
8191 unsigned ExtOpc = ExtI->getOpcode();
8192 unsigned ShiftOpc = ShiftI->getOpcode();
8193 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
8194 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
8195 Value *SLTZero =
8196 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
8197 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
8198 return replaceInstUsesWith(I, Cmp);
8199 }
8200 }
8201 }
8202 }
8203
8204 if (Instruction *Res = foldICmpEquality(I))
8205 return Res;
8206
8208 return Res;
8209
8210 if (Instruction *Res = foldICmpOfUAddOv(I))
8211 return Res;
8212
8214 return Res;
8215
8216 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8217 // an i1 which indicates whether or not we successfully did the swap.
8218 //
8219 // Replace comparisons between the old value and the expected value with the
8220 // indicator that 'cmpxchg' returns.
8221 //
8222 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8223 // spuriously fail. In those cases, the old value may equal the expected
8224 // value but it is possible for the swap to not occur.
8225 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8226 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8227 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8228 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8229 !ACXI->isWeak())
8230 return ExtractValueInst::Create(ACXI, 1);
8231
8233 return Res;
8234
8235 if (I.getType()->isVectorTy())
8236 if (Instruction *Res = foldVectorCmp(I, Builder))
8237 return Res;
8238
8240 return Res;
8241
8243 return Res;
8244
8245 {
8246 Value *A;
8247 const APInt *C1, *C2;
8248 ICmpInst::Predicate Pred = I.getPredicate();
8249 if (ICmpInst::isEquality(Pred)) {
8250 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8251 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8252 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8253 match(Op1, m_APInt(C2))) {
8254 Type *InputTy = A->getType();
8255 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8256 // c2 must be non-negative at the bitwidth of a.
8257 if (C2->getActiveBits() < InputBitWidth) {
8258 APInt TruncC1 = C1->trunc(InputBitWidth);
8259 // Check if there are 1s in C1 high bits of size InputBitWidth.
8260 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8261 TruncC1.setBit(InputBitWidth - 1);
8262 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8263 return new ICmpInst(
8264 Pred, AndInst,
8265 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8266 }
8267 }
8268 }
8269 }
8270
8271 return Changed ? &I : nullptr;
8272}
8273
8274/// Fold fcmp ([us]itofp x, cst) if possible.
8276 Instruction *LHSI,
8277 Constant *RHSC) {
8278 const APFloat *RHS;
8279 if (!match(RHSC, m_APFloat(RHS)))
8280 return nullptr;
8281
8282 // Get the width of the mantissa. We don't want to hack on conversions that
8283 // might lose information from the integer, e.g. "i64 -> float"
8284 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8285 if (MantissaWidth == -1)
8286 return nullptr; // Unknown.
8287
8288 Type *IntTy = LHSI->getOperand(0)->getType();
8289 unsigned IntWidth = IntTy->getScalarSizeInBits();
8290 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8291
8292 if (I.isEquality()) {
8293 FCmpInst::Predicate P = I.getPredicate();
8294 bool IsExact = false;
8295 APSInt RHSCvt(IntWidth, LHSUnsigned);
8296 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8297
8298 // If the floating point constant isn't an integer value, we know if we will
8299 // ever compare equal / not equal to it.
8300 if (!IsExact) {
8301 // TODO: Can never be -0.0 and other non-representable values
8302 APFloat RHSRoundInt(*RHS);
8304 if (*RHS != RHSRoundInt) {
8306 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8307
8309 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8310 }
8311 }
8312
8313 // TODO: If the constant is exactly representable, is it always OK to do
8314 // equality compares as integer?
8315 }
8316
8317 // Check to see that the input is converted from an integer type that is small
8318 // enough that preserves all bits. TODO: check here for "known" sign bits.
8319 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8320
8321 // Following test does NOT adjust IntWidth downwards for signed inputs,
8322 // because the most negative value still requires all the mantissa bits
8323 // to distinguish it from one less than that value.
8324 if ((int)IntWidth > MantissaWidth) {
8325 // Conversion would lose accuracy. Check if loss can impact comparison.
8326 int Exp = ilogb(*RHS);
8327 if (Exp == APFloat::IEK_Inf) {
8328 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8329 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8330 // Conversion could create infinity.
8331 return nullptr;
8332 } else {
8333 // Note that if RHS is zero or NaN, then Exp is negative
8334 // and first condition is trivially false.
8335 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8336 // Conversion could affect comparison.
8337 return nullptr;
8338 }
8339 }
8340
8341 // Otherwise, we can potentially simplify the comparison. We know that it
8342 // will always come through as an integer value and we know the constant is
8343 // not a NAN (it would have been previously simplified).
8344 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8345
8347 switch (I.getPredicate()) {
8348 default:
8349 llvm_unreachable("Unexpected predicate!");
8350 case FCmpInst::FCMP_UEQ:
8351 case FCmpInst::FCMP_OEQ:
8352 Pred = ICmpInst::ICMP_EQ;
8353 break;
8354 case FCmpInst::FCMP_UGT:
8355 case FCmpInst::FCMP_OGT:
8356 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8357 break;
8358 case FCmpInst::FCMP_UGE:
8359 case FCmpInst::FCMP_OGE:
8360 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8361 break;
8362 case FCmpInst::FCMP_ULT:
8363 case FCmpInst::FCMP_OLT:
8364 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8365 break;
8366 case FCmpInst::FCMP_ULE:
8367 case FCmpInst::FCMP_OLE:
8368 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8369 break;
8370 case FCmpInst::FCMP_UNE:
8371 case FCmpInst::FCMP_ONE:
8372 Pred = ICmpInst::ICMP_NE;
8373 break;
8374 case FCmpInst::FCMP_ORD:
8375 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8376 case FCmpInst::FCMP_UNO:
8377 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8378 }
8379
8380 // Now we know that the APFloat is a normal number, zero or inf.
8381
8382 // See if the FP constant is too large for the integer. For example,
8383 // comparing an i8 to 300.0.
8384 if (!LHSUnsigned) {
8385 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8386 // and large values.
8387 APFloat SMax(RHS->getSemantics());
8388 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8390 if (SMax < *RHS) { // smax < 13123.0
8391 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8392 Pred == ICmpInst::ICMP_SLE)
8393 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8394 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8395 }
8396 } else {
8397 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8398 // +INF and large values.
8399 APFloat UMax(RHS->getSemantics());
8400 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8402 if (UMax < *RHS) { // umax < 13123.0
8403 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8404 Pred == ICmpInst::ICMP_ULE)
8405 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8406 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8407 }
8408 }
8409
8410 if (!LHSUnsigned) {
8411 // See if the RHS value is < SignedMin.
8412 APFloat SMin(RHS->getSemantics());
8413 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8415 if (SMin > *RHS) { // smin > 12312.0
8416 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8417 Pred == ICmpInst::ICMP_SGE)
8418 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8419 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8420 }
8421 } else {
8422 // See if the RHS value is < UnsignedMin.
8423 APFloat UMin(RHS->getSemantics());
8424 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8426 if (UMin > *RHS) { // umin > 12312.0
8427 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8428 Pred == ICmpInst::ICMP_UGE)
8429 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8430 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8431 }
8432 }
8433
8434 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8435 // [0, UMAX], but it may still be fractional. Check whether this is the case
8436 // using the IsExact flag.
8437 // Don't do this for zero, because -0.0 is not fractional.
8438 APSInt RHSInt(IntWidth, LHSUnsigned);
8439 bool IsExact;
8440 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8441 if (!RHS->isZero()) {
8442 if (!IsExact) {
8443 // If we had a comparison against a fractional value, we have to adjust
8444 // the compare predicate and sometimes the value. RHSC is rounded towards
8445 // zero at this point.
8446 switch (Pred) {
8447 default:
8448 llvm_unreachable("Unexpected integer comparison!");
8449 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8450 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8451 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8452 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8453 case ICmpInst::ICMP_ULE:
8454 // (float)int <= 4.4 --> int <= 4
8455 // (float)int <= -4.4 --> false
8456 if (RHS->isNegative())
8457 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8458 break;
8459 case ICmpInst::ICMP_SLE:
8460 // (float)int <= 4.4 --> int <= 4
8461 // (float)int <= -4.4 --> int < -4
8462 if (RHS->isNegative())
8463 Pred = ICmpInst::ICMP_SLT;
8464 break;
8465 case ICmpInst::ICMP_ULT:
8466 // (float)int < -4.4 --> false
8467 // (float)int < 4.4 --> int <= 4
8468 if (RHS->isNegative())
8469 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8470 Pred = ICmpInst::ICMP_ULE;
8471 break;
8472 case ICmpInst::ICMP_SLT:
8473 // (float)int < -4.4 --> int < -4
8474 // (float)int < 4.4 --> int <= 4
8475 if (!RHS->isNegative())
8476 Pred = ICmpInst::ICMP_SLE;
8477 break;
8478 case ICmpInst::ICMP_UGT:
8479 // (float)int > 4.4 --> int > 4
8480 // (float)int > -4.4 --> true
8481 if (RHS->isNegative())
8482 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8483 break;
8484 case ICmpInst::ICMP_SGT:
8485 // (float)int > 4.4 --> int > 4
8486 // (float)int > -4.4 --> int >= -4
8487 if (RHS->isNegative())
8488 Pred = ICmpInst::ICMP_SGE;
8489 break;
8490 case ICmpInst::ICMP_UGE:
8491 // (float)int >= -4.4 --> true
8492 // (float)int >= 4.4 --> int > 4
8493 if (RHS->isNegative())
8494 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8495 Pred = ICmpInst::ICMP_UGT;
8496 break;
8497 case ICmpInst::ICMP_SGE:
8498 // (float)int >= -4.4 --> int >= -4
8499 // (float)int >= 4.4 --> int > 4
8500 if (!RHS->isNegative())
8501 Pred = ICmpInst::ICMP_SGT;
8502 break;
8503 }
8504 }
8505 }
8506
8507 // Lower this FP comparison into an appropriate integer version of the
8508 // comparison.
8509 return new ICmpInst(Pred, LHSI->getOperand(0),
8510 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8511}
8512
8513/// Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8514/// where all true/false values are constants that allow the compare to be
8515/// constant-folded for every combination of C1 and C2.
8516/// We compute a 4-entry truth table and use createLogicFromTable to
8517/// synthesize a boolean expression of C1 and C2.
8519 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8520 Value *C1, *C2;
8521 Constant *TV1, *FV1, *TV2, *FV2;
8522
8523 if (!match(Op0, m_Select(m_Value(C1), m_Constant(TV1), m_Constant(FV1))) ||
8524 !match(Op1, m_Select(m_Value(C2), m_Constant(TV2), m_Constant(FV2))))
8525 return nullptr;
8526
8527 if (I.getType() != C1->getType() || I.getType() != C2->getType())
8528 return nullptr;
8529
8530 unsigned Pred = I.getPredicate();
8531 const DataLayout &DL = I.getDataLayout();
8532
8533 Constant *Res00 = ConstantFoldCompareInstOperands(Pred, FV1, FV2, DL);
8534 Constant *Res01 = ConstantFoldCompareInstOperands(Pred, FV1, TV2, DL);
8535 Constant *Res10 = ConstantFoldCompareInstOperands(Pred, TV1, FV2, DL);
8536 Constant *Res11 = ConstantFoldCompareInstOperands(Pred, TV1, TV2, DL);
8537
8538 if (!Res00 || !Res01 || !Res10 || !Res11)
8539 return nullptr;
8540
8541 if ((!Res00->isNullValue() && !Res00->isAllOnesValue()) ||
8542 (!Res01->isNullValue() && !Res01->isAllOnesValue()) ||
8543 (!Res10->isNullValue() && !Res10->isAllOnesValue()) ||
8544 (!Res11->isNullValue() && !Res11->isAllOnesValue()))
8545 return nullptr;
8546
8547 std::bitset<4> Table;
8548 if (!Res00->isNullValue())
8549 Table.set(0);
8550 if (!Res01->isNullValue())
8551 Table.set(1);
8552 if (!Res10->isNullValue())
8553 Table.set(2);
8554 if (!Res11->isNullValue())
8555 Table.set(3);
8556
8557 Value *Res = createLogicFromTable(Table, C1, C2, Builder,
8558 Op0->hasOneUse() && Op1->hasOneUse());
8559 if (!Res)
8560 return nullptr;
8561 return replaceInstUsesWith(I, Res);
8562}
8563
8564/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8566 Constant *RHSC) {
8567 // When C is not 0.0 and infinities are not allowed:
8568 // (C / X) < 0.0 is a sign-bit test of X
8569 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8570 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8571 //
8572 // Proof:
8573 // Multiply (C / X) < 0.0 by X * X / C.
8574 // - X is non zero, if it is the flag 'ninf' is violated.
8575 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8576 // the predicate. C is also non zero by definition.
8577 //
8578 // Thus X * X / C is non zero and the transformation is valid. [qed]
8579
8580 FCmpInst::Predicate Pred = I.getPredicate();
8581
8582 // Check that predicates are valid.
8583 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8584 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8585 return nullptr;
8586
8587 // Check that RHS operand is zero.
8588 if (!match(RHSC, m_AnyZeroFP()))
8589 return nullptr;
8590
8591 // Check fastmath flags ('ninf').
8592 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8593 return nullptr;
8594
8595 // Check the properties of the dividend. It must not be zero to avoid a
8596 // division by zero (see Proof).
8597 const APFloat *C;
8598 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8599 return nullptr;
8600
8601 if (C->isZero())
8602 return nullptr;
8603
8604 // Get swapped predicate if necessary.
8605 if (C->isNegative())
8606 Pred = I.getSwappedPredicate();
8607
8608 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8609}
8610
8611// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8612// Patterns include:
8613// fptrunc(x) < C --> x < ext(C)
8614// fptrunc(x) <= C --> x <= ext(C)
8615// fptrunc(x) > C --> x > ext(C)
8616// fptrunc(x) >= C --> x >= ext(C)
8617// fptrunc(x) ord/uno C --> x ord/uno 0
8618// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8619// due to precision loss.
8621 const Constant &C) {
8622 FCmpInst::Predicate Pred = I.getPredicate();
8623 Type *DestType = FPTrunc.getOperand(0)->getType();
8624
8625 const APFloat *CValue;
8626 // TODO: support vec
8627 if (!match(&C, m_APFloat(CValue)))
8628 return nullptr;
8629
8630 // Handle ord/uno
8631 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
8632 assert(!CValue->isNaN() &&
8633 "X ord/uno NaN should be folded away by simplifyFCmpInst()");
8634 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8635 ConstantFP::getZero(DestType), "", &I);
8636 }
8637
8638 // Handle <, >, <=, >=
8639 bool RoundDown = false;
8640
8641 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8642 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8643 RoundDown = true;
8644 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8645 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8646 RoundDown = false;
8647 else
8648 return nullptr;
8649
8650 if (CValue->isNaN() || CValue->isInfinity())
8651 return nullptr;
8652
8653 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8654 bool LosesInfo;
8655 APFloat Dest = Src;
8656 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8657 return Dest;
8658 };
8659
8660 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8661 APFloat NextValue = Value;
8662 NextValue.next(RoundDown);
8663 return NextValue;
8664 };
8665
8666 APFloat NextCValue = NextValue(*CValue, RoundDown);
8667
8668 const fltSemantics &DestFltSema =
8669 DestType->getScalarType()->getFltSemantics();
8670
8671 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8672 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8673
8674 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8675 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8676 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8677 // value of 'CValue'.
8678 if (NextCValue.isInfinity()) {
8679 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8680 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8681
8682 ExtNextCValue = ExtCValue + Bias;
8683 }
8684
8685 APFloat ExtMidValue =
8686 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8687
8688 const fltSemantics &SrcFltSema =
8689 C.getType()->getScalarType()->getFltSemantics();
8690
8691 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8692 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8693 if (MidValue != *CValue)
8694 ExtMidValue.next(!RoundDown);
8695
8696 // Check whether 'ExtMidValue' is a valid result since the assumption on
8697 // imaged 'NextCValue' might not hold for new float types.
8698 // ppc_fp128 can't pass here when converting from max float because of
8699 // APFloat implementation.
8700 if (NextCValue.isInfinity()) {
8701 // ExtMidValue --- narrowed ---> Finite
8702 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8703 return nullptr;
8704
8705 // NextExtMidValue --- narrowed ---> Infinity
8706 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8707 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8708 return nullptr;
8709 }
8710
8711 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8712 ConstantFP::get(DestType, ExtMidValue), "", &I);
8713}
8714
8715/// Optimize fabs(X) compared with zero.
8717 Value *X;
8718 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8719 return nullptr;
8720
8721 const APFloat *C;
8722 if (!match(I.getOperand(1), m_APFloat(C)))
8723 return nullptr;
8724
8725 if (!C->isPosZero()) {
8726 if (!C->isSmallestNormalized())
8727 return nullptr;
8728
8729 const Function *F = I.getFunction();
8730 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8731 if (Mode.Input == DenormalMode::PreserveSign ||
8733
8734 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8735 Constant *Zero = ConstantFP::getZero(X->getType());
8736 return new FCmpInst(P, X, Zero, "", I);
8737 };
8738
8739 switch (I.getPredicate()) {
8740 case FCmpInst::FCMP_OLT:
8741 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8742 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8743 case FCmpInst::FCMP_UGE:
8744 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8745 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8746 case FCmpInst::FCMP_OGE:
8747 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8748 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8749 case FCmpInst::FCMP_ULT:
8750 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8751 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8752 default:
8753 break;
8754 }
8755 }
8756
8757 return nullptr;
8758 }
8759
8760 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8761 I->setPredicate(P);
8762 return IC.replaceOperand(*I, 0, X);
8763 };
8764
8765 switch (I.getPredicate()) {
8766 case FCmpInst::FCMP_UGE:
8767 case FCmpInst::FCMP_OLT:
8768 // fabs(X) >= 0.0 --> true
8769 // fabs(X) < 0.0 --> false
8770 llvm_unreachable("fcmp should have simplified");
8771
8772 case FCmpInst::FCMP_OGT:
8773 // fabs(X) > 0.0 --> X != 0.0
8774 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8775
8776 case FCmpInst::FCMP_UGT:
8777 // fabs(X) u> 0.0 --> X u!= 0.0
8778 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8779
8780 case FCmpInst::FCMP_OLE:
8781 // fabs(X) <= 0.0 --> X == 0.0
8782 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8783
8784 case FCmpInst::FCMP_ULE:
8785 // fabs(X) u<= 0.0 --> X u== 0.0
8786 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8787
8788 case FCmpInst::FCMP_OGE:
8789 // fabs(X) >= 0.0 --> !isnan(X)
8790 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8791 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8792
8793 case FCmpInst::FCMP_ULT:
8794 // fabs(X) u< 0.0 --> isnan(X)
8795 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8796 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8797
8798 case FCmpInst::FCMP_OEQ:
8799 case FCmpInst::FCMP_UEQ:
8800 case FCmpInst::FCMP_ONE:
8801 case FCmpInst::FCMP_UNE:
8802 case FCmpInst::FCMP_ORD:
8803 case FCmpInst::FCMP_UNO:
8804 // Look through the fabs() because it doesn't change anything but the sign.
8805 // fabs(X) == 0.0 --> X == 0.0,
8806 // fabs(X) != 0.0 --> X != 0.0
8807 // isnan(fabs(X)) --> isnan(X)
8808 // !isnan(fabs(X) --> !isnan(X)
8809 return replacePredAndOp0(&I, I.getPredicate(), X);
8810
8811 default:
8812 return nullptr;
8813 }
8814}
8815
8816/// Optimize sqrt(X) compared with zero.
8818 Value *X;
8819 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8820 return nullptr;
8821
8822 if (!match(I.getOperand(1), m_PosZeroFP()))
8823 return nullptr;
8824
8825 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8826 I.setPredicate(P);
8827 return IC.replaceOperand(I, 0, X);
8828 };
8829
8830 // Clear ninf flag if sqrt doesn't have it.
8831 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8832 I.setHasNoInfs(false);
8833
8834 switch (I.getPredicate()) {
8835 case FCmpInst::FCMP_OLT:
8836 case FCmpInst::FCMP_UGE:
8837 // sqrt(X) < 0.0 --> false
8838 // sqrt(X) u>= 0.0 --> true
8839 llvm_unreachable("fcmp should have simplified");
8840 case FCmpInst::FCMP_ULT:
8841 case FCmpInst::FCMP_ULE:
8842 case FCmpInst::FCMP_OGT:
8843 case FCmpInst::FCMP_OGE:
8844 case FCmpInst::FCMP_OEQ:
8845 case FCmpInst::FCMP_UNE:
8846 // sqrt(X) u< 0.0 --> X u< 0.0
8847 // sqrt(X) u<= 0.0 --> X u<= 0.0
8848 // sqrt(X) > 0.0 --> X > 0.0
8849 // sqrt(X) >= 0.0 --> X >= 0.0
8850 // sqrt(X) == 0.0 --> X == 0.0
8851 // sqrt(X) u!= 0.0 --> X u!= 0.0
8852 return IC.replaceOperand(I, 0, X);
8853
8854 case FCmpInst::FCMP_OLE:
8855 // sqrt(X) <= 0.0 --> X == 0.0
8856 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8857 case FCmpInst::FCMP_UGT:
8858 // sqrt(X) u> 0.0 --> X u!= 0.0
8859 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8860 case FCmpInst::FCMP_UEQ:
8861 // sqrt(X) u== 0.0 --> X u<= 0.0
8862 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8863 case FCmpInst::FCMP_ONE:
8864 // sqrt(X) != 0.0 --> X > 0.0
8865 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8866 case FCmpInst::FCMP_ORD:
8867 // !isnan(sqrt(X)) --> X >= 0.0
8868 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8869 case FCmpInst::FCMP_UNO:
8870 // isnan(sqrt(X)) --> X u< 0.0
8871 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8872 default:
8873 llvm_unreachable("Unexpected predicate!");
8874 }
8875}
8876
8878 CmpInst::Predicate Pred = I.getPredicate();
8879 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8880
8881 // Canonicalize fneg as Op1.
8882 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8883 std::swap(Op0, Op1);
8884 Pred = I.getSwappedPredicate();
8885 }
8886
8887 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8888 return nullptr;
8889
8890 // Replace the negated operand with 0.0:
8891 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8892 Constant *Zero = ConstantFP::getZero(Op0->getType());
8893 return new FCmpInst(Pred, Op0, Zero, "", &I);
8894}
8895
8897 Constant *RHSC, InstCombinerImpl &CI) {
8898 const CmpInst::Predicate Pred = I.getPredicate();
8899 Value *X = LHSI->getOperand(0);
8900 Value *Y = LHSI->getOperand(1);
8901 switch (Pred) {
8902 default:
8903 break;
8904 case FCmpInst::FCMP_UGT:
8905 case FCmpInst::FCMP_ULT:
8906 case FCmpInst::FCMP_UNE:
8907 case FCmpInst::FCMP_OEQ:
8908 case FCmpInst::FCMP_OGE:
8909 case FCmpInst::FCMP_OLE:
8910 // The optimization is not valid if X and Y are infinities of the same
8911 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8912 // flag then we can assume we do not have that case. Otherwise we might be
8913 // able to prove that either X or Y is not infinity.
8914 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8918 break;
8919
8920 [[fallthrough]];
8921 case FCmpInst::FCMP_OGT:
8922 case FCmpInst::FCMP_OLT:
8923 case FCmpInst::FCMP_ONE:
8924 case FCmpInst::FCMP_UEQ:
8925 case FCmpInst::FCMP_UGE:
8926 case FCmpInst::FCMP_ULE:
8927 // fcmp pred (x - y), 0 --> fcmp pred x, y
8928 if (match(RHSC, m_AnyZeroFP()) &&
8929 I.getFunction()->getDenormalMode(
8930 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8932 CI.replaceOperand(I, 0, X);
8933 CI.replaceOperand(I, 1, Y);
8934 I.setHasNoInfs(LHSI->hasNoInfs());
8935 if (LHSI->hasNoNaNs())
8936 I.setHasNoNaNs(true);
8937 return &I;
8938 }
8939 // fcmp `pred (C - Y), C` -> `fcmp swap(pred), Y, 0`
8940 // where C and Y can't be arbitrary floating-point values.
8941 // For example, with `C = 1.0f` and `Y = 0x1p-149`, `1.0f - Y` rounds back
8942 // to `1.0f`, so the source compare is false while the rewritten compare is
8943 // true.
8944 // We need to make sure (C - Y) never rounds back to C
8945 const APFloat *C;
8946 Value *IntSrc;
8947 if (match(RHSC, m_APFloat(C)) &&
8948 match(LHSI, m_FSub(m_Specific(RHSC), m_IToFP(m_Value(IntSrc)))) &&
8949 C->isNormal()) {
8950 // Requirements on C and Y:
8951 // 1. C is finite, nonzero, normal.
8952 // 2. C shouldn't be too large, that is, ULP(C) <= 1.
8953 // 3. Y must be the form of `[su]itofp`, so the finite nonzero result of Y
8954 // must be integer-valued with an absolute value of at least 1;
8955 // as long as the step size near C does not exceed 1,
8956 // C - Y cannot be rounded back to C when Y != 0.
8957 // 4. If Y = 0, `fcmp pred (C - 0), C` are equivalent to `fcmp swap(pred)
8958 // 0, 0` for ordered and unordered predicates as long as C is finite and
8959 // nonzero.
8960 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8961 if (MantissaWidth != -1 && ilogb(*C) < MantissaWidth) {
8962 Constant *ZeroC = ConstantFP::getZero(LHSI->getType());
8963 I.setPredicate(I.getSwappedPredicate());
8964 CI.replaceOperand(I, 0, Y);
8965 CI.replaceOperand(I, 1, ZeroC);
8966 return &I;
8967 }
8968 }
8969 break;
8970 }
8971
8972 return nullptr;
8973}
8974
8975/// Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b
8976/// where 'pred' is olt, ult, ogt, ugt, oge or uge and C is a positive, Non-NaN
8977/// float when the uitofp casts are exact and C is in the valid range.
8978///
8979/// Since exact uitofp means distinct integers map to distinct floats, the only
8980/// values fabs(uitofp(a) - uitofp(b)) can take are {0.0, 1.0, 2.0, ...}.
8981/// There are no values in the open interval (0, 1), so:
8982/// fabs(...) < C where 0 < C <= 1.0 --> a == b (strict lt: C=1.0 ok)
8983// fabs(..) >= C where C >= 1.0 -> a != b
8984///
8985/// The same logic applies to sitofp.
8987 Value *FAbsArg;
8988 if (!match(I.getOperand(0), m_FAbs(m_Value(FAbsArg))))
8989 return nullptr;
8990
8991 const APFloat *C;
8992 if (!match(I.getOperand(1), PatternMatch::m_FiniteNonZero(C)))
8993 return nullptr;
8994
8995 FCmpInst::Predicate Pred = I.getPredicate();
8996 bool IsStrictLt = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT;
8997 bool IsLe = Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE;
8998 bool IsStrictGt = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT;
8999 bool IsGe = Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE;
9000 if (!IsStrictLt && !IsStrictGt && !IsGe)
9001 return nullptr;
9002
9003 APFloat One = APFloat::getOne(C->getSemantics());
9004 APFloat::cmpResult Cmp = C->compare(One);
9005
9006 // For strict-lt (olt/ult): C must be in (0, 1.0] -- C == 1.0 is fine since
9007 // the next possible value after 0.0 is 1.0, and < 1.0 excludes it.
9008 if (IsStrictLt && Cmp == APFloat::cmpGreaterThan)
9009 return nullptr;
9010 if (IsGe && Cmp == APFloat::cmpGreaterThan)
9011 return nullptr;
9012 if (IsLe && Cmp != APFloat::cmpGreaterThan)
9013 return nullptr;
9014 if (IsStrictGt && Cmp != APFloat::cmpLessThan)
9015 return nullptr;
9016
9017 // Match: fsub(uitofp(A), uitofp(B)) where both casts are uitofp or sitofp
9018 Value *A, *B;
9019 bool IsSigned;
9020 if (match(FAbsArg, m_FSub(m_UIToFP(m_Value(A)), m_UIToFP(m_Value(B))))) {
9021 IsSigned = false;
9022 } else if (match(FAbsArg,
9024 IsSigned = true;
9025 } else {
9026 return nullptr;
9027 }
9028
9029 // A and B must have the same integer type
9030 if (A->getType() != B->getType())
9031 return nullptr;
9032
9033 Type *FPTy = FAbsArg->getType();
9034 if (!IC.canBeCastedExactlyIntToFP(A, FPTy, IsSigned, &I) ||
9035 !IC.canBeCastedExactlyIntToFP(B, FPTy, IsSigned, &I))
9036 return nullptr;
9037 ICmpInst::Predicate ResultPred =
9038 IsStrictLt || IsLe ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
9039 return new ICmpInst(ResultPred, A, B);
9040}
9041
9043 InstCombinerImpl &IC) {
9044 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
9045 Type *OpType = LHS->getType();
9046 CmpInst::Predicate Pred = I.getPredicate();
9047
9050
9051 if (!FloorX && !CeilX) {
9054 std::swap(LHS, RHS);
9055 Pred = I.getSwappedPredicate();
9056 }
9057 }
9058
9059 if ((FloorX || CeilX) && FCmpInst::isCommutative(Pred) && LHS->hasOneUse()) {
9060 // fcmp pred floor(x), x => fcmp pred trunc(x), x
9061 // fcmp pred ceil(x), x => fcmp pred trunc(x), x
9062 // where pred is oeq, one, ord, ueq, une, uno.
9063 Value *TruncX = IC.Builder.CreateUnaryIntrinsic(Intrinsic::trunc, RHS);
9064 return new FCmpInst(Pred, TruncX, RHS, "", &I);
9065 }
9066
9067 switch (Pred) {
9068 case FCmpInst::FCMP_OLE:
9069 // fcmp ole floor(x), x => fcmp ord x, 0
9070 if (FloorX)
9072 "", &I);
9073 break;
9074 case FCmpInst::FCMP_OGT:
9075 // fcmp ogt floor(x), x => false
9076 if (FloorX)
9077 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9078 break;
9079 case FCmpInst::FCMP_OGE:
9080 // fcmp oge ceil(x), x => fcmp ord x, 0
9081 if (CeilX)
9083 "", &I);
9084 break;
9085 case FCmpInst::FCMP_OLT:
9086 // fcmp olt ceil(x), x => false
9087 if (CeilX)
9088 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9089 break;
9090 case FCmpInst::FCMP_ULE:
9091 // fcmp ule floor(x), x => true
9092 if (FloorX)
9093 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9094 break;
9095 case FCmpInst::FCMP_UGT:
9096 // fcmp ugt floor(x), x => fcmp uno x, 0
9097 if (FloorX)
9099 "", &I);
9100 break;
9101 case FCmpInst::FCMP_UGE:
9102 // fcmp uge ceil(x), x => true
9103 if (CeilX)
9104 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9105 break;
9106 case FCmpInst::FCMP_ULT:
9107 // fcmp ult ceil(x), x => fcmp uno x, 0
9108 if (CeilX)
9110 "", &I);
9111 break;
9112 default:
9113 break;
9114 }
9115
9116 return nullptr;
9117}
9118
9119/// Returns true if a select that implements a min/max is redundant and
9120/// select result can be replaced with its non-constant operand, e.g.,
9121/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
9122/// where C is the FP constant equal to the minimum integer value
9123/// representable by A.
9125 Value *B) {
9126 const APFloat *APF;
9127 if (!match(B, m_APFloat(APF)))
9128 return false;
9129
9130 auto *I = dyn_cast<Instruction>(A);
9131 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
9132 I->getOpcode() == Instruction::UIToFP))
9133 return false;
9134
9135 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
9136 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
9137 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
9138 ? APSInt::getMinValue(BitWidth, IsUnsigned)
9139 : APSInt::getMaxValue(BitWidth, IsUnsigned);
9140 APSInt ConvertedInt(BitWidth, IsUnsigned);
9141 bool IsExact;
9143 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
9144 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
9145}
9146
9148 bool Changed = false;
9149
9150 /// Orders the operands of the compare so that they are listed from most
9151 /// complex to least complex. This puts constants before unary operators,
9152 /// before binary operators.
9153 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
9154 I.swapOperands();
9155 Changed = true;
9156 }
9157
9158 const CmpInst::Predicate Pred = I.getPredicate();
9159 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
9160 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
9161 SQ.getWithInstruction(&I)))
9162 return replaceInstUsesWith(I, V);
9163
9164 // Simplify 'fcmp pred X, X'
9165 Type *OpType = Op0->getType();
9166 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
9167 if (Op0 == Op1) {
9168 switch (Pred) {
9169 default:
9170 break;
9171 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
9172 case FCmpInst::FCMP_ULT: // True if unordered or less than
9173 case FCmpInst::FCMP_UGT: // True if unordered or greater than
9174 case FCmpInst::FCMP_UNE: // True if unordered or not equal
9175 // Canonicalize these to be 'fcmp uno %X, 0.0'.
9176 I.setPredicate(FCmpInst::FCMP_UNO);
9177 I.setOperand(1, Constant::getNullValue(OpType));
9178 return &I;
9179
9180 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
9181 case FCmpInst::FCMP_OEQ: // True if ordered and equal
9182 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
9183 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
9184 // Canonicalize these to be 'fcmp ord %X, 0.0'.
9185 I.setPredicate(FCmpInst::FCMP_ORD);
9186 I.setOperand(1, Constant::getNullValue(OpType));
9187 return &I;
9188 }
9189 }
9190
9191 if (I.isCommutative()) {
9192 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
9193 replaceOperand(I, 0, Pair->first);
9194 replaceOperand(I, 1, Pair->second);
9195 return &I;
9196 }
9197 }
9198
9199 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
9200 // then canonicalize the operand to 0.0.
9201 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
9202 if (!match(Op0, m_PosZeroFP()) &&
9203 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
9204 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
9205
9206 if (!match(Op1, m_PosZeroFP()) &&
9207 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
9208 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9209 }
9210
9211 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
9212 Value *X, *Y;
9213 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
9214 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
9215
9217 return R;
9218
9219 // Test if the FCmpInst instruction is used exclusively by a select as
9220 // part of a minimum or maximum operation. If so, refrain from doing
9221 // any other folding. This helps out other analyses which understand
9222 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
9223 // and CodeGen. And in this case, at least one of the comparison
9224 // operands has at least one user besides the compare (the select),
9225 // which would often largely negate the benefit of folding anyway.
9226 if (I.hasOneUse())
9227 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
9228 Value *A, *B;
9230 bool IsRedundantMinMaxClamp =
9231 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
9233 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
9234 return nullptr;
9235 }
9236
9237 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
9238 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
9239 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
9240 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9241
9242 // Canonicalize:
9243 // fcmp olt X, +inf -> fcmp one X, +inf
9244 // fcmp ole X, +inf -> fcmp ord X, 0
9245 // fcmp ogt X, +inf -> false
9246 // fcmp oge X, +inf -> fcmp oeq X, +inf
9247 // fcmp ult X, +inf -> fcmp une X, +inf
9248 // fcmp ule X, +inf -> true
9249 // fcmp ugt X, +inf -> fcmp uno X, 0
9250 // fcmp uge X, +inf -> fcmp ueq X, +inf
9251 // fcmp olt X, -inf -> false
9252 // fcmp ole X, -inf -> fcmp oeq X, -inf
9253 // fcmp ogt X, -inf -> fcmp one X, -inf
9254 // fcmp oge X, -inf -> fcmp ord X, 0
9255 // fcmp ult X, -inf -> fcmp uno X, 0
9256 // fcmp ule X, -inf -> fcmp ueq X, -inf
9257 // fcmp ugt X, -inf -> fcmp une X, -inf
9258 // fcmp uge X, -inf -> true
9259 const APFloat *C;
9260 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
9261 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
9262 default:
9263 break;
9264 case FCmpInst::FCMP_ORD:
9265 case FCmpInst::FCMP_UNO:
9268 case FCmpInst::FCMP_OGT:
9269 case FCmpInst::FCMP_ULE:
9270 llvm_unreachable("Should be simplified by InstSimplify");
9271 case FCmpInst::FCMP_OLT:
9272 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
9273 case FCmpInst::FCMP_OLE:
9274 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
9275 "", &I);
9276 case FCmpInst::FCMP_OGE:
9277 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
9278 case FCmpInst::FCMP_ULT:
9279 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
9280 case FCmpInst::FCMP_UGT:
9281 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
9282 "", &I);
9283 case FCmpInst::FCMP_UGE:
9284 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
9285 }
9286 }
9287
9288 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
9289 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
9290 if (match(Op1, m_PosZeroFP()) &&
9292 X->getType()->isIntOrIntVectorTy() &&
9293 !F.getDenormalMode(Op1->getType()->getScalarType()->getFltSemantics())
9294 .inputsMayBeZero()) {
9296 if (Pred == FCmpInst::FCMP_OEQ)
9297 IntPred = ICmpInst::ICMP_EQ;
9298 else if (Pred == FCmpInst::FCMP_UNE)
9299 IntPred = ICmpInst::ICMP_NE;
9300
9301 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
9302 Type *IntTy = X->getType();
9303 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
9304 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
9305 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
9306 }
9307 }
9308
9309 // Handle fcmp with instruction LHS and constant RHS.
9310 Instruction *LHSI;
9311 Constant *RHSC;
9312 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
9313 switch (LHSI->getOpcode()) {
9314 case Instruction::Select:
9315 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
9316 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
9318 return replaceOperand(I, 0, X);
9320 return NV;
9321 break;
9322 case Instruction::FSub:
9323 if (LHSI->hasOneUse())
9324 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
9325 return NV;
9326 break;
9327 case Instruction::PHI:
9328 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
9329 return NV;
9330 break;
9331 case Instruction::SIToFP:
9332 case Instruction::UIToFP:
9333 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
9334 return NV;
9335 break;
9336 case Instruction::FDiv:
9337 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
9338 return NV;
9339 break;
9340 case Instruction::Load:
9341 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
9342 if (Instruction *Res =
9344 return Res;
9345 break;
9346 case Instruction::FPTrunc:
9347 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
9348 return NV;
9349 break;
9350 }
9351 }
9352
9353 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
9354 return R;
9355
9356 if (Instruction *R = foldFCmpFAbsFSubIntToFP(I, *this))
9357 return R;
9358
9359 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
9360 return R;
9361
9362 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
9363 return R;
9364
9366 return R;
9367
9368 if (match(Op0, m_FNeg(m_Value(X)))) {
9369 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
9370 Constant *C;
9371 if (match(Op1, m_Constant(C)))
9372 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
9373 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
9374 }
9375
9376 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
9377 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
9378 return new FCmpInst(Pred, X, Op1, "", &I);
9379
9380 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
9381 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
9382 return new FCmpInst(Pred, Op0, Y, "", &I);
9383
9384 // fcmp ord/uno (fptrunc X), (fptrunc Y) -> fcmp ord/uno X, Y
9385 if ((Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) &&
9386 match(Op0, m_FPTrunc(m_Value(X))) && match(Op1, m_FPTrunc(m_Value(Y))) &&
9387 X->getType() == Y->getType())
9388 return new FCmpInst(Pred, X, Y, "", &I);
9389
9390 if (match(Op0, m_FPExt(m_Value(X)))) {
9391 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
9392 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
9393 return new FCmpInst(Pred, X, Y, "", &I);
9394
9395 const APFloat *C;
9396 if (match(Op1, m_APFloat(C))) {
9397 const fltSemantics &FPSem =
9398 X->getType()->getScalarType()->getFltSemantics();
9399 bool Lossy;
9400 APFloat TruncC = *C;
9402
9403 if (Lossy) {
9404 // X can't possibly equal the higher-precision constant, so reduce any
9405 // equality comparison.
9406 // TODO: Other predicates can be handled via getFCmpCode().
9407 switch (Pred) {
9408 case FCmpInst::FCMP_OEQ:
9409 // X is ordered and equal to an impossible constant --> false
9410 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9411 case FCmpInst::FCMP_ONE:
9412 // X is ordered and not equal to an impossible constant --> ordered
9413 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9414 ConstantFP::getZero(X->getType()));
9415 case FCmpInst::FCMP_UEQ:
9416 // X is unordered or equal to an impossible constant --> unordered
9417 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9418 ConstantFP::getZero(X->getType()));
9419 case FCmpInst::FCMP_UNE:
9420 // X is unordered or not equal to an impossible constant --> true
9421 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9422 default:
9423 break;
9424 }
9425 }
9426
9427 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9428 // Avoid lossy conversions and denormals.
9429 // Zero is a special case that's OK to convert.
9430 APFloat Fabs = TruncC;
9431 Fabs.clearSign();
9432 if (!Lossy &&
9433 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9434 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9435 return new FCmpInst(Pred, X, NewC, "", &I);
9436 }
9437 }
9438 }
9439
9440 // Convert a sign-bit test of an FP value into a cast and integer compare.
9441 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9442 // TODO: Handle non-zero compare constants.
9443 // TODO: Handle other predicates.
9445 m_Value(X)))) &&
9446 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9447 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9448 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9449 IntType = VectorType::get(IntType, VecTy->getElementCount());
9450
9451 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9452 if (Pred == FCmpInst::FCMP_OLT) {
9453 Value *IntX = Builder.CreateBitCast(X, IntType);
9454 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9455 ConstantInt::getNullValue(IntType));
9456 }
9457 }
9458
9459 {
9460 Value *CanonLHS = nullptr;
9462 // (canonicalize(x) == x) => (x == x)
9463 if (CanonLHS == Op1)
9464 return new FCmpInst(Pred, Op1, Op1, "", &I);
9465
9466 Value *CanonRHS = nullptr;
9468 // (x == canonicalize(x)) => (x == x)
9469 if (CanonRHS == Op0)
9470 return new FCmpInst(Pred, Op0, Op0, "", &I);
9471
9472 // (canonicalize(x) == canonicalize(y)) => (x == y)
9473 if (CanonLHS && CanonRHS)
9474 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9475 }
9476
9477 if (I.getType()->isVectorTy())
9478 if (Instruction *Res = foldVectorCmp(I, Builder))
9479 return Res;
9480
9481 return Changed ? &I : nullptr;
9482}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define Check(C,...)
Hexagon Common GEP
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static void collectOffsetOp(Value *V, SmallVectorImpl< OffsetOp > &Offsets, bool AllowRecursion)
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags NW, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static bool isMinMaxCmpSelectEliminable(SelectPatternFlavor Flavor, Value *A, Value *B)
Returns true if a select that implements a min/max is redundant and select result can be replaced wit...
static Instruction * foldICmpEqualityWithOffset(ICmpInst &I, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Offset both sides of an equality icmp to see if we can save some instructions: icmp eq/ne X,...
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Instruction * foldICmpOfVectorReduce(ICmpInst &I, const DataLayout &DL, IRBuilderBase &Builder)
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Instruction * foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI, Constant *RHSC, InstCombinerImpl &CI)
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static Value * foldICmpWithLowBitMaskedVal(CmpPredicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpShlLHSC(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl nuw C2, Y), C.
static Instruction * foldFCmpWithFloorAndCeil(FCmpInst &I, InstCombinerImpl &IC)
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(CmpPredicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * foldSqrtWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize sqrt(X) compared with zero.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(CmpPredicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags &NW, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldFCmpFpTrunc(FCmpInst &I, const Instruction &FPTrunc, const Constant &C)
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static Instruction * foldFCmpFAbsFSubIntToFP(FCmpInst &I, InstCombinerImpl &IC)
Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b where 'pred' is olt, ult, ogt,...
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q)
Return true if X is a multiple of C.
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T1
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
SI Fold Operands
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 TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:343
static constexpr roundingMode rmTowardZero
Definition APFloat.h:357
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:353
static LLVM_ABI ExponentType semanticsMaxExponent(const fltSemantics &)
Definition APFloat.cpp:258
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:369
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5934
void clearSign()
Definition APFloat.h:1394
bool isNaN() const
Definition APFloat.h:1573
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1184
bool isZero() const
Definition APFloat.h:1571
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1254
APInt bitcastToAPInt() const
Definition APFloat.h:1467
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1234
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1428
opStatus next(bool nextDown)
Definition APFloat.h:1350
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1194
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5863
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1344
bool isInfinity() const
Definition APFloat.h:1572
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1793
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
unsigned ceilLogBase2() const
Definition APInt.h:1789
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1210
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1983
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1963
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1088
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1670
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1970
void negate()
Negate this APInt in place.
Definition APInt.h:1493
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1477
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1640
unsigned logBase2() const
Definition APInt.h:1786
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1159
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1246
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1976
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1681
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1230
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
static APSInt getMinValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the minimum integer value with the given bit width and signedness.
Definition APSInt.h:310
static APSInt getMaxValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the maximum integer value with the given bit width and signedness.
Definition APSInt.h:302
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
static LLVM_ABI Predicate getFlippedStrictnessPredicate(Predicate pred)
This is a static version that you can use without an instruction available.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
bool isUnsigned() const
Definition InstrTypes.h:999
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Conditional Branch instruction.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
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 std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition Constants.cpp:68
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
iterator end()
Definition DenseMap.h:141
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:214
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
static bool isCommutative(Predicate Pred)
static bool isEquality(Predicate Pred)
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:390
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:82
Value * getPointerOperand()
Definition Operator.h:417
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:385
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:464
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
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.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1570
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:181
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2485
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1592
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:492
LLVM_ABI Value * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *Op, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2893
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldCmpSelectOfConstants(CmpInst &I)
Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2) where all true/false values are cons...
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
TargetLibraryInfo & TLI
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CxtI=nullptr) const
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
const DataLayout & DL
DomConditionCache DC
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
bool isArithmeticShift() const
Return true if this is an arithmetic shift right.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isShift() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
An instruction for reading from memory.
bool isVolatile() const
Return true if this is a load from a volatile memory location.
This class represents min/max intrinsics.
Value * getLHS() const
Value * getRHS() const
static bool isMin(Intrinsic::ID ID)
Whether the intrinsic is a smin or umin.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h:258
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class represents a truncation of integer types.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:263
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:167
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:237
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition Value.cpp:155
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.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
Definition APInt.cpp:2798
LLVM_ABI APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
Definition APInt.cpp:2816
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
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.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_unless< Pattern > m_Unless(const Pattern &P)
Match if the inner matcher does NOT match.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
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)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
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< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
auto m_Sqrt(const Opnd0 &Op0)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
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.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_UMax(const Opnd0 &Op0, const Opnd1 &Op1)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
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)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
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.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
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.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
cstfp_pred_ty< is_finitenonzero > m_FiniteNonZero()
Match a finite non-zero FP constant.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_FAbs(const Opnd0 &Op0)
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
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)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
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::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
auto m_VecReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:830
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ BinaryOp
One of the operands is a binary op.
LLVM_ABI Value * stripNullTest(Value *V)
Returns the inner value X if the expression has the form f(X) where f(X) == 0 if and only if X == 0,...
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.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
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.
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1684
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 * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:332
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
Definition bit.h:263
LLVM_ABI Value * emitGEPOffset(IRBuilderBase *Builder, const DataLayout &DL, User *GEP, bool NoAssumptions=false)
Given a getelementptr instruction/constantexpr, emit the code necessary to compute the offset from th...
Definition Local.cpp:22
constexpr unsigned MaxAnalysisRecursionDepth
LLVM_ABI Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
LLVM_ABI bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UNKNOWN
@ SPF_FMINNUM
Unsigned maximum.
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL, Value *Ptr)
Decompose a pointer into a linear expression.
Definition Loads.cpp:910
LLVM_ABI bool isFinite(const Loop *L)
Return true if this loop can be assumed to run for a finite number of iterations.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Returns: X * 2^Exp for integral exponents.
Definition APFloat.h:1693
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 SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
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 ...
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
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 Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
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 T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:395
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
IntPtrTy
Definition InstrProf.h:82
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.
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...
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:2019
LLVM_ABI bool isKnownNeverInfOrNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point value can never contain a NaN or infinity.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:26
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, const SimplifyQuery &SQ, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define NC
Definition regutils.h:42
Value * materialize(InstCombiner::BuilderTy &Builder) const
static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV, Instruction *MDFrom)
static OffsetResult value(Value *V)
static OffsetResult invalid()
This callback is used in conjunction with PointerMayBeCaptured.
static CommonPointerBase compute(Value *LHS, Value *RHS)
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
static constexpr DenormalMode getIEEE()
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:152
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:130
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:136
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:58
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:215
GEPNoWrapFlags Flags
Definition Loads.h:220
Matching combinators.
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
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:342
Capture information for a specific Use.