LLVM 23.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"
34#include <bitset>
35
36using namespace llvm;
37using namespace PatternMatch;
38
39#define DEBUG_TYPE "instcombine"
40
41// How many times is a select replaced by one of its operands?
42STATISTIC(NumSel, "Number of select opts");
43
44namespace llvm {
46}
47
48/// Compute Result = In1+In2, returning true if the result overflowed for this
49/// type.
50static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
51 bool IsSigned = false) {
52 bool Overflow;
53 if (IsSigned)
54 Result = In1.sadd_ov(In2, Overflow);
55 else
56 Result = In1.uadd_ov(In2, Overflow);
57
58 return Overflow;
59}
60
61/// Compute Result = In1-In2, returning true if the result overflowed for this
62/// type.
63static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
64 bool IsSigned = false) {
65 bool Overflow;
66 if (IsSigned)
67 Result = In1.ssub_ov(In2, Overflow);
68 else
69 Result = In1.usub_ov(In2, Overflow);
70
71 return Overflow;
72}
73
74/// Given an icmp instruction, return true if any use of this comparison is a
75/// branch on sign bit comparison.
76static bool hasBranchUse(ICmpInst &I) {
77 for (auto *U : I.users())
78 if (isa<BranchInst>(U))
79 return true;
80 return false;
81}
82
83/// Returns true if the exploded icmp can be expressed as a signed comparison
84/// to zero and updates the predicate accordingly.
85/// The signedness of the comparison is preserved.
86/// TODO: Refactor with decomposeBitTestICmp()?
87static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
88 if (!ICmpInst::isSigned(Pred))
89 return false;
90
91 if (C.isZero())
92 return ICmpInst::isRelational(Pred);
93
94 if (C.isOne()) {
95 if (Pred == ICmpInst::ICMP_SLT) {
96 Pred = ICmpInst::ICMP_SLE;
97 return true;
98 }
99 } else if (C.isAllOnes()) {
100 if (Pred == ICmpInst::ICMP_SGT) {
101 Pred = ICmpInst::ICMP_SGE;
102 return true;
103 }
104 }
105
106 return false;
107}
108
109/// This is called when we see this pattern:
110/// cmp pred (load (gep GV, ...)), cmpcst
111/// where GV is a global variable with a constant initializer. Try to simplify
112/// this into some simple computation that does not need the load. For example
113/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
114///
115/// If AndCst is non-null, then the loaded value is masked with that constant
116/// before doing the comparison. This handles cases like "A[i]&4 == 0".
118 LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst) {
120 if (LI->isVolatile() || !GV || !GV->isConstant() ||
121 !GV->hasDefinitiveInitializer())
122 return nullptr;
123
124 Type *EltTy = LI->getType();
125 TypeSize EltSize = DL.getTypeStoreSize(EltTy);
126 if (EltSize.isScalable())
127 return nullptr;
128
130 if (!Expr.Index || Expr.BasePtr != GV || Expr.Offset.getBitWidth() > 64)
131 return nullptr;
132
133 Constant *Init = GV->getInitializer();
134 TypeSize GlobalSize = DL.getTypeAllocSize(Init->getType());
135
136 Value *Idx = Expr.Index;
137 const APInt &Stride = Expr.Scale;
138 const APInt &ConstOffset = Expr.Offset;
139
140 // Allow an additional context offset, but only within the stride.
141 if (!ConstOffset.ult(Stride))
142 return nullptr;
143
144 // Don't handle overlapping loads for now.
145 if (!Stride.uge(EltSize.getFixedValue()))
146 return nullptr;
147
148 // Don't blow up on huge arrays.
149 uint64_t ArrayElementCount =
150 divideCeil((GlobalSize.getFixedValue() - ConstOffset.getZExtValue()),
151 Stride.getZExtValue());
152 if (ArrayElementCount > MaxArraySizeForCombine)
153 return nullptr;
154
155 enum { Overdefined = -3, Undefined = -2 };
156
157 // Variables for our state machines.
158
159 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
160 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
161 // and 87 is the second (and last) index. FirstTrueElement is -2 when
162 // undefined, otherwise set to the first true element. SecondTrueElement is
163 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
164 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
165
166 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
167 // form "i != 47 & i != 87". Same state transitions as for true elements.
168 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
169
170 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
171 /// define a state machine that triggers for ranges of values that the index
172 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
173 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
174 /// index in the range (inclusive). We use -2 for undefined here because we
175 /// use relative comparisons and don't want 0-1 to match -1.
176 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
177
178 // MagicBitvector - This is a magic bitvector where we set a bit if the
179 // comparison is true for element 'i'. If there are 64 elements or less in
180 // the array, this will fully represent all the comparison results.
181 uint64_t MagicBitvector = 0;
182
183 // Scan the array and see if one of our patterns matches.
184 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
185 APInt Offset = ConstOffset;
186 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i, Offset += Stride) {
188 if (!Elt)
189 return nullptr;
190
191 // If the element is masked, handle it.
192 if (AndCst) {
193 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
194 if (!Elt)
195 return nullptr;
196 }
197
198 // Find out if the comparison would be true or false for the i'th element.
200 CompareRHS, DL, &TLI);
201 if (!C)
202 return nullptr;
203
204 // If the result is undef for this element, ignore it.
205 if (isa<UndefValue>(C)) {
206 // Extend range state machines to cover this element in case there is an
207 // undef in the middle of the range.
208 if (TrueRangeEnd == (int)i - 1)
209 TrueRangeEnd = i;
210 if (FalseRangeEnd == (int)i - 1)
211 FalseRangeEnd = i;
212 continue;
213 }
214
215 // If we can't compute the result for any of the elements, we have to give
216 // up evaluating the entire conditional.
217 if (!isa<ConstantInt>(C))
218 return nullptr;
219
220 // Otherwise, we know if the comparison is true or false for this element,
221 // update our state machines.
222 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
223
224 // State machine for single/double/range index comparison.
225 if (IsTrueForElt) {
226 // Update the TrueElement state machine.
227 if (FirstTrueElement == Undefined)
228 FirstTrueElement = TrueRangeEnd = i; // First true element.
229 else {
230 // Update double-compare state machine.
231 if (SecondTrueElement == Undefined)
232 SecondTrueElement = i;
233 else
234 SecondTrueElement = Overdefined;
235
236 // Update range state machine.
237 if (TrueRangeEnd == (int)i - 1)
238 TrueRangeEnd = i;
239 else
240 TrueRangeEnd = Overdefined;
241 }
242 } else {
243 // Update the FalseElement state machine.
244 if (FirstFalseElement == Undefined)
245 FirstFalseElement = FalseRangeEnd = i; // First false element.
246 else {
247 // Update double-compare state machine.
248 if (SecondFalseElement == Undefined)
249 SecondFalseElement = i;
250 else
251 SecondFalseElement = Overdefined;
252
253 // Update range state machine.
254 if (FalseRangeEnd == (int)i - 1)
255 FalseRangeEnd = i;
256 else
257 FalseRangeEnd = Overdefined;
258 }
259 }
260
261 // If this element is in range, update our magic bitvector.
262 if (i < 64 && IsTrueForElt)
263 MagicBitvector |= 1ULL << i;
264
265 // If all of our states become overdefined, bail out early. Since the
266 // predicate is expensive, only check it every 8 elements. This is only
267 // really useful for really huge arrays.
268 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
269 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
270 FalseRangeEnd == Overdefined)
271 return nullptr;
272 }
273
274 // Now that we've scanned the entire array, emit our new comparison(s). We
275 // order the state machines in complexity of the generated code.
276
277 // If inbounds keyword is not present, Idx * Stride can overflow.
278 // Let's assume that Stride is 2 and the wanted value is at offset 0.
279 // Then, there are two possible values for Idx to match offset 0:
280 // 0x00..00, 0x80..00.
281 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
282 // comparison is false if Idx was 0x80..00.
283 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
284 auto MaskIdx = [&](Value *Idx) {
285 if (!Expr.Flags.isInBounds() && Stride.countr_zero() != 0) {
287 Mask = Builder.CreateLShr(Mask, Stride.countr_zero());
288 Idx = Builder.CreateAnd(Idx, Mask);
289 }
290 return Idx;
291 };
292
293 // If the comparison is only true for one or two elements, emit direct
294 // comparisons.
295 if (SecondTrueElement != Overdefined) {
296 Idx = MaskIdx(Idx);
297 // None true -> false.
298 if (FirstTrueElement == Undefined)
299 return replaceInstUsesWith(ICI, Builder.getFalse());
300
301 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
302
303 // True for one element -> 'i == 47'.
304 if (SecondTrueElement == Undefined)
305 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
306
307 // True for two elements -> 'i == 47 | i == 72'.
308 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
309 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
310 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
311 return BinaryOperator::CreateOr(C1, C2);
312 }
313
314 // If the comparison is only false for one or two elements, emit direct
315 // comparisons.
316 if (SecondFalseElement != Overdefined) {
317 Idx = MaskIdx(Idx);
318 // None false -> true.
319 if (FirstFalseElement == Undefined)
320 return replaceInstUsesWith(ICI, Builder.getTrue());
321
322 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
323
324 // False for one element -> 'i != 47'.
325 if (SecondFalseElement == Undefined)
326 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
327
328 // False for two elements -> 'i != 47 & i != 72'.
329 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
330 Value *SecondFalseIdx =
331 ConstantInt::get(Idx->getType(), SecondFalseElement);
332 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
333 return BinaryOperator::CreateAnd(C1, C2);
334 }
335
336 // If the comparison can be replaced with a range comparison for the elements
337 // where it is true, emit the range check.
338 if (TrueRangeEnd != Overdefined) {
339 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
340 Idx = MaskIdx(Idx);
341
342 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
343 if (FirstTrueElement) {
344 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstTrueElement);
345 Idx = Builder.CreateAdd(Idx, Offs);
346 }
347
348 Value *End =
349 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
350 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
351 }
352
353 // False range check.
354 if (FalseRangeEnd != Overdefined) {
355 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
356 Idx = MaskIdx(Idx);
357 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
358 if (FirstFalseElement) {
359 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstFalseElement);
360 Idx = Builder.CreateAdd(Idx, Offs);
361 }
362
363 Value *End =
364 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
365 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
366 }
367
368 // If a magic bitvector captures the entire comparison state
369 // of this load, replace it with computation that does:
370 // ((magic_cst >> i) & 1) != 0
371 {
372 Type *Ty = nullptr;
373
374 // Look for an appropriate type:
375 // - The type of Idx if the magic fits
376 // - The smallest fitting legal type
377 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
378 Ty = Idx->getType();
379 else
380 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
381
382 if (Ty) {
383 Idx = MaskIdx(Idx);
384 Value *V = Builder.CreateIntCast(Idx, Ty, false);
385 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
386 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
387 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
388 }
389 }
390
391 return nullptr;
392}
393
394/// Returns true if we can rewrite Start as a GEP with pointer Base
395/// and some integer offset. The nodes that need to be re-written
396/// for this transformation will be added to Explored.
398 const DataLayout &DL,
399 SetVector<Value *> &Explored) {
400 SmallVector<Value *, 16> WorkList(1, Start);
401 Explored.insert(Base);
402
403 // The following traversal gives us an order which can be used
404 // when doing the final transformation. Since in the final
405 // transformation we create the PHI replacement instructions first,
406 // we don't have to get them in any particular order.
407 //
408 // However, for other instructions we will have to traverse the
409 // operands of an instruction first, which means that we have to
410 // do a post-order traversal.
411 while (!WorkList.empty()) {
413
414 while (!WorkList.empty()) {
415 if (Explored.size() >= 100)
416 return false;
417
418 Value *V = WorkList.back();
419
420 if (Explored.contains(V)) {
421 WorkList.pop_back();
422 continue;
423 }
424
426 // We've found some value that we can't explore which is different from
427 // the base. Therefore we can't do this transformation.
428 return false;
429
430 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
431 // Only allow inbounds GEPs with at most one variable offset.
432 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
433 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
434 return false;
435
436 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
437 if (!Explored.contains(GEP->getOperand(0)))
438 WorkList.push_back(GEP->getOperand(0));
439 }
440
441 if (WorkList.back() == V) {
442 WorkList.pop_back();
443 // We've finished visiting this node, mark it as such.
444 Explored.insert(V);
445 }
446
447 if (auto *PN = dyn_cast<PHINode>(V)) {
448 // We cannot transform PHIs on unsplittable basic blocks.
449 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
450 return false;
451 Explored.insert(PN);
452 PHIs.insert(PN);
453 }
454 }
455
456 // Explore the PHI nodes further.
457 for (auto *PN : PHIs)
458 for (Value *Op : PN->incoming_values())
459 if (!Explored.contains(Op))
460 WorkList.push_back(Op);
461 }
462
463 // Make sure that we can do this. Since we can't insert GEPs in a basic
464 // block before a PHI node, we can't easily do this transformation if
465 // we have PHI node users of transformed instructions.
466 for (Value *Val : Explored) {
467 for (Value *Use : Val->uses()) {
468
469 auto *PHI = dyn_cast<PHINode>(Use);
470 auto *Inst = dyn_cast<Instruction>(Val);
471
472 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
473 !Explored.contains(PHI))
474 continue;
475
476 if (PHI->getParent() == Inst->getParent())
477 return false;
478 }
479 }
480 return true;
481}
482
483// Sets the appropriate insert point on Builder where we can add
484// a replacement Instruction for V (if that is possible).
485static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
486 bool Before = true) {
487 if (auto *PHI = dyn_cast<PHINode>(V)) {
488 BasicBlock *Parent = PHI->getParent();
489 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
490 return;
491 }
492 if (auto *I = dyn_cast<Instruction>(V)) {
493 if (!Before)
494 I = &*std::next(I->getIterator());
495 Builder.SetInsertPoint(I);
496 return;
497 }
498 if (auto *A = dyn_cast<Argument>(V)) {
499 // Set the insertion point in the entry block.
500 BasicBlock &Entry = A->getParent()->getEntryBlock();
501 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
502 return;
503 }
504 // Otherwise, this is a constant and we don't need to set a new
505 // insertion point.
506 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
507}
508
509/// Returns a re-written value of Start as an indexed GEP using Base as a
510/// pointer.
512 const DataLayout &DL,
513 SetVector<Value *> &Explored,
514 InstCombiner &IC) {
515 // Perform all the substitutions. This is a bit tricky because we can
516 // have cycles in our use-def chains.
517 // 1. Create the PHI nodes without any incoming values.
518 // 2. Create all the other values.
519 // 3. Add the edges for the PHI nodes.
520 // 4. Emit GEPs to get the original pointers.
521 // 5. Remove the original instructions.
522 Type *IndexType = IntegerType::get(
523 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
524
526 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
527
528 // Create the new PHI nodes, without adding any incoming values.
529 for (Value *Val : Explored) {
530 if (Val == Base)
531 continue;
532 // Create empty phi nodes. This avoids cyclic dependencies when creating
533 // the remaining instructions.
534 if (auto *PHI = dyn_cast<PHINode>(Val))
535 NewInsts[PHI] =
536 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
537 PHI->getName() + ".idx", PHI->getIterator());
538 }
539 IRBuilder<> Builder(Base->getContext());
540
541 // Create all the other instructions.
542 for (Value *Val : Explored) {
543 if (NewInsts.contains(Val))
544 continue;
545
546 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
547 setInsertionPoint(Builder, GEP);
548 Value *Op = NewInsts[GEP->getOperand(0)];
549 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
551 NewInsts[GEP] = OffsetV;
552 else
553 NewInsts[GEP] = Builder.CreateAdd(
554 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
555 /*NUW=*/NW.hasNoUnsignedWrap(),
556 /*NSW=*/NW.hasNoUnsignedSignedWrap());
557 continue;
558 }
559 if (isa<PHINode>(Val))
560 continue;
561
562 llvm_unreachable("Unexpected instruction type");
563 }
564
565 // Add the incoming values to the PHI nodes.
566 for (Value *Val : Explored) {
567 if (Val == Base)
568 continue;
569 // All the instructions have been created, we can now add edges to the
570 // phi nodes.
571 if (auto *PHI = dyn_cast<PHINode>(Val)) {
572 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
573 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
574 Value *NewIncoming = PHI->getIncomingValue(I);
575
576 auto It = NewInsts.find(NewIncoming);
577 if (It != NewInsts.end())
578 NewIncoming = It->second;
579
580 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
581 }
582 }
583 }
584
585 for (Value *Val : Explored) {
586 if (Val == Base)
587 continue;
588
589 setInsertionPoint(Builder, Val, false);
590 // Create GEP for external users.
591 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
592 Val->getName() + ".ptr", NW);
593 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
594 // Add old instruction to worklist for DCE. We don't directly remove it
595 // here because the original compare is one of the users.
597 }
598
599 return NewInsts[Start];
600}
601
602/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
603/// We can look through PHIs, GEPs and casts in order to determine a common base
604/// between GEPLHS and RHS.
607 const DataLayout &DL,
608 InstCombiner &IC) {
609 // FIXME: Support vector of pointers.
610 if (GEPLHS->getType()->isVectorTy())
611 return nullptr;
612
613 if (!GEPLHS->hasAllConstantIndices())
614 return nullptr;
615
616 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
617 Value *PtrBase =
619 /*AllowNonInbounds*/ false);
620
621 // Bail if we looked through addrspacecast.
622 if (PtrBase->getType() != GEPLHS->getType())
623 return nullptr;
624
625 // The set of nodes that will take part in this transformation.
626 SetVector<Value *> Nodes;
627 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
628 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
629 return nullptr;
630
631 // We know we can re-write this as
632 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
633 // Since we've only looked through inbouds GEPs we know that we
634 // can't have overflow on either side. We can therefore re-write
635 // this as:
636 // OFFSET1 cmp OFFSET2
637 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
638
639 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
640 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
641 // offset. Since Index is the offset of LHS to the base pointer, we will now
642 // compare the offsets instead of comparing the pointers.
644 IC.Builder.getInt(Offset), NewRHS);
645}
646
647/// Fold comparisons between a GEP instruction and something else. At this point
648/// we know that the GEP is on the LHS of the comparison.
651 // Don't transform signed compares of GEPs into index compares. Even if the
652 // GEP is inbounds, the final add of the base pointer can have signed overflow
653 // and would change the result of the icmp.
654 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
655 // the maximum signed value for the pointer type.
657 return nullptr;
658
659 // Look through bitcasts and addrspacecasts. We do not however want to remove
660 // 0 GEPs.
661 if (!isa<GetElementPtrInst>(RHS))
662 RHS = RHS->stripPointerCasts();
663
664 auto CanFold = [Cond](GEPNoWrapFlags NW) {
666 return true;
667
668 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
670 return NW != GEPNoWrapFlags::none();
671 };
672
673 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
674 if (!NW.hasNoUnsignedWrap()) {
675 // Convert signed to unsigned comparison.
676 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
677 }
678
679 auto *I = new ICmpInst(Cond, Op1, Op2);
680 I->setSameSign(NW.hasNoUnsignedSignedWrap());
681 return I;
682 };
683
685 if (Base.Ptr == RHS && CanFold(Base.LHSNW) && !Base.isExpensive()) {
686 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
687 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
688 Value *Offset =
689 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEPs=*/true);
690 return NewICmp(Base.LHSNW, Offset,
691 Constant::getNullValue(Offset->getType()));
692 }
693
694 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
695 isa<Constant>(RHS) && cast<Constant>(RHS)->isNullValue() &&
696 !NullPointerIsDefined(I.getFunction(),
697 RHS->getType()->getPointerAddressSpace())) {
698 // For most address spaces, an allocation can't be placed at null, but null
699 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
700 // the only valid inbounds address derived from null, is null itself.
701 // Thus, we have four cases to consider:
702 // 1) Base == nullptr, Offset == 0 -> inbounds, null
703 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
704 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
705 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
706 //
707 // (Note if we're indexing a type of size 0, that simply collapses into one
708 // of the buckets above.)
709 //
710 // In general, we're allowed to make values less poison (i.e. remove
711 // sources of full UB), so in this case, we just select between the two
712 // non-poison cases (1 and 4 above).
713 //
714 // For vectors, we apply the same reasoning on a per-lane basis.
715 auto *Base = GEPLHS->getPointerOperand();
716 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
717 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
718 Base = Builder.CreateVectorSplat(EC, Base);
719 }
720 return new ICmpInst(Cond, Base,
722 cast<Constant>(RHS), Base->getType()));
723 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
724 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
725
726 // If the base pointers are different, but the indices are the same, just
727 // compare the base pointer.
728 if (GEPLHS->getOperand(0) != GEPRHS->getOperand(0)) {
729 bool IndicesTheSame =
730 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
731 GEPLHS->getPointerOperand()->getType() ==
732 GEPRHS->getPointerOperand()->getType() &&
733 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
734 if (IndicesTheSame)
735 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
736 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
737 IndicesTheSame = false;
738 break;
739 }
740
741 // If all indices are the same, just compare the base pointers.
742 Type *BaseType = GEPLHS->getOperand(0)->getType();
743 if (IndicesTheSame &&
744 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
745 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
746
747 // If we're comparing GEPs with two base pointers that only differ in type
748 // and both GEPs have only constant indices or just one use, then fold
749 // the compare with the adjusted indices.
750 // FIXME: Support vector of pointers.
751 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
752 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
753 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
754 GEPLHS->getOperand(0)->stripPointerCasts() ==
755 GEPRHS->getOperand(0)->stripPointerCasts() &&
756 !GEPLHS->getType()->isVectorTy()) {
757 Value *LOffset = EmitGEPOffset(GEPLHS);
758 Value *ROffset = EmitGEPOffset(GEPRHS);
759
760 // If we looked through an addrspacecast between different sized address
761 // spaces, the LHS and RHS pointers are different sized
762 // integers. Truncate to the smaller one.
763 Type *LHSIndexTy = LOffset->getType();
764 Type *RHSIndexTy = ROffset->getType();
765 if (LHSIndexTy != RHSIndexTy) {
766 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
767 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
768 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
769 } else
770 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
771 }
772
774 LOffset, ROffset);
775 return replaceInstUsesWith(I, Cmp);
776 }
777 }
778
779 if (GEPLHS->getOperand(0) == GEPRHS->getOperand(0) &&
780 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
781 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
782 // If the GEPs only differ by one index, compare it.
783 unsigned NumDifferences = 0; // Keep track of # differences.
784 unsigned DiffOperand = 0; // The operand that differs.
785 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
786 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
787 Type *LHSType = GEPLHS->getOperand(i)->getType();
788 Type *RHSType = GEPRHS->getOperand(i)->getType();
789 // FIXME: Better support for vector of pointers.
790 if (LHSType->getPrimitiveSizeInBits() !=
791 RHSType->getPrimitiveSizeInBits() ||
792 (GEPLHS->getType()->isVectorTy() &&
793 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
794 // Irreconcilable differences.
795 NumDifferences = 2;
796 break;
797 }
798
799 if (NumDifferences++)
800 break;
801 DiffOperand = i;
802 }
803
804 if (NumDifferences == 0) // SAME GEP?
805 return replaceInstUsesWith(
806 I, // No comparison is needed here.
807 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
808 // If two GEPs only differ by an index, compare them.
809 // Note that nowrap flags are always needed when comparing two indices.
810 else if (NumDifferences == 1 && NW != GEPNoWrapFlags::none()) {
811 Value *LHSV = GEPLHS->getOperand(DiffOperand);
812 Value *RHSV = GEPRHS->getOperand(DiffOperand);
813 return NewICmp(NW, LHSV, RHSV);
814 }
815 }
816
817 if (Base.Ptr && CanFold(Base.LHSNW & Base.RHSNW) && !Base.isExpensive()) {
818 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
819 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
820 Value *L =
821 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEP=*/true);
822 Value *R =
823 EmitGEPOffsets(Base.RHSGEPs, Base.RHSNW, IdxTy, /*RewriteGEP=*/true);
824 return NewICmp(Base.LHSNW & Base.RHSNW, L, R);
825 }
826 }
827
828 // Try convert this to an indexed compare by looking through PHIs/casts as a
829 // last resort.
830 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
831}
832
834 // It would be tempting to fold away comparisons between allocas and any
835 // pointer not based on that alloca (e.g. an argument). However, even
836 // though such pointers cannot alias, they can still compare equal.
837 //
838 // But LLVM doesn't specify where allocas get their memory, so if the alloca
839 // doesn't escape we can argue that it's impossible to guess its value, and we
840 // can therefore act as if any such guesses are wrong.
841 //
842 // However, we need to ensure that this folding is consistent: We can't fold
843 // one comparison to false, and then leave a different comparison against the
844 // same value alone (as it might evaluate to true at runtime, leading to a
845 // contradiction). As such, this code ensures that all comparisons are folded
846 // at the same time, and there are no other escapes.
847
848 struct CmpCaptureTracker : public CaptureTracker {
849 AllocaInst *Alloca;
850 bool Captured = false;
851 /// The value of the map is a bit mask of which icmp operands the alloca is
852 /// used in.
854
855 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
856
857 void tooManyUses() override { Captured = true; }
858
859 Action captured(const Use *U, UseCaptureInfo CI) override {
860 // TODO(captures): Use UseCaptureInfo.
861 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
862 // We need to check that U is based *only* on the alloca, and doesn't
863 // have other contributions from a select/phi operand.
864 // TODO: We could check whether getUnderlyingObjects() reduces to one
865 // object, which would allow looking through phi nodes.
866 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
867 // Collect equality icmps of the alloca, and don't treat them as
868 // captures.
869 ICmps[ICmp] |= 1u << U->getOperandNo();
870 return Continue;
871 }
872
873 Captured = true;
874 return Stop;
875 }
876 };
877
878 CmpCaptureTracker Tracker(Alloca);
879 PointerMayBeCaptured(Alloca, &Tracker);
880 if (Tracker.Captured)
881 return false;
882
883 bool Changed = false;
884 for (auto [ICmp, Operands] : Tracker.ICmps) {
885 switch (Operands) {
886 case 1:
887 case 2: {
888 // The alloca is only used in one icmp operand. Assume that the
889 // equality is false.
890 auto *Res = ConstantInt::get(ICmp->getType(),
891 ICmp->getPredicate() == ICmpInst::ICMP_NE);
892 replaceInstUsesWith(*ICmp, Res);
894 Changed = true;
895 break;
896 }
897 case 3:
898 // Both icmp operands are based on the alloca, so this is comparing
899 // pointer offsets, without leaking any information about the address
900 // of the alloca. Ignore such comparisons.
901 break;
902 default:
903 llvm_unreachable("Cannot happen");
904 }
905 }
906
907 return Changed;
908}
909
910/// Fold "icmp pred (X+C), X".
912 CmpPredicate Pred) {
913 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
914 // so the values can never be equal. Similarly for all other "or equals"
915 // operators.
916 assert(!!C && "C should not be zero!");
917
918 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
919 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
920 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
921 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
922 Constant *R =
923 ConstantInt::get(X->getType(), APInt::getMaxValue(C.getBitWidth()) - C);
924 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
925 }
926
927 // (X+1) >u X --> X <u (0-1) --> X != 255
928 // (X+2) >u X --> X <u (0-2) --> X <u 254
929 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
930 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
931 return new ICmpInst(ICmpInst::ICMP_ULT, X,
932 ConstantInt::get(X->getType(), -C));
933
934 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
935
936 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
937 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
938 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
939 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
940 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
941 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
942 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
943 return new ICmpInst(ICmpInst::ICMP_SGT, X,
944 ConstantInt::get(X->getType(), SMax - C));
945
946 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
947 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
948 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
949 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
950 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
951 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
952
953 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
954 return new ICmpInst(ICmpInst::ICMP_SLT, X,
955 ConstantInt::get(X->getType(), SMax - (C - 1)));
956}
957
958/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
959/// (icmp eq/ne A, Log2(AP2/AP1)) ->
960/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
962 const APInt &AP1,
963 const APInt &AP2) {
964 assert(I.isEquality() && "Cannot fold icmp gt/lt");
965
966 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
967 if (I.getPredicate() == I.ICMP_NE)
968 Pred = CmpInst::getInversePredicate(Pred);
969 return new ICmpInst(Pred, LHS, RHS);
970 };
971
972 // Don't bother doing any work for cases which InstSimplify handles.
973 if (AP2.isZero())
974 return nullptr;
975
976 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
977 if (IsAShr) {
978 if (AP2.isAllOnes())
979 return nullptr;
980 if (AP2.isNegative() != AP1.isNegative())
981 return nullptr;
982 if (AP2.sgt(AP1))
983 return nullptr;
984 }
985
986 if (!AP1)
987 // 'A' must be large enough to shift out the highest set bit.
988 return getICmp(I.ICMP_UGT, A,
989 ConstantInt::get(A->getType(), AP2.logBase2()));
990
991 if (AP1 == AP2)
992 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
993
994 int Shift;
995 if (IsAShr && AP1.isNegative())
996 Shift = AP1.countl_one() - AP2.countl_one();
997 else
998 Shift = AP1.countl_zero() - AP2.countl_zero();
999
1000 if (Shift > 0) {
1001 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1002 // There are multiple solutions if we are comparing against -1 and the LHS
1003 // of the ashr is not a power of two.
1004 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1005 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1006 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1007 } else if (AP1 == AP2.lshr(Shift)) {
1008 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1009 }
1010 }
1011
1012 // Shifting const2 will never be equal to const1.
1013 // FIXME: This should always be handled by InstSimplify?
1014 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1015 return replaceInstUsesWith(I, TorF);
1016}
1017
1018/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1019/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1021 const APInt &AP1,
1022 const APInt &AP2) {
1023 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1024
1025 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1026 if (I.getPredicate() == I.ICMP_NE)
1027 Pred = CmpInst::getInversePredicate(Pred);
1028 return new ICmpInst(Pred, LHS, RHS);
1029 };
1030
1031 // Don't bother doing any work for cases which InstSimplify handles.
1032 if (AP2.isZero())
1033 return nullptr;
1034
1035 unsigned AP2TrailingZeros = AP2.countr_zero();
1036
1037 if (!AP1 && AP2TrailingZeros != 0)
1038 return getICmp(
1039 I.ICMP_UGE, A,
1040 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1041
1042 if (AP1 == AP2)
1043 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1044
1045 // Get the distance between the lowest bits that are set.
1046 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1047
1048 if (Shift > 0 && AP2.shl(Shift) == AP1)
1049 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1050
1051 // Shifting const2 will never be equal to const1.
1052 // FIXME: This should always be handled by InstSimplify?
1053 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1054 return replaceInstUsesWith(I, TorF);
1055}
1056
1057/// The caller has matched a pattern of the form:
1058/// I = icmp ugt (add (add A, B), CI2), CI1
1059/// If this is of the form:
1060/// sum = a + b
1061/// if (sum+128 >u 255)
1062/// Then replace it with llvm.sadd.with.overflow.i8.
1063///
1065 ConstantInt *CI2, ConstantInt *CI1,
1066 InstCombinerImpl &IC) {
1067 // The transformation we're trying to do here is to transform this into an
1068 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1069 // with a narrower add, and discard the add-with-constant that is part of the
1070 // range check (if we can't eliminate it, this isn't profitable).
1071
1072 // In order to eliminate the add-with-constant, the compare can be its only
1073 // use.
1074 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1075 if (!AddWithCst->hasOneUse())
1076 return nullptr;
1077
1078 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1079 if (!CI2->getValue().isPowerOf2())
1080 return nullptr;
1081 unsigned NewWidth = CI2->getValue().countr_zero();
1082 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1083 return nullptr;
1084
1085 // The width of the new add formed is 1 more than the bias.
1086 ++NewWidth;
1087
1088 // Check to see that CI1 is an all-ones value with NewWidth bits.
1089 if (CI1->getBitWidth() == NewWidth ||
1090 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1091 return nullptr;
1092
1093 // This is only really a signed overflow check if the inputs have been
1094 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1095 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1096 if (IC.ComputeMaxSignificantBits(A, &I) > NewWidth ||
1097 IC.ComputeMaxSignificantBits(B, &I) > NewWidth)
1098 return nullptr;
1099
1100 // In order to replace the original add with a narrower
1101 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1102 // and truncates that discard the high bits of the add. Verify that this is
1103 // the case.
1104 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1105 for (User *U : OrigAdd->users()) {
1106 if (U == AddWithCst)
1107 continue;
1108
1109 // Only accept truncates for now. We would really like a nice recursive
1110 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1111 // chain to see which bits of a value are actually demanded. If the
1112 // original add had another add which was then immediately truncated, we
1113 // could still do the transformation.
1115 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1116 return nullptr;
1117 }
1118
1119 // If the pattern matches, truncate the inputs to the narrower type and
1120 // use the sadd_with_overflow intrinsic to efficiently compute both the
1121 // result and the overflow bit.
1122 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1124 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1125
1126 InstCombiner::BuilderTy &Builder = IC.Builder;
1127
1128 // Put the new code above the original add, in case there are any uses of the
1129 // add between the add and the compare.
1130 Builder.SetInsertPoint(OrigAdd);
1131
1132 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1133 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1134 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1135 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1136 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1137
1138 // The inner add was the result of the narrow add, zero extended to the
1139 // wider type. Replace it with the result computed by the intrinsic.
1140 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1141 IC.eraseInstFromFunction(*OrigAdd);
1142
1143 // The original icmp gets replaced with the overflow value.
1144 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1145}
1146
1147/// If we have:
1148/// icmp eq/ne (urem/srem %x, %y), 0
1149/// iff %y is a power-of-two, we can replace this with a bit test:
1150/// icmp eq/ne (and %x, (add %y, -1)), 0
1152 // This fold is only valid for equality predicates.
1153 if (!I.isEquality())
1154 return nullptr;
1155 CmpPredicate Pred;
1156 Value *X, *Y, *Zero;
1157 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1158 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1159 return nullptr;
1160 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
1161 return nullptr;
1162 // This may increase instruction count, we don't enforce that Y is a constant.
1163 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1164 Value *Masked = Builder.CreateAnd(X, Mask);
1165 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1166}
1167
1168/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1169/// by one-less-than-bitwidth into a sign test on the original value.
1171 Instruction *Val;
1172 CmpPredicate Pred;
1173 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1174 return nullptr;
1175
1176 Value *X;
1177 Type *XTy;
1178
1179 Constant *C;
1180 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1181 XTy = X->getType();
1182 unsigned XBitWidth = XTy->getScalarSizeInBits();
1184 APInt(XBitWidth, XBitWidth - 1))))
1185 return nullptr;
1186 } else if (isa<BinaryOperator>(Val) &&
1188 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1189 /*AnalyzeForSignBitExtraction=*/true))) {
1190 XTy = X->getType();
1191 } else
1192 return nullptr;
1193
1194 return ICmpInst::Create(Instruction::ICmp,
1198}
1199
1200// Handle icmp pred X, 0
1202 CmpInst::Predicate Pred = Cmp.getPredicate();
1203 if (!match(Cmp.getOperand(1), m_Zero()))
1204 return nullptr;
1205
1206 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1207 if (Pred == ICmpInst::ICMP_SGT) {
1208 Value *A, *B;
1209 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1210 if (isKnownPositive(A, SQ.getWithInstruction(&Cmp)))
1211 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1212 if (isKnownPositive(B, SQ.getWithInstruction(&Cmp)))
1213 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1214 }
1215 }
1216
1218 return New;
1219
1220 // Given:
1221 // icmp eq/ne (urem %x, %y), 0
1222 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1223 // icmp eq/ne %x, 0
1224 Value *X, *Y;
1225 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1226 ICmpInst::isEquality(Pred)) {
1227 KnownBits XKnown = computeKnownBits(X, &Cmp);
1228 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1229 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1230 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1231 }
1232
1233 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1234 // odd/non-zero/there is no overflow.
1235 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1236 ICmpInst::isEquality(Pred)) {
1237
1238 KnownBits XKnown = computeKnownBits(X, &Cmp);
1239 // if X % 2 != 0
1240 // (icmp eq/ne Y)
1241 if (XKnown.countMaxTrailingZeros() == 0)
1242 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1243
1244 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1245 // if Y % 2 != 0
1246 // (icmp eq/ne X)
1247 if (YKnown.countMaxTrailingZeros() == 0)
1248 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1249
1250 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1251 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1252 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1253 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1254 // but to avoid unnecessary work, first just if this is an obvious case.
1255
1256 // if X non-zero and NoOverflow(X * Y)
1257 // (icmp eq/ne Y)
1258 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1259 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1260
1261 // if Y non-zero and NoOverflow(X * Y)
1262 // (icmp eq/ne X)
1263 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1264 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1265 }
1266 // Note, we are skipping cases:
1267 // if Y % 2 != 0 AND X % 2 != 0
1268 // (false/true)
1269 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1270 // (false/true)
1271 // Those can be simplified later as we would have already replaced the (icmp
1272 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1273 // will fold to a constant elsewhere.
1274 }
1275
1276 // (icmp eq/ne f(X), 0) -> (icmp eq/ne X, 0)
1277 // where f(X) == 0 if and only if X == 0
1278 if (ICmpInst::isEquality(Pred))
1279 if (Value *Stripped = stripNullTest(Cmp.getOperand(0)))
1280 return new ICmpInst(Pred, Stripped,
1281 Constant::getNullValue(Stripped->getType()));
1282
1283 return nullptr;
1284}
1285
1286/// Fold icmp eq (num + mask) & ~mask, num
1287/// to
1288/// icmp eq (and num, mask), 0
1289/// Where mask is a low bit mask.
1291 Value *Num;
1292 CmpPredicate Pred;
1293 const APInt *Mask, *Neg;
1294
1295 if (!match(&Cmp,
1296 m_c_ICmp(Pred, m_Value(Num),
1298 m_LowBitMask(Mask))),
1299 m_APInt(Neg))))))
1300 return nullptr;
1301
1302 if (*Neg != ~*Mask)
1303 return nullptr;
1304
1305 if (!ICmpInst::isEquality(Pred))
1306 return nullptr;
1307
1308 // Create new icmp eq (num & mask), 0
1309 auto *NewAnd = Builder.CreateAnd(Num, *Mask);
1310 auto *Zero = Constant::getNullValue(Num->getType());
1311
1312 return new ICmpInst(Pred, NewAnd, Zero);
1313}
1314
1315/// Fold icmp Pred X, C.
1316/// TODO: This code structure does not make sense. The saturating add fold
1317/// should be moved to some other helper and extended as noted below (it is also
1318/// possible that code has been made unnecessary - do we canonicalize IR to
1319/// overflow/saturating intrinsics or not?).
1321 // Match the following pattern, which is a common idiom when writing
1322 // overflow-safe integer arithmetic functions. The source performs an addition
1323 // in wider type and explicitly checks for overflow using comparisons against
1324 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1325 //
1326 // TODO: This could probably be generalized to handle other overflow-safe
1327 // operations if we worked out the formulas to compute the appropriate magic
1328 // constants.
1329 //
1330 // sum = a + b
1331 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1332 CmpInst::Predicate Pred = Cmp.getPredicate();
1333 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1334 Value *A, *B;
1335 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1336 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1337 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1338 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1339 return Res;
1340
1341 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1343 if (!C)
1344 return nullptr;
1345
1346 if (auto *Phi = dyn_cast<PHINode>(Op0))
1347 if (all_of(Phi->operands(), IsaPred<Constant>)) {
1349 for (Value *V : Phi->incoming_values()) {
1350 Constant *Res =
1352 if (!Res)
1353 return nullptr;
1354 Ops.push_back(Res);
1355 }
1356 Builder.SetInsertPoint(Phi);
1357 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1358 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1359 NewPhi->addIncoming(V, Pred);
1360 return replaceInstUsesWith(Cmp, NewPhi);
1361 }
1362
1364 return R;
1365
1366 return nullptr;
1367}
1368
1369/// Canonicalize icmp instructions based on dominating conditions.
1371 // We already checked simple implication in InstSimplify, only handle complex
1372 // cases here.
1373 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1374 const APInt *C;
1375 if (!match(Y, m_APInt(C)))
1376 return nullptr;
1377
1378 CmpInst::Predicate Pred = Cmp.getPredicate();
1380
1381 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1382 const APInt *DomC) -> Instruction * {
1383 // We have 2 compares of a variable with constants. Calculate the constant
1384 // ranges of those compares to see if we can transform the 2nd compare:
1385 // DomBB:
1386 // DomCond = icmp DomPred X, DomC
1387 // br DomCond, CmpBB, FalseBB
1388 // CmpBB:
1389 // Cmp = icmp Pred X, C
1390 ConstantRange DominatingCR =
1391 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1392 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1393 ConstantRange Difference = DominatingCR.difference(CR);
1394 if (Intersection.isEmptySet())
1395 return replaceInstUsesWith(Cmp, Builder.getFalse());
1396 if (Difference.isEmptySet())
1397 return replaceInstUsesWith(Cmp, Builder.getTrue());
1398
1399 // Canonicalizing a sign bit comparison that gets used in a branch,
1400 // pessimizes codegen by generating branch on zero instruction instead
1401 // of a test and branch. So we avoid canonicalizing in such situations
1402 // because test and branch instruction has better branch displacement
1403 // than compare and branch instruction.
1404 bool UnusedBit;
1405 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1406 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1407 return nullptr;
1408
1409 // Avoid an infinite loop with min/max canonicalization.
1410 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1411 if (Cmp.hasOneUse() &&
1412 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1413 return nullptr;
1414
1415 if (const APInt *EqC = Intersection.getSingleElement())
1416 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1417 if (const APInt *NeC = Difference.getSingleElement())
1418 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1419 return nullptr;
1420 };
1421
1422 for (BranchInst *BI : DC.conditionsFor(X)) {
1423 CmpPredicate DomPred;
1424 const APInt *DomC;
1425 if (!match(BI->getCondition(),
1426 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1427 continue;
1428
1429 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1430 if (DT.dominates(Edge0, Cmp.getParent())) {
1431 if (auto *V = handleDomCond(DomPred, DomC))
1432 return V;
1433 } else {
1434 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1435 if (DT.dominates(Edge1, Cmp.getParent()))
1436 if (auto *V =
1437 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1438 return V;
1439 }
1440 }
1441
1442 return nullptr;
1443}
1444
1445/// Fold icmp (trunc X), C.
1447 TruncInst *Trunc,
1448 const APInt &C) {
1449 ICmpInst::Predicate Pred = Cmp.getPredicate();
1450 Value *X = Trunc->getOperand(0);
1451 Type *SrcTy = X->getType();
1452 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1453 SrcBits = SrcTy->getScalarSizeInBits();
1454
1455 // Match (icmp pred (trunc nuw/nsw X), C)
1456 // Which we can convert to (icmp pred X, (sext/zext C))
1457 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1458 if (Trunc->hasNoSignedWrap())
1459 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1460 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1461 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1462 }
1463
1464 if (C.isOne() && C.getBitWidth() > 1) {
1465 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1466 Value *V = nullptr;
1467 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1468 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1469 ConstantInt::get(V->getType(), 1));
1470 }
1471
1472 // TODO: Handle non-equality predicates.
1473 Value *Y;
1474 const APInt *Pow2;
1475 if (Cmp.isEquality() && match(X, m_Shl(m_Power2(Pow2), m_Value(Y))) &&
1476 DstBits > Pow2->logBase2()) {
1477 // (trunc (Pow2 << Y) to iN) == 0 --> Y u>= N - log2(Pow2)
1478 // (trunc (Pow2 << Y) to iN) != 0 --> Y u< N - log2(Pow2)
1479 // iff N > log2(Pow2)
1480 if (C.isZero()) {
1481 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1482 return new ICmpInst(NewPred, Y,
1483 ConstantInt::get(SrcTy, DstBits - Pow2->logBase2()));
1484 }
1485 // (trunc (Pow2 << Y) to iN) == 2**C --> Y == C - log2(Pow2)
1486 // (trunc (Pow2 << Y) to iN) != 2**C --> Y != C - log2(Pow2)
1487 if (C.isPowerOf2())
1488 return new ICmpInst(
1489 Pred, Y, ConstantInt::get(SrcTy, C.logBase2() - Pow2->logBase2()));
1490 }
1491
1492 if (Cmp.isEquality() && (Trunc->hasOneUse() || Trunc->hasNoUnsignedWrap())) {
1493 // Canonicalize to a mask and wider compare if the wide type is suitable:
1494 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1495 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1496 Constant *Mask =
1497 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1498 Value *And = Trunc->hasNoUnsignedWrap() ? X : Builder.CreateAnd(X, Mask);
1499 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1500 return new ICmpInst(Pred, And, WideC);
1501 }
1502
1503 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1504 // of the high bits truncated out of x are known.
1505 KnownBits Known = computeKnownBits(X, &Cmp);
1506
1507 // If all the high bits are known, we can do this xform.
1508 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1509 // Pull in the high bits from known-ones set.
1510 APInt NewRHS = C.zext(SrcBits);
1511 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1512 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1513 }
1514 }
1515
1516 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1517 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1518 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1519 Value *ShOp;
1520 uint64_t ShAmt;
1521 bool TrueIfSigned;
1522 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1523 match(X, m_Shr(m_Value(ShOp), m_ConstantInt(ShAmt))) &&
1524 DstBits == SrcBits - ShAmt) {
1525 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1527 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1529 }
1530
1531 return nullptr;
1532}
1533
1534/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1535/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1538 const SimplifyQuery &Q) {
1539 Value *X, *Y;
1540 CmpPredicate Pred;
1541 bool YIsSExt = false;
1542 // Try to match icmp (trunc X), (trunc Y)
1543 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1544 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1545 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1546 if (Cmp.isSigned()) {
1547 // For signed comparisons, both truncs must be nsw.
1548 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1549 return nullptr;
1550 } else {
1551 // For unsigned and equality comparisons, either both must be nuw or
1552 // both must be nsw, we don't care which.
1553 if (!NoWrapFlags)
1554 return nullptr;
1555 }
1556
1557 if (X->getType() != Y->getType() &&
1558 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1559 return nullptr;
1560 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1561 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1562 std::swap(X, Y);
1563 Pred = Cmp.getSwappedPredicate(Pred);
1564 }
1565 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1566 }
1567 // Try to match icmp (trunc nuw X), (zext Y)
1568 else if (!Cmp.isSigned() &&
1569 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1570 m_OneUse(m_ZExt(m_Value(Y)))))) {
1571 // Can fold trunc nuw + zext for unsigned and equality predicates.
1572 }
1573 // Try to match icmp (trunc nsw X), (sext Y)
1574 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1576 // Can fold trunc nsw + zext/sext for all predicates.
1577 YIsSExt =
1578 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1579 } else
1580 return nullptr;
1581
1582 Type *TruncTy = Cmp.getOperand(0)->getType();
1583 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1584
1585 // If this transform will end up changing from desirable types -> undesirable
1586 // types skip it.
1587 if (isDesirableIntType(TruncBits) &&
1588 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1589 return nullptr;
1590
1591 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1592 return new ICmpInst(Pred, X, NewY);
1593}
1594
1595/// Fold icmp (xor X, Y), C.
1598 const APInt &C) {
1599 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1600 return I;
1601
1602 Value *X = Xor->getOperand(0);
1603 Value *Y = Xor->getOperand(1);
1604 const APInt *XorC;
1605 if (!match(Y, m_APInt(XorC)))
1606 return nullptr;
1607
1608 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1609 // fold the xor.
1610 ICmpInst::Predicate Pred = Cmp.getPredicate();
1611 bool TrueIfSigned = false;
1612 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1613
1614 // If the sign bit of the XorCst is not set, there is no change to
1615 // the operation, just stop using the Xor.
1616 if (!XorC->isNegative())
1617 return replaceOperand(Cmp, 0, X);
1618
1619 // Emit the opposite comparison.
1620 if (TrueIfSigned)
1621 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1622 ConstantInt::getAllOnesValue(X->getType()));
1623 else
1624 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1625 ConstantInt::getNullValue(X->getType()));
1626 }
1627
1628 if (Xor->hasOneUse()) {
1629 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1630 if (!Cmp.isEquality() && XorC->isSignMask()) {
1631 Pred = Cmp.getFlippedSignednessPredicate();
1632 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1633 }
1634
1635 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1636 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1637 Pred = Cmp.getFlippedSignednessPredicate();
1638 Pred = Cmp.getSwappedPredicate(Pred);
1639 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1640 }
1641 }
1642
1643 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1644 if (Pred == ICmpInst::ICMP_UGT) {
1645 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1646 if (*XorC == ~C && (C + 1).isPowerOf2())
1647 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1648 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1649 if (*XorC == C && (C + 1).isPowerOf2())
1650 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1651 }
1652 if (Pred == ICmpInst::ICMP_ULT) {
1653 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1654 if (*XorC == -C && C.isPowerOf2())
1655 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1656 ConstantInt::get(X->getType(), ~C));
1657 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1658 if (*XorC == C && (-C).isPowerOf2())
1659 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1660 ConstantInt::get(X->getType(), ~C));
1661 }
1662 return nullptr;
1663}
1664
1665/// For power-of-2 C:
1666/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1667/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1670 const APInt &C) {
1671 CmpInst::Predicate Pred = Cmp.getPredicate();
1672 APInt PowerOf2;
1673 if (Pred == ICmpInst::ICMP_ULT)
1674 PowerOf2 = C;
1675 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1676 PowerOf2 = C + 1;
1677 else
1678 return nullptr;
1679 if (!PowerOf2.isPowerOf2())
1680 return nullptr;
1681 Value *X;
1682 const APInt *ShiftC;
1684 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1685 return nullptr;
1686 uint64_t Shift = ShiftC->getLimitedValue();
1687 Type *XType = X->getType();
1688 if (Shift == 0 || PowerOf2.isMinSignedValue())
1689 return nullptr;
1690 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1691 APInt Bound =
1692 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1693 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1694}
1695
1696/// Fold icmp (and (sh X, Y), C2), C1.
1699 const APInt &C1,
1700 const APInt &C2) {
1701 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1702 if (!Shift || !Shift->isShift())
1703 return nullptr;
1704
1705 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1706 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1707 // code produced by the clang front-end, for bitfield access.
1708 // This seemingly simple opportunity to fold away a shift turns out to be
1709 // rather complicated. See PR17827 for details.
1710 unsigned ShiftOpcode = Shift->getOpcode();
1711 bool IsShl = ShiftOpcode == Instruction::Shl;
1712 const APInt *C3;
1713 if (match(Shift->getOperand(1), m_APInt(C3))) {
1714 APInt NewAndCst, NewCmpCst;
1715 bool AnyCmpCstBitsShiftedOut;
1716 if (ShiftOpcode == Instruction::Shl) {
1717 // For a left shift, we can fold if the comparison is not signed. We can
1718 // also fold a signed comparison if the mask value and comparison value
1719 // are not negative. These constraints may not be obvious, but we can
1720 // prove that they are correct using an SMT solver.
1721 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1722 return nullptr;
1723
1724 NewCmpCst = C1.lshr(*C3);
1725 NewAndCst = C2.lshr(*C3);
1726 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1727 } else if (ShiftOpcode == Instruction::LShr) {
1728 // For a logical right shift, we can fold if the comparison is not signed.
1729 // We can also fold a signed comparison if the shifted mask value and the
1730 // shifted comparison value are not negative. These constraints may not be
1731 // obvious, but we can prove that they are correct using an SMT solver.
1732 NewCmpCst = C1.shl(*C3);
1733 NewAndCst = C2.shl(*C3);
1734 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1735 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1736 return nullptr;
1737 } else {
1738 // For an arithmetic shift, check that both constants don't use (in a
1739 // signed sense) the top bits being shifted out.
1740 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1741 NewCmpCst = C1.shl(*C3);
1742 NewAndCst = C2.shl(*C3);
1743 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1744 if (NewAndCst.ashr(*C3) != C2)
1745 return nullptr;
1746 }
1747
1748 if (AnyCmpCstBitsShiftedOut) {
1749 // If we shifted bits out, the fold is not going to work out. As a
1750 // special case, check to see if this means that the result is always
1751 // true or false now.
1752 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1753 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1754 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1755 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1756 } else {
1757 Value *NewAnd = Builder.CreateAnd(
1758 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1759 return new ICmpInst(Cmp.getPredicate(), NewAnd,
1760 ConstantInt::get(And->getType(), NewCmpCst));
1761 }
1762 }
1763
1764 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1765 // preferable because it allows the C2 << Y expression to be hoisted out of a
1766 // loop if Y is invariant and X is not.
1767 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1768 !Shift->isArithmeticShift() &&
1769 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1770 // Compute C2 << Y.
1771 Value *NewShift =
1772 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1773 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1774
1775 // Compute X & (C2 << Y).
1776 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1777 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1778 }
1779
1780 return nullptr;
1781}
1782
1783/// Fold icmp (and X, C2), C1.
1786 const APInt &C1) {
1787 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1788
1789 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1790 // TODO: We canonicalize to the longer form for scalars because we have
1791 // better analysis/folds for icmp, and codegen may be better with icmp.
1792 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1793 match(And->getOperand(1), m_One()))
1794 return new TruncInst(And->getOperand(0), Cmp.getType());
1795
1796 const APInt *C2;
1797 Value *X;
1798 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1799 return nullptr;
1800
1801 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1802 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1803 C2->isNegatedPowerOf2())
1804 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1805 ConstantInt::get(X->getType(), ~*C2));
1806 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1807 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1808 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1809 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1810 ConstantInt::get(X->getType(), -*C2));
1811
1812 // Don't perform the following transforms if the AND has multiple uses
1813 if (!And->hasOneUse())
1814 return nullptr;
1815
1816 if (Cmp.isEquality() && C1.isZero()) {
1817 // Restrict this fold to single-use 'and' (PR10267).
1818 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1819 if (C2->isSignMask()) {
1820 Constant *Zero = Constant::getNullValue(X->getType());
1821 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1822 return new ICmpInst(NewPred, X, Zero);
1823 }
1824
1825 APInt NewC2 = *C2;
1826 KnownBits Know = computeKnownBits(And->getOperand(0), And);
1827 // Set high zeros of C2 to allow matching negated power-of-2.
1828 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1829 Know.countMinLeadingZeros());
1830
1831 // Restrict this fold only for single-use 'and' (PR10267).
1832 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1833 if (NewC2.isNegatedPowerOf2()) {
1834 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1835 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1836 return new ICmpInst(NewPred, X, NegBOC);
1837 }
1838 }
1839
1840 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1841 // the input width without changing the value produced, eliminate the cast:
1842 //
1843 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1844 //
1845 // We can do this transformation if the constants do not have their sign bits
1846 // set or if it is an equality comparison. Extending a relational comparison
1847 // when we're checking the sign bit would not work.
1848 Value *W;
1849 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1850 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1851 // TODO: Is this a good transform for vectors? Wider types may reduce
1852 // throughput. Should this transform be limited (even for scalars) by using
1853 // shouldChangeType()?
1854 if (!Cmp.getType()->isVectorTy()) {
1855 Type *WideType = W->getType();
1856 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1857 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1858 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1859 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1860 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1861 }
1862 }
1863
1864 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1865 return I;
1866
1867 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1868 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1869 //
1870 // iff pred isn't signed
1871 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1872 match(And->getOperand(1), m_One())) {
1873 Constant *One = cast<Constant>(And->getOperand(1));
1874 Value *Or = And->getOperand(0);
1875 Value *A, *B, *LShr;
1876 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1877 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1878 unsigned UsesRemoved = 0;
1879 if (And->hasOneUse())
1880 ++UsesRemoved;
1881 if (Or->hasOneUse())
1882 ++UsesRemoved;
1883 if (LShr->hasOneUse())
1884 ++UsesRemoved;
1885
1886 // Compute A & ((1 << B) | 1)
1887 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1888 if (UsesRemoved >= RequireUsesRemoved) {
1889 Value *NewOr =
1890 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1891 /*HasNUW=*/true),
1892 One, Or->getName());
1893 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1894 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1895 }
1896 }
1897 }
1898
1899 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1900 // llvm.is.fpclass(X, fcInf|fcNan)
1901 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1902 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1903 // (icmp eq (and (bitcast X to int), ExponentMask), 0) -->
1904 // llvm.is.fpclass(X, fcSubnormal|fcZero)
1905 // (icmp ne (and (bitcast X to int), ExponentMask), 0) -->
1906 // llvm.is.fpclass(X, ~(fcSubnormal|fcZero))
1907 Value *V;
1908 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1909 Attribute::NoImplicitFloat) &&
1910 Cmp.isEquality() &&
1912 Type *FPType = V->getType()->getScalarType();
1913 if (FPType->isIEEELikeFPTy() && (C1.isZero() || C1 == *C2)) {
1914 APInt ExponentMask =
1915 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1916 if (*C2 == ExponentMask) {
1917 unsigned Mask = C1.isZero()
1920 if (isICMP_NE)
1921 Mask = ~Mask & fcAllFlags;
1922 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1923 }
1924 }
1925 }
1926
1927 return nullptr;
1928}
1929
1930/// Fold icmp (and X, Y), C.
1933 const APInt &C) {
1934 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1935 return I;
1936
1937 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1938 bool TrueIfNeg;
1939 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1940 // ((X - 1) & ~X) < 0 --> X == 0
1941 // ((X - 1) & ~X) >= 0 --> X != 0
1942 Value *X;
1943 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1944 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1945 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1946 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1947 }
1948 // (X & -X) < 0 --> X == MinSignedC
1949 // (X & -X) > -1 --> X != MinSignedC
1950 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1951 Constant *MinSignedC = ConstantInt::get(
1952 X->getType(),
1953 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1954 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1955 return new ICmpInst(NewPred, X, MinSignedC);
1956 }
1957 }
1958
1959 // TODO: These all require that Y is constant too, so refactor with the above.
1960
1961 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1962 Value *X = And->getOperand(0);
1963 Value *Y = And->getOperand(1);
1964 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1965 if (auto *LI = dyn_cast<LoadInst>(X))
1966 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1967 if (Instruction *Res = foldCmpLoadFromIndexedGlobal(LI, GEP, Cmp, C2))
1968 return Res;
1969
1970 if (!Cmp.isEquality())
1971 return nullptr;
1972
1973 // X & -C == -C -> X > u ~C
1974 // X & -C != -C -> X <= u ~C
1975 // iff C is a power of 2
1976 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1977 auto NewPred =
1979 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1980 }
1981
1982 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1983 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1984 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1985 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1987 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1988 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1989 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1990 Value *And = Builder.CreateAnd(TruncY, X);
1992 }
1993 return BinaryOperator::CreateAnd(TruncY, X);
1994 }
1995
1996 // (icmp eq/ne (and (shl -1, X), Y), 0)
1997 // -> (icmp eq/ne (lshr Y, X), 0)
1998 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1999 // highly unlikely the non-zero case will ever show up in code.
2000 if (C.isZero() &&
2002 m_Value(Y))))) {
2003 Value *LShr = Builder.CreateLShr(Y, X);
2004 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
2005 }
2006
2007 // (icmp eq/ne (and (add A, Addend), Msk), C)
2008 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2009 {
2010 Value *A;
2011 const APInt *Addend, *Msk;
2012 if (match(And, m_And(m_OneUse(m_Add(m_Value(A), m_APInt(Addend))),
2013 m_LowBitMask(Msk))) &&
2014 C.ule(*Msk)) {
2015 APInt NewComperand = (C - *Addend) & *Msk;
2016 Value *MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2017 return new ICmpInst(Pred, MaskA,
2018 ConstantInt::get(MaskA->getType(), NewComperand));
2019 }
2020 }
2021
2022 return nullptr;
2023}
2024
2025/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2027 InstCombiner::BuilderTy &Builder) {
2028 // Are we using xors or subs to bitwise check for a pair or pairs of
2029 // (in)equalities? Convert to a shorter form that has more potential to be
2030 // folded even further.
2031 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2032 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2033 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2034 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2035 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2036 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2038 SmallVector<Value *, 16> WorkList(1, Or);
2039
2040 while (!WorkList.empty()) {
2041 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2042 Value *Lhs, *Rhs;
2043
2044 if (match(OrOperatorArgument,
2045 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2046 CmpValues.emplace_back(Lhs, Rhs);
2047 return;
2048 }
2049
2050 if (match(OrOperatorArgument,
2051 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2052 CmpValues.emplace_back(Lhs, Rhs);
2053 return;
2054 }
2055
2056 WorkList.push_back(OrOperatorArgument);
2057 };
2058
2059 Value *CurrentValue = WorkList.pop_back_val();
2060 Value *OrOperatorLhs, *OrOperatorRhs;
2061
2062 if (!match(CurrentValue,
2063 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2064 return nullptr;
2065 }
2066
2067 MatchOrOperatorArgument(OrOperatorRhs);
2068 MatchOrOperatorArgument(OrOperatorLhs);
2069 }
2070
2071 ICmpInst::Predicate Pred = Cmp.getPredicate();
2072 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2073 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2074 CmpValues.rbegin()->second);
2075
2076 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2077 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2078 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2079 }
2080
2081 return LhsCmp;
2082}
2083
2084/// Fold icmp (or X, Y), C.
2087 const APInt &C) {
2088 ICmpInst::Predicate Pred = Cmp.getPredicate();
2089 if (C.isOne()) {
2090 // icmp slt signum(V) 1 --> icmp slt V, 1
2091 Value *V = nullptr;
2092 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2093 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2094 ConstantInt::get(V->getType(), 1));
2095 }
2096
2097 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2098
2099 // (icmp eq/ne (or disjoint x, C0), C1)
2100 // -> (icmp eq/ne x, C0^C1)
2101 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2102 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2103 Value *NewC =
2104 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2105 return new ICmpInst(Pred, OrOp0, NewC);
2106 }
2107
2108 const APInt *MaskC;
2109 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2110 if (*MaskC == C && (C + 1).isPowerOf2()) {
2111 // X | C == C --> X <=u C
2112 // X | C != C --> X >u C
2113 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2115 return new ICmpInst(Pred, OrOp0, OrOp1);
2116 }
2117
2118 // More general: canonicalize 'equality with set bits mask' to
2119 // 'equality with clear bits mask'.
2120 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2121 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2122 if (Or->hasOneUse()) {
2123 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2124 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2125 return new ICmpInst(Pred, And, NewC);
2126 }
2127 }
2128
2129 // (X | (X-1)) s< 0 --> X s< 1
2130 // (X | (X-1)) s> -1 --> X s> 0
2131 Value *X;
2132 bool TrueIfSigned;
2133 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2135 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2136 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2137 return new ICmpInst(NewPred, X, NewC);
2138 }
2139
2140 const APInt *OrC;
2141 // icmp(X | OrC, C) --> icmp(X, 0)
2142 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2143 switch (Pred) {
2144 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2145 case ICmpInst::ICMP_SLT:
2146 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2147 case ICmpInst::ICMP_SGE:
2148 if (OrC->sge(C))
2149 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2150 break;
2151 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2152 case ICmpInst::ICMP_SLE:
2153 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2154 case ICmpInst::ICMP_SGT:
2155 if (OrC->sgt(C))
2157 ConstantInt::getNullValue(X->getType()));
2158 break;
2159 default:
2160 break;
2161 }
2162 }
2163
2164 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2165 return nullptr;
2166
2167 Value *P, *Q;
2169 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2170 // -> and (icmp eq P, null), (icmp eq Q, null).
2171 Value *CmpP =
2172 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2173 Value *CmpQ =
2174 Builder.CreateICmp(Pred, Q, ConstantInt::getNullValue(Q->getType()));
2175 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2176 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2177 }
2178
2179 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2180 return replaceInstUsesWith(Cmp, V);
2181
2182 return nullptr;
2183}
2184
2185/// Fold icmp (mul X, Y), C.
2188 const APInt &C) {
2189 ICmpInst::Predicate Pred = Cmp.getPredicate();
2190 Type *MulTy = Mul->getType();
2191 Value *X = Mul->getOperand(0);
2192
2193 // If there's no overflow:
2194 // X * X == 0 --> X == 0
2195 // X * X != 0 --> X != 0
2196 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2197 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2198 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2199
2200 const APInt *MulC;
2201 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2202 return nullptr;
2203
2204 // If this is a test of the sign bit and the multiply is sign-preserving with
2205 // a constant operand, use the multiply LHS operand instead:
2206 // (X * +MulC) < 0 --> X < 0
2207 // (X * -MulC) < 0 --> X > 0
2208 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2209 if (MulC->isNegative())
2210 Pred = ICmpInst::getSwappedPredicate(Pred);
2211 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2212 }
2213
2214 if (MulC->isZero())
2215 return nullptr;
2216
2217 // If the multiply does not wrap or the constant is odd, try to divide the
2218 // compare constant by the multiplication factor.
2219 if (Cmp.isEquality()) {
2220 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2221 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2222 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2223 return new ICmpInst(Pred, X, NewC);
2224 }
2225
2226 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2227 // correct to transform if MulC * N == C including overflow. I.e with i8
2228 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2229 // miss that case.
2230 if (C.urem(*MulC).isZero()) {
2231 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2232 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2233 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2234 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2235 return new ICmpInst(Pred, X, NewC);
2236 }
2237 }
2238 }
2239
2240 // With a matching no-overflow guarantee, fold the constants:
2241 // (X * MulC) < C --> X < (C / MulC)
2242 // (X * MulC) > C --> X > (C / MulC)
2243 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2244 Constant *NewC = nullptr;
2245 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2246 // MININT / -1 --> overflow.
2247 if (C.isMinSignedValue() && MulC->isAllOnes())
2248 return nullptr;
2249 if (MulC->isNegative())
2250 Pred = ICmpInst::getSwappedPredicate(Pred);
2251
2252 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2253 NewC = ConstantInt::get(
2255 } else {
2256 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2257 "Unexpected predicate");
2258 NewC = ConstantInt::get(
2260 }
2261 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2262 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2263 NewC = ConstantInt::get(
2265 } else {
2266 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2267 "Unexpected predicate");
2268 NewC = ConstantInt::get(
2270 }
2271 }
2272
2273 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2274}
2275
2276/// Fold icmp (shl nuw C2, Y), C.
2278 const APInt &C) {
2279 Value *Y;
2280 const APInt *C2;
2281 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2282 return nullptr;
2283
2284 Type *ShiftType = Shl->getType();
2285 unsigned TypeBits = C.getBitWidth();
2286 ICmpInst::Predicate Pred = Cmp.getPredicate();
2287 if (Cmp.isUnsigned()) {
2288 if (C2->isZero() || C2->ugt(C))
2289 return nullptr;
2290 APInt Div, Rem;
2291 APInt::udivrem(C, *C2, Div, Rem);
2292 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2293
2294 // (1 << Y) pred C -> Y pred Log2(C)
2295 if (!CIsPowerOf2) {
2296 // (1 << Y) < 30 -> Y <= 4
2297 // (1 << Y) <= 30 -> Y <= 4
2298 // (1 << Y) >= 30 -> Y > 4
2299 // (1 << Y) > 30 -> Y > 4
2300 if (Pred == ICmpInst::ICMP_ULT)
2301 Pred = ICmpInst::ICMP_ULE;
2302 else if (Pred == ICmpInst::ICMP_UGE)
2303 Pred = ICmpInst::ICMP_UGT;
2304 }
2305
2306 unsigned CLog2 = Div.logBase2();
2307 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2308 } else if (Cmp.isSigned() && C2->isOne()) {
2309 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2310 // (1 << Y) > 0 -> Y != 31
2311 // (1 << Y) > C -> Y != 31 if C is negative.
2312 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2313 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2314
2315 // (1 << Y) < 0 -> Y == 31
2316 // (1 << Y) < 1 -> Y == 31
2317 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2318 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2319 if (Pred == ICmpInst::ICMP_SLT && (C - 1).sle(0))
2320 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2321 }
2322
2323 return nullptr;
2324}
2325
2326/// Fold icmp (shl X, Y), C.
2328 BinaryOperator *Shl,
2329 const APInt &C) {
2330 const APInt *ShiftVal;
2331 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2332 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2333
2334 ICmpInst::Predicate Pred = Cmp.getPredicate();
2335 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2336 // -> (icmp pred X, Csle0)
2337 //
2338 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2339 // so X's must be what is used.
2340 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2341 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2342
2343 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2344 // -> (icmp eq/ne X, 0)
2345 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2346 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2347 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2348
2349 // (icmp slt (shl nsw X, Y), 0/1)
2350 // -> (icmp slt X, 0/1)
2351 // (icmp sgt (shl nsw X, Y), 0/-1)
2352 // -> (icmp sgt X, 0/-1)
2353 //
2354 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2355 if (Shl->hasNoSignedWrap() &&
2356 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2357 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2358 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2359
2360 const APInt *ShiftAmt;
2361 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2362 return foldICmpShlLHSC(Cmp, Shl, C);
2363
2364 // Check that the shift amount is in range. If not, don't perform undefined
2365 // shifts. When the shift is visited, it will be simplified.
2366 unsigned TypeBits = C.getBitWidth();
2367 if (ShiftAmt->uge(TypeBits))
2368 return nullptr;
2369
2370 Value *X = Shl->getOperand(0);
2371 Type *ShType = Shl->getType();
2372
2373 // NSW guarantees that we are only shifting out sign bits from the high bits,
2374 // so we can ASHR the compare constant without needing a mask and eliminate
2375 // the shift.
2376 if (Shl->hasNoSignedWrap()) {
2377 if (Pred == ICmpInst::ICMP_SGT) {
2378 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2379 APInt ShiftedC = C.ashr(*ShiftAmt);
2380 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2381 }
2382 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2383 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2384 APInt ShiftedC = C.ashr(*ShiftAmt);
2385 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2386 }
2387 if (Pred == ICmpInst::ICMP_SLT) {
2388 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2389 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2390 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2391 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2392 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2393 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2394 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2395 }
2396 }
2397
2398 // NUW guarantees that we are only shifting out zero bits from the high bits,
2399 // so we can LSHR the compare constant without needing a mask and eliminate
2400 // the shift.
2401 if (Shl->hasNoUnsignedWrap()) {
2402 if (Pred == ICmpInst::ICMP_UGT) {
2403 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2404 APInt ShiftedC = C.lshr(*ShiftAmt);
2405 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2406 }
2407 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2408 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2409 APInt ShiftedC = C.lshr(*ShiftAmt);
2410 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2411 }
2412 if (Pred == ICmpInst::ICMP_ULT) {
2413 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2414 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2415 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2416 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2417 assert(C.ugt(0) && "ult 0 should have been eliminated");
2418 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2419 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2420 }
2421 }
2422
2423 if (Cmp.isEquality() && Shl->hasOneUse()) {
2424 // Strength-reduce the shift into an 'and'.
2425 Constant *Mask = ConstantInt::get(
2426 ShType,
2427 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2428 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2429 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2430 return new ICmpInst(Pred, And, LShrC);
2431 }
2432
2433 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2434 bool TrueIfSigned = false;
2435 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2436 // (X << 31) <s 0 --> (X & 1) != 0
2437 Constant *Mask = ConstantInt::get(
2438 ShType,
2439 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2440 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2441 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2442 And, Constant::getNullValue(ShType));
2443 }
2444
2445 // Simplify 'shl' inequality test into 'and' equality test.
2446 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2447 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2448 if ((C + 1).isPowerOf2() &&
2449 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2450 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2451 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2453 And, Constant::getNullValue(ShType));
2454 }
2455 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2456 if (C.isPowerOf2() &&
2457 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2458 Value *And =
2459 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2460 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2462 And, Constant::getNullValue(ShType));
2463 }
2464 }
2465
2466 // Transform (icmp pred iM (shl iM %v, N), C)
2467 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2468 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2469 // This enables us to get rid of the shift in favor of a trunc that may be
2470 // free on the target. It has the additional benefit of comparing to a
2471 // smaller constant that may be more target-friendly.
2472 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2473 if (Shl->hasOneUse() && Amt != 0 &&
2474 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2475 ICmpInst::Predicate CmpPred = Pred;
2476 APInt RHSC = C;
2477
2478 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2479 // Try the flipped strictness predicate.
2480 // e.g.:
2481 // icmp ult i64 (shl X, 32), 8589934593 ->
2482 // icmp ule i64 (shl X, 32), 8589934592 ->
2483 // icmp ule i32 (trunc X, i32), 2 ->
2484 // icmp ult i32 (trunc X, i32), 3
2485 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2486 Pred, ConstantInt::get(ShType->getContext(), C))) {
2487 CmpPred = FlippedStrictness->first;
2488 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2489 }
2490 }
2491
2492 if (RHSC.countr_zero() >= Amt) {
2493 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2494 Constant *NewC =
2495 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2496 return new ICmpInst(CmpPred,
2497 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2498 Shl->hasNoSignedWrap()),
2499 NewC);
2500 }
2501 }
2502
2503 return nullptr;
2504}
2505
2506/// Fold icmp ({al}shr X, Y), C.
2508 BinaryOperator *Shr,
2509 const APInt &C) {
2510 // An exact shr only shifts out zero bits, so:
2511 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2512 Value *X = Shr->getOperand(0);
2513 CmpInst::Predicate Pred = Cmp.getPredicate();
2514 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2515 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2516
2517 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2518 const APInt *ShiftValC;
2519 if (match(X, m_APInt(ShiftValC))) {
2520 if (Cmp.isEquality())
2521 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2522
2523 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2524 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2525 bool TrueIfSigned;
2526 if (!IsAShr && ShiftValC->isNegative() &&
2527 isSignBitCheck(Pred, C, TrueIfSigned))
2528 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2529 Shr->getOperand(1),
2530 ConstantInt::getNullValue(X->getType()));
2531
2532 // If the shifted constant is a power-of-2, test the shift amount directly:
2533 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2534 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2535 if (!IsAShr && ShiftValC->isPowerOf2() &&
2536 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2537 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2538 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2539 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2540
2541 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2542 unsigned ShiftLZ = ShiftValC->countl_zero();
2543 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2544 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2545 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2546 }
2547 }
2548
2549 const APInt *ShiftAmtC;
2550 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2551 return nullptr;
2552
2553 // Check that the shift amount is in range. If not, don't perform undefined
2554 // shifts. When the shift is visited it will be simplified.
2555 unsigned TypeBits = C.getBitWidth();
2556 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2557 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2558 return nullptr;
2559
2560 bool IsExact = Shr->isExact();
2561 Type *ShrTy = Shr->getType();
2562 // TODO: If we could guarantee that InstSimplify would handle all of the
2563 // constant-value-based preconditions in the folds below, then we could assert
2564 // those conditions rather than checking them. This is difficult because of
2565 // undef/poison (PR34838).
2566 if (IsAShr && Shr->hasOneUse()) {
2567 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2568 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2569 // When C - 1 is a power of two and the transform can be legally
2570 // performed, prefer this form so the produced constant is close to a
2571 // power of two.
2572 // icmp slt/ult (ashr exact X, ShAmtC), C
2573 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2574 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2575 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2576 }
2577 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2578 // When ShAmtC can be shifted losslessly:
2579 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2580 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2581 APInt ShiftedC = C.shl(ShAmtVal);
2582 if (ShiftedC.ashr(ShAmtVal) == C)
2583 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2584 }
2585 if (Pred == CmpInst::ICMP_SGT) {
2586 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2587 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2588 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2589 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2590 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2591 }
2592 if (Pred == CmpInst::ICMP_UGT) {
2593 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2594 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2595 // clause accounts for that pattern.
2596 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2597 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2598 (C + 1).shl(ShAmtVal).isMinSignedValue())
2599 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2600 }
2601
2602 // If the compare constant has significant bits above the lowest sign-bit,
2603 // then convert an unsigned cmp to a test of the sign-bit:
2604 // (ashr X, ShiftC) u> C --> X s< 0
2605 // (ashr X, ShiftC) u< C --> X s> -1
2606 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2607 if (Pred == CmpInst::ICMP_UGT) {
2608 return new ICmpInst(CmpInst::ICMP_SLT, X,
2610 }
2611 if (Pred == CmpInst::ICMP_ULT) {
2612 return new ICmpInst(CmpInst::ICMP_SGT, X,
2614 }
2615 }
2616 } else if (!IsAShr) {
2617 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2618 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2619 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2620 APInt ShiftedC = C.shl(ShAmtVal);
2621 if (ShiftedC.lshr(ShAmtVal) == C)
2622 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2623 }
2624 if (Pred == CmpInst::ICMP_UGT) {
2625 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2626 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2627 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2628 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2629 }
2630 }
2631
2632 if (!Cmp.isEquality())
2633 return nullptr;
2634
2635 // Handle equality comparisons of shift-by-constant.
2636
2637 // If the comparison constant changes with the shift, the comparison cannot
2638 // succeed (bits of the comparison constant cannot match the shifted value).
2639 // This should be known by InstSimplify and already be folded to true/false.
2640 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2641 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2642 "Expected icmp+shr simplify did not occur.");
2643
2644 // If the bits shifted out are known zero, compare the unshifted value:
2645 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2646 if (Shr->isExact())
2647 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2648
2649 if (Shr->hasOneUse()) {
2650 // Canonicalize the shift into an 'and':
2651 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2652 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2653 Constant *Mask = ConstantInt::get(ShrTy, Val);
2654 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2655 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2656 }
2657
2658 return nullptr;
2659}
2660
2662 BinaryOperator *SRem,
2663 const APInt &C) {
2664 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2665 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2666 // Canonicalize unsigned predicates to signed:
2667 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2668 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2669 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2670 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2671
2672 const APInt *DivisorC;
2673 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2674 return nullptr;
2675 if (DivisorC->isZero())
2676 return nullptr;
2677
2678 APInt NormalizedC = C;
2679 if (Pred == ICmpInst::ICMP_ULT) {
2680 assert(!NormalizedC.isZero() &&
2681 "ult X, 0 should have been simplified already.");
2682 --NormalizedC;
2683 }
2684 if (C.isNegative())
2685 NormalizedC.flipAllBits();
2686 if (!NormalizedC.uge(DivisorC->abs() - 1))
2687 return nullptr;
2688
2689 Type *Ty = SRem->getType();
2690 if (Pred == ICmpInst::ICMP_UGT)
2691 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2693 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2695 }
2696 // Match an 'is positive' or 'is negative' comparison of remainder by a
2697 // constant power-of-2 value:
2698 // (X % pow2C) sgt/slt 0
2699 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2700 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2701 return nullptr;
2702
2703 // TODO: The one-use check is standard because we do not typically want to
2704 // create longer instruction sequences, but this might be a special-case
2705 // because srem is not good for analysis or codegen.
2706 if (!SRem->hasOneUse())
2707 return nullptr;
2708
2709 const APInt *DivisorC;
2710 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2711 return nullptr;
2712
2713 // For cmp_sgt/cmp_slt only zero valued C is handled.
2714 // For cmp_eq/cmp_ne only positive valued C is handled.
2715 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2716 !C.isZero()) ||
2717 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2718 !C.isStrictlyPositive()))
2719 return nullptr;
2720
2721 // Mask off the sign bit and the modulo bits (low-bits).
2722 Type *Ty = SRem->getType();
2723 APInt SignMask = APInt::getSignMask(Ty->getScalarSizeInBits());
2724 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2725 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2726
2727 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2728 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2729
2730 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2731 // bit is set. Example:
2732 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2733 if (Pred == ICmpInst::ICMP_SGT)
2735
2736 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2737 // bit is set. Example:
2738 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2739 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2740}
2741
2742/// Fold icmp (udiv X, Y), C.
2744 BinaryOperator *UDiv,
2745 const APInt &C) {
2746 ICmpInst::Predicate Pred = Cmp.getPredicate();
2747 Value *X = UDiv->getOperand(0);
2748 Value *Y = UDiv->getOperand(1);
2749 Type *Ty = UDiv->getType();
2750
2751 const APInt *C2;
2752 if (!match(X, m_APInt(C2)))
2753 return nullptr;
2754
2755 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2756
2757 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2758 if (Pred == ICmpInst::ICMP_UGT) {
2759 assert(!C.isMaxValue() &&
2760 "icmp ugt X, UINT_MAX should have been simplified already.");
2761 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2762 ConstantInt::get(Ty, C2->udiv(C + 1)));
2763 }
2764
2765 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2766 if (Pred == ICmpInst::ICMP_ULT) {
2767 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2768 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2769 ConstantInt::get(Ty, C2->udiv(C)));
2770 }
2771
2772 return nullptr;
2773}
2774
2775/// Fold icmp ({su}div X, Y), C.
2777 BinaryOperator *Div,
2778 const APInt &C) {
2779 ICmpInst::Predicate Pred = Cmp.getPredicate();
2780 Value *X = Div->getOperand(0);
2781 Value *Y = Div->getOperand(1);
2782 Type *Ty = Div->getType();
2783 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2784
2785 // If unsigned division and the compare constant is bigger than
2786 // UMAX/2 (negative), there's only one pair of values that satisfies an
2787 // equality check, so eliminate the division:
2788 // (X u/ Y) == C --> (X == C) && (Y == 1)
2789 // (X u/ Y) != C --> (X != C) || (Y != 1)
2790 // Similarly, if signed division and the compare constant is exactly SMIN:
2791 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2792 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2793 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2794 (!DivIsSigned || C.isMinSignedValue())) {
2795 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2796 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2797 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2798 return BinaryOperator::Create(Logic, XBig, YOne);
2799 }
2800
2801 // Fold: icmp pred ([us]div X, C2), C -> range test
2802 // Fold this div into the comparison, producing a range check.
2803 // Determine, based on the divide type, what the range is being
2804 // checked. If there is an overflow on the low or high side, remember
2805 // it, otherwise compute the range [low, hi) bounding the new value.
2806 // See: InsertRangeTest above for the kinds of replacements possible.
2807 const APInt *C2;
2808 if (!match(Y, m_APInt(C2)))
2809 return nullptr;
2810
2811 // FIXME: If the operand types don't match the type of the divide
2812 // then don't attempt this transform. The code below doesn't have the
2813 // logic to deal with a signed divide and an unsigned compare (and
2814 // vice versa). This is because (x /s C2) <s C produces different
2815 // results than (x /s C2) <u C or (x /u C2) <s C or even
2816 // (x /u C2) <u C. Simply casting the operands and result won't
2817 // work. :( The if statement below tests that condition and bails
2818 // if it finds it.
2819 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2820 return nullptr;
2821
2822 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2823 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2824 // division-by-constant cases should be present, we can not assert that they
2825 // have happened before we reach this icmp instruction.
2826 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2827 return nullptr;
2828
2829 // Compute Prod = C * C2. We are essentially solving an equation of
2830 // form X / C2 = C. We solve for X by multiplying C2 and C.
2831 // By solving for X, we can turn this into a range check instead of computing
2832 // a divide.
2833 APInt Prod = C * *C2;
2834
2835 // Determine if the product overflows by seeing if the product is not equal to
2836 // the divide. Make sure we do the same kind of divide as in the LHS
2837 // instruction that we're folding.
2838 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2839
2840 // If the division is known to be exact, then there is no remainder from the
2841 // divide, so the covered range size is unit, otherwise it is the divisor.
2842 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2843
2844 // Figure out the interval that is being checked. For example, a comparison
2845 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2846 // Compute this interval based on the constants involved and the signedness of
2847 // the compare/divide. This computes a half-open interval, keeping track of
2848 // whether either value in the interval overflows. After analysis each
2849 // overflow variable is set to 0 if it's corresponding bound variable is valid
2850 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2851 int LoOverflow = 0, HiOverflow = 0;
2852 APInt LoBound, HiBound;
2853
2854 if (!DivIsSigned) { // udiv
2855 // e.g. X/5 op 3 --> [15, 20)
2856 LoBound = Prod;
2857 HiOverflow = LoOverflow = ProdOV;
2858 if (!HiOverflow) {
2859 // If this is not an exact divide, then many values in the range collapse
2860 // to the same result value.
2861 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2862 }
2863 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2864 if (C.isZero()) { // (X / pos) op 0
2865 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2866 LoBound = -(RangeSize - 1);
2867 HiBound = RangeSize;
2868 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2869 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2870 HiOverflow = LoOverflow = ProdOV;
2871 if (!HiOverflow)
2872 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2873 } else { // (X / pos) op neg
2874 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2875 HiBound = Prod + 1;
2876 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2877 if (!LoOverflow) {
2878 APInt DivNeg = -RangeSize;
2879 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2880 }
2881 }
2882 } else if (C2->isNegative()) { // Divisor is < 0.
2883 if (Div->isExact())
2884 RangeSize.negate();
2885 if (C.isZero()) { // (X / neg) op 0
2886 // e.g. X/-5 op 0 --> [-4, 5)
2887 LoBound = RangeSize + 1;
2888 HiBound = -RangeSize;
2889 if (HiBound == *C2) { // -INTMIN = INTMIN
2890 HiOverflow = 1; // [INTMIN+1, overflow)
2891 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2892 }
2893 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2894 // e.g. X/-5 op 3 --> [-19, -14)
2895 HiBound = Prod + 1;
2896 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2897 if (!LoOverflow)
2898 LoOverflow =
2899 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2900 } else { // (X / neg) op neg
2901 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2902 LoOverflow = HiOverflow = ProdOV;
2903 if (!HiOverflow)
2904 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2905 }
2906
2907 // Dividing by a negative swaps the condition. LT <-> GT
2908 Pred = ICmpInst::getSwappedPredicate(Pred);
2909 }
2910
2911 switch (Pred) {
2912 default:
2913 llvm_unreachable("Unhandled icmp predicate!");
2914 case ICmpInst::ICMP_EQ:
2915 if (LoOverflow && HiOverflow)
2916 return replaceInstUsesWith(Cmp, Builder.getFalse());
2917 if (HiOverflow)
2918 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2919 X, ConstantInt::get(Ty, LoBound));
2920 if (LoOverflow)
2921 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2922 X, ConstantInt::get(Ty, HiBound));
2923 return replaceInstUsesWith(
2924 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2925 case ICmpInst::ICMP_NE:
2926 if (LoOverflow && HiOverflow)
2927 return replaceInstUsesWith(Cmp, Builder.getTrue());
2928 if (HiOverflow)
2929 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2930 X, ConstantInt::get(Ty, LoBound));
2931 if (LoOverflow)
2932 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2933 X, ConstantInt::get(Ty, HiBound));
2934 return replaceInstUsesWith(
2935 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2936 case ICmpInst::ICMP_ULT:
2937 case ICmpInst::ICMP_SLT:
2938 if (LoOverflow == +1) // Low bound is greater than input range.
2939 return replaceInstUsesWith(Cmp, Builder.getTrue());
2940 if (LoOverflow == -1) // Low bound is less than input range.
2941 return replaceInstUsesWith(Cmp, Builder.getFalse());
2942 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2943 case ICmpInst::ICMP_UGT:
2944 case ICmpInst::ICMP_SGT:
2945 if (HiOverflow == +1) // High bound greater than input range.
2946 return replaceInstUsesWith(Cmp, Builder.getFalse());
2947 if (HiOverflow == -1) // High bound less than input range.
2948 return replaceInstUsesWith(Cmp, Builder.getTrue());
2949 if (Pred == ICmpInst::ICMP_UGT)
2950 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2951 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2952 }
2953
2954 return nullptr;
2955}
2956
2957/// Fold icmp (sub X, Y), C.
2960 const APInt &C) {
2961 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2962 ICmpInst::Predicate Pred = Cmp.getPredicate();
2963 Type *Ty = Sub->getType();
2964
2965 // (SubC - Y) == C) --> Y == (SubC - C)
2966 // (SubC - Y) != C) --> Y != (SubC - C)
2967 Constant *SubC;
2968 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2969 return new ICmpInst(Pred, Y,
2970 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2971 }
2972
2973 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2974 const APInt *C2;
2975 APInt SubResult;
2976 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2977 bool HasNSW = Sub->hasNoSignedWrap();
2978 bool HasNUW = Sub->hasNoUnsignedWrap();
2979 if (match(X, m_APInt(C2)) &&
2980 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2981 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2982 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2983
2984 // X - Y == 0 --> X == Y.
2985 // X - Y != 0 --> X != Y.
2986 // TODO: We allow this with multiple uses as long as the other uses are not
2987 // in phis. The phi use check is guarding against a codegen regression
2988 // for a loop test. If the backend could undo this (and possibly
2989 // subsequent transforms), we would not need this hack.
2990 if (Cmp.isEquality() && C.isZero() &&
2991 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2992 return new ICmpInst(Pred, X, Y);
2993
2994 // The following transforms are only worth it if the only user of the subtract
2995 // is the icmp.
2996 // TODO: This is an artificial restriction for all of the transforms below
2997 // that only need a single replacement icmp. Can these use the phi test
2998 // like the transform above here?
2999 if (!Sub->hasOneUse())
3000 return nullptr;
3001
3002 if (Sub->hasNoSignedWrap()) {
3003 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3004 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3005 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3006
3007 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3008 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3009 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3010
3011 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3012 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3013 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3014
3015 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3016 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3017 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3018 }
3019
3020 if (!match(X, m_APInt(C2)))
3021 return nullptr;
3022
3023 // C2 - Y <u C -> (Y | (C - 1)) == C2
3024 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3025 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3026 (*C2 & (C - 1)) == (C - 1))
3027 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3028
3029 // C2 - Y >u C -> (Y | C) != C2
3030 // iff C2 & C == C and C + 1 is a power of 2
3031 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3032 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3033
3034 // We have handled special cases that reduce.
3035 // Canonicalize any remaining sub to add as:
3036 // (C2 - Y) > C --> (Y + ~C2) < ~C
3037 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3038 HasNUW, HasNSW);
3039 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3040}
3041
3042static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3043 Value *Op1, IRBuilderBase &Builder,
3044 bool HasOneUse) {
3045 auto FoldConstant = [&](bool Val) {
3046 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3047 if (Op0->getType()->isVectorTy())
3049 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3050 return Res;
3051 };
3052
3053 switch (Table.to_ulong()) {
3054 case 0: // 0 0 0 0
3055 return FoldConstant(false);
3056 case 1: // 0 0 0 1
3057 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3058 case 2: // 0 0 1 0
3059 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3060 case 3: // 0 0 1 1
3061 return Builder.CreateNot(Op0);
3062 case 4: // 0 1 0 0
3063 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3064 case 5: // 0 1 0 1
3065 return Builder.CreateNot(Op1);
3066 case 6: // 0 1 1 0
3067 return Builder.CreateXor(Op0, Op1);
3068 case 7: // 0 1 1 1
3069 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3070 case 8: // 1 0 0 0
3071 return Builder.CreateAnd(Op0, Op1);
3072 case 9: // 1 0 0 1
3073 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3074 case 10: // 1 0 1 0
3075 return Op1;
3076 case 11: // 1 0 1 1
3077 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3078 case 12: // 1 1 0 0
3079 return Op0;
3080 case 13: // 1 1 0 1
3081 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3082 case 14: // 1 1 1 0
3083 return Builder.CreateOr(Op0, Op1);
3084 case 15: // 1 1 1 1
3085 return FoldConstant(true);
3086 default:
3087 llvm_unreachable("Invalid Operation");
3088 }
3089 return nullptr;
3090}
3091
3093 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3094 Value *A, *B;
3095 Constant *C1, *C2, *C3, *C4;
3096 if (!(match(BO->getOperand(0),
3097 m_Select(m_Value(A), m_Constant(C1), m_Constant(C2)))) ||
3098 !match(BO->getOperand(1),
3099 m_Select(m_Value(B), m_Constant(C3), m_Constant(C4))) ||
3100 Cmp.getType() != A->getType() || Cmp.getType() != B->getType())
3101 return nullptr;
3102
3103 std::bitset<4> Table;
3104 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3105 Constant *L = First ? C1 : C2;
3106 Constant *R = Second ? C3 : C4;
3107 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3108 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3109 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3110 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3111 }
3112 return std::nullopt;
3113 };
3114
3115 for (unsigned I = 0; I < 4; ++I) {
3116 bool First = (I >> 1) & 1;
3117 bool Second = I & 1;
3118 if (auto Res = ComputeTable(First, Second))
3119 Table[I] = *Res;
3120 else
3121 return nullptr;
3122 }
3123
3124 // Synthesize optimal logic.
3125 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3126 return replaceInstUsesWith(Cmp, Cond);
3127 return nullptr;
3128}
3129
3130/// Fold icmp (add X, Y), C.
3133 const APInt &C) {
3134 Value *Y = Add->getOperand(1);
3135 Value *X = Add->getOperand(0);
3136
3137 Value *Op0, *Op1;
3138 Instruction *Ext0, *Ext1;
3139 const CmpPredicate Pred = Cmp.getCmpPredicate();
3140 if (match(Add,
3143 m_ZExtOrSExt(m_Value(Op1))))) &&
3144 Op0->getType()->isIntOrIntVectorTy(1) &&
3145 Op1->getType()->isIntOrIntVectorTy(1)) {
3146 unsigned BW = C.getBitWidth();
3147 std::bitset<4> Table;
3148 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
3149 APInt Res(BW, 0);
3150 if (Op0Val)
3151 Res += APInt(BW, isa<ZExtInst>(Ext0) ? 1 : -1, /*isSigned=*/true);
3152 if (Op1Val)
3153 Res += APInt(BW, isa<ZExtInst>(Ext1) ? 1 : -1, /*isSigned=*/true);
3154 return ICmpInst::compare(Res, C, Pred);
3155 };
3156
3157 Table[0] = ComputeTable(false, false);
3158 Table[1] = ComputeTable(false, true);
3159 Table[2] = ComputeTable(true, false);
3160 Table[3] = ComputeTable(true, true);
3161 if (auto *Cond =
3162 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3163 return replaceInstUsesWith(Cmp, Cond);
3164 }
3165
3166 // icmp ult (add nuw A, (lshr A, ShAmtC)), C --> icmp ult A, C
3167 // when C <= (1 << ShAmtC).
3168 const APInt *ShAmtC;
3169 Value *A;
3170 unsigned BitWidth = C.getBitWidth();
3171 if (Pred == ICmpInst::ICMP_ULT &&
3172 match(Add,
3173 m_c_NUWAdd(m_Value(A), m_LShr(m_Deferred(A), m_APInt(ShAmtC)))) &&
3174 ShAmtC->ult(BitWidth) &&
3175 C.ule(APInt::getOneBitSet(BitWidth, ShAmtC->getZExtValue())))
3176 return new ICmpInst(Pred, A, ConstantInt::get(A->getType(), C));
3177
3178 const APInt *C2;
3179 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3180 return nullptr;
3181
3182 // Fold icmp pred (add X, C2), C.
3183 Type *Ty = Add->getType();
3184
3185 // If the add does not wrap, we can always adjust the compare by subtracting
3186 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3187 // have been canonicalized to SGT/SLT/UGT/ULT.
3188 if (Add->hasNoUnsignedWrap() &&
3189 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT)) {
3190 bool Overflow;
3191 APInt NewC = C.usub_ov(*C2, Overflow);
3192 // If there is overflow, the result must be true or false.
3193 if (!Overflow)
3194 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3195 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3196 }
3197
3198 CmpInst::Predicate ChosenPred = Pred.getPreferredSignedPredicate();
3199
3200 if (Add->hasNoSignedWrap() &&
3201 (ChosenPred == ICmpInst::ICMP_SGT || ChosenPred == ICmpInst::ICMP_SLT)) {
3202 bool Overflow;
3203 APInt NewC = C.ssub_ov(*C2, Overflow);
3204 if (!Overflow)
3205 // icmp samesign ugt/ult (add nsw X, C2), C
3206 // -> icmp sgt/slt X, (C - C2)
3207 return new ICmpInst(ChosenPred, X, ConstantInt::get(Ty, NewC));
3208 }
3209
3210 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3211 C.isNonNegative() && (C - *C2).isNonNegative() &&
3212 computeConstantRange(X, /*ForSigned=*/true).add(*C2).isAllNonNegative())
3213 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3214 ConstantInt::get(Ty, C - *C2));
3215
3216 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3217 const APInt &Upper = CR.getUpper();
3218 const APInt &Lower = CR.getLower();
3219 if (Cmp.isSigned()) {
3220 if (Lower.isSignMask())
3221 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3222 if (Upper.isSignMask())
3223 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3224 } else {
3225 if (Lower.isMinValue())
3226 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3227 if (Upper.isMinValue())
3228 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3229 }
3230
3231 // This set of folds is intentionally placed after folds that use no-wrapping
3232 // flags because those folds are likely better for later analysis/codegen.
3233 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3234 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3235
3236 // Fold compare with offset to opposite sign compare if it eliminates offset:
3237 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3238 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3239 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3240
3241 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3242 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3243 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3244
3245 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3246 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3247 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3248
3249 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3250 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3251 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3252
3253 // (X + -1) <u C --> X <=u C (if X is never null)
3254 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3255 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3256 if (llvm::isKnownNonZero(X, Q))
3257 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3258 }
3259
3260 if (!Add->hasOneUse())
3261 return nullptr;
3262
3263 // X+C <u C2 -> (X & -C2) == C
3264 // iff C & (C2-1) == 0
3265 // C2 is a power of 2
3266 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3267 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3269
3270 // X+C2 <u C -> (X & C) == 2C
3271 // iff C == -(C2)
3272 // C2 is a power of 2
3273 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3274 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3275 ConstantInt::get(Ty, C * 2));
3276
3277 // X+C >u C2 -> (X & ~C2) != C
3278 // iff C & C2 == 0
3279 // C2+1 is a power of 2
3280 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3281 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3283
3284 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3285 // to the ult form.
3286 // X+C2 >u C -> X+(C2-C-1) <u ~C
3287 if (Pred == ICmpInst::ICMP_UGT)
3288 return new ICmpInst(ICmpInst::ICMP_ULT,
3289 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3290 ConstantInt::get(Ty, ~C));
3291
3292 // zext(V) + C2 pred C -> V + C3 pred' C4
3293 Value *V;
3294 if (match(X, m_ZExt(m_Value(V)))) {
3295 Type *NewCmpTy = V->getType();
3296 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3297 if (shouldChangeType(Ty, NewCmpTy)) {
3298 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3299 CmpInst::Predicate EquivPred;
3300 APInt EquivInt;
3301 APInt EquivOffset;
3302
3303 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3304 return new ICmpInst(
3305 EquivPred,
3306 EquivOffset.isZero()
3307 ? V
3308 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3309 ConstantInt::get(NewCmpTy, EquivInt));
3310 }
3311 }
3312
3313 return nullptr;
3314}
3315
3317 Value *&RHS, ConstantInt *&Less,
3318 ConstantInt *&Equal,
3319 ConstantInt *&Greater) {
3320 // TODO: Generalize this to work with other comparison idioms or ensure
3321 // they get canonicalized into this form.
3322
3323 // select i1 (a == b),
3324 // i32 Equal,
3325 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3326 // where Equal, Less and Greater are placeholders for any three constants.
3327 CmpPredicate PredA;
3328 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3329 !ICmpInst::isEquality(PredA))
3330 return false;
3331 Value *EqualVal = SI->getTrueValue();
3332 Value *UnequalVal = SI->getFalseValue();
3333 // We still can get non-canonical predicate here, so canonicalize.
3334 if (PredA == ICmpInst::ICMP_NE)
3335 std::swap(EqualVal, UnequalVal);
3336 if (!match(EqualVal, m_ConstantInt(Equal)))
3337 return false;
3338 CmpPredicate PredB;
3339 Value *LHS2, *RHS2;
3340 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3341 m_ConstantInt(Less), m_ConstantInt(Greater))))
3342 return false;
3343 // We can get predicate mismatch here, so canonicalize if possible:
3344 // First, ensure that 'LHS' match.
3345 if (LHS2 != LHS) {
3346 // x sgt y <--> y slt x
3347 std::swap(LHS2, RHS2);
3348 PredB = ICmpInst::getSwappedPredicate(PredB);
3349 }
3350 if (LHS2 != LHS)
3351 return false;
3352 // We also need to canonicalize 'RHS'.
3353 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3354 // x sgt C-1 <--> x sge C <--> not(x slt C)
3355 auto FlippedStrictness =
3357 if (!FlippedStrictness)
3358 return false;
3359 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3360 "basic correctness failure");
3361 RHS2 = FlippedStrictness->second;
3362 // And kind-of perform the result swap.
3363 std::swap(Less, Greater);
3364 PredB = ICmpInst::ICMP_SLT;
3365 }
3366 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3367}
3368
3371 ConstantInt *C) {
3372
3373 assert(C && "Cmp RHS should be a constant int!");
3374 // If we're testing a constant value against the result of a three way
3375 // comparison, the result can be expressed directly in terms of the
3376 // original values being compared. Note: We could possibly be more
3377 // aggressive here and remove the hasOneUse test. The original select is
3378 // really likely to simplify or sink when we remove a test of the result.
3379 Value *OrigLHS, *OrigRHS;
3380 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3381 if (Cmp.hasOneUse() &&
3382 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3383 C3GreaterThan)) {
3384 assert(C1LessThan && C2Equal && C3GreaterThan);
3385
3386 bool TrueWhenLessThan = ICmpInst::compare(
3387 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3388 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3389 Cmp.getPredicate());
3390 bool TrueWhenGreaterThan = ICmpInst::compare(
3391 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3392
3393 // This generates the new instruction that will replace the original Cmp
3394 // Instruction. Instead of enumerating the various combinations when
3395 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3396 // false, we rely on chaining of ORs and future passes of InstCombine to
3397 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3398
3399 // When none of the three constants satisfy the predicate for the RHS (C),
3400 // the entire original Cmp can be simplified to a false.
3401 Value *Cond = Builder.getFalse();
3402 if (TrueWhenLessThan)
3403 Cond = Builder.CreateOr(
3404 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3405 if (TrueWhenEqual)
3406 Cond = Builder.CreateOr(
3407 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3408 if (TrueWhenGreaterThan)
3409 Cond = Builder.CreateOr(
3410 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3411
3412 return replaceInstUsesWith(Cmp, Cond);
3413 }
3414 return nullptr;
3415}
3416
3418 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3419 if (!Bitcast)
3420 return nullptr;
3421
3422 ICmpInst::Predicate Pred = Cmp.getPredicate();
3423 Value *Op1 = Cmp.getOperand(1);
3424 Value *BCSrcOp = Bitcast->getOperand(0);
3425 Type *SrcType = Bitcast->getSrcTy();
3426 Type *DstType = Bitcast->getType();
3427
3428 // Make sure the bitcast doesn't change between scalar and vector and
3429 // doesn't change the number of vector elements.
3430 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3431 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3432 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3433 Value *X;
3434 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3435 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3436 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3437 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3438 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3439 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3440 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3441 match(Op1, m_Zero()))
3442 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3443
3444 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3445 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3446 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3447
3448 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3449 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3450 return new ICmpInst(Pred, X,
3451 ConstantInt::getAllOnesValue(X->getType()));
3452 }
3453
3454 // Zero-equality checks are preserved through unsigned floating-point casts:
3455 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3456 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3457 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3458 if (Cmp.isEquality() && match(Op1, m_Zero()))
3459 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3460
3461 const APInt *C;
3462 bool TrueIfSigned;
3463 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3464 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3465 // the FP extend/truncate because that cast does not change the sign-bit.
3466 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3467 // The sign-bit is always the most significant bit in those types.
3468 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3469 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3470 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3471 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3472 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3473 Type *XType = X->getType();
3474
3475 // We can't currently handle Power style floating point operations here.
3476 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3477 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3478 if (auto *XVTy = dyn_cast<VectorType>(XType))
3479 NewType = VectorType::get(NewType, XVTy->getElementCount());
3480 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3481 if (TrueIfSigned)
3482 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3483 ConstantInt::getNullValue(NewType));
3484 else
3485 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3487 }
3488 }
3489
3490 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3491 Type *FPType = SrcType->getScalarType();
3492 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3493 Attribute::NoImplicitFloat) &&
3494 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3495 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3496 if (Mask & (fcInf | fcZero)) {
3497 if (Pred == ICmpInst::ICMP_NE)
3498 Mask = ~Mask;
3499 return replaceInstUsesWith(Cmp,
3500 Builder.createIsFPClass(BCSrcOp, Mask));
3501 }
3502 }
3503 }
3504 }
3505
3506 const APInt *C;
3507 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3508 !SrcType->isIntOrIntVectorTy())
3509 return nullptr;
3510
3511 // If this is checking if all elements of a vector compare are set or not,
3512 // invert the casted vector equality compare and test if all compare
3513 // elements are clear or not. Compare against zero is generally easier for
3514 // analysis and codegen.
3515 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3516 // Example: are all elements equal? --> are zero elements not equal?
3517 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3518 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3519 if (Value *NotBCSrcOp =
3520 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3521 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3522 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3523 }
3524 }
3525
3526 // If this is checking if all elements of an extended vector are clear or not,
3527 // compare in a narrow type to eliminate the extend:
3528 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3529 Value *X;
3530 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3531 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3532 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3533 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3534 Value *NewCast = Builder.CreateBitCast(X, NewType);
3535 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3536 }
3537 }
3538
3539 // Folding: icmp <pred> iN X, C
3540 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3541 // and C is a splat of a K-bit pattern
3542 // and SC is a constant vector = <C', C', C', ..., C'>
3543 // Into:
3544 // %E = extractelement <M x iK> %vec, i32 C'
3545 // icmp <pred> iK %E, trunc(C)
3546 Value *Vec;
3547 ArrayRef<int> Mask;
3548 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3549 // Check whether every element of Mask is the same constant
3550 if (all_equal(Mask)) {
3551 auto *VecTy = cast<VectorType>(SrcType);
3552 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3553 if (C->isSplat(EltTy->getBitWidth())) {
3554 // Fold the icmp based on the value of C
3555 // If C is M copies of an iK sized bit pattern,
3556 // then:
3557 // => %E = extractelement <N x iK> %vec, i32 Elem
3558 // icmp <pred> iK %SplatVal, <pattern>
3559 Value *Elem = Builder.getInt32(Mask[0]);
3560 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3561 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3562 return new ICmpInst(Pred, Extract, NewC);
3563 }
3564 }
3565 }
3566 return nullptr;
3567}
3568
3569/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3570/// where X is some kind of instruction.
3572 const APInt *C;
3573
3574 if (match(Cmp.getOperand(1), m_APInt(C))) {
3575 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3576 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3577 return I;
3578
3579 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3580 // For now, we only support constant integers while folding the
3581 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3582 // similar to the cases handled by binary ops above.
3583 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3584 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3585 return I;
3586
3587 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3588 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3589 return I;
3590
3591 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3593 return I;
3594
3595 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3596 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3597 // TODO: This checks one-use, but that is not strictly necessary.
3598 Value *Cmp0 = Cmp.getOperand(0);
3599 Value *X, *Y;
3600 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3601 (match(Cmp0,
3603 m_Value(X), m_Value(Y)))) ||
3604 match(Cmp0,
3606 m_Value(X), m_Value(Y))))))
3607 return new ICmpInst(Cmp.getPredicate(), X, Y);
3608 }
3609
3610 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3612
3613 return nullptr;
3614}
3615
3616/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3617/// icmp eq/ne BO, C.
3619 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3620 // TODO: Some of these folds could work with arbitrary constants, but this
3621 // function is limited to scalar and vector splat constants.
3622 if (!Cmp.isEquality())
3623 return nullptr;
3624
3625 ICmpInst::Predicate Pred = Cmp.getPredicate();
3626 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3627 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3628 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3629
3630 switch (BO->getOpcode()) {
3631 case Instruction::SRem:
3632 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3633 if (C.isZero() && BO->hasOneUse()) {
3634 const APInt *BOC;
3635 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3636 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3637 return new ICmpInst(Pred, NewRem,
3639 }
3640 }
3641 break;
3642 case Instruction::Add: {
3643 // (A + C2) == C --> A == (C - C2)
3644 // (A + C2) != C --> A != (C - C2)
3645 // TODO: Remove the one-use limitation? See discussion in D58633.
3646 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3647 if (BO->hasOneUse())
3648 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3649 } else if (C.isZero()) {
3650 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3651 // efficiently invertible, or if the add has just this one use.
3652 if (Value *NegVal = dyn_castNegVal(BOp1))
3653 return new ICmpInst(Pred, BOp0, NegVal);
3654 if (Value *NegVal = dyn_castNegVal(BOp0))
3655 return new ICmpInst(Pred, NegVal, BOp1);
3656 if (BO->hasOneUse()) {
3657 // (add nuw A, B) != 0 -> (or A, B) != 0
3658 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3659 Value *Or = Builder.CreateOr(BOp0, BOp1);
3660 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3661 }
3662 Value *Neg = Builder.CreateNeg(BOp1);
3663 Neg->takeName(BO);
3664 return new ICmpInst(Pred, BOp0, Neg);
3665 }
3666 }
3667 break;
3668 }
3669 case Instruction::Xor:
3670 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3671 // For the xor case, we can xor two constants together, eliminating
3672 // the explicit xor.
3673 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3674 } else if (C.isZero()) {
3675 // Replace ((xor A, B) != 0) with (A != B)
3676 return new ICmpInst(Pred, BOp0, BOp1);
3677 }
3678 break;
3679 case Instruction::Or: {
3680 const APInt *BOC;
3681 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3682 // Comparing if all bits outside of a constant mask are set?
3683 // Replace (X | C) == -1 with (X & ~C) == ~C.
3684 // This removes the -1 constant.
3686 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3687 return new ICmpInst(Pred, And, NotBOC);
3688 }
3689 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3690 // -> (and cond, (icmp eq Other, 0))
3691 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3692 // -> (or cond, (icmp ne Other, 0))
3693 Value *Cond, *TV, *FV, *Other, *Sel;
3694 if (C.isZero() &&
3695 match(BO,
3698 m_Value(FV))),
3699 m_Value(Other)))) &&
3700 Cond->getType() == Cmp.getType()) {
3701 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3702 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3703 if (Pred == ICmpInst::ICMP_EQ
3704 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3705 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3706 Value *Cmp = Builder.CreateICmp(
3707 Pred, Other, Constant::getNullValue(Other->getType()));
3709 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3710 Cond);
3711 }
3712 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3713 // case we need to invert the select condition so we need to be careful to
3714 // avoid creating extra instructions.
3715 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3716 // -> (or (not cond), (icmp ne Other, 0))
3717 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3718 // -> (and (not cond), (icmp eq Other, 0))
3719 //
3720 // Only do this if the inner select has one use, in which case we are
3721 // replacing `select` with `(not cond)`. Otherwise, we will create more
3722 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3723 // cond was freely invertable, the select arms would have been inverted.
3724 if (Sel->hasOneUse() &&
3725 (Pred == ICmpInst::ICMP_EQ
3726 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3727 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3728 Value *NotCond = Builder.CreateNot(Cond);
3729 Value *Cmp = Builder.CreateICmp(
3730 Pred, Other, Constant::getNullValue(Other->getType()));
3732 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3733 NotCond);
3734 }
3735 }
3736 break;
3737 }
3738 case Instruction::UDiv:
3739 case Instruction::SDiv:
3740 if (BO->isExact()) {
3741 // div exact X, Y eq/ne 0 -> X eq/ne 0
3742 // div exact X, Y eq/ne 1 -> X eq/ne Y
3743 // div exact X, Y eq/ne C ->
3744 // if Y * C never-overflow && OneUse:
3745 // -> Y * C eq/ne X
3746 if (C.isZero())
3747 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3748 else if (C.isOne())
3749 return new ICmpInst(Pred, BOp0, BOp1);
3750 else if (BO->hasOneUse()) {
3752 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3753 Cmp.getOperand(1), BO);
3755 Value *YC =
3756 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3757 return new ICmpInst(Pred, YC, BOp0);
3758 }
3759 }
3760 }
3761 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3762 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3763 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3764 return new ICmpInst(NewPred, BOp1, BOp0);
3765 }
3766 break;
3767 default:
3768 break;
3769 }
3770 return nullptr;
3771}
3772
3774 const APInt &CRhs,
3775 InstCombiner::BuilderTy &Builder,
3776 const SimplifyQuery &Q) {
3777 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3778 "Non-ctpop intrin in ctpop fold");
3779 if (!CtpopLhs->hasOneUse())
3780 return nullptr;
3781
3782 // Power of 2 test:
3783 // isPow2OrZero : ctpop(X) u< 2
3784 // isPow2 : ctpop(X) == 1
3785 // NotPow2OrZero: ctpop(X) u> 1
3786 // NotPow2 : ctpop(X) != 1
3787 // If we know any bit of X can be folded to:
3788 // IsPow2 : X & (~Bit) == 0
3789 // NotPow2 : X & (~Bit) != 0
3790 const ICmpInst::Predicate Pred = I.getPredicate();
3791 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3792 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3793 Value *Op = CtpopLhs->getArgOperand(0);
3794 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3795 // No need to check for count > 1, that should be already constant folded.
3796 if (OpKnown.countMinPopulation() == 1) {
3797 Value *And = Builder.CreateAnd(
3798 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3799 return new ICmpInst(
3800 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3803 And, Constant::getNullValue(Op->getType()));
3804 }
3805 }
3806
3807 return nullptr;
3808}
3809
3810/// Fold an equality icmp with LLVM intrinsic and constant operand.
3812 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3813 Type *Ty = II->getType();
3814 unsigned BitWidth = C.getBitWidth();
3815 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3816
3817 switch (II->getIntrinsicID()) {
3818 case Intrinsic::abs:
3819 // abs(A) == 0 -> A == 0
3820 // abs(A) == INT_MIN -> A == INT_MIN
3821 if (C.isZero() || C.isMinSignedValue())
3822 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3823 break;
3824
3825 case Intrinsic::bswap:
3826 // bswap(A) == C -> A == bswap(C)
3827 return new ICmpInst(Pred, II->getArgOperand(0),
3828 ConstantInt::get(Ty, C.byteSwap()));
3829
3830 case Intrinsic::bitreverse:
3831 // bitreverse(A) == C -> A == bitreverse(C)
3832 return new ICmpInst(Pred, II->getArgOperand(0),
3833 ConstantInt::get(Ty, C.reverseBits()));
3834
3835 case Intrinsic::ctlz:
3836 case Intrinsic::cttz: {
3837 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3838 if (C == BitWidth)
3839 return new ICmpInst(Pred, II->getArgOperand(0),
3841
3842 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3843 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3844 // Limit to one use to ensure we don't increase instruction count.
3845 unsigned Num = C.getLimitedValue(BitWidth);
3846 if (Num != BitWidth && II->hasOneUse()) {
3847 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3848 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3849 : APInt::getHighBitsSet(BitWidth, Num + 1);
3850 APInt Mask2 = IsTrailing
3853 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3854 ConstantInt::get(Ty, Mask2));
3855 }
3856 break;
3857 }
3858
3859 case Intrinsic::ctpop: {
3860 // popcount(A) == 0 -> A == 0 and likewise for !=
3861 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3862 bool IsZero = C.isZero();
3863 if (IsZero || C == BitWidth)
3864 return new ICmpInst(Pred, II->getArgOperand(0),
3865 IsZero ? Constant::getNullValue(Ty)
3867
3868 break;
3869 }
3870
3871 case Intrinsic::fshl:
3872 case Intrinsic::fshr:
3873 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3874 const APInt *RotAmtC;
3875 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3876 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3877 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3878 return new ICmpInst(Pred, II->getArgOperand(0),
3879 II->getIntrinsicID() == Intrinsic::fshl
3880 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3881 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3882 }
3883 break;
3884
3885 case Intrinsic::umax:
3886 case Intrinsic::uadd_sat: {
3887 // uadd.sat(a, b) == 0 -> (a | b) == 0
3888 // umax(a, b) == 0 -> (a | b) == 0
3889 if (C.isZero() && II->hasOneUse()) {
3890 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3891 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3892 }
3893 break;
3894 }
3895
3896 case Intrinsic::ssub_sat:
3897 // ssub.sat(a, b) == 0 -> a == b
3898 //
3899 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
3900 // (because 1 saturates to 0). Just skip the optimization for i1.
3901 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
3902 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3903 break;
3904 case Intrinsic::usub_sat: {
3905 // usub.sat(a, b) == 0 -> a <= b
3906 if (C.isZero()) {
3907 ICmpInst::Predicate NewPred =
3909 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3910 }
3911 break;
3912 }
3913 default:
3914 break;
3915 }
3916
3917 return nullptr;
3918}
3919
3920/// Fold an icmp with LLVM intrinsics
3921static Instruction *
3923 InstCombiner::BuilderTy &Builder) {
3924 assert(Cmp.isEquality());
3925
3926 ICmpInst::Predicate Pred = Cmp.getPredicate();
3927 Value *Op0 = Cmp.getOperand(0);
3928 Value *Op1 = Cmp.getOperand(1);
3929 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3930 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3931 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3932 return nullptr;
3933
3934 switch (IIOp0->getIntrinsicID()) {
3935 case Intrinsic::bswap:
3936 case Intrinsic::bitreverse:
3937 // If both operands are byte-swapped or bit-reversed, just compare the
3938 // original values.
3939 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3940 case Intrinsic::fshl:
3941 case Intrinsic::fshr: {
3942 // If both operands are rotated by same amount, just compare the
3943 // original values.
3944 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3945 break;
3946 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3947 break;
3948 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3949 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3950
3951 // rotate(X, AmtX) == rotate(Y, AmtY)
3952 // -> rotate(X, AmtX - AmtY) == Y
3953 // Do this if either both rotates have one use or if only one has one use
3954 // and AmtX/AmtY are constants.
3955 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3956 if (OneUses == 2 ||
3957 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3958 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3959 Value *SubAmt =
3960 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3961 Value *CombinedRotate = Builder.CreateIntrinsic(
3962 Op0->getType(), IIOp0->getIntrinsicID(),
3963 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3964 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3965 }
3966 } break;
3967 default:
3968 break;
3969 }
3970
3971 return nullptr;
3972}
3973
3974/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3975/// where X is some kind of instruction and C is AllowPoison.
3976/// TODO: Move more folds which allow poison to this function.
3979 const APInt &C) {
3980 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3981 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3982 switch (II->getIntrinsicID()) {
3983 default:
3984 break;
3985 case Intrinsic::fshl:
3986 case Intrinsic::fshr:
3987 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3988 // (rot X, ?) == 0/-1 --> X == 0/-1
3989 if (C.isZero() || C.isAllOnes())
3990 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3991 }
3992 break;
3993 }
3994 }
3995
3996 return nullptr;
3997}
3998
3999/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
4001 BinaryOperator *BO,
4002 const APInt &C) {
4003 switch (BO->getOpcode()) {
4004 case Instruction::Xor:
4005 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
4006 return I;
4007 break;
4008 case Instruction::And:
4009 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
4010 return I;
4011 break;
4012 case Instruction::Or:
4013 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
4014 return I;
4015 break;
4016 case Instruction::Mul:
4017 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
4018 return I;
4019 break;
4020 case Instruction::Shl:
4021 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4022 return I;
4023 break;
4024 case Instruction::LShr:
4025 case Instruction::AShr:
4026 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4027 return I;
4028 break;
4029 case Instruction::SRem:
4030 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4031 return I;
4032 break;
4033 case Instruction::UDiv:
4034 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4035 return I;
4036 [[fallthrough]];
4037 case Instruction::SDiv:
4038 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4039 return I;
4040 break;
4041 case Instruction::Sub:
4042 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4043 return I;
4044 break;
4045 case Instruction::Add:
4046 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4047 return I;
4048 break;
4049 default:
4050 break;
4051 }
4052
4053 // TODO: These folds could be refactored to be part of the above calls.
4055 return I;
4056
4057 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4058 // : C4), C5` pattern, by computing a truth table of the four constant
4059 // variants.
4061}
4062
4063static Instruction *
4065 const APInt &C,
4066 InstCombiner::BuilderTy &Builder) {
4067 // This transform may end up producing more than one instruction for the
4068 // intrinsic, so limit it to one user of the intrinsic.
4069 if (!II->hasOneUse())
4070 return nullptr;
4071
4072 // Let Y = [add/sub]_sat(X, C) pred C2
4073 // SatVal = The saturating value for the operation
4074 // WillWrap = Whether or not the operation will underflow / overflow
4075 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4076 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4077 //
4078 // When (SatVal pred C2) is true, then
4079 // Y = WillWrap ? true : ((X binop C) pred C2)
4080 // => Y = WillWrap || ((X binop C) pred C2)
4081 // else
4082 // Y = WillWrap ? false : ((X binop C) pred C2)
4083 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4084 // => Y = !WillWrap && ((X binop C) pred C2)
4085 Value *Op0 = II->getOperand(0);
4086 Value *Op1 = II->getOperand(1);
4087
4088 const APInt *COp1;
4089 // This transform only works when the intrinsic has an integral constant or
4090 // splat vector as the second operand.
4091 if (!match(Op1, m_APInt(COp1)))
4092 return nullptr;
4093
4094 APInt SatVal;
4095 switch (II->getIntrinsicID()) {
4096 default:
4098 "This function only works with usub_sat and uadd_sat for now!");
4099 case Intrinsic::uadd_sat:
4100 SatVal = APInt::getAllOnes(C.getBitWidth());
4101 break;
4102 case Intrinsic::usub_sat:
4103 SatVal = APInt::getZero(C.getBitWidth());
4104 break;
4105 }
4106
4107 // Check (SatVal pred C2)
4108 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4109
4110 // !WillWrap.
4112 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4113
4114 // WillWrap.
4115 if (SatValCheck)
4116 C1 = C1.inverse();
4117
4119 if (II->getBinaryOp() == Instruction::Add)
4120 C2 = C2.sub(*COp1);
4121 else
4122 C2 = C2.add(*COp1);
4123
4124 Instruction::BinaryOps CombiningOp =
4125 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4126
4127 std::optional<ConstantRange> Combination;
4128 if (CombiningOp == Instruction::BinaryOps::Or)
4129 Combination = C1.exactUnionWith(C2);
4130 else /* CombiningOp == Instruction::BinaryOps::And */
4131 Combination = C1.exactIntersectWith(C2);
4132
4133 if (!Combination)
4134 return nullptr;
4135
4136 CmpInst::Predicate EquivPred;
4137 APInt EquivInt;
4138 APInt EquivOffset;
4139
4140 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4141
4142 return new ICmpInst(
4143 EquivPred,
4144 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4145 ConstantInt::get(Op1->getType(), EquivInt));
4146}
4147
4148static Instruction *
4150 const APInt &C,
4151 InstCombiner::BuilderTy &Builder) {
4152 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4153 switch (Pred) {
4154 case ICmpInst::ICMP_EQ:
4155 case ICmpInst::ICMP_NE:
4156 if (C.isZero())
4157 NewPredicate = Pred;
4158 else if (C.isOne())
4159 NewPredicate =
4161 else if (C.isAllOnes())
4162 NewPredicate =
4164 break;
4165
4166 case ICmpInst::ICMP_SGT:
4167 if (C.isAllOnes())
4168 NewPredicate = ICmpInst::ICMP_UGE;
4169 else if (C.isZero())
4170 NewPredicate = ICmpInst::ICMP_UGT;
4171 break;
4172
4173 case ICmpInst::ICMP_SLT:
4174 if (C.isZero())
4175 NewPredicate = ICmpInst::ICMP_ULT;
4176 else if (C.isOne())
4177 NewPredicate = ICmpInst::ICMP_ULE;
4178 break;
4179
4180 case ICmpInst::ICMP_ULT:
4181 if (C.ugt(1))
4182 NewPredicate = ICmpInst::ICMP_UGE;
4183 break;
4184
4185 case ICmpInst::ICMP_UGT:
4186 if (!C.isZero() && !C.isAllOnes())
4187 NewPredicate = ICmpInst::ICMP_ULT;
4188 break;
4189
4190 default:
4191 break;
4192 }
4193
4194 if (!NewPredicate)
4195 return nullptr;
4196
4197 if (I->getIntrinsicID() == Intrinsic::scmp)
4198 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4199 Value *LHS = I->getOperand(0);
4200 Value *RHS = I->getOperand(1);
4201 return new ICmpInst(*NewPredicate, LHS, RHS);
4202}
4203
4204/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4207 const APInt &C) {
4208 ICmpInst::Predicate Pred = Cmp.getPredicate();
4209
4210 // Handle folds that apply for any kind of icmp.
4211 switch (II->getIntrinsicID()) {
4212 default:
4213 break;
4214 case Intrinsic::uadd_sat:
4215 case Intrinsic::usub_sat:
4216 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4217 Pred, cast<SaturatingInst>(II), C, Builder))
4218 return Folded;
4219 break;
4220 case Intrinsic::ctpop: {
4221 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4222 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4223 return R;
4224 } break;
4225 case Intrinsic::scmp:
4226 case Intrinsic::ucmp:
4227 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4228 return Folded;
4229 break;
4230 }
4231
4232 if (Cmp.isEquality())
4233 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4234
4235 Type *Ty = II->getType();
4236 unsigned BitWidth = C.getBitWidth();
4237 switch (II->getIntrinsicID()) {
4238 case Intrinsic::ctpop: {
4239 // (ctpop X > BitWidth - 1) --> X == -1
4240 Value *X = II->getArgOperand(0);
4241 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4242 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4244 // (ctpop X < BitWidth) --> X != -1
4245 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4246 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4248 break;
4249 }
4250 case Intrinsic::ctlz: {
4251 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4252 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4253 unsigned Num = C.getLimitedValue();
4254 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4255 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4256 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4257 }
4258
4259 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4260 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4261 unsigned Num = C.getLimitedValue();
4263 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4264 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4265 }
4266 break;
4267 }
4268 case Intrinsic::cttz: {
4269 // Limit to one use to ensure we don't increase instruction count.
4270 if (!II->hasOneUse())
4271 return nullptr;
4272
4273 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4274 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4275 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4276 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4277 Builder.CreateAnd(II->getArgOperand(0), Mask),
4279 }
4280
4281 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4282 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4283 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4284 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4285 Builder.CreateAnd(II->getArgOperand(0), Mask),
4287 }
4288 break;
4289 }
4290 case Intrinsic::ssub_sat:
4291 // ssub.sat(a, b) spred 0 -> a spred b
4292 //
4293 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4294 // (because 1 saturates to 0). Just skip the optimization for i1.
4295 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4296 if (C.isZero())
4297 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4298 // X s<= 0 is cannonicalized to X s< 1
4299 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4300 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4301 II->getArgOperand(1));
4302 // X s>= 0 is cannonicalized to X s> -1
4303 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4304 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4305 II->getArgOperand(1));
4306 }
4307 break;
4308 case Intrinsic::abs: {
4309 if (!II->hasOneUse())
4310 return nullptr;
4311
4312 Value *X = II->getArgOperand(0);
4313 bool IsIntMinPoison =
4314 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4315
4316 // If C >= 0:
4317 // abs(X) u> C --> X + C u> 2 * C
4318 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4319 return new ICmpInst(ICmpInst::ICMP_UGT,
4320 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4321 ConstantInt::get(Ty, 2 * C));
4322 }
4323
4324 // If abs(INT_MIN) is poison and C >= 1:
4325 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4326 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4327 return new ICmpInst(ICmpInst::ICMP_ULE,
4328 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4329 ConstantInt::get(Ty, 2 * (C - 1)));
4330 }
4331
4332 break;
4333 }
4334 default:
4335 break;
4336 }
4337
4338 return nullptr;
4339}
4340
4341/// Handle icmp with constant (but not simple integer constant) RHS.
4343 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4344 Constant *RHSC = dyn_cast<Constant>(Op1);
4346 if (!RHSC || !LHSI)
4347 return nullptr;
4348
4349 switch (LHSI->getOpcode()) {
4350 case Instruction::IntToPtr:
4351 // icmp pred inttoptr(X), null -> icmp pred X, 0
4352 if (RHSC->isNullValue() &&
4353 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4354 return new ICmpInst(
4355 I.getPredicate(), LHSI->getOperand(0),
4357 break;
4358
4359 case Instruction::Load:
4360 // Try to optimize things like "A[i] > 4" to index computations.
4361 if (GetElementPtrInst *GEP =
4363 if (Instruction *Res =
4365 return Res;
4366 break;
4367 }
4368
4369 return nullptr;
4370}
4371
4373 Value *RHS, const ICmpInst &I) {
4374 // Try to fold the comparison into the select arms, which will cause the
4375 // select to be converted into a logical and/or.
4376 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4377 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4378 return Res;
4379 if (std::optional<bool> Impl = isImpliedCondition(
4380 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4381 return ConstantInt::get(I.getType(), *Impl);
4382 return nullptr;
4383 };
4384
4385 ConstantInt *CI = nullptr;
4386 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4387 if (Op1)
4388 CI = dyn_cast<ConstantInt>(Op1);
4389
4390 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4391 if (Op2)
4392 CI = dyn_cast<ConstantInt>(Op2);
4393
4394 auto Simplifies = [&](Value *Op, unsigned Idx) {
4395 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4396 const APInt *Dummy;
4397 return Op ||
4398 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4399 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4400 };
4401
4402 // We only want to perform this transformation if it will not lead to
4403 // additional code. This is true if either both sides of the select
4404 // fold to a constant (in which case the icmp is replaced with a select
4405 // which will usually simplify) or this is the only user of the
4406 // select (in which case we are trading a select+icmp for a simpler
4407 // select+icmp) or all uses of the select can be replaced based on
4408 // dominance information ("Global cases").
4409 bool Transform = false;
4410 if (Op1 && Op2)
4411 Transform = true;
4412 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4413 // Local case
4414 if (SI->hasOneUse())
4415 Transform = true;
4416 // Global cases
4417 else if (CI && !CI->isZero())
4418 // When Op1 is constant try replacing select with second operand.
4419 // Otherwise Op2 is constant and try replacing select with first
4420 // operand.
4421 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4422 }
4423 if (Transform) {
4424 if (!Op1)
4425 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4426 if (!Op2)
4427 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4428 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4429 ProfcheckDisableMetadataFixes ? nullptr : SI);
4430 }
4431
4432 return nullptr;
4433}
4434
4435// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4436static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4437 unsigned Depth = 0) {
4438 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4439 return true;
4440 if (V->getType()->getScalarSizeInBits() == 1)
4441 return true;
4443 return false;
4444 Value *X;
4446 if (!I)
4447 return false;
4448 switch (I->getOpcode()) {
4449 case Instruction::ZExt:
4450 // ZExt(Mask) is a Mask.
4451 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4452 case Instruction::SExt:
4453 // SExt(Mask) is a Mask.
4454 // SExt(~Mask) is a ~Mask.
4455 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4456 case Instruction::And:
4457 case Instruction::Or:
4458 // Mask0 | Mask1 is a Mask.
4459 // Mask0 & Mask1 is a Mask.
4460 // ~Mask0 | ~Mask1 is a ~Mask.
4461 // ~Mask0 & ~Mask1 is a ~Mask.
4462 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4463 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4464 case Instruction::Xor:
4465 if (match(V, m_Not(m_Value(X))))
4466 return isMaskOrZero(X, !Not, Q, Depth);
4467
4468 // (X ^ -X) is a ~Mask
4469 if (Not)
4470 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4471 // (X ^ (X - 1)) is a Mask
4472 else
4473 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4474 case Instruction::Select:
4475 // c ? Mask0 : Mask1 is a Mask.
4476 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4477 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4478 case Instruction::Shl:
4479 // (~Mask) << X is a ~Mask.
4480 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4481 case Instruction::LShr:
4482 // Mask >> X is a Mask.
4483 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4484 case Instruction::AShr:
4485 // Mask s>> X is a Mask.
4486 // ~Mask s>> X is a ~Mask.
4487 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4488 case Instruction::Add:
4489 // Pow2 - 1 is a Mask.
4490 if (!Not && match(I->getOperand(1), m_AllOnes()))
4491 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4492 Q.AC, Q.CxtI, Q.DT, Depth);
4493 break;
4494 case Instruction::Sub:
4495 // -Pow2 is a ~Mask.
4496 if (Not && match(I->getOperand(0), m_Zero()))
4497 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4498 Q.AC, Q.CxtI, Q.DT, Depth);
4499 break;
4500 case Instruction::Call: {
4501 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4502 switch (II->getIntrinsicID()) {
4503 // min/max(Mask0, Mask1) is a Mask.
4504 // min/max(~Mask0, ~Mask1) is a ~Mask.
4505 case Intrinsic::umax:
4506 case Intrinsic::smax:
4507 case Intrinsic::umin:
4508 case Intrinsic::smin:
4509 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4510 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4511
4512 // In the context of masks, bitreverse(Mask) == ~Mask
4513 case Intrinsic::bitreverse:
4514 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4515 default:
4516 break;
4517 }
4518 }
4519 break;
4520 }
4521 default:
4522 break;
4523 }
4524 return false;
4525}
4526
4527/// Some comparisons can be simplified.
4528/// In this case, we are looking for comparisons that look like
4529/// a check for a lossy truncation.
4530/// Folds:
4531/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4532/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4533/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4534/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4535/// Where Mask is some pattern that produces all-ones in low bits:
4536/// (-1 >> y)
4537/// ((-1 << y) >> y) <- non-canonical, has extra uses
4538/// ~(-1 << y)
4539/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4540/// The Mask can be a constant, too.
4541/// For some predicates, the operands are commutative.
4542/// For others, x can only be on a specific side.
4544 Value *Op1, const SimplifyQuery &Q,
4545 InstCombiner &IC) {
4546
4547 ICmpInst::Predicate DstPred;
4548 switch (Pred) {
4550 // x & Mask == x
4551 // x & ~Mask == 0
4552 // ~x | Mask == -1
4553 // -> x u<= Mask
4554 // x & ~Mask == ~Mask
4555 // -> ~Mask u<= x
4557 break;
4559 // x & Mask != x
4560 // x & ~Mask != 0
4561 // ~x | Mask != -1
4562 // -> x u> Mask
4563 // x & ~Mask != ~Mask
4564 // -> ~Mask u> x
4566 break;
4568 // x & Mask u< x
4569 // -> x u> Mask
4570 // x & ~Mask u< ~Mask
4571 // -> ~Mask u> x
4573 break;
4575 // x & Mask u>= x
4576 // -> x u<= Mask
4577 // x & ~Mask u>= ~Mask
4578 // -> ~Mask u<= x
4580 break;
4582 // x & Mask s< x [iff Mask s>= 0]
4583 // -> x s> Mask
4584 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4585 // -> ~Mask s> x
4587 break;
4589 // x & Mask s>= x [iff Mask s>= 0]
4590 // -> x s<= Mask
4591 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4592 // -> ~Mask s<= x
4594 break;
4595 default:
4596 // We don't support sgt,sle
4597 // ult/ugt are simplified to true/false respectively.
4598 return nullptr;
4599 }
4600
4601 Value *X, *M;
4602 // Put search code in lambda for early positive returns.
4603 auto IsLowBitMask = [&]() {
4604 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4605 X = Op1;
4606 // Look for: x & Mask pred x
4607 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4608 return !ICmpInst::isSigned(Pred) ||
4609 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4610 }
4611
4612 // Look for: x & ~Mask pred ~Mask
4613 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4614 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4615 }
4616 return false;
4617 }
4618 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4619 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4620
4621 auto Check = [&]() {
4622 // Look for: ~x | Mask == -1
4623 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4624 if (Value *NotX =
4625 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4626 X = NotX;
4627 return true;
4628 }
4629 }
4630 return false;
4631 };
4632 if (Check())
4633 return true;
4634 std::swap(X, M);
4635 return Check();
4636 }
4637 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4638 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4639 auto Check = [&]() {
4640 // Look for: x & ~Mask == 0
4641 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4642 if (Value *NotM =
4643 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4644 M = NotM;
4645 return true;
4646 }
4647 }
4648 return false;
4649 };
4650 if (Check())
4651 return true;
4652 std::swap(X, M);
4653 return Check();
4654 }
4655 return false;
4656 };
4657
4658 if (!IsLowBitMask())
4659 return nullptr;
4660
4661 return IC.Builder.CreateICmp(DstPred, X, M);
4662}
4663
4664/// Some comparisons can be simplified.
4665/// In this case, we are looking for comparisons that look like
4666/// a check for a lossy signed truncation.
4667/// Folds: (MaskedBits is a constant.)
4668/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4669/// Into:
4670/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4671/// Where KeptBits = bitwidth(%x) - MaskedBits
4672static Value *
4674 InstCombiner::BuilderTy &Builder) {
4675 CmpPredicate SrcPred;
4676 Value *X;
4677 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4678 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4679 if (!match(&I, m_c_ICmp(SrcPred,
4681 m_APInt(C1))),
4682 m_Deferred(X))))
4683 return nullptr;
4684
4685 // Potential handling of non-splats: for each element:
4686 // * if both are undef, replace with constant 0.
4687 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4688 // * if both are not undef, and are different, bailout.
4689 // * else, only one is undef, then pick the non-undef one.
4690
4691 // The shift amount must be equal.
4692 if (*C0 != *C1)
4693 return nullptr;
4694 const APInt &MaskedBits = *C0;
4695 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4696
4697 ICmpInst::Predicate DstPred;
4698 switch (SrcPred) {
4700 // ((%x << MaskedBits) a>> MaskedBits) == %x
4701 // =>
4702 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4704 break;
4706 // ((%x << MaskedBits) a>> MaskedBits) != %x
4707 // =>
4708 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4710 break;
4711 // FIXME: are more folds possible?
4712 default:
4713 return nullptr;
4714 }
4715
4716 auto *XType = X->getType();
4717 const unsigned XBitWidth = XType->getScalarSizeInBits();
4718 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4719 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4720
4721 // KeptBits = bitwidth(%x) - MaskedBits
4722 const APInt KeptBits = BitWidth - MaskedBits;
4723 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4724 // ICmpCst = (1 << KeptBits)
4725 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4726 assert(ICmpCst.isPowerOf2());
4727 // AddCst = (1 << (KeptBits-1))
4728 const APInt AddCst = ICmpCst.lshr(1);
4729 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4730
4731 // T0 = add %x, AddCst
4732 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4733 // T1 = T0 DstPred ICmpCst
4734 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4735
4736 return T1;
4737}
4738
4739// Given pattern:
4740// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4741// we should move shifts to the same hand of 'and', i.e. rewrite as
4742// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4743// We are only interested in opposite logical shifts here.
4744// One of the shifts can be truncated.
4745// If we can, we want to end up creating 'lshr' shift.
4746static Value *
4748 InstCombiner::BuilderTy &Builder) {
4749 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4750 !I.getOperand(0)->hasOneUse())
4751 return nullptr;
4752
4753 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4754
4755 // Look for an 'and' of two logical shifts, one of which may be truncated.
4756 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4757 Instruction *XShift, *MaybeTruncation, *YShift;
4758 if (!match(
4759 I.getOperand(0),
4760 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4762 m_AnyLogicalShift, m_Instruction(YShift))),
4763 m_Instruction(MaybeTruncation)))))
4764 return nullptr;
4765
4766 // We potentially looked past 'trunc', but only when matching YShift,
4767 // therefore YShift must have the widest type.
4768 Instruction *WidestShift = YShift;
4769 // Therefore XShift must have the shallowest type.
4770 // Or they both have identical types if there was no truncation.
4771 Instruction *NarrowestShift = XShift;
4772
4773 Type *WidestTy = WidestShift->getType();
4774 Type *NarrowestTy = NarrowestShift->getType();
4775 assert(NarrowestTy == I.getOperand(0)->getType() &&
4776 "We did not look past any shifts while matching XShift though.");
4777 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4778
4779 // If YShift is a 'lshr', swap the shifts around.
4780 if (match(YShift, m_LShr(m_Value(), m_Value())))
4781 std::swap(XShift, YShift);
4782
4783 // The shifts must be in opposite directions.
4784 auto XShiftOpcode = XShift->getOpcode();
4785 if (XShiftOpcode == YShift->getOpcode())
4786 return nullptr; // Do not care about same-direction shifts here.
4787
4788 Value *X, *XShAmt, *Y, *YShAmt;
4789 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4790 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4791
4792 // If one of the values being shifted is a constant, then we will end with
4793 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4794 // however, we will need to ensure that we won't increase instruction count.
4795 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4796 // At least one of the hands of the 'and' should be one-use shift.
4797 if (!match(I.getOperand(0),
4798 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4799 return nullptr;
4800 if (HadTrunc) {
4801 // Due to the 'trunc', we will need to widen X. For that either the old
4802 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4803 if (!MaybeTruncation->hasOneUse() &&
4804 !NarrowestShift->getOperand(1)->hasOneUse())
4805 return nullptr;
4806 }
4807 }
4808
4809 // We have two shift amounts from two different shifts. The types of those
4810 // shift amounts may not match. If that's the case let's bailout now.
4811 if (XShAmt->getType() != YShAmt->getType())
4812 return nullptr;
4813
4814 // As input, we have the following pattern:
4815 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4816 // We want to rewrite that as:
4817 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4818 // While we know that originally (Q+K) would not overflow
4819 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4820 // shift amounts. so it may now overflow in smaller bitwidth.
4821 // To ensure that does not happen, we need to ensure that the total maximal
4822 // shift amount is still representable in that smaller bit width.
4823 unsigned MaximalPossibleTotalShiftAmount =
4824 (WidestTy->getScalarSizeInBits() - 1) +
4825 (NarrowestTy->getScalarSizeInBits() - 1);
4826 APInt MaximalRepresentableShiftAmount =
4828 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4829 return nullptr;
4830
4831 // Can we fold (XShAmt+YShAmt) ?
4832 auto *NewShAmt = dyn_cast_or_null<Constant>(
4833 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4834 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4835 if (!NewShAmt)
4836 return nullptr;
4837 if (NewShAmt->getType() != WidestTy) {
4838 NewShAmt =
4839 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4840 if (!NewShAmt)
4841 return nullptr;
4842 }
4843 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4844
4845 // Is the new shift amount smaller than the bit width?
4846 // FIXME: could also rely on ConstantRange.
4847 if (!match(NewShAmt,
4849 APInt(WidestBitWidth, WidestBitWidth))))
4850 return nullptr;
4851
4852 // An extra legality check is needed if we had trunc-of-lshr.
4853 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4854 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4855 WidestShift]() {
4856 // It isn't obvious whether it's worth it to analyze non-constants here.
4857 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4858 // If *any* of these preconditions matches we can perform the fold.
4859 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4860 ? NewShAmt->getSplatValue()
4861 : NewShAmt;
4862 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4863 if (NewShAmtSplat &&
4864 (NewShAmtSplat->isNullValue() ||
4865 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4866 return true;
4867 // We consider *min* leading zeros so a single outlier
4868 // blocks the transform as opposed to allowing it.
4869 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4870 KnownBits Known = computeKnownBits(C, SQ.DL);
4871 unsigned MinLeadZero = Known.countMinLeadingZeros();
4872 // If the value being shifted has at most lowest bit set we can fold.
4873 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4874 if (MaxActiveBits <= 1)
4875 return true;
4876 // Precondition: NewShAmt u<= countLeadingZeros(C)
4877 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4878 return true;
4879 }
4880 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4881 KnownBits Known = computeKnownBits(C, SQ.DL);
4882 unsigned MinLeadZero = Known.countMinLeadingZeros();
4883 // If the value being shifted has at most lowest bit set we can fold.
4884 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4885 if (MaxActiveBits <= 1)
4886 return true;
4887 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4888 if (NewShAmtSplat) {
4889 APInt AdjNewShAmt =
4890 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4891 if (AdjNewShAmt.ule(MinLeadZero))
4892 return true;
4893 }
4894 }
4895 return false; // Can't tell if it's ok.
4896 };
4897 if (!CanFold())
4898 return nullptr;
4899 }
4900
4901 // All good, we can do this fold.
4902 X = Builder.CreateZExt(X, WidestTy);
4903 Y = Builder.CreateZExt(Y, WidestTy);
4904 // The shift is the same that was for X.
4905 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4906 ? Builder.CreateLShr(X, NewShAmt)
4907 : Builder.CreateShl(X, NewShAmt);
4908 Value *T1 = Builder.CreateAnd(T0, Y);
4909 return Builder.CreateICmp(I.getPredicate(), T1,
4910 Constant::getNullValue(WidestTy));
4911}
4912
4913/// Fold
4914/// (-1 u/ x) u< y
4915/// ((x * y) ?/ x) != y
4916/// to
4917/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4918/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4919/// will mean that we are looking for the opposite answer.
4921 CmpPredicate Pred;
4922 Value *X, *Y;
4924 Instruction *Div;
4925 bool NeedNegation;
4926 // Look for: (-1 u/ x) u</u>= y
4927 if (!I.isEquality() &&
4928 match(&I, m_c_ICmp(Pred,
4930 m_Instruction(Div)),
4931 m_Value(Y)))) {
4932 Mul = nullptr;
4933
4934 // Are we checking that overflow does not happen, or does happen?
4935 switch (Pred) {
4937 NeedNegation = false;
4938 break; // OK
4940 NeedNegation = true;
4941 break; // OK
4942 default:
4943 return nullptr; // Wrong predicate.
4944 }
4945 } else // Look for: ((x * y) / x) !=/== y
4946 if (I.isEquality() &&
4947 match(&I, m_c_ICmp(Pred, m_Value(Y),
4950 m_Value(X)),
4952 m_Deferred(X))),
4953 m_Instruction(Div))))) {
4954 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4955 } else
4956 return nullptr;
4957
4959 // If the pattern included (x * y), we'll want to insert new instructions
4960 // right before that original multiplication so that we can replace it.
4961 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4962 if (MulHadOtherUses)
4963 Builder.SetInsertPoint(Mul);
4964
4965 CallInst *Call = Builder.CreateIntrinsic(
4966 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4967 : Intrinsic::smul_with_overflow,
4968 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4969
4970 // If the multiplication was used elsewhere, to ensure that we don't leave
4971 // "duplicate" instructions, replace uses of that original multiplication
4972 // with the multiplication result from the with.overflow intrinsic.
4973 if (MulHadOtherUses)
4974 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4975
4976 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4977 if (NeedNegation) // This technically increases instruction count.
4978 Res = Builder.CreateNot(Res, "mul.not.ov");
4979
4980 // If we replaced the mul, erase it. Do this after all uses of Builder,
4981 // as the mul is used as insertion point.
4982 if (MulHadOtherUses)
4984
4985 return Res;
4986}
4987
4989 InstCombiner::BuilderTy &Builder) {
4990 CmpPredicate Pred;
4991 Value *X;
4992 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4993
4994 if (ICmpInst::isSigned(Pred))
4995 Pred = ICmpInst::getSwappedPredicate(Pred);
4996 else if (ICmpInst::isUnsigned(Pred))
4997 Pred = ICmpInst::getSignedPredicate(Pred);
4998 // else for equality-comparisons just keep the predicate.
4999
5000 return ICmpInst::Create(Instruction::ICmp, Pred, X,
5001 Constant::getNullValue(X->getType()), I.getName());
5002 }
5003
5004 // A value is not equal to its negation unless that value is 0 or
5005 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
5006 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
5007 ICmpInst::isEquality(Pred)) {
5008 Type *Ty = X->getType();
5009 uint32_t BitWidth = Ty->getScalarSizeInBits();
5010 Constant *MaxSignedVal =
5011 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
5012 Value *And = Builder.CreateAnd(X, MaxSignedVal);
5013 Constant *Zero = Constant::getNullValue(Ty);
5014 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
5015 }
5016
5017 return nullptr;
5018}
5019
5021 InstCombinerImpl &IC) {
5022 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5023 // Normalize and operand as operand 0.
5024 CmpInst::Predicate Pred = I.getPredicate();
5025 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
5026 std::swap(Op0, Op1);
5027 Pred = ICmpInst::getSwappedPredicate(Pred);
5028 }
5029
5030 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5031 return nullptr;
5032
5033 // (icmp (X & Y) u< X --> (X & Y) != X
5034 if (Pred == ICmpInst::ICMP_ULT)
5035 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5036
5037 // (icmp (X & Y) u>= X --> (X & Y) == X
5038 if (Pred == ICmpInst::ICMP_UGE)
5039 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5040
5041 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5042 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5043 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5044 // so don't do this fold.
5045 if (!match(Op1, m_ImmConstant()))
5046 if (auto *NotOp1 =
5047 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5048 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5049 Constant::getAllOnesValue(Op1->getType()));
5050 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5051 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5052 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5053 Constant::getNullValue(Op1->getType()));
5054 }
5055
5056 if (!ICmpInst::isSigned(Pred))
5057 return nullptr;
5058
5059 KnownBits KnownY = IC.computeKnownBits(A, &I);
5060 // (X & NegY) spred X --> (X & NegY) upred X
5061 if (KnownY.isNegative())
5062 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5063
5064 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5065 return nullptr;
5066
5067 if (KnownY.isNonNegative())
5068 // (X & PosY) s<= X --> X s>= 0
5069 // (X & PosY) s> X --> X s< 0
5070 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5071 Constant::getNullValue(Op1->getType()));
5072
5074 // (NegX & Y) s<= NegX --> Y s< 0
5075 // (NegX & Y) s> NegX --> Y s>= 0
5077 Constant::getNullValue(A->getType()));
5078
5079 return nullptr;
5080}
5081
5083 InstCombinerImpl &IC) {
5084 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5085
5086 // Normalize or operand as operand 0.
5087 CmpInst::Predicate Pred = I.getPredicate();
5088 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5089 std::swap(Op0, Op1);
5090 Pred = ICmpInst::getSwappedPredicate(Pred);
5091 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5092 return nullptr;
5093 }
5094
5095 // icmp (X | Y) u<= X --> (X | Y) == X
5096 if (Pred == ICmpInst::ICMP_ULE)
5097 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5098
5099 // icmp (X | Y) u> X --> (X | Y) != X
5100 if (Pred == ICmpInst::ICMP_UGT)
5101 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5102
5103 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5104 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5105 if (Value *NotOp1 = IC.getFreelyInverted(
5106 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5107 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5108 Constant::getNullValue(Op1->getType()));
5109 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5110 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5111 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5112 Constant::getAllOnesValue(Op1->getType()));
5113 }
5114 return nullptr;
5115}
5116
5118 InstCombinerImpl &IC) {
5119 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5120 // Normalize xor operand as operand 0.
5121 CmpInst::Predicate Pred = I.getPredicate();
5122 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5123 std::swap(Op0, Op1);
5124 Pred = ICmpInst::getSwappedPredicate(Pred);
5125 }
5126 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5127 return nullptr;
5128
5129 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5130 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5131 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5132 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5134 if (PredOut != Pred && isKnownNonZero(A, Q))
5135 return new ICmpInst(PredOut, Op0, Op1);
5136
5137 // These transform work when A is negative.
5138 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5139 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5140 if (match(A, m_Negative())) {
5141 CmpInst::Predicate NewPred;
5142 switch (ICmpInst::getStrictPredicate(Pred)) {
5143 default:
5144 return nullptr;
5145 case ICmpInst::ICMP_SLT:
5146 case ICmpInst::ICMP_UGT:
5147 NewPred = ICmpInst::ICMP_SLT;
5148 break;
5149 case ICmpInst::ICMP_SGT:
5150 case ICmpInst::ICMP_ULT:
5151 NewPred = ICmpInst::ICMP_SGE;
5152 break;
5153 }
5154 Constant *Const = Constant::getNullValue(Op0->getType());
5155 return new ICmpInst(NewPred, Op0, Const);
5156 }
5157
5158 return nullptr;
5159}
5160
5161/// Return true if X is a multiple of C.
5162/// TODO: Handle non-power-of-2 factors.
5163static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5164 if (C.isOne())
5165 return true;
5166
5167 if (!C.isPowerOf2())
5168 return false;
5169
5170 return MaskedValueIsZero(X, C - 1, Q);
5171}
5172
5173/// Try to fold icmp (binop), X or icmp X, (binop).
5174/// TODO: A large part of this logic is duplicated in InstSimplify's
5175/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5176/// duplication.
5178 const SimplifyQuery &SQ) {
5179 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5180 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5181
5182 // Special logic for binary operators.
5185 if (!BO0 && !BO1)
5186 return nullptr;
5187
5188 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5189 return NewICmp;
5190
5191 const CmpInst::Predicate Pred = I.getPredicate();
5192 Value *X;
5193
5194 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5195 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5196 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5197 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5198 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5199 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5200 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5201 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5202 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5203
5204 {
5205 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5206 Constant *C;
5207 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5208 m_ImmConstant(C)))) &&
5209 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5211 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5212 }
5213 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5214 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5215 m_ImmConstant(C)))) &&
5216 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5218 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5219 }
5220 }
5221
5222 // (icmp eq/ne (X, -P2), INT_MIN)
5223 // -> (icmp slt/sge X, INT_MIN + P2)
5224 if (ICmpInst::isEquality(Pred) && BO0 &&
5225 match(I.getOperand(1), m_SignMask()) &&
5227 // Will Constant fold.
5228 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5229 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5231 BO0->getOperand(0), NewC);
5232 }
5233
5234 {
5235 // Similar to above: an unsigned overflow comparison may use offset + mask:
5236 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5237 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5238 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5239 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5240 BinaryOperator *BO;
5241 const APInt *C;
5242 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5243 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5245 CmpInst::Predicate NewPred =
5247 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5248 return new ICmpInst(NewPred, Op1, Zero);
5249 }
5250
5251 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5252 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5254 CmpInst::Predicate NewPred =
5256 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5257 return new ICmpInst(NewPred, Op0, Zero);
5258 }
5259 }
5260
5261 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5262 bool Op0HasNUW = false, Op1HasNUW = false;
5263 bool Op0HasNSW = false, Op1HasNSW = false;
5264 // Analyze the case when either Op0 or Op1 is an add instruction.
5265 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5266 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5267 bool &HasNSW, bool &HasNUW) -> bool {
5269 HasNUW = BO.hasNoUnsignedWrap();
5270 HasNSW = BO.hasNoSignedWrap();
5271 return ICmpInst::isEquality(Pred) ||
5272 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5273 (CmpInst::isSigned(Pred) && HasNSW);
5274 } else if (BO.getOpcode() == Instruction::Or) {
5275 HasNUW = true;
5276 HasNSW = true;
5277 return true;
5278 } else {
5279 return false;
5280 }
5281 };
5282 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5283
5284 if (BO0) {
5285 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5286 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5287 }
5288 if (BO1) {
5289 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5290 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5291 }
5292
5293 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5294 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5295 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5296 return new ICmpInst(Pred, A == Op1 ? B : A,
5297 Constant::getNullValue(Op1->getType()));
5298
5299 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5300 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5301 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5302 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5303 C == Op0 ? D : C);
5304
5305 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5306 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5307 NoOp1WrapProblem) {
5308 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5309 Value *Y, *Z;
5310 if (A == C) {
5311 // C + B == C + D -> B == D
5312 Y = B;
5313 Z = D;
5314 } else if (A == D) {
5315 // D + B == C + D -> B == C
5316 Y = B;
5317 Z = C;
5318 } else if (B == C) {
5319 // A + C == C + D -> A == D
5320 Y = A;
5321 Z = D;
5322 } else {
5323 assert(B == D);
5324 // A + D == C + D -> A == C
5325 Y = A;
5326 Z = C;
5327 }
5328 return new ICmpInst(Pred, Y, Z);
5329 }
5330
5331 if (ICmpInst::isRelational(Pred)) {
5332 // Return if both X and Y is divisible by Z/-Z.
5333 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5334 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5335 bool IsNegative) -> bool {
5336 const APInt *OffsetC;
5337 if (!match(Z, m_APInt(OffsetC)))
5338 return false;
5339
5340 // Fast path for Z == 1/-1.
5341 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5342 return true;
5343
5344 APInt C = *OffsetC;
5345 if (IsNegative)
5346 C.negate();
5347 // Note: -INT_MIN is also negative.
5348 if (!C.isStrictlyPositive())
5349 return false;
5350
5351 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5352 };
5353
5354 // TODO: The subtraction-related identities shown below also hold, but
5355 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5356 // wouldn't happen even if they were implemented.
5357 //
5358 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5359 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5360 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5361 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5362
5363 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5364 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5365 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5366 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5367 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5368 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5369 if (A && NoOp0WrapProblem &&
5370 ShareCommonDivisor(A, Op1, B,
5371 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5373 Op1);
5374
5375 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5376 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5377 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5378 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5379 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5380 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5381 if (C && NoOp1WrapProblem &&
5382 ShareCommonDivisor(Op0, C, D,
5383 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5385 C);
5386 }
5387
5388 // if C1 has greater magnitude than C2:
5389 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5390 // s.t. C3 = C1 - C2
5391 //
5392 // if C2 has greater magnitude than C1:
5393 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5394 // s.t. C3 = C2 - C1
5395 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5396 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5397 const APInt *AP1, *AP2;
5398 // TODO: Support non-uniform vectors.
5399 // TODO: Allow poison passthrough if B or D's element is poison.
5400 if (match(B, m_APIntAllowPoison(AP1)) &&
5401 match(D, m_APIntAllowPoison(AP2)) &&
5402 AP1->isNegative() == AP2->isNegative()) {
5403 APInt AP1Abs = AP1->abs();
5404 APInt AP2Abs = AP2->abs();
5405 if (AP1Abs.uge(AP2Abs)) {
5406 APInt Diff = *AP1 - *AP2;
5407 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5408 Value *NewAdd = Builder.CreateAdd(
5409 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5410 return new ICmpInst(Pred, NewAdd, C);
5411 } else {
5412 APInt Diff = *AP2 - *AP1;
5413 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5414 Value *NewAdd = Builder.CreateAdd(
5415 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5416 return new ICmpInst(Pred, A, NewAdd);
5417 }
5418 }
5419 Constant *Cst1, *Cst2;
5420 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5421 ICmpInst::isEquality(Pred)) {
5422 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5423 Value *NewAdd = Builder.CreateAdd(C, Diff);
5424 return new ICmpInst(Pred, A, NewAdd);
5425 }
5426 }
5427
5428 // Analyze the case when either Op0 or Op1 is a sub instruction.
5429 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5430 A = nullptr;
5431 B = nullptr;
5432 C = nullptr;
5433 D = nullptr;
5434 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5435 A = BO0->getOperand(0);
5436 B = BO0->getOperand(1);
5437 }
5438 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5439 C = BO1->getOperand(0);
5440 D = BO1->getOperand(1);
5441 }
5442
5443 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5444 if (A == Op1 && NoOp0WrapProblem)
5445 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5446 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5447 if (C == Op0 && NoOp1WrapProblem)
5448 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5449
5450 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5451 // (A - B) u>/u<= A --> B u>/u<= A
5452 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5453 return new ICmpInst(Pred, B, A);
5454 // C u</u>= (C - D) --> C u</u>= D
5455 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5456 return new ICmpInst(Pred, C, D);
5457 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5458 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5459 isKnownNonZero(B, Q))
5461 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5462 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5463 isKnownNonZero(D, Q))
5465
5466 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5467 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5468 return new ICmpInst(Pred, A, C);
5469
5470 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5471 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5472 return new ICmpInst(Pred, D, B);
5473
5474 // icmp (0-X) < cst --> x > -cst
5475 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5476 Value *X;
5477 if (match(BO0, m_Neg(m_Value(X))))
5478 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5479 if (RHSC->isNotMinSignedValue())
5480 return new ICmpInst(I.getSwappedPredicate(), X,
5481 ConstantExpr::getNeg(RHSC));
5482 }
5483
5484 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5485 return R;
5486 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5487 return R;
5488
5489 {
5490 // Try to remove shared multiplier from comparison:
5491 // X * Z pred Y * Z
5492 Value *X, *Y, *Z;
5493 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5494 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5495 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5496 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5497 if (ICmpInst::isSigned(Pred)) {
5498 if (Op0HasNSW && Op1HasNSW) {
5499 KnownBits ZKnown = computeKnownBits(Z, &I);
5500 if (ZKnown.isStrictlyPositive())
5501 return new ICmpInst(Pred, X, Y);
5502 if (ZKnown.isNegative())
5503 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5505 SQ.getWithInstruction(&I));
5506 if (LessThan && match(LessThan, m_One()))
5507 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5508 Constant::getNullValue(Z->getType()));
5509 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5510 SQ.getWithInstruction(&I));
5511 if (GreaterThan && match(GreaterThan, m_One()))
5512 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5513 }
5514 } else {
5515 bool NonZero;
5516 if (ICmpInst::isEquality(Pred)) {
5517 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5518 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5519 isKnownNonEqual(X, Y, SQ))
5520 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5521
5522 KnownBits ZKnown = computeKnownBits(Z, &I);
5523 // if Z % 2 != 0
5524 // X * Z eq/ne Y * Z -> X eq/ne Y
5525 if (ZKnown.countMaxTrailingZeros() == 0)
5526 return new ICmpInst(Pred, X, Y);
5527 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5528 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5529 // X * Z eq/ne Y * Z -> X eq/ne Y
5530 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5531 return new ICmpInst(Pred, X, Y);
5532 } else
5533 NonZero = isKnownNonZero(Z, Q);
5534
5535 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5536 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5537 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5538 return new ICmpInst(Pred, X, Y);
5539 }
5540 }
5541 }
5542
5543 BinaryOperator *SRem = nullptr;
5544 // icmp (srem X, Y), Y
5545 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5546 SRem = BO0;
5547 // icmp Y, (srem X, Y)
5548 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5549 Op0 == BO1->getOperand(1))
5550 SRem = BO1;
5551 if (SRem) {
5552 // We don't check hasOneUse to avoid increasing register pressure because
5553 // the value we use is the same value this instruction was already using.
5554 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5555 default:
5556 break;
5557 case ICmpInst::ICMP_EQ:
5558 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5559 case ICmpInst::ICMP_NE:
5560 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5561 case ICmpInst::ICMP_SGT:
5562 case ICmpInst::ICMP_SGE:
5563 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5565 case ICmpInst::ICMP_SLT:
5566 case ICmpInst::ICMP_SLE:
5567 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5569 }
5570 }
5571
5572 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5573 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5574 BO0->getOperand(1) == BO1->getOperand(1)) {
5575 switch (BO0->getOpcode()) {
5576 default:
5577 break;
5578 case Instruction::Add:
5579 case Instruction::Sub:
5580 case Instruction::Xor: {
5581 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5582 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5583
5584 const APInt *C;
5585 if (match(BO0->getOperand(1), m_APInt(C))) {
5586 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5587 if (C->isSignMask()) {
5588 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5589 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5590 }
5591
5592 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5593 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5594 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5595 NewPred = I.getSwappedPredicate(NewPred);
5596 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5597 }
5598 }
5599 break;
5600 }
5601 case Instruction::Mul: {
5602 if (!I.isEquality())
5603 break;
5604
5605 const APInt *C;
5606 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5607 !C->isOne()) {
5608 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5609 // Mask = -1 >> count-trailing-zeros(C).
5610 if (unsigned TZs = C->countr_zero()) {
5611 Constant *Mask = ConstantInt::get(
5612 BO0->getType(),
5613 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5614 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5615 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5616 return new ICmpInst(Pred, And1, And2);
5617 }
5618 }
5619 break;
5620 }
5621 case Instruction::UDiv:
5622 case Instruction::LShr:
5623 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5624 break;
5625 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5626
5627 case Instruction::SDiv:
5628 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5629 !BO0->isExact() || !BO1->isExact())
5630 break;
5631 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5632
5633 case Instruction::AShr:
5634 if (!BO0->isExact() || !BO1->isExact())
5635 break;
5636 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5637
5638 case Instruction::Shl: {
5639 bool NUW = Op0HasNUW && Op1HasNUW;
5640 bool NSW = Op0HasNSW && Op1HasNSW;
5641 if (!NUW && !NSW)
5642 break;
5643 if (!NSW && I.isSigned())
5644 break;
5645 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5646 }
5647 }
5648 }
5649
5650 if (BO0) {
5651 // Transform A & (L - 1) `ult` L --> L != 0
5652 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5653 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5654
5655 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5656 auto *Zero = Constant::getNullValue(BO0->getType());
5657 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5658 }
5659 }
5660
5661 // For unsigned predicates / eq / ne:
5662 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5663 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5664 if (!ICmpInst::isSigned(Pred)) {
5665 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5666 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5667 Constant::getNullValue(Op1->getType()));
5668 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5669 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5670 Constant::getNullValue(Op0->getType()), Op0);
5671 }
5672
5674 return replaceInstUsesWith(I, V);
5675
5676 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5677 return R;
5678
5680 return replaceInstUsesWith(I, V);
5681
5683 return replaceInstUsesWith(I, V);
5684
5685 return nullptr;
5686}
5687
5688/// Fold icmp Pred min|max(X, Y), Z.
5691 Value *Z, CmpPredicate Pred) {
5692 Value *X = MinMax->getLHS();
5693 Value *Y = MinMax->getRHS();
5694 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5695 return nullptr;
5696 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5697 // Revert the transform signed pred -> unsigned pred
5698 // TODO: We can flip the signedness of predicate if both operands of icmp
5699 // are negative.
5700 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5701 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5703 } else
5704 return nullptr;
5705 }
5706 SimplifyQuery Q = SQ.getWithInstruction(&I);
5707 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5708 if (!Val)
5709 return std::nullopt;
5710 if (match(Val, m_One()))
5711 return true;
5712 if (match(Val, m_Zero()))
5713 return false;
5714 return std::nullopt;
5715 };
5716 // Remove samesign here since it is illegal to keep it when we speculatively
5717 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5718 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5719 // -46, -32)`. `X` is allowed to be non-negative here.
5720 Pred = Pred.dropSameSign();
5721 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5722 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5723 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5724 return nullptr;
5725 if (!CmpXZ.has_value()) {
5726 std::swap(X, Y);
5727 std::swap(CmpXZ, CmpYZ);
5728 }
5729
5730 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5731 if (CmpYZ.has_value())
5732 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5733 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5734 };
5735
5736 switch (Pred) {
5737 case ICmpInst::ICMP_EQ:
5738 case ICmpInst::ICMP_NE: {
5739 // If X == Z:
5740 // Expr Result
5741 // min(X, Y) == Z X <= Y
5742 // max(X, Y) == Z X >= Y
5743 // min(X, Y) != Z X > Y
5744 // max(X, Y) != Z X < Y
5745 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5746 ICmpInst::Predicate NewPred =
5747 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5748 if (Pred == ICmpInst::ICMP_NE)
5749 NewPred = ICmpInst::getInversePredicate(NewPred);
5750 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5751 }
5752 // Otherwise (X != Z):
5753 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5754 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5755 if (!MinMaxCmpXZ.has_value()) {
5756 std::swap(X, Y);
5757 std::swap(CmpXZ, CmpYZ);
5758 // Re-check pre-condition X != Z
5759 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5760 break;
5761 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5762 }
5763 if (!MinMaxCmpXZ.has_value())
5764 break;
5765 if (*MinMaxCmpXZ) {
5766 // Expr Fact Result
5767 // min(X, Y) == Z X < Z false
5768 // max(X, Y) == Z X > Z false
5769 // min(X, Y) != Z X < Z true
5770 // max(X, Y) != Z X > Z true
5771 return replaceInstUsesWith(
5772 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5773 } else {
5774 // Expr Fact Result
5775 // min(X, Y) == Z X > Z Y == Z
5776 // max(X, Y) == Z X < Z Y == Z
5777 // min(X, Y) != Z X > Z Y != Z
5778 // max(X, Y) != Z X < Z Y != Z
5779 return FoldIntoCmpYZ();
5780 }
5781 break;
5782 }
5783 case ICmpInst::ICMP_SLT:
5784 case ICmpInst::ICMP_ULT:
5785 case ICmpInst::ICMP_SLE:
5786 case ICmpInst::ICMP_ULE:
5787 case ICmpInst::ICMP_SGT:
5788 case ICmpInst::ICMP_UGT:
5789 case ICmpInst::ICMP_SGE:
5790 case ICmpInst::ICMP_UGE: {
5791 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5792 if (*CmpXZ) {
5793 if (IsSame) {
5794 // Expr Fact Result
5795 // min(X, Y) < Z X < Z true
5796 // min(X, Y) <= Z X <= Z true
5797 // max(X, Y) > Z X > Z true
5798 // max(X, Y) >= Z X >= Z true
5799 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5800 } else {
5801 // Expr Fact Result
5802 // max(X, Y) < Z X < Z Y < Z
5803 // max(X, Y) <= Z X <= Z Y <= Z
5804 // min(X, Y) > Z X > Z Y > Z
5805 // min(X, Y) >= Z X >= Z Y >= Z
5806 return FoldIntoCmpYZ();
5807 }
5808 } else {
5809 if (IsSame) {
5810 // Expr Fact Result
5811 // min(X, Y) < Z X >= Z Y < Z
5812 // min(X, Y) <= Z X > Z Y <= Z
5813 // max(X, Y) > Z X <= Z Y > Z
5814 // max(X, Y) >= Z X < Z Y >= Z
5815 return FoldIntoCmpYZ();
5816 } else {
5817 // Expr Fact Result
5818 // max(X, Y) < Z X >= Z false
5819 // max(X, Y) <= Z X > Z false
5820 // min(X, Y) > Z X <= Z false
5821 // min(X, Y) >= Z X < Z false
5822 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5823 }
5824 }
5825 break;
5826 }
5827 default:
5828 break;
5829 }
5830
5831 return nullptr;
5832}
5833
5834/// Match and fold patterns like:
5835/// icmp eq/ne X, min(max(X, Lo), Hi)
5836/// which represents a range check and can be repsented as a ConstantRange.
5837///
5838/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5839/// (X - Lo) u< (Hi + 1 - Lo)
5840/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5841/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5843 MinMaxIntrinsic *Min) {
5844 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5845 return nullptr;
5846
5847 const APInt *Lo = nullptr, *Hi = nullptr;
5848 if (Min->isSigned()) {
5849 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5850 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5851 return nullptr;
5852 } else {
5853 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5854 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5855 return nullptr;
5856 }
5857
5860 APInt C, Offset;
5861 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5862 CR.getEquivalentICmp(Pred, C, Offset);
5863 else
5864 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5865
5866 if (!Offset.isZero())
5867 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5868
5869 return replaceInstUsesWith(
5870 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5871}
5872
5873// Canonicalize checking for a power-of-2-or-zero value:
5875 InstCombiner::BuilderTy &Builder) {
5876 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5877 const CmpInst::Predicate Pred = I.getPredicate();
5878 Value *A = nullptr;
5879 bool CheckIs;
5880 if (I.isEquality()) {
5881 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5882 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5883 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5884 m_Deferred(A)))) ||
5885 !match(Op1, m_ZeroInt()))
5886 A = nullptr;
5887
5888 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5889 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5890 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5891 A = Op1;
5892 else if (match(Op1,
5894 A = Op0;
5895
5896 CheckIs = Pred == ICmpInst::ICMP_EQ;
5897 } else if (ICmpInst::isUnsigned(Pred)) {
5898 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5899 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5900
5901 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5903 m_Specific(Op1))))) {
5904 A = Op1;
5905 CheckIs = Pred == ICmpInst::ICMP_UGE;
5906 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5908 m_Specific(Op0))))) {
5909 A = Op0;
5910 CheckIs = Pred == ICmpInst::ICMP_ULE;
5911 }
5912 }
5913
5914 if (A) {
5915 Type *Ty = A->getType();
5916 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5917 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5918 ConstantInt::get(Ty, 2))
5919 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5920 ConstantInt::get(Ty, 1));
5921 }
5922
5923 return nullptr;
5924}
5925
5926/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5927using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5929 bool AllowRecursion) {
5931 if (!Inst || !Inst->hasOneUse())
5932 return;
5933
5934 switch (Inst->getOpcode()) {
5935 case Instruction::Add:
5936 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5937 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5938 break;
5939 case Instruction::Sub:
5940 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5941 break;
5942 case Instruction::Xor:
5943 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5944 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5945 break;
5946 case Instruction::Shl:
5947 if (Inst->hasNoSignedWrap())
5948 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
5949 if (Inst->hasNoUnsignedWrap())
5950 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
5951 break;
5952 case Instruction::Select:
5953 if (AllowRecursion) {
5954 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5955 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5956 }
5957 break;
5958 default:
5959 break;
5960 }
5961}
5962
5964
5969
5971 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
5972 }
5974 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
5975 }
5976 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
5978 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
5979 }
5980 bool isValid() const { return Kind != OffsetKind::Invalid; }
5982 switch (Kind) {
5984 llvm_unreachable("Invalid offset result");
5985 case OffsetKind::Value:
5986 return V0;
5987 case OffsetKind::Select:
5988 return Builder.CreateSelect(
5989 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
5990 }
5991 llvm_unreachable("Unknown OffsetKind enum");
5992 }
5993};
5994
5995/// Offset both sides of an equality icmp to see if we can save some
5996/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
5997/// Note: This operation should not introduce poison.
5999 InstCombiner::BuilderTy &Builder,
6000 const SimplifyQuery &SQ) {
6001 assert(I.isEquality() && "Expected an equality icmp");
6002 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6003 if (!Op0->getType()->isIntOrIntVectorTy())
6004 return nullptr;
6005
6006 SmallVector<OffsetOp, 4> OffsetOps;
6007 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
6008 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
6009
6010 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
6011 switch (BinOpc) {
6012 // V = shl nsw X, RHS => X = ashr V, RHS
6013 case Instruction::AShr: {
6014 const APInt *CV, *CRHS;
6015 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6016 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
6018 return nullptr;
6019 break;
6020 }
6021 // V = shl nuw X, RHS => X = lshr V, RHS
6022 case Instruction::LShr: {
6023 const APInt *CV, *CRHS;
6024 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6025 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
6027 return nullptr;
6028 break;
6029 }
6030 default:
6031 break;
6032 }
6033
6034 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6035 if (!Simplified)
6036 return nullptr;
6037 // Reject constant expressions as they don't simplify things.
6038 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6039 return nullptr;
6040 // Check if the transformation introduces poison.
6041 return impliesPoison(RHS, V) ? Simplified : nullptr;
6042 };
6043
6044 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6045 Value *RHS) -> OffsetResult {
6046 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6047 if (!Sel->hasOneUse())
6048 return OffsetResult::invalid();
6049 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6050 if (!TrueVal)
6051 return OffsetResult::invalid();
6052 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6053 if (!FalseVal)
6054 return OffsetResult::invalid();
6055 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6056 }
6057 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6058 return OffsetResult::value(Simplified);
6059 return OffsetResult::invalid();
6060 };
6061
6062 for (auto [BinOp, RHS] : OffsetOps) {
6063 auto BinOpc = static_cast<unsigned>(BinOp);
6064
6065 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6066 if (!Op0Result.isValid())
6067 continue;
6068 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6069 if (!Op1Result.isValid())
6070 continue;
6071
6072 Value *NewLHS = Op0Result.materialize(Builder);
6073 Value *NewRHS = Op1Result.materialize(Builder);
6074 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6075 }
6076
6077 return nullptr;
6078}
6079
6081 if (!I.isEquality())
6082 return nullptr;
6083
6084 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6085 const CmpInst::Predicate Pred = I.getPredicate();
6086 Value *A, *B, *C, *D;
6087 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6088 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6089 Value *OtherVal = A == Op1 ? B : A;
6090 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6091 }
6092
6093 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6094 // A^c1 == C^c2 --> A == C^(c1^c2)
6095 ConstantInt *C1, *C2;
6096 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6097 Op1->hasOneUse()) {
6098 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6099 Value *Xor = Builder.CreateXor(C, NC);
6100 return new ICmpInst(Pred, A, Xor);
6101 }
6102
6103 // A^B == A^D -> B == D
6104 if (A == C)
6105 return new ICmpInst(Pred, B, D);
6106 if (A == D)
6107 return new ICmpInst(Pred, B, C);
6108 if (B == C)
6109 return new ICmpInst(Pred, A, D);
6110 if (B == D)
6111 return new ICmpInst(Pred, A, C);
6112 }
6113 }
6114
6115 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6116 // A == (A^B) -> B == 0
6117 Value *OtherVal = A == Op0 ? B : A;
6118 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6119 }
6120
6121 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6122 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6123 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6124 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6125
6126 if (A == C) {
6127 X = B;
6128 Y = D;
6129 Z = A;
6130 } else if (A == D) {
6131 X = B;
6132 Y = C;
6133 Z = A;
6134 } else if (B == C) {
6135 X = A;
6136 Y = D;
6137 Z = B;
6138 } else if (B == D) {
6139 X = A;
6140 Y = C;
6141 Z = B;
6142 }
6143
6144 if (X) {
6145 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6146 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6147 // instructions.
6148 const APInt *C0, *C1;
6149 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6150 (*C0 ^ *C1).isNegatedPowerOf2();
6151
6152 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6153 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6154 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6155 int UseCnt =
6156 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6157 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6158 if (XorIsNegP2 || UseCnt >= 2) {
6159 // Build (X^Y) & Z
6160 Op1 = Builder.CreateXor(X, Y);
6161 Op1 = Builder.CreateAnd(Op1, Z);
6162 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6163 }
6164 }
6165 }
6166
6167 {
6168 // Similar to above, but specialized for constant because invert is needed:
6169 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6170 Value *X, *Y;
6171 Constant *C;
6172 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6173 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6174 Value *Xor = Builder.CreateXor(X, Y);
6175 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6176 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6177 }
6178 }
6179
6180 if (match(Op1, m_ZExt(m_Value(A))) &&
6181 (Op0->hasOneUse() || Op1->hasOneUse())) {
6182 // (B & (Pow2C-1)) == zext A --> A == trunc B
6183 // (B & (Pow2C-1)) != zext A --> A != trunc B
6184 const APInt *MaskC;
6185 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6186 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6187 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6188 }
6189
6190 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6191 // For lshr and ashr pairs.
6192 const APInt *AP1, *AP2;
6193 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6194 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6195 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6196 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6197 if (*AP1 != *AP2)
6198 return nullptr;
6199 unsigned TypeBits = AP1->getBitWidth();
6200 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6201 if (ShAmt < TypeBits && ShAmt != 0) {
6202 ICmpInst::Predicate NewPred =
6204 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6205 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6206 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6207 }
6208 }
6209
6210 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6211 ConstantInt *Cst1;
6212 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6213 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6214 unsigned TypeBits = Cst1->getBitWidth();
6215 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6216 if (ShAmt < TypeBits && ShAmt != 0) {
6217 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6218 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6219 Value *And =
6220 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6221 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6222 }
6223 }
6224
6225 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6226 // "icmp (and X, mask), cst"
6227 uint64_t ShAmt = 0;
6228 if (Op0->hasOneUse() &&
6229 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6230 match(Op1, m_ConstantInt(Cst1)) &&
6231 // Only do this when A has multiple uses. This is most important to do
6232 // when it exposes other optimizations.
6233 !A->hasOneUse()) {
6234 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6235
6236 if (ShAmt < ASize) {
6237 APInt MaskV =
6239 MaskV <<= ShAmt;
6240
6241 APInt CmpV = Cst1->getValue().zext(ASize);
6242 CmpV <<= ShAmt;
6243
6244 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6245 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6246 }
6247 }
6248
6250 return ICmp;
6251
6252 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6253 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6254 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6255 // few steps of instcombine.
6256 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6257 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6259 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6260 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6262 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6263 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6265 Add, ConstantInt::get(A->getType(), C.shl(1)));
6266 }
6267
6268 // Canonicalize:
6269 // Assume B_Pow2 != 0
6270 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6271 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6272 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6273 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6274 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6276
6277 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6278 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6279 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6280 ConstantInt::getNullValue(Op1->getType()));
6281
6282 // Canonicalize:
6283 // icmp eq/ne X, OneUse(rotate-right(X))
6284 // -> icmp eq/ne X, rotate-left(X)
6285 // We generally try to convert rotate-right -> rotate-left, this just
6286 // canonicalizes another case.
6287 if (match(&I, m_c_ICmp(m_Value(A),
6289 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6290 return new ICmpInst(
6291 Pred, A,
6292 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6293
6294 // Canonicalize:
6295 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6296 Constant *Cst;
6299 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6300
6301 {
6302 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6303 auto m_Matcher =
6306 m_Sub(m_Value(B), m_Deferred(A)));
6307 std::optional<bool> IsZero = std::nullopt;
6308 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6309 m_Deferred(A))))
6310 IsZero = false;
6311 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6312 else if (match(&I,
6313 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6314 IsZero = true;
6315
6316 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6317 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6318 // -> (icmp eq/ne (and X, P2), 0)
6319 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6320 // -> (icmp eq/ne (and X, P2), P2)
6321 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6322 *IsZero ? A
6323 : ConstantInt::getNullValue(A->getType()));
6324 }
6325
6326 if (auto *Res = foldICmpEqualityWithOffset(
6327 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6328 return Res;
6329
6330 return nullptr;
6331}
6332
6334 ICmpInst::Predicate Pred = ICmp.getPredicate();
6335 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6336
6337 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6338 // The trunc masks high bits while the compare may effectively mask low bits.
6339 Value *X;
6340 const APInt *C;
6341 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6342 return nullptr;
6343
6344 // This matches patterns corresponding to tests of the signbit as well as:
6345 // (trunc X) pred C2 --> (X & Mask) == C
6346 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6347 /*AllowNonZeroC=*/true)) {
6348 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6349 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6350 return new ICmpInst(Res->Pred, And, C);
6351 }
6352
6353 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6354 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6355 if (II->getIntrinsicID() == Intrinsic::cttz ||
6356 II->getIntrinsicID() == Intrinsic::ctlz) {
6357 unsigned MaxRet = SrcBits;
6358 // If the "is_zero_poison" argument is set, then we know at least
6359 // one bit is set in the input, so the result is always at least one
6360 // less than the full bitwidth of that input.
6361 if (match(II->getArgOperand(1), m_One()))
6362 MaxRet--;
6363
6364 // Make sure the destination is wide enough to hold the largest output of
6365 // the intrinsic.
6366 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6367 if (Instruction *I =
6368 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6369 return I;
6370 }
6371 }
6372
6373 return nullptr;
6374}
6375
6377 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6378 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6379 Value *X;
6380 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6381 return nullptr;
6382
6383 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6384 bool IsSignedCmp = ICmp.isSigned();
6385
6386 // icmp Pred (ext X), (ext Y)
6387 Value *Y;
6388 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6389 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6390 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6391
6392 if (IsZext0 != IsZext1) {
6393 // If X and Y and both i1
6394 // (icmp eq/ne (zext X) (sext Y))
6395 // eq -> (icmp eq (or X, Y), 0)
6396 // ne -> (icmp ne (or X, Y), 0)
6397 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6398 Y->getType()->isIntOrIntVectorTy(1))
6399 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6400 Constant::getNullValue(X->getType()));
6401
6402 // If we have mismatched casts and zext has the nneg flag, we can
6403 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6404
6405 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6406 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6407
6408 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6409 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6410
6411 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6412 IsSignedExt = true;
6413 else
6414 return nullptr;
6415 }
6416
6417 // Not an extension from the same type?
6418 Type *XTy = X->getType(), *YTy = Y->getType();
6419 if (XTy != YTy) {
6420 // One of the casts must have one use because we are creating a new cast.
6421 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6422 return nullptr;
6423 // Extend the narrower operand to the type of the wider operand.
6424 CastInst::CastOps CastOpcode =
6425 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6426 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6427 X = Builder.CreateCast(CastOpcode, X, YTy);
6428 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6429 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6430 else
6431 return nullptr;
6432 }
6433
6434 // (zext X) == (zext Y) --> X == Y
6435 // (sext X) == (sext Y) --> X == Y
6436 if (ICmp.isEquality())
6437 return new ICmpInst(ICmp.getPredicate(), X, Y);
6438
6439 // A signed comparison of sign extended values simplifies into a
6440 // signed comparison.
6441 if (IsSignedCmp && IsSignedExt)
6442 return new ICmpInst(ICmp.getPredicate(), X, Y);
6443
6444 // The other three cases all fold into an unsigned comparison.
6445 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6446 }
6447
6448 // Below here, we are only folding a compare with constant.
6449 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6450 if (!C)
6451 return nullptr;
6452
6453 // If a lossless truncate is possible...
6454 Type *SrcTy = CastOp0->getSrcTy();
6455 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6456 if (Res) {
6457 if (ICmp.isEquality())
6458 return new ICmpInst(ICmp.getPredicate(), X, Res);
6459
6460 // A signed comparison of sign extended values simplifies into a
6461 // signed comparison.
6462 if (IsSignedExt && IsSignedCmp)
6463 return new ICmpInst(ICmp.getPredicate(), X, Res);
6464
6465 // The other three cases all fold into an unsigned comparison.
6466 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6467 }
6468
6469 // The re-extended constant changed, partly changed (in the case of a vector),
6470 // or could not be determined to be equal (in the case of a constant
6471 // expression), so the constant cannot be represented in the shorter type.
6472 // All the cases that fold to true or false will have already been handled
6473 // by simplifyICmpInst, so only deal with the tricky case.
6474 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6475 return nullptr;
6476
6477 // Is source op positive?
6478 // icmp ult (sext X), C --> icmp sgt X, -1
6479 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6481
6482 // Is source op negative?
6483 // icmp ugt (sext X), C --> icmp slt X, 0
6484 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6486}
6487
6488/// Handle icmp (cast x), (cast or constant).
6490 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6491 // icmp compares only pointer's value.
6492 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6493 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6494 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6495 if (SimplifiedOp0 || SimplifiedOp1)
6496 return new ICmpInst(ICmp.getPredicate(),
6497 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6498 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6499
6500 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6501 if (!CastOp0)
6502 return nullptr;
6503 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6504 return nullptr;
6505
6506 Value *Op0Src = CastOp0->getOperand(0);
6507 Type *SrcTy = CastOp0->getSrcTy();
6508 Type *DestTy = CastOp0->getDestTy();
6509
6510 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6511 // integer type is the same size as the pointer type.
6512 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6513 if (isa<VectorType>(PtrTy)) {
6514 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6515 IntTy = cast<VectorType>(IntTy)->getElementType();
6516 }
6517 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6518 };
6519 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6520 CompatibleSizes(SrcTy, DestTy)) {
6521 Value *NewOp1 = nullptr;
6522 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6523 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6524 if (PtrSrc->getType() == Op0Src->getType())
6525 NewOp1 = PtrToIntOp1->getOperand(0);
6526 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6527 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6528 }
6529
6530 if (NewOp1)
6531 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6532 }
6533
6534 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6535 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6536 CompatibleSizes(DestTy, SrcTy)) {
6537 Value *NewOp1 = nullptr;
6538 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6539 Value *IntSrc = IntToPtrOp1->getOperand(0);
6540 if (IntSrc->getType() == Op0Src->getType())
6541 NewOp1 = IntToPtrOp1->getOperand(0);
6542 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6543 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6544 }
6545
6546 if (NewOp1)
6547 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6548 }
6549
6550 if (Instruction *R = foldICmpWithTrunc(ICmp))
6551 return R;
6552
6553 return foldICmpWithZextOrSext(ICmp);
6554}
6555
6557 bool IsSigned) {
6558 switch (BinaryOp) {
6559 default:
6560 llvm_unreachable("Unsupported binary op");
6561 case Instruction::Add:
6562 case Instruction::Sub:
6563 return match(RHS, m_Zero());
6564 case Instruction::Mul:
6565 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6566 match(RHS, m_One());
6567 }
6568}
6569
6572 bool IsSigned, Value *LHS, Value *RHS,
6573 Instruction *CxtI) const {
6574 switch (BinaryOp) {
6575 default:
6576 llvm_unreachable("Unsupported binary op");
6577 case Instruction::Add:
6578 if (IsSigned)
6579 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6580 else
6581 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6582 case Instruction::Sub:
6583 if (IsSigned)
6584 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6585 else
6586 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6587 case Instruction::Mul:
6588 if (IsSigned)
6589 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6590 else
6591 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6592 }
6593}
6594
6595bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6596 bool IsSigned, Value *LHS,
6597 Value *RHS, Instruction &OrigI,
6598 Value *&Result,
6599 Constant *&Overflow) {
6600 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6601 std::swap(LHS, RHS);
6602
6603 // If the overflow check was an add followed by a compare, the insertion point
6604 // may be pointing to the compare. We want to insert the new instructions
6605 // before the add in case there are uses of the add between the add and the
6606 // compare.
6607 Builder.SetInsertPoint(&OrigI);
6608
6609 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6610 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6611 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6612
6613 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6614 Result = LHS;
6615 Overflow = ConstantInt::getFalse(OverflowTy);
6616 return true;
6617 }
6618
6619 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6621 return false;
6624 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6625 Result->takeName(&OrigI);
6626 Overflow = ConstantInt::getTrue(OverflowTy);
6627 return true;
6629 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6630 Result->takeName(&OrigI);
6631 Overflow = ConstantInt::getFalse(OverflowTy);
6632 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6633 if (IsSigned)
6634 Inst->setHasNoSignedWrap();
6635 else
6636 Inst->setHasNoUnsignedWrap();
6637 }
6638 return true;
6639 }
6640
6641 llvm_unreachable("Unexpected overflow result");
6642}
6643
6644/// Recognize and process idiom involving test for multiplication
6645/// overflow.
6646///
6647/// The caller has matched a pattern of the form:
6648/// I = cmp u (mul(zext A, zext B), V
6649/// The function checks if this is a test for overflow and if so replaces
6650/// multiplication with call to 'mul.with.overflow' intrinsic.
6651///
6652/// \param I Compare instruction.
6653/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6654/// the compare instruction. Must be of integer type.
6655/// \param OtherVal The other argument of compare instruction.
6656/// \returns Instruction which must replace the compare instruction, NULL if no
6657/// replacement required.
6659 const APInt *OtherVal,
6660 InstCombinerImpl &IC) {
6661 // Don't bother doing this transformation for pointers, don't do it for
6662 // vectors.
6663 if (!isa<IntegerType>(MulVal->getType()))
6664 return nullptr;
6665
6666 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6667 if (!MulInstr)
6668 return nullptr;
6669 assert(MulInstr->getOpcode() == Instruction::Mul);
6670
6671 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6672 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6673 assert(LHS->getOpcode() == Instruction::ZExt);
6674 assert(RHS->getOpcode() == Instruction::ZExt);
6675 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6676
6677 // Calculate type and width of the result produced by mul.with.overflow.
6678 Type *TyA = A->getType(), *TyB = B->getType();
6679 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6680 WidthB = TyB->getPrimitiveSizeInBits();
6681 unsigned MulWidth;
6682 Type *MulType;
6683 if (WidthB > WidthA) {
6684 MulWidth = WidthB;
6685 MulType = TyB;
6686 } else {
6687 MulWidth = WidthA;
6688 MulType = TyA;
6689 }
6690
6691 // In order to replace the original mul with a narrower mul.with.overflow,
6692 // all uses must ignore upper bits of the product. The number of used low
6693 // bits must be not greater than the width of mul.with.overflow.
6694 if (MulVal->hasNUsesOrMore(2))
6695 for (User *U : MulVal->users()) {
6696 if (U == &I)
6697 continue;
6698 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6699 // Check if truncation ignores bits above MulWidth.
6700 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6701 if (TruncWidth > MulWidth)
6702 return nullptr;
6703 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6704 // Check if AND ignores bits above MulWidth.
6705 if (BO->getOpcode() != Instruction::And)
6706 return nullptr;
6707 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6708 const APInt &CVal = CI->getValue();
6709 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6710 return nullptr;
6711 } else {
6712 // In this case we could have the operand of the binary operation
6713 // being defined in another block, and performing the replacement
6714 // could break the dominance relation.
6715 return nullptr;
6716 }
6717 } else {
6718 // Other uses prohibit this transformation.
6719 return nullptr;
6720 }
6721 }
6722
6723 // Recognize patterns
6724 switch (I.getPredicate()) {
6725 case ICmpInst::ICMP_UGT: {
6726 // Recognize pattern:
6727 // mulval = mul(zext A, zext B)
6728 // cmp ugt mulval, max
6729 APInt MaxVal = APInt::getMaxValue(MulWidth);
6730 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6731 if (MaxVal.eq(*OtherVal))
6732 break; // Recognized
6733 return nullptr;
6734 }
6735
6736 case ICmpInst::ICMP_ULT: {
6737 // Recognize pattern:
6738 // mulval = mul(zext A, zext B)
6739 // cmp ule mulval, max + 1
6740 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6741 if (MaxVal.eq(*OtherVal))
6742 break; // Recognized
6743 return nullptr;
6744 }
6745
6746 default:
6747 return nullptr;
6748 }
6749
6750 InstCombiner::BuilderTy &Builder = IC.Builder;
6751 Builder.SetInsertPoint(MulInstr);
6752
6753 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6754 Value *MulA = A, *MulB = B;
6755 if (WidthA < MulWidth)
6756 MulA = Builder.CreateZExt(A, MulType);
6757 if (WidthB < MulWidth)
6758 MulB = Builder.CreateZExt(B, MulType);
6759 CallInst *Call =
6760 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6761 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6762 IC.addToWorklist(MulInstr);
6763
6764 // If there are uses of mul result other than the comparison, we know that
6765 // they are truncation or binary AND. Change them to use result of
6766 // mul.with.overflow and adjust properly mask/size.
6767 if (MulVal->hasNUsesOrMore(2)) {
6768 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6769 for (User *U : make_early_inc_range(MulVal->users())) {
6770 if (U == &I)
6771 continue;
6772 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6773 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6774 IC.replaceInstUsesWith(*TI, Mul);
6775 else
6776 TI->setOperand(0, Mul);
6777 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6778 assert(BO->getOpcode() == Instruction::And);
6779 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6780 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6781 APInt ShortMask = CI->getValue().trunc(MulWidth);
6782 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6783 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6784 IC.replaceInstUsesWith(*BO, Zext);
6785 } else {
6786 llvm_unreachable("Unexpected Binary operation");
6787 }
6789 }
6790 }
6791
6792 // The original icmp gets replaced with the overflow value, maybe inverted
6793 // depending on predicate.
6794 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6795 Value *Res = Builder.CreateExtractValue(Call, 1);
6796 return BinaryOperator::CreateNot(Res);
6797 }
6798
6799 return ExtractValueInst::Create(Call, 1);
6800}
6801
6802/// When performing a comparison against a constant, it is possible that not all
6803/// the bits in the LHS are demanded. This helper method computes the mask that
6804/// IS demanded.
6806 const APInt *RHS;
6807 if (!match(I.getOperand(1), m_APInt(RHS)))
6809
6810 // If this is a normal comparison, it demands all bits. If it is a sign bit
6811 // comparison, it only demands the sign bit.
6812 bool UnusedBit;
6813 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6815
6816 switch (I.getPredicate()) {
6817 // For a UGT comparison, we don't care about any bits that
6818 // correspond to the trailing ones of the comparand. The value of these
6819 // bits doesn't impact the outcome of the comparison, because any value
6820 // greater than the RHS must differ in a bit higher than these due to carry.
6821 case ICmpInst::ICMP_UGT:
6822 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6823
6824 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6825 // Any value less than the RHS must differ in a higher bit because of carries.
6826 case ICmpInst::ICMP_ULT:
6827 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6828
6829 default:
6831 }
6832}
6833
6834/// Check that one use is in the same block as the definition and all
6835/// other uses are in blocks dominated by a given block.
6836///
6837/// \param DI Definition
6838/// \param UI Use
6839/// \param DB Block that must dominate all uses of \p DI outside
6840/// the parent block
6841/// \return true when \p UI is the only use of \p DI in the parent block
6842/// and all other uses of \p DI are in blocks dominated by \p DB.
6843///
6845 const Instruction *UI,
6846 const BasicBlock *DB) const {
6847 assert(DI && UI && "Instruction not defined\n");
6848 // Ignore incomplete definitions.
6849 if (!DI->getParent())
6850 return false;
6851 // DI and UI must be in the same block.
6852 if (DI->getParent() != UI->getParent())
6853 return false;
6854 // Protect from self-referencing blocks.
6855 if (DI->getParent() == DB)
6856 return false;
6857 for (const User *U : DI->users()) {
6858 auto *Usr = cast<Instruction>(U);
6859 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6860 return false;
6861 }
6862 return true;
6863}
6864
6865/// Return true when the instruction sequence within a block is select-cmp-br.
6867 const BasicBlock *BB = SI->getParent();
6868 if (!BB)
6869 return false;
6871 if (!BI || BI->getNumSuccessors() != 2)
6872 return false;
6873 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6874 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6875 return false;
6876 return true;
6877}
6878
6879/// True when a select result is replaced by one of its operands
6880/// in select-icmp sequence. This will eventually result in the elimination
6881/// of the select.
6882///
6883/// \param SI Select instruction
6884/// \param Icmp Compare instruction
6885/// \param SIOpd Operand that replaces the select
6886///
6887/// Notes:
6888/// - The replacement is global and requires dominator information
6889/// - The caller is responsible for the actual replacement
6890///
6891/// Example:
6892///
6893/// entry:
6894/// %4 = select i1 %3, %C* %0, %C* null
6895/// %5 = icmp eq %C* %4, null
6896/// br i1 %5, label %9, label %7
6897/// ...
6898/// ; <label>:7 ; preds = %entry
6899/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6900/// ...
6901///
6902/// can be transformed to
6903///
6904/// %5 = icmp eq %C* %0, null
6905/// %6 = select i1 %3, i1 %5, i1 true
6906/// br i1 %6, label %9, label %7
6907/// ...
6908/// ; <label>:7 ; preds = %entry
6909/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6910///
6911/// Similar when the first operand of the select is a constant or/and
6912/// the compare is for not equal rather than equal.
6913///
6914/// NOTE: The function is only called when the select and compare constants
6915/// are equal, the optimization can work only for EQ predicates. This is not a
6916/// major restriction since a NE compare should be 'normalized' to an equal
6917/// compare, which usually happens in the combiner and test case
6918/// select-cmp-br.ll checks for it.
6920 const ICmpInst *Icmp,
6921 const unsigned SIOpd) {
6922 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6924 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6925 // The check for the single predecessor is not the best that can be
6926 // done. But it protects efficiently against cases like when SI's
6927 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6928 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6929 // replaced can be reached on either path. So the uniqueness check
6930 // guarantees that the path all uses of SI (outside SI's parent) are on
6931 // is disjoint from all other paths out of SI. But that information
6932 // is more expensive to compute, and the trade-off here is in favor
6933 // of compile-time. It should also be noticed that we check for a single
6934 // predecessor and not only uniqueness. This to handle the situation when
6935 // Succ and Succ1 points to the same basic block.
6936 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6937 NumSel++;
6938 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6939 return true;
6940 }
6941 }
6942 return false;
6943}
6944
6945/// Try to fold the comparison based on range information we can get by checking
6946/// whether bits are known to be zero or one in the inputs.
6948 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6949 Type *Ty = Op0->getType();
6950 ICmpInst::Predicate Pred = I.getPredicate();
6951
6952 // Get scalar or pointer size.
6953 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6954 ? Ty->getScalarSizeInBits()
6955 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6956
6957 if (!BitWidth)
6958 return nullptr;
6959
6960 KnownBits Op0Known(BitWidth);
6961 KnownBits Op1Known(BitWidth);
6962
6963 {
6964 // Don't use dominating conditions when folding icmp using known bits. This
6965 // may convert signed into unsigned predicates in ways that other passes
6966 // (especially IndVarSimplify) may not be able to reliably undo.
6967 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6969 Op0Known, Q))
6970 return &I;
6971
6972 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6973 return &I;
6974 }
6975
6976 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6977 return new ICmpInst(
6978 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6979 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6980 return new ICmpInst(
6981 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
6982
6983 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
6984 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
6985
6986 // Given the known and unknown bits, compute a range that the LHS could be
6987 // in. Compute the Min, Max and RHS values based on the known bits. For the
6988 // EQ and NE we use unsigned values.
6989 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6990 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6991 if (I.isSigned()) {
6992 Op0Min = Op0Known.getSignedMinValue();
6993 Op0Max = Op0Known.getSignedMaxValue();
6994 Op1Min = Op1Known.getSignedMinValue();
6995 Op1Max = Op1Known.getSignedMaxValue();
6996 } else {
6997 Op0Min = Op0Known.getMinValue();
6998 Op0Max = Op0Known.getMaxValue();
6999 Op1Min = Op1Known.getMinValue();
7000 Op1Max = Op1Known.getMaxValue();
7001 }
7002
7003 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
7004 // min/max canonical compare with some other compare. That could lead to
7005 // conflict with select canonicalization and infinite looping.
7006 // FIXME: This constraint may go away if min/max intrinsics are canonical.
7007 auto isMinMaxCmp = [&](Instruction &Cmp) {
7008 if (!Cmp.hasOneUse())
7009 return false;
7010 Value *A, *B;
7011 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
7013 return false;
7014 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
7015 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
7016 };
7017 if (!isMinMaxCmp(I)) {
7018 switch (Pred) {
7019 default:
7020 break;
7021 case ICmpInst::ICMP_ULT: {
7022 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
7023 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7024 const APInt *CmpC;
7025 if (match(Op1, m_APInt(CmpC))) {
7026 // A <u C -> A == C-1 if min(A)+1 == C
7027 if (*CmpC == Op0Min + 1)
7028 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7029 ConstantInt::get(Op1->getType(), *CmpC - 1));
7030 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7031 // exceeds the log2 of C.
7032 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7033 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7034 Constant::getNullValue(Op1->getType()));
7035 }
7036 break;
7037 }
7038 case ICmpInst::ICMP_UGT: {
7039 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7040 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7041 const APInt *CmpC;
7042 if (match(Op1, m_APInt(CmpC))) {
7043 // A >u C -> A == C+1 if max(a)-1 == C
7044 if (*CmpC == Op0Max - 1)
7045 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7046 ConstantInt::get(Op1->getType(), *CmpC + 1));
7047 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7048 // exceeds the log2 of C.
7049 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7050 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7051 Constant::getNullValue(Op1->getType()));
7052 }
7053 break;
7054 }
7055 case ICmpInst::ICMP_SLT: {
7056 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7057 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7058 const APInt *CmpC;
7059 if (match(Op1, m_APInt(CmpC))) {
7060 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7061 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7062 ConstantInt::get(Op1->getType(), *CmpC - 1));
7063 }
7064 break;
7065 }
7066 case ICmpInst::ICMP_SGT: {
7067 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7068 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7069 const APInt *CmpC;
7070 if (match(Op1, m_APInt(CmpC))) {
7071 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7072 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7073 ConstantInt::get(Op1->getType(), *CmpC + 1));
7074 }
7075 break;
7076 }
7077 }
7078 }
7079
7080 // Based on the range information we know about the LHS, see if we can
7081 // simplify this comparison. For example, (x&4) < 8 is always true.
7082 switch (Pred) {
7083 default:
7084 break;
7085 case ICmpInst::ICMP_EQ:
7086 case ICmpInst::ICMP_NE: {
7087 // If all bits are known zero except for one, then we know at most one bit
7088 // is set. If the comparison is against zero, then this is a check to see if
7089 // *that* bit is set.
7090 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7091 if (Op1Known.isZero()) {
7092 // If the LHS is an AND with the same constant, look through it.
7093 Value *LHS = nullptr;
7094 const APInt *LHSC;
7095 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7096 *LHSC != Op0KnownZeroInverted)
7097 LHS = Op0;
7098
7099 Value *X;
7100 const APInt *C1;
7101 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7102 Type *XTy = X->getType();
7103 unsigned Log2C1 = C1->countr_zero();
7104 APInt C2 = Op0KnownZeroInverted;
7105 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7106 if (C2Pow2.isPowerOf2()) {
7107 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7108 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7109 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7110 unsigned Log2C2 = C2Pow2.countr_zero();
7111 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7112 auto NewPred =
7114 return new ICmpInst(NewPred, X, CmpC);
7115 }
7116 }
7117 }
7118
7119 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7120 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7121 (Op0Known & Op1Known) == Op0Known)
7122 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7123 ConstantInt::getNullValue(Op1->getType()));
7124 break;
7125 }
7126 case ICmpInst::ICMP_SGE:
7127 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7128 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7129 break;
7130 case ICmpInst::ICMP_SLE:
7131 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7132 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7133 break;
7134 case ICmpInst::ICMP_UGE:
7135 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7136 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7137 break;
7138 case ICmpInst::ICMP_ULE:
7139 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7140 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7141 break;
7142 }
7143
7144 // Turn a signed comparison into an unsigned one if both operands are known to
7145 // have the same sign. Set samesign if possible (except for equality
7146 // predicates).
7147 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7148 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7149 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7150 I.setPredicate(I.getUnsignedPredicate());
7151 I.setSameSign();
7152 return &I;
7153 }
7154
7155 return nullptr;
7156}
7157
7158/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7159/// then try to reduce patterns based on that limit.
7161 Value *X, *Y;
7162 CmpPredicate Pred;
7163
7164 // X must be 0 and bool must be true for "ULT":
7165 // X <u (zext i1 Y) --> (X == 0) & Y
7166 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7167 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7168 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7169
7170 // X must be 0 or bool must be true for "ULE":
7171 // X <=u (sext i1 Y) --> (X == 0) | Y
7172 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7173 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7174 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7175
7176 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7177 CmpPredicate Pred1, Pred2;
7178 const APInt *C;
7179 Instruction *ExtI;
7180 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7183 m_APInt(C)))))) &&
7184 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7185 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7186 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7187 auto CreateRangeCheck = [&] {
7188 Value *CmpV1 =
7189 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7190 Value *CmpV2 = Builder.CreateICmp(
7191 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7193 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7194 CmpV1, CmpV2);
7195 };
7196 if (C->isZero()) {
7197 if (Pred2 == ICmpInst::ICMP_EQ) {
7198 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7199 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7200 return replaceInstUsesWith(
7201 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7202 } else if (!IsSExt || HasOneUse) {
7203 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7204 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7205 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7206 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7207 return CreateRangeCheck();
7208 }
7209 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7210 if (Pred2 == ICmpInst::ICMP_NE) {
7211 // icmp eq X, (zext (icmp ne X, 1)) --> false
7212 // icmp ne X, (zext (icmp ne X, 1)) --> true
7213 // icmp eq X, (sext (icmp ne X, -1)) --> false
7214 // icmp ne X, (sext (icmp ne X, -1)) --> true
7215 return replaceInstUsesWith(
7216 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7217 } else if (!IsSExt || HasOneUse) {
7218 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7219 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7220 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7221 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7222 return CreateRangeCheck();
7223 }
7224 } else {
7225 // when C != 0 && C != 1:
7226 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7227 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7228 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7229 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7230 // when C != 0 && C != -1:
7231 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7232 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7233 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7234 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7235 return ICmpInst::Create(
7236 Instruction::ICmp, Pred1, X,
7237 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7238 ? (IsSExt ? -1 : 1)
7239 : 0));
7240 }
7241 }
7242
7243 return nullptr;
7244}
7245
7246/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7247/// it into the appropriate icmp lt or icmp gt instruction. This transform
7248/// allows them to be folded in visitICmpInst.
7250 ICmpInst::Predicate Pred = I.getPredicate();
7251 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7253 return nullptr;
7254
7255 Value *Op0 = I.getOperand(0);
7256 Value *Op1 = I.getOperand(1);
7257 auto *Op1C = dyn_cast<Constant>(Op1);
7258 if (!Op1C)
7259 return nullptr;
7260
7261 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7262 if (!FlippedStrictness)
7263 return nullptr;
7264
7265 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7266}
7267
7268/// If we have a comparison with a non-canonical predicate, if we can update
7269/// all the users, invert the predicate and adjust all the users.
7271 // Is the predicate already canonical?
7272 CmpInst::Predicate Pred = I.getPredicate();
7274 return nullptr;
7275
7276 // Can all users be adjusted to predicate inversion?
7277 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7278 return nullptr;
7279
7280 // Ok, we can canonicalize comparison!
7281 // Let's first invert the comparison's predicate.
7282 I.setPredicate(CmpInst::getInversePredicate(Pred));
7283 I.setName(I.getName() + ".not");
7284
7285 // And, adapt users.
7287
7288 return &I;
7289}
7290
7291/// Integer compare with boolean values can always be turned into bitwise ops.
7293 InstCombiner::BuilderTy &Builder) {
7294 Value *A = I.getOperand(0), *B = I.getOperand(1);
7295 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7296
7297 // A boolean compared to true/false can be simplified to Op0/true/false in
7298 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7299 // Cases not handled by InstSimplify are always 'not' of Op0.
7300 if (match(B, m_Zero())) {
7301 switch (I.getPredicate()) {
7302 case CmpInst::ICMP_EQ: // A == 0 -> !A
7303 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7304 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7306 default:
7307 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7308 }
7309 } else if (match(B, m_One())) {
7310 switch (I.getPredicate()) {
7311 case CmpInst::ICMP_NE: // A != 1 -> !A
7312 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7313 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7315 default:
7316 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7317 }
7318 }
7319
7320 switch (I.getPredicate()) {
7321 default:
7322 llvm_unreachable("Invalid icmp instruction!");
7323 case ICmpInst::ICMP_EQ:
7324 // icmp eq i1 A, B -> ~(A ^ B)
7325 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7326
7327 case ICmpInst::ICMP_NE:
7328 // icmp ne i1 A, B -> A ^ B
7329 return BinaryOperator::CreateXor(A, B);
7330
7331 case ICmpInst::ICMP_UGT:
7332 // icmp ugt -> icmp ult
7333 std::swap(A, B);
7334 [[fallthrough]];
7335 case ICmpInst::ICMP_ULT:
7336 // icmp ult i1 A, B -> ~A & B
7337 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7338
7339 case ICmpInst::ICMP_SGT:
7340 // icmp sgt -> icmp slt
7341 std::swap(A, B);
7342 [[fallthrough]];
7343 case ICmpInst::ICMP_SLT:
7344 // icmp slt i1 A, B -> A & ~B
7345 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7346
7347 case ICmpInst::ICMP_UGE:
7348 // icmp uge -> icmp ule
7349 std::swap(A, B);
7350 [[fallthrough]];
7351 case ICmpInst::ICMP_ULE:
7352 // icmp ule i1 A, B -> ~A | B
7353 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7354
7355 case ICmpInst::ICMP_SGE:
7356 // icmp sge -> icmp sle
7357 std::swap(A, B);
7358 [[fallthrough]];
7359 case ICmpInst::ICMP_SLE:
7360 // icmp sle i1 A, B -> A | ~B
7361 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7362 }
7363}
7364
7365// Transform pattern like:
7366// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7367// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7368// Into:
7369// (X l>> Y) != 0
7370// (X l>> Y) == 0
7372 InstCombiner::BuilderTy &Builder) {
7373 CmpPredicate Pred, NewPred;
7374 Value *X, *Y;
7375 if (match(&Cmp,
7376 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7377 switch (Pred) {
7378 case ICmpInst::ICMP_ULE:
7379 NewPred = ICmpInst::ICMP_NE;
7380 break;
7381 case ICmpInst::ICMP_UGT:
7382 NewPred = ICmpInst::ICMP_EQ;
7383 break;
7384 default:
7385 return nullptr;
7386 }
7387 } else if (match(&Cmp, m_c_ICmp(Pred,
7390 m_Add(m_Shl(m_One(), m_Value(Y)),
7391 m_AllOnes()))),
7392 m_Value(X)))) {
7393 // The variant with 'add' is not canonical, (the variant with 'not' is)
7394 // we only get it because it has extra uses, and can't be canonicalized,
7395
7396 switch (Pred) {
7397 case ICmpInst::ICMP_ULT:
7398 NewPred = ICmpInst::ICMP_NE;
7399 break;
7400 case ICmpInst::ICMP_UGE:
7401 NewPred = ICmpInst::ICMP_EQ;
7402 break;
7403 default:
7404 return nullptr;
7405 }
7406 } else
7407 return nullptr;
7408
7409 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7410 Constant *Zero = Constant::getNullValue(NewX->getType());
7411 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7412}
7413
7415 InstCombiner::BuilderTy &Builder) {
7416 const CmpInst::Predicate Pred = Cmp.getPredicate();
7417 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7418 Value *V1, *V2;
7419
7420 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7421 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7422 if (auto *I = dyn_cast<Instruction>(V))
7423 I->copyIRFlags(&Cmp);
7424 Module *M = Cmp.getModule();
7426 M, Intrinsic::vector_reverse, V->getType());
7427 return CallInst::Create(F, V);
7428 };
7429
7430 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7431 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7432 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7433 (LHS->hasOneUse() || RHS->hasOneUse()))
7434 return createCmpReverse(Pred, V1, V2);
7435
7436 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7437 if (LHS->hasOneUse() && isSplatValue(RHS))
7438 return createCmpReverse(Pred, V1, RHS);
7439 }
7440 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7441 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7442 return createCmpReverse(Pred, LHS, V2);
7443
7444 ArrayRef<int> M;
7445 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7446 return nullptr;
7447
7448 // If both arguments of the cmp are shuffles that use the same mask and
7449 // shuffle within a single vector, move the shuffle after the cmp:
7450 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7451 Type *V1Ty = V1->getType();
7452 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7453 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7454 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7455 return new ShuffleVectorInst(NewCmp, M);
7456 }
7457
7458 // Try to canonicalize compare with splatted operand and splat constant.
7459 // TODO: We could generalize this for more than splats. See/use the code in
7460 // InstCombiner::foldVectorBinop().
7461 Constant *C;
7462 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7463 return nullptr;
7464
7465 // Length-changing splats are ok, so adjust the constants as needed:
7466 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7467 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7468 int MaskSplatIndex;
7469 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7470 // We allow poison in matching, but this transform removes it for safety.
7471 // Demanded elements analysis should be able to recover some/all of that.
7472 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7473 ScalarC);
7474 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7475 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7476 return new ShuffleVectorInst(NewCmp, NewM);
7477 }
7478
7479 return nullptr;
7480}
7481
7482// extract(uadd.with.overflow(A, B), 0) ult A
7483// -> extract(uadd.with.overflow(A, B), 1)
7485 CmpInst::Predicate Pred = I.getPredicate();
7486 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7487
7488 Value *UAddOv;
7489 Value *A, *B;
7490 auto UAddOvResultPat = m_ExtractValue<0>(
7492 if (match(Op0, UAddOvResultPat) &&
7493 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7494 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7495 (match(A, m_One()) || match(B, m_One()))) ||
7496 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7497 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7498 // extract(uadd.with.overflow(A, B), 0) < A
7499 // extract(uadd.with.overflow(A, 1), 0) == 0
7500 // extract(uadd.with.overflow(A, -1), 0) != -1
7501 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7502 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7503 (Op0 == A || Op0 == B))
7504 // A > extract(uadd.with.overflow(A, B), 0)
7505 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7506 else
7507 return nullptr;
7508
7509 return ExtractValueInst::Create(UAddOv, 1);
7510}
7511
7513 if (!I.getOperand(0)->getType()->isPointerTy() ||
7515 I.getParent()->getParent(),
7516 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7517 return nullptr;
7518 }
7519 Instruction *Op;
7520 if (match(I.getOperand(0), m_Instruction(Op)) &&
7521 match(I.getOperand(1), m_Zero()) &&
7522 Op->isLaunderOrStripInvariantGroup()) {
7523 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7524 Op->getOperand(0), I.getOperand(1));
7525 }
7526 return nullptr;
7527}
7528
7529/// This function folds patterns produced by lowering of reduce idioms, such as
7530/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7531/// attempts to generate fewer number of scalar comparisons instead of vector
7532/// comparisons when possible.
7534 InstCombiner::BuilderTy &Builder,
7535 const DataLayout &DL) {
7536 if (I.getType()->isVectorTy())
7537 return nullptr;
7538 CmpPredicate OuterPred, InnerPred;
7539 Value *LHS, *RHS;
7540
7541 // Match lowering of @llvm.vector.reduce.and. Turn
7542 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7543 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7544 /// %res = icmp <pred> i8 %scalar_ne, 0
7545 ///
7546 /// into
7547 ///
7548 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7549 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7550 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7551 ///
7552 /// for <pred> in {ne, eq}.
7553 if (!match(&I, m_ICmp(OuterPred,
7555 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7556 m_Zero())))
7557 return nullptr;
7558 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7559 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7560 return nullptr;
7561 unsigned NumBits =
7562 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7563 // TODO: Relax this to "not wider than max legal integer type"?
7564 if (!DL.isLegalInteger(NumBits))
7565 return nullptr;
7566
7567 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7568 auto *ScalarTy = Builder.getIntNTy(NumBits);
7569 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7570 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7571 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7572 I.getName());
7573 }
7574
7575 return nullptr;
7576}
7577
7578// This helper will be called with icmp operands in both orders.
7580 Value *Op0, Value *Op1,
7581 ICmpInst &CxtI) {
7582 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7583 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7584 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7585 return NI;
7586
7587 if (auto *SI = dyn_cast<SelectInst>(Op0))
7588 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7589 return NI;
7590
7591 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7592 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7593 return Res;
7594
7595 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7596 return Res;
7597 }
7598
7599 {
7600 Value *X;
7601 const APInt *C;
7602 // icmp X+Cst, X
7603 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7604 return foldICmpAddOpConst(X, *C, Pred);
7605 }
7606
7607 // abs(X) >= X --> true
7608 // abs(X) u<= X --> true
7609 // abs(X) < X --> false
7610 // abs(X) u> X --> false
7611 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7612 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7613 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7614 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7615 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7616 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7617 {
7618 Value *X;
7619 Constant *C;
7621 match(Op1, m_Specific(X))) {
7622 Value *NullValue = Constant::getNullValue(X->getType());
7623 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7624 const APInt SMin =
7625 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7626 bool IsIntMinPosion = C->isAllOnesValue();
7627 switch (Pred) {
7628 case CmpInst::ICMP_ULE:
7629 case CmpInst::ICMP_SGE:
7630 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7631 case CmpInst::ICMP_UGT:
7632 case CmpInst::ICMP_SLT:
7634 case CmpInst::ICMP_UGE:
7635 case CmpInst::ICMP_SLE:
7636 case CmpInst::ICMP_EQ: {
7637 return replaceInstUsesWith(
7638 CxtI, IsIntMinPosion
7639 ? Builder.CreateICmpSGT(X, AllOnesValue)
7640 : Builder.CreateICmpULT(
7641 X, ConstantInt::get(X->getType(), SMin + 1)));
7642 }
7643 case CmpInst::ICMP_ULT:
7644 case CmpInst::ICMP_SGT:
7645 case CmpInst::ICMP_NE: {
7646 return replaceInstUsesWith(
7647 CxtI, IsIntMinPosion
7648 ? Builder.CreateICmpSLT(X, NullValue)
7649 : Builder.CreateICmpUGT(
7650 X, ConstantInt::get(X->getType(), SMin)));
7651 }
7652 default:
7653 llvm_unreachable("Invalid predicate!");
7654 }
7655 }
7656 }
7657
7658 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7659 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7660 return replaceInstUsesWith(CxtI, V);
7661
7662 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7663 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7664 {
7665 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7666 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7668 }
7669
7670 if (!ICmpInst::isUnsigned(Pred) &&
7671 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7672 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7674 }
7675 }
7676
7677 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7678 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7679 {
7680 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7681 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7683 }
7684
7685 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7686 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7687 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7689 }
7690 }
7691
7692 return nullptr;
7693}
7694
7696 bool Changed = false;
7697 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7698 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7699 unsigned Op0Cplxity = getComplexity(Op0);
7700 unsigned Op1Cplxity = getComplexity(Op1);
7701
7702 /// Orders the operands of the compare so that they are listed from most
7703 /// complex to least complex. This puts constants before unary operators,
7704 /// before binary operators.
7705 if (Op0Cplxity < Op1Cplxity) {
7706 I.swapOperands();
7707 std::swap(Op0, Op1);
7708 Changed = true;
7709 }
7710
7711 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7712 return replaceInstUsesWith(I, V);
7713
7714 // Comparing -val or val with non-zero is the same as just comparing val
7715 // ie, abs(val) != 0 -> val != 0
7716 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7717 Value *Cond, *SelectTrue, *SelectFalse;
7718 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7719 m_Value(SelectFalse)))) {
7720 if (Value *V = dyn_castNegVal(SelectTrue)) {
7721 if (V == SelectFalse)
7722 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7723 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7724 if (V == SelectTrue)
7725 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7726 }
7727 }
7728 }
7729
7731 return Res;
7732
7733 if (Op0->getType()->isIntOrIntVectorTy(1))
7735 return Res;
7736
7738 return Res;
7739
7741 return Res;
7742
7744 return Res;
7745
7747 return Res;
7748
7750 return Res;
7751
7753 return Res;
7754
7756 return Res;
7757
7758 // Test if the ICmpInst instruction is used exclusively by a select as
7759 // part of a minimum or maximum operation. If so, refrain from doing
7760 // any other folding. This helps out other analyses which understand
7761 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7762 // and CodeGen. And in this case, at least one of the comparison
7763 // operands has at least one user besides the compare (the select),
7764 // which would often largely negate the benefit of folding anyway.
7765 //
7766 // Do the same for the other patterns recognized by matchSelectPattern.
7767 if (I.hasOneUse())
7768 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7769 Value *A, *B;
7771 if (SPR.Flavor != SPF_UNKNOWN)
7772 return nullptr;
7773 }
7774
7775 // Do this after checking for min/max to prevent infinite looping.
7776 if (Instruction *Res = foldICmpWithZero(I))
7777 return Res;
7778
7779 // FIXME: We only do this after checking for min/max to prevent infinite
7780 // looping caused by a reverse canonicalization of these patterns for min/max.
7781 // FIXME: The organization of folds is a mess. These would naturally go into
7782 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7783 // down here after the min/max restriction.
7784 ICmpInst::Predicate Pred = I.getPredicate();
7785 const APInt *C;
7786 if (match(Op1, m_APInt(C))) {
7787 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7788 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7789 Constant *Zero = Constant::getNullValue(Op0->getType());
7790 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7791 }
7792
7793 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7794 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7796 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7797 }
7798 }
7799
7800 // The folds in here may rely on wrapping flags and special constants, so
7801 // they can break up min/max idioms in some cases but not seemingly similar
7802 // patterns.
7803 // FIXME: It may be possible to enhance select folding to make this
7804 // unnecessary. It may also be moot if we canonicalize to min/max
7805 // intrinsics.
7806 if (Instruction *Res = foldICmpBinOp(I, Q))
7807 return Res;
7808
7810 return Res;
7811
7812 // Try to match comparison as a sign bit test. Intentionally do this after
7813 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7814 if (Instruction *New = foldSignBitTest(I))
7815 return New;
7816
7817 if (auto *PN = dyn_cast<PHINode>(Op0))
7818 if (Instruction *NV = foldOpIntoPhi(I, PN))
7819 return NV;
7820 if (auto *PN = dyn_cast<PHINode>(Op1))
7821 if (Instruction *NV = foldOpIntoPhi(I, PN))
7822 return NV;
7823
7825 return Res;
7826
7827 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7828 return Res;
7829 if (Instruction *Res =
7830 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7831 return Res;
7832
7833 if (I.isCommutative()) {
7834 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7835 replaceOperand(I, 0, Pair->first);
7836 replaceOperand(I, 1, Pair->second);
7837 return &I;
7838 }
7839 }
7840
7841 // In case of a comparison with two select instructions having the same
7842 // condition, check whether one of the resulting branches can be simplified.
7843 // If so, just compare the other branch and select the appropriate result.
7844 // For example:
7845 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7846 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7847 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7848 // The icmp will result false for the false value of selects and the result
7849 // will depend upon the comparison of true values of selects if %cmp is
7850 // true. Thus, transform this into:
7851 // %cmp = icmp slt i32 %y, %z
7852 // %sel = select i1 %cond, i1 %cmp, i1 false
7853 // This handles similar cases to transform.
7854 {
7855 Value *Cond, *A, *B, *C, *D;
7856 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7858 (Op0->hasOneUse() || Op1->hasOneUse())) {
7859 // Check whether comparison of TrueValues can be simplified
7860 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7861 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7862 return SelectInst::Create(
7863 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7865 }
7866 // Check whether comparison of FalseValues can be simplified
7867 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7868 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7869 return SelectInst::Create(
7870 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7872 }
7873 }
7874 }
7875
7876 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7877 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7878 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7879 {
7880 Value *A, *B;
7881 CmpPredicate CmpPred;
7882 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7884 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7885 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7886 bool I0NUW = I0->hasNoUnsignedWrap();
7887 bool I1NUW = I1->hasNoUnsignedWrap();
7888 bool I0NSW = I0->hasNoSignedWrap();
7889 bool I1NSW = I1->hasNoSignedWrap();
7890 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
7891 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
7892 (ICmpInst::isEquality(Pred) &&
7893 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
7894 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
7895 ConstantInt::get(Op0->getType(), 0));
7896 }
7897 }
7898 }
7899
7900 // Try to optimize equality comparisons against alloca-based pointers.
7901 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7902 assert(Op1->getType()->isPointerTy() &&
7903 "Comparing pointer with non-pointer?");
7904 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7905 if (foldAllocaCmp(Alloca))
7906 return nullptr;
7907 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7908 if (foldAllocaCmp(Alloca))
7909 return nullptr;
7910 }
7911
7912 if (Instruction *Res = foldICmpBitCast(I))
7913 return Res;
7914
7915 // TODO: Hoist this above the min/max bailout.
7917 return R;
7918
7919 {
7920 Value *X, *Y;
7921 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7922 // and (X & ~Y) != 0 --> (X & Y) == 0
7923 // if A is a power of 2.
7924 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7925 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
7926 I.isEquality())
7927 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7928 Op1);
7929
7930 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7931 if (Op0->getType()->isIntOrIntVectorTy()) {
7932 bool ConsumesOp0, ConsumesOp1;
7933 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7934 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7935 (ConsumesOp0 || ConsumesOp1)) {
7936 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7937 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7938 assert(InvOp0 && InvOp1 &&
7939 "Mismatch between isFreeToInvert and getFreelyInverted");
7940 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7941 }
7942 }
7943
7944 Instruction *AddI = nullptr;
7946 m_Instruction(AddI))) &&
7947 isa<IntegerType>(X->getType())) {
7948 Value *Result;
7949 Constant *Overflow;
7950 // m_UAddWithOverflow can match patterns that do not include an explicit
7951 // "add" instruction, so check the opcode of the matched op.
7952 if (AddI->getOpcode() == Instruction::Add &&
7953 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7954 Result, Overflow)) {
7955 replaceInstUsesWith(*AddI, Result);
7956 eraseInstFromFunction(*AddI);
7957 return replaceInstUsesWith(I, Overflow);
7958 }
7959 }
7960
7961 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7962 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7963 match(Op1, m_APInt(C))) {
7964 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7965 return R;
7966 }
7967
7968 // Signbit test folds
7969 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7970 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7971 Instruction *ExtI;
7972 if ((I.isUnsigned() || I.isEquality()) &&
7973 match(Op1,
7975 Y->getType()->getScalarSizeInBits() == 1 &&
7976 (Op0->hasOneUse() || Op1->hasOneUse())) {
7977 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7978 Instruction *ShiftI;
7979 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7981 OpWidth - 1))))) {
7982 unsigned ExtOpc = ExtI->getOpcode();
7983 unsigned ShiftOpc = ShiftI->getOpcode();
7984 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7985 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7986 Value *SLTZero =
7987 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
7988 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7989 return replaceInstUsesWith(I, Cmp);
7990 }
7991 }
7992 }
7993 }
7994
7995 if (Instruction *Res = foldICmpEquality(I))
7996 return Res;
7997
7999 return Res;
8000
8001 if (Instruction *Res = foldICmpOfUAddOv(I))
8002 return Res;
8003
8004 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8005 // an i1 which indicates whether or not we successfully did the swap.
8006 //
8007 // Replace comparisons between the old value and the expected value with the
8008 // indicator that 'cmpxchg' returns.
8009 //
8010 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8011 // spuriously fail. In those cases, the old value may equal the expected
8012 // value but it is possible for the swap to not occur.
8013 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8014 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8015 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8016 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8017 !ACXI->isWeak())
8018 return ExtractValueInst::Create(ACXI, 1);
8019
8021 return Res;
8022
8023 if (I.getType()->isVectorTy())
8024 if (Instruction *Res = foldVectorCmp(I, Builder))
8025 return Res;
8026
8028 return Res;
8029
8031 return Res;
8032
8033 {
8034 Value *A;
8035 const APInt *C1, *C2;
8036 ICmpInst::Predicate Pred = I.getPredicate();
8037 if (ICmpInst::isEquality(Pred)) {
8038 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8039 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8040 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8041 match(Op1, m_APInt(C2))) {
8042 Type *InputTy = A->getType();
8043 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8044 // c2 must be non-negative at the bitwidth of a.
8045 if (C2->getActiveBits() < InputBitWidth) {
8046 APInt TruncC1 = C1->trunc(InputBitWidth);
8047 // Check if there are 1s in C1 high bits of size InputBitWidth.
8048 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8049 TruncC1.setBit(InputBitWidth - 1);
8050 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8051 return new ICmpInst(
8052 Pred, AndInst,
8053 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8054 }
8055 }
8056 }
8057 }
8058
8059 return Changed ? &I : nullptr;
8060}
8061
8062/// Fold fcmp ([us]itofp x, cst) if possible.
8064 Instruction *LHSI,
8065 Constant *RHSC) {
8066 const APFloat *RHS;
8067 if (!match(RHSC, m_APFloat(RHS)))
8068 return nullptr;
8069
8070 // Get the width of the mantissa. We don't want to hack on conversions that
8071 // might lose information from the integer, e.g. "i64 -> float"
8072 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8073 if (MantissaWidth == -1)
8074 return nullptr; // Unknown.
8075
8076 Type *IntTy = LHSI->getOperand(0)->getType();
8077 unsigned IntWidth = IntTy->getScalarSizeInBits();
8078 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8079
8080 if (I.isEquality()) {
8081 FCmpInst::Predicate P = I.getPredicate();
8082 bool IsExact = false;
8083 APSInt RHSCvt(IntWidth, LHSUnsigned);
8084 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8085
8086 // If the floating point constant isn't an integer value, we know if we will
8087 // ever compare equal / not equal to it.
8088 if (!IsExact) {
8089 // TODO: Can never be -0.0 and other non-representable values
8090 APFloat RHSRoundInt(*RHS);
8092 if (*RHS != RHSRoundInt) {
8094 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8095
8097 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8098 }
8099 }
8100
8101 // TODO: If the constant is exactly representable, is it always OK to do
8102 // equality compares as integer?
8103 }
8104
8105 // Check to see that the input is converted from an integer type that is small
8106 // enough that preserves all bits. TODO: check here for "known" sign bits.
8107 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8108
8109 // Following test does NOT adjust IntWidth downwards for signed inputs,
8110 // because the most negative value still requires all the mantissa bits
8111 // to distinguish it from one less than that value.
8112 if ((int)IntWidth > MantissaWidth) {
8113 // Conversion would lose accuracy. Check if loss can impact comparison.
8114 int Exp = ilogb(*RHS);
8115 if (Exp == APFloat::IEK_Inf) {
8116 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8117 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8118 // Conversion could create infinity.
8119 return nullptr;
8120 } else {
8121 // Note that if RHS is zero or NaN, then Exp is negative
8122 // and first condition is trivially false.
8123 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8124 // Conversion could affect comparison.
8125 return nullptr;
8126 }
8127 }
8128
8129 // Otherwise, we can potentially simplify the comparison. We know that it
8130 // will always come through as an integer value and we know the constant is
8131 // not a NAN (it would have been previously simplified).
8132 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8133
8135 switch (I.getPredicate()) {
8136 default:
8137 llvm_unreachable("Unexpected predicate!");
8138 case FCmpInst::FCMP_UEQ:
8139 case FCmpInst::FCMP_OEQ:
8140 Pred = ICmpInst::ICMP_EQ;
8141 break;
8142 case FCmpInst::FCMP_UGT:
8143 case FCmpInst::FCMP_OGT:
8144 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8145 break;
8146 case FCmpInst::FCMP_UGE:
8147 case FCmpInst::FCMP_OGE:
8148 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8149 break;
8150 case FCmpInst::FCMP_ULT:
8151 case FCmpInst::FCMP_OLT:
8152 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8153 break;
8154 case FCmpInst::FCMP_ULE:
8155 case FCmpInst::FCMP_OLE:
8156 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8157 break;
8158 case FCmpInst::FCMP_UNE:
8159 case FCmpInst::FCMP_ONE:
8160 Pred = ICmpInst::ICMP_NE;
8161 break;
8162 case FCmpInst::FCMP_ORD:
8163 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8164 case FCmpInst::FCMP_UNO:
8165 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8166 }
8167
8168 // Now we know that the APFloat is a normal number, zero or inf.
8169
8170 // See if the FP constant is too large for the integer. For example,
8171 // comparing an i8 to 300.0.
8172 if (!LHSUnsigned) {
8173 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8174 // and large values.
8175 APFloat SMax(RHS->getSemantics());
8176 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8178 if (SMax < *RHS) { // smax < 13123.0
8179 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8180 Pred == ICmpInst::ICMP_SLE)
8181 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8182 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8183 }
8184 } else {
8185 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8186 // +INF and large values.
8187 APFloat UMax(RHS->getSemantics());
8188 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8190 if (UMax < *RHS) { // umax < 13123.0
8191 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8192 Pred == ICmpInst::ICMP_ULE)
8193 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8194 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8195 }
8196 }
8197
8198 if (!LHSUnsigned) {
8199 // See if the RHS value is < SignedMin.
8200 APFloat SMin(RHS->getSemantics());
8201 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8203 if (SMin > *RHS) { // smin > 12312.0
8204 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8205 Pred == ICmpInst::ICMP_SGE)
8206 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8207 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8208 }
8209 } else {
8210 // See if the RHS value is < UnsignedMin.
8211 APFloat UMin(RHS->getSemantics());
8212 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8214 if (UMin > *RHS) { // umin > 12312.0
8215 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8216 Pred == ICmpInst::ICMP_UGE)
8217 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8218 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8219 }
8220 }
8221
8222 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8223 // [0, UMAX], but it may still be fractional. Check whether this is the case
8224 // using the IsExact flag.
8225 // Don't do this for zero, because -0.0 is not fractional.
8226 APSInt RHSInt(IntWidth, LHSUnsigned);
8227 bool IsExact;
8228 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8229 if (!RHS->isZero()) {
8230 if (!IsExact) {
8231 // If we had a comparison against a fractional value, we have to adjust
8232 // the compare predicate and sometimes the value. RHSC is rounded towards
8233 // zero at this point.
8234 switch (Pred) {
8235 default:
8236 llvm_unreachable("Unexpected integer comparison!");
8237 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8238 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8239 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8240 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8241 case ICmpInst::ICMP_ULE:
8242 // (float)int <= 4.4 --> int <= 4
8243 // (float)int <= -4.4 --> false
8244 if (RHS->isNegative())
8245 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8246 break;
8247 case ICmpInst::ICMP_SLE:
8248 // (float)int <= 4.4 --> int <= 4
8249 // (float)int <= -4.4 --> int < -4
8250 if (RHS->isNegative())
8251 Pred = ICmpInst::ICMP_SLT;
8252 break;
8253 case ICmpInst::ICMP_ULT:
8254 // (float)int < -4.4 --> false
8255 // (float)int < 4.4 --> int <= 4
8256 if (RHS->isNegative())
8257 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8258 Pred = ICmpInst::ICMP_ULE;
8259 break;
8260 case ICmpInst::ICMP_SLT:
8261 // (float)int < -4.4 --> int < -4
8262 // (float)int < 4.4 --> int <= 4
8263 if (!RHS->isNegative())
8264 Pred = ICmpInst::ICMP_SLE;
8265 break;
8266 case ICmpInst::ICMP_UGT:
8267 // (float)int > 4.4 --> int > 4
8268 // (float)int > -4.4 --> true
8269 if (RHS->isNegative())
8270 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8271 break;
8272 case ICmpInst::ICMP_SGT:
8273 // (float)int > 4.4 --> int > 4
8274 // (float)int > -4.4 --> int >= -4
8275 if (RHS->isNegative())
8276 Pred = ICmpInst::ICMP_SGE;
8277 break;
8278 case ICmpInst::ICMP_UGE:
8279 // (float)int >= -4.4 --> true
8280 // (float)int >= 4.4 --> int > 4
8281 if (RHS->isNegative())
8282 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8283 Pred = ICmpInst::ICMP_UGT;
8284 break;
8285 case ICmpInst::ICMP_SGE:
8286 // (float)int >= -4.4 --> int >= -4
8287 // (float)int >= 4.4 --> int > 4
8288 if (!RHS->isNegative())
8289 Pred = ICmpInst::ICMP_SGT;
8290 break;
8291 }
8292 }
8293 }
8294
8295 // Lower this FP comparison into an appropriate integer version of the
8296 // comparison.
8297 return new ICmpInst(Pred, LHSI->getOperand(0),
8298 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8299}
8300
8301/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8303 Constant *RHSC) {
8304 // When C is not 0.0 and infinities are not allowed:
8305 // (C / X) < 0.0 is a sign-bit test of X
8306 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8307 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8308 //
8309 // Proof:
8310 // Multiply (C / X) < 0.0 by X * X / C.
8311 // - X is non zero, if it is the flag 'ninf' is violated.
8312 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8313 // the predicate. C is also non zero by definition.
8314 //
8315 // Thus X * X / C is non zero and the transformation is valid. [qed]
8316
8317 FCmpInst::Predicate Pred = I.getPredicate();
8318
8319 // Check that predicates are valid.
8320 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8321 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8322 return nullptr;
8323
8324 // Check that RHS operand is zero.
8325 if (!match(RHSC, m_AnyZeroFP()))
8326 return nullptr;
8327
8328 // Check fastmath flags ('ninf').
8329 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8330 return nullptr;
8331
8332 // Check the properties of the dividend. It must not be zero to avoid a
8333 // division by zero (see Proof).
8334 const APFloat *C;
8335 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8336 return nullptr;
8337
8338 if (C->isZero())
8339 return nullptr;
8340
8341 // Get swapped predicate if necessary.
8342 if (C->isNegative())
8343 Pred = I.getSwappedPredicate();
8344
8345 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8346}
8347
8348// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8349// Patterns include:
8350// fptrunc(x) < C --> x < ext(C)
8351// fptrunc(x) <= C --> x <= ext(C)
8352// fptrunc(x) > C --> x > ext(C)
8353// fptrunc(x) >= C --> x >= ext(C)
8354// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8355// due to precision loss.
8357 const Constant &C) {
8358 FCmpInst::Predicate Pred = I.getPredicate();
8359 bool RoundDown = false;
8360
8361 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8362 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8363 RoundDown = true;
8364 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8365 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8366 RoundDown = false;
8367 else
8368 return nullptr;
8369
8370 const APFloat *CValue;
8371 if (!match(&C, m_APFloat(CValue)))
8372 return nullptr;
8373
8374 if (CValue->isNaN() || CValue->isInfinity())
8375 return nullptr;
8376
8377 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8378 bool LosesInfo;
8379 APFloat Dest = Src;
8380 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8381 return Dest;
8382 };
8383
8384 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8385 APFloat NextValue = Value;
8386 NextValue.next(RoundDown);
8387 return NextValue;
8388 };
8389
8390 APFloat NextCValue = NextValue(*CValue, RoundDown);
8391
8392 Type *DestType = FPTrunc.getOperand(0)->getType();
8393 const fltSemantics &DestFltSema =
8394 DestType->getScalarType()->getFltSemantics();
8395
8396 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8397 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8398
8399 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8400 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8401 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8402 // value of 'CValue'.
8403 if (NextCValue.isInfinity()) {
8404 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8405 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8406
8407 ExtNextCValue = ExtCValue + Bias;
8408 }
8409
8410 APFloat ExtMidValue =
8411 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8412
8413 const fltSemantics &SrcFltSema =
8414 C.getType()->getScalarType()->getFltSemantics();
8415
8416 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8417 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8418 if (MidValue != *CValue)
8419 ExtMidValue.next(!RoundDown);
8420
8421 // Check whether 'ExtMidValue' is a valid result since the assumption on
8422 // imaged 'NextCValue' might not hold for new float types.
8423 // ppc_fp128 can't pass here when converting from max float because of
8424 // APFloat implementation.
8425 if (NextCValue.isInfinity()) {
8426 // ExtMidValue --- narrowed ---> Finite
8427 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8428 return nullptr;
8429
8430 // NextExtMidValue --- narrowed ---> Infinity
8431 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8432 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8433 return nullptr;
8434 }
8435
8436 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8437 ConstantFP::get(DestType, ExtMidValue), "", &I);
8438}
8439
8440/// Optimize fabs(X) compared with zero.
8442 Value *X;
8443 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8444 return nullptr;
8445
8446 const APFloat *C;
8447 if (!match(I.getOperand(1), m_APFloat(C)))
8448 return nullptr;
8449
8450 if (!C->isPosZero()) {
8451 if (!C->isSmallestNormalized())
8452 return nullptr;
8453
8454 const Function *F = I.getFunction();
8455 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8456 if (Mode.Input == DenormalMode::PreserveSign ||
8458
8459 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8460 Constant *Zero = ConstantFP::getZero(X->getType());
8461 return new FCmpInst(P, X, Zero, "", I);
8462 };
8463
8464 switch (I.getPredicate()) {
8465 case FCmpInst::FCMP_OLT:
8466 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8467 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8468 case FCmpInst::FCMP_UGE:
8469 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8470 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8471 case FCmpInst::FCMP_OGE:
8472 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8473 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8474 case FCmpInst::FCMP_ULT:
8475 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8476 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8477 default:
8478 break;
8479 }
8480 }
8481
8482 return nullptr;
8483 }
8484
8485 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8486 I->setPredicate(P);
8487 return IC.replaceOperand(*I, 0, X);
8488 };
8489
8490 switch (I.getPredicate()) {
8491 case FCmpInst::FCMP_UGE:
8492 case FCmpInst::FCMP_OLT:
8493 // fabs(X) >= 0.0 --> true
8494 // fabs(X) < 0.0 --> false
8495 llvm_unreachable("fcmp should have simplified");
8496
8497 case FCmpInst::FCMP_OGT:
8498 // fabs(X) > 0.0 --> X != 0.0
8499 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8500
8501 case FCmpInst::FCMP_UGT:
8502 // fabs(X) u> 0.0 --> X u!= 0.0
8503 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8504
8505 case FCmpInst::FCMP_OLE:
8506 // fabs(X) <= 0.0 --> X == 0.0
8507 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8508
8509 case FCmpInst::FCMP_ULE:
8510 // fabs(X) u<= 0.0 --> X u== 0.0
8511 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8512
8513 case FCmpInst::FCMP_OGE:
8514 // fabs(X) >= 0.0 --> !isnan(X)
8515 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8516 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8517
8518 case FCmpInst::FCMP_ULT:
8519 // fabs(X) u< 0.0 --> isnan(X)
8520 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8521 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8522
8523 case FCmpInst::FCMP_OEQ:
8524 case FCmpInst::FCMP_UEQ:
8525 case FCmpInst::FCMP_ONE:
8526 case FCmpInst::FCMP_UNE:
8527 case FCmpInst::FCMP_ORD:
8528 case FCmpInst::FCMP_UNO:
8529 // Look through the fabs() because it doesn't change anything but the sign.
8530 // fabs(X) == 0.0 --> X == 0.0,
8531 // fabs(X) != 0.0 --> X != 0.0
8532 // isnan(fabs(X)) --> isnan(X)
8533 // !isnan(fabs(X) --> !isnan(X)
8534 return replacePredAndOp0(&I, I.getPredicate(), X);
8535
8536 default:
8537 return nullptr;
8538 }
8539}
8540
8541/// Optimize sqrt(X) compared with zero.
8543 Value *X;
8544 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8545 return nullptr;
8546
8547 if (!match(I.getOperand(1), m_PosZeroFP()))
8548 return nullptr;
8549
8550 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8551 I.setPredicate(P);
8552 return IC.replaceOperand(I, 0, X);
8553 };
8554
8555 // Clear ninf flag if sqrt doesn't have it.
8556 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8557 I.setHasNoInfs(false);
8558
8559 switch (I.getPredicate()) {
8560 case FCmpInst::FCMP_OLT:
8561 case FCmpInst::FCMP_UGE:
8562 // sqrt(X) < 0.0 --> false
8563 // sqrt(X) u>= 0.0 --> true
8564 llvm_unreachable("fcmp should have simplified");
8565 case FCmpInst::FCMP_ULT:
8566 case FCmpInst::FCMP_ULE:
8567 case FCmpInst::FCMP_OGT:
8568 case FCmpInst::FCMP_OGE:
8569 case FCmpInst::FCMP_OEQ:
8570 case FCmpInst::FCMP_UNE:
8571 // sqrt(X) u< 0.0 --> X u< 0.0
8572 // sqrt(X) u<= 0.0 --> X u<= 0.0
8573 // sqrt(X) > 0.0 --> X > 0.0
8574 // sqrt(X) >= 0.0 --> X >= 0.0
8575 // sqrt(X) == 0.0 --> X == 0.0
8576 // sqrt(X) u!= 0.0 --> X u!= 0.0
8577 return IC.replaceOperand(I, 0, X);
8578
8579 case FCmpInst::FCMP_OLE:
8580 // sqrt(X) <= 0.0 --> X == 0.0
8581 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8582 case FCmpInst::FCMP_UGT:
8583 // sqrt(X) u> 0.0 --> X u!= 0.0
8584 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8585 case FCmpInst::FCMP_UEQ:
8586 // sqrt(X) u== 0.0 --> X u<= 0.0
8587 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8588 case FCmpInst::FCMP_ONE:
8589 // sqrt(X) != 0.0 --> X > 0.0
8590 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8591 case FCmpInst::FCMP_ORD:
8592 // !isnan(sqrt(X)) --> X >= 0.0
8593 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8594 case FCmpInst::FCMP_UNO:
8595 // isnan(sqrt(X)) --> X u< 0.0
8596 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8597 default:
8598 llvm_unreachable("Unexpected predicate!");
8599 }
8600}
8601
8603 CmpInst::Predicate Pred = I.getPredicate();
8604 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8605
8606 // Canonicalize fneg as Op1.
8607 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8608 std::swap(Op0, Op1);
8609 Pred = I.getSwappedPredicate();
8610 }
8611
8612 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8613 return nullptr;
8614
8615 // Replace the negated operand with 0.0:
8616 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8617 Constant *Zero = ConstantFP::getZero(Op0->getType());
8618 return new FCmpInst(Pred, Op0, Zero, "", &I);
8619}
8620
8622 Constant *RHSC, InstCombinerImpl &CI) {
8623 const CmpInst::Predicate Pred = I.getPredicate();
8624 Value *X = LHSI->getOperand(0);
8625 Value *Y = LHSI->getOperand(1);
8626 switch (Pred) {
8627 default:
8628 break;
8629 case FCmpInst::FCMP_UGT:
8630 case FCmpInst::FCMP_ULT:
8631 case FCmpInst::FCMP_UNE:
8632 case FCmpInst::FCMP_OEQ:
8633 case FCmpInst::FCMP_OGE:
8634 case FCmpInst::FCMP_OLE:
8635 // The optimization is not valid if X and Y are infinities of the same
8636 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8637 // flag then we can assume we do not have that case. Otherwise we might be
8638 // able to prove that either X or Y is not infinity.
8639 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8643 break;
8644
8645 [[fallthrough]];
8646 case FCmpInst::FCMP_OGT:
8647 case FCmpInst::FCMP_OLT:
8648 case FCmpInst::FCMP_ONE:
8649 case FCmpInst::FCMP_UEQ:
8650 case FCmpInst::FCMP_UGE:
8651 case FCmpInst::FCMP_ULE:
8652 // fcmp pred (x - y), 0 --> fcmp pred x, y
8653 if (match(RHSC, m_AnyZeroFP()) &&
8654 I.getFunction()->getDenormalMode(
8655 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8657 CI.replaceOperand(I, 0, X);
8658 CI.replaceOperand(I, 1, Y);
8659 I.setHasNoInfs(LHSI->hasNoInfs());
8660 if (LHSI->hasNoNaNs())
8661 I.setHasNoNaNs(true);
8662 return &I;
8663 }
8664 break;
8665 }
8666
8667 return nullptr;
8668}
8669
8671 InstCombinerImpl &IC) {
8672 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8673 Type *OpType = LHS->getType();
8674 CmpInst::Predicate Pred = I.getPredicate();
8675
8678
8679 if (!FloorX && !CeilX) {
8682 std::swap(LHS, RHS);
8683 Pred = I.getSwappedPredicate();
8684 }
8685 }
8686
8687 switch (Pred) {
8688 case FCmpInst::FCMP_OLE:
8689 // fcmp ole floor(x), x => fcmp ord x, 0
8690 if (FloorX)
8692 "", &I);
8693 break;
8694 case FCmpInst::FCMP_OGT:
8695 // fcmp ogt floor(x), x => false
8696 if (FloorX)
8697 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8698 break;
8699 case FCmpInst::FCMP_OGE:
8700 // fcmp oge ceil(x), x => fcmp ord x, 0
8701 if (CeilX)
8703 "", &I);
8704 break;
8705 case FCmpInst::FCMP_OLT:
8706 // fcmp olt ceil(x), x => false
8707 if (CeilX)
8708 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8709 break;
8710 case FCmpInst::FCMP_ULE:
8711 // fcmp ule floor(x), x => true
8712 if (FloorX)
8713 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8714 break;
8715 case FCmpInst::FCMP_UGT:
8716 // fcmp ugt floor(x), x => fcmp uno x, 0
8717 if (FloorX)
8719 "", &I);
8720 break;
8721 case FCmpInst::FCMP_UGE:
8722 // fcmp uge ceil(x), x => true
8723 if (CeilX)
8724 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8725 break;
8726 case FCmpInst::FCMP_ULT:
8727 // fcmp ult ceil(x), x => fcmp uno x, 0
8728 if (CeilX)
8730 "", &I);
8731 break;
8732 default:
8733 break;
8734 }
8735
8736 return nullptr;
8737}
8738
8739/// Returns true if a select that implements a min/max is redundant and
8740/// select result can be replaced with its non-constant operand, e.g.,
8741/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
8742/// where C is the FP constant equal to the minimum integer value
8743/// representable by A.
8745 Value *B) {
8746 const APFloat *APF;
8747 if (!match(B, m_APFloat(APF)))
8748 return false;
8749
8750 auto *I = dyn_cast<Instruction>(A);
8751 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
8752 I->getOpcode() == Instruction::UIToFP))
8753 return false;
8754
8755 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
8756 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
8757 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
8758 ? APSInt::getMinValue(BitWidth, IsUnsigned)
8759 : APSInt::getMaxValue(BitWidth, IsUnsigned);
8760 APSInt ConvertedInt(BitWidth, IsUnsigned);
8761 bool IsExact;
8763 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
8764 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
8765}
8766
8768 bool Changed = false;
8769
8770 /// Orders the operands of the compare so that they are listed from most
8771 /// complex to least complex. This puts constants before unary operators,
8772 /// before binary operators.
8773 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8774 I.swapOperands();
8775 Changed = true;
8776 }
8777
8778 const CmpInst::Predicate Pred = I.getPredicate();
8779 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8780 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8781 SQ.getWithInstruction(&I)))
8782 return replaceInstUsesWith(I, V);
8783
8784 // Simplify 'fcmp pred X, X'
8785 Type *OpType = Op0->getType();
8786 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8787 if (Op0 == Op1) {
8788 switch (Pred) {
8789 default:
8790 break;
8791 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
8792 case FCmpInst::FCMP_ULT: // True if unordered or less than
8793 case FCmpInst::FCMP_UGT: // True if unordered or greater than
8794 case FCmpInst::FCMP_UNE: // True if unordered or not equal
8795 // Canonicalize these to be 'fcmp uno %X, 0.0'.
8796 I.setPredicate(FCmpInst::FCMP_UNO);
8797 I.setOperand(1, Constant::getNullValue(OpType));
8798 return &I;
8799
8800 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
8801 case FCmpInst::FCMP_OEQ: // True if ordered and equal
8802 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
8803 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
8804 // Canonicalize these to be 'fcmp ord %X, 0.0'.
8805 I.setPredicate(FCmpInst::FCMP_ORD);
8806 I.setOperand(1, Constant::getNullValue(OpType));
8807 return &I;
8808 }
8809 }
8810
8811 if (I.isCommutative()) {
8812 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8813 replaceOperand(I, 0, Pair->first);
8814 replaceOperand(I, 1, Pair->second);
8815 return &I;
8816 }
8817 }
8818
8819 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
8820 // then canonicalize the operand to 0.0.
8821 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
8822 if (!match(Op0, m_PosZeroFP()) &&
8823 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
8824 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
8825
8826 if (!match(Op1, m_PosZeroFP()) &&
8827 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
8828 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8829 }
8830
8831 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
8832 Value *X, *Y;
8833 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
8834 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
8835
8837 return R;
8838
8839 // Test if the FCmpInst instruction is used exclusively by a select as
8840 // part of a minimum or maximum operation. If so, refrain from doing
8841 // any other folding. This helps out other analyses which understand
8842 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
8843 // and CodeGen. And in this case, at least one of the comparison
8844 // operands has at least one user besides the compare (the select),
8845 // which would often largely negate the benefit of folding anyway.
8846 if (I.hasOneUse())
8847 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
8848 Value *A, *B;
8850 bool IsRedundantMinMaxClamp =
8851 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
8853 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
8854 return nullptr;
8855 }
8856
8857 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
8858 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
8859 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
8860 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8861
8862 // Canonicalize:
8863 // fcmp olt X, +inf -> fcmp one X, +inf
8864 // fcmp ole X, +inf -> fcmp ord X, 0
8865 // fcmp ogt X, +inf -> false
8866 // fcmp oge X, +inf -> fcmp oeq X, +inf
8867 // fcmp ult X, +inf -> fcmp une X, +inf
8868 // fcmp ule X, +inf -> true
8869 // fcmp ugt X, +inf -> fcmp uno X, 0
8870 // fcmp uge X, +inf -> fcmp ueq X, +inf
8871 // fcmp olt X, -inf -> false
8872 // fcmp ole X, -inf -> fcmp oeq X, -inf
8873 // fcmp ogt X, -inf -> fcmp one X, -inf
8874 // fcmp oge X, -inf -> fcmp ord X, 0
8875 // fcmp ult X, -inf -> fcmp uno X, 0
8876 // fcmp ule X, -inf -> fcmp ueq X, -inf
8877 // fcmp ugt X, -inf -> fcmp une X, -inf
8878 // fcmp uge X, -inf -> true
8879 const APFloat *C;
8880 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8881 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8882 default:
8883 break;
8884 case FCmpInst::FCMP_ORD:
8885 case FCmpInst::FCMP_UNO:
8888 case FCmpInst::FCMP_OGT:
8889 case FCmpInst::FCMP_ULE:
8890 llvm_unreachable("Should be simplified by InstSimplify");
8891 case FCmpInst::FCMP_OLT:
8892 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8893 case FCmpInst::FCMP_OLE:
8894 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8895 "", &I);
8896 case FCmpInst::FCMP_OGE:
8897 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8898 case FCmpInst::FCMP_ULT:
8899 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8900 case FCmpInst::FCMP_UGT:
8901 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8902 "", &I);
8903 case FCmpInst::FCMP_UGE:
8904 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8905 }
8906 }
8907
8908 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8909 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8910 if (match(Op1, m_PosZeroFP()) &&
8913 if (Pred == FCmpInst::FCMP_OEQ)
8914 IntPred = ICmpInst::ICMP_EQ;
8915 else if (Pred == FCmpInst::FCMP_UNE)
8916 IntPred = ICmpInst::ICMP_NE;
8917
8918 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8919 Type *IntTy = X->getType();
8920 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8921 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8922 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8923 }
8924 }
8925
8926 // Handle fcmp with instruction LHS and constant RHS.
8927 Instruction *LHSI;
8928 Constant *RHSC;
8929 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8930 switch (LHSI->getOpcode()) {
8931 case Instruction::Select:
8932 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8933 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8935 return replaceOperand(I, 0, X);
8937 return NV;
8938 break;
8939 case Instruction::FSub:
8940 if (LHSI->hasOneUse())
8941 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
8942 return NV;
8943 break;
8944 case Instruction::PHI:
8945 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8946 return NV;
8947 break;
8948 case Instruction::SIToFP:
8949 case Instruction::UIToFP:
8950 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8951 return NV;
8952 break;
8953 case Instruction::FDiv:
8954 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8955 return NV;
8956 break;
8957 case Instruction::Load:
8958 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8959 if (Instruction *Res =
8961 return Res;
8962 break;
8963 case Instruction::FPTrunc:
8964 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
8965 return NV;
8966 break;
8967 }
8968 }
8969
8970 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8971 return R;
8972
8973 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
8974 return R;
8975
8976 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
8977 return R;
8978
8979 if (match(Op0, m_FNeg(m_Value(X)))) {
8980 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8981 Constant *C;
8982 if (match(Op1, m_Constant(C)))
8983 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8984 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8985 }
8986
8987 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8988 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8989 return new FCmpInst(Pred, X, Op1, "", &I);
8990
8991 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8992 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8993 return new FCmpInst(Pred, Op0, Y, "", &I);
8994
8995 if (match(Op0, m_FPExt(m_Value(X)))) {
8996 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8997 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8998 return new FCmpInst(Pred, X, Y, "", &I);
8999
9000 const APFloat *C;
9001 if (match(Op1, m_APFloat(C))) {
9002 const fltSemantics &FPSem =
9003 X->getType()->getScalarType()->getFltSemantics();
9004 bool Lossy;
9005 APFloat TruncC = *C;
9006 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
9007
9008 if (Lossy) {
9009 // X can't possibly equal the higher-precision constant, so reduce any
9010 // equality comparison.
9011 // TODO: Other predicates can be handled via getFCmpCode().
9012 switch (Pred) {
9013 case FCmpInst::FCMP_OEQ:
9014 // X is ordered and equal to an impossible constant --> false
9015 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9016 case FCmpInst::FCMP_ONE:
9017 // X is ordered and not equal to an impossible constant --> ordered
9018 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9019 ConstantFP::getZero(X->getType()));
9020 case FCmpInst::FCMP_UEQ:
9021 // X is unordered or equal to an impossible constant --> unordered
9022 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9023 ConstantFP::getZero(X->getType()));
9024 case FCmpInst::FCMP_UNE:
9025 // X is unordered or not equal to an impossible constant --> true
9026 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9027 default:
9028 break;
9029 }
9030 }
9031
9032 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9033 // Avoid lossy conversions and denormals.
9034 // Zero is a special case that's OK to convert.
9035 APFloat Fabs = TruncC;
9036 Fabs.clearSign();
9037 if (!Lossy &&
9038 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9039 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9040 return new FCmpInst(Pred, X, NewC, "", &I);
9041 }
9042 }
9043 }
9044
9045 // Convert a sign-bit test of an FP value into a cast and integer compare.
9046 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9047 // TODO: Handle non-zero compare constants.
9048 // TODO: Handle other predicates.
9050 m_Value(X)))) &&
9051 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9052 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9053 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9054 IntType = VectorType::get(IntType, VecTy->getElementCount());
9055
9056 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9057 if (Pred == FCmpInst::FCMP_OLT) {
9058 Value *IntX = Builder.CreateBitCast(X, IntType);
9059 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9060 ConstantInt::getNullValue(IntType));
9061 }
9062 }
9063
9064 {
9065 Value *CanonLHS = nullptr;
9067 // (canonicalize(x) == x) => (x == x)
9068 if (CanonLHS == Op1)
9069 return new FCmpInst(Pred, Op1, Op1, "", &I);
9070
9071 Value *CanonRHS = nullptr;
9073 // (x == canonicalize(x)) => (x == x)
9074 if (CanonRHS == Op0)
9075 return new FCmpInst(Pred, Op0, Op0, "", &I);
9076
9077 // (canonicalize(x) == canonicalize(y)) => (x == y)
9078 if (CanonLHS && CanonRHS)
9079 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9080 }
9081
9082 if (I.getType()->isVectorTy())
9083 if (Instruction *Res = foldVectorCmp(I, Builder))
9084 return Res;
9085
9086 return Changed ? &I : nullptr;
9087}
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
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 * 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 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")))
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 TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5975
void clearSign()
Definition APFloat.h:1361
bool isNaN() const
Definition APFloat.h:1510
bool isZero() const
Definition APFloat.h:1508
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1221
APInt bitcastToAPInt() const
Definition APFloat.h:1416
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1201
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1395
opStatus next(bool nextDown)
Definition APFloat.h:1317
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1161
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5904
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1311
bool isInfinity() const
Definition APFloat.h:1509
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1769
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1023
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1549
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1521
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1339
APInt abs() const
Get the absolute value.
Definition APInt.h:1804
unsigned ceilLogBase2() const
Definition APInt.h:1773
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1202
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1959
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1183
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1497
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1112
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1939
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1080
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1655
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1946
void negate()
Negate this APInt in place.
Definition APInt.h:1477
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1648
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1607
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1461
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1624
unsigned logBase2() const
Definition APInt.h:1770
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:828
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1151
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:874
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1238
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1952
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:852
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1665
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1222
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:312
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:304
an instruction to allocate memory on the stack
ArrayRef - 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 if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
BinaryOps getOpcode() const
Definition InstrTypes.h:374
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.
Conditional or Unconditional Branch instruction.
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:664
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:982
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:858
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:676
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:679
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:693
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:682
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:691
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:680
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:681
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:690
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:684
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:687
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:688
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:683
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:704
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:692
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:689
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:678
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:686
bool isSigned() const
Definition InstrTypes.h:930
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:942
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:871
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:789
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:776
bool isUnsigned() const
Definition InstrTypes.h:936
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.
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 Constant * 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...
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
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.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
iterator end()
Definition DenseMap.h:81
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:169
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 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:430
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:82
Value * getPointerOperand()
Definition Operator.h:457
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:425
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:504
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:1555
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2412
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1577
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:538
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2776
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 * 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
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
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.
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
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
BuilderTy & Builder
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:318
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:252
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
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:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:165
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
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:128
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:235
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:256
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:259
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:158
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:708
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:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:403
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:2774
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:2792
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
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)
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)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
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)
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)
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
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)
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.
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we 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.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
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_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
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)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< 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.
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.
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
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.
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
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)
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || 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.
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
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:829
@ 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.
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:1737
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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI Value * 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:632
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:1597
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
LLVM_ABI 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:331
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:236
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:893
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:1606
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:1751
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:394
@ 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()).
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:2009
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...
cl::opt< bool > ProfcheckDisableMetadataFixes("profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false), cl::desc("Disable metadata propagation fixes discovered through Issue #147390"))
Definition Metadata.cpp:64
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:2156
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:22
LLVM_ABI 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.
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#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:108
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:255
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:287
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:154
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:302
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
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:261
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:132
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:114
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:299
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:138
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:60
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:203
GEPNoWrapFlags Flags
Definition Loads.h:208
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:276
Capture information for a specific Use.