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"
29#include "llvm/IR/Instruction.h"
35#include <bitset>
36
37using namespace llvm;
38using namespace PatternMatch;
39
40#define DEBUG_TYPE "instcombine"
41
42// How many times is a select replaced by one of its operands?
43STATISTIC(NumSel, "Number of select opts");
44
45namespace llvm {
47}
48
49/// Compute Result = In1+In2, returning true if the result overflowed for this
50/// type.
51static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
52 bool IsSigned = false) {
53 bool Overflow;
54 if (IsSigned)
55 Result = In1.sadd_ov(In2, Overflow);
56 else
57 Result = In1.uadd_ov(In2, Overflow);
58
59 return Overflow;
60}
61
62/// Compute Result = In1-In2, returning true if the result overflowed for this
63/// type.
64static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
65 bool IsSigned = false) {
66 bool Overflow;
67 if (IsSigned)
68 Result = In1.ssub_ov(In2, Overflow);
69 else
70 Result = In1.usub_ov(In2, Overflow);
71
72 return Overflow;
73}
74
75/// Given an icmp instruction, return true if any use of this comparison is a
76/// branch on sign bit comparison.
77static bool hasBranchUse(ICmpInst &I) {
78 for (auto *U : I.users())
79 if (isa<CondBrInst>(U))
80 return true;
81 return false;
82}
83
84/// Returns true if the exploded icmp can be expressed as a signed comparison
85/// to zero and updates the predicate accordingly.
86/// The signedness of the comparison is preserved.
87/// TODO: Refactor with decomposeBitTestICmp()?
88static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
89 if (!ICmpInst::isSigned(Pred))
90 return false;
91
92 if (C.isZero())
93 return ICmpInst::isRelational(Pred);
94
95 if (C.isOne()) {
96 if (Pred == ICmpInst::ICMP_SLT) {
97 Pred = ICmpInst::ICMP_SLE;
98 return true;
99 }
100 } else if (C.isAllOnes()) {
101 if (Pred == ICmpInst::ICMP_SGT) {
102 Pred = ICmpInst::ICMP_SGE;
103 return true;
104 }
105 }
106
107 return false;
108}
109
110/// This is called when we see this pattern:
111/// cmp pred (load (gep GV, ...)), cmpcst
112/// where GV is a global variable with a constant initializer. Try to simplify
113/// this into some simple computation that does not need the load. For example
114/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
115///
116/// If AndCst is non-null, then the loaded value is masked with that constant
117/// before doing the comparison. This handles cases like "A[i]&4 == 0".
119 LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst) {
121 if (LI->isVolatile() || !GV || !GV->isConstant() ||
122 !GV->hasDefinitiveInitializer())
123 return nullptr;
124
125 Type *EltTy = LI->getType();
126 TypeSize EltSize = DL.getTypeStoreSize(EltTy);
127 if (EltSize.isScalable())
128 return nullptr;
129
131 if (!Expr.Index || Expr.BasePtr != GV || Expr.Offset.getBitWidth() > 64)
132 return nullptr;
133
134 Constant *Init = GV->getInitializer();
135 TypeSize GlobalSize = DL.getTypeAllocSize(Init->getType());
136
137 Value *Idx = Expr.Index;
138 const APInt &Stride = Expr.Scale;
139 const APInt &ConstOffset = Expr.Offset;
140
141 // Allow an additional context offset, but only within the stride.
142 if (!ConstOffset.ult(Stride))
143 return nullptr;
144
145 // Don't handle overlapping loads for now.
146 if (!Stride.uge(EltSize.getFixedValue()))
147 return nullptr;
148
149 // Don't blow up on huge arrays.
150 uint64_t ArrayElementCount =
151 divideCeil((GlobalSize.getFixedValue() - ConstOffset.getZExtValue()),
152 Stride.getZExtValue());
153 if (ArrayElementCount > MaxArraySizeForCombine)
154 return nullptr;
155
156 enum { Overdefined = -3, Undefined = -2 };
157
158 // Variables for our state machines.
159
160 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
161 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
162 // and 87 is the second (and last) index. FirstTrueElement is -2 when
163 // undefined, otherwise set to the first true element. SecondTrueElement is
164 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
165 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
166
167 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
168 // form "i != 47 & i != 87". Same state transitions as for true elements.
169 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
170
171 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
172 /// define a state machine that triggers for ranges of values that the index
173 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
174 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
175 /// index in the range (inclusive). We use -2 for undefined here because we
176 /// use relative comparisons and don't want 0-1 to match -1.
177 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
178
179 // MagicBitvector - This is a magic bitvector where we set a bit if the
180 // comparison is true for element 'i'. If there are 64 elements or less in
181 // the array, this will fully represent all the comparison results.
182 uint64_t MagicBitvector = 0;
183
184 // Scan the array and see if one of our patterns matches.
185 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
186 APInt Offset = ConstOffset;
187 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i, Offset += Stride) {
189 if (!Elt)
190 return nullptr;
191
192 // If the element is masked, handle it.
193 if (AndCst) {
194 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
195 if (!Elt)
196 return nullptr;
197 }
198
199 // Find out if the comparison would be true or false for the i'th element.
201 CompareRHS, DL, &TLI);
202 if (!C)
203 return nullptr;
204
205 // If the result is undef for this element, ignore it.
206 if (isa<UndefValue>(C)) {
207 // Extend range state machines to cover this element in case there is an
208 // undef in the middle of the range.
209 if (TrueRangeEnd == (int)i - 1)
210 TrueRangeEnd = i;
211 if (FalseRangeEnd == (int)i - 1)
212 FalseRangeEnd = i;
213 continue;
214 }
215
216 // If we can't compute the result for any of the elements, we have to give
217 // up evaluating the entire conditional.
218 if (!isa<ConstantInt>(C))
219 return nullptr;
220
221 // Otherwise, we know if the comparison is true or false for this element,
222 // update our state machines.
223 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
224
225 // State machine for single/double/range index comparison.
226 if (IsTrueForElt) {
227 // Update the TrueElement state machine.
228 if (FirstTrueElement == Undefined)
229 FirstTrueElement = TrueRangeEnd = i; // First true element.
230 else {
231 // Update double-compare state machine.
232 if (SecondTrueElement == Undefined)
233 SecondTrueElement = i;
234 else
235 SecondTrueElement = Overdefined;
236
237 // Update range state machine.
238 if (TrueRangeEnd == (int)i - 1)
239 TrueRangeEnd = i;
240 else
241 TrueRangeEnd = Overdefined;
242 }
243 } else {
244 // Update the FalseElement state machine.
245 if (FirstFalseElement == Undefined)
246 FirstFalseElement = FalseRangeEnd = i; // First false element.
247 else {
248 // Update double-compare state machine.
249 if (SecondFalseElement == Undefined)
250 SecondFalseElement = i;
251 else
252 SecondFalseElement = Overdefined;
253
254 // Update range state machine.
255 if (FalseRangeEnd == (int)i - 1)
256 FalseRangeEnd = i;
257 else
258 FalseRangeEnd = Overdefined;
259 }
260 }
261
262 // If this element is in range, update our magic bitvector.
263 if (i < 64 && IsTrueForElt)
264 MagicBitvector |= 1ULL << i;
265
266 // If all of our states become overdefined, bail out early. Since the
267 // predicate is expensive, only check it every 8 elements. This is only
268 // really useful for really huge arrays.
269 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
270 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
271 FalseRangeEnd == Overdefined)
272 return nullptr;
273 }
274
275 // Now that we've scanned the entire array, emit our new comparison(s). We
276 // order the state machines in complexity of the generated code.
277
278 // If inbounds keyword is not present, Idx * Stride can overflow.
279 // Let's assume that Stride is 2 and the wanted value is at offset 0.
280 // Then, there are two possible values for Idx to match offset 0:
281 // 0x00..00, 0x80..00.
282 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
283 // comparison is false if Idx was 0x80..00.
284 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
285 auto MaskIdx = [&](Value *Idx) {
286 if (!Expr.Flags.isInBounds() && Stride.countr_zero() != 0) {
288 Mask = Builder.CreateLShr(Mask, Stride.countr_zero());
289 Idx = Builder.CreateAnd(Idx, Mask);
290 }
291 return Idx;
292 };
293
294 // If the comparison is only true for one or two elements, emit direct
295 // comparisons.
296 if (SecondTrueElement != Overdefined) {
297 Idx = MaskIdx(Idx);
298 // None true -> false.
299 if (FirstTrueElement == Undefined)
300 return replaceInstUsesWith(ICI, Builder.getFalse());
301
302 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
303
304 // True for one element -> 'i == 47'.
305 if (SecondTrueElement == Undefined)
306 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
307
308 // True for two elements -> 'i == 47 | i == 72'.
309 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
310 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
311 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
312 return BinaryOperator::CreateOr(C1, C2);
313 }
314
315 // If the comparison is only false for one or two elements, emit direct
316 // comparisons.
317 if (SecondFalseElement != Overdefined) {
318 Idx = MaskIdx(Idx);
319 // None false -> true.
320 if (FirstFalseElement == Undefined)
321 return replaceInstUsesWith(ICI, Builder.getTrue());
322
323 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
324
325 // False for one element -> 'i != 47'.
326 if (SecondFalseElement == Undefined)
327 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
328
329 // False for two elements -> 'i != 47 & i != 72'.
330 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
331 Value *SecondFalseIdx =
332 ConstantInt::get(Idx->getType(), SecondFalseElement);
333 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
334 return BinaryOperator::CreateAnd(C1, C2);
335 }
336
337 // If the comparison can be replaced with a range comparison for the elements
338 // where it is true, emit the range check.
339 if (TrueRangeEnd != Overdefined) {
340 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
341 Idx = MaskIdx(Idx);
342
343 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
344 if (FirstTrueElement) {
345 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstTrueElement);
346 Idx = Builder.CreateAdd(Idx, Offs);
347 }
348
349 Value *End =
350 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
351 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
352 }
353
354 // False range check.
355 if (FalseRangeEnd != Overdefined) {
356 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
357 Idx = MaskIdx(Idx);
358 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
359 if (FirstFalseElement) {
360 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstFalseElement);
361 Idx = Builder.CreateAdd(Idx, Offs);
362 }
363
364 Value *End =
365 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
366 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
367 }
368
369 // If a magic bitvector captures the entire comparison state
370 // of this load, replace it with computation that does:
371 // ((magic_cst >> i) & 1) != 0
372 {
373 Type *Ty = nullptr;
374
375 // Look for an appropriate type:
376 // - The type of Idx if the magic fits
377 // - The smallest fitting legal type
378 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
379 Ty = Idx->getType();
380 else
381 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
382
383 if (Ty) {
384 Idx = MaskIdx(Idx);
385 Value *V = Builder.CreateIntCast(Idx, Ty, false);
386 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
387 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
388 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
389 }
390 }
391
392 return nullptr;
393}
394
395/// Returns true if we can rewrite Start as a GEP with pointer Base
396/// and some integer offset. The nodes that need to be re-written
397/// for this transformation will be added to Explored.
399 const DataLayout &DL,
400 SetVector<Value *> &Explored) {
401 SmallVector<Value *, 16> WorkList(1, Start);
402 Explored.insert(Base);
403
404 // The following traversal gives us an order which can be used
405 // when doing the final transformation. Since in the final
406 // transformation we create the PHI replacement instructions first,
407 // we don't have to get them in any particular order.
408 //
409 // However, for other instructions we will have to traverse the
410 // operands of an instruction first, which means that we have to
411 // do a post-order traversal.
412 while (!WorkList.empty()) {
414
415 while (!WorkList.empty()) {
416 if (Explored.size() >= 100)
417 return false;
418
419 Value *V = WorkList.back();
420
421 if (Explored.contains(V)) {
422 WorkList.pop_back();
423 continue;
424 }
425
427 // We've found some value that we can't explore which is different from
428 // the base. Therefore we can't do this transformation.
429 return false;
430
431 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
432 // Only allow inbounds GEPs with at most one variable offset.
433 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
434 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
435 return false;
436
437 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
438 if (!Explored.contains(GEP->getOperand(0)))
439 WorkList.push_back(GEP->getOperand(0));
440 }
441
442 if (WorkList.back() == V) {
443 WorkList.pop_back();
444 // We've finished visiting this node, mark it as such.
445 Explored.insert(V);
446 }
447
448 if (auto *PN = dyn_cast<PHINode>(V)) {
449 // We cannot transform PHIs on unsplittable basic blocks.
450 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
451 return false;
452 Explored.insert(PN);
453 PHIs.insert(PN);
454 }
455 }
456
457 // Explore the PHI nodes further.
458 for (auto *PN : PHIs)
459 for (Value *Op : PN->incoming_values())
460 if (!Explored.contains(Op))
461 WorkList.push_back(Op);
462 }
463
464 // Make sure that we can do this. Since we can't insert GEPs in a basic
465 // block before a PHI node, we can't easily do this transformation if
466 // we have PHI node users of transformed instructions.
467 for (Value *Val : Explored) {
468 for (Value *Use : Val->uses()) {
469
470 auto *PHI = dyn_cast<PHINode>(Use);
471 auto *Inst = dyn_cast<Instruction>(Val);
472
473 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
474 !Explored.contains(PHI))
475 continue;
476
477 if (PHI->getParent() == Inst->getParent())
478 return false;
479 }
480 }
481 return true;
482}
483
484// Sets the appropriate insert point on Builder where we can add
485// a replacement Instruction for V (if that is possible).
486static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
487 bool Before = true) {
488 if (auto *PHI = dyn_cast<PHINode>(V)) {
489 BasicBlock *Parent = PHI->getParent();
490 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
491 return;
492 }
493 if (auto *I = dyn_cast<Instruction>(V)) {
494 if (!Before)
495 I = &*std::next(I->getIterator());
496 Builder.SetInsertPoint(I);
497 return;
498 }
499 if (auto *A = dyn_cast<Argument>(V)) {
500 // Set the insertion point in the entry block.
501 BasicBlock &Entry = A->getParent()->getEntryBlock();
502 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
503 return;
504 }
505 // Otherwise, this is a constant and we don't need to set a new
506 // insertion point.
507 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
508}
509
510/// Returns a re-written value of Start as an indexed GEP using Base as a
511/// pointer.
513 const DataLayout &DL,
514 SetVector<Value *> &Explored,
515 InstCombiner &IC) {
516 // Perform all the substitutions. This is a bit tricky because we can
517 // have cycles in our use-def chains.
518 // 1. Create the PHI nodes without any incoming values.
519 // 2. Create all the other values.
520 // 3. Add the edges for the PHI nodes.
521 // 4. Emit GEPs to get the original pointers.
522 // 5. Remove the original instructions.
523 Type *IndexType = IntegerType::get(
524 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
525
527 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
528
529 // Create the new PHI nodes, without adding any incoming values.
530 for (Value *Val : Explored) {
531 if (Val == Base)
532 continue;
533 // Create empty phi nodes. This avoids cyclic dependencies when creating
534 // the remaining instructions.
535 if (auto *PHI = dyn_cast<PHINode>(Val))
536 NewInsts[PHI] =
537 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
538 PHI->getName() + ".idx", PHI->getIterator());
539 }
540 IRBuilder<> Builder(Base->getContext());
541
542 // Create all the other instructions.
543 for (Value *Val : Explored) {
544 if (NewInsts.contains(Val))
545 continue;
546
547 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
548 setInsertionPoint(Builder, GEP);
549 Value *Op = NewInsts[GEP->getOperand(0)];
550 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
552 NewInsts[GEP] = OffsetV;
553 else
554 NewInsts[GEP] = Builder.CreateAdd(
555 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
556 /*NUW=*/NW.hasNoUnsignedWrap(),
557 /*NSW=*/NW.hasNoUnsignedSignedWrap());
558 continue;
559 }
560 if (isa<PHINode>(Val))
561 continue;
562
563 llvm_unreachable("Unexpected instruction type");
564 }
565
566 // Add the incoming values to the PHI nodes.
567 for (Value *Val : Explored) {
568 if (Val == Base)
569 continue;
570 // All the instructions have been created, we can now add edges to the
571 // phi nodes.
572 if (auto *PHI = dyn_cast<PHINode>(Val)) {
573 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
574 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
575 Value *NewIncoming = PHI->getIncomingValue(I);
576
577 auto It = NewInsts.find(NewIncoming);
578 if (It != NewInsts.end())
579 NewIncoming = It->second;
580
581 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
582 }
583 }
584 }
585
586 for (Value *Val : Explored) {
587 if (Val == Base)
588 continue;
589
590 setInsertionPoint(Builder, Val, false);
591 // Create GEP for external users.
592 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
593 Val->getName() + ".ptr", NW);
594 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
595 // Add old instruction to worklist for DCE. We don't directly remove it
596 // here because the original compare is one of the users.
598 }
599
600 return NewInsts[Start];
601}
602
603/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
604/// We can look through PHIs, GEPs and casts in order to determine a common base
605/// between GEPLHS and RHS.
608 const DataLayout &DL,
609 InstCombiner &IC) {
610 // FIXME: Support vector of pointers.
611 if (GEPLHS->getType()->isVectorTy())
612 return nullptr;
613
614 if (!GEPLHS->hasAllConstantIndices())
615 return nullptr;
616
617 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
618 Value *PtrBase =
620 /*AllowNonInbounds*/ false);
621
622 // Bail if we looked through addrspacecast.
623 if (PtrBase->getType() != GEPLHS->getType())
624 return nullptr;
625
626 // The set of nodes that will take part in this transformation.
627 SetVector<Value *> Nodes;
628 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
629 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
630 return nullptr;
631
632 // We know we can re-write this as
633 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
634 // Since we've only looked through inbouds GEPs we know that we
635 // can't have overflow on either side. We can therefore re-write
636 // this as:
637 // OFFSET1 cmp OFFSET2
638 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
639
640 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
641 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
642 // offset. Since Index is the offset of LHS to the base pointer, we will now
643 // compare the offsets instead of comparing the pointers.
645 IC.Builder.getInt(Offset), NewRHS);
646}
647
648/// Fold comparisons between a GEP instruction and something else. At this point
649/// we know that the GEP is on the LHS of the comparison.
652 // Don't transform signed compares of GEPs into index compares. Even if the
653 // GEP is inbounds, the final add of the base pointer can have signed overflow
654 // and would change the result of the icmp.
655 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
656 // the maximum signed value for the pointer type.
658 return nullptr;
659
660 // Look through bitcasts and addrspacecasts. We do not however want to remove
661 // 0 GEPs.
662 if (!isa<GetElementPtrInst>(RHS))
663 RHS = RHS->stripPointerCasts();
664
665 auto CanFold = [Cond](GEPNoWrapFlags NW) {
667 return true;
668
669 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
671 return NW != GEPNoWrapFlags::none();
672 };
673
674 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
675 if (!NW.hasNoUnsignedWrap()) {
676 // Convert signed to unsigned comparison.
677 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
678 }
679
680 auto *I = new ICmpInst(Cond, Op1, Op2);
681 I->setSameSign(NW.hasNoUnsignedSignedWrap());
682 return I;
683 };
684
686 if (Base.Ptr == RHS && CanFold(Base.LHSNW) && !Base.isExpensive()) {
687 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
688 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
689 Value *Offset =
690 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEPs=*/true);
691 return NewICmp(Base.LHSNW, Offset,
692 Constant::getNullValue(Offset->getType()));
693 }
694
695 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
697 !NullPointerIsDefined(I.getFunction(),
698 RHS->getType()->getPointerAddressSpace())) {
699 // For most address spaces, an allocation can't be placed at null, but null
700 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
701 // the only valid inbounds address derived from null, is null itself.
702 // Thus, we have four cases to consider:
703 // 1) Base == nullptr, Offset == 0 -> inbounds, null
704 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
705 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
706 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
707 //
708 // (Note if we're indexing a type of size 0, that simply collapses into one
709 // of the buckets above.)
710 //
711 // In general, we're allowed to make values less poison (i.e. remove
712 // sources of full UB), so in this case, we just select between the two
713 // non-poison cases (1 and 4 above).
714 //
715 // For vectors, we apply the same reasoning on a per-lane basis.
716 auto *Base = GEPLHS->getPointerOperand();
717 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
718 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
719 Base = Builder.CreateVectorSplat(EC, Base);
720 }
721 return new ICmpInst(Cond, Base,
723 cast<Constant>(RHS), Base->getType()));
724 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
725 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
726
727 // If the base pointers are different, but the indices are the same, just
728 // compare the base pointer.
729 if (GEPLHS->getOperand(0) != GEPRHS->getOperand(0)) {
730 bool IndicesTheSame =
731 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
732 GEPLHS->getPointerOperand()->getType() ==
733 GEPRHS->getPointerOperand()->getType() &&
734 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
735 if (IndicesTheSame)
736 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
737 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
738 IndicesTheSame = false;
739 break;
740 }
741
742 // If all indices are the same, just compare the base pointers.
743 Type *BaseType = GEPLHS->getOperand(0)->getType();
744 if (IndicesTheSame &&
745 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
746 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
747
748 // If we're comparing GEPs with two base pointers that only differ in type
749 // and both GEPs have only constant indices or just one use, then fold
750 // the compare with the adjusted indices.
751 // FIXME: Support vector of pointers.
752 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
753 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
754 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
755 GEPLHS->getOperand(0)->stripPointerCasts() ==
756 GEPRHS->getOperand(0)->stripPointerCasts() &&
757 !GEPLHS->getType()->isVectorTy()) {
758 Value *LOffset = EmitGEPOffset(GEPLHS);
759 Value *ROffset = EmitGEPOffset(GEPRHS);
760
761 // If we looked through an addrspacecast between different sized address
762 // spaces, the LHS and RHS pointers are different sized
763 // integers. Truncate to the smaller one.
764 Type *LHSIndexTy = LOffset->getType();
765 Type *RHSIndexTy = ROffset->getType();
766 if (LHSIndexTy != RHSIndexTy) {
767 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
768 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
769 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
770 } else
771 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
772 }
773
775 LOffset, ROffset);
776 return replaceInstUsesWith(I, Cmp);
777 }
778 }
779
780 if (GEPLHS->getOperand(0) == GEPRHS->getOperand(0) &&
781 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
782 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
783 // If the GEPs only differ by one index, compare it.
784 unsigned NumDifferences = 0; // Keep track of # differences.
785 unsigned DiffOperand = 0; // The operand that differs.
786 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
787 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
788 Type *LHSType = GEPLHS->getOperand(i)->getType();
789 Type *RHSType = GEPRHS->getOperand(i)->getType();
790 // FIXME: Better support for vector of pointers.
791 if (LHSType->getPrimitiveSizeInBits() !=
792 RHSType->getPrimitiveSizeInBits() ||
793 (GEPLHS->getType()->isVectorTy() &&
794 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
795 // Irreconcilable differences.
796 NumDifferences = 2;
797 break;
798 }
799
800 if (NumDifferences++)
801 break;
802 DiffOperand = i;
803 }
804
805 if (NumDifferences == 0) // SAME GEP?
806 return replaceInstUsesWith(
807 I, // No comparison is needed here.
808 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
809 // If two GEPs only differ by an index, compare them.
810 // Note that nowrap flags are always needed when comparing two indices.
811 else if (NumDifferences == 1 && NW != GEPNoWrapFlags::none()) {
812 Value *LHSV = GEPLHS->getOperand(DiffOperand);
813 Value *RHSV = GEPRHS->getOperand(DiffOperand);
814 return NewICmp(NW, LHSV, RHSV);
815 }
816 }
817
818 if (Base.Ptr && CanFold(Base.LHSNW & Base.RHSNW) && !Base.isExpensive()) {
819 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
820 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
821 Value *L =
822 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEP=*/true);
823 Value *R =
824 EmitGEPOffsets(Base.RHSGEPs, Base.RHSNW, IdxTy, /*RewriteGEP=*/true);
825 return NewICmp(Base.LHSNW & Base.RHSNW, L, R);
826 }
827 }
828
829 // Try convert this to an indexed compare by looking through PHIs/casts as a
830 // last resort.
831 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
832}
833
835 // It would be tempting to fold away comparisons between allocas and any
836 // pointer not based on that alloca (e.g. an argument). However, even
837 // though such pointers cannot alias, they can still compare equal.
838 //
839 // But LLVM doesn't specify where allocas get their memory, so if the alloca
840 // doesn't escape we can argue that it's impossible to guess its value, and we
841 // can therefore act as if any such guesses are wrong.
842 //
843 // However, we need to ensure that this folding is consistent: We can't fold
844 // one comparison to false, and then leave a different comparison against the
845 // same value alone (as it might evaluate to true at runtime, leading to a
846 // contradiction). As such, this code ensures that all comparisons are folded
847 // at the same time, and there are no other escapes.
848
849 struct CmpCaptureTracker : public CaptureTracker {
850 AllocaInst *Alloca;
851 bool Captured = false;
852 /// The value of the map is a bit mask of which icmp operands the alloca is
853 /// used in.
855
856 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
857
858 void tooManyUses() override { Captured = true; }
859
860 Action captured(const Use *U, UseCaptureInfo CI) override {
861 // TODO(captures): Use UseCaptureInfo.
862 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
863 // We need to check that U is based *only* on the alloca, and doesn't
864 // have other contributions from a select/phi operand.
865 // TODO: We could check whether getUnderlyingObjects() reduces to one
866 // object, which would allow looking through phi nodes.
867 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
868 // Collect equality icmps of the alloca, and don't treat them as
869 // captures.
870 ICmps[ICmp] |= 1u << U->getOperandNo();
871 return Continue;
872 }
873
874 Captured = true;
875 return Stop;
876 }
877 };
878
879 CmpCaptureTracker Tracker(Alloca);
880 PointerMayBeCaptured(Alloca, &Tracker);
881 if (Tracker.Captured)
882 return false;
883
884 bool Changed = false;
885 for (auto [ICmp, Operands] : Tracker.ICmps) {
886 switch (Operands) {
887 case 1:
888 case 2: {
889 // The alloca is only used in one icmp operand. Assume that the
890 // equality is false.
891 auto *Res = ConstantInt::get(ICmp->getType(),
892 ICmp->getPredicate() == ICmpInst::ICMP_NE);
893 replaceInstUsesWith(*ICmp, Res);
895 Changed = true;
896 break;
897 }
898 case 3:
899 // Both icmp operands are based on the alloca, so this is comparing
900 // pointer offsets, without leaking any information about the address
901 // of the alloca. Ignore such comparisons.
902 break;
903 default:
904 llvm_unreachable("Cannot happen");
905 }
906 }
907
908 return Changed;
909}
910
911/// Fold "icmp pred (X+C), X".
913 CmpPredicate Pred) {
914 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
915 // so the values can never be equal. Similarly for all other "or equals"
916 // operators.
917 assert(!!C && "C should not be zero!");
918
919 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
920 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
921 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
922 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
923 Constant *R =
924 ConstantInt::get(X->getType(), APInt::getMaxValue(C.getBitWidth()) - C);
925 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
926 }
927
928 // (X+1) >u X --> X <u (0-1) --> X != 255
929 // (X+2) >u X --> X <u (0-2) --> X <u 254
930 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
931 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
932 return new ICmpInst(ICmpInst::ICMP_ULT, X,
933 ConstantInt::get(X->getType(), -C));
934
935 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
936
937 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
938 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
939 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
940 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
941 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
942 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
943 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
944 return new ICmpInst(ICmpInst::ICMP_SGT, X,
945 ConstantInt::get(X->getType(), SMax - C));
946
947 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
948 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
949 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
950 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
951 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
952 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
953
954 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
955 return new ICmpInst(ICmpInst::ICMP_SLT, X,
956 ConstantInt::get(X->getType(), SMax - (C - 1)));
957}
958
959/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
960/// (icmp eq/ne A, Log2(AP2/AP1)) ->
961/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
963 const APInt &AP1,
964 const APInt &AP2) {
965 assert(I.isEquality() && "Cannot fold icmp gt/lt");
966
967 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
968 if (I.getPredicate() == I.ICMP_NE)
969 Pred = CmpInst::getInversePredicate(Pred);
970 return new ICmpInst(Pred, LHS, RHS);
971 };
972
973 // Don't bother doing any work for cases which InstSimplify handles.
974 if (AP2.isZero())
975 return nullptr;
976
977 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
978 if (IsAShr) {
979 if (AP2.isAllOnes())
980 return nullptr;
981 if (AP2.isNegative() != AP1.isNegative())
982 return nullptr;
983 if (AP2.sgt(AP1))
984 return nullptr;
985 }
986
987 if (!AP1)
988 // 'A' must be large enough to shift out the highest set bit.
989 return getICmp(I.ICMP_UGT, A,
990 ConstantInt::get(A->getType(), AP2.logBase2()));
991
992 if (AP1 == AP2)
993 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
994
995 int Shift;
996 if (IsAShr && AP1.isNegative())
997 Shift = AP1.countl_one() - AP2.countl_one();
998 else
999 Shift = AP1.countl_zero() - AP2.countl_zero();
1000
1001 if (Shift > 0) {
1002 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1003 // There are multiple solutions if we are comparing against -1 and the LHS
1004 // of the ashr is not a power of two.
1005 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1006 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1007 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1008 } else if (AP1 == AP2.lshr(Shift)) {
1009 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1010 }
1011 }
1012
1013 // Shifting const2 will never be equal to const1.
1014 // FIXME: This should always be handled by InstSimplify?
1015 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1016 return replaceInstUsesWith(I, TorF);
1017}
1018
1019/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1020/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1022 const APInt &AP1,
1023 const APInt &AP2) {
1024 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1025
1026 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1027 if (I.getPredicate() == I.ICMP_NE)
1028 Pred = CmpInst::getInversePredicate(Pred);
1029 return new ICmpInst(Pred, LHS, RHS);
1030 };
1031
1032 // Don't bother doing any work for cases which InstSimplify handles.
1033 if (AP2.isZero())
1034 return nullptr;
1035
1036 unsigned AP2TrailingZeros = AP2.countr_zero();
1037
1038 if (!AP1 && AP2TrailingZeros != 0)
1039 return getICmp(
1040 I.ICMP_UGE, A,
1041 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1042
1043 if (AP1 == AP2)
1044 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1045
1046 // Get the distance between the lowest bits that are set.
1047 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1048
1049 if (Shift > 0 && AP2.shl(Shift) == AP1)
1050 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1051
1052 // Shifting const2 will never be equal to const1.
1053 // FIXME: This should always be handled by InstSimplify?
1054 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1055 return replaceInstUsesWith(I, TorF);
1056}
1057
1058/// The caller has matched a pattern of the form:
1059/// I = icmp ugt (add (add A, B), CI2), CI1
1060/// If this is of the form:
1061/// sum = a + b
1062/// if (sum+128 >u 255)
1063/// Then replace it with llvm.sadd.with.overflow.i8.
1064///
1066 ConstantInt *CI2, ConstantInt *CI1,
1067 InstCombinerImpl &IC) {
1068 // The transformation we're trying to do here is to transform this into an
1069 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1070 // with a narrower add, and discard the add-with-constant that is part of the
1071 // range check (if we can't eliminate it, this isn't profitable).
1072
1073 // In order to eliminate the add-with-constant, the compare can be its only
1074 // use.
1075 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1076 if (!AddWithCst->hasOneUse())
1077 return nullptr;
1078
1079 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1080 if (!CI2->getValue().isPowerOf2())
1081 return nullptr;
1082 unsigned NewWidth = CI2->getValue().countr_zero();
1083 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1084 return nullptr;
1085
1086 // The width of the new add formed is 1 more than the bias.
1087 ++NewWidth;
1088
1089 // Check to see that CI1 is an all-ones value with NewWidth bits.
1090 if (CI1->getBitWidth() == NewWidth ||
1091 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1092 return nullptr;
1093
1094 // This is only really a signed overflow check if the inputs have been
1095 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1096 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1097 if (IC.ComputeMaxSignificantBits(A, &I) > NewWidth ||
1098 IC.ComputeMaxSignificantBits(B, &I) > NewWidth)
1099 return nullptr;
1100
1101 // In order to replace the original add with a narrower
1102 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1103 // and truncates that discard the high bits of the add. Verify that this is
1104 // the case.
1105 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1106 for (User *U : OrigAdd->users()) {
1107 if (U == AddWithCst)
1108 continue;
1109
1110 // Only accept truncates for now. We would really like a nice recursive
1111 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1112 // chain to see which bits of a value are actually demanded. If the
1113 // original add had another add which was then immediately truncated, we
1114 // could still do the transformation.
1116 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1117 return nullptr;
1118 }
1119
1120 // If the pattern matches, truncate the inputs to the narrower type and
1121 // use the sadd_with_overflow intrinsic to efficiently compute both the
1122 // result and the overflow bit.
1123 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1125 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1126
1127 InstCombiner::BuilderTy &Builder = IC.Builder;
1128
1129 // Put the new code above the original add, in case there are any uses of the
1130 // add between the add and the compare.
1131 Builder.SetInsertPoint(OrigAdd);
1132
1133 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1134 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1135 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1136 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1137 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1138
1139 // The inner add was the result of the narrow add, zero extended to the
1140 // wider type. Replace it with the result computed by the intrinsic.
1141 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1142 IC.eraseInstFromFunction(*OrigAdd);
1143
1144 // The original icmp gets replaced with the overflow value.
1145 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1146}
1147
1148/// If we have:
1149/// icmp eq/ne (urem/srem %x, %y), 0
1150/// iff %y is a power-of-two, we can replace this with a bit test:
1151/// icmp eq/ne (and %x, (add %y, -1)), 0
1153 // This fold is only valid for equality predicates.
1154 if (!I.isEquality())
1155 return nullptr;
1156 CmpPredicate Pred;
1157 Value *X, *Y, *Zero;
1158 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1159 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1160 return nullptr;
1161 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
1162 return nullptr;
1163 // This may increase instruction count, we don't enforce that Y is a constant.
1164 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1165 Value *Masked = Builder.CreateAnd(X, Mask);
1166 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1167}
1168
1169/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1170/// by one-less-than-bitwidth into a sign test on the original value.
1172 Instruction *Val;
1173 CmpPredicate Pred;
1174 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1175 return nullptr;
1176
1177 Value *X;
1178 Type *XTy;
1179
1180 Constant *C;
1181 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1182 XTy = X->getType();
1183 unsigned XBitWidth = XTy->getScalarSizeInBits();
1185 APInt(XBitWidth, XBitWidth - 1))))
1186 return nullptr;
1187 } else if (isa<BinaryOperator>(Val) &&
1189 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1190 /*AnalyzeForSignBitExtraction=*/true))) {
1191 XTy = X->getType();
1192 } else
1193 return nullptr;
1194
1195 return ICmpInst::Create(Instruction::ICmp,
1199}
1200
1201// Handle icmp pred X, 0
1203 CmpInst::Predicate Pred = Cmp.getPredicate();
1204 if (!match(Cmp.getOperand(1), m_Zero()))
1205 return nullptr;
1206
1207 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1208 if (Pred == ICmpInst::ICMP_SGT) {
1209 Value *A, *B;
1210 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1211 if (isKnownPositive(A, SQ.getWithInstruction(&Cmp)))
1212 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1213 if (isKnownPositive(B, SQ.getWithInstruction(&Cmp)))
1214 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1215 }
1216 }
1217
1219 return New;
1220
1221 // Given:
1222 // icmp eq/ne (urem %x, %y), 0
1223 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1224 // icmp eq/ne %x, 0
1225 Value *X, *Y;
1226 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1227 ICmpInst::isEquality(Pred)) {
1228 KnownBits XKnown = computeKnownBits(X, &Cmp);
1229 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1230 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1231 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1232 }
1233
1234 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1235 // odd/non-zero/there is no overflow.
1236 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1237 ICmpInst::isEquality(Pred)) {
1238
1239 KnownBits XKnown = computeKnownBits(X, &Cmp);
1240 // if X % 2 != 0
1241 // (icmp eq/ne Y)
1242 if (XKnown.countMaxTrailingZeros() == 0)
1243 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1244
1245 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1246 // if Y % 2 != 0
1247 // (icmp eq/ne X)
1248 if (YKnown.countMaxTrailingZeros() == 0)
1249 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1250
1251 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1252 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1253 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1254 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1255 // but to avoid unnecessary work, first just if this is an obvious case.
1256
1257 // if X non-zero and NoOverflow(X * Y)
1258 // (icmp eq/ne Y)
1259 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1260 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1261
1262 // if Y non-zero and NoOverflow(X * Y)
1263 // (icmp eq/ne X)
1264 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1265 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1266 }
1267 // Note, we are skipping cases:
1268 // if Y % 2 != 0 AND X % 2 != 0
1269 // (false/true)
1270 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1271 // (false/true)
1272 // Those can be simplified later as we would have already replaced the (icmp
1273 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1274 // will fold to a constant elsewhere.
1275 }
1276
1277 // (icmp eq/ne f(X), 0) -> (icmp eq/ne X, 0)
1278 // where f(X) == 0 if and only if X == 0
1279 if (ICmpInst::isEquality(Pred))
1280 if (Value *Stripped = stripNullTest(Cmp.getOperand(0)))
1281 return new ICmpInst(Pred, Stripped,
1282 Constant::getNullValue(Stripped->getType()));
1283
1284 return nullptr;
1285}
1286
1287/// Fold icmp eq (num + mask) & ~mask, num
1288/// to
1289/// icmp eq (and num, mask), 0
1290/// Where mask is a low bit mask.
1292 Value *Num;
1293 CmpPredicate Pred;
1294 const APInt *Mask, *Neg;
1295
1296 if (!match(&Cmp,
1297 m_c_ICmp(Pred, m_Value(Num),
1299 m_LowBitMask(Mask))),
1300 m_APInt(Neg))))))
1301 return nullptr;
1302
1303 if (*Neg != ~*Mask)
1304 return nullptr;
1305
1306 if (!ICmpInst::isEquality(Pred))
1307 return nullptr;
1308
1309 // Create new icmp eq (num & mask), 0
1310 auto *NewAnd = Builder.CreateAnd(Num, *Mask);
1311 auto *Zero = Constant::getNullValue(Num->getType());
1312
1313 return new ICmpInst(Pred, NewAnd, Zero);
1314}
1315
1316/// Fold icmp Pred X, C.
1317/// TODO: This code structure does not make sense. The saturating add fold
1318/// should be moved to some other helper and extended as noted below (it is also
1319/// possible that code has been made unnecessary - do we canonicalize IR to
1320/// overflow/saturating intrinsics or not?).
1322 // Match the following pattern, which is a common idiom when writing
1323 // overflow-safe integer arithmetic functions. The source performs an addition
1324 // in wider type and explicitly checks for overflow using comparisons against
1325 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1326 //
1327 // TODO: This could probably be generalized to handle other overflow-safe
1328 // operations if we worked out the formulas to compute the appropriate magic
1329 // constants.
1330 //
1331 // sum = a + b
1332 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1333 CmpInst::Predicate Pred = Cmp.getPredicate();
1334 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1335 Value *A, *B;
1336 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1337 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1338 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1339 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1340 return Res;
1341
1342 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1344 if (!C)
1345 return nullptr;
1346
1347 if (auto *Phi = dyn_cast<PHINode>(Op0))
1348 if (all_of(Phi->operands(), IsaPred<Constant>)) {
1350 for (Value *V : Phi->incoming_values()) {
1351 Constant *Res =
1353 if (!Res)
1354 return nullptr;
1355 Ops.push_back(Res);
1356 }
1357 Builder.SetInsertPoint(Phi);
1358 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1359 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1360 NewPhi->addIncoming(V, Pred);
1361 return replaceInstUsesWith(Cmp, NewPhi);
1362 }
1363
1365 return R;
1366
1367 return nullptr;
1368}
1369
1370/// Canonicalize icmp instructions based on dominating conditions.
1372 // We already checked simple implication in InstSimplify, only handle complex
1373 // cases here.
1374 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1375 const APInt *C;
1376 if (!match(Y, m_APInt(C)))
1377 return nullptr;
1378
1379 CmpInst::Predicate Pred = Cmp.getPredicate();
1381
1382 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1383 const APInt *DomC) -> Instruction * {
1384 // We have 2 compares of a variable with constants. Calculate the constant
1385 // ranges of those compares to see if we can transform the 2nd compare:
1386 // DomBB:
1387 // DomCond = icmp DomPred X, DomC
1388 // br DomCond, CmpBB, FalseBB
1389 // CmpBB:
1390 // Cmp = icmp Pred X, C
1391 ConstantRange DominatingCR =
1392 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1393 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1394 ConstantRange Difference = DominatingCR.difference(CR);
1395 if (Intersection.isEmptySet())
1396 return replaceInstUsesWith(Cmp, Builder.getFalse());
1397 if (Difference.isEmptySet())
1398 return replaceInstUsesWith(Cmp, Builder.getTrue());
1399
1400 // Canonicalizing a sign bit comparison that gets used in a branch,
1401 // pessimizes codegen by generating branch on zero instruction instead
1402 // of a test and branch. So we avoid canonicalizing in such situations
1403 // because test and branch instruction has better branch displacement
1404 // than compare and branch instruction.
1405 bool UnusedBit;
1406 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1407 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1408 return nullptr;
1409
1410 // Avoid an infinite loop with min/max canonicalization.
1411 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1412 if (Cmp.hasOneUse() &&
1413 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1414 return nullptr;
1415
1416 if (const APInt *EqC = Intersection.getSingleElement())
1417 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1418 if (const APInt *NeC = Difference.getSingleElement())
1419 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1420 return nullptr;
1421 };
1422
1423 for (CondBrInst *BI : DC.conditionsFor(X)) {
1424 CmpPredicate DomPred;
1425 const APInt *DomC;
1426 if (!match(BI->getCondition(),
1427 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1428 continue;
1429
1430 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1431 if (DT.dominates(Edge0, Cmp.getParent())) {
1432 if (auto *V = handleDomCond(DomPred, DomC))
1433 return V;
1434 } else {
1435 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1436 if (DT.dominates(Edge1, Cmp.getParent()))
1437 if (auto *V =
1438 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1439 return V;
1440 }
1441 }
1442
1443 return nullptr;
1444}
1445
1446/// Fold icmp (trunc X), C.
1448 TruncInst *Trunc,
1449 const APInt &C) {
1450 ICmpInst::Predicate Pred = Cmp.getPredicate();
1451 Value *X = Trunc->getOperand(0);
1452 Type *SrcTy = X->getType();
1453 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1454 SrcBits = SrcTy->getScalarSizeInBits();
1455
1456 // Match (icmp pred (trunc nuw/nsw X), C)
1457 // Which we can convert to (icmp pred X, (sext/zext C))
1458 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1459 if (Trunc->hasNoSignedWrap())
1460 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1461 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1462 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1463 }
1464
1465 if (C.isOne() && C.getBitWidth() > 1) {
1466 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1467 Value *V = nullptr;
1468 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1469 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1470 ConstantInt::get(V->getType(), 1));
1471 }
1472
1473 // TODO: Handle non-equality predicates.
1474 Value *Y;
1475 const APInt *Pow2;
1476 if (Cmp.isEquality() && match(X, m_Shl(m_Power2(Pow2), m_Value(Y))) &&
1477 DstBits > Pow2->logBase2()) {
1478 // (trunc (Pow2 << Y) to iN) == 0 --> Y u>= N - log2(Pow2)
1479 // (trunc (Pow2 << Y) to iN) != 0 --> Y u< N - log2(Pow2)
1480 // iff N > log2(Pow2)
1481 if (C.isZero()) {
1482 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1483 return new ICmpInst(NewPred, Y,
1484 ConstantInt::get(SrcTy, DstBits - Pow2->logBase2()));
1485 }
1486 // (trunc (Pow2 << Y) to iN) == 2**C --> Y == C - log2(Pow2)
1487 // (trunc (Pow2 << Y) to iN) != 2**C --> Y != C - log2(Pow2)
1488 if (C.isPowerOf2())
1489 return new ICmpInst(
1490 Pred, Y, ConstantInt::get(SrcTy, C.logBase2() - Pow2->logBase2()));
1491 }
1492
1493 if (Cmp.isEquality() && (Trunc->hasOneUse() || Trunc->hasNoUnsignedWrap())) {
1494 // Canonicalize to a mask and wider compare if the wide type is suitable:
1495 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1496 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1497 Constant *Mask =
1498 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1499 Value *And = Trunc->hasNoUnsignedWrap() ? X : Builder.CreateAnd(X, Mask);
1500 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1501 return new ICmpInst(Pred, And, WideC);
1502 }
1503
1504 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1505 // of the high bits truncated out of x are known.
1506 KnownBits Known = computeKnownBits(X, &Cmp);
1507
1508 // If all the high bits are known, we can do this xform.
1509 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1510 // Pull in the high bits from known-ones set.
1511 APInt NewRHS = C.zext(SrcBits);
1512 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1513 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1514 }
1515 }
1516
1517 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1518 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1519 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1520 Value *ShOp;
1521 uint64_t ShAmt;
1522 bool TrueIfSigned;
1523 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1524 match(X, m_Shr(m_Value(ShOp), m_ConstantInt(ShAmt))) &&
1525 DstBits == SrcBits - ShAmt) {
1526 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1528 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1530 }
1531
1532 return nullptr;
1533}
1534
1535/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1536/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1539 const SimplifyQuery &Q) {
1540 Value *X, *Y;
1541 CmpPredicate Pred;
1542 bool YIsSExt = false;
1543 // Try to match icmp (trunc X), (trunc Y)
1544 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1545 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1546 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1547 if (Cmp.isSigned()) {
1548 // For signed comparisons, both truncs must be nsw.
1549 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1550 return nullptr;
1551 } else {
1552 // For unsigned and equality comparisons, either both must be nuw or
1553 // both must be nsw, we don't care which.
1554 if (!NoWrapFlags)
1555 return nullptr;
1556 }
1557
1558 if (X->getType() != Y->getType() &&
1559 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1560 return nullptr;
1561 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1562 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1563 std::swap(X, Y);
1564 Pred = Cmp.getSwappedPredicate(Pred);
1565 }
1566 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1567 }
1568 // Try to match icmp (trunc nuw X), (zext Y)
1569 else if (!Cmp.isSigned() &&
1570 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1571 m_OneUse(m_ZExt(m_Value(Y)))))) {
1572 // Can fold trunc nuw + zext for unsigned and equality predicates.
1573 }
1574 // Try to match icmp (trunc nsw X), (sext Y)
1575 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1577 // Can fold trunc nsw + zext/sext for all predicates.
1578 YIsSExt =
1579 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1580 } else
1581 return nullptr;
1582
1583 Type *TruncTy = Cmp.getOperand(0)->getType();
1584 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1585
1586 // If this transform will end up changing from desirable types -> undesirable
1587 // types skip it.
1588 if (isDesirableIntType(TruncBits) &&
1589 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1590 return nullptr;
1591
1592 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1593 return new ICmpInst(Pred, X, NewY);
1594}
1595
1596/// Fold icmp (xor X, Y), C.
1599 const APInt &C) {
1600 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1601 return I;
1602
1603 Value *X = Xor->getOperand(0);
1604 Value *Y = Xor->getOperand(1);
1605 const APInt *XorC;
1606 if (!match(Y, m_APInt(XorC)))
1607 return nullptr;
1608
1609 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1610 // fold the xor.
1611 ICmpInst::Predicate Pred = Cmp.getPredicate();
1612 bool TrueIfSigned = false;
1613 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1614
1615 // If the sign bit of the XorCst is not set, there is no change to
1616 // the operation, just stop using the Xor.
1617 if (!XorC->isNegative())
1618 return replaceOperand(Cmp, 0, X);
1619
1620 // Emit the opposite comparison.
1621 if (TrueIfSigned)
1622 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1623 ConstantInt::getAllOnesValue(X->getType()));
1624 else
1625 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1626 ConstantInt::getNullValue(X->getType()));
1627 }
1628
1629 if (Xor->hasOneUse()) {
1630 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1631 if (!Cmp.isEquality() && XorC->isSignMask()) {
1632 Pred = Cmp.getFlippedSignednessPredicate();
1633 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1634 }
1635
1636 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1637 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1638 Pred = Cmp.getFlippedSignednessPredicate();
1639 Pred = Cmp.getSwappedPredicate(Pred);
1640 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1641 }
1642 }
1643
1644 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1645 if (Pred == ICmpInst::ICMP_UGT) {
1646 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1647 if (*XorC == ~C && (C + 1).isPowerOf2())
1648 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1649 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1650 if (*XorC == C && (C + 1).isPowerOf2())
1651 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1652 }
1653 if (Pred == ICmpInst::ICMP_ULT) {
1654 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1655 if (*XorC == -C && C.isPowerOf2())
1656 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1657 ConstantInt::get(X->getType(), ~C));
1658 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1659 if (*XorC == C && (-C).isPowerOf2())
1660 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1661 ConstantInt::get(X->getType(), ~C));
1662 }
1663 return nullptr;
1664}
1665
1666/// For power-of-2 C:
1667/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1668/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1671 const APInt &C) {
1672 CmpInst::Predicate Pred = Cmp.getPredicate();
1673 APInt PowerOf2;
1674 if (Pred == ICmpInst::ICMP_ULT)
1675 PowerOf2 = C;
1676 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1677 PowerOf2 = C + 1;
1678 else
1679 return nullptr;
1680 if (!PowerOf2.isPowerOf2())
1681 return nullptr;
1682 Value *X;
1683 const APInt *ShiftC;
1685 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1686 return nullptr;
1687 uint64_t Shift = ShiftC->getLimitedValue();
1688 Type *XType = X->getType();
1689 if (Shift == 0 || PowerOf2.isMinSignedValue())
1690 return nullptr;
1691 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1692 APInt Bound =
1693 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1694 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1695}
1696
1697/// Fold icmp (and (sh X, Y), C2), C1.
1700 const APInt &C1,
1701 const APInt &C2) {
1702 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1703 if (!Shift || !Shift->isShift())
1704 return nullptr;
1705
1706 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1707 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1708 // code produced by the clang front-end, for bitfield access.
1709 // This seemingly simple opportunity to fold away a shift turns out to be
1710 // rather complicated. See PR17827 for details.
1711 unsigned ShiftOpcode = Shift->getOpcode();
1712 bool IsShl = ShiftOpcode == Instruction::Shl;
1713 const APInt *C3;
1714 if (match(Shift->getOperand(1), m_APInt(C3))) {
1715 APInt NewAndCst, NewCmpCst;
1716 bool AnyCmpCstBitsShiftedOut;
1717 if (ShiftOpcode == Instruction::Shl) {
1718 // For a left shift, we can fold if the comparison is not signed. We can
1719 // also fold a signed comparison if the mask value and comparison value
1720 // are not negative. These constraints may not be obvious, but we can
1721 // prove that they are correct using an SMT solver.
1722 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1723 return nullptr;
1724
1725 NewCmpCst = C1.lshr(*C3);
1726 NewAndCst = C2.lshr(*C3);
1727 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1728 } else if (ShiftOpcode == Instruction::LShr) {
1729 // For a logical right shift, we can fold if the comparison is not signed.
1730 // We can also fold a signed comparison if the shifted mask value and the
1731 // shifted comparison value are not negative. These constraints may not be
1732 // obvious, but we can prove that they are correct using an SMT solver.
1733 NewCmpCst = C1.shl(*C3);
1734 NewAndCst = C2.shl(*C3);
1735 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1736 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1737 return nullptr;
1738 } else {
1739 // For an arithmetic shift, check that both constants don't use (in a
1740 // signed sense) the top bits being shifted out.
1741 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1742 NewCmpCst = C1.shl(*C3);
1743 NewAndCst = C2.shl(*C3);
1744 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1745 if (NewAndCst.ashr(*C3) != C2)
1746 return nullptr;
1747 }
1748
1749 if (AnyCmpCstBitsShiftedOut) {
1750 // If we shifted bits out, the fold is not going to work out. As a
1751 // special case, check to see if this means that the result is always
1752 // true or false now.
1753 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1754 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1755 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1756 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1757 } else {
1758 Value *NewAnd = Builder.CreateAnd(
1759 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1760 return new ICmpInst(Cmp.getPredicate(), NewAnd,
1761 ConstantInt::get(And->getType(), NewCmpCst));
1762 }
1763 }
1764
1765 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1766 // preferable because it allows the C2 << Y expression to be hoisted out of a
1767 // loop if Y is invariant and X is not.
1768 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1769 !Shift->isArithmeticShift() &&
1770 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1771 // Compute C2 << Y.
1772 Value *NewShift =
1773 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1774 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1775
1776 // Compute X & (C2 << Y).
1777 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1778 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1779 }
1780
1781 return nullptr;
1782}
1783
1784/// Fold icmp (and X, C2), C1.
1787 const APInt &C1) {
1788 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1789
1790 // icmp ne (and X, 1), 0 --> trunc X to i1
1791 if (isICMP_NE && C1.isZero() && match(And->getOperand(1), m_One()))
1792 return new TruncInst(And->getOperand(0), Cmp.getType());
1793
1794 const APInt *C2;
1795 Value *X;
1796 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1797 return nullptr;
1798
1799 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1800 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1801 C2->isNegatedPowerOf2())
1802 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1803 ConstantInt::get(X->getType(), ~*C2));
1804 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1805 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1806 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1807 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1808 ConstantInt::get(X->getType(), -*C2));
1809
1810 // Don't perform the following transforms if the AND has multiple uses
1811 if (!And->hasOneUse())
1812 return nullptr;
1813
1814 if (Cmp.isEquality() && C1.isZero()) {
1815 // Restrict this fold to single-use 'and' (PR10267).
1816 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1817 if (C2->isSignMask()) {
1818 Constant *Zero = Constant::getNullValue(X->getType());
1819 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1820 return new ICmpInst(NewPred, X, Zero);
1821 }
1822
1823 APInt NewC2 = *C2;
1824 KnownBits Know = computeKnownBits(And->getOperand(0), And);
1825 // Set high zeros of C2 to allow matching negated power-of-2.
1826 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1827 Know.countMinLeadingZeros());
1828
1829 // Restrict this fold only for single-use 'and' (PR10267).
1830 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1831 if (NewC2.isNegatedPowerOf2()) {
1832 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1833 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1834 return new ICmpInst(NewPred, X, NegBOC);
1835 }
1836 }
1837
1838 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1839 // the input width without changing the value produced, eliminate the cast:
1840 //
1841 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1842 //
1843 // We can do this transformation if the constants do not have their sign bits
1844 // set or if it is an equality comparison. Extending a relational comparison
1845 // when we're checking the sign bit would not work.
1846 Value *W;
1847 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1848 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1849 // TODO: Is this a good transform for vectors? Wider types may reduce
1850 // throughput. Should this transform be limited (even for scalars) by using
1851 // shouldChangeType()?
1852 if (!Cmp.getType()->isVectorTy()) {
1853 Type *WideType = W->getType();
1854 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1855 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1856 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1857 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1858 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1859 }
1860 }
1861
1862 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1863 return I;
1864
1865 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1866 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1867 //
1868 // iff pred isn't signed
1869 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1870 match(And->getOperand(1), m_One())) {
1871 Constant *One = cast<Constant>(And->getOperand(1));
1872 Value *Or = And->getOperand(0);
1873 Value *A, *B, *LShr;
1874 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1875 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1876 unsigned UsesRemoved = 0;
1877 if (And->hasOneUse())
1878 ++UsesRemoved;
1879 if (Or->hasOneUse())
1880 ++UsesRemoved;
1881 if (LShr->hasOneUse())
1882 ++UsesRemoved;
1883
1884 // Compute A & ((1 << B) | 1)
1885 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1886 if (UsesRemoved >= RequireUsesRemoved) {
1887 Value *NewOr =
1888 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1889 /*HasNUW=*/true),
1890 One, Or->getName());
1891 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1892 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1893 }
1894 }
1895 }
1896
1897 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1898 // llvm.is.fpclass(X, fcInf|fcNan)
1899 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1900 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1901 // (icmp eq (and (bitcast X to int), ExponentMask), 0) -->
1902 // llvm.is.fpclass(X, fcSubnormal|fcZero)
1903 // (icmp ne (and (bitcast X to int), ExponentMask), 0) -->
1904 // llvm.is.fpclass(X, ~(fcSubnormal|fcZero))
1905 Value *V;
1906 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1907 Attribute::NoImplicitFloat) &&
1908 Cmp.isEquality() &&
1910 Type *FPType = V->getType()->getScalarType();
1911 if (FPType->isIEEELikeFPTy() && (C1.isZero() || C1 == *C2)) {
1912 APInt ExponentMask =
1913 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1914 if (*C2 == ExponentMask) {
1915 unsigned Mask = C1.isZero()
1918 if (isICMP_NE)
1919 Mask = ~Mask & fcAllFlags;
1920 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1921 }
1922 }
1923 }
1924
1925 return nullptr;
1926}
1927
1928/// Fold icmp (and X, Y), C.
1931 const APInt &C) {
1932 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1933 return I;
1934
1935 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1936 bool TrueIfNeg;
1937 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1938 // ((X - 1) & ~X) < 0 --> X == 0
1939 // ((X - 1) & ~X) >= 0 --> X != 0
1940 Value *X;
1941 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1942 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1943 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1944 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1945 }
1946 // (X & -X) < 0 --> X == MinSignedC
1947 // (X & -X) > -1 --> X != MinSignedC
1948 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1949 Constant *MinSignedC = ConstantInt::get(
1950 X->getType(),
1951 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1952 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1953 return new ICmpInst(NewPred, X, MinSignedC);
1954 }
1955 }
1956
1957 // TODO: These all require that Y is constant too, so refactor with the above.
1958
1959 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1960 Value *X = And->getOperand(0);
1961 Value *Y = And->getOperand(1);
1962 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1963 if (auto *LI = dyn_cast<LoadInst>(X))
1964 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1965 if (Instruction *Res = foldCmpLoadFromIndexedGlobal(LI, GEP, Cmp, C2))
1966 return Res;
1967
1968 if (!Cmp.isEquality())
1969 return nullptr;
1970
1971 // X & -C == -C -> X > u ~C
1972 // X & -C != -C -> X <= u ~C
1973 // iff C is a power of 2
1974 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1975 auto NewPred =
1977 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1978 }
1979
1980 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1981 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1982 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1983 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1985 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1986 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1987 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1988 Value *And = Builder.CreateAnd(TruncY, X);
1990 }
1991 return BinaryOperator::CreateAnd(TruncY, X);
1992 }
1993
1994 // (icmp eq/ne (and (shl -1, X), Y), 0)
1995 // -> (icmp eq/ne (lshr Y, X), 0)
1996 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1997 // highly unlikely the non-zero case will ever show up in code.
1998 if (C.isZero() &&
2000 m_Value(Y))))) {
2001 Value *LShr = Builder.CreateLShr(Y, X);
2002 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
2003 }
2004
2005 // (icmp eq/ne (and (add A, Addend), Msk), C)
2006 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2007 {
2008 Value *A;
2009 const APInt *Addend, *Msk;
2011 m_LowBitMask(Msk)))) &&
2012 C.ule(*Msk)) {
2013 APInt NewComperand = (C - *Addend) & *Msk;
2014 Value *MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2015 return new ICmpInst(Pred, MaskA,
2016 ConstantInt::get(MaskA->getType(), NewComperand));
2017 }
2018 }
2019
2020 return nullptr;
2021}
2022
2023/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2025 InstCombiner::BuilderTy &Builder) {
2026 // Are we using xors or subs to bitwise check for a pair or pairs of
2027 // (in)equalities? Convert to a shorter form that has more potential to be
2028 // folded even further.
2029 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2030 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2031 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2032 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2033 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2034 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2036 SmallVector<Value *, 16> WorkList(1, Or);
2037
2038 while (!WorkList.empty()) {
2039 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2040 Value *Lhs, *Rhs;
2041
2042 if (match(OrOperatorArgument,
2043 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2044 CmpValues.emplace_back(Lhs, Rhs);
2045 return;
2046 }
2047
2048 if (match(OrOperatorArgument,
2049 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2050 CmpValues.emplace_back(Lhs, Rhs);
2051 return;
2052 }
2053
2054 WorkList.push_back(OrOperatorArgument);
2055 };
2056
2057 Value *CurrentValue = WorkList.pop_back_val();
2058 Value *OrOperatorLhs, *OrOperatorRhs;
2059
2060 if (!match(CurrentValue,
2061 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2062 return nullptr;
2063 }
2064
2065 MatchOrOperatorArgument(OrOperatorRhs);
2066 MatchOrOperatorArgument(OrOperatorLhs);
2067 }
2068
2069 ICmpInst::Predicate Pred = Cmp.getPredicate();
2070 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2071 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2072 CmpValues.rbegin()->second);
2073
2074 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2075 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2076 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2077 }
2078
2079 return LhsCmp;
2080}
2081
2082/// Fold icmp (or X, Y), C.
2085 const APInt &C) {
2086 ICmpInst::Predicate Pred = Cmp.getPredicate();
2087 if (C.isOne()) {
2088 // icmp slt signum(V) 1 --> icmp slt V, 1
2089 Value *V = nullptr;
2090 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2091 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2092 ConstantInt::get(V->getType(), 1));
2093 }
2094
2095 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2096
2097 // (icmp eq/ne (or disjoint x, C0), C1)
2098 // -> (icmp eq/ne x, C0^C1)
2099 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2100 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2101 Value *NewC =
2102 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2103 return new ICmpInst(Pred, OrOp0, NewC);
2104 }
2105
2106 const APInt *MaskC;
2107 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2108 if (*MaskC == C && (C + 1).isPowerOf2()) {
2109 // X | C == C --> X <=u C
2110 // X | C != C --> X >u C
2111 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2113 return new ICmpInst(Pred, OrOp0, OrOp1);
2114 }
2115
2116 // More general: canonicalize 'equality with set bits mask' to
2117 // 'equality with clear bits mask'.
2118 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2119 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2120 if (Or->hasOneUse()) {
2121 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2122 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2123 return new ICmpInst(Pred, And, NewC);
2124 }
2125 }
2126
2127 // (X | (X-1)) s< 0 --> X s< 1
2128 // (X | (X-1)) s> -1 --> X s> 0
2129 Value *X;
2130 bool TrueIfSigned;
2131 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2133 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2134 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2135 return new ICmpInst(NewPred, X, NewC);
2136 }
2137
2138 const APInt *OrC;
2139 // icmp(X | OrC, C) --> icmp(X, 0)
2140 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2141 switch (Pred) {
2142 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2143 case ICmpInst::ICMP_SLT:
2144 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2145 case ICmpInst::ICMP_SGE:
2146 if (OrC->sge(C))
2147 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2148 break;
2149 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2150 case ICmpInst::ICMP_SLE:
2151 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2152 case ICmpInst::ICMP_SGT:
2153 if (OrC->sgt(C))
2155 ConstantInt::getNullValue(X->getType()));
2156 break;
2157 default:
2158 break;
2159 }
2160 }
2161
2162 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2163 return nullptr;
2164
2165 Value *P, *Q;
2167 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2168 // -> and (icmp eq P, null), (icmp eq Q, null).
2169 Value *CmpP =
2170 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2171 Value *CmpQ =
2172 Builder.CreateICmp(Pred, Q, ConstantInt::getNullValue(Q->getType()));
2173 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2174 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2175 }
2176
2177 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2178 return replaceInstUsesWith(Cmp, V);
2179
2180 return nullptr;
2181}
2182
2183/// Fold icmp (mul X, Y), C.
2186 const APInt &C) {
2187 ICmpInst::Predicate Pred = Cmp.getPredicate();
2188 Type *MulTy = Mul->getType();
2189 Value *X = Mul->getOperand(0);
2190
2191 // If comparing a square with a constant, try simplifying to comparing square
2192 // roots.
2193 if (X == Mul->getOperand(1) && !Cmp.isSigned()) {
2194 APInt R = C.sqrtFloor();
2195 bool IsSqr = C == R * R;
2196
2197 // X * X eq/ne C
2198 if (Cmp.isEquality() &&
2199 (Mul->hasNoUnsignedWrap() || (Mul->hasNoSignedWrap() && C.isZero()))) {
2200
2201 // If constant is not a square, eq/ne is false/true respectively
2202 if (!IsSqr)
2203 return replaceInstUsesWith(
2204 Cmp,
2205 ConstantInt::getBool(Cmp.getType(), Pred == ICmpInst::ICMP_NE));
2206
2207 return new ICmpInst(Pred, X, ConstantInt::get(MulTy, R));
2208 }
2209
2210 // If the multiply does not wrap
2211 // X * X pred C --> X pred R
2212 if (Mul->hasNoUnsignedWrap()) {
2213
2214 if (IsSqr)
2215 return new ICmpInst(Pred, X, ConstantInt::get(MulTy, R));
2216
2217 // If C is not a square, we use floor/ceil of sqrt(C).
2218 //
2219 // If LT or LE, we need R to be an overestimate of sqrt(C),
2220 // then use the strict predicate (LT->LT, LE->LT).
2221 //
2222 // If GT or GE, we need R to be an underestimate of sqrt(C),
2223 // then use the strict predicate (GT->GT, GE->GT).
2224 //
2225 // R is already an underestimate of sqrt(C) due to sqrtFloor.
2226 if (ICmpInst::isLT(Pred) || ICmpInst::isLE(Pred))
2227 ++R;
2228
2229 return new ICmpInst(Cmp.getStrictPredicate(), X,
2230 ConstantInt::get(MulTy, R));
2231 }
2232 }
2233
2234 const APInt *MulC;
2235 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2236 return nullptr;
2237
2238 // If this is a test of the sign bit and the multiply is sign-preserving with
2239 // a constant operand, use the multiply LHS operand instead:
2240 // (X * +MulC) < 0 --> X < 0
2241 // (X * -MulC) < 0 --> X > 0
2242 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2243 if (MulC->isNegative())
2244 Pred = ICmpInst::getSwappedPredicate(Pred);
2245 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2246 }
2247
2248 if (MulC->isZero())
2249 return nullptr;
2250
2251 // If the multiply does not wrap or the constant is odd, try to divide the
2252 // compare constant by the multiplication factor.
2253 if (Cmp.isEquality()) {
2254 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2255 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2256 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2257 return new ICmpInst(Pred, X, NewC);
2258 }
2259
2260 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2261 // correct to transform if MulC * N == C including overflow. I.e with i8
2262 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2263 // miss that case.
2264 if (C.urem(*MulC).isZero()) {
2265 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2266 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2267 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2268 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2269 return new ICmpInst(Pred, X, NewC);
2270 }
2271 }
2272 }
2273
2274 // With a matching no-overflow guarantee, fold the constants:
2275 // (X * MulC) < C --> X < (C / MulC)
2276 // (X * MulC) > C --> X > (C / MulC)
2277 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2278 Constant *NewC = nullptr;
2279 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2280 // MININT / -1 --> overflow.
2281 if (C.isMinSignedValue() && MulC->isAllOnes())
2282 return nullptr;
2283 if (MulC->isNegative())
2284 Pred = ICmpInst::getSwappedPredicate(Pred);
2285
2286 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2287 NewC = ConstantInt::get(
2289 } else {
2290 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2291 "Unexpected predicate");
2292 NewC = ConstantInt::get(
2294 }
2295 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2296 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2297 NewC = ConstantInt::get(
2299 } else {
2300 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2301 "Unexpected predicate");
2302 NewC = ConstantInt::get(
2304 }
2305 }
2306
2307 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2308}
2309
2310/// Fold icmp (shl nuw C2, Y), C.
2312 const APInt &C) {
2313 Value *Y;
2314 const APInt *C2;
2315 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2316 return nullptr;
2317
2318 Type *ShiftType = Shl->getType();
2319 unsigned TypeBits = C.getBitWidth();
2320 ICmpInst::Predicate Pred = Cmp.getPredicate();
2321 if (Cmp.isUnsigned()) {
2322 if (C2->isZero() || C2->ugt(C))
2323 return nullptr;
2324 APInt Div, Rem;
2325 APInt::udivrem(C, *C2, Div, Rem);
2326 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2327
2328 // (1 << Y) pred C -> Y pred Log2(C)
2329 if (!CIsPowerOf2) {
2330 // (1 << Y) < 30 -> Y <= 4
2331 // (1 << Y) <= 30 -> Y <= 4
2332 // (1 << Y) >= 30 -> Y > 4
2333 // (1 << Y) > 30 -> Y > 4
2334 if (Pred == ICmpInst::ICMP_ULT)
2335 Pred = ICmpInst::ICMP_ULE;
2336 else if (Pred == ICmpInst::ICMP_UGE)
2337 Pred = ICmpInst::ICMP_UGT;
2338 }
2339
2340 unsigned CLog2 = Div.logBase2();
2341 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2342 } else if (Cmp.isSigned() && C2->isOne()) {
2343 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2344 // (1 << Y) > 0 -> Y != 31
2345 // (1 << Y) > C -> Y != 31 if C is negative.
2346 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2347 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2348
2349 // (1 << Y) < 0 -> Y == 31
2350 // (1 << Y) < 1 -> Y == 31
2351 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2352 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2353 if (Pred == ICmpInst::ICMP_SLT && (C - 1).sle(0))
2354 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2355 }
2356
2357 return nullptr;
2358}
2359
2360/// Fold icmp (shl X, Y), C.
2362 BinaryOperator *Shl,
2363 const APInt &C) {
2364 const APInt *ShiftVal;
2365 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2366 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2367
2368 ICmpInst::Predicate Pred = Cmp.getPredicate();
2369 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2370 // -> (icmp pred X, Csle0)
2371 //
2372 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2373 // so X's must be what is used.
2374 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2375 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2376
2377 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2378 // -> (icmp eq/ne X, 0)
2379 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2380 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2381 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2382
2383 // (icmp slt (shl nsw X, Y), 0/1)
2384 // -> (icmp slt X, 0/1)
2385 // (icmp sgt (shl nsw X, Y), 0/-1)
2386 // -> (icmp sgt X, 0/-1)
2387 //
2388 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2389 if (Shl->hasNoSignedWrap() &&
2390 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2391 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2392 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2393
2394 const APInt *ShiftAmt;
2395 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2396 return foldICmpShlLHSC(Cmp, Shl, C);
2397
2398 // Check that the shift amount is in range. If not, don't perform undefined
2399 // shifts. When the shift is visited, it will be simplified.
2400 unsigned TypeBits = C.getBitWidth();
2401 if (ShiftAmt->uge(TypeBits))
2402 return nullptr;
2403
2404 Value *X = Shl->getOperand(0);
2405 Type *ShType = Shl->getType();
2406
2407 // NSW guarantees that we are only shifting out sign bits from the high bits,
2408 // so we can ASHR the compare constant without needing a mask and eliminate
2409 // the shift.
2410 if (Shl->hasNoSignedWrap()) {
2411 if (Pred == ICmpInst::ICMP_SGT) {
2412 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2413 APInt ShiftedC = C.ashr(*ShiftAmt);
2414 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2415 }
2416 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2417 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2418 APInt ShiftedC = C.ashr(*ShiftAmt);
2419 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2420 }
2421 if (Pred == ICmpInst::ICMP_SLT) {
2422 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2423 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2424 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2425 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2426 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2427 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2428 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2429 }
2430 }
2431
2432 // NUW guarantees that we are only shifting out zero bits from the high bits,
2433 // so we can LSHR the compare constant without needing a mask and eliminate
2434 // the shift.
2435 if (Shl->hasNoUnsignedWrap()) {
2436 if (Pred == ICmpInst::ICMP_UGT) {
2437 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2438 APInt ShiftedC = C.lshr(*ShiftAmt);
2439 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2440 }
2441 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2442 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2443 APInt ShiftedC = C.lshr(*ShiftAmt);
2444 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2445 }
2446 if (Pred == ICmpInst::ICMP_ULT) {
2447 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2448 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2449 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2450 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2451 assert(C.ugt(0) && "ult 0 should have been eliminated");
2452 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2453 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2454 }
2455 }
2456
2457 if (Cmp.isEquality() && Shl->hasOneUse()) {
2458 // Strength-reduce the shift into an 'and'.
2459 Constant *Mask = ConstantInt::get(
2460 ShType,
2461 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2462 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2463 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2464 return new ICmpInst(Pred, And, LShrC);
2465 }
2466
2467 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2468 bool TrueIfSigned = false;
2469 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2470 // (X << 31) <s 0 --> (X & 1) != 0
2471 Constant *Mask = ConstantInt::get(
2472 ShType,
2473 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2474 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2475 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2476 And, Constant::getNullValue(ShType));
2477 }
2478
2479 // Simplify 'shl' inequality test into 'and' equality test.
2480 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2481 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2482 if ((C + 1).isPowerOf2() &&
2483 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2484 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2485 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2487 And, Constant::getNullValue(ShType));
2488 }
2489 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2490 if (C.isPowerOf2() &&
2491 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2492 Value *And =
2493 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2494 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2496 And, Constant::getNullValue(ShType));
2497 }
2498 }
2499
2500 // Transform (icmp pred iM (shl iM %v, N), C)
2501 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2502 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2503 // This enables us to get rid of the shift in favor of a trunc that may be
2504 // free on the target. It has the additional benefit of comparing to a
2505 // smaller constant that may be more target-friendly.
2506 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2507 if (Shl->hasOneUse() && Amt != 0 &&
2508 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2509 ICmpInst::Predicate CmpPred = Pred;
2510 APInt RHSC = C;
2511
2512 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2513 // Try the flipped strictness predicate.
2514 // e.g.:
2515 // icmp ult i64 (shl X, 32), 8589934593 ->
2516 // icmp ule i64 (shl X, 32), 8589934592 ->
2517 // icmp ule i32 (trunc X, i32), 2 ->
2518 // icmp ult i32 (trunc X, i32), 3
2519 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2520 Pred, ConstantInt::get(ShType->getContext(), C))) {
2521 CmpPred = FlippedStrictness->first;
2522 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2523 }
2524 }
2525
2526 if (RHSC.countr_zero() >= Amt) {
2527 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2528 Constant *NewC =
2529 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2530 return new ICmpInst(CmpPred,
2531 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2532 Shl->hasNoSignedWrap()),
2533 NewC);
2534 }
2535 }
2536
2537 return nullptr;
2538}
2539
2540/// Fold icmp ({al}shr X, Y), C.
2542 BinaryOperator *Shr,
2543 const APInt &C) {
2544 // An exact shr only shifts out zero bits, so:
2545 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2546 Value *X = Shr->getOperand(0);
2547 CmpInst::Predicate Pred = Cmp.getPredicate();
2548 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2549 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2550
2551 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2552 const APInt *ShiftValC;
2553 if (match(X, m_APInt(ShiftValC))) {
2554 if (Cmp.isEquality())
2555 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2556
2557 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2558 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2559 bool TrueIfSigned;
2560 if (!IsAShr && ShiftValC->isNegative() &&
2561 isSignBitCheck(Pred, C, TrueIfSigned))
2562 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2563 Shr->getOperand(1),
2564 ConstantInt::getNullValue(X->getType()));
2565
2566 // If the shifted constant is a power-of-2, test the shift amount directly:
2567 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2568 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2569 if (!IsAShr && ShiftValC->isPowerOf2() &&
2570 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2571 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2572 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2573 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2574
2575 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2576 unsigned ShiftLZ = ShiftValC->countl_zero();
2577 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2578 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2579 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2580 }
2581 }
2582
2583 const APInt *ShiftAmtC;
2584 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2585 return nullptr;
2586
2587 // Check that the shift amount is in range. If not, don't perform undefined
2588 // shifts. When the shift is visited it will be simplified.
2589 unsigned TypeBits = C.getBitWidth();
2590 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2591 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2592 return nullptr;
2593
2594 bool IsExact = Shr->isExact();
2595 Type *ShrTy = Shr->getType();
2596 // TODO: If we could guarantee that InstSimplify would handle all of the
2597 // constant-value-based preconditions in the folds below, then we could assert
2598 // those conditions rather than checking them. This is difficult because of
2599 // undef/poison (PR34838).
2600 if (IsAShr && Shr->hasOneUse()) {
2601 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2602 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2603 // When C - 1 is a power of two and the transform can be legally
2604 // performed, prefer this form so the produced constant is close to a
2605 // power of two.
2606 // icmp slt/ult (ashr exact X, ShAmtC), C
2607 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2608 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2609 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2610 }
2611 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2612 // When ShAmtC can be shifted losslessly:
2613 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2614 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2615 APInt ShiftedC = C.shl(ShAmtVal);
2616 if (ShiftedC.ashr(ShAmtVal) == C)
2617 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2618 }
2619 if (Pred == CmpInst::ICMP_SGT) {
2620 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2621 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2622 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2623 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2624 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2625 }
2626 if (Pred == CmpInst::ICMP_UGT) {
2627 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2628 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2629 // clause accounts for that pattern.
2630 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2631 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2632 (C + 1).shl(ShAmtVal).isMinSignedValue())
2633 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2634 }
2635
2636 // If the compare constant has significant bits above the lowest sign-bit,
2637 // then convert an unsigned cmp to a test of the sign-bit:
2638 // (ashr X, ShiftC) u> C --> X s< 0
2639 // (ashr X, ShiftC) u< C --> X s> -1
2640 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2641 if (Pred == CmpInst::ICMP_UGT) {
2642 return new ICmpInst(CmpInst::ICMP_SLT, X,
2644 }
2645 if (Pred == CmpInst::ICMP_ULT) {
2646 return new ICmpInst(CmpInst::ICMP_SGT, X,
2648 }
2649 }
2650 } else if (!IsAShr) {
2651 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2652 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2653 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2654 APInt ShiftedC = C.shl(ShAmtVal);
2655 if (ShiftedC.lshr(ShAmtVal) == C)
2656 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2657 }
2658 if (Pred == CmpInst::ICMP_UGT) {
2659 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2660 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2661 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2662 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2663 }
2664 }
2665
2666 if (!Cmp.isEquality())
2667 return nullptr;
2668
2669 // Handle equality comparisons of shift-by-constant.
2670
2671 // If the comparison constant changes with the shift, the comparison cannot
2672 // succeed (bits of the comparison constant cannot match the shifted value).
2673 // This should be known by InstSimplify and already be folded to true/false.
2674 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2675 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2676 "Expected icmp+shr simplify did not occur.");
2677
2678 // If the bits shifted out are known zero, compare the unshifted value:
2679 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2680 if (Shr->isExact())
2681 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2682
2683 if (Shr->hasOneUse()) {
2684 // Canonicalize the shift into an 'and':
2685 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2686 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2687 Constant *Mask = ConstantInt::get(ShrTy, Val);
2688 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2689 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2690 }
2691
2692 return nullptr;
2693}
2694
2696 BinaryOperator *SRem,
2697 const APInt &C) {
2698 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2699 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2700 // Canonicalize unsigned predicates to signed:
2701 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2702 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2703 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2704 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2705
2706 const APInt *DivisorC;
2707 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2708 return nullptr;
2709 if (DivisorC->isZero())
2710 return nullptr;
2711
2712 APInt NormalizedC = C;
2713 if (Pred == ICmpInst::ICMP_ULT) {
2714 assert(!NormalizedC.isZero() &&
2715 "ult X, 0 should have been simplified already.");
2716 --NormalizedC;
2717 }
2718 if (C.isNegative())
2719 NormalizedC.flipAllBits();
2720 if (!NormalizedC.uge(DivisorC->abs() - 1))
2721 return nullptr;
2722
2723 Type *Ty = SRem->getType();
2724 if (Pred == ICmpInst::ICMP_UGT)
2725 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2727 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2729 }
2730 // Match an 'is positive' or 'is negative' comparison of remainder by a
2731 // constant power-of-2 value:
2732 // (X % pow2C) sgt/slt 0
2733 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2734 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2735 return nullptr;
2736
2737 // TODO: The one-use check is standard because we do not typically want to
2738 // create longer instruction sequences, but this might be a special-case
2739 // because srem is not good for analysis or codegen.
2740 if (!SRem->hasOneUse())
2741 return nullptr;
2742
2743 const APInt *DivisorC;
2744 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2745 return nullptr;
2746
2747 // For cmp_sgt/cmp_slt only zero valued C is handled.
2748 // For cmp_eq/cmp_ne only positive valued C is handled.
2749 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2750 !C.isZero()) ||
2751 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2752 !C.isStrictlyPositive()))
2753 return nullptr;
2754
2755 // Mask off the sign bit and the modulo bits (low-bits).
2756 Type *Ty = SRem->getType();
2757 APInt SignMask = APInt::getSignMask(Ty->getScalarSizeInBits());
2758 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2759 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2760
2761 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2762 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2763
2764 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2765 // bit is set. Example:
2766 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2767 if (Pred == ICmpInst::ICMP_SGT)
2769
2770 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2771 // bit is set. Example:
2772 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2773 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2774}
2775
2776/// Fold icmp (udiv X, Y), C.
2778 BinaryOperator *UDiv,
2779 const APInt &C) {
2780 ICmpInst::Predicate Pred = Cmp.getPredicate();
2781 Value *X = UDiv->getOperand(0);
2782 Value *Y = UDiv->getOperand(1);
2783 Type *Ty = UDiv->getType();
2784
2785 const APInt *C2;
2786 if (!match(X, m_APInt(C2)))
2787 return nullptr;
2788
2789 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2790
2791 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2792 if (Pred == ICmpInst::ICMP_UGT) {
2793 assert(!C.isMaxValue() &&
2794 "icmp ugt X, UINT_MAX should have been simplified already.");
2795 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2796 ConstantInt::get(Ty, C2->udiv(C + 1)));
2797 }
2798
2799 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2800 if (Pred == ICmpInst::ICMP_ULT) {
2801 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2802 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2803 ConstantInt::get(Ty, C2->udiv(C)));
2804 }
2805
2806 return nullptr;
2807}
2808
2809/// Fold icmp ({su}div X, Y), C.
2811 BinaryOperator *Div,
2812 const APInt &C) {
2813 ICmpInst::Predicate Pred = Cmp.getPredicate();
2814 Value *X = Div->getOperand(0);
2815 Value *Y = Div->getOperand(1);
2816 Type *Ty = Div->getType();
2817 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2818
2819 // If unsigned division and the compare constant is bigger than
2820 // UMAX/2 (negative), there's only one pair of values that satisfies an
2821 // equality check, so eliminate the division:
2822 // (X u/ Y) == C --> (X == C) && (Y == 1)
2823 // (X u/ Y) != C --> (X != C) || (Y != 1)
2824 // Similarly, if signed division and the compare constant is exactly SMIN:
2825 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2826 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2827 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2828 (!DivIsSigned || C.isMinSignedValue())) {
2829 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2830 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2831 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2832 return BinaryOperator::Create(Logic, XBig, YOne);
2833 }
2834
2835 // Fold: icmp pred ([us]div X, C2), C -> range test
2836 // Fold this div into the comparison, producing a range check.
2837 // Determine, based on the divide type, what the range is being
2838 // checked. If there is an overflow on the low or high side, remember
2839 // it, otherwise compute the range [low, hi) bounding the new value.
2840 // See: InsertRangeTest above for the kinds of replacements possible.
2841 const APInt *C2;
2842 if (!match(Y, m_APInt(C2)))
2843 return nullptr;
2844
2845 // FIXME: If the operand types don't match the type of the divide
2846 // then don't attempt this transform. The code below doesn't have the
2847 // logic to deal with a signed divide and an unsigned compare (and
2848 // vice versa). This is because (x /s C2) <s C produces different
2849 // results than (x /s C2) <u C or (x /u C2) <s C or even
2850 // (x /u C2) <u C. Simply casting the operands and result won't
2851 // work. :( The if statement below tests that condition and bails
2852 // if it finds it.
2853 // However, when the divisor is a positive constant and the dividend is
2854 // known non-negative, sdiv is equivalent to udiv, so we can lower
2855 // DivIsSigned and proceed through the unsigned path.
2856 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned()) {
2857 if (!DivIsSigned || !C2->isStrictlyPositive() ||
2858 !isKnownNonNegative(X, SQ.getWithInstruction(&Cmp)))
2859 return nullptr;
2860 DivIsSigned = false;
2861 }
2862
2863 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2864 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2865 // division-by-constant cases should be present, we can not assert that they
2866 // have happened before we reach this icmp instruction.
2867 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2868 return nullptr;
2869
2870 // Compute Prod = C * C2. We are essentially solving an equation of
2871 // form X / C2 = C. We solve for X by multiplying C2 and C.
2872 // By solving for X, we can turn this into a range check instead of computing
2873 // a divide.
2874 APInt Prod = C * *C2;
2875
2876 // Determine if the product overflows by seeing if the product is not equal to
2877 // the divide. Make sure we do the same kind of divide as in the LHS
2878 // instruction that we're folding.
2879 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2880
2881 // If the division is known to be exact, then there is no remainder from the
2882 // divide, so the covered range size is unit, otherwise it is the divisor.
2883 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2884
2885 // Figure out the interval that is being checked. For example, a comparison
2886 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2887 // Compute this interval based on the constants involved and the signedness of
2888 // the compare/divide. This computes a half-open interval, keeping track of
2889 // whether either value in the interval overflows. After analysis each
2890 // overflow variable is set to 0 if it's corresponding bound variable is valid
2891 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2892 int LoOverflow = 0, HiOverflow = 0;
2893 APInt LoBound, HiBound;
2894
2895 if (!DivIsSigned) { // udiv
2896 // e.g. X/5 op 3 --> [15, 20)
2897 LoBound = Prod;
2898 HiOverflow = LoOverflow = ProdOV;
2899 if (!HiOverflow) {
2900 // If this is not an exact divide, then many values in the range collapse
2901 // to the same result value.
2902 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2903 }
2904 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2905 if (C.isZero()) { // (X / pos) op 0
2906 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2907 LoBound = -(RangeSize - 1);
2908 HiBound = RangeSize;
2909 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2910 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2911 HiOverflow = LoOverflow = ProdOV;
2912 if (!HiOverflow)
2913 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2914 } else { // (X / pos) op neg
2915 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2916 HiBound = Prod + 1;
2917 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2918 if (!LoOverflow) {
2919 APInt DivNeg = -RangeSize;
2920 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2921 }
2922 }
2923 } else if (C2->isNegative()) { // Divisor is < 0.
2924 if (Div->isExact())
2925 RangeSize.negate();
2926 if (C.isZero()) { // (X / neg) op 0
2927 // e.g. X/-5 op 0 --> [-4, 5)
2928 LoBound = RangeSize + 1;
2929 HiBound = -RangeSize;
2930 if (HiBound == *C2) { // -INTMIN = INTMIN
2931 HiOverflow = 1; // [INTMIN+1, overflow)
2932 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2933 }
2934 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2935 // e.g. X/-5 op 3 --> [-19, -14)
2936 HiBound = Prod + 1;
2937 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2938 if (!LoOverflow)
2939 LoOverflow =
2940 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2941 } else { // (X / neg) op neg
2942 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2943 LoOverflow = HiOverflow = ProdOV;
2944 if (!HiOverflow)
2945 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2946 }
2947
2948 // Dividing by a negative swaps the condition. LT <-> GT
2949 Pred = ICmpInst::getSwappedPredicate(Pred);
2950 }
2951
2952 switch (Pred) {
2953 default:
2954 llvm_unreachable("Unhandled icmp predicate!");
2955 case ICmpInst::ICMP_EQ:
2956 if (LoOverflow && HiOverflow)
2957 return replaceInstUsesWith(Cmp, Builder.getFalse());
2958 if (HiOverflow)
2959 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2960 X, ConstantInt::get(Ty, LoBound));
2961 if (LoOverflow)
2962 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2963 X, ConstantInt::get(Ty, HiBound));
2964 return replaceInstUsesWith(
2965 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2966 case ICmpInst::ICMP_NE:
2967 if (LoOverflow && HiOverflow)
2968 return replaceInstUsesWith(Cmp, Builder.getTrue());
2969 if (HiOverflow)
2970 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2971 X, ConstantInt::get(Ty, LoBound));
2972 if (LoOverflow)
2973 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2974 X, ConstantInt::get(Ty, HiBound));
2975 return replaceInstUsesWith(
2976 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2977 case ICmpInst::ICMP_ULT:
2978 case ICmpInst::ICMP_SLT:
2979 if (LoOverflow == +1) // Low bound is greater than input range.
2980 return replaceInstUsesWith(Cmp, Builder.getTrue());
2981 if (LoOverflow == -1) // Low bound is less than input range.
2982 return replaceInstUsesWith(Cmp, Builder.getFalse());
2983 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2984 case ICmpInst::ICMP_UGT:
2985 case ICmpInst::ICMP_SGT:
2986 if (HiOverflow == +1) // High bound greater than input range.
2987 return replaceInstUsesWith(Cmp, Builder.getFalse());
2988 if (HiOverflow == -1) // High bound less than input range.
2989 return replaceInstUsesWith(Cmp, Builder.getTrue());
2990 if (Pred == ICmpInst::ICMP_UGT)
2991 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2992 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2993 }
2994
2995 return nullptr;
2996}
2997
2998/// Fold icmp (sub X, Y), C.
3001 const APInt &C) {
3002 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
3003 ICmpInst::Predicate Pred = Cmp.getPredicate();
3004 Type *Ty = Sub->getType();
3005
3006 // (SubC - Y) == C) --> Y == (SubC - C)
3007 // (SubC - Y) != C) --> Y != (SubC - C)
3008 Constant *SubC;
3009 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
3010 return new ICmpInst(Pred, Y,
3011 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
3012 }
3013
3014 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
3015 const APInt *C2;
3016 APInt SubResult;
3017 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
3018 bool HasNSW = Sub->hasNoSignedWrap();
3019 bool HasNUW = Sub->hasNoUnsignedWrap();
3020 if (match(X, m_APInt(C2)) &&
3021 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
3022 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
3023 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
3024
3025 // X - Y == 0 --> X == Y.
3026 // X - Y != 0 --> X != Y.
3027 // TODO: We allow this with multiple uses as long as the other uses are not
3028 // in phis. The phi use check is guarding against a codegen regression
3029 // for a loop test. If the backend could undo this (and possibly
3030 // subsequent transforms), we would not need this hack.
3031 if (Cmp.isEquality() && C.isZero() &&
3032 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
3033 return new ICmpInst(Pred, X, Y);
3034
3035 // The following transforms are only worth it if the only user of the subtract
3036 // is the icmp.
3037 // TODO: This is an artificial restriction for all of the transforms below
3038 // that only need a single replacement icmp. Can these use the phi test
3039 // like the transform above here?
3040 if (!Sub->hasOneUse())
3041 return nullptr;
3042
3043 if (Sub->hasNoSignedWrap()) {
3044 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3045 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3046 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3047
3048 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3049 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3050 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3051
3052 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3053 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3054 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3055
3056 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3057 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3058 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3059 }
3060
3061 if (!match(X, m_APInt(C2)))
3062 return nullptr;
3063
3064 // C2 - Y <u C -> (Y | (C - 1)) == C2
3065 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3066 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3067 (*C2 & (C - 1)) == (C - 1))
3068 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3069
3070 // C2 - Y >u C -> (Y | C) != C2
3071 // iff C2 & C == C and C + 1 is a power of 2
3072 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3073 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3074
3075 // We have handled special cases that reduce.
3076 // Canonicalize any remaining sub to add as:
3077 // (C2 - Y) > C --> (Y + ~C2) < ~C
3078 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3079 HasNUW, HasNSW);
3080 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3081}
3082
3083static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3084 Value *Op1, IRBuilderBase &Builder,
3085 bool HasOneUse) {
3086 auto FoldConstant = [&](bool Val) {
3087 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3088 if (Op0->getType()->isVectorTy())
3090 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3091 return Res;
3092 };
3093
3094 switch (Table.to_ulong()) {
3095 case 0: // 0 0 0 0
3096 return FoldConstant(false);
3097 case 1: // 0 0 0 1
3098 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3099 case 2: // 0 0 1 0
3100 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3101 case 3: // 0 0 1 1
3102 return Builder.CreateNot(Op0);
3103 case 4: // 0 1 0 0
3104 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3105 case 5: // 0 1 0 1
3106 return Builder.CreateNot(Op1);
3107 case 6: // 0 1 1 0
3108 return Builder.CreateXor(Op0, Op1);
3109 case 7: // 0 1 1 1
3110 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3111 case 8: // 1 0 0 0
3112 return Builder.CreateAnd(Op0, Op1);
3113 case 9: // 1 0 0 1
3114 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3115 case 10: // 1 0 1 0
3116 return Op1;
3117 case 11: // 1 0 1 1
3118 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3119 case 12: // 1 1 0 0
3120 return Op0;
3121 case 13: // 1 1 0 1
3122 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3123 case 14: // 1 1 1 0
3124 return Builder.CreateOr(Op0, Op1);
3125 case 15: // 1 1 1 1
3126 return FoldConstant(true);
3127 default:
3128 llvm_unreachable("Invalid Operation");
3129 }
3130 return nullptr;
3131}
3132
3134 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3135 Value *A, *B;
3136 Constant *C1, *C2, *C3, *C4;
3137 if (!match(BO->getOperand(0),
3139 !match(BO->getOperand(1),
3141 Cmp.getType() != A->getType() || Cmp.getType() != B->getType())
3142 return nullptr;
3143
3144 std::bitset<4> Table;
3145 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3146 Constant *L = First ? C1 : C2;
3147 Constant *R = Second ? C3 : C4;
3148 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3149 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3150 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3151 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3152 }
3153 return std::nullopt;
3154 };
3155
3156 for (unsigned I = 0; I < 4; ++I) {
3157 bool First = (I >> 1) & 1;
3158 bool Second = I & 1;
3159 if (auto Res = ComputeTable(First, Second))
3160 Table[I] = *Res;
3161 else
3162 return nullptr;
3163 }
3164
3165 // Synthesize optimal logic.
3166 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3167 return replaceInstUsesWith(Cmp, Cond);
3168 return nullptr;
3169}
3170
3171/// Fold icmp (add X, Y), C.
3174 const APInt &C) {
3175 Value *Y = Add->getOperand(1);
3176 Value *X = Add->getOperand(0);
3177 const CmpPredicate Pred = Cmp.getCmpPredicate();
3178
3179 // icmp ult (add nuw A, (lshr A, ShAmtC)), C --> icmp ult A, C
3180 // when C <= (1 << ShAmtC).
3181 const APInt *ShAmtC;
3182 Value *A;
3183 unsigned BitWidth = C.getBitWidth();
3184 if (Pred == ICmpInst::ICMP_ULT &&
3185 match(Add,
3186 m_c_NUWAdd(m_Value(A), m_LShr(m_Deferred(A), m_APInt(ShAmtC)))) &&
3187 ShAmtC->ult(BitWidth) &&
3188 C.ule(APInt::getOneBitSet(BitWidth, ShAmtC->getZExtValue())))
3189 return new ICmpInst(Pred, A, ConstantInt::get(A->getType(), C));
3190
3191 const APInt *C2;
3192 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3193 return nullptr;
3194
3195 // Fold icmp pred (add X, C2), C.
3196 Type *Ty = Add->getType();
3197
3198 // If the add does not wrap, we can always adjust the compare by subtracting
3199 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3200 // have been canonicalized to SGT/SLT/UGT/ULT.
3201 if (Add->hasNoUnsignedWrap() &&
3202 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT)) {
3203 bool Overflow;
3204 APInt NewC = C.usub_ov(*C2, Overflow);
3205 // If there is overflow, the result must be true or false.
3206 if (!Overflow)
3207 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3208 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3209 }
3210
3211 CmpInst::Predicate ChosenPred = Pred.getPreferredSignedPredicate();
3212
3213 if (Add->hasNoSignedWrap() &&
3214 (ChosenPred == ICmpInst::ICMP_SGT || ChosenPred == ICmpInst::ICMP_SLT)) {
3215 bool Overflow;
3216 APInt NewC = C.ssub_ov(*C2, Overflow);
3217 if (!Overflow)
3218 // icmp samesign ugt/ult (add nsw X, C2), C
3219 // -> icmp sgt/slt X, (C - C2)
3220 return new ICmpInst(ChosenPred, X, ConstantInt::get(Ty, NewC));
3221 }
3222
3223 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3224 C.isNonNegative() && (C - *C2).isNonNegative() &&
3225 computeConstantRange(X, /*ForSigned=*/true, SQ.getWithInstruction(&Cmp))
3226 .add(*C2)
3227 .isAllNonNegative())
3228 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3229 ConstantInt::get(Ty, C - *C2));
3230
3231 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3232 const APInt &Upper = CR.getUpper();
3233 const APInt &Lower = CR.getLower();
3234 if (Cmp.isSigned()) {
3235 if (Lower.isSignMask())
3236 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3237 if (Upper.isSignMask())
3238 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3239 } else {
3240 if (Lower.isMinValue())
3241 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3242 if (Upper.isMinValue())
3243 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3244 }
3245
3246 // This set of folds is intentionally placed after folds that use no-wrapping
3247 // flags because those folds are likely better for later analysis/codegen.
3248 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3249 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3250
3251 // Fold compare with offset to opposite sign compare if it eliminates offset:
3252 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3253 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3254 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3255
3256 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3257 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3258 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3259
3260 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3261 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3262 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3263
3264 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3265 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3266 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3267
3268 // (X + -1) <u C --> X <=u C (if X is never null)
3269 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3270 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3271 if (llvm::isKnownNonZero(X, Q))
3272 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3273 }
3274
3275 if (!Add->hasOneUse())
3276 return nullptr;
3277
3278 // X+C <u C2 -> (X & -C2) == C
3279 // iff C & (C2-1) == 0
3280 // C2 is a power of 2
3281 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3282 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3284
3285 // X+C2 <u C -> (X & C) == 2C
3286 // iff C == -(C2)
3287 // C2 is a power of 2
3288 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3289 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3290 ConstantInt::get(Ty, C * 2));
3291
3292 // X+C >u C2 -> (X & ~C2) != C
3293 // iff C & C2 == 0
3294 // C2+1 is a power of 2
3295 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3296 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3298
3299 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3300 // to the ult form.
3301 // X+C2 >u C -> X+(C2-C-1) <u ~C
3302 if (Pred == ICmpInst::ICMP_UGT)
3303 return new ICmpInst(ICmpInst::ICMP_ULT,
3304 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3305 ConstantInt::get(Ty, ~C));
3306
3307 // zext(V) + C2 pred C -> V + C3 pred' C4
3308 Value *V;
3309 if (match(X, m_ZExt(m_Value(V)))) {
3310 Type *NewCmpTy = V->getType();
3311 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3312 if (shouldChangeType(Ty, NewCmpTy)) {
3313 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3314 CmpInst::Predicate EquivPred;
3315 APInt EquivInt;
3316 APInt EquivOffset;
3317
3318 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3319 return new ICmpInst(
3320 EquivPred,
3321 EquivOffset.isZero()
3322 ? V
3323 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3324 ConstantInt::get(NewCmpTy, EquivInt));
3325 }
3326 }
3327
3328 return nullptr;
3329}
3330
3332 Value *&RHS, ConstantInt *&Less,
3333 ConstantInt *&Equal,
3334 ConstantInt *&Greater) {
3335 // TODO: Generalize this to work with other comparison idioms or ensure
3336 // they get canonicalized into this form.
3337
3338 // select i1 (a == b),
3339 // i32 Equal,
3340 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3341 // where Equal, Less and Greater are placeholders for any three constants.
3342 CmpPredicate PredA;
3343 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3344 !ICmpInst::isEquality(PredA))
3345 return false;
3346 Value *EqualVal = SI->getTrueValue();
3347 Value *UnequalVal = SI->getFalseValue();
3348 // We still can get non-canonical predicate here, so canonicalize.
3349 if (PredA == ICmpInst::ICMP_NE)
3350 std::swap(EqualVal, UnequalVal);
3351 if (!match(EqualVal, m_ConstantInt(Equal)))
3352 return false;
3353 CmpPredicate PredB;
3354 Value *LHS2, *RHS2;
3355 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3356 m_ConstantInt(Less), m_ConstantInt(Greater))))
3357 return false;
3358 // We can get predicate mismatch here, so canonicalize if possible:
3359 // First, ensure that 'LHS' match.
3360 if (LHS2 != LHS) {
3361 // x sgt y <--> y slt x
3362 std::swap(LHS2, RHS2);
3363 PredB = ICmpInst::getSwappedPredicate(PredB);
3364 }
3365 if (LHS2 != LHS)
3366 return false;
3367 // We also need to canonicalize 'RHS'.
3368 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3369 // x sgt C-1 <--> x sge C <--> not(x slt C)
3370 auto FlippedStrictness =
3372 if (!FlippedStrictness)
3373 return false;
3374 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3375 "basic correctness failure");
3376 RHS2 = FlippedStrictness->second;
3377 // And kind-of perform the result swap.
3378 std::swap(Less, Greater);
3379 PredB = ICmpInst::ICMP_SLT;
3380 }
3381 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3382}
3383
3386 ConstantInt *C) {
3387
3388 assert(C && "Cmp RHS should be a constant int!");
3389 // If we're testing a constant value against the result of a three way
3390 // comparison, the result can be expressed directly in terms of the
3391 // original values being compared. Note: We could possibly be more
3392 // aggressive here and remove the hasOneUse test. The original select is
3393 // really likely to simplify or sink when we remove a test of the result.
3394 Value *OrigLHS, *OrigRHS;
3395 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3396 if (Cmp.hasOneUse() &&
3397 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3398 C3GreaterThan)) {
3399 assert(C1LessThan && C2Equal && C3GreaterThan);
3400
3401 bool TrueWhenLessThan = ICmpInst::compare(
3402 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3403 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3404 Cmp.getPredicate());
3405 bool TrueWhenGreaterThan = ICmpInst::compare(
3406 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3407
3408 // This generates the new instruction that will replace the original Cmp
3409 // Instruction. Instead of enumerating the various combinations when
3410 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3411 // false, we rely on chaining of ORs and future passes of InstCombine to
3412 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3413
3414 // When none of the three constants satisfy the predicate for the RHS (C),
3415 // the entire original Cmp can be simplified to a false.
3416 Value *Cond = Builder.getFalse();
3417 if (TrueWhenLessThan)
3418 Cond = Builder.CreateOr(
3419 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3420 if (TrueWhenEqual)
3421 Cond = Builder.CreateOr(
3422 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3423 if (TrueWhenGreaterThan)
3424 Cond = Builder.CreateOr(
3425 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3426
3427 return replaceInstUsesWith(Cmp, Cond);
3428 }
3429 return nullptr;
3430}
3431
3433 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3434 if (!Bitcast)
3435 return nullptr;
3436
3437 ICmpInst::Predicate Pred = Cmp.getPredicate();
3438 Value *Op1 = Cmp.getOperand(1);
3439 Value *BCSrcOp = Bitcast->getOperand(0);
3440 Type *SrcType = Bitcast->getSrcTy();
3441 Type *DstType = Bitcast->getType();
3442
3443 // Make sure the bitcast doesn't change between scalar and vector and
3444 // doesn't change the number of vector elements.
3445 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3446 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3447 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3448 Value *X;
3449 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3450 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3451 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3452 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3453 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3454 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3455 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3456 match(Op1, m_Zero()))
3457 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3458
3459 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3460 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3461 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3462
3463 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3464 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3465 return new ICmpInst(Pred, X,
3466 ConstantInt::getAllOnesValue(X->getType()));
3467 }
3468
3469 // Zero-equality checks are preserved through unsigned floating-point casts:
3470 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3471 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3472 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3473 if (Cmp.isEquality() && match(Op1, m_Zero()))
3474 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3475
3476 const APInt *C;
3477 bool TrueIfSigned;
3478 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3479 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3480 // the FP extend/truncate because that cast does not change the sign-bit.
3481 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3482 // The sign-bit is always the most significant bit in those types.
3483 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3484 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3485 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3486 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3487 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3488 Type *XType = X->getType();
3489
3490 // We can't currently handle Power style floating point operations here.
3491 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3492 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3493 if (auto *XVTy = dyn_cast<VectorType>(XType))
3494 NewType = VectorType::get(NewType, XVTy->getElementCount());
3495 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3496 if (TrueIfSigned)
3497 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3498 ConstantInt::getNullValue(NewType));
3499 else
3500 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3502 }
3503 }
3504
3505 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3506 Type *FPType = SrcType->getScalarType();
3507 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3508 Attribute::NoImplicitFloat) &&
3509 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3510 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3511 if (Mask & (fcInf | fcZero)) {
3512 if (Pred == ICmpInst::ICMP_NE)
3513 Mask = ~Mask;
3514 return replaceInstUsesWith(Cmp,
3515 Builder.createIsFPClass(BCSrcOp, Mask));
3516 }
3517 }
3518 }
3519 }
3520
3521 const APInt *C;
3522 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3523 !SrcType->isIntOrIntVectorTy())
3524 return nullptr;
3525
3526 // If this is checking if all elements of a vector compare are set or not,
3527 // invert the casted vector equality compare and test if all compare
3528 // elements are clear or not. Compare against zero is generally easier for
3529 // analysis and codegen.
3530 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3531 // Example: are all elements equal? --> are zero elements not equal?
3532 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3533 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3534 if (Value *NotBCSrcOp =
3535 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3536 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3537 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3538 }
3539 }
3540
3541 // If this is checking if all elements of an extended vector are clear or not,
3542 // compare in a narrow type to eliminate the extend:
3543 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3544 Value *X;
3545 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3546 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3547 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3548 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3549 Value *NewCast = Builder.CreateBitCast(X, NewType);
3550 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3551 }
3552 }
3553
3554 // Folding: icmp <pred> iN X, C
3555 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3556 // and C is a splat of a K-bit pattern
3557 // and SC is a constant vector = <C', C', C', ..., C'>
3558 // Into:
3559 // %E = extractelement <M x iK> %vec, i32 C'
3560 // icmp <pred> iK %E, trunc(C)
3561 Value *Vec;
3562 ArrayRef<int> Mask;
3563 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3564 // Check whether every element of Mask is the same constant
3565 if (all_equal(Mask)) {
3566 auto *VecTy = cast<VectorType>(SrcType);
3567 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3568 if (C->isSplat(EltTy->getBitWidth())) {
3569 // Fold the icmp based on the value of C
3570 // If C is M copies of an iK sized bit pattern,
3571 // then:
3572 // => %E = extractelement <N x iK> %vec, i32 Elem
3573 // icmp <pred> iK %SplatVal, <pattern>
3574 Value *Elem = Builder.getInt32(Mask[0]);
3575 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3576 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3577 return new ICmpInst(Pred, Extract, NewC);
3578 }
3579 }
3580 }
3581 return nullptr;
3582}
3583
3584/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3585/// where X is some kind of instruction.
3587 const APInt *C;
3588
3589 if (match(Cmp.getOperand(1), m_APInt(C))) {
3590 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3591 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3592 return I;
3593
3594 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3595 // For now, we only support constant integers while folding the
3596 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3597 // similar to the cases handled by binary ops above.
3598 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3599 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3600 return I;
3601
3602 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3603 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3604 return I;
3605
3606 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3608 return I;
3609
3610 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3611 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3612 // TODO: This checks one-use, but that is not strictly necessary.
3613 Value *Cmp0 = Cmp.getOperand(0);
3614 Value *X, *Y;
3615 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3616 (match(Cmp0,
3618 m_Value(X), m_Value(Y)))) ||
3619 match(Cmp0,
3621 m_Value(X), m_Value(Y))))))
3622 return new ICmpInst(Cmp.getPredicate(), X, Y);
3623 }
3624
3625 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3627
3628 return nullptr;
3629}
3630
3631/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3632/// icmp eq/ne BO, C.
3634 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3635 // TODO: Some of these folds could work with arbitrary constants, but this
3636 // function is limited to scalar and vector splat constants.
3637 if (!Cmp.isEquality())
3638 return nullptr;
3639
3640 ICmpInst::Predicate Pred = Cmp.getPredicate();
3641 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3642 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3643 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3644
3645 switch (BO->getOpcode()) {
3646 case Instruction::SRem:
3647 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3648 if (C.isZero() && BO->hasOneUse()) {
3649 const APInt *BOC;
3650 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3651 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3652 return new ICmpInst(Pred, NewRem,
3654 }
3655 }
3656 break;
3657 case Instruction::Add: {
3658 // (A + C2) == C --> A == (C - C2)
3659 // (A + C2) != C --> A != (C - C2)
3660 // TODO: Remove the one-use limitation? See discussion in D58633.
3661 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3662 if (BO->hasOneUse())
3663 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3664 } else if (C.isZero()) {
3665 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3666 // efficiently invertible, or if the add has just this one use.
3667 if (Value *NegVal = dyn_castNegVal(BOp1))
3668 return new ICmpInst(Pred, BOp0, NegVal);
3669 if (Value *NegVal = dyn_castNegVal(BOp0))
3670 return new ICmpInst(Pred, NegVal, BOp1);
3671 if (BO->hasOneUse()) {
3672 // (add nuw A, B) != 0 -> (or A, B) != 0
3673 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3674 Value *Or = Builder.CreateOr(BOp0, BOp1);
3675 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3676 }
3677 Value *Neg = Builder.CreateNeg(BOp1);
3678 Neg->takeName(BO);
3679 return new ICmpInst(Pred, BOp0, Neg);
3680 }
3681 }
3682 break;
3683 }
3684 case Instruction::Xor:
3685 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3686 // For the xor case, we can xor two constants together, eliminating
3687 // the explicit xor.
3688 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3689 } else if (C.isZero()) {
3690 // Replace ((xor A, B) != 0) with (A != B)
3691 return new ICmpInst(Pred, BOp0, BOp1);
3692 }
3693 break;
3694 case Instruction::Or: {
3695 const APInt *BOC;
3696 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3697 // Comparing if all bits outside of a constant mask are set?
3698 // Replace (X | C) == -1 with (X & ~C) == ~C.
3699 // This removes the -1 constant.
3701 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3702 return new ICmpInst(Pred, And, NotBOC);
3703 }
3704 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3705 // -> (and cond, (icmp eq Other, 0))
3706 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3707 // -> (or cond, (icmp ne Other, 0))
3708 Value *Cond, *TV, *FV, *Other, *Sel;
3709 if (C.isZero() &&
3710 match(BO,
3713 m_Value(FV))),
3714 m_Value(Other)))) &&
3715 Cond->getType() == Cmp.getType()) {
3716 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3717 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3718 if (Pred == ICmpInst::ICMP_EQ
3719 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3720 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3721 Value *Cmp = Builder.CreateICmp(
3722 Pred, Other, Constant::getNullValue(Other->getType()));
3724 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3725 Cond);
3726 }
3727 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3728 // case we need to invert the select condition so we need to be careful to
3729 // avoid creating extra instructions.
3730 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3731 // -> (or (not cond), (icmp ne Other, 0))
3732 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3733 // -> (and (not cond), (icmp eq Other, 0))
3734 //
3735 // Only do this if the inner select has one use, in which case we are
3736 // replacing `select` with `(not cond)`. Otherwise, we will create more
3737 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3738 // cond was freely invertable, the select arms would have been inverted.
3739 if (Sel->hasOneUse() &&
3740 (Pred == ICmpInst::ICMP_EQ
3741 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3742 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3743 Value *NotCond = Builder.CreateNot(Cond);
3744 Value *Cmp = Builder.CreateICmp(
3745 Pred, Other, Constant::getNullValue(Other->getType()));
3747 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3748 NotCond);
3749 }
3750 }
3751 break;
3752 }
3753 case Instruction::UDiv:
3754 case Instruction::SDiv:
3755 if (BO->isExact()) {
3756 // div exact X, Y eq/ne 0 -> X eq/ne 0
3757 // div exact X, Y eq/ne 1 -> X eq/ne Y
3758 // div exact X, Y eq/ne C ->
3759 // if Y * C never-overflow && OneUse:
3760 // -> Y * C eq/ne X
3761 if (C.isZero())
3762 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3763 else if (C.isOne())
3764 return new ICmpInst(Pred, BOp0, BOp1);
3765 else if (BO->hasOneUse()) {
3767 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3768 Cmp.getOperand(1), BO);
3770 Value *YC =
3771 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3772 return new ICmpInst(Pred, YC, BOp0);
3773 }
3774 }
3775 }
3776 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3777 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3778 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3779 return new ICmpInst(NewPred, BOp1, BOp0);
3780 }
3781 break;
3782 default:
3783 break;
3784 }
3785 return nullptr;
3786}
3787
3789 const APInt &CRhs,
3790 InstCombiner::BuilderTy &Builder,
3791 const SimplifyQuery &Q) {
3792 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3793 "Non-ctpop intrin in ctpop fold");
3794 if (!CtpopLhs->hasOneUse())
3795 return nullptr;
3796
3797 // Power of 2 test:
3798 // isPow2OrZero : ctpop(X) u< 2
3799 // isPow2 : ctpop(X) == 1
3800 // NotPow2OrZero: ctpop(X) u> 1
3801 // NotPow2 : ctpop(X) != 1
3802 // If we know any bit of X can be folded to:
3803 // IsPow2 : X & (~Bit) == 0
3804 // NotPow2 : X & (~Bit) != 0
3805 const ICmpInst::Predicate Pred = I.getPredicate();
3806 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3807 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3808 Value *Op = CtpopLhs->getArgOperand(0);
3809 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3810 // No need to check for count > 1, that should be already constant folded.
3811 if (OpKnown.countMinPopulation() == 1) {
3812 Value *And = Builder.CreateAnd(
3813 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3814 return new ICmpInst(
3815 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3818 And, Constant::getNullValue(Op->getType()));
3819 }
3820 }
3821
3822 return nullptr;
3823}
3824
3825/// Fold an equality icmp with LLVM intrinsic and constant operand.
3827 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3828 Type *Ty = II->getType();
3829 unsigned BitWidth = C.getBitWidth();
3830 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3831
3832 switch (II->getIntrinsicID()) {
3833 case Intrinsic::abs:
3834 // abs(A) == 0 -> A == 0
3835 // abs(A) == INT_MIN -> A == INT_MIN
3836 if (C.isZero() || C.isMinSignedValue())
3837 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3838 break;
3839
3840 case Intrinsic::bswap:
3841 // bswap(A) == C -> A == bswap(C)
3842 return new ICmpInst(Pred, II->getArgOperand(0),
3843 ConstantInt::get(Ty, C.byteSwap()));
3844
3845 case Intrinsic::bitreverse:
3846 // bitreverse(A) == C -> A == bitreverse(C)
3847 return new ICmpInst(Pred, II->getArgOperand(0),
3848 ConstantInt::get(Ty, C.reverseBits()));
3849
3850 case Intrinsic::ctlz:
3851 case Intrinsic::cttz: {
3852 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3853 if (C == BitWidth)
3854 return new ICmpInst(Pred, II->getArgOperand(0),
3856
3857 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3858 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3859 // Limit to one use to ensure we don't increase instruction count.
3860 unsigned Num = C.getLimitedValue(BitWidth);
3861 if (Num != BitWidth && II->hasOneUse()) {
3862 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3863 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3864 : APInt::getHighBitsSet(BitWidth, Num + 1);
3865 APInt Mask2 = IsTrailing
3868 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3869 ConstantInt::get(Ty, Mask2));
3870 }
3871 break;
3872 }
3873
3874 case Intrinsic::ctpop: {
3875 // popcount(A) == 0 -> A == 0 and likewise for !=
3876 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3877 bool IsZero = C.isZero();
3878 if (IsZero || C == BitWidth)
3879 return new ICmpInst(Pred, II->getArgOperand(0),
3880 IsZero ? Constant::getNullValue(Ty)
3882
3883 break;
3884 }
3885
3886 case Intrinsic::fshl:
3887 case Intrinsic::fshr:
3888 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3889 const APInt *RotAmtC;
3890 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3891 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3892 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3893 return new ICmpInst(Pred, II->getArgOperand(0),
3894 II->getIntrinsicID() == Intrinsic::fshl
3895 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3896 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3897 }
3898 break;
3899
3900 case Intrinsic::umax:
3901 case Intrinsic::uadd_sat: {
3902 // uadd.sat(a, b) == 0 -> (a | b) == 0
3903 // umax(a, b) == 0 -> (a | b) == 0
3904 if (C.isZero() && II->hasOneUse()) {
3905 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3906 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3907 }
3908 break;
3909 }
3910
3911 case Intrinsic::ssub_sat:
3912 // ssub.sat(a, b) == 0 -> a == b
3913 //
3914 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
3915 // (because 1 saturates to 0). Just skip the optimization for i1.
3916 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
3917 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3918 break;
3919 case Intrinsic::usub_sat: {
3920 // usub.sat(a, b) == 0 -> a <= b
3921 if (C.isZero()) {
3922 ICmpInst::Predicate NewPred =
3924 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3925 }
3926 break;
3927 }
3928 default:
3929 break;
3930 }
3931
3932 return nullptr;
3933}
3934
3935/// Fold an icmp with LLVM intrinsics
3936static Instruction *
3938 InstCombiner::BuilderTy &Builder) {
3939 assert(Cmp.isEquality());
3940
3941 ICmpInst::Predicate Pred = Cmp.getPredicate();
3942 Value *Op0 = Cmp.getOperand(0);
3943 Value *Op1 = Cmp.getOperand(1);
3944 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3945 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3946 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3947 return nullptr;
3948
3949 switch (IIOp0->getIntrinsicID()) {
3950 case Intrinsic::bswap:
3951 case Intrinsic::bitreverse:
3952 // If both operands are byte-swapped or bit-reversed, just compare the
3953 // original values.
3954 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3955 case Intrinsic::fshl:
3956 case Intrinsic::fshr: {
3957 // If both operands are rotated by same amount, just compare the
3958 // original values.
3959 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3960 break;
3961 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3962 break;
3963 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3964 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3965
3966 // rotate(X, AmtX) == rotate(Y, AmtY)
3967 // -> rotate(X, AmtX - AmtY) == Y
3968 // Do this if either both rotates have one use or if only one has one use
3969 // and AmtX/AmtY are constants.
3970 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3971 if (OneUses == 2 ||
3972 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3973 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3974 Value *SubAmt =
3975 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3976 Value *CombinedRotate = Builder.CreateIntrinsic(
3977 Op0->getType(), IIOp0->getIntrinsicID(),
3978 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3979 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3980 }
3981 } break;
3982 default:
3983 break;
3984 }
3985
3986 return nullptr;
3987}
3988
3989/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3990/// where X is some kind of instruction and C is AllowPoison.
3991/// TODO: Move more folds which allow poison to this function.
3994 const APInt &C) {
3995 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3996 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3997 switch (II->getIntrinsicID()) {
3998 default:
3999 break;
4000 case Intrinsic::fshl:
4001 case Intrinsic::fshr:
4002 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
4003 // (rot X, ?) == 0/-1 --> X == 0/-1
4004 if (C.isZero() || C.isAllOnes())
4005 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
4006 }
4007 break;
4008 }
4009 }
4010
4011 return nullptr;
4012}
4013
4014/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
4016 BinaryOperator *BO,
4017 const APInt &C) {
4018 switch (BO->getOpcode()) {
4019 case Instruction::Xor:
4020 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
4021 return I;
4022 break;
4023 case Instruction::And:
4024 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
4025 return I;
4026 break;
4027 case Instruction::Or:
4028 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
4029 return I;
4030 break;
4031 case Instruction::Mul:
4032 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
4033 return I;
4034 break;
4035 case Instruction::Shl:
4036 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4037 return I;
4038 break;
4039 case Instruction::LShr:
4040 case Instruction::AShr:
4041 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4042 return I;
4043 break;
4044 case Instruction::SRem:
4045 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4046 return I;
4047 break;
4048 case Instruction::UDiv:
4049 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4050 return I;
4051 [[fallthrough]];
4052 case Instruction::SDiv:
4053 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4054 return I;
4055 break;
4056 case Instruction::Sub:
4057 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4058 return I;
4059 break;
4060 case Instruction::Add:
4061 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4062 return I;
4063 break;
4064 default:
4065 break;
4066 }
4067
4068 // TODO: These folds could be refactored to be part of the above calls.
4070 return I;
4071
4072 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4073 // : C4), C5` pattern, by computing a truth table of the four constant
4074 // variants.
4076}
4077
4078static Instruction *
4080 const APInt &C,
4081 InstCombiner::BuilderTy &Builder) {
4082 // This transform may end up producing more than one instruction for the
4083 // intrinsic, so limit it to one user of the intrinsic.
4084 if (!II->hasOneUse())
4085 return nullptr;
4086
4087 // Let Y = [add/sub]_sat(X, C) pred C2
4088 // SatVal = The saturating value for the operation
4089 // WillWrap = Whether or not the operation will underflow / overflow
4090 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4091 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4092 //
4093 // When (SatVal pred C2) is true, then
4094 // Y = WillWrap ? true : ((X binop C) pred C2)
4095 // => Y = WillWrap || ((X binop C) pred C2)
4096 // else
4097 // Y = WillWrap ? false : ((X binop C) pred C2)
4098 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4099 // => Y = !WillWrap && ((X binop C) pred C2)
4100 Value *Op0 = II->getOperand(0);
4101 Value *Op1 = II->getOperand(1);
4102
4103 const APInt *COp1;
4104 // This transform only works when the intrinsic has an integral constant or
4105 // splat vector as the second operand.
4106 if (!match(Op1, m_APInt(COp1)))
4107 return nullptr;
4108
4109 APInt SatVal;
4110 switch (II->getIntrinsicID()) {
4111 default:
4113 "This function only works with usub_sat and uadd_sat for now!");
4114 case Intrinsic::uadd_sat:
4115 SatVal = APInt::getAllOnes(C.getBitWidth());
4116 break;
4117 case Intrinsic::usub_sat:
4118 SatVal = APInt::getZero(C.getBitWidth());
4119 break;
4120 }
4121
4122 // Check (SatVal pred C2)
4123 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4124
4125 // !WillWrap.
4127 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4128
4129 // WillWrap.
4130 if (SatValCheck)
4131 C1 = C1.inverse();
4132
4134 if (II->getBinaryOp() == Instruction::Add)
4135 C2 = C2.sub(*COp1);
4136 else
4137 C2 = C2.add(*COp1);
4138
4139 Instruction::BinaryOps CombiningOp =
4140 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4141
4142 std::optional<ConstantRange> Combination;
4143 if (CombiningOp == Instruction::BinaryOps::Or)
4144 Combination = C1.exactUnionWith(C2);
4145 else /* CombiningOp == Instruction::BinaryOps::And */
4146 Combination = C1.exactIntersectWith(C2);
4147
4148 if (!Combination)
4149 return nullptr;
4150
4151 CmpInst::Predicate EquivPred;
4152 APInt EquivInt;
4153 APInt EquivOffset;
4154
4155 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4156
4157 return new ICmpInst(
4158 EquivPred,
4159 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4160 ConstantInt::get(Op1->getType(), EquivInt));
4161}
4162
4163static Instruction *
4165 const APInt &C,
4166 InstCombiner::BuilderTy &Builder) {
4167 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4168 switch (Pred) {
4169 case ICmpInst::ICMP_EQ:
4170 case ICmpInst::ICMP_NE:
4171 if (C.isZero())
4172 NewPredicate = Pred;
4173 else if (C.isOne())
4174 NewPredicate =
4176 else if (C.isAllOnes())
4177 NewPredicate =
4179 break;
4180
4181 case ICmpInst::ICMP_SGT:
4182 if (C.isAllOnes())
4183 NewPredicate = ICmpInst::ICMP_UGE;
4184 else if (C.isZero())
4185 NewPredicate = ICmpInst::ICMP_UGT;
4186 break;
4187
4188 case ICmpInst::ICMP_SLT:
4189 if (C.isZero())
4190 NewPredicate = ICmpInst::ICMP_ULT;
4191 else if (C.isOne())
4192 NewPredicate = ICmpInst::ICMP_ULE;
4193 break;
4194
4195 case ICmpInst::ICMP_ULT:
4196 if (C.ugt(1))
4197 NewPredicate = ICmpInst::ICMP_UGE;
4198 break;
4199
4200 case ICmpInst::ICMP_UGT:
4201 if (!C.isZero() && !C.isAllOnes())
4202 NewPredicate = ICmpInst::ICMP_ULT;
4203 break;
4204
4205 default:
4206 break;
4207 }
4208
4209 if (!NewPredicate)
4210 return nullptr;
4211
4212 if (I->getIntrinsicID() == Intrinsic::scmp)
4213 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4214 Value *LHS = I->getOperand(0);
4215 Value *RHS = I->getOperand(1);
4216 return new ICmpInst(*NewPredicate, LHS, RHS);
4217}
4218
4219/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4222 const APInt &C) {
4223 ICmpInst::Predicate Pred = Cmp.getPredicate();
4224
4225 // Handle folds that apply for any kind of icmp.
4226 switch (II->getIntrinsicID()) {
4227 default:
4228 break;
4229 case Intrinsic::uadd_sat:
4230 case Intrinsic::usub_sat:
4231 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4232 Pred, cast<SaturatingInst>(II), C, Builder))
4233 return Folded;
4234 break;
4235 case Intrinsic::ctpop: {
4236 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4237 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4238 return R;
4239 } break;
4240 case Intrinsic::scmp:
4241 case Intrinsic::ucmp:
4242 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4243 return Folded;
4244 break;
4245 }
4246
4247 if (Cmp.isEquality())
4248 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4249
4250 Type *Ty = II->getType();
4251 unsigned BitWidth = C.getBitWidth();
4252 switch (II->getIntrinsicID()) {
4253 case Intrinsic::ctpop: {
4254 // (ctpop X > BitWidth - 1) --> X == -1
4255 Value *X = II->getArgOperand(0);
4256 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4257 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4259 // (ctpop X < BitWidth) --> X != -1
4260 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4261 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4263 break;
4264 }
4265 case Intrinsic::ctlz: {
4266 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4267 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4268 unsigned Num = C.getLimitedValue();
4269 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4270 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4271 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4272 }
4273
4274 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4275 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4276 unsigned Num = C.getLimitedValue();
4278 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4279 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4280 }
4281 break;
4282 }
4283 case Intrinsic::cttz: {
4284 // Limit to one use to ensure we don't increase instruction count.
4285 if (!II->hasOneUse())
4286 return nullptr;
4287
4288 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4289 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4290 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4291 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4292 Builder.CreateAnd(II->getArgOperand(0), Mask),
4294 }
4295
4296 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4297 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4298 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4299 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4300 Builder.CreateAnd(II->getArgOperand(0), Mask),
4302 }
4303 break;
4304 }
4305 case Intrinsic::ssub_sat:
4306 // ssub.sat(a, b) spred 0 -> a spred b
4307 //
4308 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4309 // (because 1 saturates to 0). Just skip the optimization for i1.
4310 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4311 if (C.isZero())
4312 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4313 // X s<= 0 is cannonicalized to X s< 1
4314 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4315 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4316 II->getArgOperand(1));
4317 // X s>= 0 is cannonicalized to X s> -1
4318 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4319 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4320 II->getArgOperand(1));
4321 }
4322 break;
4323 case Intrinsic::abs: {
4324 if (!II->hasOneUse())
4325 return nullptr;
4326
4327 Value *X = II->getArgOperand(0);
4328 bool IsIntMinPoison =
4329 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4330
4331 // If C >= 0:
4332 // abs(X) u> C --> X + C u> 2 * C
4333 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4334 return new ICmpInst(ICmpInst::ICMP_UGT,
4335 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4336 ConstantInt::get(Ty, 2 * C));
4337 }
4338
4339 // If abs(INT_MIN) is poison and C >= 1:
4340 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4341 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4342 return new ICmpInst(ICmpInst::ICMP_ULE,
4343 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4344 ConstantInt::get(Ty, 2 * (C - 1)));
4345 }
4346
4347 break;
4348 }
4349 default:
4350 break;
4351 }
4352
4353 return nullptr;
4354}
4355
4356/// Handle icmp with constant (but not simple integer constant) RHS.
4358 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4359 Constant *RHSC = dyn_cast<Constant>(Op1);
4361 if (!RHSC || !LHSI)
4362 return nullptr;
4363
4364 switch (LHSI->getOpcode()) {
4365 case Instruction::IntToPtr:
4366 // icmp pred inttoptr(X), null -> icmp pred X, null pointer value
4367 if (isa<ConstantPointerNull>(RHSC)) {
4368 Type *IntPtrTy = DL.getIntPtrType(RHSC->getType());
4369 if (IntPtrTy == LHSI->getOperand(0)->getType()) {
4370 APInt NullPtrValue =
4371 DL.getNullPtrValue(RHSC->getType()->getPointerAddressSpace());
4372 return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
4373 Constant::getIntegerValue(IntPtrTy, NullPtrValue));
4374 }
4375 }
4376 break;
4377
4378 case Instruction::Load:
4379 // Try to optimize things like "A[i] > 4" to index computations.
4380 if (GetElementPtrInst *GEP =
4382 if (Instruction *Res =
4384 return Res;
4385 break;
4386 }
4387
4388 return nullptr;
4389}
4390
4392 Value *RHS, const ICmpInst &I) {
4393 // Try to fold the comparison into the select arms, which will cause the
4394 // select to be converted into a logical and/or.
4395 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4396 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4397 return Res;
4398 if (std::optional<bool> Impl = isImpliedCondition(
4399 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4400 return ConstantInt::get(I.getType(), *Impl);
4401 return nullptr;
4402 };
4403
4404 ConstantInt *CI = nullptr;
4405 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4406 if (Op1)
4407 CI = dyn_cast<ConstantInt>(Op1);
4408
4409 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4410 if (Op2)
4411 CI = dyn_cast<ConstantInt>(Op2);
4412
4413 auto Simplifies = [&](Value *Op, unsigned Idx) {
4414 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4415 const APInt *Dummy;
4416 return Op ||
4417 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4418 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4419 };
4420
4421 // We only want to perform this transformation if it will not lead to
4422 // additional code. This is true if either both sides of the select
4423 // fold to a constant (in which case the icmp is replaced with a select
4424 // which will usually simplify) or this is the only user of the
4425 // select (in which case we are trading a select+icmp for a simpler
4426 // select+icmp) or all uses of the select can be replaced based on
4427 // dominance information ("Global cases").
4428 bool Transform = false;
4429 if (Op1 && Op2)
4430 Transform = true;
4431 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4432 // Local case
4433 if (SI->hasOneUse())
4434 Transform = true;
4435 // Global cases
4436 else if (CI && !CI->isZero())
4437 // When Op1 is constant try replacing select with second operand.
4438 // Otherwise Op2 is constant and try replacing select with first
4439 // operand.
4440 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4441 }
4442 if (Transform) {
4443 if (!Op1)
4444 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4445 if (!Op2)
4446 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4447 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4448 ProfcheckDisableMetadataFixes ? nullptr : SI);
4449 }
4450
4451 return nullptr;
4452}
4453
4454// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4455static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4456 unsigned Depth = 0) {
4457 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4458 return true;
4459 if (V->getType()->getScalarSizeInBits() == 1)
4460 return true;
4462 return false;
4463 Value *X;
4465 if (!I)
4466 return false;
4467 switch (I->getOpcode()) {
4468 case Instruction::ZExt:
4469 // ZExt(Mask) is a Mask.
4470 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4471 case Instruction::SExt:
4472 // SExt(Mask) is a Mask.
4473 // SExt(~Mask) is a ~Mask.
4474 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4475 case Instruction::And:
4476 case Instruction::Or:
4477 // Mask0 | Mask1 is a Mask.
4478 // Mask0 & Mask1 is a Mask.
4479 // ~Mask0 | ~Mask1 is a ~Mask.
4480 // ~Mask0 & ~Mask1 is a ~Mask.
4481 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4482 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4483 case Instruction::Xor:
4484 if (match(V, m_Not(m_Value(X))))
4485 return isMaskOrZero(X, !Not, Q, Depth);
4486
4487 // (X ^ -X) is a ~Mask
4488 if (Not)
4489 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4490 // (X ^ (X - 1)) is a Mask
4491 else
4492 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4493 case Instruction::Select:
4494 // c ? Mask0 : Mask1 is a Mask.
4495 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4496 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4497 case Instruction::Shl:
4498 // (~Mask) << X is a ~Mask.
4499 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4500 case Instruction::LShr:
4501 // Mask >> X is a Mask.
4502 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4503 case Instruction::AShr:
4504 // Mask s>> X is a Mask.
4505 // ~Mask s>> X is a ~Mask.
4506 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4507 case Instruction::Add:
4508 // Pow2 - 1 is a Mask.
4509 if (!Not && match(I->getOperand(1), m_AllOnes()))
4510 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4511 Q.AC, Q.CxtI, Q.DT, Depth);
4512 break;
4513 case Instruction::Sub:
4514 // -Pow2 is a ~Mask.
4515 if (Not && match(I->getOperand(0), m_Zero()))
4516 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4517 Q.AC, Q.CxtI, Q.DT, Depth);
4518 break;
4519 case Instruction::Call: {
4520 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4521 switch (II->getIntrinsicID()) {
4522 // min/max(Mask0, Mask1) is a Mask.
4523 // min/max(~Mask0, ~Mask1) is a ~Mask.
4524 case Intrinsic::umax:
4525 case Intrinsic::smax:
4526 case Intrinsic::umin:
4527 case Intrinsic::smin:
4528 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4529 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4530
4531 // In the context of masks, bitreverse(Mask) == ~Mask
4532 case Intrinsic::bitreverse:
4533 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4534 default:
4535 break;
4536 }
4537 }
4538 break;
4539 }
4540 default:
4541 break;
4542 }
4543 return false;
4544}
4545
4546/// Some comparisons can be simplified.
4547/// In this case, we are looking for comparisons that look like
4548/// a check for a lossy truncation.
4549/// Folds:
4550/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4551/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4552/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4553/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4554/// Where Mask is some pattern that produces all-ones in low bits:
4555/// (-1 >> y)
4556/// ((-1 << y) >> y) <- non-canonical, has extra uses
4557/// ~(-1 << y)
4558/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4559/// The Mask can be a constant, too.
4560/// For some predicates, the operands are commutative.
4561/// For others, x can only be on a specific side.
4563 Value *Op1, const SimplifyQuery &Q,
4564 InstCombiner &IC) {
4565
4566 ICmpInst::Predicate DstPred;
4567 switch (Pred) {
4569 // x & Mask == x
4570 // x & ~Mask == 0
4571 // ~x | Mask == -1
4572 // -> x u<= Mask
4573 // x & ~Mask == ~Mask
4574 // -> ~Mask u<= x
4576 break;
4578 // x & Mask != x
4579 // x & ~Mask != 0
4580 // ~x | Mask != -1
4581 // -> x u> Mask
4582 // x & ~Mask != ~Mask
4583 // -> ~Mask u> x
4585 break;
4587 // x & Mask u< x
4588 // -> x u> Mask
4589 // x & ~Mask u< ~Mask
4590 // -> ~Mask u> x
4592 break;
4594 // x & Mask u>= x
4595 // -> x u<= Mask
4596 // x & ~Mask u>= ~Mask
4597 // -> ~Mask u<= x
4599 break;
4601 // x & Mask s< x [iff Mask s>= 0]
4602 // -> x s> Mask
4603 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4604 // -> ~Mask s> x
4606 break;
4608 // x & Mask s>= x [iff Mask s>= 0]
4609 // -> x s<= Mask
4610 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4611 // -> ~Mask s<= x
4613 break;
4614 default:
4615 // We don't support sgt,sle
4616 // ult/ugt are simplified to true/false respectively.
4617 return nullptr;
4618 }
4619
4620 Value *X, *M;
4621 // Put search code in lambda for early positive returns.
4622 auto IsLowBitMask = [&]() {
4623 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4624 X = Op1;
4625 // Look for: x & Mask pred x
4626 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4627 return !ICmpInst::isSigned(Pred) ||
4628 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4629 }
4630
4631 // Look for: x & ~Mask pred ~Mask
4632 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4633 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4634 }
4635 return false;
4636 }
4637 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4638 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4639
4640 auto Check = [&]() {
4641 // Look for: ~x | Mask == -1
4642 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4643 if (Value *NotX =
4644 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4645 X = NotX;
4646 return true;
4647 }
4648 }
4649 return false;
4650 };
4651 if (Check())
4652 return true;
4653 std::swap(X, M);
4654 return Check();
4655 }
4656 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4657 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4658 auto Check = [&]() {
4659 // Look for: x & ~Mask == 0
4660 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4661 if (Value *NotM =
4662 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4663 M = NotM;
4664 return true;
4665 }
4666 }
4667 return false;
4668 };
4669 if (Check())
4670 return true;
4671 std::swap(X, M);
4672 return Check();
4673 }
4674 return false;
4675 };
4676
4677 if (!IsLowBitMask())
4678 return nullptr;
4679
4680 return IC.Builder.CreateICmp(DstPred, X, M);
4681}
4682
4683/// Some comparisons can be simplified.
4684/// In this case, we are looking for comparisons that look like
4685/// a check for a lossy signed truncation.
4686/// Folds: (MaskedBits is a constant.)
4687/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4688/// Into:
4689/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4690/// Where KeptBits = bitwidth(%x) - MaskedBits
4691static Value *
4693 InstCombiner::BuilderTy &Builder) {
4694 CmpPredicate SrcPred;
4695 Value *X;
4696 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4697 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4698 if (!match(&I, m_c_ICmp(SrcPred,
4700 m_APInt(C1))),
4701 m_Deferred(X))))
4702 return nullptr;
4703
4704 // Potential handling of non-splats: for each element:
4705 // * if both are undef, replace with constant 0.
4706 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4707 // * if both are not undef, and are different, bailout.
4708 // * else, only one is undef, then pick the non-undef one.
4709
4710 // The shift amount must be equal.
4711 if (*C0 != *C1)
4712 return nullptr;
4713 const APInt &MaskedBits = *C0;
4714 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4715
4716 ICmpInst::Predicate DstPred;
4717 switch (SrcPred) {
4719 // ((%x << MaskedBits) a>> MaskedBits) == %x
4720 // =>
4721 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4723 break;
4725 // ((%x << MaskedBits) a>> MaskedBits) != %x
4726 // =>
4727 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4729 break;
4730 // FIXME: are more folds possible?
4731 default:
4732 return nullptr;
4733 }
4734
4735 auto *XType = X->getType();
4736 const unsigned XBitWidth = XType->getScalarSizeInBits();
4737 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4738 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4739
4740 // KeptBits = bitwidth(%x) - MaskedBits
4741 const APInt KeptBits = BitWidth - MaskedBits;
4742 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4743 // ICmpCst = (1 << KeptBits)
4744 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4745 assert(ICmpCst.isPowerOf2());
4746 // AddCst = (1 << (KeptBits-1))
4747 const APInt AddCst = ICmpCst.lshr(1);
4748 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4749
4750 // T0 = add %x, AddCst
4751 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4752 // T1 = T0 DstPred ICmpCst
4753 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4754
4755 return T1;
4756}
4757
4758// Given pattern:
4759// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4760// we should move shifts to the same hand of 'and', i.e. rewrite as
4761// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4762// We are only interested in opposite logical shifts here.
4763// One of the shifts can be truncated.
4764// If we can, we want to end up creating 'lshr' shift.
4765static Value *
4767 InstCombiner::BuilderTy &Builder) {
4768 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4769 !I.getOperand(0)->hasOneUse())
4770 return nullptr;
4771
4772 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4773
4774 // Look for an 'and' of two logical shifts, one of which may be truncated.
4775 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4776 Instruction *XShift, *MaybeTruncation, *YShift;
4777 if (!match(
4778 I.getOperand(0),
4779 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4781 m_AnyLogicalShift, m_Instruction(YShift))),
4782 m_Instruction(MaybeTruncation)))))
4783 return nullptr;
4784
4785 // We potentially looked past 'trunc', but only when matching YShift,
4786 // therefore YShift must have the widest type.
4787 Instruction *WidestShift = YShift;
4788 // Therefore XShift must have the shallowest type.
4789 // Or they both have identical types if there was no truncation.
4790 Instruction *NarrowestShift = XShift;
4791
4792 Type *WidestTy = WidestShift->getType();
4793 Type *NarrowestTy = NarrowestShift->getType();
4794 assert(NarrowestTy == I.getOperand(0)->getType() &&
4795 "We did not look past any shifts while matching XShift though.");
4796 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4797
4798 // If YShift is a 'lshr', swap the shifts around.
4799 if (match(YShift, m_LShr(m_Value(), m_Value())))
4800 std::swap(XShift, YShift);
4801
4802 // The shifts must be in opposite directions.
4803 auto XShiftOpcode = XShift->getOpcode();
4804 if (XShiftOpcode == YShift->getOpcode())
4805 return nullptr; // Do not care about same-direction shifts here.
4806
4807 Value *X, *XShAmt, *Y, *YShAmt;
4808 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4809 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4810
4811 // If one of the values being shifted is a constant, then we will end with
4812 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4813 // however, we will need to ensure that we won't increase instruction count.
4814 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4815 // At least one of the hands of the 'and' should be one-use shift.
4816 if (!match(I.getOperand(0),
4817 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4818 return nullptr;
4819 if (HadTrunc) {
4820 // Due to the 'trunc', we will need to widen X. For that either the old
4821 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4822 if (!MaybeTruncation->hasOneUse() &&
4823 !NarrowestShift->getOperand(1)->hasOneUse())
4824 return nullptr;
4825 }
4826 }
4827
4828 // We have two shift amounts from two different shifts. The types of those
4829 // shift amounts may not match. If that's the case let's bailout now.
4830 if (XShAmt->getType() != YShAmt->getType())
4831 return nullptr;
4832
4833 // As input, we have the following pattern:
4834 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4835 // We want to rewrite that as:
4836 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4837 // While we know that originally (Q+K) would not overflow
4838 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4839 // shift amounts. so it may now overflow in smaller bitwidth.
4840 // To ensure that does not happen, we need to ensure that the total maximal
4841 // shift amount is still representable in that smaller bit width.
4842 unsigned MaximalPossibleTotalShiftAmount =
4843 (WidestTy->getScalarSizeInBits() - 1) +
4844 (NarrowestTy->getScalarSizeInBits() - 1);
4845 APInt MaximalRepresentableShiftAmount =
4847 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4848 return nullptr;
4849
4850 // Can we fold (XShAmt+YShAmt) ?
4851 auto *NewShAmt = dyn_cast_or_null<Constant>(
4852 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4853 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4854 if (!NewShAmt)
4855 return nullptr;
4856 if (NewShAmt->getType() != WidestTy) {
4857 NewShAmt =
4858 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4859 if (!NewShAmt)
4860 return nullptr;
4861 }
4862 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4863
4864 // Is the new shift amount smaller than the bit width?
4865 // FIXME: could also rely on ConstantRange.
4866 if (!match(NewShAmt,
4868 APInt(WidestBitWidth, WidestBitWidth))))
4869 return nullptr;
4870
4871 // An extra legality check is needed if we had trunc-of-lshr.
4872 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4873 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4874 WidestShift]() {
4875 // It isn't obvious whether it's worth it to analyze non-constants here.
4876 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4877 // If *any* of these preconditions matches we can perform the fold.
4878 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4879 ? NewShAmt->getSplatValue()
4880 : NewShAmt;
4881 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4882 if (NewShAmtSplat &&
4883 (NewShAmtSplat->isNullValue() ||
4884 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4885 return true;
4886 // We consider *min* leading zeros so a single outlier
4887 // blocks the transform as opposed to allowing it.
4888 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4889 KnownBits Known = computeKnownBits(C, SQ.DL);
4890 unsigned MinLeadZero = Known.countMinLeadingZeros();
4891 // If the value being shifted has at most lowest bit set we can fold.
4892 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4893 if (MaxActiveBits <= 1)
4894 return true;
4895 // Precondition: NewShAmt u<= countLeadingZeros(C)
4896 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4897 return true;
4898 }
4899 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4900 KnownBits Known = computeKnownBits(C, SQ.DL);
4901 unsigned MinLeadZero = Known.countMinLeadingZeros();
4902 // If the value being shifted has at most lowest bit set we can fold.
4903 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4904 if (MaxActiveBits <= 1)
4905 return true;
4906 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4907 if (NewShAmtSplat) {
4908 APInt AdjNewShAmt =
4909 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4910 if (AdjNewShAmt.ule(MinLeadZero))
4911 return true;
4912 }
4913 }
4914 return false; // Can't tell if it's ok.
4915 };
4916 if (!CanFold())
4917 return nullptr;
4918 }
4919
4920 // All good, we can do this fold.
4921 X = Builder.CreateZExt(X, WidestTy);
4922 Y = Builder.CreateZExt(Y, WidestTy);
4923 // The shift is the same that was for X.
4924 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4925 ? Builder.CreateLShr(X, NewShAmt)
4926 : Builder.CreateShl(X, NewShAmt);
4927 Value *T1 = Builder.CreateAnd(T0, Y);
4928 return Builder.CreateICmp(I.getPredicate(), T1,
4929 Constant::getNullValue(WidestTy));
4930}
4931
4932/// Fold
4933/// (-1 u/ x) u< y
4934/// ((x * y) ?/ x) != y
4935/// to
4936/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4937/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4938/// will mean that we are looking for the opposite answer.
4940 CmpPredicate Pred;
4941 Value *X, *Y;
4943 Instruction *Div;
4944 bool NeedNegation;
4945 // Look for: (-1 u/ x) u</u>= y
4946 if (!I.isEquality() &&
4947 match(&I, m_c_ICmp(Pred,
4949 m_Instruction(Div)),
4950 m_Value(Y)))) {
4951 Mul = nullptr;
4952
4953 // Are we checking that overflow does not happen, or does happen?
4954 switch (Pred) {
4956 NeedNegation = false;
4957 break; // OK
4959 NeedNegation = true;
4960 break; // OK
4961 default:
4962 return nullptr; // Wrong predicate.
4963 }
4964 } else // Look for: ((x * y) / x) !=/== y
4965 if (I.isEquality() &&
4966 match(&I, m_c_ICmp(Pred, m_Value(Y),
4969 m_Value(X)),
4971 m_Deferred(X))),
4972 m_Instruction(Div))))) {
4973 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4974 } else
4975 return nullptr;
4976
4978 // If the pattern included (x * y), we'll want to insert new instructions
4979 // right before that original multiplication so that we can replace it.
4980 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4981 if (MulHadOtherUses)
4982 Builder.SetInsertPoint(Mul);
4983
4984 Value *Call = Builder.CreateIntrinsic(
4985 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4986 : Intrinsic::smul_with_overflow,
4987 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4988
4989 // If the multiplication was used elsewhere, to ensure that we don't leave
4990 // "duplicate" instructions, replace uses of that original multiplication
4991 // with the multiplication result from the with.overflow intrinsic.
4992 if (MulHadOtherUses)
4993 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4994
4995 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4996 if (NeedNegation) // This technically increases instruction count.
4997 Res = Builder.CreateNot(Res, "mul.not.ov");
4998
4999 // If we replaced the mul, erase it. Do this after all uses of Builder,
5000 // as the mul is used as insertion point.
5001 if (MulHadOtherUses)
5003
5004 return Res;
5005}
5006
5008 InstCombiner::BuilderTy &Builder) {
5009 CmpPredicate Pred;
5010 Value *X;
5011 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
5012
5013 if (ICmpInst::isSigned(Pred))
5014 Pred = ICmpInst::getSwappedPredicate(Pred);
5015 else if (ICmpInst::isUnsigned(Pred))
5016 Pred = ICmpInst::getSignedPredicate(Pred);
5017 // else for equality-comparisons just keep the predicate.
5018
5019 return ICmpInst::Create(Instruction::ICmp, Pred, X,
5020 Constant::getNullValue(X->getType()), I.getName());
5021 }
5022
5023 // A value is not equal to its negation unless that value is 0 or
5024 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
5025 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
5026 ICmpInst::isEquality(Pred)) {
5027 Type *Ty = X->getType();
5028 uint32_t BitWidth = Ty->getScalarSizeInBits();
5029 Constant *MaxSignedVal =
5030 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
5031 Value *And = Builder.CreateAnd(X, MaxSignedVal);
5032 Constant *Zero = Constant::getNullValue(Ty);
5033 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
5034 }
5035
5036 return nullptr;
5037}
5038
5040 InstCombinerImpl &IC) {
5041 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5042 // Normalize and operand as operand 0.
5043 CmpInst::Predicate Pred = I.getPredicate();
5044 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
5045 std::swap(Op0, Op1);
5046 Pred = ICmpInst::getSwappedPredicate(Pred);
5047 }
5048
5049 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5050 return nullptr;
5051
5052 // (icmp (X & Y) u< X --> (X & Y) != X
5053 if (Pred == ICmpInst::ICMP_ULT)
5054 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5055
5056 // (icmp (X & Y) u>= X --> (X & Y) == X
5057 if (Pred == ICmpInst::ICMP_UGE)
5058 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5059
5060 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5061 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5062 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5063 // so don't do this fold.
5064 if (!match(Op1, m_ImmConstant()))
5065 if (auto *NotOp1 =
5066 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5067 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5068 Constant::getAllOnesValue(Op1->getType()));
5069 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5070 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5071 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5072 Constant::getNullValue(Op1->getType()));
5073 }
5074
5075 if (!ICmpInst::isSigned(Pred))
5076 return nullptr;
5077
5078 KnownBits KnownY = IC.computeKnownBits(A, &I);
5079 // (X & NegY) spred X --> (X & NegY) upred X
5080 if (KnownY.isNegative())
5081 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5082
5083 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5084 return nullptr;
5085
5086 if (KnownY.isNonNegative())
5087 // (X & PosY) s<= X --> X s>= 0
5088 // (X & PosY) s> X --> X s< 0
5089 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5090 Constant::getNullValue(Op1->getType()));
5091
5093 // (NegX & Y) s<= NegX --> Y s< 0
5094 // (NegX & Y) s> NegX --> Y s>= 0
5096 Constant::getNullValue(A->getType()));
5097
5098 return nullptr;
5099}
5100
5102 InstCombinerImpl &IC) {
5103 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5104
5105 // Normalize or operand as operand 0.
5106 CmpInst::Predicate Pred = I.getPredicate();
5107 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5108 std::swap(Op0, Op1);
5109 Pred = ICmpInst::getSwappedPredicate(Pred);
5110 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5111 return nullptr;
5112 }
5113
5114 // icmp (X | Y) u<= X --> (X | Y) == X
5115 if (Pred == ICmpInst::ICMP_ULE)
5116 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5117
5118 // icmp (X | Y) u> X --> (X | Y) != X
5119 if (Pred == ICmpInst::ICMP_UGT)
5120 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5121
5122 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5123 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5124 if (Value *NotOp1 = IC.getFreelyInverted(
5125 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5126 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5127 Constant::getNullValue(Op1->getType()));
5128 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5129 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5130 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5131 Constant::getAllOnesValue(Op1->getType()));
5132 }
5133 return nullptr;
5134}
5135
5137 InstCombinerImpl &IC) {
5138 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5139 // Normalize xor operand as operand 0.
5140 CmpInst::Predicate Pred = I.getPredicate();
5141 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5142 std::swap(Op0, Op1);
5143 Pred = ICmpInst::getSwappedPredicate(Pred);
5144 }
5145 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5146 return nullptr;
5147
5148 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5149 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5150 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5151 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5153 if (PredOut != Pred && isKnownNonZero(A, Q))
5154 return new ICmpInst(PredOut, Op0, Op1);
5155
5156 // These transform work when A is negative.
5157 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5158 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5159 if (match(A, m_Negative())) {
5160 CmpInst::Predicate NewPred;
5161 switch (ICmpInst::getStrictPredicate(Pred)) {
5162 default:
5163 return nullptr;
5164 case ICmpInst::ICMP_SLT:
5165 case ICmpInst::ICMP_UGT:
5166 NewPred = ICmpInst::ICMP_SLT;
5167 break;
5168 case ICmpInst::ICMP_SGT:
5169 case ICmpInst::ICMP_ULT:
5170 NewPred = ICmpInst::ICMP_SGE;
5171 break;
5172 }
5173 Constant *Const = Constant::getNullValue(Op0->getType());
5174 return new ICmpInst(NewPred, Op0, Const);
5175 }
5176
5177 return nullptr;
5178}
5179
5180/// Return true if X is a multiple of C.
5181/// TODO: Handle non-power-of-2 factors.
5182static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5183 if (C.isOne())
5184 return true;
5185
5186 if (!C.isPowerOf2())
5187 return false;
5188
5189 return MaskedValueIsZero(X, C - 1, Q);
5190}
5191
5192/// Try to fold icmp (binop), X or icmp X, (binop).
5193/// TODO: A large part of this logic is duplicated in InstSimplify's
5194/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5195/// duplication.
5197 const SimplifyQuery &SQ) {
5198 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5199 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5200
5201 // Special logic for binary operators.
5204 if (!BO0 && !BO1)
5205 return nullptr;
5206
5207 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5208 return NewICmp;
5209
5210 const CmpInst::Predicate Pred = I.getPredicate();
5211 Value *X;
5212
5213 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5214 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5215 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5216 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5217 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5218 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5219 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5220 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5221 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5222
5223 {
5224 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5225 Constant *C;
5226 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5227 m_ImmConstant(C)))) &&
5228 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5230 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5231 }
5232 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5233 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5234 m_ImmConstant(C)))) &&
5235 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5237 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5238 }
5239 }
5240
5241 // (icmp eq/ne (X, -P2), INT_MIN)
5242 // -> (icmp slt/sge X, INT_MIN + P2)
5243 if (ICmpInst::isEquality(Pred) && BO0 &&
5244 match(I.getOperand(1), m_SignMask()) &&
5246 // Will Constant fold.
5247 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5248 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5250 BO0->getOperand(0), NewC);
5251 }
5252
5253 {
5254 // Similar to above: an unsigned overflow comparison may use offset + mask:
5255 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5256 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5257 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5258 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5259 BinaryOperator *BO;
5260 const APInt *C;
5261 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5262 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5264 CmpInst::Predicate NewPred =
5266 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5267 return new ICmpInst(NewPred, Op1, Zero);
5268 }
5269
5270 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5271 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5273 CmpInst::Predicate NewPred =
5275 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5276 return new ICmpInst(NewPred, Op0, Zero);
5277 }
5278 }
5279
5280 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5281 bool Op0HasNUW = false, Op1HasNUW = false;
5282 bool Op0HasNSW = false, Op1HasNSW = false;
5283 // Analyze the case when either Op0 or Op1 is an add instruction.
5284 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5285 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5286 bool &HasNSW, bool &HasNUW) -> bool {
5288 HasNUW = BO.hasNoUnsignedWrap();
5289 HasNSW = BO.hasNoSignedWrap();
5290 return ICmpInst::isEquality(Pred) ||
5291 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5292 (CmpInst::isSigned(Pred) && HasNSW);
5293 } else if (BO.getOpcode() == Instruction::Or) {
5294 HasNUW = true;
5295 HasNSW = true;
5296 return true;
5297 } else {
5298 return false;
5299 }
5300 };
5301 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5302
5303 if (BO0) {
5304 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5305 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5306 }
5307 if (BO1) {
5308 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5309 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5310 }
5311
5312 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5313 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5314 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5315 return new ICmpInst(Pred, A == Op1 ? B : A,
5316 Constant::getNullValue(Op1->getType()));
5317
5318 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5319 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5320 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5321 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5322 C == Op0 ? D : C);
5323
5324 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5325 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5326 NoOp1WrapProblem) {
5327 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5328 Value *Y, *Z;
5329 if (A == C) {
5330 // C + B == C + D -> B == D
5331 Y = B;
5332 Z = D;
5333 } else if (A == D) {
5334 // D + B == C + D -> B == C
5335 Y = B;
5336 Z = C;
5337 } else if (B == C) {
5338 // A + C == C + D -> A == D
5339 Y = A;
5340 Z = D;
5341 } else {
5342 assert(B == D);
5343 // A + D == C + D -> A == C
5344 Y = A;
5345 Z = C;
5346 }
5347 return new ICmpInst(Pred, Y, Z);
5348 }
5349
5350 if (ICmpInst::isRelational(Pred)) {
5351 // Return if both X and Y is divisible by Z/-Z.
5352 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5353 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5354 bool IsNegative) -> bool {
5355 const APInt *OffsetC;
5356 if (!match(Z, m_APInt(OffsetC)))
5357 return false;
5358
5359 // Fast path for Z == 1/-1.
5360 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5361 return true;
5362
5363 APInt C = *OffsetC;
5364 if (IsNegative)
5365 C.negate();
5366 // Note: -INT_MIN is also negative.
5367 if (!C.isStrictlyPositive())
5368 return false;
5369
5370 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5371 };
5372
5373 // TODO: The subtraction-related identities shown below also hold, but
5374 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5375 // wouldn't happen even if they were implemented.
5376 //
5377 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5378 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5379 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5380 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5381
5382 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5383 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5384 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5385 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5386 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5387 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5388 if (A && NoOp0WrapProblem &&
5389 ShareCommonDivisor(A, Op1, B,
5390 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5392 Op1);
5393
5394 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5395 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5396 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5397 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5398 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5399 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5400 if (C && NoOp1WrapProblem &&
5401 ShareCommonDivisor(Op0, C, D,
5402 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5404 C);
5405 }
5406
5407 // if C1 has greater magnitude than C2:
5408 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5409 // s.t. C3 = C1 - C2
5410 //
5411 // if C2 has greater magnitude than C1:
5412 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5413 // s.t. C3 = C2 - C1
5414 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5415 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5416 const APInt *AP1, *AP2;
5417 // TODO: Support non-uniform vectors.
5418 // TODO: Allow poison passthrough if B or D's element is poison.
5419 if (match(B, m_APIntAllowPoison(AP1)) &&
5420 match(D, m_APIntAllowPoison(AP2)) &&
5421 AP1->isNegative() == AP2->isNegative()) {
5422 APInt AP1Abs = AP1->abs();
5423 APInt AP2Abs = AP2->abs();
5424 if (AP1Abs.uge(AP2Abs)) {
5425 APInt Diff = *AP1 - *AP2;
5426 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5427 Value *NewAdd = Builder.CreateAdd(
5428 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5429 return new ICmpInst(Pred, NewAdd, C);
5430 } else {
5431 APInt Diff = *AP2 - *AP1;
5432 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5433 Value *NewAdd = Builder.CreateAdd(
5434 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5435 return new ICmpInst(Pred, A, NewAdd);
5436 }
5437 }
5438 Constant *Cst1, *Cst2;
5439 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5440 ICmpInst::isEquality(Pred)) {
5441 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5442 Value *NewAdd = Builder.CreateAdd(C, Diff);
5443 return new ICmpInst(Pred, A, NewAdd);
5444 }
5445 }
5446
5447 // Analyze the case when either Op0 or Op1 is a sub instruction.
5448 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5449 A = nullptr;
5450 B = nullptr;
5451 C = nullptr;
5452 D = nullptr;
5453 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5454 A = BO0->getOperand(0);
5455 B = BO0->getOperand(1);
5456 }
5457 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5458 C = BO1->getOperand(0);
5459 D = BO1->getOperand(1);
5460 }
5461
5462 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5463 if (A == Op1 && NoOp0WrapProblem)
5464 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5465 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5466 if (C == Op0 && NoOp1WrapProblem)
5467 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5468
5469 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5470 // (A - B) u>/u<= A --> B u>/u<= A
5471 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5472 return new ICmpInst(Pred, B, A);
5473 // C u</u>= (C - D) --> C u</u>= D
5474 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5475 return new ICmpInst(Pred, C, D);
5476 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5477 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5478 isKnownNonZero(B, Q))
5480 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5481 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5482 isKnownNonZero(D, Q))
5484
5485 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5486 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5487 return new ICmpInst(Pred, A, C);
5488
5489 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5490 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5491 return new ICmpInst(Pred, D, B);
5492
5493 // icmp (0-X) < cst --> x > -cst
5494 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5495 Value *X;
5496 if (match(BO0, m_Neg(m_Value(X))))
5497 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5498 if (RHSC->isNotMinSignedValue())
5499 return new ICmpInst(I.getSwappedPredicate(), X,
5500 ConstantExpr::getNeg(RHSC));
5501 }
5502
5503 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5504 return R;
5505 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5506 return R;
5507
5508 {
5509 // Try to remove shared multiplier from comparison:
5510 // X * Z pred Y * Z
5511 Value *X, *Y, *Z;
5512 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5513 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5514 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5515 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5516 if (ICmpInst::isSigned(Pred)) {
5517 if (Op0HasNSW && Op1HasNSW) {
5518 KnownBits ZKnown = computeKnownBits(Z, &I);
5519 if (ZKnown.isStrictlyPositive())
5520 return new ICmpInst(Pred, X, Y);
5521 if (ZKnown.isNegative())
5522 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5524 SQ.getWithInstruction(&I));
5525 if (LessThan && match(LessThan, m_One()))
5526 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5527 Constant::getNullValue(Z->getType()));
5528 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5529 SQ.getWithInstruction(&I));
5530 if (GreaterThan && match(GreaterThan, m_One()))
5531 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5532 }
5533 } else {
5534 bool NonZero;
5535 if (ICmpInst::isEquality(Pred)) {
5536 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5537 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5538 isKnownNonEqual(X, Y, SQ))
5539 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5540
5541 KnownBits ZKnown = computeKnownBits(Z, &I);
5542 // if Z % 2 != 0
5543 // X * Z eq/ne Y * Z -> X eq/ne Y
5544 if (ZKnown.countMaxTrailingZeros() == 0)
5545 return new ICmpInst(Pred, X, Y);
5546 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5547 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5548 // X * Z eq/ne Y * Z -> X eq/ne Y
5549 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5550 return new ICmpInst(Pred, X, Y);
5551 } else
5552 NonZero = isKnownNonZero(Z, Q);
5553
5554 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5555 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5556 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5557 return new ICmpInst(Pred, X, Y);
5558 }
5559 }
5560 }
5561
5562 BinaryOperator *SRem = nullptr;
5563 // icmp (srem X, Y), Y
5564 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5565 SRem = BO0;
5566 // icmp Y, (srem X, Y)
5567 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5568 Op0 == BO1->getOperand(1))
5569 SRem = BO1;
5570 if (SRem) {
5571 // We don't check hasOneUse to avoid increasing register pressure because
5572 // the value we use is the same value this instruction was already using.
5573 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5574 default:
5575 break;
5576 case ICmpInst::ICMP_EQ:
5577 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5578 case ICmpInst::ICMP_NE:
5579 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5580 case ICmpInst::ICMP_SGT:
5581 case ICmpInst::ICMP_SGE:
5582 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5584 case ICmpInst::ICMP_SLT:
5585 case ICmpInst::ICMP_SLE:
5586 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5588 }
5589 }
5590
5591 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5592 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5593 BO0->getOperand(1) == BO1->getOperand(1)) {
5594 switch (BO0->getOpcode()) {
5595 default:
5596 break;
5597 case Instruction::Add:
5598 case Instruction::Sub:
5599 case Instruction::Xor: {
5600 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5601 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5602
5603 const APInt *C;
5604 if (match(BO0->getOperand(1), m_APInt(C))) {
5605 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5606 if (C->isSignMask()) {
5607 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5608 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5609 }
5610
5611 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5612 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5613 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5614 NewPred = I.getSwappedPredicate(NewPred);
5615 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5616 }
5617 }
5618 break;
5619 }
5620 case Instruction::Mul: {
5621 if (!I.isEquality())
5622 break;
5623
5624 const APInt *C;
5625 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5626 !C->isOne()) {
5627 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5628 // Mask = -1 >> count-trailing-zeros(C).
5629 if (unsigned TZs = C->countr_zero()) {
5630 Constant *Mask = ConstantInt::get(
5631 BO0->getType(),
5632 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5633 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5634 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5635 return new ICmpInst(Pred, And1, And2);
5636 }
5637 }
5638 break;
5639 }
5640 case Instruction::UDiv:
5641 case Instruction::LShr:
5642 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5643 break;
5644 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5645
5646 case Instruction::SDiv:
5647 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5648 !BO0->isExact() || !BO1->isExact())
5649 break;
5650 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5651
5652 case Instruction::AShr:
5653 if (!BO0->isExact() || !BO1->isExact())
5654 break;
5655 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5656
5657 case Instruction::Shl: {
5658 bool NUW = Op0HasNUW && Op1HasNUW;
5659 bool NSW = Op0HasNSW && Op1HasNSW;
5660 if (!NUW && !NSW)
5661 break;
5662 if (!NSW && I.isSigned())
5663 break;
5664 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5665 }
5666 }
5667 }
5668
5669 if (BO0) {
5670 // Transform A & (L - 1) `ult` L --> L != 0
5671 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5672 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5673
5674 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5675 auto *Zero = Constant::getNullValue(BO0->getType());
5676 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5677 }
5678 }
5679
5680 // For unsigned predicates / eq / ne:
5681 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5682 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5683 if (!ICmpInst::isSigned(Pred)) {
5684 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5685 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5686 Constant::getNullValue(Op1->getType()));
5687 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5688 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5689 Constant::getNullValue(Op0->getType()), Op0);
5690 }
5691
5693 return replaceInstUsesWith(I, V);
5694
5695 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5696 return R;
5697
5699 return replaceInstUsesWith(I, V);
5700
5702 return replaceInstUsesWith(I, V);
5703
5704 return nullptr;
5705}
5706
5707/// Fold icmp Pred min|max(X, Y), Z.
5710 Value *Z, CmpPredicate Pred) {
5711 Value *X = MinMax->getLHS();
5712 Value *Y = MinMax->getRHS();
5713 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5714 return nullptr;
5715 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5716 // Revert the transform signed pred -> unsigned pred
5717 // TODO: We can flip the signedness of predicate if both operands of icmp
5718 // are negative.
5719 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5720 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5722 } else
5723 return nullptr;
5724 }
5725 SimplifyQuery Q = SQ.getWithInstruction(&I);
5726 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5727 if (!Val)
5728 return std::nullopt;
5729 if (match(Val, m_One()))
5730 return true;
5731 if (match(Val, m_Zero()))
5732 return false;
5733 return std::nullopt;
5734 };
5735 // Remove samesign here since it is illegal to keep it when we speculatively
5736 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5737 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5738 // -46, -32)`. `X` is allowed to be non-negative here.
5739 Pred = Pred.dropSameSign();
5740 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5741 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5742 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5743 return nullptr;
5744 if (!CmpXZ.has_value()) {
5745 std::swap(X, Y);
5746 std::swap(CmpXZ, CmpYZ);
5747 }
5748
5749 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5750 if (CmpYZ.has_value())
5751 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5752 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5753 };
5754
5755 switch (Pred) {
5756 case ICmpInst::ICMP_EQ:
5757 case ICmpInst::ICMP_NE: {
5758 // If X == Z:
5759 // Expr Result
5760 // min(X, Y) == Z X <= Y
5761 // max(X, Y) == Z X >= Y
5762 // min(X, Y) != Z X > Y
5763 // max(X, Y) != Z X < Y
5764 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5765 ICmpInst::Predicate NewPred =
5766 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5767 if (Pred == ICmpInst::ICMP_NE)
5768 NewPred = ICmpInst::getInversePredicate(NewPred);
5769 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5770 }
5771 // Otherwise (X != Z):
5772 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5773 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5774 if (!MinMaxCmpXZ.has_value()) {
5775 std::swap(X, Y);
5776 std::swap(CmpXZ, CmpYZ);
5777 // Re-check pre-condition X != Z
5778 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5779 break;
5780 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5781 }
5782 if (!MinMaxCmpXZ.has_value())
5783 break;
5784 if (*MinMaxCmpXZ) {
5785 // Expr Fact Result
5786 // min(X, Y) == Z X < Z false
5787 // max(X, Y) == Z X > Z false
5788 // min(X, Y) != Z X < Z true
5789 // max(X, Y) != Z X > Z true
5790 return replaceInstUsesWith(
5791 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5792 } else {
5793 // Expr Fact Result
5794 // min(X, Y) == Z X > Z Y == Z
5795 // max(X, Y) == Z X < Z Y == Z
5796 // min(X, Y) != Z X > Z Y != Z
5797 // max(X, Y) != Z X < Z Y != Z
5798 return FoldIntoCmpYZ();
5799 }
5800 break;
5801 }
5802 case ICmpInst::ICMP_SLT:
5803 case ICmpInst::ICMP_ULT:
5804 case ICmpInst::ICMP_SLE:
5805 case ICmpInst::ICMP_ULE:
5806 case ICmpInst::ICMP_SGT:
5807 case ICmpInst::ICMP_UGT:
5808 case ICmpInst::ICMP_SGE:
5809 case ICmpInst::ICMP_UGE: {
5810 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5811 if (*CmpXZ) {
5812 if (IsSame) {
5813 // Expr Fact Result
5814 // min(X, Y) < Z X < Z true
5815 // min(X, Y) <= Z X <= Z true
5816 // max(X, Y) > Z X > Z true
5817 // max(X, Y) >= Z X >= Z true
5818 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5819 } else {
5820 // Expr Fact Result
5821 // max(X, Y) < Z X < Z Y < Z
5822 // max(X, Y) <= Z X <= Z Y <= Z
5823 // min(X, Y) > Z X > Z Y > Z
5824 // min(X, Y) >= Z X >= Z Y >= Z
5825 return FoldIntoCmpYZ();
5826 }
5827 } else {
5828 if (IsSame) {
5829 // Expr Fact Result
5830 // min(X, Y) < Z X >= Z Y < Z
5831 // min(X, Y) <= Z X > Z Y <= Z
5832 // max(X, Y) > Z X <= Z Y > Z
5833 // max(X, Y) >= Z X < Z Y >= Z
5834 return FoldIntoCmpYZ();
5835 } else {
5836 // Expr Fact Result
5837 // max(X, Y) < Z X >= Z false
5838 // max(X, Y) <= Z X > Z false
5839 // min(X, Y) > Z X <= Z false
5840 // min(X, Y) >= Z X < Z false
5841 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5842 }
5843 }
5844 break;
5845 }
5846 default:
5847 break;
5848 }
5849
5850 return nullptr;
5851}
5852
5853/// Match and fold patterns like:
5854/// icmp eq/ne X, min(max(X, Lo), Hi)
5855/// which represents a range check and can be represented as a ConstantRange.
5856///
5857/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5858/// (X - Lo) u< (Hi + 1 - Lo)
5859/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5860/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5862 MinMaxIntrinsic *Min) {
5863 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5864 return nullptr;
5865
5866 const APInt *Lo = nullptr, *Hi = nullptr;
5867 if (Min->isSigned()) {
5868 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5869 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5870 return nullptr;
5871 } else {
5872 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5873 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5874 return nullptr;
5875 }
5876
5879 APInt C, Offset;
5880 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5881 CR.getEquivalentICmp(Pred, C, Offset);
5882 else
5883 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5884
5885 if (!Offset.isZero())
5886 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5887
5888 return replaceInstUsesWith(
5889 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5890}
5891
5892// Canonicalize checking for a power-of-2-or-zero value:
5894 InstCombiner::BuilderTy &Builder) {
5895 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5896 const CmpInst::Predicate Pred = I.getPredicate();
5897 Value *A = nullptr;
5898 bool CheckIs;
5899 if (I.isEquality()) {
5900 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5901 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5902 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5903 m_Deferred(A)))) ||
5904 !match(Op1, m_ZeroInt()))
5905 A = nullptr;
5906
5907 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5908 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5909 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5910 A = Op1;
5911 else if (match(Op1,
5913 A = Op0;
5914
5915 CheckIs = Pred == ICmpInst::ICMP_EQ;
5916 } else if (ICmpInst::isUnsigned(Pred)) {
5917 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5918 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5919
5920 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5922 m_Specific(Op1))))) {
5923 A = Op1;
5924 CheckIs = Pred == ICmpInst::ICMP_UGE;
5925 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5927 m_Specific(Op0))))) {
5928 A = Op0;
5929 CheckIs = Pred == ICmpInst::ICMP_ULE;
5930 }
5931 }
5932
5933 if (A) {
5934 Type *Ty = A->getType();
5935 Value *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5936 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5937 ConstantInt::get(Ty, 2))
5938 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5939 ConstantInt::get(Ty, 1));
5940 }
5941
5942 return nullptr;
5943}
5944
5945/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5946using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5948 bool AllowRecursion) {
5950 if (!Inst || !Inst->hasOneUse())
5951 return;
5952
5953 switch (Inst->getOpcode()) {
5954 case Instruction::Add:
5955 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5956 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5957 break;
5958 case Instruction::Sub:
5959 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5960 break;
5961 case Instruction::Xor:
5962 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5963 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5964 break;
5965 case Instruction::Shl:
5966 if (Inst->hasNoSignedWrap())
5967 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
5968 if (Inst->hasNoUnsignedWrap())
5969 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
5970 break;
5971 case Instruction::Select:
5972 if (AllowRecursion) {
5973 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5974 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5975 }
5976 break;
5977 default:
5978 break;
5979 }
5980}
5981
5983
5988
5990 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
5991 }
5993 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
5994 }
5995 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
5997 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
5998 }
5999 bool isValid() const { return Kind != OffsetKind::Invalid; }
6001 switch (Kind) {
6003 llvm_unreachable("Invalid offset result");
6004 case OffsetKind::Value:
6005 return V0;
6006 case OffsetKind::Select:
6007 return Builder.CreateSelect(
6008 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
6009 }
6010 llvm_unreachable("Unknown OffsetKind enum");
6011 }
6012};
6013
6014/// Offset both sides of an equality icmp to see if we can save some
6015/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
6016/// Note: This operation should not introduce poison.
6018 InstCombiner::BuilderTy &Builder,
6019 const SimplifyQuery &SQ) {
6020 assert(I.isEquality() && "Expected an equality icmp");
6021 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6022 if (!Op0->getType()->isIntOrIntVectorTy())
6023 return nullptr;
6024
6025 SmallVector<OffsetOp, 4> OffsetOps;
6026 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
6027 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
6028
6029 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
6030 switch (BinOpc) {
6031 // V = shl nsw X, RHS => X = ashr V, RHS
6032 case Instruction::AShr: {
6033 const APInt *CV, *CRHS;
6034 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6035 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
6037 return nullptr;
6038 break;
6039 }
6040 // V = shl nuw X, RHS => X = lshr V, RHS
6041 case Instruction::LShr: {
6042 const APInt *CV, *CRHS;
6043 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6044 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
6046 return nullptr;
6047 break;
6048 }
6049 default:
6050 break;
6051 }
6052
6053 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6054 if (!Simplified)
6055 return nullptr;
6056 // Reject constant expressions as they don't simplify things.
6057 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6058 return nullptr;
6059 // Check if the transformation introduces poison.
6060 return impliesPoison(RHS, V) ? Simplified : nullptr;
6061 };
6062
6063 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6064 Value *RHS) -> OffsetResult {
6065 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6066 if (!Sel->hasOneUse())
6067 return OffsetResult::invalid();
6068 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6069 if (!TrueVal)
6070 return OffsetResult::invalid();
6071 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6072 if (!FalseVal)
6073 return OffsetResult::invalid();
6074 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6075 }
6076 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6077 return OffsetResult::value(Simplified);
6078 return OffsetResult::invalid();
6079 };
6080
6081 for (auto [BinOp, RHS] : OffsetOps) {
6082 auto BinOpc = static_cast<unsigned>(BinOp);
6083
6084 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6085 if (!Op0Result.isValid())
6086 continue;
6087 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6088 if (!Op1Result.isValid())
6089 continue;
6090
6091 Value *NewLHS = Op0Result.materialize(Builder);
6092 Value *NewRHS = Op1Result.materialize(Builder);
6093 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6094 }
6095
6096 return nullptr;
6097}
6098
6100 if (!I.isEquality())
6101 return nullptr;
6102
6103 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6104 const CmpInst::Predicate Pred = I.getPredicate();
6105 Value *A, *B, *C, *D;
6106 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6107 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6108 Value *OtherVal = A == Op1 ? B : A;
6109 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6110 }
6111
6112 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6113 // A^c1 == C^c2 --> A == C^(c1^c2)
6114 ConstantInt *C1, *C2;
6115 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6116 Op1->hasOneUse()) {
6117 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6118 Value *Xor = Builder.CreateXor(C, NC);
6119 return new ICmpInst(Pred, A, Xor);
6120 }
6121
6122 // A^B == A^D -> B == D
6123 if (A == C)
6124 return new ICmpInst(Pred, B, D);
6125 if (A == D)
6126 return new ICmpInst(Pred, B, C);
6127 if (B == C)
6128 return new ICmpInst(Pred, A, D);
6129 if (B == D)
6130 return new ICmpInst(Pred, A, C);
6131 }
6132 }
6133
6134 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6135 // A == (A^B) -> B == 0
6136 Value *OtherVal = A == Op0 ? B : A;
6137 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6138 }
6139
6140 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6141 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6142 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6143 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6144
6145 if (A == C) {
6146 X = B;
6147 Y = D;
6148 Z = A;
6149 } else if (A == D) {
6150 X = B;
6151 Y = C;
6152 Z = A;
6153 } else if (B == C) {
6154 X = A;
6155 Y = D;
6156 Z = B;
6157 } else if (B == D) {
6158 X = A;
6159 Y = C;
6160 Z = B;
6161 }
6162
6163 if (X) {
6164 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6165 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6166 // instructions.
6167 const APInt *C0, *C1;
6168 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6169 (*C0 ^ *C1).isNegatedPowerOf2();
6170
6171 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6172 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6173 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6174 int UseCnt =
6175 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6176 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6177 if (XorIsNegP2 || UseCnt >= 2) {
6178 // Build (X^Y) & Z
6179 Op1 = Builder.CreateXor(X, Y);
6180 Op1 = Builder.CreateAnd(Op1, Z);
6181 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6182 }
6183 }
6184 }
6185
6186 {
6187 // Similar to above, but specialized for constant because invert is needed:
6188 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6189 Value *X, *Y;
6190 Constant *C;
6191 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6192 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6193 Value *Xor = Builder.CreateXor(X, Y);
6194 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6195 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6196 }
6197 }
6198
6199 if (match(Op1, m_ZExt(m_Value(A))) &&
6200 (Op0->hasOneUse() || Op1->hasOneUse())) {
6201 // (B & (Pow2C-1)) == zext A --> A == trunc B
6202 // (B & (Pow2C-1)) != zext A --> A != trunc B
6203 const APInt *MaskC;
6204 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6205 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6206 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6207 }
6208
6209 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6210 // For lshr and ashr pairs.
6211 const APInt *AP1, *AP2;
6212 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6213 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6214 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6215 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6216 if (*AP1 != *AP2)
6217 return nullptr;
6218 unsigned TypeBits = AP1->getBitWidth();
6219 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6220 if (ShAmt < TypeBits && ShAmt != 0) {
6221 ICmpInst::Predicate NewPred =
6223 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6224 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6225 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6226 }
6227 }
6228
6229 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6230 ConstantInt *Cst1;
6231 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6232 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6233 unsigned TypeBits = Cst1->getBitWidth();
6234 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6235 if (ShAmt < TypeBits && ShAmt != 0) {
6236 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6237 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6238 Value *And =
6239 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6240 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6241 }
6242 }
6243
6244 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6245 // "icmp (and X, mask), cst"
6246 uint64_t ShAmt = 0;
6247 if (Op0->hasOneUse() &&
6248 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6249 match(Op1, m_ConstantInt(Cst1)) &&
6250 // Only do this when A has multiple uses. This is most important to do
6251 // when it exposes other optimizations.
6252 !A->hasOneUse()) {
6253 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6254
6255 if (ShAmt < ASize) {
6256 APInt MaskV =
6258 MaskV <<= ShAmt;
6259
6260 APInt CmpV = Cst1->getValue().zext(ASize);
6261 CmpV <<= ShAmt;
6262
6263 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6264 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6265 }
6266 }
6267
6269 return ICmp;
6270
6271 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6272 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6273 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6274 // few steps of instcombine.
6275 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6276 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6278 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6279 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6281 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6282 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6284 Add, ConstantInt::get(A->getType(), C.shl(1)));
6285 }
6286
6287 // Canonicalize:
6288 // Assume B_Pow2 != 0
6289 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6290 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6291 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6292 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6293 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6295
6296 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6297 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6298 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6299 ConstantInt::getNullValue(Op1->getType()));
6300
6301 // Canonicalize:
6302 // icmp eq/ne X, OneUse(rotate-right(X))
6303 // -> icmp eq/ne X, rotate-left(X)
6304 // We generally try to convert rotate-right -> rotate-left, this just
6305 // canonicalizes another case.
6306 if (match(&I, m_c_ICmp(m_Value(A),
6308 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6309 return new ICmpInst(
6310 Pred, A,
6311 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6312
6313 // Canonicalize:
6314 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6315 Constant *Cst;
6318 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6319
6320 {
6321 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6322 auto m_Matcher =
6325 m_Sub(m_Value(B), m_Deferred(A)));
6326 std::optional<bool> IsZero = std::nullopt;
6327 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6328 m_Deferred(A))))
6329 IsZero = false;
6330 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6331 else if (match(&I,
6332 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6333 IsZero = true;
6334
6335 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6336 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6337 // -> (icmp eq/ne (and X, P2), 0)
6338 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6339 // -> (icmp eq/ne (and X, P2), P2)
6340 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6341 *IsZero ? A
6342 : ConstantInt::getNullValue(A->getType()));
6343 }
6344
6345 if (auto *Res = foldICmpEqualityWithOffset(
6346 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6347 return Res;
6348
6349 return nullptr;
6350}
6351
6353 ICmpInst::Predicate Pred = ICmp.getPredicate();
6354 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6355
6356 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6357 // The trunc masks high bits while the compare may effectively mask low bits.
6358 Value *X;
6359 const APInt *C;
6360 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6361 return nullptr;
6362
6363 // This matches patterns corresponding to tests of the signbit as well as:
6364 // (trunc X) pred C2 --> (X & Mask) == C
6365 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6366 /*AllowNonZeroC=*/true)) {
6367 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6368 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6369 return new ICmpInst(Res->Pred, And, C);
6370 }
6371
6372 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6373 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6374 if (II->getIntrinsicID() == Intrinsic::cttz ||
6375 II->getIntrinsicID() == Intrinsic::ctlz) {
6376 unsigned MaxRet = SrcBits;
6377 // If the "is_zero_poison" argument is set, then we know at least
6378 // one bit is set in the input, so the result is always at least one
6379 // less than the full bitwidth of that input.
6380 if (match(II->getArgOperand(1), m_One()))
6381 MaxRet--;
6382
6383 // Make sure the destination is wide enough to hold the largest output of
6384 // the intrinsic.
6385 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6386 if (Instruction *I =
6387 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6388 return I;
6389 }
6390 }
6391
6392 return nullptr;
6393}
6394
6396 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6397 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6398 Value *X;
6399 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6400 return nullptr;
6401
6402 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6403 bool IsSignedCmp = ICmp.isSigned();
6404
6405 // icmp Pred (ext X), (ext Y)
6406 Value *Y;
6407 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6408 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6409 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6410
6411 if (IsZext0 != IsZext1) {
6412 // If X and Y and both i1
6413 // (icmp eq/ne (zext X) (sext Y))
6414 // eq -> (icmp eq (or X, Y), 0)
6415 // ne -> (icmp ne (or X, Y), 0)
6416 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6417 Y->getType()->isIntOrIntVectorTy(1))
6418 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6419 Constant::getNullValue(X->getType()));
6420
6421 // If we have mismatched casts and zext has the nneg flag, we can
6422 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6423
6424 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6425 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6426
6427 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6428 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6429
6430 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6431 IsSignedExt = true;
6432 else
6433 return nullptr;
6434 }
6435
6436 // Not an extension from the same type?
6437 Type *XTy = X->getType(), *YTy = Y->getType();
6438 if (XTy != YTy) {
6439 // One of the casts must have one use because we are creating a new cast.
6440 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6441 return nullptr;
6442 // Extend the narrower operand to the type of the wider operand.
6443 CastInst::CastOps CastOpcode =
6444 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6445 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6446 X = Builder.CreateCast(CastOpcode, X, YTy);
6447 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6448 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6449 else
6450 return nullptr;
6451 }
6452
6453 // (zext X) == (zext Y) --> X == Y
6454 // (sext X) == (sext Y) --> X == Y
6455 if (ICmp.isEquality())
6456 return new ICmpInst(ICmp.getPredicate(), X, Y);
6457
6458 // A signed comparison of sign extended values simplifies into a
6459 // signed comparison.
6460 if (IsSignedCmp && IsSignedExt)
6461 return new ICmpInst(ICmp.getPredicate(), X, Y);
6462
6463 // The other three cases all fold into an unsigned comparison.
6464 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6465 }
6466
6467 // Below here, we are only folding a compare with constant.
6468 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6469 if (!C)
6470 return nullptr;
6471
6472 // If a lossless truncate is possible...
6473 Type *SrcTy = CastOp0->getSrcTy();
6474 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6475 if (Res) {
6476 if (ICmp.isEquality())
6477 return new ICmpInst(ICmp.getPredicate(), X, Res);
6478
6479 // A signed comparison of sign extended values simplifies into a
6480 // signed comparison.
6481 if (IsSignedExt && IsSignedCmp)
6482 return new ICmpInst(ICmp.getPredicate(), X, Res);
6483
6484 // The other three cases all fold into an unsigned comparison.
6485 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6486 }
6487
6488 // The re-extended constant changed, partly changed (in the case of a vector),
6489 // or could not be determined to be equal (in the case of a constant
6490 // expression), so the constant cannot be represented in the shorter type.
6491 // All the cases that fold to true or false will have already been handled
6492 // by simplifyICmpInst, so only deal with the tricky case.
6493 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6494 return nullptr;
6495
6496 // Is source op positive?
6497 // icmp ult (sext X), C --> icmp sgt X, -1
6498 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6500
6501 // Is source op negative?
6502 // icmp ugt (sext X), C --> icmp slt X, 0
6503 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6505}
6506
6507/// Handle icmp (cast x), (cast or constant).
6509 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6510 // icmp compares only pointer's value.
6511 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6512 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6513 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6514 if (SimplifiedOp0 || SimplifiedOp1)
6515 return new ICmpInst(ICmp.getPredicate(),
6516 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6517 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6518
6519 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6520 if (!CastOp0)
6521 return nullptr;
6522 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6523 return nullptr;
6524
6525 Value *Op0Src = CastOp0->getOperand(0);
6526 Type *SrcTy = CastOp0->getSrcTy();
6527 Type *DestTy = CastOp0->getDestTy();
6528
6529 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6530 // integer type is the same size as the pointer type.
6531 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6532 if (isa<VectorType>(PtrTy)) {
6533 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6534 IntTy = cast<VectorType>(IntTy)->getElementType();
6535 }
6536 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6537 };
6538 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6539 CompatibleSizes(SrcTy, DestTy)) {
6540 Value *NewOp1 = nullptr;
6541 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6542 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6543 if (PtrSrc->getType() == Op0Src->getType())
6544 NewOp1 = PtrToIntOp1->getOperand(0);
6545 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6546 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6547 }
6548
6549 if (NewOp1)
6550 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6551 }
6552
6553 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6554 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6555 CompatibleSizes(DestTy, SrcTy)) {
6556 Value *NewOp1 = nullptr;
6557 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6558 Value *IntSrc = IntToPtrOp1->getOperand(0);
6559 if (IntSrc->getType() == Op0Src->getType())
6560 NewOp1 = IntToPtrOp1->getOperand(0);
6561 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6562 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6563 }
6564
6565 if (NewOp1)
6566 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6567 }
6568
6569 if (Instruction *R = foldICmpWithTrunc(ICmp))
6570 return R;
6571
6572 return foldICmpWithZextOrSext(ICmp);
6573}
6574
6576 bool IsSigned) {
6577 switch (BinaryOp) {
6578 default:
6579 llvm_unreachable("Unsupported binary op");
6580 case Instruction::Add:
6581 case Instruction::Sub:
6582 return match(RHS, m_Zero());
6583 case Instruction::Mul:
6584 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6585 match(RHS, m_One());
6586 }
6587}
6588
6591 bool IsSigned, Value *LHS, Value *RHS,
6592 Instruction *CxtI) const {
6593 switch (BinaryOp) {
6594 default:
6595 llvm_unreachable("Unsupported binary op");
6596 case Instruction::Add:
6597 if (IsSigned)
6598 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6599 else
6600 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6601 case Instruction::Sub:
6602 if (IsSigned)
6603 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6604 else
6605 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6606 case Instruction::Mul:
6607 if (IsSigned)
6608 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6609 else
6610 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6611 }
6612}
6613
6614bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6615 bool IsSigned, Value *LHS,
6616 Value *RHS, Instruction &OrigI,
6617 Value *&Result,
6618 Constant *&Overflow) {
6619 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6620 std::swap(LHS, RHS);
6621
6622 // If the overflow check was an add followed by a compare, the insertion point
6623 // may be pointing to the compare. We want to insert the new instructions
6624 // before the add in case there are uses of the add between the add and the
6625 // compare.
6626 Builder.SetInsertPoint(&OrigI);
6627
6628 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6629 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6630 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6631
6632 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6633 Result = LHS;
6634 Overflow = ConstantInt::getFalse(OverflowTy);
6635 return true;
6636 }
6637
6638 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6640 return false;
6643 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6644 Result->takeName(&OrigI);
6645 Overflow = ConstantInt::getTrue(OverflowTy);
6646 return true;
6648 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6649 Result->takeName(&OrigI);
6650 Overflow = ConstantInt::getFalse(OverflowTy);
6651 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6652 if (IsSigned)
6653 Inst->setHasNoSignedWrap();
6654 else
6655 Inst->setHasNoUnsignedWrap();
6656 }
6657 return true;
6658 }
6659
6660 llvm_unreachable("Unexpected overflow result");
6661}
6662
6663/// Recognize and process idiom involving test for multiplication
6664/// overflow.
6665///
6666/// The caller has matched a pattern of the form:
6667/// I = cmp u (mul(zext A, zext B), V
6668/// The function checks if this is a test for overflow and if so replaces
6669/// multiplication with call to 'mul.with.overflow' intrinsic.
6670///
6671/// \param I Compare instruction.
6672/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6673/// the compare instruction. Must be of integer type.
6674/// \param OtherVal The other argument of compare instruction.
6675/// \returns Instruction which must replace the compare instruction, NULL if no
6676/// replacement required.
6678 const APInt *OtherVal,
6679 InstCombinerImpl &IC) {
6680 // Don't bother doing this transformation for pointers, don't do it for
6681 // vectors.
6682 if (!isa<IntegerType>(MulVal->getType()))
6683 return nullptr;
6684
6685 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6686 if (!MulInstr)
6687 return nullptr;
6688 assert(MulInstr->getOpcode() == Instruction::Mul);
6689
6690 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6691 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6692 assert(LHS->getOpcode() == Instruction::ZExt);
6693 assert(RHS->getOpcode() == Instruction::ZExt);
6694 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6695
6696 // Calculate type and width of the result produced by mul.with.overflow.
6697 Type *TyA = A->getType(), *TyB = B->getType();
6698 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6699 WidthB = TyB->getPrimitiveSizeInBits();
6700 unsigned MulWidth;
6701 Type *MulType;
6702 if (WidthB > WidthA) {
6703 MulWidth = WidthB;
6704 MulType = TyB;
6705 } else {
6706 MulWidth = WidthA;
6707 MulType = TyA;
6708 }
6709
6710 // In order to replace the original mul with a narrower mul.with.overflow,
6711 // all uses must ignore upper bits of the product. The number of used low
6712 // bits must be not greater than the width of mul.with.overflow.
6713 if (MulVal->hasNUsesOrMore(2))
6714 for (User *U : MulVal->users()) {
6715 if (U == &I)
6716 continue;
6717 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6718 // Check if truncation ignores bits above MulWidth.
6719 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6720 if (TruncWidth > MulWidth)
6721 return nullptr;
6722 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6723 // Check if AND ignores bits above MulWidth.
6724 if (BO->getOpcode() != Instruction::And)
6725 return nullptr;
6726 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6727 const APInt &CVal = CI->getValue();
6728 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6729 return nullptr;
6730 } else {
6731 // In this case we could have the operand of the binary operation
6732 // being defined in another block, and performing the replacement
6733 // could break the dominance relation.
6734 return nullptr;
6735 }
6736 } else {
6737 // Other uses prohibit this transformation.
6738 return nullptr;
6739 }
6740 }
6741
6742 // Recognize patterns
6743 switch (I.getPredicate()) {
6744 case ICmpInst::ICMP_UGT: {
6745 // Recognize pattern:
6746 // mulval = mul(zext A, zext B)
6747 // cmp ugt mulval, max
6748 APInt MaxVal = APInt::getMaxValue(MulWidth);
6749 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6750 if (MaxVal.eq(*OtherVal))
6751 break; // Recognized
6752 return nullptr;
6753 }
6754
6755 case ICmpInst::ICMP_ULT: {
6756 // Recognize pattern:
6757 // mulval = mul(zext A, zext B)
6758 // cmp ule mulval, max + 1
6759 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6760 if (MaxVal.eq(*OtherVal))
6761 break; // Recognized
6762 return nullptr;
6763 }
6764
6765 default:
6766 return nullptr;
6767 }
6768
6769 InstCombiner::BuilderTy &Builder = IC.Builder;
6770 Builder.SetInsertPoint(MulInstr);
6771
6772 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6773 Value *MulA = A, *MulB = B;
6774 if (WidthA < MulWidth)
6775 MulA = Builder.CreateZExt(A, MulType);
6776 if (WidthB < MulWidth)
6777 MulB = Builder.CreateZExt(B, MulType);
6778 Value *Call =
6779 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6780 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6781 IC.addToWorklist(MulInstr);
6782
6783 // If there are uses of mul result other than the comparison, we know that
6784 // they are truncation or binary AND. Change them to use result of
6785 // mul.with.overflow and adjust properly mask/size.
6786 if (MulVal->hasNUsesOrMore(2)) {
6787 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6788 for (User *U : make_early_inc_range(MulVal->users())) {
6789 if (U == &I)
6790 continue;
6791 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6792 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6793 IC.replaceInstUsesWith(*TI, Mul);
6794 else
6795 TI->setOperand(0, Mul);
6796 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6797 assert(BO->getOpcode() == Instruction::And);
6798 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6799 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6800 APInt ShortMask = CI->getValue().trunc(MulWidth);
6801 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6802 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6803 IC.replaceInstUsesWith(*BO, Zext);
6804 } else {
6805 llvm_unreachable("Unexpected Binary operation");
6806 }
6808 }
6809 }
6810
6811 // The original icmp gets replaced with the overflow value, maybe inverted
6812 // depending on predicate.
6813 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6814 Value *Res = Builder.CreateExtractValue(Call, 1);
6815 return BinaryOperator::CreateNot(Res);
6816 }
6817
6818 return ExtractValueInst::Create(Call, 1);
6819}
6820
6821/// When performing a comparison against a constant, it is possible that not all
6822/// the bits in the LHS are demanded. This helper method computes the mask that
6823/// IS demanded.
6825 const APInt *RHS;
6826 if (!match(I.getOperand(1), m_APInt(RHS)))
6828
6829 // If this is a normal comparison, it demands all bits. If it is a sign bit
6830 // comparison, it only demands the sign bit.
6831 bool UnusedBit;
6832 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6834
6835 switch (I.getPredicate()) {
6836 // For a UGT comparison, we don't care about any bits that
6837 // correspond to the trailing ones of the comparand. The value of these
6838 // bits doesn't impact the outcome of the comparison, because any value
6839 // greater than the RHS must differ in a bit higher than these due to carry.
6840 case ICmpInst::ICMP_UGT:
6841 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6842
6843 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6844 // Any value less than the RHS must differ in a higher bit because of carries.
6845 case ICmpInst::ICMP_ULT:
6846 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6847
6848 default:
6850 }
6851}
6852
6853/// Check that one use is in the same block as the definition and all
6854/// other uses are in blocks dominated by a given block.
6855///
6856/// \param DI Definition
6857/// \param UI Use
6858/// \param DB Block that must dominate all uses of \p DI outside
6859/// the parent block
6860/// \return true when \p UI is the only use of \p DI in the parent block
6861/// and all other uses of \p DI are in blocks dominated by \p DB.
6862///
6864 const Instruction *UI,
6865 const BasicBlock *DB) const {
6866 assert(DI && UI && "Instruction not defined\n");
6867 // Ignore incomplete definitions.
6868 if (!DI->getParent())
6869 return false;
6870 // DI and UI must be in the same block.
6871 if (DI->getParent() != UI->getParent())
6872 return false;
6873 // Protect from self-referencing blocks.
6874 if (DI->getParent() == DB)
6875 return false;
6876 for (const User *U : DI->users()) {
6877 auto *Usr = cast<Instruction>(U);
6878 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6879 return false;
6880 }
6881 return true;
6882}
6883
6884/// Return true when the instruction sequence within a block is select-cmp-br.
6886 const BasicBlock *BB = SI->getParent();
6887 if (!BB)
6888 return false;
6890 if (!BI)
6891 return false;
6892 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6893 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6894 return false;
6895 return true;
6896}
6897
6898/// True when a select result is replaced by one of its operands
6899/// in select-icmp sequence. This will eventually result in the elimination
6900/// of the select.
6901///
6902/// \param SI Select instruction
6903/// \param Icmp Compare instruction
6904/// \param SIOpd Operand that replaces the select
6905///
6906/// Notes:
6907/// - The replacement is global and requires dominator information
6908/// - The caller is responsible for the actual replacement
6909///
6910/// Example:
6911///
6912/// entry:
6913/// %4 = select i1 %3, %C* %0, %C* null
6914/// %5 = icmp eq %C* %4, null
6915/// br i1 %5, label %9, label %7
6916/// ...
6917/// ; <label>:7 ; preds = %entry
6918/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6919/// ...
6920///
6921/// can be transformed to
6922///
6923/// %5 = icmp eq %C* %0, null
6924/// %6 = select i1 %3, i1 %5, i1 true
6925/// br i1 %6, label %9, label %7
6926/// ...
6927/// ; <label>:7 ; preds = %entry
6928/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6929///
6930/// Similar when the first operand of the select is a constant or/and
6931/// the compare is for not equal rather than equal.
6932///
6933/// NOTE: The function is only called when the select and compare constants
6934/// are equal, the optimization can work only for EQ predicates. This is not a
6935/// major restriction since a NE compare should be 'normalized' to an equal
6936/// compare, which usually happens in the combiner and test case
6937/// select-cmp-br.ll checks for it.
6939 const ICmpInst *Icmp,
6940 const unsigned SIOpd) {
6941 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6943 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6944 // The check for the single predecessor is not the best that can be
6945 // done. But it protects efficiently against cases like when SI's
6946 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6947 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6948 // replaced can be reached on either path. So the uniqueness check
6949 // guarantees that the path all uses of SI (outside SI's parent) are on
6950 // is disjoint from all other paths out of SI. But that information
6951 // is more expensive to compute, and the trade-off here is in favor
6952 // of compile-time. It should also be noticed that we check for a single
6953 // predecessor and not only uniqueness. This to handle the situation when
6954 // Succ and Succ1 points to the same basic block.
6955 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6956 NumSel++;
6957 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6958 return true;
6959 }
6960 }
6961 return false;
6962}
6963
6964/// Try to fold the comparison based on range information we can get by checking
6965/// whether bits are known to be zero or one in the inputs.
6967 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6968 Type *Ty = Op0->getType();
6969 ICmpInst::Predicate Pred = I.getPredicate();
6970
6971 // Get scalar or pointer size.
6972 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6973 ? Ty->getScalarSizeInBits()
6974 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6975
6976 if (!BitWidth)
6977 return nullptr;
6978
6979 KnownBits Op0Known(BitWidth);
6980 KnownBits Op1Known(BitWidth);
6981
6982 {
6983 // Don't use dominating conditions when folding icmp using known bits. This
6984 // may convert signed into unsigned predicates in ways that other passes
6985 // (especially IndVarSimplify) may not be able to reliably undo.
6986 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6988 Op0Known, Q))
6989 return &I;
6990
6991 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6992 return &I;
6993 }
6994
6995 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6996 return new ICmpInst(
6997 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6998 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6999 return new ICmpInst(
7000 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
7001
7002 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
7003 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
7004
7005 // Given the known and unknown bits, compute a range that the LHS could be
7006 // in. Compute the Min, Max and RHS values based on the known bits. For the
7007 // EQ and NE we use unsigned values.
7008 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
7009 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
7010 if (I.isSigned()) {
7011 Op0Min = Op0Known.getSignedMinValue();
7012 Op0Max = Op0Known.getSignedMaxValue();
7013 Op1Min = Op1Known.getSignedMinValue();
7014 Op1Max = Op1Known.getSignedMaxValue();
7015 } else {
7016 Op0Min = Op0Known.getMinValue();
7017 Op0Max = Op0Known.getMaxValue();
7018 Op1Min = Op1Known.getMinValue();
7019 Op1Max = Op1Known.getMaxValue();
7020 }
7021
7022 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
7023 // min/max canonical compare with some other compare. That could lead to
7024 // conflict with select canonicalization and infinite looping.
7025 // FIXME: This constraint may go away if min/max intrinsics are canonical.
7026 auto isMinMaxCmp = [&](Instruction &Cmp) {
7027 if (!Cmp.hasOneUse())
7028 return false;
7029 Value *A, *B;
7030 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
7032 return false;
7033 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
7034 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
7035 };
7036 if (!isMinMaxCmp(I)) {
7037 switch (Pred) {
7038 default:
7039 break;
7040 case ICmpInst::ICMP_ULT: {
7041 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
7042 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7043 const APInt *CmpC;
7044 if (match(Op1, m_APInt(CmpC))) {
7045 // A <u C -> A == C-1 if min(A)+1 == C
7046 if (*CmpC == Op0Min + 1)
7047 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7048 ConstantInt::get(Op1->getType(), *CmpC - 1));
7049 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7050 // exceeds the log2 of C.
7051 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7052 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7053 Constant::getNullValue(Op1->getType()));
7054 }
7055 break;
7056 }
7057 case ICmpInst::ICMP_UGT: {
7058 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7059 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7060 const APInt *CmpC;
7061 if (match(Op1, m_APInt(CmpC))) {
7062 // A >u C -> A == C+1 if max(a)-1 == C
7063 if (*CmpC == Op0Max - 1)
7064 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7065 ConstantInt::get(Op1->getType(), *CmpC + 1));
7066 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7067 // exceeds the log2 of C.
7068 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7069 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7070 Constant::getNullValue(Op1->getType()));
7071 }
7072 break;
7073 }
7074 case ICmpInst::ICMP_SLT: {
7075 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7076 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7077 const APInt *CmpC;
7078 if (match(Op1, m_APInt(CmpC))) {
7079 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7080 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7081 ConstantInt::get(Op1->getType(), *CmpC - 1));
7082 }
7083 break;
7084 }
7085 case ICmpInst::ICMP_SGT: {
7086 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7087 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7088 const APInt *CmpC;
7089 if (match(Op1, m_APInt(CmpC))) {
7090 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7091 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7092 ConstantInt::get(Op1->getType(), *CmpC + 1));
7093 }
7094 break;
7095 }
7096 }
7097 }
7098
7099 // Based on the range information we know about the LHS, see if we can
7100 // simplify this comparison. For example, (x&4) < 8 is always true.
7101 switch (Pred) {
7102 default:
7103 break;
7104 case ICmpInst::ICMP_EQ:
7105 case ICmpInst::ICMP_NE: {
7106 // If all bits are known zero except for one, then we know at most one bit
7107 // is set. If the comparison is against zero, then this is a check to see if
7108 // *that* bit is set.
7109 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7110 if (Op1Known.isZero()) {
7111 // If the LHS is an AND with the same constant, look through it.
7112 Value *LHS = nullptr;
7113 const APInt *LHSC;
7114 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7115 *LHSC != Op0KnownZeroInverted)
7116 LHS = Op0;
7117
7118 Value *X;
7119 const APInt *C1;
7120 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7121 Type *XTy = X->getType();
7122 unsigned Log2C1 = C1->countr_zero();
7123 APInt C2 = Op0KnownZeroInverted;
7124 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7125 if (C2Pow2.isPowerOf2()) {
7126 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7127 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7128 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7129 unsigned Log2C2 = C2Pow2.countr_zero();
7130 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7131 auto NewPred =
7133 return new ICmpInst(NewPred, X, CmpC);
7134 }
7135 }
7136 }
7137
7138 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7139 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7140 (Op0Known & Op1Known) == Op0Known)
7141 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7142 ConstantInt::getNullValue(Op1->getType()));
7143 break;
7144 }
7145 case ICmpInst::ICMP_SGE:
7146 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7147 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7148 break;
7149 case ICmpInst::ICMP_SLE:
7150 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7151 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7152 break;
7153 case ICmpInst::ICMP_UGE:
7154 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7155 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7156 break;
7157 case ICmpInst::ICMP_ULE:
7158 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7159 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7160 break;
7161 }
7162
7163 // Turn a signed comparison into an unsigned one if both operands are known to
7164 // have the same sign. Set samesign if possible (except for equality
7165 // predicates).
7166 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7167 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7168 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7169 I.setPredicate(I.getUnsignedPredicate());
7170 I.setSameSign();
7171 return &I;
7172 }
7173
7174 return nullptr;
7175}
7176
7177/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7178/// then try to reduce patterns based on that limit.
7180 Value *X, *Y;
7181 CmpPredicate Pred;
7182
7183 // X must be 0 and bool must be true for "ULT":
7184 // X <u (zext i1 Y) --> (X == 0) & Y
7185 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7186 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7187 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7188
7189 // X must be 0 or bool must be true for "ULE":
7190 // X <=u (sext i1 Y) --> (X == 0) | Y
7191 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7192 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7193 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7194
7195 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7196 CmpPredicate Pred1, Pred2;
7197 const APInt *C;
7198 Instruction *ExtI;
7199 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7202 m_APInt(C)))))) &&
7203 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7204 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7205 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7206 auto CreateRangeCheck = [&] {
7207 Value *CmpV1 =
7208 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7209 Value *CmpV2 = Builder.CreateICmp(
7210 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7212 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7213 CmpV1, CmpV2);
7214 };
7215 if (C->isZero()) {
7216 if (Pred2 == ICmpInst::ICMP_EQ) {
7217 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7218 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7219 return replaceInstUsesWith(
7220 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7221 } else if (!IsSExt || HasOneUse) {
7222 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7223 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7224 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7225 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7226 return CreateRangeCheck();
7227 }
7228 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7229 if (Pred2 == ICmpInst::ICMP_NE) {
7230 // icmp eq X, (zext (icmp ne X, 1)) --> false
7231 // icmp ne X, (zext (icmp ne X, 1)) --> true
7232 // icmp eq X, (sext (icmp ne X, -1)) --> false
7233 // icmp ne X, (sext (icmp ne X, -1)) --> true
7234 return replaceInstUsesWith(
7235 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7236 } else if (!IsSExt || HasOneUse) {
7237 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7238 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7239 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7240 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7241 return CreateRangeCheck();
7242 }
7243 } else {
7244 // when C != 0 && C != 1:
7245 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7246 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7247 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7248 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7249 // when C != 0 && C != -1:
7250 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7251 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7252 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7253 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7254 return ICmpInst::Create(
7255 Instruction::ICmp, Pred1, X,
7256 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7257 ? (IsSExt ? -1 : 1)
7258 : 0));
7259 }
7260 }
7261
7262 return nullptr;
7263}
7264
7265/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7266/// it into the appropriate icmp lt or icmp gt instruction. This transform
7267/// allows them to be folded in visitICmpInst.
7269 ICmpInst::Predicate Pred = I.getPredicate();
7270 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7272 return nullptr;
7273
7274 Value *Op0 = I.getOperand(0);
7275 Value *Op1 = I.getOperand(1);
7276 auto *Op1C = dyn_cast<Constant>(Op1);
7277 if (!Op1C)
7278 return nullptr;
7279
7280 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7281 if (!FlippedStrictness)
7282 return nullptr;
7283
7284 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7285}
7286
7287/// If we have a comparison with a non-canonical predicate, if we can update
7288/// all the users, invert the predicate and adjust all the users.
7290 // Is the predicate already canonical?
7291 CmpInst::Predicate Pred = I.getPredicate();
7293 return nullptr;
7294
7295 // Can all users be adjusted to predicate inversion?
7296 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7297 return nullptr;
7298
7299 // Ok, we can canonicalize comparison!
7300 // Let's first invert the comparison's predicate.
7301 I.setPredicate(CmpInst::getInversePredicate(Pred));
7302 I.setName(I.getName() + ".not");
7303
7304 // And, adapt users.
7306
7307 return &I;
7308}
7309
7310/// Integer compare with boolean values can always be turned into bitwise ops.
7312 InstCombiner::BuilderTy &Builder) {
7313 Value *A = I.getOperand(0), *B = I.getOperand(1);
7314 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7315
7316 // A boolean compared to true/false can be simplified to Op0/true/false in
7317 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7318 // Cases not handled by InstSimplify are always 'not' of Op0.
7319 if (match(B, m_Zero())) {
7320 switch (I.getPredicate()) {
7321 case CmpInst::ICMP_EQ: // A == 0 -> !A
7322 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7323 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7325 default:
7326 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7327 }
7328 } else if (match(B, m_One())) {
7329 switch (I.getPredicate()) {
7330 case CmpInst::ICMP_NE: // A != 1 -> !A
7331 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7332 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7334 default:
7335 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7336 }
7337 }
7338
7339 switch (I.getPredicate()) {
7340 default:
7341 llvm_unreachable("Invalid icmp instruction!");
7342 case ICmpInst::ICMP_EQ:
7343 // icmp eq i1 A, B -> ~(A ^ B)
7344 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7345
7346 case ICmpInst::ICMP_NE:
7347 // icmp ne i1 A, B -> A ^ B
7348 return BinaryOperator::CreateXor(A, B);
7349
7350 case ICmpInst::ICMP_UGT:
7351 // icmp ugt -> icmp ult
7352 std::swap(A, B);
7353 [[fallthrough]];
7354 case ICmpInst::ICMP_ULT:
7355 // icmp ult i1 A, B -> ~A & B
7356 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7357
7358 case ICmpInst::ICMP_SGT:
7359 // icmp sgt -> icmp slt
7360 std::swap(A, B);
7361 [[fallthrough]];
7362 case ICmpInst::ICMP_SLT:
7363 // icmp slt i1 A, B -> A & ~B
7364 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7365
7366 case ICmpInst::ICMP_UGE:
7367 // icmp uge -> icmp ule
7368 std::swap(A, B);
7369 [[fallthrough]];
7370 case ICmpInst::ICMP_ULE:
7371 // icmp ule i1 A, B -> ~A | B
7372 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7373
7374 case ICmpInst::ICMP_SGE:
7375 // icmp sge -> icmp sle
7376 std::swap(A, B);
7377 [[fallthrough]];
7378 case ICmpInst::ICMP_SLE:
7379 // icmp sle i1 A, B -> A | ~B
7380 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7381 }
7382}
7383
7384// Transform pattern like:
7385// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7386// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7387// Into:
7388// (X l>> Y) != 0
7389// (X l>> Y) == 0
7391 InstCombiner::BuilderTy &Builder) {
7392 CmpPredicate Pred, NewPred;
7393 Value *X, *Y;
7394 if (match(&Cmp,
7395 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7396 switch (Pred) {
7397 case ICmpInst::ICMP_ULE:
7398 NewPred = ICmpInst::ICMP_NE;
7399 break;
7400 case ICmpInst::ICMP_UGT:
7401 NewPred = ICmpInst::ICMP_EQ;
7402 break;
7403 default:
7404 return nullptr;
7405 }
7406 } else if (match(&Cmp, m_c_ICmp(Pred,
7409 m_Add(m_Shl(m_One(), m_Value(Y)),
7410 m_AllOnes()))),
7411 m_Value(X)))) {
7412 // The variant with 'add' is not canonical, (the variant with 'not' is)
7413 // we only get it because it has extra uses, and can't be canonicalized,
7414
7415 switch (Pred) {
7416 case ICmpInst::ICMP_ULT:
7417 NewPred = ICmpInst::ICMP_NE;
7418 break;
7419 case ICmpInst::ICMP_UGE:
7420 NewPred = ICmpInst::ICMP_EQ;
7421 break;
7422 default:
7423 return nullptr;
7424 }
7425 } else
7426 return nullptr;
7427
7428 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7429 Constant *Zero = Constant::getNullValue(NewX->getType());
7430 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7431}
7432
7434 InstCombiner::BuilderTy &Builder) {
7435 const CmpInst::Predicate Pred = Cmp.getPredicate();
7436 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7437 Value *V1, *V2;
7438
7439 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7440 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7441 if (auto *I = dyn_cast<Instruction>(V))
7442 I->copyIRFlags(&Cmp);
7443 Module *M = Cmp.getModule();
7445 M, Intrinsic::vector_reverse, V->getType());
7446 return CallInst::Create(F, V);
7447 };
7448
7449 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7450 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7451 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7452 (LHS->hasOneUse() || RHS->hasOneUse()))
7453 return createCmpReverse(Pred, V1, V2);
7454
7455 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7456 if (LHS->hasOneUse() && isSplatValue(RHS))
7457 return createCmpReverse(Pred, V1, RHS);
7458 }
7459 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7460 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7461 return createCmpReverse(Pred, LHS, V2);
7462
7463 ArrayRef<int> M;
7464 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7465 return nullptr;
7466
7467 // If both arguments of the cmp are shuffles that use the same mask and
7468 // shuffle within a single vector, move the shuffle after the cmp:
7469 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7470 Type *V1Ty = V1->getType();
7471 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7472 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7473 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7474 return new ShuffleVectorInst(NewCmp, M);
7475 }
7476
7477 // Try to canonicalize compare with splatted operand and splat constant.
7478 // TODO: We could generalize this for more than splats. See/use the code in
7479 // InstCombiner::foldVectorBinop().
7480 Constant *C;
7481 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7482 return nullptr;
7483
7484 // Length-changing splats are ok, so adjust the constants as needed:
7485 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7486 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7487 int MaskSplatIndex;
7488 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7489 // We allow poison in matching, but this transform removes it for safety.
7490 // Demanded elements analysis should be able to recover some/all of that.
7491 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7492 ScalarC);
7493 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7494 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7495 return new ShuffleVectorInst(NewCmp, NewM);
7496 }
7497
7498 return nullptr;
7499}
7500
7501// extract(uadd.with.overflow(A, B), 0) ult A
7502// -> extract(uadd.with.overflow(A, B), 1)
7504 CmpInst::Predicate Pred = I.getPredicate();
7505 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7506
7507 Value *UAddOv;
7508 Value *A, *B;
7509 auto UAddOvResultPat = m_ExtractValue<0>(
7511 if (match(Op0, UAddOvResultPat) &&
7512 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7513 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7514 (match(A, m_One()) || match(B, m_One()))) ||
7515 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7516 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7517 // extract(uadd.with.overflow(A, B), 0) < A
7518 // extract(uadd.with.overflow(A, 1), 0) == 0
7519 // extract(uadd.with.overflow(A, -1), 0) != -1
7520 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7521 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7522 (Op0 == A || Op0 == B))
7523 // A > extract(uadd.with.overflow(A, B), 0)
7524 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7525 else
7526 return nullptr;
7527
7528 return ExtractValueInst::Create(UAddOv, 1);
7529}
7530
7532 if (!I.getOperand(0)->getType()->isPointerTy() ||
7534 I.getParent()->getParent(),
7535 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7536 return nullptr;
7537 }
7538 Instruction *Op;
7539 if (match(I.getOperand(0), m_Instruction(Op)) &&
7540 match(I.getOperand(1), m_Zero()) &&
7541 Op->isLaunderOrStripInvariantGroup()) {
7542 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7543 Op->getOperand(0), I.getOperand(1));
7544 }
7545 return nullptr;
7546}
7547
7549 IRBuilderBase &Builder) {
7550 if (!ICmpInst::isEquality(I.getPredicate()))
7551 return nullptr;
7552
7553 // The caller puts constants after non-constants.
7554 Value *Op = I.getOperand(0);
7555 Value *Const = I.getOperand(1);
7556
7557 // For Cond an equality condition, fold
7558 //
7559 // icmp (eq|ne) (vreduce_(or|and) Op), (Zero|AllOnes) ->
7560 // icmp (eq|ne) Op, (Zero|AllOnes)
7561 //
7562 // with a bitcast.
7563 Value *Vec;
7564 if ((match(Const, m_ZeroInt()) &&
7566 m_Value(Vec))))) ||
7567 (match(Const, m_AllOnes()) &&
7569 m_Value(Vec)))))) {
7570 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
7571 if (!VecTy)
7572 return nullptr;
7573 Type *VecEltTy = VecTy->getElementType();
7574 unsigned ScalarBW =
7575 DL.getTypeSizeInBits(VecEltTy) * VecTy->getNumElements();
7576 if (!DL.fitsInLegalInteger(ScalarBW))
7577 return nullptr;
7578 Type *ScalarTy = IntegerType::get(I.getContext(), ScalarBW);
7579 Value *NewConst = match(Const, m_ZeroInt())
7580 ? ConstantInt::get(ScalarTy, 0)
7581 : ConstantInt::getAllOnesValue(ScalarTy);
7582 return CmpInst::Create(Instruction::ICmp, I.getPredicate(),
7583 Builder.CreateBitCast(Vec, ScalarTy), NewConst);
7584 }
7585 return nullptr;
7586}
7587
7588/// This function folds patterns produced by lowering of reduce idioms, such as
7589/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7590/// attempts to generate fewer number of scalar comparisons instead of vector
7591/// comparisons when possible.
7593 InstCombiner::BuilderTy &Builder,
7594 const DataLayout &DL) {
7595 if (I.getType()->isVectorTy())
7596 return nullptr;
7597 CmpPredicate OuterPred, InnerPred;
7598 Value *LHS, *RHS;
7599
7600 // Match lowering of @llvm.vector.reduce.and. Turn
7601 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7602 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7603 /// %res = icmp <pred> i8 %scalar_ne, 0
7604 ///
7605 /// into
7606 ///
7607 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7608 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7609 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7610 ///
7611 /// for <pred> in {ne, eq}.
7612 if (!match(&I, m_ICmp(OuterPred,
7614 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7615 m_Zero())))
7616 return nullptr;
7617 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7618 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7619 return nullptr;
7620 unsigned NumBits =
7621 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7622 // TODO: Relax this to "not wider than max legal integer type"?
7623 if (!DL.isLegalInteger(NumBits))
7624 return nullptr;
7625
7626 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7627 auto *ScalarTy = Builder.getIntNTy(NumBits);
7628 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7629 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7630 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7631 I.getName());
7632 }
7633
7634 return nullptr;
7635}
7636
7637// This helper will be called with icmp operands in both orders.
7639 Value *Op0, Value *Op1,
7640 ICmpInst &CxtI) {
7641 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7642 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7643 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7644 return NI;
7645
7646 if (auto *SI = dyn_cast<SelectInst>(Op0))
7647 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7648 return NI;
7649
7650 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7651 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7652 return Res;
7653
7654 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7655 return Res;
7656 }
7657
7658 {
7659 Value *X;
7660 const APInt *C;
7661 // icmp X+Cst, X
7662 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7663 return foldICmpAddOpConst(X, *C, Pred);
7664 }
7665
7666 // abs(X) >= X --> true
7667 // abs(X) u<= X --> true
7668 // abs(X) < X --> false
7669 // abs(X) u> X --> false
7670 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7671 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7672 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7673 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7674 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7675 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7676 {
7677 Value *X;
7678 Constant *C;
7680 match(Op1, m_Specific(X))) {
7681 Value *NullValue = Constant::getNullValue(X->getType());
7682 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7683 const APInt SMin =
7684 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7685 bool IsIntMinPosion = C->isAllOnesValue();
7686 switch (Pred) {
7687 case CmpInst::ICMP_ULE:
7688 case CmpInst::ICMP_SGE:
7689 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7690 case CmpInst::ICMP_UGT:
7691 case CmpInst::ICMP_SLT:
7693 case CmpInst::ICMP_UGE:
7694 case CmpInst::ICMP_SLE:
7695 case CmpInst::ICMP_EQ: {
7696 return replaceInstUsesWith(
7697 CxtI, IsIntMinPosion
7698 ? Builder.CreateICmpSGT(X, AllOnesValue)
7699 : Builder.CreateICmpULT(
7700 X, ConstantInt::get(X->getType(), SMin + 1)));
7701 }
7702 case CmpInst::ICMP_ULT:
7703 case CmpInst::ICMP_SGT:
7704 case CmpInst::ICMP_NE: {
7705 return replaceInstUsesWith(
7706 CxtI, IsIntMinPosion
7707 ? Builder.CreateICmpSLT(X, NullValue)
7708 : Builder.CreateICmpUGT(
7709 X, ConstantInt::get(X->getType(), SMin)));
7710 }
7711 default:
7712 llvm_unreachable("Invalid predicate!");
7713 }
7714 }
7715 }
7716
7717 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7718 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7719 return replaceInstUsesWith(CxtI, V);
7720
7721 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7722 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7723 {
7724 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7725 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7727 }
7728
7729 if (!ICmpInst::isUnsigned(Pred) &&
7730 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7731 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7733 }
7734 }
7735
7736 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7737 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7738 {
7739 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7740 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7742 }
7743
7744 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7745 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7746 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7748 }
7749 }
7750
7751 // icmp (shl nsw/nuw X, L), (add nsw/nuw (shl nsw/nuw Y, L), K)
7752 // -> icmp X, (add nsw/nuw Y, K >> L)
7753 // We use AShr for nsw and LShr for nuw to safely peel off the shift.
7754 Value *X;
7755 uint64_t ShAmt;
7756 if (match(Op0, m_NUWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7757 !CxtI.isSigned()) {
7758 if (ShAmt >= X->getType()->getScalarSizeInBits())
7759 return nullptr;
7760 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7761 ShiftSemantics::Unsigned, &CxtI)) {
7762 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7764 return new ICmpInst(Pred, X, NewOp1);
7765 }
7766 }
7767
7768 if (match(Op0, m_NSWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7769 !CxtI.isUnsigned()) {
7770 if (ShAmt >= X->getType()->getScalarSizeInBits())
7771 return nullptr;
7772 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7773 ShiftSemantics::Signed, &CxtI)) {
7774 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7776 return new ICmpInst(Pred, X, NewOp1);
7777 }
7778 }
7779 return nullptr;
7780}
7781
7783 bool Changed = false;
7784 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7785 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7786 unsigned Op0Cplxity = getComplexity(Op0);
7787 unsigned Op1Cplxity = getComplexity(Op1);
7788
7789 /// Orders the operands of the compare so that they are listed from most
7790 /// complex to least complex. This puts constants before unary operators,
7791 /// before binary operators.
7792 if (Op0Cplxity < Op1Cplxity) {
7793 I.swapOperands();
7794 std::swap(Op0, Op1);
7795 Changed = true;
7796 }
7797
7798 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7799 return replaceInstUsesWith(I, V);
7800
7801 // Comparing -val or val with non-zero is the same as just comparing val
7802 // ie, abs(val) != 0 -> val != 0
7803 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7804 Value *Cond, *SelectTrue, *SelectFalse;
7805 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7806 m_Value(SelectFalse)))) {
7807 if (Value *V = dyn_castNegVal(SelectTrue)) {
7808 if (V == SelectFalse)
7809 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7810 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7811 if (V == SelectTrue)
7812 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7813 }
7814 }
7815 }
7816
7818 return Res;
7819
7820 if (Op0->getType()->isIntOrIntVectorTy(1))
7822 return Res;
7823
7825 return Res;
7826
7828 return Res;
7829
7831 return Res;
7832
7834 return Res;
7835
7837 return Res;
7838
7840 return Res;
7841
7843 return Res;
7844
7845 // Test if the ICmpInst instruction is used exclusively by a select as
7846 // part of a minimum or maximum operation. If so, refrain from doing
7847 // any other folding. This helps out other analyses which understand
7848 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7849 // and CodeGen. And in this case, at least one of the comparison
7850 // operands has at least one user besides the compare (the select),
7851 // which would often largely negate the benefit of folding anyway.
7852 //
7853 // Do the same for the other patterns recognized by matchSelectPattern.
7854 if (I.hasOneUse())
7855 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7856 Value *A, *B;
7858 if (SPR.Flavor != SPF_UNKNOWN)
7859 return nullptr;
7860 }
7861
7862 // Do this after checking for min/max to prevent infinite looping.
7863 if (Instruction *Res = foldICmpWithZero(I))
7864 return Res;
7865
7866 Value *X;
7867 const APInt *C;
7868 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
7869 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7870 match(Op1, m_Not(m_Specific(X)))) {
7871 if (C->isNonNegative())
7872 return new ICmpInst(ICmpInst::ICMP_SLT, X,
7873 Constant::getNullValue(X->getType()));
7874 return new ICmpInst(ICmpInst::ICMP_UGT, X,
7875 ConstantInt::get(X->getType(), ~*C));
7876 }
7877
7878 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
7879 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7880 match(Op1, m_Not(m_Specific(X)))) {
7881 if (C->isNonNegative())
7882 return new ICmpInst(ICmpInst::ICMP_SGT, X,
7883 Constant::getAllOnesValue(X->getType()));
7884 return new ICmpInst(ICmpInst::ICMP_ULT, X,
7885 ConstantInt::get(X->getType(), ~*C));
7886 }
7887
7888 // FIXME: We only do this after checking for min/max to prevent infinite
7889 // looping caused by a reverse canonicalization of these patterns for min/max.
7890 // FIXME: The organization of folds is a mess. These would naturally go into
7891 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7892 // down here after the min/max restriction.
7893 ICmpInst::Predicate Pred = I.getPredicate();
7894 if (match(Op1, m_APInt(C))) {
7895 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7896 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7897 Constant *Zero = Constant::getNullValue(Op0->getType());
7898 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7899 }
7900
7901 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7902 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7904 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7905 }
7906 }
7907
7908 // The folds in here may rely on wrapping flags and special constants, so
7909 // they can break up min/max idioms in some cases but not seemingly similar
7910 // patterns.
7911 // FIXME: It may be possible to enhance select folding to make this
7912 // unnecessary. It may also be moot if we canonicalize to min/max
7913 // intrinsics.
7914 if (Instruction *Res = foldICmpBinOp(I, Q))
7915 return Res;
7916
7918 return Res;
7919
7920 // Try to match comparison as a sign bit test. Intentionally do this after
7921 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7922 if (Instruction *New = foldSignBitTest(I))
7923 return New;
7924
7925 if (auto *PN = dyn_cast<PHINode>(Op0))
7926 if (Instruction *NV = foldOpIntoPhi(I, PN))
7927 return NV;
7928 if (auto *PN = dyn_cast<PHINode>(Op1))
7929 if (Instruction *NV = foldOpIntoPhi(I, PN))
7930 return NV;
7931
7933 return Res;
7934
7935 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7936 return Res;
7937 if (Instruction *Res =
7938 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7939 return Res;
7940
7941 if (I.isCommutative()) {
7942 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7943 replaceOperand(I, 0, Pair->first);
7944 replaceOperand(I, 1, Pair->second);
7945 return &I;
7946 }
7947 }
7948
7949 // Fold icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
7950 // when all select arms are constants, via truth table.
7952 return R;
7953
7954 // In case of a comparison with two select instructions having the same
7955 // condition, check whether one of the resulting branches can be simplified.
7956 // If so, just compare the other branch and select the appropriate result.
7957 // For example:
7958 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7959 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7960 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7961 // The icmp will result false for the false value of selects and the result
7962 // will depend upon the comparison of true values of selects if %cmp is
7963 // true. Thus, transform this into:
7964 // %cmp = icmp slt i32 %y, %z
7965 // %sel = select i1 %cond, i1 %cmp, i1 false
7966 // This handles similar cases to transform.
7967 {
7968 Value *Cond, *A, *B, *C, *D;
7969 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7971 (Op0->hasOneUse() || Op1->hasOneUse())) {
7972 // Check whether comparison of TrueValues can be simplified
7973 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7974 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7975 return SelectInst::Create(
7976 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7978 }
7979 // Check whether comparison of FalseValues can be simplified
7980 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7981 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7982 return SelectInst::Create(
7983 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7985 }
7986 }
7987 }
7988
7989 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7990 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7991 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7992 {
7993 Value *A, *B;
7994 CmpPredicate CmpPred;
7995 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7997 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7998 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7999 bool I0NUW = I0->hasNoUnsignedWrap();
8000 bool I1NUW = I1->hasNoUnsignedWrap();
8001 bool I0NSW = I0->hasNoSignedWrap();
8002 bool I1NSW = I1->hasNoSignedWrap();
8003 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
8004 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
8005 (ICmpInst::isEquality(Pred) &&
8006 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
8007 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
8008 ConstantInt::get(Op0->getType(), 0));
8009 }
8010 }
8011 }
8012
8013 // Try to optimize equality comparisons against alloca-based pointers.
8014 if (Op0->getType()->isPointerTy() && I.isEquality()) {
8015 assert(Op1->getType()->isPointerTy() &&
8016 "Comparing pointer with non-pointer?");
8017 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
8018 if (foldAllocaCmp(Alloca))
8019 return nullptr;
8020 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
8021 if (foldAllocaCmp(Alloca))
8022 return nullptr;
8023 }
8024
8025 if (Instruction *Res = foldICmpBitCast(I))
8026 return Res;
8027
8028 // TODO: Hoist this above the min/max bailout.
8030 return R;
8031
8032 {
8033 Value *X, *Y;
8034 // Transform (X & ~Y) == 0 --> (X & Y) != 0
8035 // and (X & ~Y) != 0 --> (X & Y) == 0
8036 // if A is a power of 2.
8037 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
8038 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
8039 I.isEquality())
8040 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
8041 Op1);
8042
8043 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
8044 if (Op0->getType()->isIntOrIntVectorTy()) {
8045 bool ConsumesOp0, ConsumesOp1;
8046 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
8047 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
8048 (ConsumesOp0 || ConsumesOp1)) {
8049 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
8050 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
8051 assert(InvOp0 && InvOp1 &&
8052 "Mismatch between isFreeToInvert and getFreelyInverted");
8053 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
8054 }
8055 }
8056
8057 Instruction *AddI = nullptr;
8059 m_Instruction(AddI))) &&
8060 isa<IntegerType>(X->getType())) {
8061 Value *Result;
8062 Constant *Overflow;
8063 // m_UAddWithOverflow can match patterns that do not include an explicit
8064 // "add" instruction, so check the opcode of the matched op.
8065 if (AddI->getOpcode() == Instruction::Add &&
8066 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
8067 Result, Overflow)) {
8068 replaceInstUsesWith(*AddI, Result);
8069 eraseInstFromFunction(*AddI);
8070 return replaceInstUsesWith(I, Overflow);
8071 }
8072 }
8073
8074 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
8075 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
8076 match(Op1, m_APInt(C))) {
8077 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
8078 return R;
8079 }
8080
8081 // Signbit test folds
8082 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
8083 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
8084 Instruction *ExtI;
8085 if ((I.isUnsigned() || I.isEquality()) &&
8086 match(Op1,
8088 Y->getType()->getScalarSizeInBits() == 1 &&
8089 (Op0->hasOneUse() || Op1->hasOneUse())) {
8090 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
8091 Instruction *ShiftI;
8092 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
8094 OpWidth - 1))))) {
8095 unsigned ExtOpc = ExtI->getOpcode();
8096 unsigned ShiftOpc = ShiftI->getOpcode();
8097 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
8098 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
8099 Value *SLTZero =
8100 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
8101 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
8102 return replaceInstUsesWith(I, Cmp);
8103 }
8104 }
8105 }
8106 }
8107
8108 if (Instruction *Res = foldICmpEquality(I))
8109 return Res;
8110
8112 return Res;
8113
8114 if (Instruction *Res = foldICmpOfUAddOv(I))
8115 return Res;
8116
8118 return Res;
8119
8120 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8121 // an i1 which indicates whether or not we successfully did the swap.
8122 //
8123 // Replace comparisons between the old value and the expected value with the
8124 // indicator that 'cmpxchg' returns.
8125 //
8126 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8127 // spuriously fail. In those cases, the old value may equal the expected
8128 // value but it is possible for the swap to not occur.
8129 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8130 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8131 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8132 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8133 !ACXI->isWeak())
8134 return ExtractValueInst::Create(ACXI, 1);
8135
8137 return Res;
8138
8139 if (I.getType()->isVectorTy())
8140 if (Instruction *Res = foldVectorCmp(I, Builder))
8141 return Res;
8142
8144 return Res;
8145
8147 return Res;
8148
8149 {
8150 Value *A;
8151 const APInt *C1, *C2;
8152 ICmpInst::Predicate Pred = I.getPredicate();
8153 if (ICmpInst::isEquality(Pred)) {
8154 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8155 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8156 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8157 match(Op1, m_APInt(C2))) {
8158 Type *InputTy = A->getType();
8159 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8160 // c2 must be non-negative at the bitwidth of a.
8161 if (C2->getActiveBits() < InputBitWidth) {
8162 APInt TruncC1 = C1->trunc(InputBitWidth);
8163 // Check if there are 1s in C1 high bits of size InputBitWidth.
8164 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8165 TruncC1.setBit(InputBitWidth - 1);
8166 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8167 return new ICmpInst(
8168 Pred, AndInst,
8169 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8170 }
8171 }
8172 }
8173 }
8174
8175 return Changed ? &I : nullptr;
8176}
8177
8178/// Fold fcmp ([us]itofp x, cst) if possible.
8180 Instruction *LHSI,
8181 Constant *RHSC) {
8182 const APFloat *RHS;
8183 if (!match(RHSC, m_APFloat(RHS)))
8184 return nullptr;
8185
8186 // Get the width of the mantissa. We don't want to hack on conversions that
8187 // might lose information from the integer, e.g. "i64 -> float"
8188 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8189 if (MantissaWidth == -1)
8190 return nullptr; // Unknown.
8191
8192 Type *IntTy = LHSI->getOperand(0)->getType();
8193 unsigned IntWidth = IntTy->getScalarSizeInBits();
8194 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8195
8196 if (I.isEquality()) {
8197 FCmpInst::Predicate P = I.getPredicate();
8198 bool IsExact = false;
8199 APSInt RHSCvt(IntWidth, LHSUnsigned);
8200 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8201
8202 // If the floating point constant isn't an integer value, we know if we will
8203 // ever compare equal / not equal to it.
8204 if (!IsExact) {
8205 // TODO: Can never be -0.0 and other non-representable values
8206 APFloat RHSRoundInt(*RHS);
8208 if (*RHS != RHSRoundInt) {
8210 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8211
8213 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8214 }
8215 }
8216
8217 // TODO: If the constant is exactly representable, is it always OK to do
8218 // equality compares as integer?
8219 }
8220
8221 // Check to see that the input is converted from an integer type that is small
8222 // enough that preserves all bits. TODO: check here for "known" sign bits.
8223 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8224
8225 // Following test does NOT adjust IntWidth downwards for signed inputs,
8226 // because the most negative value still requires all the mantissa bits
8227 // to distinguish it from one less than that value.
8228 if ((int)IntWidth > MantissaWidth) {
8229 // Conversion would lose accuracy. Check if loss can impact comparison.
8230 int Exp = ilogb(*RHS);
8231 if (Exp == APFloat::IEK_Inf) {
8232 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8233 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8234 // Conversion could create infinity.
8235 return nullptr;
8236 } else {
8237 // Note that if RHS is zero or NaN, then Exp is negative
8238 // and first condition is trivially false.
8239 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8240 // Conversion could affect comparison.
8241 return nullptr;
8242 }
8243 }
8244
8245 // Otherwise, we can potentially simplify the comparison. We know that it
8246 // will always come through as an integer value and we know the constant is
8247 // not a NAN (it would have been previously simplified).
8248 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8249
8251 switch (I.getPredicate()) {
8252 default:
8253 llvm_unreachable("Unexpected predicate!");
8254 case FCmpInst::FCMP_UEQ:
8255 case FCmpInst::FCMP_OEQ:
8256 Pred = ICmpInst::ICMP_EQ;
8257 break;
8258 case FCmpInst::FCMP_UGT:
8259 case FCmpInst::FCMP_OGT:
8260 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8261 break;
8262 case FCmpInst::FCMP_UGE:
8263 case FCmpInst::FCMP_OGE:
8264 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8265 break;
8266 case FCmpInst::FCMP_ULT:
8267 case FCmpInst::FCMP_OLT:
8268 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8269 break;
8270 case FCmpInst::FCMP_ULE:
8271 case FCmpInst::FCMP_OLE:
8272 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8273 break;
8274 case FCmpInst::FCMP_UNE:
8275 case FCmpInst::FCMP_ONE:
8276 Pred = ICmpInst::ICMP_NE;
8277 break;
8278 case FCmpInst::FCMP_ORD:
8279 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8280 case FCmpInst::FCMP_UNO:
8281 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8282 }
8283
8284 // Now we know that the APFloat is a normal number, zero or inf.
8285
8286 // See if the FP constant is too large for the integer. For example,
8287 // comparing an i8 to 300.0.
8288 if (!LHSUnsigned) {
8289 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8290 // and large values.
8291 APFloat SMax(RHS->getSemantics());
8292 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8294 if (SMax < *RHS) { // smax < 13123.0
8295 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8296 Pred == ICmpInst::ICMP_SLE)
8297 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8298 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8299 }
8300 } else {
8301 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8302 // +INF and large values.
8303 APFloat UMax(RHS->getSemantics());
8304 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8306 if (UMax < *RHS) { // umax < 13123.0
8307 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8308 Pred == ICmpInst::ICMP_ULE)
8309 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8310 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8311 }
8312 }
8313
8314 if (!LHSUnsigned) {
8315 // See if the RHS value is < SignedMin.
8316 APFloat SMin(RHS->getSemantics());
8317 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8319 if (SMin > *RHS) { // smin > 12312.0
8320 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8321 Pred == ICmpInst::ICMP_SGE)
8322 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8323 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8324 }
8325 } else {
8326 // See if the RHS value is < UnsignedMin.
8327 APFloat UMin(RHS->getSemantics());
8328 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8330 if (UMin > *RHS) { // umin > 12312.0
8331 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8332 Pred == ICmpInst::ICMP_UGE)
8333 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8334 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8335 }
8336 }
8337
8338 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8339 // [0, UMAX], but it may still be fractional. Check whether this is the case
8340 // using the IsExact flag.
8341 // Don't do this for zero, because -0.0 is not fractional.
8342 APSInt RHSInt(IntWidth, LHSUnsigned);
8343 bool IsExact;
8344 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8345 if (!RHS->isZero()) {
8346 if (!IsExact) {
8347 // If we had a comparison against a fractional value, we have to adjust
8348 // the compare predicate and sometimes the value. RHSC is rounded towards
8349 // zero at this point.
8350 switch (Pred) {
8351 default:
8352 llvm_unreachable("Unexpected integer comparison!");
8353 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8354 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8355 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8356 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8357 case ICmpInst::ICMP_ULE:
8358 // (float)int <= 4.4 --> int <= 4
8359 // (float)int <= -4.4 --> false
8360 if (RHS->isNegative())
8361 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8362 break;
8363 case ICmpInst::ICMP_SLE:
8364 // (float)int <= 4.4 --> int <= 4
8365 // (float)int <= -4.4 --> int < -4
8366 if (RHS->isNegative())
8367 Pred = ICmpInst::ICMP_SLT;
8368 break;
8369 case ICmpInst::ICMP_ULT:
8370 // (float)int < -4.4 --> false
8371 // (float)int < 4.4 --> int <= 4
8372 if (RHS->isNegative())
8373 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8374 Pred = ICmpInst::ICMP_ULE;
8375 break;
8376 case ICmpInst::ICMP_SLT:
8377 // (float)int < -4.4 --> int < -4
8378 // (float)int < 4.4 --> int <= 4
8379 if (!RHS->isNegative())
8380 Pred = ICmpInst::ICMP_SLE;
8381 break;
8382 case ICmpInst::ICMP_UGT:
8383 // (float)int > 4.4 --> int > 4
8384 // (float)int > -4.4 --> true
8385 if (RHS->isNegative())
8386 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8387 break;
8388 case ICmpInst::ICMP_SGT:
8389 // (float)int > 4.4 --> int > 4
8390 // (float)int > -4.4 --> int >= -4
8391 if (RHS->isNegative())
8392 Pred = ICmpInst::ICMP_SGE;
8393 break;
8394 case ICmpInst::ICMP_UGE:
8395 // (float)int >= -4.4 --> true
8396 // (float)int >= 4.4 --> int > 4
8397 if (RHS->isNegative())
8398 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8399 Pred = ICmpInst::ICMP_UGT;
8400 break;
8401 case ICmpInst::ICMP_SGE:
8402 // (float)int >= -4.4 --> int >= -4
8403 // (float)int >= 4.4 --> int > 4
8404 if (!RHS->isNegative())
8405 Pred = ICmpInst::ICMP_SGT;
8406 break;
8407 }
8408 }
8409 }
8410
8411 // Lower this FP comparison into an appropriate integer version of the
8412 // comparison.
8413 return new ICmpInst(Pred, LHSI->getOperand(0),
8414 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8415}
8416
8417/// Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8418/// where all true/false values are constants that allow the compare to be
8419/// constant-folded for every combination of C1 and C2.
8420/// We compute a 4-entry truth table and use createLogicFromTable to
8421/// synthesize a boolean expression of C1 and C2.
8423 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8424 Value *C1, *C2;
8425 Constant *TV1, *FV1, *TV2, *FV2;
8426
8427 if (!match(Op0, m_Select(m_Value(C1), m_Constant(TV1), m_Constant(FV1))) ||
8428 !match(Op1, m_Select(m_Value(C2), m_Constant(TV2), m_Constant(FV2))))
8429 return nullptr;
8430
8431 if (I.getType() != C1->getType() || I.getType() != C2->getType())
8432 return nullptr;
8433
8434 unsigned Pred = I.getPredicate();
8435 const DataLayout &DL = I.getDataLayout();
8436
8437 Constant *Res00 = ConstantFoldCompareInstOperands(Pred, FV1, FV2, DL);
8438 Constant *Res01 = ConstantFoldCompareInstOperands(Pred, FV1, TV2, DL);
8439 Constant *Res10 = ConstantFoldCompareInstOperands(Pred, TV1, FV2, DL);
8440 Constant *Res11 = ConstantFoldCompareInstOperands(Pred, TV1, TV2, DL);
8441
8442 if (!Res00 || !Res01 || !Res10 || !Res11)
8443 return nullptr;
8444
8445 if ((!Res00->isNullValue() && !Res00->isAllOnesValue()) ||
8446 (!Res01->isNullValue() && !Res01->isAllOnesValue()) ||
8447 (!Res10->isNullValue() && !Res10->isAllOnesValue()) ||
8448 (!Res11->isNullValue() && !Res11->isAllOnesValue()))
8449 return nullptr;
8450
8451 std::bitset<4> Table;
8452 if (!Res00->isNullValue())
8453 Table.set(0);
8454 if (!Res01->isNullValue())
8455 Table.set(1);
8456 if (!Res10->isNullValue())
8457 Table.set(2);
8458 if (!Res11->isNullValue())
8459 Table.set(3);
8460
8461 Value *Res = createLogicFromTable(Table, C1, C2, Builder,
8462 Op0->hasOneUse() && Op1->hasOneUse());
8463 if (!Res)
8464 return nullptr;
8465 return replaceInstUsesWith(I, Res);
8466}
8467
8468/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8470 Constant *RHSC) {
8471 // When C is not 0.0 and infinities are not allowed:
8472 // (C / X) < 0.0 is a sign-bit test of X
8473 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8474 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8475 //
8476 // Proof:
8477 // Multiply (C / X) < 0.0 by X * X / C.
8478 // - X is non zero, if it is the flag 'ninf' is violated.
8479 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8480 // the predicate. C is also non zero by definition.
8481 //
8482 // Thus X * X / C is non zero and the transformation is valid. [qed]
8483
8484 FCmpInst::Predicate Pred = I.getPredicate();
8485
8486 // Check that predicates are valid.
8487 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8488 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8489 return nullptr;
8490
8491 // Check that RHS operand is zero.
8492 if (!match(RHSC, m_AnyZeroFP()))
8493 return nullptr;
8494
8495 // Check fastmath flags ('ninf').
8496 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8497 return nullptr;
8498
8499 // Check the properties of the dividend. It must not be zero to avoid a
8500 // division by zero (see Proof).
8501 const APFloat *C;
8502 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8503 return nullptr;
8504
8505 if (C->isZero())
8506 return nullptr;
8507
8508 // Get swapped predicate if necessary.
8509 if (C->isNegative())
8510 Pred = I.getSwappedPredicate();
8511
8512 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8513}
8514
8515// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8516// Patterns include:
8517// fptrunc(x) < C --> x < ext(C)
8518// fptrunc(x) <= C --> x <= ext(C)
8519// fptrunc(x) > C --> x > ext(C)
8520// fptrunc(x) >= C --> x >= ext(C)
8521// fptrunc(x) ord/uno C --> x ord/uno 0
8522// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8523// due to precision loss.
8525 const Constant &C) {
8526 FCmpInst::Predicate Pred = I.getPredicate();
8527 Type *DestType = FPTrunc.getOperand(0)->getType();
8528
8529 const APFloat *CValue;
8530 // TODO: support vec
8531 if (!match(&C, m_APFloat(CValue)))
8532 return nullptr;
8533
8534 // Handle ord/uno
8535 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
8536 assert(!CValue->isNaN() &&
8537 "X ord/uno NaN should be folded away by simplifyFCmpInst()");
8538 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8539 ConstantFP::getZero(DestType), "", &I);
8540 }
8541
8542 // Handle <, >, <=, >=
8543 bool RoundDown = false;
8544
8545 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8546 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8547 RoundDown = true;
8548 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8549 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8550 RoundDown = false;
8551 else
8552 return nullptr;
8553
8554 if (CValue->isNaN() || CValue->isInfinity())
8555 return nullptr;
8556
8557 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8558 bool LosesInfo;
8559 APFloat Dest = Src;
8560 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8561 return Dest;
8562 };
8563
8564 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8565 APFloat NextValue = Value;
8566 NextValue.next(RoundDown);
8567 return NextValue;
8568 };
8569
8570 APFloat NextCValue = NextValue(*CValue, RoundDown);
8571
8572 const fltSemantics &DestFltSema =
8573 DestType->getScalarType()->getFltSemantics();
8574
8575 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8576 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8577
8578 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8579 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8580 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8581 // value of 'CValue'.
8582 if (NextCValue.isInfinity()) {
8583 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8584 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8585
8586 ExtNextCValue = ExtCValue + Bias;
8587 }
8588
8589 APFloat ExtMidValue =
8590 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8591
8592 const fltSemantics &SrcFltSema =
8593 C.getType()->getScalarType()->getFltSemantics();
8594
8595 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8596 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8597 if (MidValue != *CValue)
8598 ExtMidValue.next(!RoundDown);
8599
8600 // Check whether 'ExtMidValue' is a valid result since the assumption on
8601 // imaged 'NextCValue' might not hold for new float types.
8602 // ppc_fp128 can't pass here when converting from max float because of
8603 // APFloat implementation.
8604 if (NextCValue.isInfinity()) {
8605 // ExtMidValue --- narrowed ---> Finite
8606 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8607 return nullptr;
8608
8609 // NextExtMidValue --- narrowed ---> Infinity
8610 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8611 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8612 return nullptr;
8613 }
8614
8615 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8616 ConstantFP::get(DestType, ExtMidValue), "", &I);
8617}
8618
8619/// Optimize fabs(X) compared with zero.
8621 Value *X;
8622 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8623 return nullptr;
8624
8625 const APFloat *C;
8626 if (!match(I.getOperand(1), m_APFloat(C)))
8627 return nullptr;
8628
8629 if (!C->isPosZero()) {
8630 if (!C->isSmallestNormalized())
8631 return nullptr;
8632
8633 const Function *F = I.getFunction();
8634 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8635 if (Mode.Input == DenormalMode::PreserveSign ||
8637
8638 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8639 Constant *Zero = ConstantFP::getZero(X->getType());
8640 return new FCmpInst(P, X, Zero, "", I);
8641 };
8642
8643 switch (I.getPredicate()) {
8644 case FCmpInst::FCMP_OLT:
8645 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8646 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8647 case FCmpInst::FCMP_UGE:
8648 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8649 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8650 case FCmpInst::FCMP_OGE:
8651 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8652 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8653 case FCmpInst::FCMP_ULT:
8654 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8655 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8656 default:
8657 break;
8658 }
8659 }
8660
8661 return nullptr;
8662 }
8663
8664 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8665 I->setPredicate(P);
8666 return IC.replaceOperand(*I, 0, X);
8667 };
8668
8669 switch (I.getPredicate()) {
8670 case FCmpInst::FCMP_UGE:
8671 case FCmpInst::FCMP_OLT:
8672 // fabs(X) >= 0.0 --> true
8673 // fabs(X) < 0.0 --> false
8674 llvm_unreachable("fcmp should have simplified");
8675
8676 case FCmpInst::FCMP_OGT:
8677 // fabs(X) > 0.0 --> X != 0.0
8678 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8679
8680 case FCmpInst::FCMP_UGT:
8681 // fabs(X) u> 0.0 --> X u!= 0.0
8682 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8683
8684 case FCmpInst::FCMP_OLE:
8685 // fabs(X) <= 0.0 --> X == 0.0
8686 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8687
8688 case FCmpInst::FCMP_ULE:
8689 // fabs(X) u<= 0.0 --> X u== 0.0
8690 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8691
8692 case FCmpInst::FCMP_OGE:
8693 // fabs(X) >= 0.0 --> !isnan(X)
8694 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8695 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8696
8697 case FCmpInst::FCMP_ULT:
8698 // fabs(X) u< 0.0 --> isnan(X)
8699 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8700 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8701
8702 case FCmpInst::FCMP_OEQ:
8703 case FCmpInst::FCMP_UEQ:
8704 case FCmpInst::FCMP_ONE:
8705 case FCmpInst::FCMP_UNE:
8706 case FCmpInst::FCMP_ORD:
8707 case FCmpInst::FCMP_UNO:
8708 // Look through the fabs() because it doesn't change anything but the sign.
8709 // fabs(X) == 0.0 --> X == 0.0,
8710 // fabs(X) != 0.0 --> X != 0.0
8711 // isnan(fabs(X)) --> isnan(X)
8712 // !isnan(fabs(X) --> !isnan(X)
8713 return replacePredAndOp0(&I, I.getPredicate(), X);
8714
8715 default:
8716 return nullptr;
8717 }
8718}
8719
8720/// Optimize sqrt(X) compared with zero.
8722 Value *X;
8723 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8724 return nullptr;
8725
8726 if (!match(I.getOperand(1), m_PosZeroFP()))
8727 return nullptr;
8728
8729 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8730 I.setPredicate(P);
8731 return IC.replaceOperand(I, 0, X);
8732 };
8733
8734 // Clear ninf flag if sqrt doesn't have it.
8735 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8736 I.setHasNoInfs(false);
8737
8738 switch (I.getPredicate()) {
8739 case FCmpInst::FCMP_OLT:
8740 case FCmpInst::FCMP_UGE:
8741 // sqrt(X) < 0.0 --> false
8742 // sqrt(X) u>= 0.0 --> true
8743 llvm_unreachable("fcmp should have simplified");
8744 case FCmpInst::FCMP_ULT:
8745 case FCmpInst::FCMP_ULE:
8746 case FCmpInst::FCMP_OGT:
8747 case FCmpInst::FCMP_OGE:
8748 case FCmpInst::FCMP_OEQ:
8749 case FCmpInst::FCMP_UNE:
8750 // sqrt(X) u< 0.0 --> X u< 0.0
8751 // sqrt(X) u<= 0.0 --> X u<= 0.0
8752 // sqrt(X) > 0.0 --> X > 0.0
8753 // sqrt(X) >= 0.0 --> X >= 0.0
8754 // sqrt(X) == 0.0 --> X == 0.0
8755 // sqrt(X) u!= 0.0 --> X u!= 0.0
8756 return IC.replaceOperand(I, 0, X);
8757
8758 case FCmpInst::FCMP_OLE:
8759 // sqrt(X) <= 0.0 --> X == 0.0
8760 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8761 case FCmpInst::FCMP_UGT:
8762 // sqrt(X) u> 0.0 --> X u!= 0.0
8763 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8764 case FCmpInst::FCMP_UEQ:
8765 // sqrt(X) u== 0.0 --> X u<= 0.0
8766 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8767 case FCmpInst::FCMP_ONE:
8768 // sqrt(X) != 0.0 --> X > 0.0
8769 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8770 case FCmpInst::FCMP_ORD:
8771 // !isnan(sqrt(X)) --> X >= 0.0
8772 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8773 case FCmpInst::FCMP_UNO:
8774 // isnan(sqrt(X)) --> X u< 0.0
8775 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8776 default:
8777 llvm_unreachable("Unexpected predicate!");
8778 }
8779}
8780
8782 CmpInst::Predicate Pred = I.getPredicate();
8783 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8784
8785 // Canonicalize fneg as Op1.
8786 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8787 std::swap(Op0, Op1);
8788 Pred = I.getSwappedPredicate();
8789 }
8790
8791 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8792 return nullptr;
8793
8794 // Replace the negated operand with 0.0:
8795 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8796 Constant *Zero = ConstantFP::getZero(Op0->getType());
8797 return new FCmpInst(Pred, Op0, Zero, "", &I);
8798}
8799
8801 Constant *RHSC, InstCombinerImpl &CI) {
8802 const CmpInst::Predicate Pred = I.getPredicate();
8803 Value *X = LHSI->getOperand(0);
8804 Value *Y = LHSI->getOperand(1);
8805 switch (Pred) {
8806 default:
8807 break;
8808 case FCmpInst::FCMP_UGT:
8809 case FCmpInst::FCMP_ULT:
8810 case FCmpInst::FCMP_UNE:
8811 case FCmpInst::FCMP_OEQ:
8812 case FCmpInst::FCMP_OGE:
8813 case FCmpInst::FCMP_OLE:
8814 // The optimization is not valid if X and Y are infinities of the same
8815 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8816 // flag then we can assume we do not have that case. Otherwise we might be
8817 // able to prove that either X or Y is not infinity.
8818 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8822 break;
8823
8824 [[fallthrough]];
8825 case FCmpInst::FCMP_OGT:
8826 case FCmpInst::FCMP_OLT:
8827 case FCmpInst::FCMP_ONE:
8828 case FCmpInst::FCMP_UEQ:
8829 case FCmpInst::FCMP_UGE:
8830 case FCmpInst::FCMP_ULE:
8831 // fcmp pred (x - y), 0 --> fcmp pred x, y
8832 if (match(RHSC, m_AnyZeroFP()) &&
8833 I.getFunction()->getDenormalMode(
8834 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8836 CI.replaceOperand(I, 0, X);
8837 CI.replaceOperand(I, 1, Y);
8838 I.setHasNoInfs(LHSI->hasNoInfs());
8839 if (LHSI->hasNoNaNs())
8840 I.setHasNoNaNs(true);
8841 return &I;
8842 }
8843 // fcmp `pred (C - Y), C` -> `fcmp swap(pred), Y, 0`
8844 // where C and Y can't be arbitrary floating-point values.
8845 // For example, with `C = 1.0f` and `Y = 0x1p-149`, `1.0f - Y` rounds back
8846 // to `1.0f`, so the source compare is false while the rewritten compare is
8847 // true.
8848 // We need to make sure (C - Y) never rounds back to C
8849 const APFloat *C;
8850 Value *IntSrc;
8851 if (match(RHSC, m_APFloat(C)) &&
8852 match(LHSI, m_FSub(m_Specific(RHSC), m_IToFP(m_Value(IntSrc)))) &&
8853 C->isNormal()) {
8854 // Requirements on C and Y:
8855 // 1. C is finite, nonzero, normal.
8856 // 2. C shouldn't be too large, that is, ULP(C) <= 1.
8857 // 3. Y must be the form of `[su]itofp`, so the finite nonzero result of Y
8858 // must be integer-valued with an absolute value of at least 1;
8859 // as long as the step size near C does not exceed 1,
8860 // C - Y cannot be rounded back to C when Y != 0.
8861 // 4. If Y = 0, `fcmp pred (C - 0), C` are equivalent to `fcmp swap(pred)
8862 // 0, 0` for ordered and unordered predicates as long as C is finite and
8863 // nonzero.
8864 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8865 if (MantissaWidth != -1 && ilogb(*C) < MantissaWidth) {
8866 Constant *ZeroC = ConstantFP::getZero(LHSI->getType());
8867 I.setPredicate(I.getSwappedPredicate());
8868 CI.replaceOperand(I, 0, Y);
8869 CI.replaceOperand(I, 1, ZeroC);
8870 return &I;
8871 }
8872 }
8873 break;
8874 }
8875
8876 return nullptr;
8877}
8878
8879/// Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b
8880/// where 'pred' is olt, ult, ogt, ugt, oge or uge and C is a positive, Non-NaN
8881/// float when the uitofp casts are exact and C is in the valid range.
8882///
8883/// Since exact uitofp means distinct integers map to distinct floats, the only
8884/// values fabs(uitofp(a) - uitofp(b)) can take are {0.0, 1.0, 2.0, ...}.
8885/// There are no values in the open interval (0, 1), so:
8886/// fabs(...) < C where 0 < C <= 1.0 --> a == b (strict lt: C=1.0 ok)
8887// fabs(..) >= C where C >= 1.0 -> a != b
8888///
8889/// The same logic applies to sitofp.
8891 Value *FAbsArg;
8892 if (!match(I.getOperand(0), m_FAbs(m_Value(FAbsArg))))
8893 return nullptr;
8894
8895 const APFloat *C;
8896 if (!match(I.getOperand(1), PatternMatch::m_FiniteNonZero(C)))
8897 return nullptr;
8898
8899 FCmpInst::Predicate Pred = I.getPredicate();
8900 bool IsStrictLt = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT;
8901 bool IsLe = Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE;
8902 bool IsStrictGt = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT;
8903 bool IsGe = Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE;
8904 if (!IsStrictLt && !IsStrictGt && !IsGe)
8905 return nullptr;
8906
8907 APFloat One = APFloat::getOne(C->getSemantics());
8908 APFloat::cmpResult Cmp = C->compare(One);
8909
8910 // For strict-lt (olt/ult): C must be in (0, 1.0] -- C == 1.0 is fine since
8911 // the next possible value after 0.0 is 1.0, and < 1.0 excludes it.
8912 if (IsStrictLt && Cmp == APFloat::cmpGreaterThan)
8913 return nullptr;
8914 if (IsGe && Cmp == APFloat::cmpGreaterThan)
8915 return nullptr;
8916 if (IsLe && Cmp != APFloat::cmpGreaterThan)
8917 return nullptr;
8918 if (IsStrictGt && Cmp != APFloat::cmpLessThan)
8919 return nullptr;
8920
8921 // Match: fsub(uitofp(A), uitofp(B)) where both casts are uitofp or sitofp
8922 Value *A, *B;
8923 bool IsSigned;
8924 if (match(FAbsArg, m_FSub(m_UIToFP(m_Value(A)), m_UIToFP(m_Value(B))))) {
8925 IsSigned = false;
8926 } else if (match(FAbsArg,
8928 IsSigned = true;
8929 } else {
8930 return nullptr;
8931 }
8932
8933 // A and B must have the same integer type
8934 if (A->getType() != B->getType())
8935 return nullptr;
8936
8937 Type *FPTy = FAbsArg->getType();
8938 if (!IC.canBeCastedExactlyIntToFP(A, FPTy, IsSigned, &I) ||
8939 !IC.canBeCastedExactlyIntToFP(B, FPTy, IsSigned, &I))
8940 return nullptr;
8941 ICmpInst::Predicate ResultPred =
8942 IsStrictLt || IsLe ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
8943 return new ICmpInst(ResultPred, A, B);
8944}
8945
8947 InstCombinerImpl &IC) {
8948 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8949 Type *OpType = LHS->getType();
8950 CmpInst::Predicate Pred = I.getPredicate();
8951
8954
8955 if (!FloorX && !CeilX) {
8958 std::swap(LHS, RHS);
8959 Pred = I.getSwappedPredicate();
8960 }
8961 }
8962
8963 if ((FloorX || CeilX) && FCmpInst::isCommutative(Pred) && LHS->hasOneUse()) {
8964 // fcmp pred floor(x), x => fcmp pred trunc(x), x
8965 // fcmp pred ceil(x), x => fcmp pred trunc(x), x
8966 // where pred is oeq, one, ord, ueq, une, uno.
8967 Value *TruncX = IC.Builder.CreateUnaryIntrinsic(Intrinsic::trunc, RHS);
8968 return new FCmpInst(Pred, TruncX, RHS, "", &I);
8969 }
8970
8971 switch (Pred) {
8972 case FCmpInst::FCMP_OLE:
8973 // fcmp ole floor(x), x => fcmp ord x, 0
8974 if (FloorX)
8976 "", &I);
8977 break;
8978 case FCmpInst::FCMP_OGT:
8979 // fcmp ogt floor(x), x => false
8980 if (FloorX)
8981 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8982 break;
8983 case FCmpInst::FCMP_OGE:
8984 // fcmp oge ceil(x), x => fcmp ord x, 0
8985 if (CeilX)
8987 "", &I);
8988 break;
8989 case FCmpInst::FCMP_OLT:
8990 // fcmp olt ceil(x), x => false
8991 if (CeilX)
8992 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8993 break;
8994 case FCmpInst::FCMP_ULE:
8995 // fcmp ule floor(x), x => true
8996 if (FloorX)
8997 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8998 break;
8999 case FCmpInst::FCMP_UGT:
9000 // fcmp ugt floor(x), x => fcmp uno x, 0
9001 if (FloorX)
9003 "", &I);
9004 break;
9005 case FCmpInst::FCMP_UGE:
9006 // fcmp uge ceil(x), x => true
9007 if (CeilX)
9008 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9009 break;
9010 case FCmpInst::FCMP_ULT:
9011 // fcmp ult ceil(x), x => fcmp uno x, 0
9012 if (CeilX)
9014 "", &I);
9015 break;
9016 default:
9017 break;
9018 }
9019
9020 return nullptr;
9021}
9022
9023/// Returns true if a select that implements a min/max is redundant and
9024/// select result can be replaced with its non-constant operand, e.g.,
9025/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
9026/// where C is the FP constant equal to the minimum integer value
9027/// representable by A.
9029 Value *B) {
9030 const APFloat *APF;
9031 if (!match(B, m_APFloat(APF)))
9032 return false;
9033
9034 auto *I = dyn_cast<Instruction>(A);
9035 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
9036 I->getOpcode() == Instruction::UIToFP))
9037 return false;
9038
9039 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
9040 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
9041 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
9042 ? APSInt::getMinValue(BitWidth, IsUnsigned)
9043 : APSInt::getMaxValue(BitWidth, IsUnsigned);
9044 APSInt ConvertedInt(BitWidth, IsUnsigned);
9045 bool IsExact;
9047 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
9048 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
9049}
9050
9052 bool Changed = false;
9053
9054 /// Orders the operands of the compare so that they are listed from most
9055 /// complex to least complex. This puts constants before unary operators,
9056 /// before binary operators.
9057 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
9058 I.swapOperands();
9059 Changed = true;
9060 }
9061
9062 const CmpInst::Predicate Pred = I.getPredicate();
9063 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
9064 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
9065 SQ.getWithInstruction(&I)))
9066 return replaceInstUsesWith(I, V);
9067
9068 // Simplify 'fcmp pred X, X'
9069 Type *OpType = Op0->getType();
9070 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
9071 if (Op0 == Op1) {
9072 switch (Pred) {
9073 default:
9074 break;
9075 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
9076 case FCmpInst::FCMP_ULT: // True if unordered or less than
9077 case FCmpInst::FCMP_UGT: // True if unordered or greater than
9078 case FCmpInst::FCMP_UNE: // True if unordered or not equal
9079 // Canonicalize these to be 'fcmp uno %X, 0.0'.
9080 I.setPredicate(FCmpInst::FCMP_UNO);
9081 I.setOperand(1, Constant::getNullValue(OpType));
9082 return &I;
9083
9084 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
9085 case FCmpInst::FCMP_OEQ: // True if ordered and equal
9086 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
9087 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
9088 // Canonicalize these to be 'fcmp ord %X, 0.0'.
9089 I.setPredicate(FCmpInst::FCMP_ORD);
9090 I.setOperand(1, Constant::getNullValue(OpType));
9091 return &I;
9092 }
9093 }
9094
9095 if (I.isCommutative()) {
9096 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
9097 replaceOperand(I, 0, Pair->first);
9098 replaceOperand(I, 1, Pair->second);
9099 return &I;
9100 }
9101 }
9102
9103 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
9104 // then canonicalize the operand to 0.0.
9105 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
9106 if (!match(Op0, m_PosZeroFP()) &&
9107 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
9108 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
9109
9110 if (!match(Op1, m_PosZeroFP()) &&
9111 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
9112 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9113 }
9114
9115 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
9116 Value *X, *Y;
9117 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
9118 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
9119
9121 return R;
9122
9123 // Test if the FCmpInst instruction is used exclusively by a select as
9124 // part of a minimum or maximum operation. If so, refrain from doing
9125 // any other folding. This helps out other analyses which understand
9126 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
9127 // and CodeGen. And in this case, at least one of the comparison
9128 // operands has at least one user besides the compare (the select),
9129 // which would often largely negate the benefit of folding anyway.
9130 if (I.hasOneUse())
9131 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
9132 Value *A, *B;
9134 bool IsRedundantMinMaxClamp =
9135 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
9137 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
9138 return nullptr;
9139 }
9140
9141 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
9142 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
9143 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
9144 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9145
9146 // Canonicalize:
9147 // fcmp olt X, +inf -> fcmp one X, +inf
9148 // fcmp ole X, +inf -> fcmp ord X, 0
9149 // fcmp ogt X, +inf -> false
9150 // fcmp oge X, +inf -> fcmp oeq X, +inf
9151 // fcmp ult X, +inf -> fcmp une X, +inf
9152 // fcmp ule X, +inf -> true
9153 // fcmp ugt X, +inf -> fcmp uno X, 0
9154 // fcmp uge X, +inf -> fcmp ueq X, +inf
9155 // fcmp olt X, -inf -> false
9156 // fcmp ole X, -inf -> fcmp oeq X, -inf
9157 // fcmp ogt X, -inf -> fcmp one X, -inf
9158 // fcmp oge X, -inf -> fcmp ord X, 0
9159 // fcmp ult X, -inf -> fcmp uno X, 0
9160 // fcmp ule X, -inf -> fcmp ueq X, -inf
9161 // fcmp ugt X, -inf -> fcmp une X, -inf
9162 // fcmp uge X, -inf -> true
9163 const APFloat *C;
9164 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
9165 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
9166 default:
9167 break;
9168 case FCmpInst::FCMP_ORD:
9169 case FCmpInst::FCMP_UNO:
9172 case FCmpInst::FCMP_OGT:
9173 case FCmpInst::FCMP_ULE:
9174 llvm_unreachable("Should be simplified by InstSimplify");
9175 case FCmpInst::FCMP_OLT:
9176 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
9177 case FCmpInst::FCMP_OLE:
9178 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
9179 "", &I);
9180 case FCmpInst::FCMP_OGE:
9181 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
9182 case FCmpInst::FCMP_ULT:
9183 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
9184 case FCmpInst::FCMP_UGT:
9185 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
9186 "", &I);
9187 case FCmpInst::FCMP_UGE:
9188 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
9189 }
9190 }
9191
9192 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
9193 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
9194 if (match(Op1, m_PosZeroFP()) &&
9196 X->getType()->isIntOrIntVectorTy() &&
9197 !F.getDenormalMode(Op1->getType()->getScalarType()->getFltSemantics())
9198 .inputsMayBeZero()) {
9200 if (Pred == FCmpInst::FCMP_OEQ)
9201 IntPred = ICmpInst::ICMP_EQ;
9202 else if (Pred == FCmpInst::FCMP_UNE)
9203 IntPred = ICmpInst::ICMP_NE;
9204
9205 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
9206 Type *IntTy = X->getType();
9207 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
9208 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
9209 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
9210 }
9211 }
9212
9213 // Handle fcmp with instruction LHS and constant RHS.
9214 Instruction *LHSI;
9215 Constant *RHSC;
9216 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
9217 switch (LHSI->getOpcode()) {
9218 case Instruction::Select:
9219 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
9220 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
9222 return replaceOperand(I, 0, X);
9224 return NV;
9225 break;
9226 case Instruction::FSub:
9227 if (LHSI->hasOneUse())
9228 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
9229 return NV;
9230 break;
9231 case Instruction::PHI:
9232 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
9233 return NV;
9234 break;
9235 case Instruction::SIToFP:
9236 case Instruction::UIToFP:
9237 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
9238 return NV;
9239 break;
9240 case Instruction::FDiv:
9241 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
9242 return NV;
9243 break;
9244 case Instruction::Load:
9245 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
9246 if (Instruction *Res =
9248 return Res;
9249 break;
9250 case Instruction::FPTrunc:
9251 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
9252 return NV;
9253 break;
9254 }
9255 }
9256
9257 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
9258 return R;
9259
9260 if (Instruction *R = foldFCmpFAbsFSubIntToFP(I, *this))
9261 return R;
9262
9263 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
9264 return R;
9265
9266 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
9267 return R;
9268
9270 return R;
9271
9272 if (match(Op0, m_FNeg(m_Value(X)))) {
9273 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
9274 Constant *C;
9275 if (match(Op1, m_Constant(C)))
9276 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
9277 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
9278 }
9279
9280 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
9281 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
9282 return new FCmpInst(Pred, X, Op1, "", &I);
9283
9284 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
9285 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
9286 return new FCmpInst(Pred, Op0, Y, "", &I);
9287
9288 // fcmp ord/uno (fptrunc X), (fptrunc Y) -> fcmp ord/uno X, Y
9289 if ((Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) &&
9290 match(Op0, m_FPTrunc(m_Value(X))) && match(Op1, m_FPTrunc(m_Value(Y))) &&
9291 X->getType() == Y->getType())
9292 return new FCmpInst(Pred, X, Y, "", &I);
9293
9294 if (match(Op0, m_FPExt(m_Value(X)))) {
9295 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
9296 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
9297 return new FCmpInst(Pred, X, Y, "", &I);
9298
9299 const APFloat *C;
9300 if (match(Op1, m_APFloat(C))) {
9301 const fltSemantics &FPSem =
9302 X->getType()->getScalarType()->getFltSemantics();
9303 bool Lossy;
9304 APFloat TruncC = *C;
9306
9307 if (Lossy) {
9308 // X can't possibly equal the higher-precision constant, so reduce any
9309 // equality comparison.
9310 // TODO: Other predicates can be handled via getFCmpCode().
9311 switch (Pred) {
9312 case FCmpInst::FCMP_OEQ:
9313 // X is ordered and equal to an impossible constant --> false
9314 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9315 case FCmpInst::FCMP_ONE:
9316 // X is ordered and not equal to an impossible constant --> ordered
9317 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9318 ConstantFP::getZero(X->getType()));
9319 case FCmpInst::FCMP_UEQ:
9320 // X is unordered or equal to an impossible constant --> unordered
9321 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9322 ConstantFP::getZero(X->getType()));
9323 case FCmpInst::FCMP_UNE:
9324 // X is unordered or not equal to an impossible constant --> true
9325 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9326 default:
9327 break;
9328 }
9329 }
9330
9331 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9332 // Avoid lossy conversions and denormals.
9333 // Zero is a special case that's OK to convert.
9334 APFloat Fabs = TruncC;
9335 Fabs.clearSign();
9336 if (!Lossy &&
9337 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9338 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9339 return new FCmpInst(Pred, X, NewC, "", &I);
9340 }
9341 }
9342 }
9343
9344 // Convert a sign-bit test of an FP value into a cast and integer compare.
9345 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9346 // TODO: Handle non-zero compare constants.
9347 // TODO: Handle other predicates.
9349 m_Value(X)))) &&
9350 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9351 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9352 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9353 IntType = VectorType::get(IntType, VecTy->getElementCount());
9354
9355 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9356 if (Pred == FCmpInst::FCMP_OLT) {
9357 Value *IntX = Builder.CreateBitCast(X, IntType);
9358 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9359 ConstantInt::getNullValue(IntType));
9360 }
9361 }
9362
9363 {
9364 Value *CanonLHS = nullptr;
9366 // (canonicalize(x) == x) => (x == x)
9367 if (CanonLHS == Op1)
9368 return new FCmpInst(Pred, Op1, Op1, "", &I);
9369
9370 Value *CanonRHS = nullptr;
9372 // (x == canonicalize(x)) => (x == x)
9373 if (CanonRHS == Op0)
9374 return new FCmpInst(Pred, Op0, Op0, "", &I);
9375
9376 // (canonicalize(x) == canonicalize(y)) => (x == y)
9377 if (CanonLHS && CanonRHS)
9378 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9379 }
9380
9381 if (I.getType()->isVectorTy())
9382 if (Instruction *Res = foldVectorCmp(I, Builder))
9383 return Res;
9384
9385 return Changed ? &I : nullptr;
9386}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:853
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define Check(C,...)
Hexagon Common GEP
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static void collectOffsetOp(Value *V, SmallVectorImpl< OffsetOp > &Offsets, bool AllowRecursion)
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags NW, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static bool isMinMaxCmpSelectEliminable(SelectPatternFlavor Flavor, Value *A, Value *B)
Returns true if a select that implements a min/max is redundant and select result can be replaced wit...
static Instruction * foldICmpEqualityWithOffset(ICmpInst &I, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Offset both sides of an equality icmp to see if we can save some instructions: icmp eq/ne X,...
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Instruction * foldICmpOfVectorReduce(ICmpInst &I, const DataLayout &DL, IRBuilderBase &Builder)
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Instruction * foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI, Constant *RHSC, InstCombinerImpl &CI)
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static Value * foldICmpWithLowBitMaskedVal(CmpPredicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpShlLHSC(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl nuw C2, Y), C.
static Instruction * foldFCmpWithFloorAndCeil(FCmpInst &I, InstCombinerImpl &IC)
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(CmpPredicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * foldSqrtWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize sqrt(X) compared with zero.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(CmpPredicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags &NW, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldFCmpFpTrunc(FCmpInst &I, const Instruction &FPTrunc, const Constant &C)
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static Instruction * foldFCmpFAbsFSubIntToFP(FCmpInst &I, InstCombinerImpl &IC)
Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b where 'pred' is olt, ult, ogt,...
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q)
Return true if X is a multiple of C.
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T1
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:335
static constexpr roundingMode rmTowardZero
Definition APFloat.h:349
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:345
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:361
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5913
void clearSign()
Definition APFloat.h:1358
bool isNaN() const
Definition APFloat.h:1537
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1148
bool isZero() const
Definition APFloat.h:1535
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1218
APInt bitcastToAPInt() const
Definition APFloat.h:1431
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1198
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1392
opStatus next(bool nextDown)
Definition APFloat.h:1314
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1158
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5842
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1308
bool isInfinity() const
Definition APFloat.h:1536
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1793
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1563
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1535
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1353
APInt abs() const
Get the absolute value.
Definition APInt.h:1818
unsigned ceilLogBase2() const
Definition APInt.h:1787
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1208
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1983
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
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:1511
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1963
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1086
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1670
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1970
void negate()
Negate this APInt in place.
Definition APInt.h:1491
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1662
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
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:1475
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1638
unsigned logBase2() const
Definition APInt.h:1784
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1976
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1679
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
static APSInt getMinValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the minimum integer value with the given bit width and signedness.
Definition APSInt.h:310
static APSInt getMaxValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the maximum integer value with the given bit width and signedness.
Definition APSInt.h:302
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
static LLVM_ABI Predicate getFlippedStrictnessPredicate(Predicate pred)
This is a static version that you can use without an instruction available.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
bool isUnsigned() const
Definition InstrTypes.h:999
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Conditional Branch instruction.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
LLVM_ABI std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition Constants.cpp:68
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:225
iterator end()
Definition DenseMap.h:143
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:216
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
static bool isCommutative(Predicate Pred)
static bool isEquality(Predicate Pred)
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:390
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:82
Value * getPointerOperand()
Definition Operator.h:417
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:385
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:464
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1622
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:2526
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1644
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:544
LLVM_ABI Value * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *Op, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2900
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldCmpSelectOfConstants(CmpInst &I)
Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2) where all true/false values are cons...
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
TargetLibraryInfo & TLI
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CxtI=nullptr) const
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
const DataLayout & DL
DomConditionCache DC
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
bool isArithmeticShift() const
Return true if this is an arithmetic shift right.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isShift() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:350
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:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:263
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:167
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:237
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition Value.cpp:155
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
Definition APInt.cpp:2798
LLVM_ABI APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
Definition APInt.cpp:2816
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FSub > m_FSub(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
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.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
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.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
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)
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
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.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
auto m_MaxOrMin(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
cstfp_pred_ty< is_finitenonzero > m_FiniteNonZero()
Match a finite non-zero FP constant.
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)
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.
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.
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:558
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:830
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1738
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:633
LLVM_ABI Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1632
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:263
LLVM_ABI Value * emitGEPOffset(IRBuilderBase *Builder, const DataLayout &DL, User *GEP, bool NoAssumptions=false)
Given a getelementptr instruction/constantexpr, emit the code necessary to compute the offset from th...
Definition Local.cpp:22
constexpr unsigned MaxAnalysisRecursionDepth
LLVM_ABI Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
LLVM_ABI bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UNKNOWN
@ SPF_FMINNUM
Unsigned maximum.
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL, Value *Ptr)
Decompose a pointer into a linear expression.
Definition Loads.cpp:910
LLVM_ABI bool isFinite(const Loop *L)
Return true if this loop can be assumed to run for a finite number of iterations.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Returns: X * 2^Exp for integral exponents.
Definition APFloat.h:1641
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:1752
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:2018
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2165
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:26
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, const SimplifyQuery &SQ, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:862
#define NC
Definition regutils.h:42
Value * materialize(InstCombiner::BuilderTy &Builder) const
static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV, Instruction *MDFrom)
static OffsetResult value(Value *V)
static OffsetResult invalid()
This callback is used in conjunction with PointerMayBeCaptured.
static CommonPointerBase compute(Value *LHS, Value *RHS)
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
static constexpr DenormalMode getIEEE()
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:152
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
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:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:130
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:136
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:58
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:215
GEPNoWrapFlags Flags
Definition Loads.h:220
Matching combinators.
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DataLayout & DL
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:342
Capture information for a specific Use.