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 // (X - (X urem D)) is D*(X/D), a multiple of D, so it is u> C exactly when
3053 // X u>= D (for C u< D), and u< C exactly when X u< D (for 0 u< C u<= D):
3054 // icmp ugt (sub X, (urem X, D)), C --> icmp ugt X, D-1
3055 // icmp ult (sub X, (urem X, D)), C --> icmp ult X, D
3056 const APInt *D;
3057 if (match(Y, m_URem(m_Specific(X), m_APInt(D))) && !D->isZero()) {
3058 if (Pred == ICmpInst::ICMP_UGT && C.ult(*D))
3059 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, *D - 1));
3060 if (Pred == ICmpInst::ICMP_ULT && !C.isZero() && C.ule(*D))
3061 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, *D));
3062 }
3063
3064 // (SubC - Y) == C) --> Y == (SubC - C)
3065 // (SubC - Y) != C) --> Y != (SubC - C)
3066 Constant *SubC;
3067 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
3068 return new ICmpInst(Pred, Y,
3069 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
3070 }
3071
3072 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
3073 const APInt *C2;
3074 APInt SubResult;
3075 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
3076 bool HasNSW = Sub->hasNoSignedWrap();
3077 bool HasNUW = Sub->hasNoUnsignedWrap();
3078 if (match(X, m_APInt(C2)) &&
3079 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
3080 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
3081 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
3082
3083 // X - Y == 0 --> X == Y.
3084 // X - Y != 0 --> X != Y.
3085 // TODO: We allow this with multiple uses as long as the other uses are not
3086 // in phis. The phi use check is guarding against a codegen regression
3087 // for a loop test. If the backend could undo this (and possibly
3088 // subsequent transforms), we would not need this hack.
3089 if (Cmp.isEquality() && C.isZero() &&
3090 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
3091 return new ICmpInst(Pred, X, Y);
3092
3093 // The following transforms are only worth it if the only user of the subtract
3094 // is the icmp.
3095 // TODO: This is an artificial restriction for all of the transforms below
3096 // that only need a single replacement icmp. Can these use the phi test
3097 // like the transform above here?
3098 if (!Sub->hasOneUse())
3099 return nullptr;
3100
3101 if (Sub->hasNoSignedWrap()) {
3102 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3103 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3104 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3105
3106 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3107 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3108 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3109
3110 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3111 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3112 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3113
3114 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3115 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3116 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3117 }
3118
3119 if (!match(X, m_APInt(C2)))
3120 return nullptr;
3121
3122 // C2 - Y <u C -> (Y | (C - 1)) == C2
3123 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3124 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3125 (*C2 & (C - 1)) == (C - 1))
3126 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3127
3128 // C2 - Y >u C -> (Y | C) != C2
3129 // iff C2 & C == C and C + 1 is a power of 2
3130 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3131 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3132
3133 // We have handled special cases that reduce.
3134 // Canonicalize any remaining sub to add as:
3135 // (C2 - Y) > C --> (Y + ~C2) < ~C
3136 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3137 HasNUW, HasNSW);
3138 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3139}
3140
3141static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3142 Value *Op1, IRBuilderBase &Builder,
3143 bool HasOneUse) {
3144 auto FoldConstant = [&](bool Val) {
3145 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3146 if (Op0->getType()->isVectorTy())
3148 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3149 return Res;
3150 };
3151
3152 switch (Table.to_ulong()) {
3153 case 0: // 0 0 0 0
3154 return FoldConstant(false);
3155 case 1: // 0 0 0 1
3156 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3157 case 2: // 0 0 1 0
3158 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3159 case 3: // 0 0 1 1
3160 return Builder.CreateNot(Op0);
3161 case 4: // 0 1 0 0
3162 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3163 case 5: // 0 1 0 1
3164 return Builder.CreateNot(Op1);
3165 case 6: // 0 1 1 0
3166 return Builder.CreateXor(Op0, Op1);
3167 case 7: // 0 1 1 1
3168 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3169 case 8: // 1 0 0 0
3170 return Builder.CreateAnd(Op0, Op1);
3171 case 9: // 1 0 0 1
3172 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3173 case 10: // 1 0 1 0
3174 return Op1;
3175 case 11: // 1 0 1 1
3176 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3177 case 12: // 1 1 0 0
3178 return Op0;
3179 case 13: // 1 1 0 1
3180 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3181 case 14: // 1 1 1 0
3182 return Builder.CreateOr(Op0, Op1);
3183 case 15: // 1 1 1 1
3184 return FoldConstant(true);
3185 default:
3186 llvm_unreachable("Invalid Operation");
3187 }
3188 return nullptr;
3189}
3190
3192 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3193 Value *A, *B;
3194 Constant *C1, *C2, *C3, *C4;
3195 if (!match(BO->getOperand(0),
3197 !match(BO->getOperand(1),
3199 Cmp.getType() != A->getType() || Cmp.getType() != B->getType())
3200 return nullptr;
3201
3202 std::bitset<4> Table;
3203 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3204 Constant *L = First ? C1 : C2;
3205 Constant *R = Second ? C3 : C4;
3206 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3207 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3208 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3209 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3210 }
3211 return std::nullopt;
3212 };
3213
3214 for (unsigned I = 0; I < 4; ++I) {
3215 bool First = (I >> 1) & 1;
3216 bool Second = I & 1;
3217 if (auto Res = ComputeTable(First, Second))
3218 Table[I] = *Res;
3219 else
3220 return nullptr;
3221 }
3222
3223 // Synthesize optimal logic.
3224 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3225 return replaceInstUsesWith(Cmp, Cond);
3226 return nullptr;
3227}
3228
3229/// Fold icmp (add X, Y), C.
3232 const APInt &C) {
3233 Value *Y = Add->getOperand(1);
3234 Value *X = Add->getOperand(0);
3235 const CmpPredicate Pred = Cmp.getCmpPredicate();
3236
3237 // icmp ult (add nuw A, (lshr A, ShAmtC)), C --> icmp ult A, C
3238 // when C <= (1 << ShAmtC).
3239 const APInt *ShAmtC;
3240 Value *A;
3241 unsigned BitWidth = C.getBitWidth();
3242 if (Pred == ICmpInst::ICMP_ULT &&
3243 match(Add,
3244 m_c_NUWAdd(m_Value(A), m_LShr(m_Deferred(A), m_APInt(ShAmtC)))) &&
3245 ShAmtC->ult(BitWidth) &&
3246 C.ule(APInt::getOneBitSet(BitWidth, ShAmtC->getZExtValue())))
3247 return new ICmpInst(Pred, A, ConstantInt::get(A->getType(), C));
3248
3249 const APInt *C2;
3250 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3251 return nullptr;
3252
3253 // Fold icmp pred (add X, C2), C.
3254 Type *Ty = Add->getType();
3255
3256 // If the add does not wrap, we can always adjust the compare by subtracting
3257 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3258 // have been canonicalized to SGT/SLT/UGT/ULT.
3259 if (Add->hasNoUnsignedWrap() &&
3260 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT)) {
3261 bool Overflow;
3262 APInt NewC = C.usub_ov(*C2, Overflow);
3263 // If there is overflow, the result must be true or false.
3264 if (!Overflow)
3265 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3266 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3267 }
3268
3269 CmpInst::Predicate ChosenPred = Pred.getPreferredSignedPredicate();
3270
3271 if (Add->hasNoSignedWrap() &&
3272 (ChosenPred == ICmpInst::ICMP_SGT || ChosenPred == ICmpInst::ICMP_SLT)) {
3273 bool Overflow;
3274 APInt NewC = C.ssub_ov(*C2, Overflow);
3275 if (!Overflow)
3276 // icmp samesign ugt/ult (add nsw X, C2), C
3277 // -> icmp sgt/slt X, (C - C2)
3278 return new ICmpInst(ChosenPred, X, ConstantInt::get(Ty, NewC));
3279 }
3280
3281 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3282 C.isNonNegative() && (C - *C2).isNonNegative() &&
3283 computeConstantRange(X, /*ForSigned=*/true, SQ.getWithInstruction(&Cmp))
3284 .add(*C2)
3285 .isAllNonNegative())
3286 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3287 ConstantInt::get(Ty, C - *C2));
3288
3289 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3290 const APInt &Upper = CR.getUpper();
3291 const APInt &Lower = CR.getLower();
3292 if (Cmp.isSigned()) {
3293 if (Lower.isSignMask())
3294 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3295 if (Upper.isSignMask())
3296 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3297 } else {
3298 if (Lower.isMinValue())
3299 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3300 if (Upper.isMinValue())
3301 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3302 }
3303
3304 // This set of folds is intentionally placed after folds that use no-wrapping
3305 // flags because those folds are likely better for later analysis/codegen.
3306 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3307 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3308
3309 // Fold compare with offset to opposite sign compare if it eliminates offset:
3310 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3311 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3312 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3313
3314 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3315 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3316 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3317
3318 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3319 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3320 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3321
3322 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3323 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3324 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3325
3326 // (X + -1) <u C --> X <=u C (if X is never null)
3327 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3328 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3329 if (llvm::isKnownNonZero(X, Q))
3330 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3331 }
3332
3333 if (!Add->hasOneUse())
3334 return nullptr;
3335
3336 // X+C <u C2 -> (X & -C2) == C
3337 // iff C & (C2-1) == 0
3338 // C2 is a power of 2
3339 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3340 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3342
3343 // X+C2 <u C -> (X & C) == 2C
3344 // iff C == -(C2)
3345 // C2 is a power of 2
3346 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3347 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3348 ConstantInt::get(Ty, C * 2));
3349
3350 // X+C >u C2 -> (X & ~C2) != C
3351 // iff C & C2 == 0
3352 // C2+1 is a power of 2
3353 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3354 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3356
3357 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3358 // to the ult form.
3359 // X+C2 >u C -> X+(C2-C-1) <u ~C
3360 if (Pred == ICmpInst::ICMP_UGT)
3361 return new ICmpInst(ICmpInst::ICMP_ULT,
3362 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3363 ConstantInt::get(Ty, ~C));
3364
3365 // zext(V) + C2 pred C -> V + C3 pred' C4
3366 Value *V;
3367 if (match(X, m_ZExt(m_Value(V)))) {
3368 Type *NewCmpTy = V->getType();
3369 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3370 if (shouldChangeType(Ty, NewCmpTy)) {
3371 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3372 CmpInst::Predicate EquivPred;
3373 APInt EquivInt;
3374 APInt EquivOffset;
3375
3376 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3377 return new ICmpInst(
3378 EquivPred,
3379 EquivOffset.isZero()
3380 ? V
3381 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3382 ConstantInt::get(NewCmpTy, EquivInt));
3383 }
3384 }
3385
3386 return nullptr;
3387}
3388
3390 Value *&RHS, ConstantInt *&Less,
3391 ConstantInt *&Equal,
3392 ConstantInt *&Greater) {
3393 // TODO: Generalize this to work with other comparison idioms or ensure
3394 // they get canonicalized into this form.
3395
3396 // select i1 (a == b),
3397 // i32 Equal,
3398 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3399 // where Equal, Less and Greater are placeholders for any three constants.
3400 CmpPredicate PredA;
3401 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3402 !ICmpInst::isEquality(PredA))
3403 return false;
3404 Value *EqualVal = SI->getTrueValue();
3405 Value *UnequalVal = SI->getFalseValue();
3406 // We still can get non-canonical predicate here, so canonicalize.
3407 if (PredA == ICmpInst::ICMP_NE)
3408 std::swap(EqualVal, UnequalVal);
3409 if (!match(EqualVal, m_ConstantInt(Equal)))
3410 return false;
3411 CmpPredicate PredB;
3412 Value *LHS2, *RHS2;
3413 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3414 m_ConstantInt(Less), m_ConstantInt(Greater))))
3415 return false;
3416 // We can get predicate mismatch here, so canonicalize if possible:
3417 // First, ensure that 'LHS' match.
3418 if (LHS2 != LHS) {
3419 // x sgt y <--> y slt x
3420 std::swap(LHS2, RHS2);
3421 PredB = ICmpInst::getSwappedPredicate(PredB);
3422 }
3423 if (LHS2 != LHS)
3424 return false;
3425 // We also need to canonicalize 'RHS'.
3426 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3427 // x sgt C-1 <--> x sge C <--> not(x slt C)
3428 auto FlippedStrictness =
3430 if (!FlippedStrictness)
3431 return false;
3432 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3433 "basic correctness failure");
3434 RHS2 = FlippedStrictness->second;
3435 // And kind-of perform the result swap.
3436 std::swap(Less, Greater);
3437 PredB = ICmpInst::ICMP_SLT;
3438 }
3439 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3440}
3441
3444 ConstantInt *C) {
3445
3446 assert(C && "Cmp RHS should be a constant int!");
3447 // If we're testing a constant value against the result of a three way
3448 // comparison, the result can be expressed directly in terms of the
3449 // original values being compared. Note: We could possibly be more
3450 // aggressive here and remove the hasOneUse test. The original select is
3451 // really likely to simplify or sink when we remove a test of the result.
3452 Value *OrigLHS, *OrigRHS;
3453 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3454 if (Cmp.hasOneUse() &&
3455 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3456 C3GreaterThan)) {
3457 assert(C1LessThan && C2Equal && C3GreaterThan);
3458
3459 bool TrueWhenLessThan = ICmpInst::compare(
3460 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3461 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3462 Cmp.getPredicate());
3463 bool TrueWhenGreaterThan = ICmpInst::compare(
3464 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3465
3466 // This generates the new instruction that will replace the original Cmp
3467 // Instruction. Instead of enumerating the various combinations when
3468 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3469 // false, we rely on chaining of ORs and future passes of InstCombine to
3470 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3471
3472 // When none of the three constants satisfy the predicate for the RHS (C),
3473 // the entire original Cmp can be simplified to a false.
3474 Value *Cond = Builder.getFalse();
3475 if (TrueWhenLessThan)
3476 Cond = Builder.CreateOr(
3477 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3478 if (TrueWhenEqual)
3479 Cond = Builder.CreateOr(
3480 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3481 if (TrueWhenGreaterThan)
3482 Cond = Builder.CreateOr(
3483 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3484
3485 return replaceInstUsesWith(Cmp, Cond);
3486 }
3487 return nullptr;
3488}
3489
3491 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3492 if (!Bitcast)
3493 return nullptr;
3494
3495 ICmpInst::Predicate Pred = Cmp.getPredicate();
3496 Value *Op1 = Cmp.getOperand(1);
3497 Value *BCSrcOp = Bitcast->getOperand(0);
3498 Type *SrcType = Bitcast->getSrcTy();
3499 Type *DstType = Bitcast->getType();
3500
3501 // Make sure the bitcast doesn't change between scalar and vector and
3502 // doesn't change the number of vector elements.
3503 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3504 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3505 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3506 Value *X;
3507 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3508 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3509 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3510 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3511 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3512 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3513 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3514 match(Op1, m_Zero()))
3515 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3516
3517 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3518 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3519 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3520
3521 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3522 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3523 return new ICmpInst(Pred, X,
3524 ConstantInt::getAllOnesValue(X->getType()));
3525 }
3526
3527 // Zero-equality checks are preserved through unsigned floating-point casts:
3528 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3529 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3530 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3531 if (Cmp.isEquality() && match(Op1, m_Zero()))
3532 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3533
3534 const APInt *C;
3535 bool TrueIfSigned;
3536 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3537 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3538 // the FP extend/truncate because that cast does not change the sign-bit.
3539 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3540 // The sign-bit is always the most significant bit in those types.
3541 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3542 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3543 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3544 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3545 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3546 Type *XType = X->getType();
3547
3548 // We can't currently handle Power style floating point operations here.
3549 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3550 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3551 if (auto *XVTy = dyn_cast<VectorType>(XType))
3552 NewType = VectorType::get(NewType, XVTy->getElementCount());
3553 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3554 if (TrueIfSigned)
3555 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3556 ConstantInt::getNullValue(NewType));
3557 else
3558 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3560 }
3561 }
3562
3563 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3564 Type *FPType = SrcType->getScalarType();
3565 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3566 Attribute::NoImplicitFloat) &&
3567 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3568 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3569 if (Mask & (fcInf | fcZero)) {
3570 if (Pred == ICmpInst::ICMP_NE)
3571 Mask = ~Mask;
3572 return replaceInstUsesWith(Cmp,
3573 Builder.createIsFPClass(BCSrcOp, Mask));
3574 }
3575 }
3576 }
3577 }
3578
3579 const APInt *C;
3580 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3581 !SrcType->isIntOrIntVectorTy())
3582 return nullptr;
3583
3584 // If this is checking if all elements of a vector compare are set or not,
3585 // invert the casted vector equality compare and test if all compare
3586 // elements are clear or not. Compare against zero is generally easier for
3587 // analysis and codegen.
3588 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3589 // Example: are all elements equal? --> are zero elements not equal?
3590 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3591 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3592 if (Value *NotBCSrcOp =
3593 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3594 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3595 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3596 }
3597 }
3598
3599 // If this is checking if all elements of an extended vector are clear or not,
3600 // compare in a narrow type to eliminate the extend:
3601 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3602 Value *X;
3603 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3604 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3605 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3606 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3607 Value *NewCast = Builder.CreateBitCast(X, NewType);
3608 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3609 }
3610 }
3611
3612 // Folding: icmp <pred> iN X, C
3613 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3614 // and C is a splat of a K-bit pattern
3615 // and SC is a constant vector = <C', C', C', ..., C'>
3616 // Into:
3617 // %E = extractelement <M x iK> %vec, i32 C'
3618 // icmp <pred> iK %E, trunc(C)
3619 Value *Vec;
3620 ArrayRef<int> Mask;
3621 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3622 // Check whether every element of Mask is the same constant
3623 if (all_equal(Mask)) {
3624 auto *VecTy = cast<VectorType>(SrcType);
3625 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3626 if (C->isSplat(EltTy->getBitWidth())) {
3627 // Fold the icmp based on the value of C
3628 // If C is M copies of an iK sized bit pattern,
3629 // then:
3630 // => %E = extractelement <N x iK> %vec, i64 Elem
3631 // icmp <pred> iK %SplatVal, <pattern>
3632 Value *Extract = Builder.CreateExtractElement(Vec, Mask[0]);
3633 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3634 return new ICmpInst(Pred, Extract, NewC);
3635 }
3636 }
3637 }
3638 return nullptr;
3639}
3640
3641/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3642/// where X is some kind of instruction.
3644 const APInt *C;
3645
3646 if (match(Cmp.getOperand(1), m_APInt(C))) {
3647 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3648 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3649 return I;
3650
3651 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3652 // For now, we only support constant integers while folding the
3653 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3654 // similar to the cases handled by binary ops above.
3655 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3656 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3657 return I;
3658
3659 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3660 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3661 return I;
3662
3663 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3665 return I;
3666
3667 {
3668 // icmp slt/sgt (extractvalue (frexp X), 1), C -->
3669 // fcmp olt/oge (fabs X), 2^ExpVal
3670 // slt -> olt, ExpVal = C-1; sgt -> oge, ExpVal = C.
3671 Value *X;
3672 if (match(Cmp.getOperand(0),
3675 ICmpInst::Predicate Pred = Cmp.getPredicate();
3676 APInt Exp;
3677 FCmpInst::Predicate NewPred;
3678 bool ValidPred = true;
3679
3680 switch (Pred) {
3681 case ICmpInst::ICMP_SLT:
3682 NewPred = FCmpInst::FCMP_OLT;
3683 Exp = *C - 1;
3684 break;
3685 case ICmpInst::ICMP_SGT:
3686 NewPred = FCmpInst::FCMP_OGE;
3687 Exp = *C;
3688 break;
3689 default:
3690 ValidPred = false;
3691 break;
3692 }
3693
3694 if (ValidPred) {
3695 const fltSemantics &Sem =
3696 X->getType()->getScalarType()->getFltSemantics();
3697 int MaxExp = APFloat::semanticsMaxExponent(Sem);
3698
3699 if (!Exp.isNegative() && Exp.sle(MaxExp + 1) &&
3700 isKnownNeverInfOrNaN(X, SQ.getWithInstruction(&Cmp))) {
3701 int ExpVal = static_cast<int>(Exp.getSExtValue());
3702 APFloat CmpConst = scalbn(APFloat::getOne(Sem), ExpVal,
3704 Value *Fabs = Builder.CreateFAbs(X);
3705 return new FCmpInst(NewPred, Fabs,
3706 ConstantFP::get(X->getType(), CmpConst));
3707 }
3708 }
3709 }
3710 }
3711
3712 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3713 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3714 // TODO: This checks one-use, but that is not strictly necessary.
3715 Value *Cmp0 = Cmp.getOperand(0);
3716 Value *X, *Y;
3717 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3718 (match(Cmp0,
3720 m_Value(X), m_Value(Y)))) ||
3721 match(Cmp0,
3723 m_Value(X), m_Value(Y))))))
3724 return new ICmpInst(Cmp.getPredicate(), X, Y);
3725 }
3726
3727 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3729
3730 return nullptr;
3731}
3732
3733/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3734/// icmp eq/ne BO, C.
3736 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3737 // TODO: Some of these folds could work with arbitrary constants, but this
3738 // function is limited to scalar and vector splat constants.
3739 if (!Cmp.isEquality())
3740 return nullptr;
3741
3742 ICmpInst::Predicate Pred = Cmp.getPredicate();
3743 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3744 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3745 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3746
3747 switch (BO->getOpcode()) {
3748 case Instruction::SRem:
3749 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3750 if (C.isZero() && BO->hasOneUse()) {
3751 const APInt *BOC;
3752 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3753 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3754 return new ICmpInst(Pred, NewRem,
3756 }
3757 }
3758 break;
3759 case Instruction::Add: {
3760 // (A + C2) == C --> A == (C - C2)
3761 // (A + C2) != C --> A != (C - C2)
3762 // TODO: Remove the one-use limitation? See discussion in D58633.
3763 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3764 if (BO->hasOneUse())
3765 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3766 } else if (C.isZero()) {
3767 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3768 // efficiently invertible, or if the add has just this one use.
3769 if (Value *NegVal = dyn_castNegVal(BOp1))
3770 return new ICmpInst(Pred, BOp0, NegVal);
3771 if (Value *NegVal = dyn_castNegVal(BOp0))
3772 return new ICmpInst(Pred, NegVal, BOp1);
3773 if (BO->hasOneUse()) {
3774 // (add nuw A, B) != 0 -> (or A, B) != 0
3775 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3776 Value *Or = Builder.CreateOr(BOp0, BOp1);
3777 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3778 }
3779 Value *Neg = Builder.CreateNeg(BOp1);
3780 Neg->takeName(BO);
3781 return new ICmpInst(Pred, BOp0, Neg);
3782 }
3783 }
3784 break;
3785 }
3786 case Instruction::Xor:
3787 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3788 // For the xor case, we can xor two constants together, eliminating
3789 // the explicit xor.
3790 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3791 } else if (C.isZero()) {
3792 // Replace ((xor A, B) != 0) with (A != B)
3793 return new ICmpInst(Pred, BOp0, BOp1);
3794 }
3795 break;
3796 case Instruction::Or: {
3797 const APInt *BOC;
3798 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3799 // Comparing if all bits outside of a constant mask are set?
3800 // Replace (X | C) == -1 with (X & ~C) == ~C.
3801 // This removes the -1 constant.
3803 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3804 return new ICmpInst(Pred, And, NotBOC);
3805 }
3806 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3807 // -> (and cond, (icmp eq Other, 0))
3808 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3809 // -> (or cond, (icmp ne Other, 0))
3810 Value *Cond, *TV, *FV, *Other, *Sel;
3811 if (C.isZero() &&
3812 match(BO,
3815 m_Value(FV))),
3816 m_Value(Other)))) &&
3817 Cond->getType() == Cmp.getType()) {
3818 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3819 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3820 if (Pred == ICmpInst::ICMP_EQ
3821 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3822 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3823 Value *Cmp = Builder.CreateICmp(
3824 Pred, Other, Constant::getNullValue(Other->getType()));
3826 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3827 Cond);
3828 }
3829 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3830 // case we need to invert the select condition so we need to be careful to
3831 // avoid creating extra instructions.
3832 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3833 // -> (or (not cond), (icmp ne Other, 0))
3834 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3835 // -> (and (not cond), (icmp eq Other, 0))
3836 //
3837 // Only do this if the inner select has one use, in which case we are
3838 // replacing `select` with `(not cond)`. Otherwise, we will create more
3839 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3840 // cond was freely invertable, the select arms would have been inverted.
3841 if (Sel->hasOneUse() &&
3842 (Pred == ICmpInst::ICMP_EQ
3843 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3844 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3845 Value *NotCond = Builder.CreateNot(Cond);
3846 Value *Cmp = Builder.CreateICmp(
3847 Pred, Other, Constant::getNullValue(Other->getType()));
3849 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3850 NotCond);
3851 }
3852 }
3853 break;
3854 }
3855 case Instruction::UDiv:
3856 case Instruction::SDiv:
3857 if (BO->isExact()) {
3858 // div exact X, Y eq/ne 0 -> X eq/ne 0
3859 // div exact X, Y eq/ne 1 -> X eq/ne Y
3860 // div exact X, Y eq/ne C ->
3861 // if Y * C never-overflow && OneUse:
3862 // -> Y * C eq/ne X
3863 if (C.isZero())
3864 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3865 else if (C.isOne())
3866 return new ICmpInst(Pred, BOp0, BOp1);
3867 else if (BO->hasOneUse()) {
3869 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3870 Cmp.getOperand(1), BO);
3872 Value *YC =
3873 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3874 return new ICmpInst(Pred, YC, BOp0);
3875 }
3876 }
3877 }
3878 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3879 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3880 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3881 return new ICmpInst(NewPred, BOp1, BOp0);
3882 }
3883 break;
3884 default:
3885 break;
3886 }
3887 return nullptr;
3888}
3889
3891 const APInt &CRhs,
3892 InstCombiner::BuilderTy &Builder,
3893 const SimplifyQuery &Q) {
3894 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3895 "Non-ctpop intrin in ctpop fold");
3896 if (!CtpopLhs->hasOneUse())
3897 return nullptr;
3898
3899 // Power of 2 test:
3900 // isPow2OrZero : ctpop(X) u< 2
3901 // isPow2 : ctpop(X) == 1
3902 // NotPow2OrZero: ctpop(X) u> 1
3903 // NotPow2 : ctpop(X) != 1
3904 // If we know any bit of X can be folded to:
3905 // IsPow2 : X & (~Bit) == 0
3906 // NotPow2 : X & (~Bit) != 0
3907 const ICmpInst::Predicate Pred = I.getPredicate();
3908 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3909 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3910 Value *Op = CtpopLhs->getArgOperand(0);
3911 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3912 // No need to check for count > 1, that should be already constant folded.
3913 if (OpKnown.countMinPopulation() == 1) {
3914 Value *And = Builder.CreateAnd(
3915 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3916 return new ICmpInst(
3917 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3920 And, Constant::getNullValue(Op->getType()));
3921 }
3922 }
3923
3924 return nullptr;
3925}
3926
3927/// Fold an equality icmp with LLVM intrinsic and constant operand.
3929 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3930 Type *Ty = II->getType();
3931 unsigned BitWidth = C.getBitWidth();
3932 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3933
3934 switch (II->getIntrinsicID()) {
3935 case Intrinsic::abs:
3936 // abs(A) == 0 -> A == 0
3937 // abs(A) == INT_MIN -> A == INT_MIN
3938 if (C.isZero() || C.isMinSignedValue())
3939 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3940 break;
3941
3942 case Intrinsic::bswap:
3943 // bswap(A) == C -> A == bswap(C)
3944 return new ICmpInst(Pred, II->getArgOperand(0),
3945 ConstantInt::get(Ty, C.byteSwap()));
3946
3947 case Intrinsic::bitreverse:
3948 // bitreverse(A) == C -> A == bitreverse(C)
3949 return new ICmpInst(Pred, II->getArgOperand(0),
3950 ConstantInt::get(Ty, C.reverseBits()));
3951
3952 case Intrinsic::ctlz:
3953 case Intrinsic::cttz: {
3954 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3955 if (C == BitWidth)
3956 return new ICmpInst(Pred, II->getArgOperand(0),
3958
3959 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3960 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3961 // Limit to one use to ensure we don't increase instruction count.
3962 unsigned Num = C.getLimitedValue(BitWidth);
3963 if (Num != BitWidth && II->hasOneUse()) {
3964 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3965 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3966 : APInt::getHighBitsSet(BitWidth, Num + 1);
3967 APInt Mask2 = IsTrailing
3970 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3971 ConstantInt::get(Ty, Mask2));
3972 }
3973 break;
3974 }
3975
3976 case Intrinsic::ctpop: {
3977 // popcount(A) == 0 -> A == 0 and likewise for !=
3978 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3979 bool IsZero = C.isZero();
3980 if (IsZero || C == BitWidth)
3981 return new ICmpInst(Pred, II->getArgOperand(0),
3982 IsZero ? Constant::getNullValue(Ty)
3984
3985 break;
3986 }
3987
3988 case Intrinsic::fshl:
3989 case Intrinsic::fshr:
3990 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3991 const APInt *RotAmtC;
3992 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3993 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3994 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3995 return new ICmpInst(Pred, II->getArgOperand(0),
3996 II->getIntrinsicID() == Intrinsic::fshl
3997 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3998 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3999 }
4000 break;
4001
4002 case Intrinsic::umax:
4003 case Intrinsic::uadd_sat: {
4004 // uadd.sat(a, b) == 0 -> (a | b) == 0
4005 // umax(a, b) == 0 -> (a | b) == 0
4006 if (C.isZero() && II->hasOneUse()) {
4007 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
4008 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
4009 }
4010 break;
4011 }
4012
4013 case Intrinsic::ssub_sat:
4014 // ssub.sat(a, b) == 0 -> a == b
4015 //
4016 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4017 // (because 1 saturates to 0). Just skip the optimization for i1.
4018 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
4019 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4020 break;
4021 case Intrinsic::usub_sat: {
4022 // usub.sat(a, b) == 0 -> a <= b
4023 if (C.isZero()) {
4024 ICmpInst::Predicate NewPred =
4026 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
4027 }
4028 break;
4029 }
4030 default:
4031 break;
4032 }
4033
4034 return nullptr;
4035}
4036
4037/// Fold an icmp with LLVM intrinsics
4038static Instruction *
4040 InstCombiner::BuilderTy &Builder) {
4041 assert(Cmp.isEquality());
4042
4043 ICmpInst::Predicate Pred = Cmp.getPredicate();
4044 Value *Op0 = Cmp.getOperand(0);
4045 Value *Op1 = Cmp.getOperand(1);
4046 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
4047 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
4048 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
4049 return nullptr;
4050
4051 switch (IIOp0->getIntrinsicID()) {
4052 case Intrinsic::bswap:
4053 case Intrinsic::bitreverse:
4054 // If both operands are byte-swapped or bit-reversed, just compare the
4055 // original values.
4056 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
4057 case Intrinsic::fshl:
4058 case Intrinsic::fshr: {
4059 // If both operands are rotated by same amount, just compare the
4060 // original values.
4061 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
4062 break;
4063 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
4064 break;
4065 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
4066 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
4067
4068 // rotate(X, AmtX) == rotate(Y, AmtY)
4069 // -> rotate(X, AmtX - AmtY) == Y
4070 // Do this if either both rotates have one use or if only one has one use
4071 // and AmtX/AmtY are constants.
4072 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
4073 if (OneUses == 2 ||
4074 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
4075 match(IIOp1->getOperand(2), m_ImmConstant()))) {
4076 Value *SubAmt =
4077 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
4078 Value *CombinedRotate = Builder.CreateIntrinsic(
4079 Op0->getType(), IIOp0->getIntrinsicID(),
4080 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
4081 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
4082 }
4083 } break;
4084 default:
4085 break;
4086 }
4087
4088 return nullptr;
4089}
4090
4091/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
4092/// where X is some kind of instruction and C is AllowPoison.
4093/// TODO: Move more folds which allow poison to this function.
4096 const APInt &C) {
4097 const ICmpInst::Predicate Pred = Cmp.getPredicate();
4098 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
4099 switch (II->getIntrinsicID()) {
4100 default:
4101 break;
4102 case Intrinsic::fshl:
4103 case Intrinsic::fshr:
4104 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
4105 // (rot X, ?) == 0/-1 --> X == 0/-1
4106 if (C.isZero() || C.isAllOnes())
4107 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
4108 }
4109 break;
4110 }
4111 }
4112
4113 return nullptr;
4114}
4115
4116/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
4118 BinaryOperator *BO,
4119 const APInt &C) {
4120 switch (BO->getOpcode()) {
4121 case Instruction::Xor:
4122 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
4123 return I;
4124 break;
4125 case Instruction::And:
4126 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
4127 return I;
4128 break;
4129 case Instruction::Or:
4130 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
4131 return I;
4132 break;
4133 case Instruction::Mul:
4134 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
4135 return I;
4136 break;
4137 case Instruction::Shl:
4138 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4139 return I;
4140 break;
4141 case Instruction::LShr:
4142 case Instruction::AShr:
4143 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4144 return I;
4145 break;
4146 case Instruction::SRem:
4147 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4148 return I;
4149 break;
4150 case Instruction::UDiv:
4151 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4152 return I;
4153 [[fallthrough]];
4154 case Instruction::SDiv:
4155 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4156 return I;
4157 break;
4158 case Instruction::Sub:
4159 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4160 return I;
4161 break;
4162 case Instruction::Add:
4163 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4164 return I;
4165 break;
4166 default:
4167 break;
4168 }
4169
4170 // TODO: These folds could be refactored to be part of the above calls.
4172 return I;
4173
4174 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4175 // : C4), C5` pattern, by computing a truth table of the four constant
4176 // variants.
4178}
4179
4180static Instruction *
4182 const APInt &C,
4183 InstCombiner::BuilderTy &Builder) {
4184 // This transform may end up producing more than one instruction for the
4185 // intrinsic, so limit it to one user of the intrinsic.
4186 if (!II->hasOneUse())
4187 return nullptr;
4188
4189 // Let Y = [add/sub]_sat(X, C) pred C2
4190 // SatVal = The saturating value for the operation
4191 // WillWrap = Whether or not the operation will underflow / overflow
4192 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4193 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4194 //
4195 // When (SatVal pred C2) is true, then
4196 // Y = WillWrap ? true : ((X binop C) pred C2)
4197 // => Y = WillWrap || ((X binop C) pred C2)
4198 // else
4199 // Y = WillWrap ? false : ((X binop C) pred C2)
4200 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4201 // => Y = !WillWrap && ((X binop C) pred C2)
4202 Value *Op0 = II->getOperand(0);
4203 Value *Op1 = II->getOperand(1);
4204
4205 const APInt *COp1;
4206 // This transform only works when the intrinsic has an integral constant or
4207 // splat vector as the second operand.
4208 if (!match(Op1, m_APInt(COp1)))
4209 return nullptr;
4210
4211 APInt SatVal;
4212 switch (II->getIntrinsicID()) {
4213 default:
4215 "This function only works with usub_sat and uadd_sat for now!");
4216 case Intrinsic::uadd_sat:
4217 SatVal = APInt::getAllOnes(C.getBitWidth());
4218 break;
4219 case Intrinsic::usub_sat:
4220 SatVal = APInt::getZero(C.getBitWidth());
4221 break;
4222 }
4223
4224 // Check (SatVal pred C2)
4225 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4226
4227 // !WillWrap.
4229 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4230
4231 // WillWrap.
4232 if (SatValCheck)
4233 C1 = C1.inverse();
4234
4236 if (II->getBinaryOp() == Instruction::Add)
4237 C2 = C2.sub(*COp1);
4238 else
4239 C2 = C2.add(*COp1);
4240
4241 Instruction::BinaryOps CombiningOp =
4242 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4243
4244 std::optional<ConstantRange> Combination;
4245 if (CombiningOp == Instruction::BinaryOps::Or)
4246 Combination = C1.exactUnionWith(C2);
4247 else /* CombiningOp == Instruction::BinaryOps::And */
4248 Combination = C1.exactIntersectWith(C2);
4249
4250 if (!Combination)
4251 return nullptr;
4252
4253 CmpInst::Predicate EquivPred;
4254 APInt EquivInt;
4255 APInt EquivOffset;
4256
4257 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4258
4259 return new ICmpInst(
4260 EquivPred,
4261 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4262 ConstantInt::get(Op1->getType(), EquivInt));
4263}
4264
4265static Instruction *
4267 const APInt &C,
4268 InstCombiner::BuilderTy &Builder) {
4269 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4270 switch (Pred) {
4271 case ICmpInst::ICMP_EQ:
4272 case ICmpInst::ICMP_NE:
4273 if (C.isZero())
4274 NewPredicate = Pred;
4275 else if (C.isOne())
4276 NewPredicate =
4278 else if (C.isAllOnes())
4279 NewPredicate =
4281 break;
4282
4283 case ICmpInst::ICMP_SGT:
4284 if (C.isAllOnes())
4285 NewPredicate = ICmpInst::ICMP_UGE;
4286 else if (C.isZero())
4287 NewPredicate = ICmpInst::ICMP_UGT;
4288 break;
4289
4290 case ICmpInst::ICMP_SLT:
4291 if (C.isZero())
4292 NewPredicate = ICmpInst::ICMP_ULT;
4293 else if (C.isOne())
4294 NewPredicate = ICmpInst::ICMP_ULE;
4295 break;
4296
4297 case ICmpInst::ICMP_ULT:
4298 if (C.ugt(1))
4299 NewPredicate = ICmpInst::ICMP_UGE;
4300 break;
4301
4302 case ICmpInst::ICMP_UGT:
4303 if (!C.isZero() && !C.isAllOnes())
4304 NewPredicate = ICmpInst::ICMP_ULT;
4305 break;
4306
4307 default:
4308 break;
4309 }
4310
4311 if (!NewPredicate)
4312 return nullptr;
4313
4314 if (I->getIntrinsicID() == Intrinsic::scmp)
4315 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4316 Value *LHS = I->getOperand(0);
4317 Value *RHS = I->getOperand(1);
4318 return new ICmpInst(*NewPredicate, LHS, RHS);
4319}
4320
4321/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4324 const APInt &C) {
4325 ICmpInst::Predicate Pred = Cmp.getPredicate();
4326
4327 // Handle folds that apply for any kind of icmp.
4328 switch (II->getIntrinsicID()) {
4329 default:
4330 break;
4331 case Intrinsic::uadd_sat:
4332 case Intrinsic::usub_sat:
4333 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4334 Pred, cast<SaturatingInst>(II), C, Builder))
4335 return Folded;
4336 break;
4337 case Intrinsic::ctpop: {
4338 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4339 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4340 return R;
4341 } break;
4342 case Intrinsic::scmp:
4343 case Intrinsic::ucmp:
4344 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4345 return Folded;
4346 break;
4347 }
4348
4349 if (Cmp.isEquality())
4350 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4351
4352 Type *Ty = II->getType();
4353 unsigned BitWidth = C.getBitWidth();
4354 switch (II->getIntrinsicID()) {
4355 case Intrinsic::ctpop: {
4356 // (ctpop X > BitWidth - 1) --> X == -1
4357 Value *X = II->getArgOperand(0);
4358 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4359 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4361 // (ctpop X < BitWidth) --> X != -1
4362 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4363 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4365 break;
4366 }
4367 case Intrinsic::ctlz: {
4368 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4369 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4370 unsigned Num = C.getLimitedValue();
4371 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4372 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4373 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4374 }
4375
4376 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4377 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4378 unsigned Num = C.getLimitedValue();
4380 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4381 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4382 }
4383 break;
4384 }
4385 case Intrinsic::cttz: {
4386 // Limit to one use to ensure we don't increase instruction count.
4387 if (!II->hasOneUse())
4388 return nullptr;
4389
4390 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4391 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4392 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4393 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4394 Builder.CreateAnd(II->getArgOperand(0), Mask),
4396 }
4397
4398 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4399 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4400 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4401 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4402 Builder.CreateAnd(II->getArgOperand(0), Mask),
4404 }
4405 break;
4406 }
4407 case Intrinsic::ssub_sat:
4408 // ssub.sat(a, b) spred 0 -> a spred b
4409 //
4410 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4411 // (because 1 saturates to 0). Just skip the optimization for i1.
4412 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4413 if (C.isZero())
4414 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4415 // X s<= 0 is cannonicalized to X s< 1
4416 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4417 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4418 II->getArgOperand(1));
4419 // X s>= 0 is cannonicalized to X s> -1
4420 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4421 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4422 II->getArgOperand(1));
4423 }
4424 break;
4425 case Intrinsic::abs: {
4426 if (!II->hasOneUse())
4427 return nullptr;
4428
4429 Value *X = II->getArgOperand(0);
4430 bool IsIntMinPoison =
4431 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4432
4433 // If C >= 0:
4434 // abs(X) u> C --> X + C u> 2 * C
4435 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4436 return new ICmpInst(ICmpInst::ICMP_UGT,
4437 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4438 ConstantInt::get(Ty, 2 * C));
4439 }
4440
4441 // If abs(INT_MIN) is poison and C >= 1:
4442 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4443 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4444 return new ICmpInst(ICmpInst::ICMP_ULE,
4445 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4446 ConstantInt::get(Ty, 2 * (C - 1)));
4447 }
4448
4449 break;
4450 }
4451 default:
4452 break;
4453 }
4454
4455 return nullptr;
4456}
4457
4458/// Handle icmp with constant (but not simple integer constant) RHS.
4460 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4461 Constant *RHSC = dyn_cast<Constant>(Op1);
4463 if (!RHSC || !LHSI)
4464 return nullptr;
4465
4466 switch (LHSI->getOpcode()) {
4467 case Instruction::IntToPtr:
4468 // icmp pred inttoptr(X), null -> icmp pred X, null pointer value
4469 if (isa<ConstantPointerNull>(RHSC)) {
4470 Type *IntPtrTy = DL.getIntPtrType(RHSC->getType());
4471 if (IntPtrTy == LHSI->getOperand(0)->getType()) {
4472 APInt NullPtrValue =
4473 DL.getNullPtrValue(RHSC->getType()->getPointerAddressSpace());
4474 return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
4475 Constant::getIntegerValue(IntPtrTy, NullPtrValue));
4476 }
4477 }
4478 break;
4479
4480 case Instruction::Load:
4481 // Try to optimize things like "A[i] > 4" to index computations.
4482 if (GetElementPtrInst *GEP =
4484 if (Instruction *Res =
4486 return Res;
4487 break;
4488 }
4489
4490 return nullptr;
4491}
4492
4494 Value *RHS, const ICmpInst &I) {
4495 // Try to fold the comparison into the select arms, which will cause the
4496 // select to be converted into a logical and/or.
4497 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4498 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4499 return Res;
4500 if (std::optional<bool> Impl = isImpliedCondition(
4501 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4502 return ConstantInt::get(I.getType(), *Impl);
4503 return nullptr;
4504 };
4505
4506 ConstantInt *CI = nullptr;
4507 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4508 if (Op1)
4509 CI = dyn_cast<ConstantInt>(Op1);
4510
4511 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4512 if (Op2)
4513 CI = dyn_cast<ConstantInt>(Op2);
4514
4515 auto Simplifies = [&](Value *Op, unsigned Idx) {
4516 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4517 const APInt *Dummy;
4518 return Op ||
4519 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4520 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4521 };
4522
4523 // We only want to perform this transformation if it will not lead to
4524 // additional code. This is true if either both sides of the select
4525 // fold to a constant (in which case the icmp is replaced with a select
4526 // which will usually simplify) or this is the only user of the
4527 // select (in which case we are trading a select+icmp for a simpler
4528 // select+icmp) or all uses of the select can be replaced based on
4529 // dominance information ("Global cases").
4530 bool Transform = false;
4531 if (Op1 && Op2)
4532 Transform = true;
4533 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4534 // Local case
4535 if (SI->hasOneUse())
4536 Transform = true;
4537 // Global cases
4538 else if (CI && !CI->isZero())
4539 // When Op1 is constant try replacing select with second operand.
4540 // Otherwise Op2 is constant and try replacing select with first
4541 // operand.
4542 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4543 }
4544 if (Transform) {
4545 if (!Op1)
4546 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4547 if (!Op2)
4548 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4549 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4550 ProfcheckDisableMetadataFixes ? nullptr : SI);
4551 }
4552
4553 return nullptr;
4554}
4555
4556// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4557static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4558 unsigned Depth = 0) {
4559 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4560 return true;
4561 if (V->getType()->getScalarSizeInBits() == 1)
4562 return true;
4564 return false;
4565 Value *X;
4567 if (!I)
4568 return false;
4569 switch (I->getOpcode()) {
4570 case Instruction::ZExt:
4571 // ZExt(Mask) is a Mask.
4572 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4573 case Instruction::SExt:
4574 // SExt(Mask) is a Mask.
4575 // SExt(~Mask) is a ~Mask.
4576 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4577 case Instruction::And:
4578 case Instruction::Or:
4579 // Mask0 | Mask1 is a Mask.
4580 // Mask0 & Mask1 is a Mask.
4581 // ~Mask0 | ~Mask1 is a ~Mask.
4582 // ~Mask0 & ~Mask1 is a ~Mask.
4583 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4584 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4585 case Instruction::Xor:
4586 if (match(V, m_Not(m_Value(X))))
4587 return isMaskOrZero(X, !Not, Q, Depth);
4588
4589 // (X ^ -X) is a ~Mask
4590 if (Not)
4591 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4592 // (X ^ (X - 1)) is a Mask
4593 else
4594 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4595 case Instruction::Select:
4596 // c ? Mask0 : Mask1 is a Mask.
4597 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4598 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4599 case Instruction::Shl:
4600 // (~Mask) << X is a ~Mask.
4601 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4602 case Instruction::LShr:
4603 // Mask >> X is a Mask.
4604 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4605 case Instruction::AShr:
4606 // Mask s>> X is a Mask.
4607 // ~Mask s>> X is a ~Mask.
4608 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4609 case Instruction::Add:
4610 // Pow2 - 1 is a Mask.
4611 if (!Not && match(I->getOperand(1), m_AllOnes()))
4612 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4613 Q.AC, Q.CxtI, Q.DT, Depth);
4614 break;
4615 case Instruction::Sub:
4616 // -Pow2 is a ~Mask.
4617 if (Not && match(I->getOperand(0), m_Zero()))
4618 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4619 Q.AC, Q.CxtI, Q.DT, Depth);
4620 break;
4621 case Instruction::Call: {
4622 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4623 switch (II->getIntrinsicID()) {
4624 // min/max(Mask0, Mask1) is a Mask.
4625 // min/max(~Mask0, ~Mask1) is a ~Mask.
4626 case Intrinsic::umax:
4627 case Intrinsic::smax:
4628 case Intrinsic::umin:
4629 case Intrinsic::smin:
4630 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4631 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4632
4633 // In the context of masks, bitreverse(Mask) == ~Mask
4634 case Intrinsic::bitreverse:
4635 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4636 default:
4637 break;
4638 }
4639 }
4640 break;
4641 }
4642 default:
4643 break;
4644 }
4645 return false;
4646}
4647
4648/// Some comparisons can be simplified.
4649/// In this case, we are looking for comparisons that look like
4650/// a check for a lossy truncation.
4651/// Folds:
4652/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4653/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4654/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4655/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4656/// Where Mask is some pattern that produces all-ones in low bits:
4657/// (-1 >> y)
4658/// ((-1 << y) >> y) <- non-canonical, has extra uses
4659/// ~(-1 << y)
4660/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4661/// The Mask can be a constant, too.
4662/// For some predicates, the operands are commutative.
4663/// For others, x can only be on a specific side.
4665 Value *Op1, const SimplifyQuery &Q,
4666 InstCombiner &IC) {
4667
4668 ICmpInst::Predicate DstPred;
4669 switch (Pred) {
4671 // x & Mask == x
4672 // x & ~Mask == 0
4673 // ~x | Mask == -1
4674 // -> x u<= Mask
4675 // x & ~Mask == ~Mask
4676 // -> ~Mask u<= x
4678 break;
4680 // x & Mask != x
4681 // x & ~Mask != 0
4682 // ~x | Mask != -1
4683 // -> x u> Mask
4684 // x & ~Mask != ~Mask
4685 // -> ~Mask u> x
4687 break;
4689 // x & Mask u< x
4690 // -> x u> Mask
4691 // x & ~Mask u< ~Mask
4692 // -> ~Mask u> x
4694 break;
4696 // x & Mask u>= x
4697 // -> x u<= Mask
4698 // x & ~Mask u>= ~Mask
4699 // -> ~Mask u<= x
4701 break;
4703 // x & Mask s< x [iff Mask s>= 0]
4704 // -> x s> Mask
4705 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4706 // -> ~Mask s> x
4708 break;
4710 // x & Mask s>= x [iff Mask s>= 0]
4711 // -> x s<= Mask
4712 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4713 // -> ~Mask s<= x
4715 break;
4716 default:
4717 // We don't support sgt,sle
4718 // ult/ugt are simplified to true/false respectively.
4719 return nullptr;
4720 }
4721
4722 Value *X, *M;
4723 // Put search code in lambda for early positive returns.
4724 auto IsLowBitMask = [&]() {
4725 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4726 X = Op1;
4727 // Look for: x & Mask pred x
4728 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4729 return !ICmpInst::isSigned(Pred) ||
4730 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4731 }
4732
4733 // Look for: x & ~Mask pred ~Mask
4734 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4735 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4736 }
4737 return false;
4738 }
4739 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4740 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4741
4742 auto Check = [&]() {
4743 // Look for: ~x | Mask == -1
4744 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4745 if (Value *NotX =
4746 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4747 X = NotX;
4748 return true;
4749 }
4750 }
4751 return false;
4752 };
4753 if (Check())
4754 return true;
4755 std::swap(X, M);
4756 return Check();
4757 }
4758 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4759 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4760 auto Check = [&]() {
4761 // Look for: x & ~Mask == 0
4762 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4763 if (Value *NotM =
4764 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4765 M = NotM;
4766 return true;
4767 }
4768 }
4769 return false;
4770 };
4771 if (Check())
4772 return true;
4773 std::swap(X, M);
4774 return Check();
4775 }
4776 return false;
4777 };
4778
4779 if (!IsLowBitMask())
4780 return nullptr;
4781
4782 return IC.Builder.CreateICmp(DstPred, X, M);
4783}
4784
4785/// Some comparisons can be simplified.
4786/// In this case, we are looking for comparisons that look like
4787/// a check for a lossy signed truncation.
4788/// Folds: (MaskedBits is a constant.)
4789/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4790/// Into:
4791/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4792/// Where KeptBits = bitwidth(%x) - MaskedBits
4793static Value *
4795 InstCombiner::BuilderTy &Builder) {
4796 CmpPredicate SrcPred;
4797 Value *X;
4798 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4799 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4800 if (!match(&I, m_c_ICmp(SrcPred,
4802 m_APInt(C1))),
4803 m_Deferred(X))))
4804 return nullptr;
4805
4806 // Potential handling of non-splats: for each element:
4807 // * if both are undef, replace with constant 0.
4808 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4809 // * if both are not undef, and are different, bailout.
4810 // * else, only one is undef, then pick the non-undef one.
4811
4812 // The shift amount must be equal.
4813 if (*C0 != *C1)
4814 return nullptr;
4815 const APInt &MaskedBits = *C0;
4816 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4817
4818 ICmpInst::Predicate DstPred;
4819 switch (SrcPred) {
4821 // ((%x << MaskedBits) a>> MaskedBits) == %x
4822 // =>
4823 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4825 break;
4827 // ((%x << MaskedBits) a>> MaskedBits) != %x
4828 // =>
4829 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4831 break;
4832 // FIXME: are more folds possible?
4833 default:
4834 return nullptr;
4835 }
4836
4837 auto *XType = X->getType();
4838 const unsigned XBitWidth = XType->getScalarSizeInBits();
4839 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4840 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4841
4842 // KeptBits = bitwidth(%x) - MaskedBits
4843 const APInt KeptBits = BitWidth - MaskedBits;
4844 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4845 // ICmpCst = (1 << KeptBits)
4846 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4847 assert(ICmpCst.isPowerOf2());
4848 // AddCst = (1 << (KeptBits-1))
4849 const APInt AddCst = ICmpCst.lshr(1);
4850 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4851
4852 // T0 = add %x, AddCst
4853 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4854 // T1 = T0 DstPred ICmpCst
4855 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4856
4857 return T1;
4858}
4859
4860// Given pattern:
4861// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4862// we should move shifts to the same hand of 'and', i.e. rewrite as
4863// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4864// We are only interested in opposite logical shifts here.
4865// One of the shifts can be truncated.
4866// If we can, we want to end up creating 'lshr' shift.
4867static Value *
4869 InstCombiner::BuilderTy &Builder) {
4870 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4871 !I.getOperand(0)->hasOneUse())
4872 return nullptr;
4873
4874 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4875
4876 // Look for an 'and' of two logical shifts, one of which may be truncated.
4877 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4878 Instruction *XShift, *MaybeTruncation, *YShift;
4879 if (!match(
4880 I.getOperand(0),
4881 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4883 m_AnyLogicalShift, m_Instruction(YShift))),
4884 m_Instruction(MaybeTruncation)))))
4885 return nullptr;
4886
4887 // We potentially looked past 'trunc', but only when matching YShift,
4888 // therefore YShift must have the widest type.
4889 Instruction *WidestShift = YShift;
4890 // Therefore XShift must have the shallowest type.
4891 // Or they both have identical types if there was no truncation.
4892 Instruction *NarrowestShift = XShift;
4893
4894 Type *WidestTy = WidestShift->getType();
4895 Type *NarrowestTy = NarrowestShift->getType();
4896 assert(NarrowestTy == I.getOperand(0)->getType() &&
4897 "We did not look past any shifts while matching XShift though.");
4898 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4899
4900 // If YShift is a 'lshr', swap the shifts around.
4901 if (match(YShift, m_LShr(m_Value(), m_Value())))
4902 std::swap(XShift, YShift);
4903
4904 // The shifts must be in opposite directions.
4905 auto XShiftOpcode = XShift->getOpcode();
4906 if (XShiftOpcode == YShift->getOpcode())
4907 return nullptr; // Do not care about same-direction shifts here.
4908
4909 Value *X, *XShAmt, *Y, *YShAmt;
4910 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4911 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4912
4913 // If one of the values being shifted is a constant, then we will end with
4914 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4915 // however, we will need to ensure that we won't increase instruction count.
4916 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4917 // At least one of the hands of the 'and' should be one-use shift.
4918 if (!match(I.getOperand(0),
4919 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4920 return nullptr;
4921 if (HadTrunc) {
4922 // Due to the 'trunc', we will need to widen X. For that either the old
4923 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4924 if (!MaybeTruncation->hasOneUse() &&
4925 !NarrowestShift->getOperand(1)->hasOneUse())
4926 return nullptr;
4927 }
4928 }
4929
4930 // We have two shift amounts from two different shifts. The types of those
4931 // shift amounts may not match. If that's the case let's bailout now.
4932 if (XShAmt->getType() != YShAmt->getType())
4933 return nullptr;
4934
4935 // As input, we have the following pattern:
4936 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4937 // We want to rewrite that as:
4938 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4939 // While we know that originally (Q+K) would not overflow
4940 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4941 // shift amounts. so it may now overflow in smaller bitwidth.
4942 // To ensure that does not happen, we need to ensure that the total maximal
4943 // shift amount is still representable in that smaller bit width.
4944 unsigned MaximalPossibleTotalShiftAmount =
4945 (WidestTy->getScalarSizeInBits() - 1) +
4946 (NarrowestTy->getScalarSizeInBits() - 1);
4947 APInt MaximalRepresentableShiftAmount =
4949 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4950 return nullptr;
4951
4952 // Can we fold (XShAmt+YShAmt) ?
4953 auto *NewShAmt = dyn_cast_or_null<Constant>(
4954 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4955 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4956 if (!NewShAmt)
4957 return nullptr;
4958 if (NewShAmt->getType() != WidestTy) {
4959 NewShAmt =
4960 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4961 if (!NewShAmt)
4962 return nullptr;
4963 }
4964 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4965
4966 // Is the new shift amount smaller than the bit width?
4967 // FIXME: could also rely on ConstantRange.
4968 if (!match(NewShAmt,
4970 APInt(WidestBitWidth, WidestBitWidth))))
4971 return nullptr;
4972
4973 // An extra legality check is needed if we had trunc-of-lshr.
4974 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4975 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4976 WidestShift]() {
4977 // It isn't obvious whether it's worth it to analyze non-constants here.
4978 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4979 // If *any* of these preconditions matches we can perform the fold.
4980 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4981 ? NewShAmt->getSplatValue()
4982 : NewShAmt;
4983 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4984 if (NewShAmtSplat &&
4985 (NewShAmtSplat->isNullValue() ||
4986 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4987 return true;
4988 // We consider *min* leading zeros so a single outlier
4989 // blocks the transform as opposed to allowing it.
4990 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4992 unsigned MinLeadZero = Known.countMinLeadingZeros();
4993 // If the value being shifted has at most lowest bit set we can fold.
4994 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4995 if (MaxActiveBits <= 1)
4996 return true;
4997 // Precondition: NewShAmt u<= countLeadingZeros(C)
4998 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4999 return true;
5000 }
5001 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
5003 unsigned MinLeadZero = Known.countMinLeadingZeros();
5004 // If the value being shifted has at most lowest bit set we can fold.
5005 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
5006 if (MaxActiveBits <= 1)
5007 return true;
5008 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
5009 if (NewShAmtSplat) {
5010 APInt AdjNewShAmt =
5011 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
5012 if (AdjNewShAmt.ule(MinLeadZero))
5013 return true;
5014 }
5015 }
5016 return false; // Can't tell if it's ok.
5017 };
5018 if (!CanFold())
5019 return nullptr;
5020 }
5021
5022 // All good, we can do this fold.
5023 X = Builder.CreateZExt(X, WidestTy);
5024 Y = Builder.CreateZExt(Y, WidestTy);
5025 // The shift is the same that was for X.
5026 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
5027 ? Builder.CreateLShr(X, NewShAmt)
5028 : Builder.CreateShl(X, NewShAmt);
5029 Value *T1 = Builder.CreateAnd(T0, Y);
5030 return Builder.CreateICmp(I.getPredicate(), T1,
5031 Constant::getNullValue(WidestTy));
5032}
5033
5034/// Fold
5035/// (-1 u/ x) u< y
5036/// ((x * y) ?/ x) != y
5037/// to
5038/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
5039/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
5040/// will mean that we are looking for the opposite answer.
5042 CmpPredicate Pred;
5043 Value *X, *Y;
5045 Instruction *Div;
5046 bool NeedNegation;
5047 // Look for: (-1 u/ x) u</u>= y
5048 if (!I.isEquality() &&
5049 match(&I, m_c_ICmp(Pred,
5051 m_Instruction(Div)),
5052 m_Value(Y)))) {
5053 Mul = nullptr;
5054
5055 // Are we checking that overflow does not happen, or does happen?
5056 switch (Pred) {
5058 NeedNegation = false;
5059 break; // OK
5061 NeedNegation = true;
5062 break; // OK
5063 default:
5064 return nullptr; // Wrong predicate.
5065 }
5066 } else // Look for: ((x * y) / x) !=/== y
5067 if (I.isEquality() &&
5068 match(&I, m_c_ICmp(Pred, m_Value(Y),
5071 m_Value(X)),
5073 m_Deferred(X))),
5074 m_Instruction(Div))))) {
5075 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
5076 } else
5077 return nullptr;
5078
5080 // If the pattern included (x * y), we'll want to insert new instructions
5081 // right before that original multiplication so that we can replace it.
5082 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
5083 if (MulHadOtherUses)
5084 Builder.SetInsertPoint(Mul);
5085
5086 Value *Call = Builder.CreateIntrinsic(
5087 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
5088 : Intrinsic::smul_with_overflow,
5089 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
5090
5091 // If the multiplication was used elsewhere, to ensure that we don't leave
5092 // "duplicate" instructions, replace uses of that original multiplication
5093 // with the multiplication result from the with.overflow intrinsic.
5094 if (MulHadOtherUses)
5095 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
5096
5097 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
5098 if (NeedNegation) // This technically increases instruction count.
5099 Res = Builder.CreateNot(Res, "mul.not.ov");
5100
5101 // If we replaced the mul, erase it. Do this after all uses of Builder,
5102 // as the mul is used as insertion point.
5103 if (MulHadOtherUses)
5105
5106 return Res;
5107}
5108
5110 InstCombiner::BuilderTy &Builder) {
5111 CmpPredicate Pred;
5112 Value *X;
5113 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
5114
5115 if (ICmpInst::isSigned(Pred))
5116 Pred = ICmpInst::getSwappedPredicate(Pred);
5117 else if (ICmpInst::isUnsigned(Pred))
5118 Pred = ICmpInst::getSignedPredicate(Pred);
5119 // else for equality-comparisons just keep the predicate.
5120
5121 return ICmpInst::Create(Instruction::ICmp, Pred, X,
5122 Constant::getNullValue(X->getType()), I.getName());
5123 }
5124
5125 // A value is not equal to its negation unless that value is 0 or
5126 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
5127 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
5128 ICmpInst::isEquality(Pred)) {
5129 Type *Ty = X->getType();
5130 uint32_t BitWidth = Ty->getScalarSizeInBits();
5131 Constant *MaxSignedVal =
5132 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
5133 Value *And = Builder.CreateAnd(X, MaxSignedVal);
5134 Constant *Zero = Constant::getNullValue(Ty);
5135 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
5136 }
5137
5138 return nullptr;
5139}
5140
5142 InstCombinerImpl &IC) {
5143 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5144 // Normalize and operand as operand 0.
5145 CmpInst::Predicate Pred = I.getPredicate();
5146 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
5147 std::swap(Op0, Op1);
5148 Pred = ICmpInst::getSwappedPredicate(Pred);
5149 }
5150
5151 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5152 return nullptr;
5153
5154 // (icmp (X & Y) u< X --> (X & Y) != X
5155 if (Pred == ICmpInst::ICMP_ULT)
5156 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5157
5158 // (icmp (X & Y) u>= X --> (X & Y) == X
5159 if (Pred == ICmpInst::ICMP_UGE)
5160 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5161
5162 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5163 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5164 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5165 // so don't do this fold.
5166 if (!match(Op1, m_ImmConstant()))
5167 if (auto *NotOp1 =
5168 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5169 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5170 Constant::getAllOnesValue(Op1->getType()));
5171 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5172 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5173 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5174 Constant::getNullValue(Op1->getType()));
5175 }
5176
5177 if (!ICmpInst::isSigned(Pred))
5178 return nullptr;
5179
5180 KnownBits KnownY = IC.computeKnownBits(A, &I);
5181 // (X & NegY) spred X --> (X & NegY) upred X
5182 if (KnownY.isNegative())
5183 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5184
5185 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5186 return nullptr;
5187
5188 if (KnownY.isNonNegative())
5189 // (X & PosY) s<= X --> X s>= 0
5190 // (X & PosY) s> X --> X s< 0
5191 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5192 Constant::getNullValue(Op1->getType()));
5193
5195 // (NegX & Y) s<= NegX --> Y s< 0
5196 // (NegX & Y) s> NegX --> Y s>= 0
5198 Constant::getNullValue(A->getType()));
5199
5200 return nullptr;
5201}
5202
5204 InstCombinerImpl &IC) {
5205 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5206
5207 // Normalize or operand as operand 0.
5208 CmpInst::Predicate Pred = I.getPredicate();
5209 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5210 std::swap(Op0, Op1);
5211 Pred = ICmpInst::getSwappedPredicate(Pred);
5212 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5213 return nullptr;
5214 }
5215
5216 // icmp (X | Y) u<= X --> (X | Y) == X
5217 if (Pred == ICmpInst::ICMP_ULE)
5218 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5219
5220 // icmp (X | Y) u> X --> (X | Y) != X
5221 if (Pred == ICmpInst::ICMP_UGT)
5222 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5223
5224 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5225 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5226 if (Value *NotOp1 = IC.getFreelyInverted(
5227 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5228 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5229 Constant::getNullValue(Op1->getType()));
5230 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5231 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5232 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5233 Constant::getAllOnesValue(Op1->getType()));
5234 }
5235 return nullptr;
5236}
5237
5239 InstCombinerImpl &IC) {
5240 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5241 // Normalize xor operand as operand 0.
5242 CmpInst::Predicate Pred = I.getPredicate();
5243 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5244 std::swap(Op0, Op1);
5245 Pred = ICmpInst::getSwappedPredicate(Pred);
5246 }
5247 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5248 return nullptr;
5249
5250 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5251 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5252 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5253 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5255 if (PredOut != Pred && isKnownNonZero(A, Q))
5256 return new ICmpInst(PredOut, Op0, Op1);
5257
5258 // These transform work when A is negative.
5259 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5260 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5261 if (match(A, m_Negative())) {
5262 CmpInst::Predicate NewPred;
5263 switch (ICmpInst::getStrictPredicate(Pred)) {
5264 default:
5265 return nullptr;
5266 case ICmpInst::ICMP_SLT:
5267 case ICmpInst::ICMP_UGT:
5268 NewPred = ICmpInst::ICMP_SLT;
5269 break;
5270 case ICmpInst::ICMP_SGT:
5271 case ICmpInst::ICMP_ULT:
5272 NewPred = ICmpInst::ICMP_SGE;
5273 break;
5274 }
5275 Constant *Const = Constant::getNullValue(Op0->getType());
5276 return new ICmpInst(NewPred, Op0, Const);
5277 }
5278
5279 return nullptr;
5280}
5281
5282/// Return true if X is a multiple of C.
5283/// TODO: Handle non-power-of-2 factors.
5284static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5285 if (C.isOne())
5286 return true;
5287
5288 if (!C.isPowerOf2())
5289 return false;
5290
5291 return MaskedValueIsZero(X, C - 1, Q);
5292}
5293
5294/// Try to fold icmp (binop), X or icmp X, (binop).
5295/// TODO: A large part of this logic is duplicated in InstSimplify's
5296/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5297/// duplication.
5299 const SimplifyQuery &SQ) {
5300 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5301 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5302
5303 // Special logic for binary operators.
5306 if (!BO0 && !BO1)
5307 return nullptr;
5308
5309 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5310 return NewICmp;
5311
5312 const CmpInst::Predicate Pred = I.getPredicate();
5313 Value *X;
5314
5315 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5316 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5317 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5318 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5319 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5320 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5321 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5322 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5323 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5324
5325 {
5326 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5327 Constant *C;
5328 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5329 m_ImmConstant(C)))) &&
5330 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5332 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5333 }
5334 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5335 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5336 m_ImmConstant(C)))) &&
5337 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5339 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5340 }
5341 }
5342
5343 // (icmp eq/ne (X, -P2), INT_MIN)
5344 // -> (icmp slt/sge X, INT_MIN + P2)
5345 if (ICmpInst::isEquality(Pred) && BO0 &&
5346 match(I.getOperand(1), m_SignMask()) &&
5348 // Will Constant fold.
5349 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5350 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5352 BO0->getOperand(0), NewC);
5353 }
5354
5355 {
5356 // Similar to above: an unsigned overflow comparison may use offset + mask:
5357 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5358 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5359 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5360 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5361 BinaryOperator *BO;
5362 const APInt *C;
5363 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5364 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5366 CmpInst::Predicate NewPred =
5368 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5369 return new ICmpInst(NewPred, Op1, Zero);
5370 }
5371
5372 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5373 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5375 CmpInst::Predicate NewPred =
5377 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5378 return new ICmpInst(NewPred, Op0, Zero);
5379 }
5380 }
5381
5382 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5383 bool Op0HasNUW = false, Op1HasNUW = false;
5384 bool Op0HasNSW = false, Op1HasNSW = false;
5385 // Analyze the case when either Op0 or Op1 is an add instruction.
5386 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5387 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5388 bool &HasNSW, bool &HasNUW) -> bool {
5390 HasNUW = BO.hasNoUnsignedWrap();
5391 HasNSW = BO.hasNoSignedWrap();
5392 return ICmpInst::isEquality(Pred) ||
5393 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5394 (CmpInst::isSigned(Pred) && HasNSW);
5395 } else if (BO.getOpcode() == Instruction::Or) {
5396 HasNUW = true;
5397 HasNSW = true;
5398 return true;
5399 } else {
5400 return false;
5401 }
5402 };
5403 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5404
5405 if (BO0) {
5406 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5407 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5408 }
5409 if (BO1) {
5410 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5411 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5412 }
5413
5414 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5415 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5416 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5417 return new ICmpInst(Pred, A == Op1 ? B : A,
5418 Constant::getNullValue(Op1->getType()));
5419
5420 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5421 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5422 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5423 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5424 C == Op0 ? D : C);
5425
5426 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5427 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5428 NoOp1WrapProblem) {
5429 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5430 Value *Y, *Z;
5431 if (A == C) {
5432 // C + B == C + D -> B == D
5433 Y = B;
5434 Z = D;
5435 } else if (A == D) {
5436 // D + B == C + D -> B == C
5437 Y = B;
5438 Z = C;
5439 } else if (B == C) {
5440 // A + C == C + D -> A == D
5441 Y = A;
5442 Z = D;
5443 } else {
5444 assert(B == D);
5445 // A + D == C + D -> A == C
5446 Y = A;
5447 Z = C;
5448 }
5449 return new ICmpInst(Pred, Y, Z);
5450 }
5451
5452 if (ICmpInst::isRelational(Pred)) {
5453 // Return if both X and Y is divisible by Z/-Z.
5454 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5455 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5456 bool IsNegative) -> bool {
5457 const APInt *OffsetC;
5458 if (!match(Z, m_APInt(OffsetC)))
5459 return false;
5460
5461 // Fast path for Z == 1/-1.
5462 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5463 return true;
5464
5465 APInt C = *OffsetC;
5466 if (IsNegative)
5467 C.negate();
5468 // Note: -INT_MIN is also negative.
5469 if (!C.isStrictlyPositive())
5470 return false;
5471
5472 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5473 };
5474
5475 // TODO: The subtraction-related identities shown below also hold, but
5476 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5477 // wouldn't happen even if they were implemented.
5478 //
5479 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5480 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5481 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5482 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5483
5484 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5485 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5486 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5487 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5488 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5489 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5490 if (A && NoOp0WrapProblem &&
5491 ShareCommonDivisor(A, Op1, B,
5492 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5494 Op1);
5495
5496 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5497 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5498 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5499 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5500 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5501 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5502 if (C && NoOp1WrapProblem &&
5503 ShareCommonDivisor(Op0, C, D,
5504 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5506 C);
5507 }
5508
5509 // if C1 has greater magnitude than C2:
5510 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5511 // s.t. C3 = C1 - C2
5512 //
5513 // if C2 has greater magnitude than C1:
5514 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5515 // s.t. C3 = C2 - C1
5516 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5517 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5518 const APInt *AP1, *AP2;
5519 // TODO: Support non-uniform vectors.
5520 // TODO: Allow poison passthrough if B or D's element is poison.
5521 if (match(B, m_APIntAllowPoison(AP1)) &&
5522 match(D, m_APIntAllowPoison(AP2)) &&
5523 AP1->isNegative() == AP2->isNegative()) {
5524 APInt AP1Abs = AP1->abs();
5525 APInt AP2Abs = AP2->abs();
5526 if (AP1Abs.uge(AP2Abs)) {
5527 APInt Diff = *AP1 - *AP2;
5528 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5529 Value *NewAdd = Builder.CreateAdd(
5530 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5531 return new ICmpInst(Pred, NewAdd, C);
5532 } else {
5533 APInt Diff = *AP2 - *AP1;
5534 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5535 Value *NewAdd = Builder.CreateAdd(
5536 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5537 return new ICmpInst(Pred, A, NewAdd);
5538 }
5539 }
5540 Constant *Cst1, *Cst2;
5541 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5542 ICmpInst::isEquality(Pred)) {
5543 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5544 Value *NewAdd = Builder.CreateAdd(C, Diff);
5545 return new ICmpInst(Pred, A, NewAdd);
5546 }
5547 }
5548
5549 // Analyze the case when either Op0 or Op1 is a sub instruction.
5550 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5551 A = nullptr;
5552 B = nullptr;
5553 C = nullptr;
5554 D = nullptr;
5555 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5556 A = BO0->getOperand(0);
5557 B = BO0->getOperand(1);
5558 }
5559 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5560 C = BO1->getOperand(0);
5561 D = BO1->getOperand(1);
5562 }
5563
5564 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5565 if (A == Op1 && NoOp0WrapProblem)
5566 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5567 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5568 if (C == Op0 && NoOp1WrapProblem)
5569 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5570
5571 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5572 // (A - B) u>/u<= A --> B u>/u<= A
5573 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5574 return new ICmpInst(Pred, B, A);
5575 // C u</u>= (C - D) --> C u</u>= D
5576 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5577 return new ICmpInst(Pred, C, D);
5578 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5579 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5580 isKnownNonZero(B, Q))
5582 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5583 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5584 isKnownNonZero(D, Q))
5586
5587 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5588 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5589 return new ICmpInst(Pred, A, C);
5590
5591 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5592 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5593 return new ICmpInst(Pred, D, B);
5594
5595 // icmp (0-X) < cst --> x > -cst
5596 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5597 Value *X;
5598 if (match(BO0, m_Neg(m_Value(X))))
5599 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5600 if (RHSC->isNotMinSignedValue())
5601 return new ICmpInst(I.getSwappedPredicate(), X,
5602 ConstantExpr::getNeg(RHSC));
5603 }
5604
5605 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5606 return R;
5607 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5608 return R;
5609
5610 {
5611 // Try to remove shared multiplier from comparison:
5612 // X * Z pred Y * Z
5613 Value *X, *Y, *Z;
5614 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5615 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5616 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5617 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5618 if (ICmpInst::isSigned(Pred)) {
5619 if (Op0HasNSW && Op1HasNSW) {
5620 KnownBits ZKnown = computeKnownBits(Z, &I);
5621 if (ZKnown.isStrictlyPositive())
5622 return new ICmpInst(Pred, X, Y);
5623 if (ZKnown.isNegative())
5624 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5626 SQ.getWithInstruction(&I));
5627 if (LessThan && match(LessThan, m_One()))
5628 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5629 Constant::getNullValue(Z->getType()));
5630 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5631 SQ.getWithInstruction(&I));
5632 if (GreaterThan && match(GreaterThan, m_One()))
5633 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5634 }
5635 } else {
5636 bool NonZero;
5637 if (ICmpInst::isEquality(Pred)) {
5638 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5639 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5640 isKnownNonEqual(X, Y, SQ))
5641 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5642
5643 KnownBits ZKnown = computeKnownBits(Z, &I);
5644 // if Z % 2 != 0
5645 // X * Z eq/ne Y * Z -> X eq/ne Y
5646 if (ZKnown.countMaxTrailingZeros() == 0)
5647 return new ICmpInst(Pred, X, Y);
5648 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5649 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5650 // X * Z eq/ne Y * Z -> X eq/ne Y
5651 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5652 return new ICmpInst(Pred, X, Y);
5653 } else
5654 NonZero = isKnownNonZero(Z, Q);
5655
5656 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5657 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5658 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5659 return new ICmpInst(Pred, X, Y);
5660 }
5661 }
5662 }
5663
5664 BinaryOperator *SRem = nullptr;
5665 // icmp (srem X, Y), Y
5666 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5667 SRem = BO0;
5668 // icmp Y, (srem X, Y)
5669 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5670 Op0 == BO1->getOperand(1))
5671 SRem = BO1;
5672 if (SRem) {
5673 // We don't check hasOneUse to avoid increasing register pressure because
5674 // the value we use is the same value this instruction was already using.
5675 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5676 default:
5677 break;
5678 case ICmpInst::ICMP_EQ:
5679 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5680 case ICmpInst::ICMP_NE:
5681 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5682 case ICmpInst::ICMP_SGT:
5683 case ICmpInst::ICMP_SGE:
5684 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5686 case ICmpInst::ICMP_SLT:
5687 case ICmpInst::ICMP_SLE:
5688 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5690 }
5691 }
5692
5693 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5694 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5695 BO0->getOperand(1) == BO1->getOperand(1)) {
5696 switch (BO0->getOpcode()) {
5697 default:
5698 break;
5699 case Instruction::Add:
5700 case Instruction::Sub:
5701 case Instruction::Xor: {
5702 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5703 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5704
5705 const APInt *C;
5706 if (match(BO0->getOperand(1), m_APInt(C))) {
5707 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5708 if (C->isSignMask()) {
5709 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5710 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5711 }
5712
5713 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5714 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5715 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5716 NewPred = I.getSwappedPredicate(NewPred);
5717 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5718 }
5719 }
5720 break;
5721 }
5722 case Instruction::Mul: {
5723 if (!I.isEquality())
5724 break;
5725
5726 const APInt *C;
5727 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5728 !C->isOne()) {
5729 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5730 // Mask = -1 >> count-trailing-zeros(C).
5731 if (unsigned TZs = C->countr_zero()) {
5732 Constant *Mask = ConstantInt::get(
5733 BO0->getType(),
5734 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5735 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5736 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5737 return new ICmpInst(Pred, And1, And2);
5738 }
5739 }
5740 break;
5741 }
5742 case Instruction::UDiv:
5743 case Instruction::LShr:
5744 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5745 break;
5746 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5747
5748 case Instruction::SDiv:
5749 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5750 !BO0->isExact() || !BO1->isExact())
5751 break;
5752 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5753
5754 case Instruction::AShr:
5755 if (!BO0->isExact() || !BO1->isExact())
5756 break;
5757 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5758
5759 case Instruction::Shl: {
5760 bool NUW = Op0HasNUW && Op1HasNUW;
5761 bool NSW = Op0HasNSW && Op1HasNSW;
5762 if (!NUW && !NSW)
5763 break;
5764 if (!NSW && I.isSigned())
5765 break;
5766 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5767 }
5768 }
5769 }
5770
5771 if (BO0) {
5772 // Transform A & (L - 1) `ult` L --> L != 0
5773 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5774 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5775
5776 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5777 auto *Zero = Constant::getNullValue(BO0->getType());
5778 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5779 }
5780 }
5781
5782 // For unsigned predicates / eq / ne:
5783 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5784 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5785 if (!ICmpInst::isSigned(Pred)) {
5786 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5787 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5788 Constant::getNullValue(Op1->getType()));
5789 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5790 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5791 Constant::getNullValue(Op0->getType()), Op0);
5792 }
5793
5795 return replaceInstUsesWith(I, V);
5796
5797 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5798 return R;
5799
5801 return replaceInstUsesWith(I, V);
5802
5804 return replaceInstUsesWith(I, V);
5805
5806 return nullptr;
5807}
5808
5809/// Fold icmp Pred min|max(X, Y), Z.
5812 Value *Z, CmpPredicate Pred) {
5813 Value *X = MinMax->getLHS();
5814 Value *Y = MinMax->getRHS();
5815 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5816 return nullptr;
5817 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5818 // Revert the transform signed pred -> unsigned pred
5819 // TODO: We can flip the signedness of predicate if both operands of icmp
5820 // are negative.
5821 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5822 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5824 } else
5825 return nullptr;
5826 }
5827 SimplifyQuery Q = SQ.getWithInstruction(&I);
5828 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5829 if (!Val)
5830 return std::nullopt;
5831 if (match(Val, m_One()))
5832 return true;
5833 if (match(Val, m_Zero()))
5834 return false;
5835 return std::nullopt;
5836 };
5837 // Remove samesign here since it is illegal to keep it when we speculatively
5838 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5839 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5840 // -46, -32)`. `X` is allowed to be non-negative here.
5841 Pred = Pred.dropSameSign();
5842 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5843 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5844 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5845 return nullptr;
5846 if (!CmpXZ.has_value()) {
5847 std::swap(X, Y);
5848 std::swap(CmpXZ, CmpYZ);
5849 }
5850
5851 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5852 if (CmpYZ.has_value())
5853 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5854 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5855 };
5856
5857 switch (Pred) {
5858 case ICmpInst::ICMP_EQ:
5859 case ICmpInst::ICMP_NE: {
5860 // If X == Z:
5861 // Expr Result
5862 // min(X, Y) == Z X <= Y
5863 // max(X, Y) == Z X >= Y
5864 // min(X, Y) != Z X > Y
5865 // max(X, Y) != Z X < Y
5866 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5867 ICmpInst::Predicate NewPred =
5868 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5869 if (Pred == ICmpInst::ICMP_NE)
5870 NewPred = ICmpInst::getInversePredicate(NewPred);
5871 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5872 }
5873 // Otherwise (X != Z):
5874 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5875 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5876 if (!MinMaxCmpXZ.has_value()) {
5877 std::swap(X, Y);
5878 std::swap(CmpXZ, CmpYZ);
5879 // Re-check pre-condition X != Z
5880 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5881 break;
5882 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5883 }
5884 if (!MinMaxCmpXZ.has_value())
5885 break;
5886 if (*MinMaxCmpXZ) {
5887 // Expr Fact Result
5888 // min(X, Y) == Z X < Z false
5889 // max(X, Y) == Z X > Z false
5890 // min(X, Y) != Z X < Z true
5891 // max(X, Y) != Z X > Z true
5892 return replaceInstUsesWith(
5893 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5894 } else {
5895 // Expr Fact Result
5896 // min(X, Y) == Z X > Z Y == Z
5897 // max(X, Y) == Z X < Z Y == Z
5898 // min(X, Y) != Z X > Z Y != Z
5899 // max(X, Y) != Z X < Z Y != Z
5900 return FoldIntoCmpYZ();
5901 }
5902 break;
5903 }
5904 case ICmpInst::ICMP_SLT:
5905 case ICmpInst::ICMP_ULT:
5906 case ICmpInst::ICMP_SLE:
5907 case ICmpInst::ICMP_ULE:
5908 case ICmpInst::ICMP_SGT:
5909 case ICmpInst::ICMP_UGT:
5910 case ICmpInst::ICMP_SGE:
5911 case ICmpInst::ICMP_UGE: {
5912 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5913 if (*CmpXZ) {
5914 if (IsSame) {
5915 // Expr Fact Result
5916 // min(X, Y) < Z X < Z true
5917 // min(X, Y) <= Z X <= Z true
5918 // max(X, Y) > Z X > Z true
5919 // max(X, Y) >= Z X >= Z true
5920 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5921 } else {
5922 // Expr Fact Result
5923 // max(X, Y) < Z X < Z Y < Z
5924 // max(X, Y) <= Z X <= Z Y <= Z
5925 // min(X, Y) > Z X > Z Y > Z
5926 // min(X, Y) >= Z X >= Z Y >= Z
5927 return FoldIntoCmpYZ();
5928 }
5929 } else {
5930 if (IsSame) {
5931 // Expr Fact Result
5932 // min(X, Y) < Z X >= Z Y < Z
5933 // min(X, Y) <= Z X > Z Y <= Z
5934 // max(X, Y) > Z X <= Z Y > Z
5935 // max(X, Y) >= Z X < Z Y >= Z
5936 return FoldIntoCmpYZ();
5937 } else {
5938 // Expr Fact Result
5939 // max(X, Y) < Z X >= Z false
5940 // max(X, Y) <= Z X > Z false
5941 // min(X, Y) > Z X <= Z false
5942 // min(X, Y) >= Z X < Z false
5943 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5944 }
5945 }
5946 break;
5947 }
5948 default:
5949 break;
5950 }
5951
5952 return nullptr;
5953}
5954
5955/// Match and fold patterns like:
5956/// icmp eq/ne X, min(max(X, Lo), Hi)
5957/// which represents a range check and can be represented as a ConstantRange.
5958///
5959/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5960/// (X - Lo) u< (Hi + 1 - Lo)
5961/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5962/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5964 MinMaxIntrinsic *Min) {
5965 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5966 return nullptr;
5967
5968 const APInt *Lo = nullptr, *Hi = nullptr;
5969 if (Min->isSigned()) {
5970 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5971 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5972 return nullptr;
5973 } else {
5974 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5975 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5976 return nullptr;
5977 }
5978
5981 APInt C, Offset;
5982 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5983 CR.getEquivalentICmp(Pred, C, Offset);
5984 else
5985 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5986
5987 if (!Offset.isZero())
5988 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5989
5990 return replaceInstUsesWith(
5991 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5992}
5993
5994// Canonicalize checking for a power-of-2-or-zero value:
5996 InstCombiner::BuilderTy &Builder) {
5997 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5998 const CmpInst::Predicate Pred = I.getPredicate();
5999 Value *A = nullptr;
6000 bool CheckIs;
6001 if (I.isEquality()) {
6002 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
6003 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
6004 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
6005 m_Deferred(A)))) ||
6006 !match(Op1, m_ZeroInt()))
6007 A = nullptr;
6008
6009 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
6010 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
6011 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
6012 A = Op1;
6013 else if (match(Op1,
6015 A = Op0;
6016
6017 CheckIs = Pred == ICmpInst::ICMP_EQ;
6018 } else if (ICmpInst::isUnsigned(Pred)) {
6019 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
6020 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
6021
6022 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
6024 m_Specific(Op1))))) {
6025 A = Op1;
6026 CheckIs = Pred == ICmpInst::ICMP_UGE;
6027 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
6029 m_Specific(Op0))))) {
6030 A = Op0;
6031 CheckIs = Pred == ICmpInst::ICMP_ULE;
6032 }
6033 }
6034
6035 if (A) {
6036 Type *Ty = A->getType();
6037 Value *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
6038 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
6039 ConstantInt::get(Ty, 2))
6040 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
6041 ConstantInt::get(Ty, 1));
6042 }
6043
6044 return nullptr;
6045}
6046
6047/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
6048using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
6050 bool AllowRecursion) {
6052 if (!Inst || !Inst->hasOneUse())
6053 return;
6054
6055 switch (Inst->getOpcode()) {
6056 case Instruction::Add:
6057 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
6058 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
6059 break;
6060 case Instruction::Sub:
6061 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
6062 break;
6063 case Instruction::Xor:
6064 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
6065 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
6066 break;
6067 case Instruction::Shl:
6068 if (Inst->hasNoSignedWrap())
6069 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
6070 if (Inst->hasNoUnsignedWrap())
6071 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
6072 break;
6073 case Instruction::Select:
6074 if (AllowRecursion) {
6075 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
6076 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
6077 }
6078 break;
6079 default:
6080 break;
6081 }
6082}
6083
6085
6090
6092 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
6093 }
6095 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
6096 }
6097 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
6099 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
6100 }
6101 bool isValid() const { return Kind != OffsetKind::Invalid; }
6103 switch (Kind) {
6105 llvm_unreachable("Invalid offset result");
6106 case OffsetKind::Value:
6107 return V0;
6108 case OffsetKind::Select:
6109 return Builder.CreateSelect(
6110 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
6111 }
6112 llvm_unreachable("Unknown OffsetKind enum");
6113 }
6114};
6115
6116/// Offset both sides of an equality icmp to see if we can save some
6117/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
6118/// Note: This operation should not introduce poison.
6120 InstCombiner::BuilderTy &Builder,
6121 const SimplifyQuery &SQ) {
6122 assert(I.isEquality() && "Expected an equality icmp");
6123 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6124 if (!Op0->getType()->isIntOrIntVectorTy())
6125 return nullptr;
6126
6127 SmallVector<OffsetOp, 4> OffsetOps;
6128 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
6129 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
6130
6131 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
6132 switch (BinOpc) {
6133 // V = shl nsw X, RHS => X = ashr V, RHS
6134 case Instruction::AShr: {
6135 const APInt *CV, *CRHS;
6136 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6137 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
6139 return nullptr;
6140 break;
6141 }
6142 // V = shl nuw X, RHS => X = lshr V, RHS
6143 case Instruction::LShr: {
6144 const APInt *CV, *CRHS;
6145 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6146 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
6148 return nullptr;
6149 break;
6150 }
6151 default:
6152 break;
6153 }
6154
6155 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6156 if (!Simplified)
6157 return nullptr;
6158 // Reject constant expressions as they don't simplify things.
6159 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6160 return nullptr;
6161 // Check if the transformation introduces poison.
6162 return impliesPoison(RHS, V) ? Simplified : nullptr;
6163 };
6164
6165 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6166 Value *RHS) -> OffsetResult {
6167 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6168 if (!Sel->hasOneUse())
6169 return OffsetResult::invalid();
6170 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6171 if (!TrueVal)
6172 return OffsetResult::invalid();
6173 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6174 if (!FalseVal)
6175 return OffsetResult::invalid();
6176 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6177 }
6178 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6179 return OffsetResult::value(Simplified);
6180 return OffsetResult::invalid();
6181 };
6182
6183 for (auto [BinOp, RHS] : OffsetOps) {
6184 auto BinOpc = static_cast<unsigned>(BinOp);
6185
6186 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6187 if (!Op0Result.isValid())
6188 continue;
6189 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6190 if (!Op1Result.isValid())
6191 continue;
6192
6193 Value *NewLHS = Op0Result.materialize(Builder);
6194 Value *NewRHS = Op1Result.materialize(Builder);
6195 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6196 }
6197
6198 return nullptr;
6199}
6200
6202 if (!I.isEquality())
6203 return nullptr;
6204
6205 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6206 const CmpInst::Predicate Pred = I.getPredicate();
6207 Value *A, *B, *C, *D;
6208 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6209 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6210 Value *OtherVal = A == Op1 ? B : A;
6211 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6212 }
6213
6214 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6215 // A^c1 == C^c2 --> A == C^(c1^c2)
6216 ConstantInt *C1, *C2;
6217 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6218 Op1->hasOneUse()) {
6219 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6220 Value *Xor = Builder.CreateXor(C, NC);
6221 return new ICmpInst(Pred, A, Xor);
6222 }
6223
6224 // A^B == A^D -> B == D
6225 if (A == C)
6226 return new ICmpInst(Pred, B, D);
6227 if (A == D)
6228 return new ICmpInst(Pred, B, C);
6229 if (B == C)
6230 return new ICmpInst(Pred, A, D);
6231 if (B == D)
6232 return new ICmpInst(Pred, A, C);
6233 }
6234 }
6235
6236 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6237 // A == (A^B) -> B == 0
6238 Value *OtherVal = A == Op0 ? B : A;
6239 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6240 }
6241
6242 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6243 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6244 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6245 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6246
6247 if (A == C) {
6248 X = B;
6249 Y = D;
6250 Z = A;
6251 } else if (A == D) {
6252 X = B;
6253 Y = C;
6254 Z = A;
6255 } else if (B == C) {
6256 X = A;
6257 Y = D;
6258 Z = B;
6259 } else if (B == D) {
6260 X = A;
6261 Y = C;
6262 Z = B;
6263 }
6264
6265 if (X) {
6266 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6267 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6268 // instructions.
6269 const APInt *C0, *C1;
6270 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6271 (*C0 ^ *C1).isNegatedPowerOf2();
6272
6273 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6274 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6275 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6276 int UseCnt =
6277 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6278 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6279 if (XorIsNegP2 || UseCnt >= 2) {
6280 // Build (X^Y) & Z
6281 Op1 = Builder.CreateXor(X, Y);
6282 Op1 = Builder.CreateAnd(Op1, Z);
6283 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6284 }
6285 }
6286 }
6287
6288 {
6289 // Similar to above, but specialized for constant because invert is needed:
6290 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6291 Value *X, *Y;
6292 Constant *C;
6293 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6294 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6295 Value *Xor = Builder.CreateXor(X, Y);
6296 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6297 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6298 }
6299 }
6300
6301 if (match(Op1, m_ZExt(m_Value(A))) &&
6302 (Op0->hasOneUse() || Op1->hasOneUse())) {
6303 // (B & (Pow2C-1)) == zext A --> A == trunc B
6304 // (B & (Pow2C-1)) != zext A --> A != trunc B
6305 const APInt *MaskC;
6306 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6307 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6308 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6309 }
6310
6311 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6312 // For lshr and ashr pairs.
6313 const APInt *AP1, *AP2;
6314 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6315 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6316 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6317 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6318 if (*AP1 != *AP2)
6319 return nullptr;
6320 unsigned TypeBits = AP1->getBitWidth();
6321 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6322 if (ShAmt < TypeBits && ShAmt != 0) {
6323 ICmpInst::Predicate NewPred =
6325 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6326 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6327 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6328 }
6329 }
6330
6331 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6332 ConstantInt *Cst1;
6333 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6334 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6335 unsigned TypeBits = Cst1->getBitWidth();
6336 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6337 if (ShAmt < TypeBits && ShAmt != 0) {
6338 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6339 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6340 Value *And =
6341 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6342 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6343 }
6344 }
6345
6346 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6347 // "icmp (and X, mask), cst"
6348 uint64_t ShAmt = 0;
6349 if (Op0->hasOneUse() &&
6350 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6351 match(Op1, m_ConstantInt(Cst1)) &&
6352 // Only do this when A has multiple uses. This is most important to do
6353 // when it exposes other optimizations.
6354 !A->hasOneUse()) {
6355 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6356
6357 if (ShAmt < ASize) {
6358 APInt MaskV =
6360 MaskV <<= ShAmt;
6361
6362 APInt CmpV = Cst1->getValue().zext(ASize);
6363 CmpV <<= ShAmt;
6364
6365 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6366 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6367 }
6368 }
6369
6371 return ICmp;
6372
6373 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6374 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6375 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6376 // few steps of instcombine.
6377 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6378 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6380 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6381 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6383 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6384 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6386 Add, ConstantInt::get(A->getType(), C.shl(1)));
6387 }
6388
6389 // Canonicalize:
6390 // Assume B_Pow2 != 0
6391 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6392 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6393 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6394 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6395 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6397
6398 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6399 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6400 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6401 ConstantInt::getNullValue(Op1->getType()));
6402
6403 // Canonicalize:
6404 // icmp eq/ne X, OneUse(rotate-right(X))
6405 // -> icmp eq/ne X, rotate-left(X)
6406 // We generally try to convert rotate-right -> rotate-left, this just
6407 // canonicalizes another case.
6408 if (match(&I, m_c_ICmp(m_Value(A),
6410 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6411 return new ICmpInst(
6412 Pred, A,
6413 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6414
6415 // Canonicalize:
6416 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6417 Constant *Cst;
6420 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6421
6422 {
6423 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6424 auto m_Matcher =
6427 m_Sub(m_Value(B), m_Deferred(A)));
6428 std::optional<bool> IsZero = std::nullopt;
6429 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6430 m_Deferred(A))))
6431 IsZero = false;
6432 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6433 else if (match(&I,
6434 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6435 IsZero = true;
6436
6437 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6438 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6439 // -> (icmp eq/ne (and X, P2), 0)
6440 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6441 // -> (icmp eq/ne (and X, P2), P2)
6442 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6443 *IsZero ? A
6444 : ConstantInt::getNullValue(A->getType()));
6445 }
6446
6447 if (auto *Res = foldICmpEqualityWithOffset(
6448 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6449 return Res;
6450
6451 return nullptr;
6452}
6453
6455 ICmpInst::Predicate Pred = ICmp.getPredicate();
6456 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6457
6458 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6459 // The trunc masks high bits while the compare may effectively mask low bits.
6460 Value *X;
6461 const APInt *C;
6462 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6463 return nullptr;
6464
6465 // This matches patterns corresponding to tests of the signbit as well as:
6466 // (trunc X) pred C2 --> (X & Mask) == C
6467 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6468 /*AllowNonZeroC=*/true)) {
6469 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6470 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6471 return new ICmpInst(Res->Pred, And, C);
6472 }
6473
6474 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6475 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6476 if (II->getIntrinsicID() == Intrinsic::cttz ||
6477 II->getIntrinsicID() == Intrinsic::ctlz) {
6478 unsigned MaxRet = SrcBits;
6479 // If the "is_zero_poison" argument is set, then we know at least
6480 // one bit is set in the input, so the result is always at least one
6481 // less than the full bitwidth of that input.
6482 if (match(II->getArgOperand(1), m_One()))
6483 MaxRet--;
6484
6485 // Make sure the destination is wide enough to hold the largest output of
6486 // the intrinsic.
6487 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6488 if (Instruction *I =
6489 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6490 return I;
6491 }
6492 }
6493
6494 return nullptr;
6495}
6496
6498 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6499 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6500 Value *X;
6501 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6502 return nullptr;
6503
6504 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6505 bool IsSignedCmp = ICmp.isSigned();
6506
6507 // icmp Pred (ext X), (ext Y)
6508 Value *Y;
6509 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6510 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6511 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6512
6513 if (IsZext0 != IsZext1) {
6514 // If X and Y and both i1
6515 // (icmp eq/ne (zext X) (sext Y))
6516 // eq -> (icmp eq (or X, Y), 0)
6517 // ne -> (icmp ne (or X, Y), 0)
6518 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6519 Y->getType()->isIntOrIntVectorTy(1))
6520 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6521 Constant::getNullValue(X->getType()));
6522
6523 // If we have mismatched casts and zext has the nneg flag, we can
6524 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6525
6526 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6527 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6528
6529 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6530 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6531
6532 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6533 IsSignedExt = true;
6534 else
6535 return nullptr;
6536 }
6537
6538 // Not an extension from the same type?
6539 Type *XTy = X->getType(), *YTy = Y->getType();
6540 if (XTy != YTy) {
6541 // One of the casts must have one use because we are creating a new cast.
6542 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6543 return nullptr;
6544 // Extend the narrower operand to the type of the wider operand.
6545 CastInst::CastOps CastOpcode =
6546 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6547 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6548 X = Builder.CreateCast(CastOpcode, X, YTy);
6549 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6550 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6551 else
6552 return nullptr;
6553 }
6554
6555 // (zext X) == (zext Y) --> X == Y
6556 // (sext X) == (sext Y) --> X == Y
6557 if (ICmp.isEquality())
6558 return new ICmpInst(ICmp.getPredicate(), X, Y);
6559
6560 // A signed comparison of sign extended values simplifies into a
6561 // signed comparison.
6562 if (IsSignedCmp && IsSignedExt)
6563 return new ICmpInst(ICmp.getPredicate(), X, Y);
6564
6565 // The other three cases all fold into an unsigned comparison.
6566 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6567 }
6568
6569 // Below here, we are only folding a compare with constant.
6570 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6571 if (!C)
6572 return nullptr;
6573
6574 // If a lossless truncate is possible...
6575 Type *SrcTy = CastOp0->getSrcTy();
6576 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6577 if (Res) {
6578 if (ICmp.isEquality())
6579 return new ICmpInst(ICmp.getPredicate(), X, Res);
6580
6581 // A signed comparison of sign extended values simplifies into a
6582 // signed comparison.
6583 if (IsSignedExt && IsSignedCmp)
6584 return new ICmpInst(ICmp.getPredicate(), X, Res);
6585
6586 // The other three cases all fold into an unsigned comparison.
6587 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6588 }
6589
6590 // The re-extended constant changed, partly changed (in the case of a vector),
6591 // or could not be determined to be equal (in the case of a constant
6592 // expression), so the constant cannot be represented in the shorter type.
6593 // All the cases that fold to true or false will have already been handled
6594 // by simplifyICmpInst, so only deal with the tricky case.
6595 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6596 return nullptr;
6597
6598 // Is source op positive?
6599 // icmp ult (sext X), C --> icmp sgt X, -1
6600 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6602
6603 // Is source op negative?
6604 // icmp ugt (sext X), C --> icmp slt X, 0
6605 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6607}
6608
6609/// Handle icmp (cast x), (cast or constant).
6611 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6612 // icmp compares only pointer's value.
6613 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6614 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6615 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6616 if (SimplifiedOp0 || SimplifiedOp1)
6617 return new ICmpInst(ICmp.getPredicate(),
6618 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6619 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6620
6621 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6622 Value *Op1 = ICmp.getOperand(1);
6623 if (!CastOp0)
6624 return nullptr;
6625 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6626 return nullptr;
6627
6628 Value *Op0Src = CastOp0->getOperand(0);
6629 Type *SrcTy = CastOp0->getSrcTy();
6630 Type *DestTy = CastOp0->getDestTy();
6631
6632 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6633 // integer type is the same size as the pointer type.
6634 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6635 unsigned IntWidth = IntTy->getScalarType()->getIntegerBitWidth();
6636 unsigned IndexWidth = DL.getAddressSizeInBits(PtrTy);
6637 unsigned PtrWidth = DL.getPointerTypeSizeInBits(PtrTy);
6638 // For ptrtoint/inttoptr, we must check that IntWidth == IndexWidth and also
6639 // IndexWidth == PtrWidth to (not) handle non-integral pointers.
6640 return IntWidth == IndexWidth && IndexWidth == PtrWidth;
6641 };
6642 if (isa<PtrToIntInst, PtrToAddrInst>(CastOp0)) {
6643 bool HasPtrToInt = isa<PtrToIntInst>(CastOp0);
6644 Value *NewOp1 = nullptr;
6645 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(Op1)) {
6646 NewOp1 = PtrToIntOp1->getOperand(0);
6647 HasPtrToInt = true;
6648 } else if (auto *PtrToAddrOp1 = dyn_cast<PtrToAddrOperator>(Op1)) {
6649 NewOp1 = PtrToAddrOp1->getOperand(0);
6650 } else if (auto *RHSC = dyn_cast<Constant>(Op1)) {
6651 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6652 }
6653
6654 // For ptrtoaddr, IntWidth == IndexWidth is implied and we don't need to
6655 // check PtrWidth.
6656 if ((!HasPtrToInt || CompatibleSizes(SrcTy, DestTy)) &&
6657 (NewOp1 && NewOp1->getType() == Op0Src->getType()))
6658 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6659 }
6660
6661 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6662 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6663 CompatibleSizes(DestTy, SrcTy)) {
6664 Value *NewOp1 = nullptr;
6665 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(Op1)) {
6666 Value *IntSrc = IntToPtrOp1->getOperand(0);
6667 if (IntSrc->getType() == Op0Src->getType())
6668 NewOp1 = IntToPtrOp1->getOperand(0);
6669 } else if (auto *RHSC = dyn_cast<Constant>(Op1)) {
6670 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6671 }
6672
6673 if (NewOp1)
6674 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6675 }
6676
6677 if (Instruction *R = foldICmpWithTrunc(ICmp))
6678 return R;
6679
6680 return foldICmpWithZextOrSext(ICmp);
6681}
6682
6684 bool IsSigned) {
6685 switch (BinaryOp) {
6686 default:
6687 llvm_unreachable("Unsupported binary op");
6688 case Instruction::Add:
6689 case Instruction::Sub:
6690 return match(RHS, m_Zero());
6691 case Instruction::Mul:
6692 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6693 match(RHS, m_One());
6694 }
6695}
6696
6699 bool IsSigned, Value *LHS, Value *RHS,
6700 Instruction *CxtI) const {
6701 switch (BinaryOp) {
6702 default:
6703 llvm_unreachable("Unsupported binary op");
6704 case Instruction::Add:
6705 if (IsSigned)
6706 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6707 else
6708 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6709 case Instruction::Sub:
6710 if (IsSigned)
6711 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6712 else
6713 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6714 case Instruction::Mul:
6715 if (IsSigned)
6716 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6717 else
6718 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6719 }
6720}
6721
6722bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6723 bool IsSigned, Value *LHS,
6724 Value *RHS, Instruction &OrigI,
6725 Value *&Result,
6726 Constant *&Overflow) {
6727 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6728 std::swap(LHS, RHS);
6729
6730 // If the overflow check was an add followed by a compare, the insertion point
6731 // may be pointing to the compare. We want to insert the new instructions
6732 // before the add in case there are uses of the add between the add and the
6733 // compare.
6734 Builder.SetInsertPoint(&OrigI);
6735
6736 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6737 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6738 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6739
6740 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6741 Result = LHS;
6742 Overflow = ConstantInt::getFalse(OverflowTy);
6743 return true;
6744 }
6745
6746 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6748 return false;
6751 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6752 Result->takeName(&OrigI);
6753 Overflow = ConstantInt::getTrue(OverflowTy);
6754 return true;
6756 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6757 Result->takeName(&OrigI);
6758 Overflow = ConstantInt::getFalse(OverflowTy);
6759 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6760 if (IsSigned)
6761 Inst->setHasNoSignedWrap();
6762 else
6763 Inst->setHasNoUnsignedWrap();
6764 }
6765 return true;
6766 }
6767
6768 llvm_unreachable("Unexpected overflow result");
6769}
6770
6771/// Recognize and process idiom involving test for multiplication
6772/// overflow.
6773///
6774/// The caller has matched a pattern of the form:
6775/// I = cmp u (mul(zext A, zext B), V
6776/// The function checks if this is a test for overflow and if so replaces
6777/// multiplication with call to 'mul.with.overflow' intrinsic.
6778///
6779/// \param I Compare instruction.
6780/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6781/// the compare instruction. Must be of integer type.
6782/// \param OtherVal The other argument of compare instruction.
6783/// \returns Instruction which must replace the compare instruction, NULL if no
6784/// replacement required.
6786 const APInt *OtherVal,
6787 InstCombinerImpl &IC) {
6788 // Don't bother doing this transformation for pointers, don't do it for
6789 // vectors.
6790 if (!isa<IntegerType>(MulVal->getType()))
6791 return nullptr;
6792
6793 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6794 if (!MulInstr)
6795 return nullptr;
6796 assert(MulInstr->getOpcode() == Instruction::Mul);
6797
6798 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6799 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6800 assert(LHS->getOpcode() == Instruction::ZExt);
6801 assert(RHS->getOpcode() == Instruction::ZExt);
6802 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6803
6804 // Calculate type and width of the result produced by mul.with.overflow.
6805 Type *TyA = A->getType(), *TyB = B->getType();
6806 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6807 WidthB = TyB->getPrimitiveSizeInBits();
6808 unsigned MulWidth;
6809 Type *MulType;
6810 if (WidthB > WidthA) {
6811 MulWidth = WidthB;
6812 MulType = TyB;
6813 } else {
6814 MulWidth = WidthA;
6815 MulType = TyA;
6816 }
6817
6818 // In order to replace the original mul with a narrower mul.with.overflow,
6819 // all uses must ignore upper bits of the product. The number of used low
6820 // bits must be not greater than the width of mul.with.overflow.
6821 if (MulVal->hasNUsesOrMore(2))
6822 for (User *U : MulVal->users()) {
6823 if (U == &I)
6824 continue;
6825 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6826 // Check if truncation ignores bits above MulWidth.
6827 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6828 if (TruncWidth > MulWidth)
6829 return nullptr;
6830 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6831 // Check if AND ignores bits above MulWidth.
6832 if (BO->getOpcode() != Instruction::And)
6833 return nullptr;
6834 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6835 const APInt &CVal = CI->getValue();
6836 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6837 return nullptr;
6838 } else {
6839 // In this case we could have the operand of the binary operation
6840 // being defined in another block, and performing the replacement
6841 // could break the dominance relation.
6842 return nullptr;
6843 }
6844 } else {
6845 // Other uses prohibit this transformation.
6846 return nullptr;
6847 }
6848 }
6849
6850 // Recognize patterns
6851 switch (I.getPredicate()) {
6852 case ICmpInst::ICMP_UGT: {
6853 // Recognize pattern:
6854 // mulval = mul(zext A, zext B)
6855 // cmp ugt mulval, max
6856 APInt MaxVal = APInt::getMaxValue(MulWidth);
6857 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6858 if (MaxVal.eq(*OtherVal))
6859 break; // Recognized
6860 return nullptr;
6861 }
6862
6863 case ICmpInst::ICMP_ULT: {
6864 // Recognize pattern:
6865 // mulval = mul(zext A, zext B)
6866 // cmp ule mulval, max + 1
6867 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6868 if (MaxVal.eq(*OtherVal))
6869 break; // Recognized
6870 return nullptr;
6871 }
6872
6873 default:
6874 return nullptr;
6875 }
6876
6877 InstCombiner::BuilderTy &Builder = IC.Builder;
6878 Builder.SetInsertPoint(MulInstr);
6879
6880 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6881 Value *MulA = A, *MulB = B;
6882 if (WidthA < MulWidth)
6883 MulA = Builder.CreateZExt(A, MulType);
6884 if (WidthB < MulWidth)
6885 MulB = Builder.CreateZExt(B, MulType);
6886 Value *Call =
6887 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6888 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6889 IC.addToWorklist(MulInstr);
6890
6891 // If there are uses of mul result other than the comparison, we know that
6892 // they are truncation or binary AND. Change them to use result of
6893 // mul.with.overflow and adjust properly mask/size.
6894 if (MulVal->hasNUsesOrMore(2)) {
6895 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6896 for (User *U : make_early_inc_range(MulVal->users())) {
6897 if (U == &I)
6898 continue;
6899 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6900 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6901 IC.replaceInstUsesWith(*TI, Mul);
6902 else
6903 TI->setOperand(0, Mul);
6904 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6905 assert(BO->getOpcode() == Instruction::And);
6906 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6907 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6908 APInt ShortMask = CI->getValue().trunc(MulWidth);
6909 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6910 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6911 IC.replaceInstUsesWith(*BO, Zext);
6912 } else {
6913 llvm_unreachable("Unexpected Binary operation");
6914 }
6916 }
6917 }
6918
6919 // The original icmp gets replaced with the overflow value, maybe inverted
6920 // depending on predicate.
6921 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6922 Value *Res = Builder.CreateExtractValue(Call, 1);
6923 return BinaryOperator::CreateNot(Res);
6924 }
6925
6926 return ExtractValueInst::Create(Call, 1);
6927}
6928
6929/// When performing a comparison against a constant, it is possible that not all
6930/// the bits in the LHS are demanded. This helper method computes the mask that
6931/// IS demanded.
6933 const APInt *RHS;
6934 if (!match(I.getOperand(1), m_APInt(RHS)))
6936
6937 // If this is a normal comparison, it demands all bits. If it is a sign bit
6938 // comparison, it only demands the sign bit.
6939 bool UnusedBit;
6940 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6942
6943 switch (I.getPredicate()) {
6944 // For a UGT comparison, we don't care about any bits that
6945 // correspond to the trailing ones of the comparand. The value of these
6946 // bits doesn't impact the outcome of the comparison, because any value
6947 // greater than the RHS must differ in a bit higher than these due to carry.
6948 case ICmpInst::ICMP_UGT:
6949 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6950
6951 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6952 // Any value less than the RHS must differ in a higher bit because of carries.
6953 case ICmpInst::ICMP_ULT:
6954 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6955
6956 default:
6958 }
6959}
6960
6961/// Check that one use is in the same block as the definition and all
6962/// other uses are in blocks dominated by a given block.
6963///
6964/// \param DI Definition
6965/// \param UI Use
6966/// \param DB Block that must dominate all uses of \p DI outside
6967/// the parent block
6968/// \return true when \p UI is the only use of \p DI in the parent block
6969/// and all other uses of \p DI are in blocks dominated by \p DB.
6970///
6972 const Instruction *UI,
6973 const BasicBlock *DB) const {
6974 assert(DI && UI && "Instruction not defined\n");
6975 // Ignore incomplete definitions.
6976 if (!DI->getParent())
6977 return false;
6978 // DI and UI must be in the same block.
6979 if (DI->getParent() != UI->getParent())
6980 return false;
6981 // Protect from self-referencing blocks.
6982 if (DI->getParent() == DB)
6983 return false;
6984 for (const User *U : DI->users()) {
6985 auto *Usr = cast<Instruction>(U);
6986 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6987 return false;
6988 }
6989 return true;
6990}
6991
6992/// Return true when the instruction sequence within a block is select-cmp-br.
6994 const BasicBlock *BB = SI->getParent();
6995 if (!BB)
6996 return false;
6998 if (!BI)
6999 return false;
7000 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
7001 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
7002 return false;
7003 return true;
7004}
7005
7006/// True when a select result is replaced by one of its operands
7007/// in select-icmp sequence. This will eventually result in the elimination
7008/// of the select.
7009///
7010/// \param SI Select instruction
7011/// \param Icmp Compare instruction
7012/// \param SIOpd Operand that replaces the select
7013///
7014/// Notes:
7015/// - The replacement is global and requires dominator information
7016/// - The caller is responsible for the actual replacement
7017///
7018/// Example:
7019///
7020/// entry:
7021/// %4 = select i1 %3, %C* %0, %C* null
7022/// %5 = icmp eq %C* %4, null
7023/// br i1 %5, label %9, label %7
7024/// ...
7025/// ; <label>:7 ; preds = %entry
7026/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
7027/// ...
7028///
7029/// can be transformed to
7030///
7031/// %5 = icmp eq %C* %0, null
7032/// %6 = select i1 %3, i1 %5, i1 true
7033/// br i1 %6, label %9, label %7
7034/// ...
7035/// ; <label>:7 ; preds = %entry
7036/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
7037///
7038/// Similar when the first operand of the select is a constant or/and
7039/// the compare is for not equal rather than equal.
7040///
7041/// NOTE: The function is only called when the select and compare constants
7042/// are equal, the optimization can work only for EQ predicates. This is not a
7043/// major restriction since a NE compare should be 'normalized' to an equal
7044/// compare, which usually happens in the combiner and test case
7045/// select-cmp-br.ll checks for it.
7047 const ICmpInst *Icmp,
7048 const unsigned SIOpd) {
7049 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
7051 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
7052 // The check for the single predecessor is not the best that can be
7053 // done. But it protects efficiently against cases like when SI's
7054 // home block has two successors, Succ and Succ1, and Succ1 predecessor
7055 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
7056 // replaced can be reached on either path. So the uniqueness check
7057 // guarantees that the path all uses of SI (outside SI's parent) are on
7058 // is disjoint from all other paths out of SI. But that information
7059 // is more expensive to compute, and the trade-off here is in favor
7060 // of compile-time. It should also be noticed that we check for a single
7061 // predecessor and not only uniqueness. This to handle the situation when
7062 // Succ and Succ1 points to the same basic block.
7063 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
7064 NumSel++;
7065 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
7066 return true;
7067 }
7068 }
7069 return false;
7070}
7071
7072/// Try to fold the comparison based on range information we can get by checking
7073/// whether bits are known to be zero or one in the inputs.
7075 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7076 Type *Ty = Op0->getType();
7077 ICmpInst::Predicate Pred = I.getPredicate();
7078
7079 // Get scalar or pointer size.
7080 unsigned BitWidth = Ty->isIntOrIntVectorTy()
7081 ? Ty->getScalarSizeInBits()
7082 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
7083
7084 if (!BitWidth)
7085 return nullptr;
7086
7087 KnownBits Op0Known(BitWidth);
7088 KnownBits Op1Known(BitWidth);
7089
7090 {
7091 // Don't use dominating conditions when folding icmp using known bits. This
7092 // may convert signed into unsigned predicates in ways that other passes
7093 // (especially IndVarSimplify) may not be able to reliably undo.
7094 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
7096 Op0Known, Q))
7097 return &I;
7098
7099 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
7100 return &I;
7101 }
7102
7103 if (!isa<Constant>(Op0) && Op0Known.isConstant())
7104 return new ICmpInst(
7105 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
7106 if (!isa<Constant>(Op1) && Op1Known.isConstant())
7107 return new ICmpInst(
7108 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
7109
7110 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
7111 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
7112
7113 // Given the known and unknown bits, compute a range that the LHS could be
7114 // in. Compute the Min, Max and RHS values based on the known bits. For the
7115 // EQ and NE we use unsigned values.
7116 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
7117 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
7118 if (I.isSigned()) {
7119 Op0Min = Op0Known.getSignedMinValue();
7120 Op0Max = Op0Known.getSignedMaxValue();
7121 Op1Min = Op1Known.getSignedMinValue();
7122 Op1Max = Op1Known.getSignedMaxValue();
7123 } else {
7124 Op0Min = Op0Known.getMinValue();
7125 Op0Max = Op0Known.getMaxValue();
7126 Op1Min = Op1Known.getMinValue();
7127 Op1Max = Op1Known.getMaxValue();
7128 }
7129
7130 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
7131 // min/max canonical compare with some other compare. That could lead to
7132 // conflict with select canonicalization and infinite looping.
7133 // FIXME: This constraint may go away if min/max intrinsics are canonical.
7134 auto isMinMaxCmp = [&](Instruction &Cmp) {
7135 if (!Cmp.hasOneUse())
7136 return false;
7137 Value *A, *B;
7138 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
7140 return false;
7141 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
7142 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
7143 };
7144 if (!isMinMaxCmp(I)) {
7145 switch (Pred) {
7146 default:
7147 break;
7148 case ICmpInst::ICMP_ULT: {
7149 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
7150 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7151 const APInt *CmpC;
7152 if (match(Op1, m_APInt(CmpC))) {
7153 // A <u C -> A == C-1 if min(A)+1 == C
7154 if (*CmpC == Op0Min + 1)
7155 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7156 ConstantInt::get(Op1->getType(), *CmpC - 1));
7157 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7158 // exceeds the log2 of C.
7159 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7160 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7161 Constant::getNullValue(Op1->getType()));
7162 }
7163 break;
7164 }
7165 case ICmpInst::ICMP_UGT: {
7166 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7167 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7168 const APInt *CmpC;
7169 if (match(Op1, m_APInt(CmpC))) {
7170 // A >u C -> A == C+1 if max(a)-1 == C
7171 if (*CmpC == Op0Max - 1)
7172 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7173 ConstantInt::get(Op1->getType(), *CmpC + 1));
7174 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7175 // exceeds the log2 of C.
7176 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7177 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7178 Constant::getNullValue(Op1->getType()));
7179 }
7180 break;
7181 }
7182 case ICmpInst::ICMP_SLT: {
7183 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7184 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7185 const APInt *CmpC;
7186 if (match(Op1, m_APInt(CmpC))) {
7187 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7188 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7189 ConstantInt::get(Op1->getType(), *CmpC - 1));
7190 }
7191 break;
7192 }
7193 case ICmpInst::ICMP_SGT: {
7194 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7195 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7196 const APInt *CmpC;
7197 if (match(Op1, m_APInt(CmpC))) {
7198 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7199 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7200 ConstantInt::get(Op1->getType(), *CmpC + 1));
7201 }
7202 break;
7203 }
7204 }
7205 }
7206
7207 // Based on the range information we know about the LHS, see if we can
7208 // simplify this comparison. For example, (x&4) < 8 is always true.
7209 switch (Pred) {
7210 default:
7211 break;
7212 case ICmpInst::ICMP_EQ:
7213 case ICmpInst::ICMP_NE: {
7214 // If all bits are known zero except for one, then we know at most one bit
7215 // is set. If the comparison is against zero, then this is a check to see if
7216 // *that* bit is set.
7217 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7218 if (Op1Known.isZero()) {
7219 // If the LHS is an AND with the same constant, look through it.
7220 Value *LHS = nullptr;
7221 const APInt *LHSC;
7222 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7223 *LHSC != Op0KnownZeroInverted)
7224 LHS = Op0;
7225
7226 Value *X;
7227 const APInt *C1;
7228 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7229 Type *XTy = X->getType();
7230 unsigned Log2C1 = C1->countr_zero();
7231 APInt C2 = Op0KnownZeroInverted;
7232 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7233 if (C2Pow2.isPowerOf2()) {
7234 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7235 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7236 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7237 unsigned Log2C2 = C2Pow2.countr_zero();
7238 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7239 auto NewPred =
7241 return new ICmpInst(NewPred, X, CmpC);
7242 }
7243 }
7244 }
7245
7246 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7247 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7248 (Op0Known & Op1Known) == Op0Known)
7249 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7250 ConstantInt::getNullValue(Op1->getType()));
7251 break;
7252 }
7253 case ICmpInst::ICMP_SGE:
7254 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7255 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7256 break;
7257 case ICmpInst::ICMP_SLE:
7258 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7259 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7260 break;
7261 case ICmpInst::ICMP_UGE:
7262 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7263 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7264 break;
7265 case ICmpInst::ICMP_ULE:
7266 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7267 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7268 break;
7269 }
7270
7271 // Turn a signed comparison into an unsigned one if both operands are known to
7272 // have the same sign. Set samesign if possible (except for equality
7273 // predicates).
7274 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7275 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7276 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7277 I.setPredicate(I.getUnsignedPredicate());
7278 I.setSameSign();
7279 return &I;
7280 }
7281
7282 return nullptr;
7283}
7284
7285/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7286/// then try to reduce patterns based on that limit.
7288 Value *X, *Y;
7289 CmpPredicate Pred;
7290
7291 // X must be 0 and bool must be true for "ULT":
7292 // X <u (zext i1 Y) --> (X == 0) & Y
7293 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7294 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7295 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7296
7297 // X must be 0 or bool must be true for "ULE":
7298 // X <=u (sext i1 Y) --> (X == 0) | Y
7299 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7300 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7301 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7302
7303 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7304 CmpPredicate Pred1, Pred2;
7305 const APInt *C;
7306 Instruction *ExtI;
7307 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7310 m_APInt(C)))))) &&
7311 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7312 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7313 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7314 auto CreateRangeCheck = [&] {
7315 Value *CmpV1 =
7316 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7317 Value *CmpV2 = Builder.CreateICmp(
7318 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7320 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7321 CmpV1, CmpV2);
7322 };
7323 if (C->isZero()) {
7324 if (Pred2 == ICmpInst::ICMP_EQ) {
7325 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7326 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7327 return replaceInstUsesWith(
7328 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7329 } else if (!IsSExt || HasOneUse) {
7330 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7331 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7332 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7333 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7334 return CreateRangeCheck();
7335 }
7336 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7337 if (Pred2 == ICmpInst::ICMP_NE) {
7338 // icmp eq X, (zext (icmp ne X, 1)) --> false
7339 // icmp ne X, (zext (icmp ne X, 1)) --> true
7340 // icmp eq X, (sext (icmp ne X, -1)) --> false
7341 // icmp ne X, (sext (icmp ne X, -1)) --> true
7342 return replaceInstUsesWith(
7343 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7344 } else if (!IsSExt || HasOneUse) {
7345 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7346 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7347 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7348 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7349 return CreateRangeCheck();
7350 }
7351 } else {
7352 // when C != 0 && C != 1:
7353 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7354 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7355 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7356 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7357 // when C != 0 && C != -1:
7358 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7359 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7360 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7361 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7362 return ICmpInst::Create(
7363 Instruction::ICmp, Pred1, X,
7364 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7365 ? (IsSExt ? -1 : 1)
7366 : 0));
7367 }
7368 }
7369
7370 return nullptr;
7371}
7372
7373/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7374/// it into the appropriate icmp lt or icmp gt instruction. This transform
7375/// allows them to be folded in visitICmpInst.
7377 CmpPredicate Pred = I.getCmpPredicate();
7378 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7380 return nullptr;
7381
7382 Value *Op0 = I.getOperand(0);
7383 Value *Op1 = I.getOperand(1);
7384 auto *Op1C = dyn_cast<Constant>(Op1);
7385 if (!Op1C)
7386 return nullptr;
7387
7388 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7389 if (!FlippedStrictness)
7390 return nullptr;
7391
7392 auto *NewCmp =
7393 new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7394 NewCmp->setSameSign(FlippedStrictness->first.hasSameSign());
7395 return NewCmp;
7396}
7397
7398/// If we have a comparison with a non-canonical predicate, if we can update
7399/// all the users, invert the predicate and adjust all the users.
7401 // Is the predicate already canonical?
7402 CmpInst::Predicate Pred = I.getPredicate();
7404 return nullptr;
7405
7406 // Can all users be adjusted to predicate inversion?
7407 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7408 return nullptr;
7409
7410 // Ok, we can canonicalize comparison!
7411 // Let's first invert the comparison's predicate.
7412 I.setPredicate(CmpInst::getInversePredicate(Pred));
7413 I.setName(I.getName() + ".not");
7414
7415 // And, adapt users.
7417
7418 return &I;
7419}
7420
7421/// Integer compare with boolean values can always be turned into bitwise ops.
7423 InstCombiner::BuilderTy &Builder) {
7424 Value *A = I.getOperand(0), *B = I.getOperand(1);
7425 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7426
7427 // A boolean compared to true/false can be simplified to Op0/true/false in
7428 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7429 // Cases not handled by InstSimplify are always 'not' of Op0.
7430 if (match(B, m_Zero())) {
7431 switch (I.getPredicate()) {
7432 case CmpInst::ICMP_EQ: // A == 0 -> !A
7433 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7434 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7436 default:
7437 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7438 }
7439 } else if (match(B, m_One())) {
7440 switch (I.getPredicate()) {
7441 case CmpInst::ICMP_NE: // A != 1 -> !A
7442 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7443 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7445 default:
7446 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7447 }
7448 }
7449
7450 switch (I.getPredicate()) {
7451 default:
7452 llvm_unreachable("Invalid icmp instruction!");
7453 case ICmpInst::ICMP_EQ:
7454 // icmp eq i1 A, B -> ~(A ^ B)
7455 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7456
7457 case ICmpInst::ICMP_NE:
7458 // icmp ne i1 A, B -> A ^ B
7459 return BinaryOperator::CreateXor(A, B);
7460
7461 case ICmpInst::ICMP_UGT:
7462 // icmp ugt -> icmp ult
7463 std::swap(A, B);
7464 [[fallthrough]];
7465 case ICmpInst::ICMP_ULT:
7466 // icmp ult i1 A, B -> ~A & B
7467 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7468
7469 case ICmpInst::ICMP_SGT:
7470 // icmp sgt -> icmp slt
7471 std::swap(A, B);
7472 [[fallthrough]];
7473 case ICmpInst::ICMP_SLT:
7474 // icmp slt i1 A, B -> A & ~B
7475 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7476
7477 case ICmpInst::ICMP_UGE:
7478 // icmp uge -> icmp ule
7479 std::swap(A, B);
7480 [[fallthrough]];
7481 case ICmpInst::ICMP_ULE:
7482 // icmp ule i1 A, B -> ~A | B
7483 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7484
7485 case ICmpInst::ICMP_SGE:
7486 // icmp sge -> icmp sle
7487 std::swap(A, B);
7488 [[fallthrough]];
7489 case ICmpInst::ICMP_SLE:
7490 // icmp sle i1 A, B -> A | ~B
7491 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7492 }
7493}
7494
7495// Transform pattern like:
7496// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7497// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7498// Into:
7499// (X l>> Y) != 0
7500// (X l>> Y) == 0
7502 InstCombiner::BuilderTy &Builder) {
7503 CmpPredicate Pred, NewPred;
7504 Value *X, *Y;
7505 if (match(&Cmp,
7506 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7507 switch (Pred) {
7508 case ICmpInst::ICMP_ULE:
7509 NewPred = ICmpInst::ICMP_NE;
7510 break;
7511 case ICmpInst::ICMP_UGT:
7512 NewPred = ICmpInst::ICMP_EQ;
7513 break;
7514 default:
7515 return nullptr;
7516 }
7517 } else if (match(&Cmp, m_c_ICmp(Pred,
7520 m_Add(m_Shl(m_One(), m_Value(Y)),
7521 m_AllOnes()))),
7522 m_Value(X)))) {
7523 // The variant with 'add' is not canonical, (the variant with 'not' is)
7524 // we only get it because it has extra uses, and can't be canonicalized,
7525
7526 switch (Pred) {
7527 case ICmpInst::ICMP_ULT:
7528 NewPred = ICmpInst::ICMP_NE;
7529 break;
7530 case ICmpInst::ICMP_UGE:
7531 NewPred = ICmpInst::ICMP_EQ;
7532 break;
7533 default:
7534 return nullptr;
7535 }
7536 } else
7537 return nullptr;
7538
7539 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7540 Constant *Zero = Constant::getNullValue(NewX->getType());
7541 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7542}
7543
7545 InstCombiner::BuilderTy &Builder) {
7546 const CmpInst::Predicate Pred = Cmp.getPredicate();
7547 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7548 Value *V1, *V2;
7549
7550 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7551 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7552 if (auto *I = dyn_cast<Instruction>(V))
7553 I->copyIRFlags(&Cmp);
7554 Module *M = Cmp.getModule();
7556 M, Intrinsic::vector_reverse, V->getType());
7557 return CallInst::Create(F, V);
7558 };
7559
7560 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7561 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7562 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7563 (LHS->hasOneUse() || RHS->hasOneUse()))
7564 return createCmpReverse(Pred, V1, V2);
7565
7566 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7567 if (LHS->hasOneUse() && isSplatValue(RHS))
7568 return createCmpReverse(Pred, V1, RHS);
7569 }
7570 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7571 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7572 return createCmpReverse(Pred, LHS, V2);
7573
7574 ArrayRef<int> M;
7575 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7576 return nullptr;
7577
7578 // If both arguments of the cmp are shuffles that use the same mask and
7579 // shuffle within a single vector, move the shuffle after the cmp:
7580 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7581 Type *V1Ty = V1->getType();
7582 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7583 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7584 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7585 return new ShuffleVectorInst(NewCmp, M);
7586 }
7587
7588 // Try to canonicalize compare with splatted operand and splat constant.
7589 // TODO: We could generalize this for more than splats. See/use the code in
7590 // InstCombiner::foldVectorBinop().
7591 Constant *C;
7592 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7593 return nullptr;
7594
7595 // Length-changing splats are ok, so adjust the constants as needed:
7596 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7597 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7598 int MaskSplatIndex;
7599 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7600 // We allow poison in matching, but this transform removes it for safety.
7601 // Demanded elements analysis should be able to recover some/all of that.
7602 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7603 ScalarC);
7604 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7605 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7606 return new ShuffleVectorInst(NewCmp, NewM);
7607 }
7608
7609 return nullptr;
7610}
7611
7612// extract(uadd.with.overflow(A, B), 0) ult A
7613// -> extract(uadd.with.overflow(A, B), 1)
7615 CmpInst::Predicate Pred = I.getPredicate();
7616 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7617
7618 Value *UAddOv;
7619 Value *A, *B;
7620 auto UAddOvResultPat = m_ExtractValue<0>(
7622 if (match(Op0, UAddOvResultPat) &&
7623 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7624 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7625 (match(A, m_One()) || match(B, m_One()))) ||
7626 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7627 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7628 // extract(uadd.with.overflow(A, B), 0) < A
7629 // extract(uadd.with.overflow(A, 1), 0) == 0
7630 // extract(uadd.with.overflow(A, -1), 0) != -1
7631 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7632 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7633 (Op0 == A || Op0 == B))
7634 // A > extract(uadd.with.overflow(A, B), 0)
7635 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7636 else
7637 return nullptr;
7638
7639 return ExtractValueInst::Create(UAddOv, 1);
7640}
7641
7643 if (!I.getOperand(0)->getType()->isPointerTy() ||
7645 I.getParent()->getParent(),
7646 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7647 return nullptr;
7648 }
7649 Instruction *Op;
7650 if (match(I.getOperand(0), m_Instruction(Op)) &&
7651 match(I.getOperand(1), m_Zero()) &&
7652 Op->isLaunderOrStripInvariantGroup()) {
7653 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7654 Op->getOperand(0), I.getOperand(1));
7655 }
7656 return nullptr;
7657}
7658
7660 IRBuilderBase &Builder) {
7661 if (!ICmpInst::isEquality(I.getPredicate()))
7662 return nullptr;
7663
7664 // The caller puts constants after non-constants.
7665 Value *Op = I.getOperand(0);
7666 Value *Const = I.getOperand(1);
7667
7668 // For Cond an equality condition, fold
7669 //
7670 // icmp (eq|ne) (vreduce_(or|and) Op), (Zero|AllOnes) ->
7671 // icmp (eq|ne) Op, (Zero|AllOnes)
7672 //
7673 // with a bitcast.
7674 Value *Vec;
7675 if ((match(Const, m_ZeroInt()) &&
7677 m_Value(Vec))))) ||
7678 (match(Const, m_AllOnes()) &&
7680 m_Value(Vec)))))) {
7681 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
7682 if (!VecTy)
7683 return nullptr;
7684 Type *VecEltTy = VecTy->getElementType();
7685 unsigned ScalarBW =
7686 DL.getTypeSizeInBits(VecEltTy) * VecTy->getNumElements();
7687 if (!DL.fitsInLegalInteger(ScalarBW))
7688 return nullptr;
7689 Type *ScalarTy = IntegerType::get(I.getContext(), ScalarBW);
7690 Value *NewConst = match(Const, m_ZeroInt())
7691 ? ConstantInt::get(ScalarTy, 0)
7692 : ConstantInt::getAllOnesValue(ScalarTy);
7693 return CmpInst::Create(Instruction::ICmp, I.getPredicate(),
7694 Builder.CreateBitCast(Vec, ScalarTy), NewConst);
7695 }
7696 return nullptr;
7697}
7698
7699/// This function folds patterns produced by lowering of reduce idioms, such as
7700/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7701/// attempts to generate fewer number of scalar comparisons instead of vector
7702/// comparisons when possible.
7704 InstCombiner::BuilderTy &Builder,
7705 const DataLayout &DL) {
7706 if (I.getType()->isVectorTy())
7707 return nullptr;
7708 CmpPredicate OuterPred, InnerPred;
7709 Value *LHS, *RHS;
7710
7711 // Match lowering of @llvm.vector.reduce.and. Turn
7712 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7713 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7714 /// %res = icmp <pred> i8 %scalar_ne, 0
7715 ///
7716 /// into
7717 ///
7718 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7719 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7720 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7721 ///
7722 /// for <pred> in {ne, eq}.
7723 if (!match(&I, m_ICmp(OuterPred,
7725 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7726 m_Zero())))
7727 return nullptr;
7728 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7729 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7730 return nullptr;
7731 unsigned NumBits =
7732 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7733 // TODO: Relax this to "not wider than max legal integer type"?
7734 if (!DL.isLegalInteger(NumBits))
7735 return nullptr;
7736
7737 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7738 auto *ScalarTy = Builder.getIntNTy(NumBits);
7739 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7740 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7741 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7742 I.getName());
7743 }
7744
7745 return nullptr;
7746}
7747
7748// This helper will be called with icmp operands in both orders.
7750 Value *Op0, Value *Op1,
7751 ICmpInst &CxtI) {
7752 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7753 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7754 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7755 return NI;
7756
7757 if (auto *SI = dyn_cast<SelectInst>(Op0))
7758 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7759 return NI;
7760
7761 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7762 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7763 return Res;
7764
7765 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7766 return Res;
7767 }
7768
7769 {
7770 Value *X;
7771 const APInt *C;
7772 // icmp X+Cst, X
7773 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7774 return foldICmpAddOpConst(X, *C, Pred);
7775 }
7776
7777 // abs(X) >= X --> true
7778 // abs(X) u<= X --> true
7779 // abs(X) < X --> false
7780 // abs(X) u> X --> false
7781 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7782 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7783 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7784 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7785 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7786 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7787 {
7788 Value *X;
7789 Constant *C;
7791 match(Op1, m_Specific(X))) {
7792 Value *NullValue = Constant::getNullValue(X->getType());
7793 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7794 const APInt SMin =
7795 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7796 bool IsIntMinPosion = C->isAllOnesValue();
7797 switch (Pred) {
7798 case CmpInst::ICMP_ULE:
7799 case CmpInst::ICMP_SGE:
7800 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7801 case CmpInst::ICMP_UGT:
7802 case CmpInst::ICMP_SLT:
7804 case CmpInst::ICMP_UGE:
7805 case CmpInst::ICMP_SLE:
7806 case CmpInst::ICMP_EQ: {
7807 return replaceInstUsesWith(
7808 CxtI, IsIntMinPosion
7809 ? Builder.CreateICmpSGT(X, AllOnesValue)
7810 : Builder.CreateICmpULT(
7811 X, ConstantInt::get(X->getType(), SMin + 1)));
7812 }
7813 case CmpInst::ICMP_ULT:
7814 case CmpInst::ICMP_SGT:
7815 case CmpInst::ICMP_NE: {
7816 return replaceInstUsesWith(
7817 CxtI, IsIntMinPosion
7818 ? Builder.CreateICmpSLT(X, NullValue)
7819 : Builder.CreateICmpUGT(
7820 X, ConstantInt::get(X->getType(), SMin)));
7821 }
7822 default:
7823 llvm_unreachable("Invalid predicate!");
7824 }
7825 }
7826 }
7827
7828 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7829 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7830 return replaceInstUsesWith(CxtI, V);
7831
7832 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7833 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7834 {
7835 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7836 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7838 }
7839
7840 if (!ICmpInst::isUnsigned(Pred) &&
7841 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7842 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7844 }
7845 }
7846
7847 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7848 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7849 {
7850 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7851 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7853 }
7854
7855 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7856 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7857 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7859 }
7860 }
7861
7862 // icmp (shl nsw/nuw X, L), (add nsw/nuw (shl nsw/nuw Y, L), K)
7863 // -> icmp X, (add nsw/nuw Y, K >> L)
7864 // We use AShr for nsw and LShr for nuw to safely peel off the shift.
7865 Value *X;
7866 uint64_t ShAmt;
7867 if (match(Op0, m_NUWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7868 !CxtI.isSigned()) {
7869 if (ShAmt >= X->getType()->getScalarSizeInBits())
7870 return nullptr;
7871 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7872 ShiftSemantics::Unsigned, &CxtI)) {
7873 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7875 return new ICmpInst(Pred, X, NewOp1);
7876 }
7877 }
7878
7879 if (match(Op0, m_NSWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7880 !CxtI.isUnsigned()) {
7881 if (ShAmt >= X->getType()->getScalarSizeInBits())
7882 return nullptr;
7883 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7884 ShiftSemantics::Signed, &CxtI)) {
7885 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7887 return new ICmpInst(Pred, X, NewOp1);
7888 }
7889 }
7890 return nullptr;
7891}
7892
7894 bool Changed = false;
7895 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7896 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7897 unsigned Op0Cplxity = getComplexity(Op0);
7898 unsigned Op1Cplxity = getComplexity(Op1);
7899
7900 /// Orders the operands of the compare so that they are listed from most
7901 /// complex to least complex. This puts constants before unary operators,
7902 /// before binary operators.
7903 if (Op0Cplxity < Op1Cplxity) {
7904 I.swapOperands();
7905 std::swap(Op0, Op1);
7906 Changed = true;
7907 }
7908
7909 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7910 return replaceInstUsesWith(I, V);
7911
7912 // Comparing -val or val with non-zero is the same as just comparing val
7913 // ie, abs(val) != 0 -> val != 0
7914 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7915 Value *Cond, *SelectTrue, *SelectFalse;
7916 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7917 m_Value(SelectFalse)))) {
7918 if (Value *V = dyn_castNegVal(SelectTrue)) {
7919 if (V == SelectFalse)
7920 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7921 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7922 if (V == SelectTrue)
7923 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7924 }
7925 }
7926 }
7927
7929 return Res;
7930
7931 if (Op0->getType()->isIntOrIntVectorTy(1))
7933 return Res;
7934
7936 return Res;
7937
7939 return Res;
7940
7942 return Res;
7943
7945 return Res;
7946
7948 return Res;
7949
7951 return Res;
7952
7954 return Res;
7955
7956 // Test if the ICmpInst instruction is used exclusively by a select as
7957 // part of a minimum or maximum operation. If so, refrain from doing
7958 // any other folding. This helps out other analyses which understand
7959 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7960 // and CodeGen. And in this case, at least one of the comparison
7961 // operands has at least one user besides the compare (the select),
7962 // which would often largely negate the benefit of folding anyway.
7963 //
7964 // Do the same for the other patterns recognized by matchSelectPattern.
7965 if (I.hasOneUse())
7966 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7967 Value *A, *B;
7969 if (SPR.Flavor != SPF_UNKNOWN)
7970 return nullptr;
7971 }
7972
7973 // Do this after checking for min/max to prevent infinite looping.
7974 if (Instruction *Res = foldICmpWithZero(I))
7975 return Res;
7976
7977 Value *X;
7978 const APInt *C;
7979 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
7980 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7981 match(Op1, m_Not(m_Specific(X)))) {
7982 if (C->isNonNegative())
7983 return new ICmpInst(ICmpInst::ICMP_SLT, X,
7984 Constant::getNullValue(X->getType()));
7985 return new ICmpInst(ICmpInst::ICMP_UGT, X,
7986 ConstantInt::get(X->getType(), ~*C));
7987 }
7988
7989 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
7990 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7991 match(Op1, m_Not(m_Specific(X)))) {
7992 if (C->isNonNegative())
7993 return new ICmpInst(ICmpInst::ICMP_SGT, X,
7994 Constant::getAllOnesValue(X->getType()));
7995 return new ICmpInst(ICmpInst::ICMP_ULT, X,
7996 ConstantInt::get(X->getType(), ~*C));
7997 }
7998
7999 // FIXME: We only do this after checking for min/max to prevent infinite
8000 // looping caused by a reverse canonicalization of these patterns for min/max.
8001 // FIXME: The organization of folds is a mess. These would naturally go into
8002 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
8003 // down here after the min/max restriction.
8004 ICmpInst::Predicate Pred = I.getPredicate();
8005 if (match(Op1, m_APInt(C))) {
8006 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
8007 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
8008 Constant *Zero = Constant::getNullValue(Op0->getType());
8009 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
8010 }
8011
8012 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
8013 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
8015 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
8016 }
8017 }
8018
8019 // The folds in here may rely on wrapping flags and special constants, so
8020 // they can break up min/max idioms in some cases but not seemingly similar
8021 // patterns.
8022 // FIXME: It may be possible to enhance select folding to make this
8023 // unnecessary. It may also be moot if we canonicalize to min/max
8024 // intrinsics.
8025 if (Instruction *Res = foldICmpBinOp(I, Q))
8026 return Res;
8027
8029 return Res;
8030
8031 // Try to match comparison as a sign bit test. Intentionally do this after
8032 // foldICmpInstWithConstant() to potentially let other folds to happen first.
8033 if (Instruction *New = foldSignBitTest(I))
8034 return New;
8035
8036 if (auto *PN = dyn_cast<PHINode>(Op0))
8037 if (Instruction *NV = foldOpIntoPhi(I, PN))
8038 return NV;
8039 if (auto *PN = dyn_cast<PHINode>(Op1))
8040 if (Instruction *NV = foldOpIntoPhi(I, PN))
8041 return NV;
8042
8044 return Res;
8045
8046 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
8047 return Res;
8048 if (Instruction *Res =
8049 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
8050 return Res;
8051
8052 if (I.isCommutative()) {
8053 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8054 replaceOperand(I, 0, Pair->first);
8055 replaceOperand(I, 1, Pair->second);
8056 return &I;
8057 }
8058 }
8059
8060 // Fold icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8061 // when all select arms are constants, via truth table.
8063 return R;
8064
8065 // In case of a comparison with two select instructions having the same
8066 // condition, check whether one of the resulting branches can be simplified.
8067 // If so, just compare the other branch and select the appropriate result.
8068 // For example:
8069 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
8070 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
8071 // %cmp2 = icmp slt i32 %tmp2, %tmp1
8072 // The icmp will result false for the false value of selects and the result
8073 // will depend upon the comparison of true values of selects if %cmp is
8074 // true. Thus, transform this into:
8075 // %cmp = icmp slt i32 %y, %z
8076 // %sel = select i1 %cond, i1 %cmp, i1 false
8077 // This handles similar cases to transform.
8078 {
8079 Value *Cond, *A, *B, *C, *D;
8080 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
8082 (Op0->hasOneUse() || Op1->hasOneUse())) {
8083 // Check whether comparison of TrueValues can be simplified
8084 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
8085 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
8086 return SelectInst::Create(
8087 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
8089 }
8090 // Check whether comparison of FalseValues can be simplified
8091 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
8092 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
8093 return SelectInst::Create(
8094 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
8096 }
8097 }
8098 }
8099
8100 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
8101 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
8102 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
8103 {
8104 Value *A, *B;
8105 CmpPredicate CmpPred;
8106 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
8108 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
8109 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
8110 bool I0NUW = I0->hasNoUnsignedWrap();
8111 bool I1NUW = I1->hasNoUnsignedWrap();
8112 bool I0NSW = I0->hasNoSignedWrap();
8113 bool I1NSW = I1->hasNoSignedWrap();
8114 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
8115 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
8116 (ICmpInst::isEquality(Pred) &&
8117 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
8118 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
8119 ConstantInt::get(Op0->getType(), 0));
8120 }
8121 }
8122 }
8123
8124 // Try to optimize equality comparisons against alloca-based pointers.
8125 if (Op0->getType()->isPointerTy() && I.isEquality()) {
8126 assert(Op1->getType()->isPointerTy() &&
8127 "Comparing pointer with non-pointer?");
8128 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
8129 if (foldAllocaCmp(Alloca))
8130 return nullptr;
8131 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
8132 if (foldAllocaCmp(Alloca))
8133 return nullptr;
8134 }
8135
8136 if (Instruction *Res = foldICmpBitCast(I))
8137 return Res;
8138
8139 // TODO: Hoist this above the min/max bailout.
8141 return R;
8142
8143 {
8144 Value *X, *Y;
8145 // Transform (X & ~Y) == 0 --> (X & Y) != 0
8146 // and (X & ~Y) != 0 --> (X & Y) == 0
8147 // if A is a power of 2.
8148 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
8149 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
8150 I.isEquality())
8151 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
8152 Op1);
8153
8154 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
8155 if (Op0->getType()->isIntOrIntVectorTy()) {
8156 bool ConsumesOp0, ConsumesOp1;
8157 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
8158 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
8159 (ConsumesOp0 || ConsumesOp1)) {
8160 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
8161 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
8162 assert(InvOp0 && InvOp1 &&
8163 "Mismatch between isFreeToInvert and getFreelyInverted");
8164 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
8165 }
8166 }
8167
8168 Instruction *AddI = nullptr;
8170 m_Instruction(AddI))) &&
8171 isa<IntegerType>(X->getType())) {
8172 Value *Result;
8173 Constant *Overflow;
8174 // m_UAddWithOverflow can match patterns that do not include an explicit
8175 // "add" instruction, so check the opcode of the matched op.
8176 if (AddI->getOpcode() == Instruction::Add &&
8177 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
8178 Result, Overflow)) {
8179 replaceInstUsesWith(*AddI, Result);
8180 eraseInstFromFunction(*AddI);
8181 return replaceInstUsesWith(I, Overflow);
8182 }
8183 }
8184
8185 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
8186 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
8187 match(Op1, m_APInt(C))) {
8188 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
8189 return R;
8190 }
8191
8192 // Signbit test folds
8193 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
8194 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
8195 Instruction *ExtI;
8196 if ((I.isUnsigned() || I.isEquality()) &&
8197 match(Op1,
8199 Y->getType()->getScalarSizeInBits() == 1 &&
8200 (Op0->hasOneUse() || Op1->hasOneUse())) {
8201 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
8202 Instruction *ShiftI;
8203 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
8205 OpWidth - 1))))) {
8206 unsigned ExtOpc = ExtI->getOpcode();
8207 unsigned ShiftOpc = ShiftI->getOpcode();
8208 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
8209 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
8210 Value *SLTZero =
8211 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
8212 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
8213 return replaceInstUsesWith(I, Cmp);
8214 }
8215 }
8216 }
8217 }
8218
8219 if (Instruction *Res = foldICmpEquality(I))
8220 return Res;
8221
8223 return Res;
8224
8225 if (Instruction *Res = foldICmpOfUAddOv(I))
8226 return Res;
8227
8229 return Res;
8230
8231 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8232 // an i1 which indicates whether or not we successfully did the swap.
8233 //
8234 // Replace comparisons between the old value and the expected value with the
8235 // indicator that 'cmpxchg' returns.
8236 //
8237 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8238 // spuriously fail. In those cases, the old value may equal the expected
8239 // value but it is possible for the swap to not occur.
8240 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8241 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8242 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8243 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8244 !ACXI->isWeak())
8245 return ExtractValueInst::Create(ACXI, 1);
8246
8248 return Res;
8249
8250 if (I.getType()->isVectorTy())
8251 if (Instruction *Res = foldVectorCmp(I, Builder))
8252 return Res;
8253
8255 return Res;
8256
8258 return Res;
8259
8260 {
8261 Value *A;
8262 const APInt *C1, *C2;
8263 ICmpInst::Predicate Pred = I.getPredicate();
8264 if (ICmpInst::isEquality(Pred)) {
8265 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8266 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8267 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8268 match(Op1, m_APInt(C2))) {
8269 Type *InputTy = A->getType();
8270 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8271 // c2 must be non-negative at the bitwidth of a.
8272 if (C2->getActiveBits() < InputBitWidth) {
8273 APInt TruncC1 = C1->trunc(InputBitWidth);
8274 // Check if there are 1s in C1 high bits of size InputBitWidth.
8275 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8276 TruncC1.setBit(InputBitWidth - 1);
8277 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8278 return new ICmpInst(
8279 Pred, AndInst,
8280 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8281 }
8282 }
8283 }
8284 }
8285
8286 return Changed ? &I : nullptr;
8287}
8288
8289/// Fold fcmp ([us]itofp x, cst) if possible.
8291 Instruction *LHSI,
8292 Constant *RHSC) {
8293 const APFloat *RHS;
8294 if (!match(RHSC, m_APFloat(RHS)))
8295 return nullptr;
8296
8297 // Get the width of the mantissa. We don't want to hack on conversions that
8298 // might lose information from the integer, e.g. "i64 -> float"
8299 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8300 if (MantissaWidth == -1)
8301 return nullptr; // Unknown.
8302
8303 Type *IntTy = LHSI->getOperand(0)->getType();
8304 unsigned IntWidth = IntTy->getScalarSizeInBits();
8305 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8306
8307 if (I.isEquality()) {
8308 FCmpInst::Predicate P = I.getPredicate();
8309 bool IsExact = false;
8310 APSInt RHSCvt(IntWidth, LHSUnsigned);
8311 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8312
8313 // If the floating point constant isn't an integer value, we know if we will
8314 // ever compare equal / not equal to it.
8315 if (!IsExact) {
8316 // TODO: Can never be -0.0 and other non-representable values
8317 APFloat RHSRoundInt(*RHS);
8319 if (*RHS != RHSRoundInt) {
8321 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8322
8324 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8325 }
8326 }
8327
8328 // TODO: If the constant is exactly representable, is it always OK to do
8329 // equality compares as integer?
8330 }
8331
8332 // Check to see that the input is converted from an integer type that is small
8333 // enough that preserves all bits. TODO: check here for "known" sign bits.
8334 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8335
8336 // Following test does NOT adjust IntWidth downwards for signed inputs,
8337 // because the most negative value still requires all the mantissa bits
8338 // to distinguish it from one less than that value.
8339 if ((int)IntWidth > MantissaWidth) {
8340 // Conversion would lose accuracy. Check if loss can impact comparison.
8341 int Exp = ilogb(*RHS);
8342 if (Exp == APFloat::IEK_Inf) {
8343 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8344 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8345 // Conversion could create infinity.
8346 return nullptr;
8347 } else {
8348 // Note that if RHS is zero or NaN, then Exp is negative
8349 // and first condition is trivially false.
8350 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8351 // Conversion could affect comparison.
8352 return nullptr;
8353 }
8354 }
8355
8356 // Otherwise, we can potentially simplify the comparison. We know that it
8357 // will always come through as an integer value and we know the constant is
8358 // not a NAN (it would have been previously simplified).
8359 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8360
8362 switch (I.getPredicate()) {
8363 default:
8364 llvm_unreachable("Unexpected predicate!");
8365 case FCmpInst::FCMP_UEQ:
8366 case FCmpInst::FCMP_OEQ:
8367 Pred = ICmpInst::ICMP_EQ;
8368 break;
8369 case FCmpInst::FCMP_UGT:
8370 case FCmpInst::FCMP_OGT:
8371 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8372 break;
8373 case FCmpInst::FCMP_UGE:
8374 case FCmpInst::FCMP_OGE:
8375 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8376 break;
8377 case FCmpInst::FCMP_ULT:
8378 case FCmpInst::FCMP_OLT:
8379 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8380 break;
8381 case FCmpInst::FCMP_ULE:
8382 case FCmpInst::FCMP_OLE:
8383 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8384 break;
8385 case FCmpInst::FCMP_UNE:
8386 case FCmpInst::FCMP_ONE:
8387 Pred = ICmpInst::ICMP_NE;
8388 break;
8389 case FCmpInst::FCMP_ORD:
8390 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8391 case FCmpInst::FCMP_UNO:
8392 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8393 }
8394
8395 // Now we know that the APFloat is a normal number, zero or inf.
8396
8397 // See if the FP constant is too large for the integer. For example,
8398 // comparing an i8 to 300.0.
8399 if (!LHSUnsigned) {
8400 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8401 // and large values.
8402 APFloat SMax(RHS->getSemantics());
8403 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8405 if (SMax < *RHS) { // smax < 13123.0
8406 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8407 Pred == ICmpInst::ICMP_SLE)
8408 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8409 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8410 }
8411 } else {
8412 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8413 // +INF and large values.
8414 APFloat UMax(RHS->getSemantics());
8415 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8417 if (UMax < *RHS) { // umax < 13123.0
8418 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8419 Pred == ICmpInst::ICMP_ULE)
8420 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8421 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8422 }
8423 }
8424
8425 if (!LHSUnsigned) {
8426 // See if the RHS value is < SignedMin.
8427 APFloat SMin(RHS->getSemantics());
8428 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8430 if (SMin > *RHS) { // smin > 12312.0
8431 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8432 Pred == ICmpInst::ICMP_SGE)
8433 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8434 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8435 }
8436 } else {
8437 // See if the RHS value is < UnsignedMin.
8438 APFloat UMin(RHS->getSemantics());
8439 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8441 if (UMin > *RHS) { // umin > 12312.0
8442 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8443 Pred == ICmpInst::ICMP_UGE)
8444 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8445 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8446 }
8447 }
8448
8449 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8450 // [0, UMAX], but it may still be fractional. Check whether this is the case
8451 // using the IsExact flag.
8452 // Don't do this for zero, because -0.0 is not fractional.
8453 APSInt RHSInt(IntWidth, LHSUnsigned);
8454 bool IsExact;
8455 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8456 if (!RHS->isZero()) {
8457 if (!IsExact) {
8458 // If we had a comparison against a fractional value, we have to adjust
8459 // the compare predicate and sometimes the value. RHSC is rounded towards
8460 // zero at this point.
8461 switch (Pred) {
8462 default:
8463 llvm_unreachable("Unexpected integer comparison!");
8464 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8465 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8466 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8467 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8468 case ICmpInst::ICMP_ULE:
8469 // (float)int <= 4.4 --> int <= 4
8470 // (float)int <= -4.4 --> false
8471 if (RHS->isNegative())
8472 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8473 break;
8474 case ICmpInst::ICMP_SLE:
8475 // (float)int <= 4.4 --> int <= 4
8476 // (float)int <= -4.4 --> int < -4
8477 if (RHS->isNegative())
8478 Pred = ICmpInst::ICMP_SLT;
8479 break;
8480 case ICmpInst::ICMP_ULT:
8481 // (float)int < -4.4 --> false
8482 // (float)int < 4.4 --> int <= 4
8483 if (RHS->isNegative())
8484 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8485 Pred = ICmpInst::ICMP_ULE;
8486 break;
8487 case ICmpInst::ICMP_SLT:
8488 // (float)int < -4.4 --> int < -4
8489 // (float)int < 4.4 --> int <= 4
8490 if (!RHS->isNegative())
8491 Pred = ICmpInst::ICMP_SLE;
8492 break;
8493 case ICmpInst::ICMP_UGT:
8494 // (float)int > 4.4 --> int > 4
8495 // (float)int > -4.4 --> true
8496 if (RHS->isNegative())
8497 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8498 break;
8499 case ICmpInst::ICMP_SGT:
8500 // (float)int > 4.4 --> int > 4
8501 // (float)int > -4.4 --> int >= -4
8502 if (RHS->isNegative())
8503 Pred = ICmpInst::ICMP_SGE;
8504 break;
8505 case ICmpInst::ICMP_UGE:
8506 // (float)int >= -4.4 --> true
8507 // (float)int >= 4.4 --> int > 4
8508 if (RHS->isNegative())
8509 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8510 Pred = ICmpInst::ICMP_UGT;
8511 break;
8512 case ICmpInst::ICMP_SGE:
8513 // (float)int >= -4.4 --> int >= -4
8514 // (float)int >= 4.4 --> int > 4
8515 if (!RHS->isNegative())
8516 Pred = ICmpInst::ICMP_SGT;
8517 break;
8518 }
8519 }
8520 }
8521
8522 // Lower this FP comparison into an appropriate integer version of the
8523 // comparison.
8524 return new ICmpInst(Pred, LHSI->getOperand(0),
8525 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8526}
8527
8528/// Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8529/// where all true/false values are constants that allow the compare to be
8530/// constant-folded for every combination of C1 and C2.
8531/// We compute a 4-entry truth table and use createLogicFromTable to
8532/// synthesize a boolean expression of C1 and C2.
8534 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8535 Value *C1, *C2;
8536 Constant *TV1, *FV1, *TV2, *FV2;
8537
8538 if (!match(Op0, m_Select(m_Value(C1), m_Constant(TV1), m_Constant(FV1))) ||
8539 !match(Op1, m_Select(m_Value(C2), m_Constant(TV2), m_Constant(FV2))))
8540 return nullptr;
8541
8542 if (I.getType() != C1->getType() || I.getType() != C2->getType())
8543 return nullptr;
8544
8545 unsigned Pred = I.getPredicate();
8546 const DataLayout &DL = I.getDataLayout();
8547
8548 Constant *Res00 = ConstantFoldCompareInstOperands(Pred, FV1, FV2, DL);
8549 Constant *Res01 = ConstantFoldCompareInstOperands(Pred, FV1, TV2, DL);
8550 Constant *Res10 = ConstantFoldCompareInstOperands(Pred, TV1, FV2, DL);
8551 Constant *Res11 = ConstantFoldCompareInstOperands(Pred, TV1, TV2, DL);
8552
8553 if (!Res00 || !Res01 || !Res10 || !Res11)
8554 return nullptr;
8555
8556 if ((!Res00->isNullValue() && !Res00->isAllOnesValue()) ||
8557 (!Res01->isNullValue() && !Res01->isAllOnesValue()) ||
8558 (!Res10->isNullValue() && !Res10->isAllOnesValue()) ||
8559 (!Res11->isNullValue() && !Res11->isAllOnesValue()))
8560 return nullptr;
8561
8562 std::bitset<4> Table;
8563 if (!Res00->isNullValue())
8564 Table.set(0);
8565 if (!Res01->isNullValue())
8566 Table.set(1);
8567 if (!Res10->isNullValue())
8568 Table.set(2);
8569 if (!Res11->isNullValue())
8570 Table.set(3);
8571
8572 Value *Res = createLogicFromTable(Table, C1, C2, Builder,
8573 Op0->hasOneUse() && Op1->hasOneUse());
8574 if (!Res)
8575 return nullptr;
8576 return replaceInstUsesWith(I, Res);
8577}
8578
8579/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8581 Constant *RHSC) {
8582 // When C is not 0.0 and infinities are not allowed:
8583 // (C / X) < 0.0 is a sign-bit test of X
8584 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8585 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8586 //
8587 // Proof:
8588 // Multiply (C / X) < 0.0 by X * X / C.
8589 // - X is non zero, if it is the flag 'ninf' is violated.
8590 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8591 // the predicate. C is also non zero by definition.
8592 //
8593 // Thus X * X / C is non zero and the transformation is valid. [qed]
8594
8595 FCmpInst::Predicate Pred = I.getPredicate();
8596
8597 // Check that predicates are valid.
8598 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8599 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8600 return nullptr;
8601
8602 // Check that RHS operand is zero.
8603 if (!match(RHSC, m_AnyZeroFP()))
8604 return nullptr;
8605
8606 // Check fastmath flags ('ninf').
8607 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8608 return nullptr;
8609
8610 // Check the properties of the dividend. It must not be zero to avoid a
8611 // division by zero (see Proof).
8612 const APFloat *C;
8613 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8614 return nullptr;
8615
8616 if (C->isZero())
8617 return nullptr;
8618
8619 // Get swapped predicate if necessary.
8620 if (C->isNegative())
8621 Pred = I.getSwappedPredicate();
8622
8623 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8624}
8625
8626// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8627// Patterns include:
8628// fptrunc(x) < C --> x < ext(C)
8629// fptrunc(x) <= C --> x <= ext(C)
8630// fptrunc(x) > C --> x > ext(C)
8631// fptrunc(x) >= C --> x >= ext(C)
8632// fptrunc(x) ord/uno C --> x ord/uno 0
8633// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8634// due to precision loss.
8636 const Constant &C) {
8637 FCmpInst::Predicate Pred = I.getPredicate();
8638 Type *DestType = FPTrunc.getOperand(0)->getType();
8639
8640 const APFloat *CValue;
8641 // TODO: support vec
8642 if (!match(&C, m_APFloat(CValue)))
8643 return nullptr;
8644
8645 // Handle ord/uno
8646 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
8647 assert(!CValue->isNaN() &&
8648 "X ord/uno NaN should be folded away by simplifyFCmpInst()");
8649 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8650 ConstantFP::getZero(DestType), "", &I);
8651 }
8652
8653 // Handle <, >, <=, >=
8654 bool RoundDown = false;
8655
8656 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8657 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8658 RoundDown = true;
8659 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8660 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8661 RoundDown = false;
8662 else
8663 return nullptr;
8664
8665 if (CValue->isNaN() || CValue->isInfinity())
8666 return nullptr;
8667
8668 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8669 bool LosesInfo;
8670 APFloat Dest = Src;
8671 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8672 return Dest;
8673 };
8674
8675 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8676 APFloat NextValue = Value;
8677 NextValue.next(RoundDown);
8678 return NextValue;
8679 };
8680
8681 APFloat NextCValue = NextValue(*CValue, RoundDown);
8682
8683 const fltSemantics &DestFltSema =
8684 DestType->getScalarType()->getFltSemantics();
8685
8686 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8687 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8688
8689 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8690 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8691 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8692 // value of 'CValue'.
8693 if (NextCValue.isInfinity()) {
8694 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8695 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8696
8697 ExtNextCValue = ExtCValue + Bias;
8698 }
8699
8700 APFloat ExtMidValue =
8701 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8702
8703 const fltSemantics &SrcFltSema =
8704 C.getType()->getScalarType()->getFltSemantics();
8705
8706 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8707 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8708 if (MidValue != *CValue)
8709 ExtMidValue.next(!RoundDown);
8710
8711 // Check whether 'ExtMidValue' is a valid result since the assumption on
8712 // imaged 'NextCValue' might not hold for new float types.
8713 // ppc_fp128 can't pass here when converting from max float because of
8714 // APFloat implementation.
8715 if (NextCValue.isInfinity()) {
8716 // ExtMidValue --- narrowed ---> Finite
8717 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8718 return nullptr;
8719
8720 // NextExtMidValue --- narrowed ---> Infinity
8721 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8722 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8723 return nullptr;
8724 }
8725
8726 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8727 ConstantFP::get(DestType, ExtMidValue), "", &I);
8728}
8729
8730/// Optimize fabs(X) compared with zero.
8732 Value *X;
8733 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8734 return nullptr;
8735
8736 const APFloat *C;
8737 if (!match(I.getOperand(1), m_APFloat(C)))
8738 return nullptr;
8739
8740 if (!C->isPosZero()) {
8741 if (!C->isSmallestNormalized())
8742 return nullptr;
8743
8744 const Function *F = I.getFunction();
8745 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8746 if (Mode.Input == DenormalMode::PreserveSign ||
8748
8749 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8750 Constant *Zero = ConstantFP::getZero(X->getType());
8751 return new FCmpInst(P, X, Zero, "", I);
8752 };
8753
8754 switch (I.getPredicate()) {
8755 case FCmpInst::FCMP_OLT:
8756 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8757 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8758 case FCmpInst::FCMP_UGE:
8759 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8760 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8761 case FCmpInst::FCMP_OGE:
8762 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8763 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8764 case FCmpInst::FCMP_ULT:
8765 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8766 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8767 default:
8768 break;
8769 }
8770 }
8771
8772 return nullptr;
8773 }
8774
8775 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8776 I->setPredicate(P);
8777 return IC.replaceOperand(*I, 0, X);
8778 };
8779
8780 switch (I.getPredicate()) {
8781 case FCmpInst::FCMP_UGE:
8782 case FCmpInst::FCMP_OLT:
8783 // fabs(X) >= 0.0 --> true
8784 // fabs(X) < 0.0 --> false
8785 llvm_unreachable("fcmp should have simplified");
8786
8787 case FCmpInst::FCMP_OGT:
8788 // fabs(X) > 0.0 --> X != 0.0
8789 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8790
8791 case FCmpInst::FCMP_UGT:
8792 // fabs(X) u> 0.0 --> X u!= 0.0
8793 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8794
8795 case FCmpInst::FCMP_OLE:
8796 // fabs(X) <= 0.0 --> X == 0.0
8797 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8798
8799 case FCmpInst::FCMP_ULE:
8800 // fabs(X) u<= 0.0 --> X u== 0.0
8801 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8802
8803 case FCmpInst::FCMP_OGE:
8804 // fabs(X) >= 0.0 --> !isnan(X)
8805 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8806 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8807
8808 case FCmpInst::FCMP_ULT:
8809 // fabs(X) u< 0.0 --> isnan(X)
8810 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8811 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8812
8813 case FCmpInst::FCMP_OEQ:
8814 case FCmpInst::FCMP_UEQ:
8815 case FCmpInst::FCMP_ONE:
8816 case FCmpInst::FCMP_UNE:
8817 case FCmpInst::FCMP_ORD:
8818 case FCmpInst::FCMP_UNO:
8819 // Look through the fabs() because it doesn't change anything but the sign.
8820 // fabs(X) == 0.0 --> X == 0.0,
8821 // fabs(X) != 0.0 --> X != 0.0
8822 // isnan(fabs(X)) --> isnan(X)
8823 // !isnan(fabs(X) --> !isnan(X)
8824 return replacePredAndOp0(&I, I.getPredicate(), X);
8825
8826 default:
8827 return nullptr;
8828 }
8829}
8830
8831/// Optimize sqrt(X) compared with zero.
8833 Value *X;
8834 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8835 return nullptr;
8836
8837 if (!match(I.getOperand(1), m_PosZeroFP()))
8838 return nullptr;
8839
8840 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8841 I.setPredicate(P);
8842 return IC.replaceOperand(I, 0, X);
8843 };
8844
8845 // Clear ninf flag if sqrt doesn't have it.
8846 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8847 I.setHasNoInfs(false);
8848
8849 switch (I.getPredicate()) {
8850 case FCmpInst::FCMP_OLT:
8851 case FCmpInst::FCMP_UGE:
8852 // sqrt(X) < 0.0 --> false
8853 // sqrt(X) u>= 0.0 --> true
8854 llvm_unreachable("fcmp should have simplified");
8855 case FCmpInst::FCMP_ULT:
8856 case FCmpInst::FCMP_ULE:
8857 case FCmpInst::FCMP_OGT:
8858 case FCmpInst::FCMP_OGE:
8859 case FCmpInst::FCMP_OEQ:
8860 case FCmpInst::FCMP_UNE:
8861 // sqrt(X) u< 0.0 --> X u< 0.0
8862 // sqrt(X) u<= 0.0 --> X u<= 0.0
8863 // sqrt(X) > 0.0 --> X > 0.0
8864 // sqrt(X) >= 0.0 --> X >= 0.0
8865 // sqrt(X) == 0.0 --> X == 0.0
8866 // sqrt(X) u!= 0.0 --> X u!= 0.0
8867 return IC.replaceOperand(I, 0, X);
8868
8869 case FCmpInst::FCMP_OLE:
8870 // sqrt(X) <= 0.0 --> X == 0.0
8871 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8872 case FCmpInst::FCMP_UGT:
8873 // sqrt(X) u> 0.0 --> X u!= 0.0
8874 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8875 case FCmpInst::FCMP_UEQ:
8876 // sqrt(X) u== 0.0 --> X u<= 0.0
8877 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8878 case FCmpInst::FCMP_ONE:
8879 // sqrt(X) != 0.0 --> X > 0.0
8880 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8881 case FCmpInst::FCMP_ORD:
8882 // !isnan(sqrt(X)) --> X >= 0.0
8883 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8884 case FCmpInst::FCMP_UNO:
8885 // isnan(sqrt(X)) --> X u< 0.0
8886 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8887 default:
8888 llvm_unreachable("Unexpected predicate!");
8889 }
8890}
8891
8893 CmpInst::Predicate Pred = I.getPredicate();
8894 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8895
8896 // Canonicalize fneg as Op1.
8897 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8898 std::swap(Op0, Op1);
8899 Pred = I.getSwappedPredicate();
8900 }
8901
8902 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8903 return nullptr;
8904
8905 // Replace the negated operand with 0.0:
8906 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8907 Constant *Zero = ConstantFP::getZero(Op0->getType());
8908 return new FCmpInst(Pred, Op0, Zero, "", &I);
8909}
8910
8912 Constant *RHSC, InstCombinerImpl &CI) {
8913 const CmpInst::Predicate Pred = I.getPredicate();
8914 Value *X = LHSI->getOperand(0);
8915 Value *Y = LHSI->getOperand(1);
8916 switch (Pred) {
8917 default:
8918 break;
8919 case FCmpInst::FCMP_UGT:
8920 case FCmpInst::FCMP_ULT:
8921 case FCmpInst::FCMP_UNE:
8922 case FCmpInst::FCMP_OEQ:
8923 case FCmpInst::FCMP_OGE:
8924 case FCmpInst::FCMP_OLE:
8925 // The optimization is not valid if X and Y are infinities of the same
8926 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8927 // flag then we can assume we do not have that case. Otherwise we might be
8928 // able to prove that either X or Y is not infinity.
8929 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8933 break;
8934
8935 [[fallthrough]];
8936 case FCmpInst::FCMP_OGT:
8937 case FCmpInst::FCMP_OLT:
8938 case FCmpInst::FCMP_ONE:
8939 case FCmpInst::FCMP_UEQ:
8940 case FCmpInst::FCMP_UGE:
8941 case FCmpInst::FCMP_ULE:
8942 // fcmp pred (x - y), 0 --> fcmp pred x, y
8943 if (match(RHSC, m_AnyZeroFP()) &&
8944 I.getFunction()->getDenormalMode(
8945 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8947 CI.replaceOperand(I, 0, X);
8948 CI.replaceOperand(I, 1, Y);
8949 I.setHasNoInfs(LHSI->hasNoInfs());
8950 if (LHSI->hasNoNaNs())
8951 I.setHasNoNaNs(true);
8952 return &I;
8953 }
8954 // fcmp `pred (C - Y), C` -> `fcmp swap(pred), Y, 0`
8955 // where C and Y can't be arbitrary floating-point values.
8956 // For example, with `C = 1.0f` and `Y = 0x1p-149`, `1.0f - Y` rounds back
8957 // to `1.0f`, so the source compare is false while the rewritten compare is
8958 // true.
8959 // We need to make sure (C - Y) never rounds back to C
8960 const APFloat *C;
8961 Value *IntSrc;
8962 if (match(RHSC, m_APFloat(C)) &&
8963 match(LHSI, m_FSub(m_Specific(RHSC), m_IToFP(m_Value(IntSrc)))) &&
8964 C->isNormal()) {
8965 // Requirements on C and Y:
8966 // 1. C is finite, nonzero, normal.
8967 // 2. C shouldn't be too large, that is, ULP(C) <= 1.
8968 // 3. Y must be the form of `[su]itofp`, so the finite nonzero result of Y
8969 // must be integer-valued with an absolute value of at least 1;
8970 // as long as the step size near C does not exceed 1,
8971 // C - Y cannot be rounded back to C when Y != 0.
8972 // 4. If Y = 0, `fcmp pred (C - 0), C` are equivalent to `fcmp swap(pred)
8973 // 0, 0` for ordered and unordered predicates as long as C is finite and
8974 // nonzero.
8975 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8976 if (MantissaWidth != -1 && ilogb(*C) < MantissaWidth) {
8977 Constant *ZeroC = ConstantFP::getZero(LHSI->getType());
8978 I.setPredicate(I.getSwappedPredicate());
8979 CI.replaceOperand(I, 0, Y);
8980 CI.replaceOperand(I, 1, ZeroC);
8981 return &I;
8982 }
8983 }
8984 break;
8985 }
8986
8987 return nullptr;
8988}
8989
8990/// Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b
8991/// where 'pred' is olt, ult, ogt, ugt, oge or uge and C is a positive, Non-NaN
8992/// float when the uitofp casts are exact and C is in the valid range.
8993///
8994/// Since exact uitofp means distinct integers map to distinct floats, the only
8995/// values fabs(uitofp(a) - uitofp(b)) can take are {0.0, 1.0, 2.0, ...}.
8996/// There are no values in the open interval (0, 1), so:
8997/// fabs(...) < C where 0 < C <= 1.0 --> a == b (strict lt: C=1.0 ok)
8998// fabs(..) >= C where C >= 1.0 -> a != b
8999///
9000/// The same logic applies to sitofp.
9002 Value *FAbsArg;
9003 if (!match(I.getOperand(0), m_FAbs(m_Value(FAbsArg))))
9004 return nullptr;
9005
9006 const APFloat *C;
9007 if (!match(I.getOperand(1), PatternMatch::m_FiniteNonZero(C)))
9008 return nullptr;
9009
9010 FCmpInst::Predicate Pred = I.getPredicate();
9011 bool IsStrictLt = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT;
9012 bool IsLe = Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE;
9013 bool IsStrictGt = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT;
9014 bool IsGe = Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE;
9015 if (!IsStrictLt && !IsStrictGt && !IsGe)
9016 return nullptr;
9017
9018 APFloat One = APFloat::getOne(C->getSemantics());
9019 APFloat::cmpResult Cmp = C->compare(One);
9020
9021 // For strict-lt (olt/ult): C must be in (0, 1.0] -- C == 1.0 is fine since
9022 // the next possible value after 0.0 is 1.0, and < 1.0 excludes it.
9023 if (IsStrictLt && Cmp == APFloat::cmpGreaterThan)
9024 return nullptr;
9025 if (IsGe && Cmp == APFloat::cmpGreaterThan)
9026 return nullptr;
9027 if (IsLe && Cmp != APFloat::cmpGreaterThan)
9028 return nullptr;
9029 if (IsStrictGt && Cmp != APFloat::cmpLessThan)
9030 return nullptr;
9031
9032 // Match: fsub(uitofp(A), uitofp(B)) where both casts are uitofp or sitofp
9033 Value *A, *B;
9034 bool IsSigned;
9035 if (match(FAbsArg, m_FSub(m_UIToFP(m_Value(A)), m_UIToFP(m_Value(B))))) {
9036 IsSigned = false;
9037 } else if (match(FAbsArg,
9039 IsSigned = true;
9040 } else {
9041 return nullptr;
9042 }
9043
9044 // A and B must have the same integer type
9045 if (A->getType() != B->getType())
9046 return nullptr;
9047
9048 Type *FPTy = FAbsArg->getType();
9049 if (!IC.canBeCastedExactlyIntToFP(A, FPTy, IsSigned, &I) ||
9050 !IC.canBeCastedExactlyIntToFP(B, FPTy, IsSigned, &I))
9051 return nullptr;
9052 ICmpInst::Predicate ResultPred =
9053 IsStrictLt || IsLe ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
9054 return new ICmpInst(ResultPred, A, B);
9055}
9056
9058 InstCombinerImpl &IC) {
9059 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
9060 Type *OpType = LHS->getType();
9061 CmpInst::Predicate Pred = I.getPredicate();
9062
9065
9066 if (!FloorX && !CeilX) {
9069 std::swap(LHS, RHS);
9070 Pred = I.getSwappedPredicate();
9071 }
9072 }
9073
9074 if ((FloorX || CeilX) && FCmpInst::isCommutative(Pred) && LHS->hasOneUse()) {
9075 // fcmp pred floor(x), x => fcmp pred trunc(x), x
9076 // fcmp pred ceil(x), x => fcmp pred trunc(x), x
9077 // where pred is oeq, one, ord, ueq, une, uno.
9078 Value *TruncX = IC.Builder.CreateUnaryIntrinsic(Intrinsic::trunc, RHS);
9079 return new FCmpInst(Pred, TruncX, RHS, "", &I);
9080 }
9081
9082 switch (Pred) {
9083 case FCmpInst::FCMP_OLE:
9084 // fcmp ole floor(x), x => fcmp ord x, 0
9085 if (FloorX)
9087 "", &I);
9088 break;
9089 case FCmpInst::FCMP_OGT:
9090 // fcmp ogt floor(x), x => false
9091 if (FloorX)
9092 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9093 break;
9094 case FCmpInst::FCMP_OGE:
9095 // fcmp oge ceil(x), x => fcmp ord x, 0
9096 if (CeilX)
9098 "", &I);
9099 break;
9100 case FCmpInst::FCMP_OLT:
9101 // fcmp olt ceil(x), x => false
9102 if (CeilX)
9103 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9104 break;
9105 case FCmpInst::FCMP_ULE:
9106 // fcmp ule floor(x), x => true
9107 if (FloorX)
9108 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9109 break;
9110 case FCmpInst::FCMP_UGT:
9111 // fcmp ugt floor(x), x => fcmp uno x, 0
9112 if (FloorX)
9114 "", &I);
9115 break;
9116 case FCmpInst::FCMP_UGE:
9117 // fcmp uge ceil(x), x => true
9118 if (CeilX)
9119 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9120 break;
9121 case FCmpInst::FCMP_ULT:
9122 // fcmp ult ceil(x), x => fcmp uno x, 0
9123 if (CeilX)
9125 "", &I);
9126 break;
9127 default:
9128 break;
9129 }
9130
9131 return nullptr;
9132}
9133
9134/// Returns true if a select that implements a min/max is redundant and
9135/// select result can be replaced with its non-constant operand, e.g.,
9136/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
9137/// where C is the FP constant equal to the minimum integer value
9138/// representable by A.
9140 Value *B) {
9141 const APFloat *APF;
9142 if (!match(B, m_APFloat(APF)))
9143 return false;
9144
9145 auto *I = dyn_cast<Instruction>(A);
9146 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
9147 I->getOpcode() == Instruction::UIToFP))
9148 return false;
9149
9150 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
9151 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
9152 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
9153 ? APSInt::getMinValue(BitWidth, IsUnsigned)
9154 : APSInt::getMaxValue(BitWidth, IsUnsigned);
9155 APSInt ConvertedInt(BitWidth, IsUnsigned);
9156 bool IsExact;
9158 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
9159 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
9160}
9161
9163 bool Changed = false;
9164
9165 /// Orders the operands of the compare so that they are listed from most
9166 /// complex to least complex. This puts constants before unary operators,
9167 /// before binary operators.
9168 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
9169 I.swapOperands();
9170 Changed = true;
9171 }
9172
9173 const CmpInst::Predicate Pred = I.getPredicate();
9174 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
9175 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
9176 SQ.getWithInstruction(&I)))
9177 return replaceInstUsesWith(I, V);
9178
9179 // Simplify 'fcmp pred X, X'
9180 Type *OpType = Op0->getType();
9181 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
9182 if (Op0 == Op1) {
9183 switch (Pred) {
9184 default:
9185 break;
9186 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
9187 case FCmpInst::FCMP_ULT: // True if unordered or less than
9188 case FCmpInst::FCMP_UGT: // True if unordered or greater than
9189 case FCmpInst::FCMP_UNE: // True if unordered or not equal
9190 // Canonicalize these to be 'fcmp uno %X, 0.0'.
9191 I.setPredicate(FCmpInst::FCMP_UNO);
9192 I.setOperand(1, Constant::getNullValue(OpType));
9193 return &I;
9194
9195 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
9196 case FCmpInst::FCMP_OEQ: // True if ordered and equal
9197 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
9198 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
9199 // Canonicalize these to be 'fcmp ord %X, 0.0'.
9200 I.setPredicate(FCmpInst::FCMP_ORD);
9201 I.setOperand(1, Constant::getNullValue(OpType));
9202 return &I;
9203 }
9204 }
9205
9206 if (I.isCommutative()) {
9207 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
9208 replaceOperand(I, 0, Pair->first);
9209 replaceOperand(I, 1, Pair->second);
9210 return &I;
9211 }
9212 }
9213
9214 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
9215 // then canonicalize the operand to 0.0.
9216 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
9217 if (!match(Op0, m_PosZeroFP()) &&
9218 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
9219 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
9220
9221 if (!match(Op1, m_PosZeroFP()) &&
9222 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
9223 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9224 }
9225
9226 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
9227 Value *X, *Y;
9228 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
9229 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
9230
9232 return R;
9233
9234 // Test if the FCmpInst instruction is used exclusively by a select as
9235 // part of a minimum or maximum operation. If so, refrain from doing
9236 // any other folding. This helps out other analyses which understand
9237 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
9238 // and CodeGen. And in this case, at least one of the comparison
9239 // operands has at least one user besides the compare (the select),
9240 // which would often largely negate the benefit of folding anyway.
9241 if (I.hasOneUse())
9242 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
9243 Value *A, *B;
9245 bool IsRedundantMinMaxClamp =
9246 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
9248 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
9249 return nullptr;
9250 }
9251
9252 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
9253 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
9254 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
9255 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9256
9257 // Canonicalize:
9258 // fcmp olt X, +inf -> fcmp one X, +inf
9259 // fcmp ole X, +inf -> fcmp ord X, 0
9260 // fcmp ogt X, +inf -> false
9261 // fcmp oge X, +inf -> fcmp oeq X, +inf
9262 // fcmp ult X, +inf -> fcmp une X, +inf
9263 // fcmp ule X, +inf -> true
9264 // fcmp ugt X, +inf -> fcmp uno X, 0
9265 // fcmp uge X, +inf -> fcmp ueq X, +inf
9266 // fcmp olt X, -inf -> false
9267 // fcmp ole X, -inf -> fcmp oeq X, -inf
9268 // fcmp ogt X, -inf -> fcmp one X, -inf
9269 // fcmp oge X, -inf -> fcmp ord X, 0
9270 // fcmp ult X, -inf -> fcmp uno X, 0
9271 // fcmp ule X, -inf -> fcmp ueq X, -inf
9272 // fcmp ugt X, -inf -> fcmp une X, -inf
9273 // fcmp uge X, -inf -> true
9274 const APFloat *C;
9275 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
9276 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
9277 default:
9278 break;
9279 case FCmpInst::FCMP_ORD:
9280 case FCmpInst::FCMP_UNO:
9283 case FCmpInst::FCMP_OGT:
9284 case FCmpInst::FCMP_ULE:
9285 llvm_unreachable("Should be simplified by InstSimplify");
9286 case FCmpInst::FCMP_OLT:
9287 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
9288 case FCmpInst::FCMP_OLE:
9289 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
9290 "", &I);
9291 case FCmpInst::FCMP_OGE:
9292 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
9293 case FCmpInst::FCMP_ULT:
9294 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
9295 case FCmpInst::FCMP_UGT:
9296 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
9297 "", &I);
9298 case FCmpInst::FCMP_UGE:
9299 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
9300 }
9301 }
9302
9303 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
9304 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
9305 if (match(Op1, m_PosZeroFP()) &&
9307 X->getType()->isIntOrIntVectorTy() &&
9308 !F.getDenormalMode(Op1->getType()->getScalarType()->getFltSemantics())
9309 .inputsMayBeZero()) {
9311 if (Pred == FCmpInst::FCMP_OEQ)
9312 IntPred = ICmpInst::ICMP_EQ;
9313 else if (Pred == FCmpInst::FCMP_UNE)
9314 IntPred = ICmpInst::ICMP_NE;
9315
9316 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
9317 Type *IntTy = X->getType();
9318 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
9319 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
9320 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
9321 }
9322 }
9323
9324 // Handle fcmp with instruction LHS and constant RHS.
9325 Instruction *LHSI;
9326 Constant *RHSC;
9327 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
9328 switch (LHSI->getOpcode()) {
9329 case Instruction::Select:
9330 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
9331 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
9333 return replaceOperand(I, 0, X);
9335 return NV;
9336 break;
9337 case Instruction::FSub:
9338 if (LHSI->hasOneUse())
9339 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
9340 return NV;
9341 break;
9342 case Instruction::PHI:
9343 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
9344 return NV;
9345 break;
9346 case Instruction::SIToFP:
9347 case Instruction::UIToFP:
9348 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
9349 return NV;
9350 break;
9351 case Instruction::FDiv:
9352 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
9353 return NV;
9354 break;
9355 case Instruction::Load:
9356 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
9357 if (Instruction *Res =
9359 return Res;
9360 break;
9361 case Instruction::FPTrunc:
9362 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
9363 return NV;
9364 break;
9365 }
9366 }
9367
9368 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
9369 return R;
9370
9371 if (Instruction *R = foldFCmpFAbsFSubIntToFP(I, *this))
9372 return R;
9373
9374 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
9375 return R;
9376
9377 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
9378 return R;
9379
9381 return R;
9382
9383 if (match(Op0, m_FNeg(m_Value(X)))) {
9384 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
9385 Constant *C;
9386 if (match(Op1, m_Constant(C)))
9387 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
9388 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
9389 }
9390
9391 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
9392 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
9393 return new FCmpInst(Pred, X, Op1, "", &I);
9394
9395 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
9396 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
9397 return new FCmpInst(Pred, Op0, Y, "", &I);
9398
9399 // fcmp ord/uno (fptrunc X), (fptrunc Y) -> fcmp ord/uno X, Y
9400 if ((Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) &&
9401 match(Op0, m_FPTrunc(m_Value(X))) && match(Op1, m_FPTrunc(m_Value(Y))) &&
9402 X->getType() == Y->getType())
9403 return new FCmpInst(Pred, X, Y, "", &I);
9404
9405 if (match(Op0, m_FPExt(m_Value(X)))) {
9406 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
9407 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
9408 return new FCmpInst(Pred, X, Y, "", &I);
9409
9410 const APFloat *C;
9411 if (match(Op1, m_APFloat(C))) {
9412 const fltSemantics &FPSem =
9413 X->getType()->getScalarType()->getFltSemantics();
9414 bool Lossy;
9415 APFloat TruncC = *C;
9417
9418 if (Lossy) {
9419 // X can't possibly equal the higher-precision constant, so reduce any
9420 // equality comparison.
9421 // TODO: Other predicates can be handled via getFCmpCode().
9422 switch (Pred) {
9423 case FCmpInst::FCMP_OEQ:
9424 // X is ordered and equal to an impossible constant --> false
9425 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9426 case FCmpInst::FCMP_ONE:
9427 // X is ordered and not equal to an impossible constant --> ordered
9428 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9429 ConstantFP::getZero(X->getType()));
9430 case FCmpInst::FCMP_UEQ:
9431 // X is unordered or equal to an impossible constant --> unordered
9432 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9433 ConstantFP::getZero(X->getType()));
9434 case FCmpInst::FCMP_UNE:
9435 // X is unordered or not equal to an impossible constant --> true
9436 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9437 default:
9438 break;
9439 }
9440 }
9441
9442 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9443 // Avoid lossy conversions and denormals.
9444 // Zero is a special case that's OK to convert.
9445 APFloat Fabs = TruncC;
9446 Fabs.clearSign();
9447 if (!Lossy &&
9448 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9449 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9450 return new FCmpInst(Pred, X, NewC, "", &I);
9451 }
9452 }
9453 }
9454
9455 // Convert a sign-bit test of an FP value into a cast and integer compare.
9456 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9457 // TODO: Handle non-zero compare constants.
9458 // TODO: Handle other predicates.
9460 m_Value(X)))) &&
9461 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9462 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9463 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9464 IntType = VectorType::get(IntType, VecTy->getElementCount());
9465
9466 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9467 if (Pred == FCmpInst::FCMP_OLT) {
9468 Value *IntX = Builder.CreateBitCast(X, IntType);
9469 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9470 ConstantInt::getNullValue(IntType));
9471 }
9472 }
9473
9474 {
9475 Value *CanonLHS = nullptr;
9477 // (canonicalize(x) == x) => (x == x)
9478 if (CanonLHS == Op1)
9479 return new FCmpInst(Pred, Op1, Op1, "", &I);
9480
9481 Value *CanonRHS = nullptr;
9483 // (x == canonicalize(x)) => (x == x)
9484 if (CanonRHS == Op0)
9485 return new FCmpInst(Pred, Op0, Op0, "", &I);
9486
9487 // (canonicalize(x) == canonicalize(y)) => (x == y)
9488 if (CanonLHS && CanonRHS)
9489 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9490 }
9491
9492 if (I.getType()->isVectorTy())
9493 if (Instruction *Res = foldVectorCmp(I, Builder))
9494 return Res;
9495
9496 return Changed ? &I : nullptr;
9497}
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:1594
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:231
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1788
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:446
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1050
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:226
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:420
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1561
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1533
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:963
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:203
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1351
APInt abs() const
Get the absolute value.
Definition APInt.h:1816
unsigned ceilLogBase2() const
Definition APInt.h:1785
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1206
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:368
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1978
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1187
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:377
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:463
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1509
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1116
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:206
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:213
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:326
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1958
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1084
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1665
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1965
void negate()
Negate this APInt in place.
Definition APInt.h:1489
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1660
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1619
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:216
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:353
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1473
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1636
unsigned logBase2() const
Definition APInt.h:1782
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:472
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:830
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:402
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1155
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:876
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:437
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:303
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:293
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:197
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1242
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1971
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:386
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:283
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:236
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:854
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1677
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1226
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:2793
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:2811
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.