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.
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, i64 Elem
3573 // icmp <pred> iK %SplatVal, <pattern>
3574 Value *Extract = Builder.CreateExtractElement(Vec, Mask[0]);
3575 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3576 return new ICmpInst(Pred, Extract, NewC);
3577 }
3578 }
3579 }
3580 return nullptr;
3581}
3582
3583/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3584/// where X is some kind of instruction.
3586 const APInt *C;
3587
3588 if (match(Cmp.getOperand(1), m_APInt(C))) {
3589 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3590 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3591 return I;
3592
3593 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3594 // For now, we only support constant integers while folding the
3595 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3596 // similar to the cases handled by binary ops above.
3597 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3598 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3599 return I;
3600
3601 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3602 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3603 return I;
3604
3605 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3607 return I;
3608
3609 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3610 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3611 // TODO: This checks one-use, but that is not strictly necessary.
3612 Value *Cmp0 = Cmp.getOperand(0);
3613 Value *X, *Y;
3614 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3615 (match(Cmp0,
3617 m_Value(X), m_Value(Y)))) ||
3618 match(Cmp0,
3620 m_Value(X), m_Value(Y))))))
3621 return new ICmpInst(Cmp.getPredicate(), X, Y);
3622 }
3623
3624 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3626
3627 return nullptr;
3628}
3629
3630/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3631/// icmp eq/ne BO, C.
3633 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3634 // TODO: Some of these folds could work with arbitrary constants, but this
3635 // function is limited to scalar and vector splat constants.
3636 if (!Cmp.isEquality())
3637 return nullptr;
3638
3639 ICmpInst::Predicate Pred = Cmp.getPredicate();
3640 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3641 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3642 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3643
3644 switch (BO->getOpcode()) {
3645 case Instruction::SRem:
3646 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3647 if (C.isZero() && BO->hasOneUse()) {
3648 const APInt *BOC;
3649 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3650 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3651 return new ICmpInst(Pred, NewRem,
3653 }
3654 }
3655 break;
3656 case Instruction::Add: {
3657 // (A + C2) == C --> A == (C - C2)
3658 // (A + C2) != C --> A != (C - C2)
3659 // TODO: Remove the one-use limitation? See discussion in D58633.
3660 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3661 if (BO->hasOneUse())
3662 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3663 } else if (C.isZero()) {
3664 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3665 // efficiently invertible, or if the add has just this one use.
3666 if (Value *NegVal = dyn_castNegVal(BOp1))
3667 return new ICmpInst(Pred, BOp0, NegVal);
3668 if (Value *NegVal = dyn_castNegVal(BOp0))
3669 return new ICmpInst(Pred, NegVal, BOp1);
3670 if (BO->hasOneUse()) {
3671 // (add nuw A, B) != 0 -> (or A, B) != 0
3672 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3673 Value *Or = Builder.CreateOr(BOp0, BOp1);
3674 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3675 }
3676 Value *Neg = Builder.CreateNeg(BOp1);
3677 Neg->takeName(BO);
3678 return new ICmpInst(Pred, BOp0, Neg);
3679 }
3680 }
3681 break;
3682 }
3683 case Instruction::Xor:
3684 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3685 // For the xor case, we can xor two constants together, eliminating
3686 // the explicit xor.
3687 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3688 } else if (C.isZero()) {
3689 // Replace ((xor A, B) != 0) with (A != B)
3690 return new ICmpInst(Pred, BOp0, BOp1);
3691 }
3692 break;
3693 case Instruction::Or: {
3694 const APInt *BOC;
3695 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3696 // Comparing if all bits outside of a constant mask are set?
3697 // Replace (X | C) == -1 with (X & ~C) == ~C.
3698 // This removes the -1 constant.
3700 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3701 return new ICmpInst(Pred, And, NotBOC);
3702 }
3703 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3704 // -> (and cond, (icmp eq Other, 0))
3705 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3706 // -> (or cond, (icmp ne Other, 0))
3707 Value *Cond, *TV, *FV, *Other, *Sel;
3708 if (C.isZero() &&
3709 match(BO,
3712 m_Value(FV))),
3713 m_Value(Other)))) &&
3714 Cond->getType() == Cmp.getType()) {
3715 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3716 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3717 if (Pred == ICmpInst::ICMP_EQ
3718 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3719 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3720 Value *Cmp = Builder.CreateICmp(
3721 Pred, Other, Constant::getNullValue(Other->getType()));
3723 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3724 Cond);
3725 }
3726 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3727 // case we need to invert the select condition so we need to be careful to
3728 // avoid creating extra instructions.
3729 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3730 // -> (or (not cond), (icmp ne Other, 0))
3731 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3732 // -> (and (not cond), (icmp eq Other, 0))
3733 //
3734 // Only do this if the inner select has one use, in which case we are
3735 // replacing `select` with `(not cond)`. Otherwise, we will create more
3736 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3737 // cond was freely invertable, the select arms would have been inverted.
3738 if (Sel->hasOneUse() &&
3739 (Pred == ICmpInst::ICMP_EQ
3740 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3741 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3742 Value *NotCond = Builder.CreateNot(Cond);
3743 Value *Cmp = Builder.CreateICmp(
3744 Pred, Other, Constant::getNullValue(Other->getType()));
3746 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3747 NotCond);
3748 }
3749 }
3750 break;
3751 }
3752 case Instruction::UDiv:
3753 case Instruction::SDiv:
3754 if (BO->isExact()) {
3755 // div exact X, Y eq/ne 0 -> X eq/ne 0
3756 // div exact X, Y eq/ne 1 -> X eq/ne Y
3757 // div exact X, Y eq/ne C ->
3758 // if Y * C never-overflow && OneUse:
3759 // -> Y * C eq/ne X
3760 if (C.isZero())
3761 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3762 else if (C.isOne())
3763 return new ICmpInst(Pred, BOp0, BOp1);
3764 else if (BO->hasOneUse()) {
3766 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3767 Cmp.getOperand(1), BO);
3769 Value *YC =
3770 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3771 return new ICmpInst(Pred, YC, BOp0);
3772 }
3773 }
3774 }
3775 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3776 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3777 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3778 return new ICmpInst(NewPred, BOp1, BOp0);
3779 }
3780 break;
3781 default:
3782 break;
3783 }
3784 return nullptr;
3785}
3786
3788 const APInt &CRhs,
3789 InstCombiner::BuilderTy &Builder,
3790 const SimplifyQuery &Q) {
3791 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3792 "Non-ctpop intrin in ctpop fold");
3793 if (!CtpopLhs->hasOneUse())
3794 return nullptr;
3795
3796 // Power of 2 test:
3797 // isPow2OrZero : ctpop(X) u< 2
3798 // isPow2 : ctpop(X) == 1
3799 // NotPow2OrZero: ctpop(X) u> 1
3800 // NotPow2 : ctpop(X) != 1
3801 // If we know any bit of X can be folded to:
3802 // IsPow2 : X & (~Bit) == 0
3803 // NotPow2 : X & (~Bit) != 0
3804 const ICmpInst::Predicate Pred = I.getPredicate();
3805 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3806 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3807 Value *Op = CtpopLhs->getArgOperand(0);
3808 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3809 // No need to check for count > 1, that should be already constant folded.
3810 if (OpKnown.countMinPopulation() == 1) {
3811 Value *And = Builder.CreateAnd(
3812 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3813 return new ICmpInst(
3814 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3817 And, Constant::getNullValue(Op->getType()));
3818 }
3819 }
3820
3821 return nullptr;
3822}
3823
3824/// Fold an equality icmp with LLVM intrinsic and constant operand.
3826 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3827 Type *Ty = II->getType();
3828 unsigned BitWidth = C.getBitWidth();
3829 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3830
3831 switch (II->getIntrinsicID()) {
3832 case Intrinsic::abs:
3833 // abs(A) == 0 -> A == 0
3834 // abs(A) == INT_MIN -> A == INT_MIN
3835 if (C.isZero() || C.isMinSignedValue())
3836 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3837 break;
3838
3839 case Intrinsic::bswap:
3840 // bswap(A) == C -> A == bswap(C)
3841 return new ICmpInst(Pred, II->getArgOperand(0),
3842 ConstantInt::get(Ty, C.byteSwap()));
3843
3844 case Intrinsic::bitreverse:
3845 // bitreverse(A) == C -> A == bitreverse(C)
3846 return new ICmpInst(Pred, II->getArgOperand(0),
3847 ConstantInt::get(Ty, C.reverseBits()));
3848
3849 case Intrinsic::ctlz:
3850 case Intrinsic::cttz: {
3851 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3852 if (C == BitWidth)
3853 return new ICmpInst(Pred, II->getArgOperand(0),
3855
3856 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3857 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3858 // Limit to one use to ensure we don't increase instruction count.
3859 unsigned Num = C.getLimitedValue(BitWidth);
3860 if (Num != BitWidth && II->hasOneUse()) {
3861 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3862 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3863 : APInt::getHighBitsSet(BitWidth, Num + 1);
3864 APInt Mask2 = IsTrailing
3867 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3868 ConstantInt::get(Ty, Mask2));
3869 }
3870 break;
3871 }
3872
3873 case Intrinsic::ctpop: {
3874 // popcount(A) == 0 -> A == 0 and likewise for !=
3875 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3876 bool IsZero = C.isZero();
3877 if (IsZero || C == BitWidth)
3878 return new ICmpInst(Pred, II->getArgOperand(0),
3879 IsZero ? Constant::getNullValue(Ty)
3881
3882 break;
3883 }
3884
3885 case Intrinsic::fshl:
3886 case Intrinsic::fshr:
3887 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3888 const APInt *RotAmtC;
3889 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3890 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3891 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3892 return new ICmpInst(Pred, II->getArgOperand(0),
3893 II->getIntrinsicID() == Intrinsic::fshl
3894 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3895 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3896 }
3897 break;
3898
3899 case Intrinsic::umax:
3900 case Intrinsic::uadd_sat: {
3901 // uadd.sat(a, b) == 0 -> (a | b) == 0
3902 // umax(a, b) == 0 -> (a | b) == 0
3903 if (C.isZero() && II->hasOneUse()) {
3904 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3905 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3906 }
3907 break;
3908 }
3909
3910 case Intrinsic::ssub_sat:
3911 // ssub.sat(a, b) == 0 -> a == b
3912 //
3913 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
3914 // (because 1 saturates to 0). Just skip the optimization for i1.
3915 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
3916 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3917 break;
3918 case Intrinsic::usub_sat: {
3919 // usub.sat(a, b) == 0 -> a <= b
3920 if (C.isZero()) {
3921 ICmpInst::Predicate NewPred =
3923 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3924 }
3925 break;
3926 }
3927 default:
3928 break;
3929 }
3930
3931 return nullptr;
3932}
3933
3934/// Fold an icmp with LLVM intrinsics
3935static Instruction *
3937 InstCombiner::BuilderTy &Builder) {
3938 assert(Cmp.isEquality());
3939
3940 ICmpInst::Predicate Pred = Cmp.getPredicate();
3941 Value *Op0 = Cmp.getOperand(0);
3942 Value *Op1 = Cmp.getOperand(1);
3943 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3944 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3945 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3946 return nullptr;
3947
3948 switch (IIOp0->getIntrinsicID()) {
3949 case Intrinsic::bswap:
3950 case Intrinsic::bitreverse:
3951 // If both operands are byte-swapped or bit-reversed, just compare the
3952 // original values.
3953 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3954 case Intrinsic::fshl:
3955 case Intrinsic::fshr: {
3956 // If both operands are rotated by same amount, just compare the
3957 // original values.
3958 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3959 break;
3960 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3961 break;
3962 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3963 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3964
3965 // rotate(X, AmtX) == rotate(Y, AmtY)
3966 // -> rotate(X, AmtX - AmtY) == Y
3967 // Do this if either both rotates have one use or if only one has one use
3968 // and AmtX/AmtY are constants.
3969 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3970 if (OneUses == 2 ||
3971 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3972 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3973 Value *SubAmt =
3974 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3975 Value *CombinedRotate = Builder.CreateIntrinsic(
3976 Op0->getType(), IIOp0->getIntrinsicID(),
3977 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3978 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3979 }
3980 } break;
3981 default:
3982 break;
3983 }
3984
3985 return nullptr;
3986}
3987
3988/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3989/// where X is some kind of instruction and C is AllowPoison.
3990/// TODO: Move more folds which allow poison to this function.
3993 const APInt &C) {
3994 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3995 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3996 switch (II->getIntrinsicID()) {
3997 default:
3998 break;
3999 case Intrinsic::fshl:
4000 case Intrinsic::fshr:
4001 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
4002 // (rot X, ?) == 0/-1 --> X == 0/-1
4003 if (C.isZero() || C.isAllOnes())
4004 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
4005 }
4006 break;
4007 }
4008 }
4009
4010 return nullptr;
4011}
4012
4013/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
4015 BinaryOperator *BO,
4016 const APInt &C) {
4017 switch (BO->getOpcode()) {
4018 case Instruction::Xor:
4019 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
4020 return I;
4021 break;
4022 case Instruction::And:
4023 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
4024 return I;
4025 break;
4026 case Instruction::Or:
4027 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
4028 return I;
4029 break;
4030 case Instruction::Mul:
4031 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
4032 return I;
4033 break;
4034 case Instruction::Shl:
4035 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4036 return I;
4037 break;
4038 case Instruction::LShr:
4039 case Instruction::AShr:
4040 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4041 return I;
4042 break;
4043 case Instruction::SRem:
4044 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4045 return I;
4046 break;
4047 case Instruction::UDiv:
4048 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4049 return I;
4050 [[fallthrough]];
4051 case Instruction::SDiv:
4052 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4053 return I;
4054 break;
4055 case Instruction::Sub:
4056 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4057 return I;
4058 break;
4059 case Instruction::Add:
4060 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4061 return I;
4062 break;
4063 default:
4064 break;
4065 }
4066
4067 // TODO: These folds could be refactored to be part of the above calls.
4069 return I;
4070
4071 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4072 // : C4), C5` pattern, by computing a truth table of the four constant
4073 // variants.
4075}
4076
4077static Instruction *
4079 const APInt &C,
4080 InstCombiner::BuilderTy &Builder) {
4081 // This transform may end up producing more than one instruction for the
4082 // intrinsic, so limit it to one user of the intrinsic.
4083 if (!II->hasOneUse())
4084 return nullptr;
4085
4086 // Let Y = [add/sub]_sat(X, C) pred C2
4087 // SatVal = The saturating value for the operation
4088 // WillWrap = Whether or not the operation will underflow / overflow
4089 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4090 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4091 //
4092 // When (SatVal pred C2) is true, then
4093 // Y = WillWrap ? true : ((X binop C) pred C2)
4094 // => Y = WillWrap || ((X binop C) pred C2)
4095 // else
4096 // Y = WillWrap ? false : ((X binop C) pred C2)
4097 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4098 // => Y = !WillWrap && ((X binop C) pred C2)
4099 Value *Op0 = II->getOperand(0);
4100 Value *Op1 = II->getOperand(1);
4101
4102 const APInt *COp1;
4103 // This transform only works when the intrinsic has an integral constant or
4104 // splat vector as the second operand.
4105 if (!match(Op1, m_APInt(COp1)))
4106 return nullptr;
4107
4108 APInt SatVal;
4109 switch (II->getIntrinsicID()) {
4110 default:
4112 "This function only works with usub_sat and uadd_sat for now!");
4113 case Intrinsic::uadd_sat:
4114 SatVal = APInt::getAllOnes(C.getBitWidth());
4115 break;
4116 case Intrinsic::usub_sat:
4117 SatVal = APInt::getZero(C.getBitWidth());
4118 break;
4119 }
4120
4121 // Check (SatVal pred C2)
4122 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4123
4124 // !WillWrap.
4126 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4127
4128 // WillWrap.
4129 if (SatValCheck)
4130 C1 = C1.inverse();
4131
4133 if (II->getBinaryOp() == Instruction::Add)
4134 C2 = C2.sub(*COp1);
4135 else
4136 C2 = C2.add(*COp1);
4137
4138 Instruction::BinaryOps CombiningOp =
4139 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4140
4141 std::optional<ConstantRange> Combination;
4142 if (CombiningOp == Instruction::BinaryOps::Or)
4143 Combination = C1.exactUnionWith(C2);
4144 else /* CombiningOp == Instruction::BinaryOps::And */
4145 Combination = C1.exactIntersectWith(C2);
4146
4147 if (!Combination)
4148 return nullptr;
4149
4150 CmpInst::Predicate EquivPred;
4151 APInt EquivInt;
4152 APInt EquivOffset;
4153
4154 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4155
4156 return new ICmpInst(
4157 EquivPred,
4158 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4159 ConstantInt::get(Op1->getType(), EquivInt));
4160}
4161
4162static Instruction *
4164 const APInt &C,
4165 InstCombiner::BuilderTy &Builder) {
4166 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4167 switch (Pred) {
4168 case ICmpInst::ICMP_EQ:
4169 case ICmpInst::ICMP_NE:
4170 if (C.isZero())
4171 NewPredicate = Pred;
4172 else if (C.isOne())
4173 NewPredicate =
4175 else if (C.isAllOnes())
4176 NewPredicate =
4178 break;
4179
4180 case ICmpInst::ICMP_SGT:
4181 if (C.isAllOnes())
4182 NewPredicate = ICmpInst::ICMP_UGE;
4183 else if (C.isZero())
4184 NewPredicate = ICmpInst::ICMP_UGT;
4185 break;
4186
4187 case ICmpInst::ICMP_SLT:
4188 if (C.isZero())
4189 NewPredicate = ICmpInst::ICMP_ULT;
4190 else if (C.isOne())
4191 NewPredicate = ICmpInst::ICMP_ULE;
4192 break;
4193
4194 case ICmpInst::ICMP_ULT:
4195 if (C.ugt(1))
4196 NewPredicate = ICmpInst::ICMP_UGE;
4197 break;
4198
4199 case ICmpInst::ICMP_UGT:
4200 if (!C.isZero() && !C.isAllOnes())
4201 NewPredicate = ICmpInst::ICMP_ULT;
4202 break;
4203
4204 default:
4205 break;
4206 }
4207
4208 if (!NewPredicate)
4209 return nullptr;
4210
4211 if (I->getIntrinsicID() == Intrinsic::scmp)
4212 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4213 Value *LHS = I->getOperand(0);
4214 Value *RHS = I->getOperand(1);
4215 return new ICmpInst(*NewPredicate, LHS, RHS);
4216}
4217
4218/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4221 const APInt &C) {
4222 ICmpInst::Predicate Pred = Cmp.getPredicate();
4223
4224 // Handle folds that apply for any kind of icmp.
4225 switch (II->getIntrinsicID()) {
4226 default:
4227 break;
4228 case Intrinsic::uadd_sat:
4229 case Intrinsic::usub_sat:
4230 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4231 Pred, cast<SaturatingInst>(II), C, Builder))
4232 return Folded;
4233 break;
4234 case Intrinsic::ctpop: {
4235 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4236 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4237 return R;
4238 } break;
4239 case Intrinsic::scmp:
4240 case Intrinsic::ucmp:
4241 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4242 return Folded;
4243 break;
4244 }
4245
4246 if (Cmp.isEquality())
4247 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4248
4249 Type *Ty = II->getType();
4250 unsigned BitWidth = C.getBitWidth();
4251 switch (II->getIntrinsicID()) {
4252 case Intrinsic::ctpop: {
4253 // (ctpop X > BitWidth - 1) --> X == -1
4254 Value *X = II->getArgOperand(0);
4255 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4256 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4258 // (ctpop X < BitWidth) --> X != -1
4259 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4260 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4262 break;
4263 }
4264 case Intrinsic::ctlz: {
4265 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4266 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4267 unsigned Num = C.getLimitedValue();
4268 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4269 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4270 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4271 }
4272
4273 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4274 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4275 unsigned Num = C.getLimitedValue();
4277 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4278 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4279 }
4280 break;
4281 }
4282 case Intrinsic::cttz: {
4283 // Limit to one use to ensure we don't increase instruction count.
4284 if (!II->hasOneUse())
4285 return nullptr;
4286
4287 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4288 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4289 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4290 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4291 Builder.CreateAnd(II->getArgOperand(0), Mask),
4293 }
4294
4295 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4296 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4297 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4298 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4299 Builder.CreateAnd(II->getArgOperand(0), Mask),
4301 }
4302 break;
4303 }
4304 case Intrinsic::ssub_sat:
4305 // ssub.sat(a, b) spred 0 -> a spred b
4306 //
4307 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4308 // (because 1 saturates to 0). Just skip the optimization for i1.
4309 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4310 if (C.isZero())
4311 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4312 // X s<= 0 is cannonicalized to X s< 1
4313 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4314 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4315 II->getArgOperand(1));
4316 // X s>= 0 is cannonicalized to X s> -1
4317 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4318 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4319 II->getArgOperand(1));
4320 }
4321 break;
4322 case Intrinsic::abs: {
4323 if (!II->hasOneUse())
4324 return nullptr;
4325
4326 Value *X = II->getArgOperand(0);
4327 bool IsIntMinPoison =
4328 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4329
4330 // If C >= 0:
4331 // abs(X) u> C --> X + C u> 2 * C
4332 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4333 return new ICmpInst(ICmpInst::ICMP_UGT,
4334 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4335 ConstantInt::get(Ty, 2 * C));
4336 }
4337
4338 // If abs(INT_MIN) is poison and C >= 1:
4339 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4340 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4341 return new ICmpInst(ICmpInst::ICMP_ULE,
4342 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4343 ConstantInt::get(Ty, 2 * (C - 1)));
4344 }
4345
4346 break;
4347 }
4348 default:
4349 break;
4350 }
4351
4352 return nullptr;
4353}
4354
4355/// Handle icmp with constant (but not simple integer constant) RHS.
4357 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4358 Constant *RHSC = dyn_cast<Constant>(Op1);
4360 if (!RHSC || !LHSI)
4361 return nullptr;
4362
4363 switch (LHSI->getOpcode()) {
4364 case Instruction::IntToPtr:
4365 // icmp pred inttoptr(X), null -> icmp pred X, null pointer value
4366 if (isa<ConstantPointerNull>(RHSC)) {
4367 Type *IntPtrTy = DL.getIntPtrType(RHSC->getType());
4368 if (IntPtrTy == LHSI->getOperand(0)->getType()) {
4369 APInt NullPtrValue =
4370 DL.getNullPtrValue(RHSC->getType()->getPointerAddressSpace());
4371 return new ICmpInst(I.getPredicate(), LHSI->getOperand(0),
4372 Constant::getIntegerValue(IntPtrTy, NullPtrValue));
4373 }
4374 }
4375 break;
4376
4377 case Instruction::Load:
4378 // Try to optimize things like "A[i] > 4" to index computations.
4379 if (GetElementPtrInst *GEP =
4381 if (Instruction *Res =
4383 return Res;
4384 break;
4385 }
4386
4387 return nullptr;
4388}
4389
4391 Value *RHS, const ICmpInst &I) {
4392 // Try to fold the comparison into the select arms, which will cause the
4393 // select to be converted into a logical and/or.
4394 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4395 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4396 return Res;
4397 if (std::optional<bool> Impl = isImpliedCondition(
4398 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4399 return ConstantInt::get(I.getType(), *Impl);
4400 return nullptr;
4401 };
4402
4403 ConstantInt *CI = nullptr;
4404 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4405 if (Op1)
4406 CI = dyn_cast<ConstantInt>(Op1);
4407
4408 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4409 if (Op2)
4410 CI = dyn_cast<ConstantInt>(Op2);
4411
4412 auto Simplifies = [&](Value *Op, unsigned Idx) {
4413 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4414 const APInt *Dummy;
4415 return Op ||
4416 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4417 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4418 };
4419
4420 // We only want to perform this transformation if it will not lead to
4421 // additional code. This is true if either both sides of the select
4422 // fold to a constant (in which case the icmp is replaced with a select
4423 // which will usually simplify) or this is the only user of the
4424 // select (in which case we are trading a select+icmp for a simpler
4425 // select+icmp) or all uses of the select can be replaced based on
4426 // dominance information ("Global cases").
4427 bool Transform = false;
4428 if (Op1 && Op2)
4429 Transform = true;
4430 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4431 // Local case
4432 if (SI->hasOneUse())
4433 Transform = true;
4434 // Global cases
4435 else if (CI && !CI->isZero())
4436 // When Op1 is constant try replacing select with second operand.
4437 // Otherwise Op2 is constant and try replacing select with first
4438 // operand.
4439 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4440 }
4441 if (Transform) {
4442 if (!Op1)
4443 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4444 if (!Op2)
4445 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4446 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4447 ProfcheckDisableMetadataFixes ? nullptr : SI);
4448 }
4449
4450 return nullptr;
4451}
4452
4453// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4454static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4455 unsigned Depth = 0) {
4456 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4457 return true;
4458 if (V->getType()->getScalarSizeInBits() == 1)
4459 return true;
4461 return false;
4462 Value *X;
4464 if (!I)
4465 return false;
4466 switch (I->getOpcode()) {
4467 case Instruction::ZExt:
4468 // ZExt(Mask) is a Mask.
4469 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4470 case Instruction::SExt:
4471 // SExt(Mask) is a Mask.
4472 // SExt(~Mask) is a ~Mask.
4473 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4474 case Instruction::And:
4475 case Instruction::Or:
4476 // Mask0 | Mask1 is a Mask.
4477 // Mask0 & Mask1 is a Mask.
4478 // ~Mask0 | ~Mask1 is a ~Mask.
4479 // ~Mask0 & ~Mask1 is a ~Mask.
4480 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4481 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4482 case Instruction::Xor:
4483 if (match(V, m_Not(m_Value(X))))
4484 return isMaskOrZero(X, !Not, Q, Depth);
4485
4486 // (X ^ -X) is a ~Mask
4487 if (Not)
4488 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4489 // (X ^ (X - 1)) is a Mask
4490 else
4491 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4492 case Instruction::Select:
4493 // c ? Mask0 : Mask1 is a Mask.
4494 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4495 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4496 case Instruction::Shl:
4497 // (~Mask) << X is a ~Mask.
4498 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4499 case Instruction::LShr:
4500 // Mask >> X is a Mask.
4501 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4502 case Instruction::AShr:
4503 // Mask s>> X is a Mask.
4504 // ~Mask s>> X is a ~Mask.
4505 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4506 case Instruction::Add:
4507 // Pow2 - 1 is a Mask.
4508 if (!Not && match(I->getOperand(1), m_AllOnes()))
4509 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4510 Q.AC, Q.CxtI, Q.DT, Depth);
4511 break;
4512 case Instruction::Sub:
4513 // -Pow2 is a ~Mask.
4514 if (Not && match(I->getOperand(0), m_Zero()))
4515 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4516 Q.AC, Q.CxtI, Q.DT, Depth);
4517 break;
4518 case Instruction::Call: {
4519 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4520 switch (II->getIntrinsicID()) {
4521 // min/max(Mask0, Mask1) is a Mask.
4522 // min/max(~Mask0, ~Mask1) is a ~Mask.
4523 case Intrinsic::umax:
4524 case Intrinsic::smax:
4525 case Intrinsic::umin:
4526 case Intrinsic::smin:
4527 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4528 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4529
4530 // In the context of masks, bitreverse(Mask) == ~Mask
4531 case Intrinsic::bitreverse:
4532 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4533 default:
4534 break;
4535 }
4536 }
4537 break;
4538 }
4539 default:
4540 break;
4541 }
4542 return false;
4543}
4544
4545/// Some comparisons can be simplified.
4546/// In this case, we are looking for comparisons that look like
4547/// a check for a lossy truncation.
4548/// Folds:
4549/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4550/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4551/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4552/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4553/// Where Mask is some pattern that produces all-ones in low bits:
4554/// (-1 >> y)
4555/// ((-1 << y) >> y) <- non-canonical, has extra uses
4556/// ~(-1 << y)
4557/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4558/// The Mask can be a constant, too.
4559/// For some predicates, the operands are commutative.
4560/// For others, x can only be on a specific side.
4562 Value *Op1, const SimplifyQuery &Q,
4563 InstCombiner &IC) {
4564
4565 ICmpInst::Predicate DstPred;
4566 switch (Pred) {
4568 // x & Mask == x
4569 // x & ~Mask == 0
4570 // ~x | Mask == -1
4571 // -> x u<= Mask
4572 // x & ~Mask == ~Mask
4573 // -> ~Mask u<= x
4575 break;
4577 // x & Mask != x
4578 // x & ~Mask != 0
4579 // ~x | Mask != -1
4580 // -> x u> Mask
4581 // x & ~Mask != ~Mask
4582 // -> ~Mask u> x
4584 break;
4586 // x & Mask u< x
4587 // -> x u> Mask
4588 // x & ~Mask u< ~Mask
4589 // -> ~Mask u> x
4591 break;
4593 // x & Mask u>= x
4594 // -> x u<= Mask
4595 // x & ~Mask u>= ~Mask
4596 // -> ~Mask u<= x
4598 break;
4600 // x & Mask s< x [iff Mask s>= 0]
4601 // -> x s> Mask
4602 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4603 // -> ~Mask s> x
4605 break;
4607 // x & Mask s>= x [iff Mask s>= 0]
4608 // -> x s<= Mask
4609 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4610 // -> ~Mask s<= x
4612 break;
4613 default:
4614 // We don't support sgt,sle
4615 // ult/ugt are simplified to true/false respectively.
4616 return nullptr;
4617 }
4618
4619 Value *X, *M;
4620 // Put search code in lambda for early positive returns.
4621 auto IsLowBitMask = [&]() {
4622 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4623 X = Op1;
4624 // Look for: x & Mask pred x
4625 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4626 return !ICmpInst::isSigned(Pred) ||
4627 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4628 }
4629
4630 // Look for: x & ~Mask pred ~Mask
4631 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4632 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4633 }
4634 return false;
4635 }
4636 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4637 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4638
4639 auto Check = [&]() {
4640 // Look for: ~x | Mask == -1
4641 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4642 if (Value *NotX =
4643 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4644 X = NotX;
4645 return true;
4646 }
4647 }
4648 return false;
4649 };
4650 if (Check())
4651 return true;
4652 std::swap(X, M);
4653 return Check();
4654 }
4655 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4656 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4657 auto Check = [&]() {
4658 // Look for: x & ~Mask == 0
4659 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4660 if (Value *NotM =
4661 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4662 M = NotM;
4663 return true;
4664 }
4665 }
4666 return false;
4667 };
4668 if (Check())
4669 return true;
4670 std::swap(X, M);
4671 return Check();
4672 }
4673 return false;
4674 };
4675
4676 if (!IsLowBitMask())
4677 return nullptr;
4678
4679 return IC.Builder.CreateICmp(DstPred, X, M);
4680}
4681
4682/// Some comparisons can be simplified.
4683/// In this case, we are looking for comparisons that look like
4684/// a check for a lossy signed truncation.
4685/// Folds: (MaskedBits is a constant.)
4686/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4687/// Into:
4688/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4689/// Where KeptBits = bitwidth(%x) - MaskedBits
4690static Value *
4692 InstCombiner::BuilderTy &Builder) {
4693 CmpPredicate SrcPred;
4694 Value *X;
4695 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4696 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4697 if (!match(&I, m_c_ICmp(SrcPred,
4699 m_APInt(C1))),
4700 m_Deferred(X))))
4701 return nullptr;
4702
4703 // Potential handling of non-splats: for each element:
4704 // * if both are undef, replace with constant 0.
4705 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4706 // * if both are not undef, and are different, bailout.
4707 // * else, only one is undef, then pick the non-undef one.
4708
4709 // The shift amount must be equal.
4710 if (*C0 != *C1)
4711 return nullptr;
4712 const APInt &MaskedBits = *C0;
4713 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4714
4715 ICmpInst::Predicate DstPred;
4716 switch (SrcPred) {
4718 // ((%x << MaskedBits) a>> MaskedBits) == %x
4719 // =>
4720 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4722 break;
4724 // ((%x << MaskedBits) a>> MaskedBits) != %x
4725 // =>
4726 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4728 break;
4729 // FIXME: are more folds possible?
4730 default:
4731 return nullptr;
4732 }
4733
4734 auto *XType = X->getType();
4735 const unsigned XBitWidth = XType->getScalarSizeInBits();
4736 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4737 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4738
4739 // KeptBits = bitwidth(%x) - MaskedBits
4740 const APInt KeptBits = BitWidth - MaskedBits;
4741 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4742 // ICmpCst = (1 << KeptBits)
4743 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4744 assert(ICmpCst.isPowerOf2());
4745 // AddCst = (1 << (KeptBits-1))
4746 const APInt AddCst = ICmpCst.lshr(1);
4747 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4748
4749 // T0 = add %x, AddCst
4750 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4751 // T1 = T0 DstPred ICmpCst
4752 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4753
4754 return T1;
4755}
4756
4757// Given pattern:
4758// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4759// we should move shifts to the same hand of 'and', i.e. rewrite as
4760// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4761// We are only interested in opposite logical shifts here.
4762// One of the shifts can be truncated.
4763// If we can, we want to end up creating 'lshr' shift.
4764static Value *
4766 InstCombiner::BuilderTy &Builder) {
4767 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4768 !I.getOperand(0)->hasOneUse())
4769 return nullptr;
4770
4771 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4772
4773 // Look for an 'and' of two logical shifts, one of which may be truncated.
4774 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4775 Instruction *XShift, *MaybeTruncation, *YShift;
4776 if (!match(
4777 I.getOperand(0),
4778 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4780 m_AnyLogicalShift, m_Instruction(YShift))),
4781 m_Instruction(MaybeTruncation)))))
4782 return nullptr;
4783
4784 // We potentially looked past 'trunc', but only when matching YShift,
4785 // therefore YShift must have the widest type.
4786 Instruction *WidestShift = YShift;
4787 // Therefore XShift must have the shallowest type.
4788 // Or they both have identical types if there was no truncation.
4789 Instruction *NarrowestShift = XShift;
4790
4791 Type *WidestTy = WidestShift->getType();
4792 Type *NarrowestTy = NarrowestShift->getType();
4793 assert(NarrowestTy == I.getOperand(0)->getType() &&
4794 "We did not look past any shifts while matching XShift though.");
4795 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4796
4797 // If YShift is a 'lshr', swap the shifts around.
4798 if (match(YShift, m_LShr(m_Value(), m_Value())))
4799 std::swap(XShift, YShift);
4800
4801 // The shifts must be in opposite directions.
4802 auto XShiftOpcode = XShift->getOpcode();
4803 if (XShiftOpcode == YShift->getOpcode())
4804 return nullptr; // Do not care about same-direction shifts here.
4805
4806 Value *X, *XShAmt, *Y, *YShAmt;
4807 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4808 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4809
4810 // If one of the values being shifted is a constant, then we will end with
4811 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4812 // however, we will need to ensure that we won't increase instruction count.
4813 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4814 // At least one of the hands of the 'and' should be one-use shift.
4815 if (!match(I.getOperand(0),
4816 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4817 return nullptr;
4818 if (HadTrunc) {
4819 // Due to the 'trunc', we will need to widen X. For that either the old
4820 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4821 if (!MaybeTruncation->hasOneUse() &&
4822 !NarrowestShift->getOperand(1)->hasOneUse())
4823 return nullptr;
4824 }
4825 }
4826
4827 // We have two shift amounts from two different shifts. The types of those
4828 // shift amounts may not match. If that's the case let's bailout now.
4829 if (XShAmt->getType() != YShAmt->getType())
4830 return nullptr;
4831
4832 // As input, we have the following pattern:
4833 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4834 // We want to rewrite that as:
4835 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4836 // While we know that originally (Q+K) would not overflow
4837 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4838 // shift amounts. so it may now overflow in smaller bitwidth.
4839 // To ensure that does not happen, we need to ensure that the total maximal
4840 // shift amount is still representable in that smaller bit width.
4841 unsigned MaximalPossibleTotalShiftAmount =
4842 (WidestTy->getScalarSizeInBits() - 1) +
4843 (NarrowestTy->getScalarSizeInBits() - 1);
4844 APInt MaximalRepresentableShiftAmount =
4846 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4847 return nullptr;
4848
4849 // Can we fold (XShAmt+YShAmt) ?
4850 auto *NewShAmt = dyn_cast_or_null<Constant>(
4851 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4852 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4853 if (!NewShAmt)
4854 return nullptr;
4855 if (NewShAmt->getType() != WidestTy) {
4856 NewShAmt =
4857 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4858 if (!NewShAmt)
4859 return nullptr;
4860 }
4861 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4862
4863 // Is the new shift amount smaller than the bit width?
4864 // FIXME: could also rely on ConstantRange.
4865 if (!match(NewShAmt,
4867 APInt(WidestBitWidth, WidestBitWidth))))
4868 return nullptr;
4869
4870 // An extra legality check is needed if we had trunc-of-lshr.
4871 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4872 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4873 WidestShift]() {
4874 // It isn't obvious whether it's worth it to analyze non-constants here.
4875 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4876 // If *any* of these preconditions matches we can perform the fold.
4877 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4878 ? NewShAmt->getSplatValue()
4879 : NewShAmt;
4880 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4881 if (NewShAmtSplat &&
4882 (NewShAmtSplat->isNullValue() ||
4883 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4884 return true;
4885 // We consider *min* leading zeros so a single outlier
4886 // blocks the transform as opposed to allowing it.
4887 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4889 unsigned MinLeadZero = Known.countMinLeadingZeros();
4890 // If the value being shifted has at most lowest bit set we can fold.
4891 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4892 if (MaxActiveBits <= 1)
4893 return true;
4894 // Precondition: NewShAmt u<= countLeadingZeros(C)
4895 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4896 return true;
4897 }
4898 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4900 unsigned MinLeadZero = Known.countMinLeadingZeros();
4901 // If the value being shifted has at most lowest bit set we can fold.
4902 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4903 if (MaxActiveBits <= 1)
4904 return true;
4905 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4906 if (NewShAmtSplat) {
4907 APInt AdjNewShAmt =
4908 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4909 if (AdjNewShAmt.ule(MinLeadZero))
4910 return true;
4911 }
4912 }
4913 return false; // Can't tell if it's ok.
4914 };
4915 if (!CanFold())
4916 return nullptr;
4917 }
4918
4919 // All good, we can do this fold.
4920 X = Builder.CreateZExt(X, WidestTy);
4921 Y = Builder.CreateZExt(Y, WidestTy);
4922 // The shift is the same that was for X.
4923 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4924 ? Builder.CreateLShr(X, NewShAmt)
4925 : Builder.CreateShl(X, NewShAmt);
4926 Value *T1 = Builder.CreateAnd(T0, Y);
4927 return Builder.CreateICmp(I.getPredicate(), T1,
4928 Constant::getNullValue(WidestTy));
4929}
4930
4931/// Fold
4932/// (-1 u/ x) u< y
4933/// ((x * y) ?/ x) != y
4934/// to
4935/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4936/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4937/// will mean that we are looking for the opposite answer.
4939 CmpPredicate Pred;
4940 Value *X, *Y;
4942 Instruction *Div;
4943 bool NeedNegation;
4944 // Look for: (-1 u/ x) u</u>= y
4945 if (!I.isEquality() &&
4946 match(&I, m_c_ICmp(Pred,
4948 m_Instruction(Div)),
4949 m_Value(Y)))) {
4950 Mul = nullptr;
4951
4952 // Are we checking that overflow does not happen, or does happen?
4953 switch (Pred) {
4955 NeedNegation = false;
4956 break; // OK
4958 NeedNegation = true;
4959 break; // OK
4960 default:
4961 return nullptr; // Wrong predicate.
4962 }
4963 } else // Look for: ((x * y) / x) !=/== y
4964 if (I.isEquality() &&
4965 match(&I, m_c_ICmp(Pred, m_Value(Y),
4968 m_Value(X)),
4970 m_Deferred(X))),
4971 m_Instruction(Div))))) {
4972 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4973 } else
4974 return nullptr;
4975
4977 // If the pattern included (x * y), we'll want to insert new instructions
4978 // right before that original multiplication so that we can replace it.
4979 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4980 if (MulHadOtherUses)
4981 Builder.SetInsertPoint(Mul);
4982
4983 Value *Call = Builder.CreateIntrinsic(
4984 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4985 : Intrinsic::smul_with_overflow,
4986 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4987
4988 // If the multiplication was used elsewhere, to ensure that we don't leave
4989 // "duplicate" instructions, replace uses of that original multiplication
4990 // with the multiplication result from the with.overflow intrinsic.
4991 if (MulHadOtherUses)
4992 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4993
4994 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4995 if (NeedNegation) // This technically increases instruction count.
4996 Res = Builder.CreateNot(Res, "mul.not.ov");
4997
4998 // If we replaced the mul, erase it. Do this after all uses of Builder,
4999 // as the mul is used as insertion point.
5000 if (MulHadOtherUses)
5002
5003 return Res;
5004}
5005
5007 InstCombiner::BuilderTy &Builder) {
5008 CmpPredicate Pred;
5009 Value *X;
5010 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
5011
5012 if (ICmpInst::isSigned(Pred))
5013 Pred = ICmpInst::getSwappedPredicate(Pred);
5014 else if (ICmpInst::isUnsigned(Pred))
5015 Pred = ICmpInst::getSignedPredicate(Pred);
5016 // else for equality-comparisons just keep the predicate.
5017
5018 return ICmpInst::Create(Instruction::ICmp, Pred, X,
5019 Constant::getNullValue(X->getType()), I.getName());
5020 }
5021
5022 // A value is not equal to its negation unless that value is 0 or
5023 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
5024 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
5025 ICmpInst::isEquality(Pred)) {
5026 Type *Ty = X->getType();
5027 uint32_t BitWidth = Ty->getScalarSizeInBits();
5028 Constant *MaxSignedVal =
5029 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
5030 Value *And = Builder.CreateAnd(X, MaxSignedVal);
5031 Constant *Zero = Constant::getNullValue(Ty);
5032 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
5033 }
5034
5035 return nullptr;
5036}
5037
5039 InstCombinerImpl &IC) {
5040 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5041 // Normalize and operand as operand 0.
5042 CmpInst::Predicate Pred = I.getPredicate();
5043 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
5044 std::swap(Op0, Op1);
5045 Pred = ICmpInst::getSwappedPredicate(Pred);
5046 }
5047
5048 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5049 return nullptr;
5050
5051 // (icmp (X & Y) u< X --> (X & Y) != X
5052 if (Pred == ICmpInst::ICMP_ULT)
5053 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5054
5055 // (icmp (X & Y) u>= X --> (X & Y) == X
5056 if (Pred == ICmpInst::ICMP_UGE)
5057 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5058
5059 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5060 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5061 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5062 // so don't do this fold.
5063 if (!match(Op1, m_ImmConstant()))
5064 if (auto *NotOp1 =
5065 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5066 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5067 Constant::getAllOnesValue(Op1->getType()));
5068 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5069 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5070 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5071 Constant::getNullValue(Op1->getType()));
5072 }
5073
5074 if (!ICmpInst::isSigned(Pred))
5075 return nullptr;
5076
5077 KnownBits KnownY = IC.computeKnownBits(A, &I);
5078 // (X & NegY) spred X --> (X & NegY) upred X
5079 if (KnownY.isNegative())
5080 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5081
5082 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5083 return nullptr;
5084
5085 if (KnownY.isNonNegative())
5086 // (X & PosY) s<= X --> X s>= 0
5087 // (X & PosY) s> X --> X s< 0
5088 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5089 Constant::getNullValue(Op1->getType()));
5090
5092 // (NegX & Y) s<= NegX --> Y s< 0
5093 // (NegX & Y) s> NegX --> Y s>= 0
5095 Constant::getNullValue(A->getType()));
5096
5097 return nullptr;
5098}
5099
5101 InstCombinerImpl &IC) {
5102 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5103
5104 // Normalize or operand as operand 0.
5105 CmpInst::Predicate Pred = I.getPredicate();
5106 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5107 std::swap(Op0, Op1);
5108 Pred = ICmpInst::getSwappedPredicate(Pred);
5109 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5110 return nullptr;
5111 }
5112
5113 // icmp (X | Y) u<= X --> (X | Y) == X
5114 if (Pred == ICmpInst::ICMP_ULE)
5115 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5116
5117 // icmp (X | Y) u> X --> (X | Y) != X
5118 if (Pred == ICmpInst::ICMP_UGT)
5119 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5120
5121 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5122 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5123 if (Value *NotOp1 = IC.getFreelyInverted(
5124 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5125 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5126 Constant::getNullValue(Op1->getType()));
5127 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5128 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5129 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5130 Constant::getAllOnesValue(Op1->getType()));
5131 }
5132 return nullptr;
5133}
5134
5136 InstCombinerImpl &IC) {
5137 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5138 // Normalize xor operand as operand 0.
5139 CmpInst::Predicate Pred = I.getPredicate();
5140 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5141 std::swap(Op0, Op1);
5142 Pred = ICmpInst::getSwappedPredicate(Pred);
5143 }
5144 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5145 return nullptr;
5146
5147 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5148 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5149 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5150 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5152 if (PredOut != Pred && isKnownNonZero(A, Q))
5153 return new ICmpInst(PredOut, Op0, Op1);
5154
5155 // These transform work when A is negative.
5156 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5157 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5158 if (match(A, m_Negative())) {
5159 CmpInst::Predicate NewPred;
5160 switch (ICmpInst::getStrictPredicate(Pred)) {
5161 default:
5162 return nullptr;
5163 case ICmpInst::ICMP_SLT:
5164 case ICmpInst::ICMP_UGT:
5165 NewPred = ICmpInst::ICMP_SLT;
5166 break;
5167 case ICmpInst::ICMP_SGT:
5168 case ICmpInst::ICMP_ULT:
5169 NewPred = ICmpInst::ICMP_SGE;
5170 break;
5171 }
5172 Constant *Const = Constant::getNullValue(Op0->getType());
5173 return new ICmpInst(NewPred, Op0, Const);
5174 }
5175
5176 return nullptr;
5177}
5178
5179/// Return true if X is a multiple of C.
5180/// TODO: Handle non-power-of-2 factors.
5181static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5182 if (C.isOne())
5183 return true;
5184
5185 if (!C.isPowerOf2())
5186 return false;
5187
5188 return MaskedValueIsZero(X, C - 1, Q);
5189}
5190
5191/// Try to fold icmp (binop), X or icmp X, (binop).
5192/// TODO: A large part of this logic is duplicated in InstSimplify's
5193/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5194/// duplication.
5196 const SimplifyQuery &SQ) {
5197 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5198 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5199
5200 // Special logic for binary operators.
5203 if (!BO0 && !BO1)
5204 return nullptr;
5205
5206 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5207 return NewICmp;
5208
5209 const CmpInst::Predicate Pred = I.getPredicate();
5210 Value *X;
5211
5212 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5213 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5214 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5215 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5216 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5217 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5218 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5219 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5220 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5221
5222 {
5223 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5224 Constant *C;
5225 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5226 m_ImmConstant(C)))) &&
5227 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5229 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5230 }
5231 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5232 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5233 m_ImmConstant(C)))) &&
5234 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5236 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5237 }
5238 }
5239
5240 // (icmp eq/ne (X, -P2), INT_MIN)
5241 // -> (icmp slt/sge X, INT_MIN + P2)
5242 if (ICmpInst::isEquality(Pred) && BO0 &&
5243 match(I.getOperand(1), m_SignMask()) &&
5245 // Will Constant fold.
5246 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5247 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5249 BO0->getOperand(0), NewC);
5250 }
5251
5252 {
5253 // Similar to above: an unsigned overflow comparison may use offset + mask:
5254 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5255 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5256 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5257 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5258 BinaryOperator *BO;
5259 const APInt *C;
5260 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5261 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5263 CmpInst::Predicate NewPred =
5265 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5266 return new ICmpInst(NewPred, Op1, Zero);
5267 }
5268
5269 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5270 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5272 CmpInst::Predicate NewPred =
5274 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5275 return new ICmpInst(NewPred, Op0, Zero);
5276 }
5277 }
5278
5279 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5280 bool Op0HasNUW = false, Op1HasNUW = false;
5281 bool Op0HasNSW = false, Op1HasNSW = false;
5282 // Analyze the case when either Op0 or Op1 is an add instruction.
5283 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5284 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5285 bool &HasNSW, bool &HasNUW) -> bool {
5287 HasNUW = BO.hasNoUnsignedWrap();
5288 HasNSW = BO.hasNoSignedWrap();
5289 return ICmpInst::isEquality(Pred) ||
5290 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5291 (CmpInst::isSigned(Pred) && HasNSW);
5292 } else if (BO.getOpcode() == Instruction::Or) {
5293 HasNUW = true;
5294 HasNSW = true;
5295 return true;
5296 } else {
5297 return false;
5298 }
5299 };
5300 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5301
5302 if (BO0) {
5303 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5304 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5305 }
5306 if (BO1) {
5307 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5308 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5309 }
5310
5311 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5312 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5313 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5314 return new ICmpInst(Pred, A == Op1 ? B : A,
5315 Constant::getNullValue(Op1->getType()));
5316
5317 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5318 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5319 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5320 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5321 C == Op0 ? D : C);
5322
5323 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5324 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5325 NoOp1WrapProblem) {
5326 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5327 Value *Y, *Z;
5328 if (A == C) {
5329 // C + B == C + D -> B == D
5330 Y = B;
5331 Z = D;
5332 } else if (A == D) {
5333 // D + B == C + D -> B == C
5334 Y = B;
5335 Z = C;
5336 } else if (B == C) {
5337 // A + C == C + D -> A == D
5338 Y = A;
5339 Z = D;
5340 } else {
5341 assert(B == D);
5342 // A + D == C + D -> A == C
5343 Y = A;
5344 Z = C;
5345 }
5346 return new ICmpInst(Pred, Y, Z);
5347 }
5348
5349 if (ICmpInst::isRelational(Pred)) {
5350 // Return if both X and Y is divisible by Z/-Z.
5351 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5352 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5353 bool IsNegative) -> bool {
5354 const APInt *OffsetC;
5355 if (!match(Z, m_APInt(OffsetC)))
5356 return false;
5357
5358 // Fast path for Z == 1/-1.
5359 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5360 return true;
5361
5362 APInt C = *OffsetC;
5363 if (IsNegative)
5364 C.negate();
5365 // Note: -INT_MIN is also negative.
5366 if (!C.isStrictlyPositive())
5367 return false;
5368
5369 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5370 };
5371
5372 // TODO: The subtraction-related identities shown below also hold, but
5373 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5374 // wouldn't happen even if they were implemented.
5375 //
5376 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5377 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5378 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5379 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5380
5381 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5382 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5383 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5384 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5385 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5386 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5387 if (A && NoOp0WrapProblem &&
5388 ShareCommonDivisor(A, Op1, B,
5389 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5391 Op1);
5392
5393 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5394 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5395 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5396 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5397 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5398 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5399 if (C && NoOp1WrapProblem &&
5400 ShareCommonDivisor(Op0, C, D,
5401 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5403 C);
5404 }
5405
5406 // if C1 has greater magnitude than C2:
5407 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5408 // s.t. C3 = C1 - C2
5409 //
5410 // if C2 has greater magnitude than C1:
5411 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5412 // s.t. C3 = C2 - C1
5413 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5414 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5415 const APInt *AP1, *AP2;
5416 // TODO: Support non-uniform vectors.
5417 // TODO: Allow poison passthrough if B or D's element is poison.
5418 if (match(B, m_APIntAllowPoison(AP1)) &&
5419 match(D, m_APIntAllowPoison(AP2)) &&
5420 AP1->isNegative() == AP2->isNegative()) {
5421 APInt AP1Abs = AP1->abs();
5422 APInt AP2Abs = AP2->abs();
5423 if (AP1Abs.uge(AP2Abs)) {
5424 APInt Diff = *AP1 - *AP2;
5425 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5426 Value *NewAdd = Builder.CreateAdd(
5427 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5428 return new ICmpInst(Pred, NewAdd, C);
5429 } else {
5430 APInt Diff = *AP2 - *AP1;
5431 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5432 Value *NewAdd = Builder.CreateAdd(
5433 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5434 return new ICmpInst(Pred, A, NewAdd);
5435 }
5436 }
5437 Constant *Cst1, *Cst2;
5438 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5439 ICmpInst::isEquality(Pred)) {
5440 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5441 Value *NewAdd = Builder.CreateAdd(C, Diff);
5442 return new ICmpInst(Pred, A, NewAdd);
5443 }
5444 }
5445
5446 // Analyze the case when either Op0 or Op1 is a sub instruction.
5447 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5448 A = nullptr;
5449 B = nullptr;
5450 C = nullptr;
5451 D = nullptr;
5452 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5453 A = BO0->getOperand(0);
5454 B = BO0->getOperand(1);
5455 }
5456 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5457 C = BO1->getOperand(0);
5458 D = BO1->getOperand(1);
5459 }
5460
5461 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5462 if (A == Op1 && NoOp0WrapProblem)
5463 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5464 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5465 if (C == Op0 && NoOp1WrapProblem)
5466 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5467
5468 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5469 // (A - B) u>/u<= A --> B u>/u<= A
5470 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5471 return new ICmpInst(Pred, B, A);
5472 // C u</u>= (C - D) --> C u</u>= D
5473 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5474 return new ICmpInst(Pred, C, D);
5475 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5476 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5477 isKnownNonZero(B, Q))
5479 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5480 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5481 isKnownNonZero(D, Q))
5483
5484 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5485 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5486 return new ICmpInst(Pred, A, C);
5487
5488 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5489 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5490 return new ICmpInst(Pred, D, B);
5491
5492 // icmp (0-X) < cst --> x > -cst
5493 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5494 Value *X;
5495 if (match(BO0, m_Neg(m_Value(X))))
5496 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5497 if (RHSC->isNotMinSignedValue())
5498 return new ICmpInst(I.getSwappedPredicate(), X,
5499 ConstantExpr::getNeg(RHSC));
5500 }
5501
5502 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5503 return R;
5504 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5505 return R;
5506
5507 {
5508 // Try to remove shared multiplier from comparison:
5509 // X * Z pred Y * Z
5510 Value *X, *Y, *Z;
5511 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5512 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5513 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5514 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5515 if (ICmpInst::isSigned(Pred)) {
5516 if (Op0HasNSW && Op1HasNSW) {
5517 KnownBits ZKnown = computeKnownBits(Z, &I);
5518 if (ZKnown.isStrictlyPositive())
5519 return new ICmpInst(Pred, X, Y);
5520 if (ZKnown.isNegative())
5521 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5523 SQ.getWithInstruction(&I));
5524 if (LessThan && match(LessThan, m_One()))
5525 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5526 Constant::getNullValue(Z->getType()));
5527 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5528 SQ.getWithInstruction(&I));
5529 if (GreaterThan && match(GreaterThan, m_One()))
5530 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5531 }
5532 } else {
5533 bool NonZero;
5534 if (ICmpInst::isEquality(Pred)) {
5535 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5536 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5537 isKnownNonEqual(X, Y, SQ))
5538 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5539
5540 KnownBits ZKnown = computeKnownBits(Z, &I);
5541 // if Z % 2 != 0
5542 // X * Z eq/ne Y * Z -> X eq/ne Y
5543 if (ZKnown.countMaxTrailingZeros() == 0)
5544 return new ICmpInst(Pred, X, Y);
5545 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5546 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5547 // X * Z eq/ne Y * Z -> X eq/ne Y
5548 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5549 return new ICmpInst(Pred, X, Y);
5550 } else
5551 NonZero = isKnownNonZero(Z, Q);
5552
5553 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5554 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5555 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5556 return new ICmpInst(Pred, X, Y);
5557 }
5558 }
5559 }
5560
5561 BinaryOperator *SRem = nullptr;
5562 // icmp (srem X, Y), Y
5563 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5564 SRem = BO0;
5565 // icmp Y, (srem X, Y)
5566 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5567 Op0 == BO1->getOperand(1))
5568 SRem = BO1;
5569 if (SRem) {
5570 // We don't check hasOneUse to avoid increasing register pressure because
5571 // the value we use is the same value this instruction was already using.
5572 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5573 default:
5574 break;
5575 case ICmpInst::ICMP_EQ:
5576 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5577 case ICmpInst::ICMP_NE:
5578 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5579 case ICmpInst::ICMP_SGT:
5580 case ICmpInst::ICMP_SGE:
5581 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5583 case ICmpInst::ICMP_SLT:
5584 case ICmpInst::ICMP_SLE:
5585 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5587 }
5588 }
5589
5590 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5591 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5592 BO0->getOperand(1) == BO1->getOperand(1)) {
5593 switch (BO0->getOpcode()) {
5594 default:
5595 break;
5596 case Instruction::Add:
5597 case Instruction::Sub:
5598 case Instruction::Xor: {
5599 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5600 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5601
5602 const APInt *C;
5603 if (match(BO0->getOperand(1), m_APInt(C))) {
5604 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5605 if (C->isSignMask()) {
5606 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5607 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5608 }
5609
5610 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5611 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5612 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5613 NewPred = I.getSwappedPredicate(NewPred);
5614 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5615 }
5616 }
5617 break;
5618 }
5619 case Instruction::Mul: {
5620 if (!I.isEquality())
5621 break;
5622
5623 const APInt *C;
5624 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5625 !C->isOne()) {
5626 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5627 // Mask = -1 >> count-trailing-zeros(C).
5628 if (unsigned TZs = C->countr_zero()) {
5629 Constant *Mask = ConstantInt::get(
5630 BO0->getType(),
5631 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5632 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5633 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5634 return new ICmpInst(Pred, And1, And2);
5635 }
5636 }
5637 break;
5638 }
5639 case Instruction::UDiv:
5640 case Instruction::LShr:
5641 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5642 break;
5643 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5644
5645 case Instruction::SDiv:
5646 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5647 !BO0->isExact() || !BO1->isExact())
5648 break;
5649 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5650
5651 case Instruction::AShr:
5652 if (!BO0->isExact() || !BO1->isExact())
5653 break;
5654 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5655
5656 case Instruction::Shl: {
5657 bool NUW = Op0HasNUW && Op1HasNUW;
5658 bool NSW = Op0HasNSW && Op1HasNSW;
5659 if (!NUW && !NSW)
5660 break;
5661 if (!NSW && I.isSigned())
5662 break;
5663 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5664 }
5665 }
5666 }
5667
5668 if (BO0) {
5669 // Transform A & (L - 1) `ult` L --> L != 0
5670 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5671 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5672
5673 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5674 auto *Zero = Constant::getNullValue(BO0->getType());
5675 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5676 }
5677 }
5678
5679 // For unsigned predicates / eq / ne:
5680 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5681 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5682 if (!ICmpInst::isSigned(Pred)) {
5683 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5684 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5685 Constant::getNullValue(Op1->getType()));
5686 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5687 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5688 Constant::getNullValue(Op0->getType()), Op0);
5689 }
5690
5692 return replaceInstUsesWith(I, V);
5693
5694 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5695 return R;
5696
5698 return replaceInstUsesWith(I, V);
5699
5701 return replaceInstUsesWith(I, V);
5702
5703 return nullptr;
5704}
5705
5706/// Fold icmp Pred min|max(X, Y), Z.
5709 Value *Z, CmpPredicate Pred) {
5710 Value *X = MinMax->getLHS();
5711 Value *Y = MinMax->getRHS();
5712 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5713 return nullptr;
5714 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5715 // Revert the transform signed pred -> unsigned pred
5716 // TODO: We can flip the signedness of predicate if both operands of icmp
5717 // are negative.
5718 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5719 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5721 } else
5722 return nullptr;
5723 }
5724 SimplifyQuery Q = SQ.getWithInstruction(&I);
5725 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5726 if (!Val)
5727 return std::nullopt;
5728 if (match(Val, m_One()))
5729 return true;
5730 if (match(Val, m_Zero()))
5731 return false;
5732 return std::nullopt;
5733 };
5734 // Remove samesign here since it is illegal to keep it when we speculatively
5735 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5736 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5737 // -46, -32)`. `X` is allowed to be non-negative here.
5738 Pred = Pred.dropSameSign();
5739 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5740 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5741 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5742 return nullptr;
5743 if (!CmpXZ.has_value()) {
5744 std::swap(X, Y);
5745 std::swap(CmpXZ, CmpYZ);
5746 }
5747
5748 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5749 if (CmpYZ.has_value())
5750 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5751 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5752 };
5753
5754 switch (Pred) {
5755 case ICmpInst::ICMP_EQ:
5756 case ICmpInst::ICMP_NE: {
5757 // If X == Z:
5758 // Expr Result
5759 // min(X, Y) == Z X <= Y
5760 // max(X, Y) == Z X >= Y
5761 // min(X, Y) != Z X > Y
5762 // max(X, Y) != Z X < Y
5763 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5764 ICmpInst::Predicate NewPred =
5765 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5766 if (Pred == ICmpInst::ICMP_NE)
5767 NewPred = ICmpInst::getInversePredicate(NewPred);
5768 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5769 }
5770 // Otherwise (X != Z):
5771 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5772 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5773 if (!MinMaxCmpXZ.has_value()) {
5774 std::swap(X, Y);
5775 std::swap(CmpXZ, CmpYZ);
5776 // Re-check pre-condition X != Z
5777 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5778 break;
5779 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5780 }
5781 if (!MinMaxCmpXZ.has_value())
5782 break;
5783 if (*MinMaxCmpXZ) {
5784 // Expr Fact Result
5785 // min(X, Y) == Z X < Z false
5786 // max(X, Y) == Z X > Z false
5787 // min(X, Y) != Z X < Z true
5788 // max(X, Y) != Z X > Z true
5789 return replaceInstUsesWith(
5790 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5791 } else {
5792 // Expr Fact Result
5793 // min(X, Y) == Z X > Z Y == Z
5794 // max(X, Y) == Z X < Z Y == Z
5795 // min(X, Y) != Z X > Z Y != Z
5796 // max(X, Y) != Z X < Z Y != Z
5797 return FoldIntoCmpYZ();
5798 }
5799 break;
5800 }
5801 case ICmpInst::ICMP_SLT:
5802 case ICmpInst::ICMP_ULT:
5803 case ICmpInst::ICMP_SLE:
5804 case ICmpInst::ICMP_ULE:
5805 case ICmpInst::ICMP_SGT:
5806 case ICmpInst::ICMP_UGT:
5807 case ICmpInst::ICMP_SGE:
5808 case ICmpInst::ICMP_UGE: {
5809 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5810 if (*CmpXZ) {
5811 if (IsSame) {
5812 // Expr Fact Result
5813 // min(X, Y) < Z X < Z true
5814 // min(X, Y) <= Z X <= Z true
5815 // max(X, Y) > Z X > Z true
5816 // max(X, Y) >= Z X >= Z true
5817 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5818 } else {
5819 // Expr Fact Result
5820 // max(X, Y) < Z X < Z Y < Z
5821 // max(X, Y) <= Z X <= Z Y <= Z
5822 // min(X, Y) > Z X > Z Y > Z
5823 // min(X, Y) >= Z X >= Z Y >= Z
5824 return FoldIntoCmpYZ();
5825 }
5826 } else {
5827 if (IsSame) {
5828 // Expr Fact Result
5829 // min(X, Y) < Z X >= Z Y < Z
5830 // min(X, Y) <= Z X > Z Y <= Z
5831 // max(X, Y) > Z X <= Z Y > Z
5832 // max(X, Y) >= Z X < Z Y >= Z
5833 return FoldIntoCmpYZ();
5834 } else {
5835 // Expr Fact Result
5836 // max(X, Y) < Z X >= Z false
5837 // max(X, Y) <= Z X > Z false
5838 // min(X, Y) > Z X <= Z false
5839 // min(X, Y) >= Z X < Z false
5840 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5841 }
5842 }
5843 break;
5844 }
5845 default:
5846 break;
5847 }
5848
5849 return nullptr;
5850}
5851
5852/// Match and fold patterns like:
5853/// icmp eq/ne X, min(max(X, Lo), Hi)
5854/// which represents a range check and can be represented as a ConstantRange.
5855///
5856/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5857/// (X - Lo) u< (Hi + 1 - Lo)
5858/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5859/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5861 MinMaxIntrinsic *Min) {
5862 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5863 return nullptr;
5864
5865 const APInt *Lo = nullptr, *Hi = nullptr;
5866 if (Min->isSigned()) {
5867 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5868 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5869 return nullptr;
5870 } else {
5871 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5872 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5873 return nullptr;
5874 }
5875
5878 APInt C, Offset;
5879 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5880 CR.getEquivalentICmp(Pred, C, Offset);
5881 else
5882 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5883
5884 if (!Offset.isZero())
5885 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5886
5887 return replaceInstUsesWith(
5888 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5889}
5890
5891// Canonicalize checking for a power-of-2-or-zero value:
5893 InstCombiner::BuilderTy &Builder) {
5894 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5895 const CmpInst::Predicate Pred = I.getPredicate();
5896 Value *A = nullptr;
5897 bool CheckIs;
5898 if (I.isEquality()) {
5899 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5900 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5901 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5902 m_Deferred(A)))) ||
5903 !match(Op1, m_ZeroInt()))
5904 A = nullptr;
5905
5906 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5907 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5908 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5909 A = Op1;
5910 else if (match(Op1,
5912 A = Op0;
5913
5914 CheckIs = Pred == ICmpInst::ICMP_EQ;
5915 } else if (ICmpInst::isUnsigned(Pred)) {
5916 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5917 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5918
5919 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5921 m_Specific(Op1))))) {
5922 A = Op1;
5923 CheckIs = Pred == ICmpInst::ICMP_UGE;
5924 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5926 m_Specific(Op0))))) {
5927 A = Op0;
5928 CheckIs = Pred == ICmpInst::ICMP_ULE;
5929 }
5930 }
5931
5932 if (A) {
5933 Type *Ty = A->getType();
5934 Value *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5935 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5936 ConstantInt::get(Ty, 2))
5937 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5938 ConstantInt::get(Ty, 1));
5939 }
5940
5941 return nullptr;
5942}
5943
5944/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5945using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5947 bool AllowRecursion) {
5949 if (!Inst || !Inst->hasOneUse())
5950 return;
5951
5952 switch (Inst->getOpcode()) {
5953 case Instruction::Add:
5954 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5955 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5956 break;
5957 case Instruction::Sub:
5958 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5959 break;
5960 case Instruction::Xor:
5961 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5962 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5963 break;
5964 case Instruction::Shl:
5965 if (Inst->hasNoSignedWrap())
5966 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
5967 if (Inst->hasNoUnsignedWrap())
5968 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
5969 break;
5970 case Instruction::Select:
5971 if (AllowRecursion) {
5972 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5973 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5974 }
5975 break;
5976 default:
5977 break;
5978 }
5979}
5980
5982
5987
5989 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
5990 }
5992 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
5993 }
5994 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
5996 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
5997 }
5998 bool isValid() const { return Kind != OffsetKind::Invalid; }
6000 switch (Kind) {
6002 llvm_unreachable("Invalid offset result");
6003 case OffsetKind::Value:
6004 return V0;
6005 case OffsetKind::Select:
6006 return Builder.CreateSelect(
6007 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
6008 }
6009 llvm_unreachable("Unknown OffsetKind enum");
6010 }
6011};
6012
6013/// Offset both sides of an equality icmp to see if we can save some
6014/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
6015/// Note: This operation should not introduce poison.
6017 InstCombiner::BuilderTy &Builder,
6018 const SimplifyQuery &SQ) {
6019 assert(I.isEquality() && "Expected an equality icmp");
6020 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6021 if (!Op0->getType()->isIntOrIntVectorTy())
6022 return nullptr;
6023
6024 SmallVector<OffsetOp, 4> OffsetOps;
6025 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
6026 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
6027
6028 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
6029 switch (BinOpc) {
6030 // V = shl nsw X, RHS => X = ashr V, RHS
6031 case Instruction::AShr: {
6032 const APInt *CV, *CRHS;
6033 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6034 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
6036 return nullptr;
6037 break;
6038 }
6039 // V = shl nuw X, RHS => X = lshr V, RHS
6040 case Instruction::LShr: {
6041 const APInt *CV, *CRHS;
6042 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
6043 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
6045 return nullptr;
6046 break;
6047 }
6048 default:
6049 break;
6050 }
6051
6052 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6053 if (!Simplified)
6054 return nullptr;
6055 // Reject constant expressions as they don't simplify things.
6056 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6057 return nullptr;
6058 // Check if the transformation introduces poison.
6059 return impliesPoison(RHS, V) ? Simplified : nullptr;
6060 };
6061
6062 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6063 Value *RHS) -> OffsetResult {
6064 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6065 if (!Sel->hasOneUse())
6066 return OffsetResult::invalid();
6067 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6068 if (!TrueVal)
6069 return OffsetResult::invalid();
6070 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6071 if (!FalseVal)
6072 return OffsetResult::invalid();
6073 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6074 }
6075 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6076 return OffsetResult::value(Simplified);
6077 return OffsetResult::invalid();
6078 };
6079
6080 for (auto [BinOp, RHS] : OffsetOps) {
6081 auto BinOpc = static_cast<unsigned>(BinOp);
6082
6083 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6084 if (!Op0Result.isValid())
6085 continue;
6086 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6087 if (!Op1Result.isValid())
6088 continue;
6089
6090 Value *NewLHS = Op0Result.materialize(Builder);
6091 Value *NewRHS = Op1Result.materialize(Builder);
6092 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6093 }
6094
6095 return nullptr;
6096}
6097
6099 if (!I.isEquality())
6100 return nullptr;
6101
6102 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6103 const CmpInst::Predicate Pred = I.getPredicate();
6104 Value *A, *B, *C, *D;
6105 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6106 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6107 Value *OtherVal = A == Op1 ? B : A;
6108 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6109 }
6110
6111 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6112 // A^c1 == C^c2 --> A == C^(c1^c2)
6113 ConstantInt *C1, *C2;
6114 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6115 Op1->hasOneUse()) {
6116 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6117 Value *Xor = Builder.CreateXor(C, NC);
6118 return new ICmpInst(Pred, A, Xor);
6119 }
6120
6121 // A^B == A^D -> B == D
6122 if (A == C)
6123 return new ICmpInst(Pred, B, D);
6124 if (A == D)
6125 return new ICmpInst(Pred, B, C);
6126 if (B == C)
6127 return new ICmpInst(Pred, A, D);
6128 if (B == D)
6129 return new ICmpInst(Pred, A, C);
6130 }
6131 }
6132
6133 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6134 // A == (A^B) -> B == 0
6135 Value *OtherVal = A == Op0 ? B : A;
6136 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6137 }
6138
6139 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6140 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6141 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6142 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6143
6144 if (A == C) {
6145 X = B;
6146 Y = D;
6147 Z = A;
6148 } else if (A == D) {
6149 X = B;
6150 Y = C;
6151 Z = A;
6152 } else if (B == C) {
6153 X = A;
6154 Y = D;
6155 Z = B;
6156 } else if (B == D) {
6157 X = A;
6158 Y = C;
6159 Z = B;
6160 }
6161
6162 if (X) {
6163 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6164 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6165 // instructions.
6166 const APInt *C0, *C1;
6167 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6168 (*C0 ^ *C1).isNegatedPowerOf2();
6169
6170 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6171 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6172 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6173 int UseCnt =
6174 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6175 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6176 if (XorIsNegP2 || UseCnt >= 2) {
6177 // Build (X^Y) & Z
6178 Op1 = Builder.CreateXor(X, Y);
6179 Op1 = Builder.CreateAnd(Op1, Z);
6180 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6181 }
6182 }
6183 }
6184
6185 {
6186 // Similar to above, but specialized for constant because invert is needed:
6187 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6188 Value *X, *Y;
6189 Constant *C;
6190 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6191 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6192 Value *Xor = Builder.CreateXor(X, Y);
6193 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6194 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6195 }
6196 }
6197
6198 if (match(Op1, m_ZExt(m_Value(A))) &&
6199 (Op0->hasOneUse() || Op1->hasOneUse())) {
6200 // (B & (Pow2C-1)) == zext A --> A == trunc B
6201 // (B & (Pow2C-1)) != zext A --> A != trunc B
6202 const APInt *MaskC;
6203 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6204 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6205 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6206 }
6207
6208 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6209 // For lshr and ashr pairs.
6210 const APInt *AP1, *AP2;
6211 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6212 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6213 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6214 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6215 if (*AP1 != *AP2)
6216 return nullptr;
6217 unsigned TypeBits = AP1->getBitWidth();
6218 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6219 if (ShAmt < TypeBits && ShAmt != 0) {
6220 ICmpInst::Predicate NewPred =
6222 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6223 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6224 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6225 }
6226 }
6227
6228 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6229 ConstantInt *Cst1;
6230 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6231 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6232 unsigned TypeBits = Cst1->getBitWidth();
6233 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6234 if (ShAmt < TypeBits && ShAmt != 0) {
6235 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6236 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6237 Value *And =
6238 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6239 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6240 }
6241 }
6242
6243 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6244 // "icmp (and X, mask), cst"
6245 uint64_t ShAmt = 0;
6246 if (Op0->hasOneUse() &&
6247 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6248 match(Op1, m_ConstantInt(Cst1)) &&
6249 // Only do this when A has multiple uses. This is most important to do
6250 // when it exposes other optimizations.
6251 !A->hasOneUse()) {
6252 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6253
6254 if (ShAmt < ASize) {
6255 APInt MaskV =
6257 MaskV <<= ShAmt;
6258
6259 APInt CmpV = Cst1->getValue().zext(ASize);
6260 CmpV <<= ShAmt;
6261
6262 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6263 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6264 }
6265 }
6266
6268 return ICmp;
6269
6270 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6271 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6272 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6273 // few steps of instcombine.
6274 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6275 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6277 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6278 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6280 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6281 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6283 Add, ConstantInt::get(A->getType(), C.shl(1)));
6284 }
6285
6286 // Canonicalize:
6287 // Assume B_Pow2 != 0
6288 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6289 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6290 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6291 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6292 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6294
6295 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6296 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6297 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6298 ConstantInt::getNullValue(Op1->getType()));
6299
6300 // Canonicalize:
6301 // icmp eq/ne X, OneUse(rotate-right(X))
6302 // -> icmp eq/ne X, rotate-left(X)
6303 // We generally try to convert rotate-right -> rotate-left, this just
6304 // canonicalizes another case.
6305 if (match(&I, m_c_ICmp(m_Value(A),
6307 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6308 return new ICmpInst(
6309 Pred, A,
6310 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6311
6312 // Canonicalize:
6313 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6314 Constant *Cst;
6317 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6318
6319 {
6320 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6321 auto m_Matcher =
6324 m_Sub(m_Value(B), m_Deferred(A)));
6325 std::optional<bool> IsZero = std::nullopt;
6326 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6327 m_Deferred(A))))
6328 IsZero = false;
6329 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6330 else if (match(&I,
6331 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6332 IsZero = true;
6333
6334 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6335 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6336 // -> (icmp eq/ne (and X, P2), 0)
6337 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6338 // -> (icmp eq/ne (and X, P2), P2)
6339 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6340 *IsZero ? A
6341 : ConstantInt::getNullValue(A->getType()));
6342 }
6343
6344 if (auto *Res = foldICmpEqualityWithOffset(
6345 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6346 return Res;
6347
6348 return nullptr;
6349}
6350
6352 ICmpInst::Predicate Pred = ICmp.getPredicate();
6353 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6354
6355 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6356 // The trunc masks high bits while the compare may effectively mask low bits.
6357 Value *X;
6358 const APInt *C;
6359 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6360 return nullptr;
6361
6362 // This matches patterns corresponding to tests of the signbit as well as:
6363 // (trunc X) pred C2 --> (X & Mask) == C
6364 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6365 /*AllowNonZeroC=*/true)) {
6366 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6367 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6368 return new ICmpInst(Res->Pred, And, C);
6369 }
6370
6371 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6372 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6373 if (II->getIntrinsicID() == Intrinsic::cttz ||
6374 II->getIntrinsicID() == Intrinsic::ctlz) {
6375 unsigned MaxRet = SrcBits;
6376 // If the "is_zero_poison" argument is set, then we know at least
6377 // one bit is set in the input, so the result is always at least one
6378 // less than the full bitwidth of that input.
6379 if (match(II->getArgOperand(1), m_One()))
6380 MaxRet--;
6381
6382 // Make sure the destination is wide enough to hold the largest output of
6383 // the intrinsic.
6384 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6385 if (Instruction *I =
6386 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6387 return I;
6388 }
6389 }
6390
6391 return nullptr;
6392}
6393
6395 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6396 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6397 Value *X;
6398 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6399 return nullptr;
6400
6401 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6402 bool IsSignedCmp = ICmp.isSigned();
6403
6404 // icmp Pred (ext X), (ext Y)
6405 Value *Y;
6406 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6407 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6408 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6409
6410 if (IsZext0 != IsZext1) {
6411 // If X and Y and both i1
6412 // (icmp eq/ne (zext X) (sext Y))
6413 // eq -> (icmp eq (or X, Y), 0)
6414 // ne -> (icmp ne (or X, Y), 0)
6415 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6416 Y->getType()->isIntOrIntVectorTy(1))
6417 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6418 Constant::getNullValue(X->getType()));
6419
6420 // If we have mismatched casts and zext has the nneg flag, we can
6421 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6422
6423 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6424 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6425
6426 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6427 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6428
6429 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6430 IsSignedExt = true;
6431 else
6432 return nullptr;
6433 }
6434
6435 // Not an extension from the same type?
6436 Type *XTy = X->getType(), *YTy = Y->getType();
6437 if (XTy != YTy) {
6438 // One of the casts must have one use because we are creating a new cast.
6439 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6440 return nullptr;
6441 // Extend the narrower operand to the type of the wider operand.
6442 CastInst::CastOps CastOpcode =
6443 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6444 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6445 X = Builder.CreateCast(CastOpcode, X, YTy);
6446 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6447 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6448 else
6449 return nullptr;
6450 }
6451
6452 // (zext X) == (zext Y) --> X == Y
6453 // (sext X) == (sext Y) --> X == Y
6454 if (ICmp.isEquality())
6455 return new ICmpInst(ICmp.getPredicate(), X, Y);
6456
6457 // A signed comparison of sign extended values simplifies into a
6458 // signed comparison.
6459 if (IsSignedCmp && IsSignedExt)
6460 return new ICmpInst(ICmp.getPredicate(), X, Y);
6461
6462 // The other three cases all fold into an unsigned comparison.
6463 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6464 }
6465
6466 // Below here, we are only folding a compare with constant.
6467 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6468 if (!C)
6469 return nullptr;
6470
6471 // If a lossless truncate is possible...
6472 Type *SrcTy = CastOp0->getSrcTy();
6473 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6474 if (Res) {
6475 if (ICmp.isEquality())
6476 return new ICmpInst(ICmp.getPredicate(), X, Res);
6477
6478 // A signed comparison of sign extended values simplifies into a
6479 // signed comparison.
6480 if (IsSignedExt && IsSignedCmp)
6481 return new ICmpInst(ICmp.getPredicate(), X, Res);
6482
6483 // The other three cases all fold into an unsigned comparison.
6484 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6485 }
6486
6487 // The re-extended constant changed, partly changed (in the case of a vector),
6488 // or could not be determined to be equal (in the case of a constant
6489 // expression), so the constant cannot be represented in the shorter type.
6490 // All the cases that fold to true or false will have already been handled
6491 // by simplifyICmpInst, so only deal with the tricky case.
6492 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6493 return nullptr;
6494
6495 // Is source op positive?
6496 // icmp ult (sext X), C --> icmp sgt X, -1
6497 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6499
6500 // Is source op negative?
6501 // icmp ugt (sext X), C --> icmp slt X, 0
6502 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6504}
6505
6506/// Handle icmp (cast x), (cast or constant).
6508 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6509 // icmp compares only pointer's value.
6510 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6511 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6512 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6513 if (SimplifiedOp0 || SimplifiedOp1)
6514 return new ICmpInst(ICmp.getPredicate(),
6515 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6516 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6517
6518 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6519 if (!CastOp0)
6520 return nullptr;
6521 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6522 return nullptr;
6523
6524 Value *Op0Src = CastOp0->getOperand(0);
6525 Type *SrcTy = CastOp0->getSrcTy();
6526 Type *DestTy = CastOp0->getDestTy();
6527
6528 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6529 // integer type is the same size as the pointer type.
6530 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6531 if (isa<VectorType>(PtrTy)) {
6532 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6533 IntTy = cast<VectorType>(IntTy)->getElementType();
6534 }
6535 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6536 };
6537 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6538 CompatibleSizes(SrcTy, DestTy)) {
6539 Value *NewOp1 = nullptr;
6540 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6541 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6542 if (PtrSrc->getType() == Op0Src->getType())
6543 NewOp1 = PtrToIntOp1->getOperand(0);
6544 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6545 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6546 }
6547
6548 if (NewOp1)
6549 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6550 }
6551
6552 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6553 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6554 CompatibleSizes(DestTy, SrcTy)) {
6555 Value *NewOp1 = nullptr;
6556 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6557 Value *IntSrc = IntToPtrOp1->getOperand(0);
6558 if (IntSrc->getType() == Op0Src->getType())
6559 NewOp1 = IntToPtrOp1->getOperand(0);
6560 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6561 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6562 }
6563
6564 if (NewOp1)
6565 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6566 }
6567
6568 if (Instruction *R = foldICmpWithTrunc(ICmp))
6569 return R;
6570
6571 return foldICmpWithZextOrSext(ICmp);
6572}
6573
6575 bool IsSigned) {
6576 switch (BinaryOp) {
6577 default:
6578 llvm_unreachable("Unsupported binary op");
6579 case Instruction::Add:
6580 case Instruction::Sub:
6581 return match(RHS, m_Zero());
6582 case Instruction::Mul:
6583 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6584 match(RHS, m_One());
6585 }
6586}
6587
6590 bool IsSigned, Value *LHS, Value *RHS,
6591 Instruction *CxtI) const {
6592 switch (BinaryOp) {
6593 default:
6594 llvm_unreachable("Unsupported binary op");
6595 case Instruction::Add:
6596 if (IsSigned)
6597 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6598 else
6599 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6600 case Instruction::Sub:
6601 if (IsSigned)
6602 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6603 else
6604 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6605 case Instruction::Mul:
6606 if (IsSigned)
6607 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6608 else
6609 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6610 }
6611}
6612
6613bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6614 bool IsSigned, Value *LHS,
6615 Value *RHS, Instruction &OrigI,
6616 Value *&Result,
6617 Constant *&Overflow) {
6618 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6619 std::swap(LHS, RHS);
6620
6621 // If the overflow check was an add followed by a compare, the insertion point
6622 // may be pointing to the compare. We want to insert the new instructions
6623 // before the add in case there are uses of the add between the add and the
6624 // compare.
6625 Builder.SetInsertPoint(&OrigI);
6626
6627 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6628 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6629 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6630
6631 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6632 Result = LHS;
6633 Overflow = ConstantInt::getFalse(OverflowTy);
6634 return true;
6635 }
6636
6637 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6639 return false;
6642 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6643 Result->takeName(&OrigI);
6644 Overflow = ConstantInt::getTrue(OverflowTy);
6645 return true;
6647 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6648 Result->takeName(&OrigI);
6649 Overflow = ConstantInt::getFalse(OverflowTy);
6650 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6651 if (IsSigned)
6652 Inst->setHasNoSignedWrap();
6653 else
6654 Inst->setHasNoUnsignedWrap();
6655 }
6656 return true;
6657 }
6658
6659 llvm_unreachable("Unexpected overflow result");
6660}
6661
6662/// Recognize and process idiom involving test for multiplication
6663/// overflow.
6664///
6665/// The caller has matched a pattern of the form:
6666/// I = cmp u (mul(zext A, zext B), V
6667/// The function checks if this is a test for overflow and if so replaces
6668/// multiplication with call to 'mul.with.overflow' intrinsic.
6669///
6670/// \param I Compare instruction.
6671/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6672/// the compare instruction. Must be of integer type.
6673/// \param OtherVal The other argument of compare instruction.
6674/// \returns Instruction which must replace the compare instruction, NULL if no
6675/// replacement required.
6677 const APInt *OtherVal,
6678 InstCombinerImpl &IC) {
6679 // Don't bother doing this transformation for pointers, don't do it for
6680 // vectors.
6681 if (!isa<IntegerType>(MulVal->getType()))
6682 return nullptr;
6683
6684 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6685 if (!MulInstr)
6686 return nullptr;
6687 assert(MulInstr->getOpcode() == Instruction::Mul);
6688
6689 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6690 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6691 assert(LHS->getOpcode() == Instruction::ZExt);
6692 assert(RHS->getOpcode() == Instruction::ZExt);
6693 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6694
6695 // Calculate type and width of the result produced by mul.with.overflow.
6696 Type *TyA = A->getType(), *TyB = B->getType();
6697 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6698 WidthB = TyB->getPrimitiveSizeInBits();
6699 unsigned MulWidth;
6700 Type *MulType;
6701 if (WidthB > WidthA) {
6702 MulWidth = WidthB;
6703 MulType = TyB;
6704 } else {
6705 MulWidth = WidthA;
6706 MulType = TyA;
6707 }
6708
6709 // In order to replace the original mul with a narrower mul.with.overflow,
6710 // all uses must ignore upper bits of the product. The number of used low
6711 // bits must be not greater than the width of mul.with.overflow.
6712 if (MulVal->hasNUsesOrMore(2))
6713 for (User *U : MulVal->users()) {
6714 if (U == &I)
6715 continue;
6716 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6717 // Check if truncation ignores bits above MulWidth.
6718 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6719 if (TruncWidth > MulWidth)
6720 return nullptr;
6721 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6722 // Check if AND ignores bits above MulWidth.
6723 if (BO->getOpcode() != Instruction::And)
6724 return nullptr;
6725 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6726 const APInt &CVal = CI->getValue();
6727 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6728 return nullptr;
6729 } else {
6730 // In this case we could have the operand of the binary operation
6731 // being defined in another block, and performing the replacement
6732 // could break the dominance relation.
6733 return nullptr;
6734 }
6735 } else {
6736 // Other uses prohibit this transformation.
6737 return nullptr;
6738 }
6739 }
6740
6741 // Recognize patterns
6742 switch (I.getPredicate()) {
6743 case ICmpInst::ICMP_UGT: {
6744 // Recognize pattern:
6745 // mulval = mul(zext A, zext B)
6746 // cmp ugt mulval, max
6747 APInt MaxVal = APInt::getMaxValue(MulWidth);
6748 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6749 if (MaxVal.eq(*OtherVal))
6750 break; // Recognized
6751 return nullptr;
6752 }
6753
6754 case ICmpInst::ICMP_ULT: {
6755 // Recognize pattern:
6756 // mulval = mul(zext A, zext B)
6757 // cmp ule mulval, max + 1
6758 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6759 if (MaxVal.eq(*OtherVal))
6760 break; // Recognized
6761 return nullptr;
6762 }
6763
6764 default:
6765 return nullptr;
6766 }
6767
6768 InstCombiner::BuilderTy &Builder = IC.Builder;
6769 Builder.SetInsertPoint(MulInstr);
6770
6771 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6772 Value *MulA = A, *MulB = B;
6773 if (WidthA < MulWidth)
6774 MulA = Builder.CreateZExt(A, MulType);
6775 if (WidthB < MulWidth)
6776 MulB = Builder.CreateZExt(B, MulType);
6777 Value *Call =
6778 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6779 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6780 IC.addToWorklist(MulInstr);
6781
6782 // If there are uses of mul result other than the comparison, we know that
6783 // they are truncation or binary AND. Change them to use result of
6784 // mul.with.overflow and adjust properly mask/size.
6785 if (MulVal->hasNUsesOrMore(2)) {
6786 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6787 for (User *U : make_early_inc_range(MulVal->users())) {
6788 if (U == &I)
6789 continue;
6790 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6791 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6792 IC.replaceInstUsesWith(*TI, Mul);
6793 else
6794 TI->setOperand(0, Mul);
6795 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6796 assert(BO->getOpcode() == Instruction::And);
6797 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6798 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6799 APInt ShortMask = CI->getValue().trunc(MulWidth);
6800 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6801 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6802 IC.replaceInstUsesWith(*BO, Zext);
6803 } else {
6804 llvm_unreachable("Unexpected Binary operation");
6805 }
6807 }
6808 }
6809
6810 // The original icmp gets replaced with the overflow value, maybe inverted
6811 // depending on predicate.
6812 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6813 Value *Res = Builder.CreateExtractValue(Call, 1);
6814 return BinaryOperator::CreateNot(Res);
6815 }
6816
6817 return ExtractValueInst::Create(Call, 1);
6818}
6819
6820/// When performing a comparison against a constant, it is possible that not all
6821/// the bits in the LHS are demanded. This helper method computes the mask that
6822/// IS demanded.
6824 const APInt *RHS;
6825 if (!match(I.getOperand(1), m_APInt(RHS)))
6827
6828 // If this is a normal comparison, it demands all bits. If it is a sign bit
6829 // comparison, it only demands the sign bit.
6830 bool UnusedBit;
6831 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6833
6834 switch (I.getPredicate()) {
6835 // For a UGT comparison, we don't care about any bits that
6836 // correspond to the trailing ones of the comparand. The value of these
6837 // bits doesn't impact the outcome of the comparison, because any value
6838 // greater than the RHS must differ in a bit higher than these due to carry.
6839 case ICmpInst::ICMP_UGT:
6840 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6841
6842 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6843 // Any value less than the RHS must differ in a higher bit because of carries.
6844 case ICmpInst::ICMP_ULT:
6845 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6846
6847 default:
6849 }
6850}
6851
6852/// Check that one use is in the same block as the definition and all
6853/// other uses are in blocks dominated by a given block.
6854///
6855/// \param DI Definition
6856/// \param UI Use
6857/// \param DB Block that must dominate all uses of \p DI outside
6858/// the parent block
6859/// \return true when \p UI is the only use of \p DI in the parent block
6860/// and all other uses of \p DI are in blocks dominated by \p DB.
6861///
6863 const Instruction *UI,
6864 const BasicBlock *DB) const {
6865 assert(DI && UI && "Instruction not defined\n");
6866 // Ignore incomplete definitions.
6867 if (!DI->getParent())
6868 return false;
6869 // DI and UI must be in the same block.
6870 if (DI->getParent() != UI->getParent())
6871 return false;
6872 // Protect from self-referencing blocks.
6873 if (DI->getParent() == DB)
6874 return false;
6875 for (const User *U : DI->users()) {
6876 auto *Usr = cast<Instruction>(U);
6877 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6878 return false;
6879 }
6880 return true;
6881}
6882
6883/// Return true when the instruction sequence within a block is select-cmp-br.
6885 const BasicBlock *BB = SI->getParent();
6886 if (!BB)
6887 return false;
6889 if (!BI)
6890 return false;
6891 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6892 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6893 return false;
6894 return true;
6895}
6896
6897/// True when a select result is replaced by one of its operands
6898/// in select-icmp sequence. This will eventually result in the elimination
6899/// of the select.
6900///
6901/// \param SI Select instruction
6902/// \param Icmp Compare instruction
6903/// \param SIOpd Operand that replaces the select
6904///
6905/// Notes:
6906/// - The replacement is global and requires dominator information
6907/// - The caller is responsible for the actual replacement
6908///
6909/// Example:
6910///
6911/// entry:
6912/// %4 = select i1 %3, %C* %0, %C* null
6913/// %5 = icmp eq %C* %4, null
6914/// br i1 %5, label %9, label %7
6915/// ...
6916/// ; <label>:7 ; preds = %entry
6917/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6918/// ...
6919///
6920/// can be transformed to
6921///
6922/// %5 = icmp eq %C* %0, null
6923/// %6 = select i1 %3, i1 %5, i1 true
6924/// br i1 %6, label %9, label %7
6925/// ...
6926/// ; <label>:7 ; preds = %entry
6927/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6928///
6929/// Similar when the first operand of the select is a constant or/and
6930/// the compare is for not equal rather than equal.
6931///
6932/// NOTE: The function is only called when the select and compare constants
6933/// are equal, the optimization can work only for EQ predicates. This is not a
6934/// major restriction since a NE compare should be 'normalized' to an equal
6935/// compare, which usually happens in the combiner and test case
6936/// select-cmp-br.ll checks for it.
6938 const ICmpInst *Icmp,
6939 const unsigned SIOpd) {
6940 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6942 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6943 // The check for the single predecessor is not the best that can be
6944 // done. But it protects efficiently against cases like when SI's
6945 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6946 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6947 // replaced can be reached on either path. So the uniqueness check
6948 // guarantees that the path all uses of SI (outside SI's parent) are on
6949 // is disjoint from all other paths out of SI. But that information
6950 // is more expensive to compute, and the trade-off here is in favor
6951 // of compile-time. It should also be noticed that we check for a single
6952 // predecessor and not only uniqueness. This to handle the situation when
6953 // Succ and Succ1 points to the same basic block.
6954 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6955 NumSel++;
6956 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6957 return true;
6958 }
6959 }
6960 return false;
6961}
6962
6963/// Try to fold the comparison based on range information we can get by checking
6964/// whether bits are known to be zero or one in the inputs.
6966 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6967 Type *Ty = Op0->getType();
6968 ICmpInst::Predicate Pred = I.getPredicate();
6969
6970 // Get scalar or pointer size.
6971 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6972 ? Ty->getScalarSizeInBits()
6973 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6974
6975 if (!BitWidth)
6976 return nullptr;
6977
6978 KnownBits Op0Known(BitWidth);
6979 KnownBits Op1Known(BitWidth);
6980
6981 {
6982 // Don't use dominating conditions when folding icmp using known bits. This
6983 // may convert signed into unsigned predicates in ways that other passes
6984 // (especially IndVarSimplify) may not be able to reliably undo.
6985 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6987 Op0Known, Q))
6988 return &I;
6989
6990 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6991 return &I;
6992 }
6993
6994 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6995 return new ICmpInst(
6996 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6997 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6998 return new ICmpInst(
6999 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
7000
7001 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
7002 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
7003
7004 // Given the known and unknown bits, compute a range that the LHS could be
7005 // in. Compute the Min, Max and RHS values based on the known bits. For the
7006 // EQ and NE we use unsigned values.
7007 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
7008 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
7009 if (I.isSigned()) {
7010 Op0Min = Op0Known.getSignedMinValue();
7011 Op0Max = Op0Known.getSignedMaxValue();
7012 Op1Min = Op1Known.getSignedMinValue();
7013 Op1Max = Op1Known.getSignedMaxValue();
7014 } else {
7015 Op0Min = Op0Known.getMinValue();
7016 Op0Max = Op0Known.getMaxValue();
7017 Op1Min = Op1Known.getMinValue();
7018 Op1Max = Op1Known.getMaxValue();
7019 }
7020
7021 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
7022 // min/max canonical compare with some other compare. That could lead to
7023 // conflict with select canonicalization and infinite looping.
7024 // FIXME: This constraint may go away if min/max intrinsics are canonical.
7025 auto isMinMaxCmp = [&](Instruction &Cmp) {
7026 if (!Cmp.hasOneUse())
7027 return false;
7028 Value *A, *B;
7029 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
7031 return false;
7032 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
7033 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
7034 };
7035 if (!isMinMaxCmp(I)) {
7036 switch (Pred) {
7037 default:
7038 break;
7039 case ICmpInst::ICMP_ULT: {
7040 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
7041 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7042 const APInt *CmpC;
7043 if (match(Op1, m_APInt(CmpC))) {
7044 // A <u C -> A == C-1 if min(A)+1 == C
7045 if (*CmpC == Op0Min + 1)
7046 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7047 ConstantInt::get(Op1->getType(), *CmpC - 1));
7048 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7049 // exceeds the log2 of C.
7050 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7051 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7052 Constant::getNullValue(Op1->getType()));
7053 }
7054 break;
7055 }
7056 case ICmpInst::ICMP_UGT: {
7057 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7058 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7059 const APInt *CmpC;
7060 if (match(Op1, m_APInt(CmpC))) {
7061 // A >u C -> A == C+1 if max(a)-1 == C
7062 if (*CmpC == Op0Max - 1)
7063 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7064 ConstantInt::get(Op1->getType(), *CmpC + 1));
7065 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7066 // exceeds the log2 of C.
7067 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7068 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7069 Constant::getNullValue(Op1->getType()));
7070 }
7071 break;
7072 }
7073 case ICmpInst::ICMP_SLT: {
7074 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7075 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7076 const APInt *CmpC;
7077 if (match(Op1, m_APInt(CmpC))) {
7078 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7079 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7080 ConstantInt::get(Op1->getType(), *CmpC - 1));
7081 }
7082 break;
7083 }
7084 case ICmpInst::ICMP_SGT: {
7085 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7086 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7087 const APInt *CmpC;
7088 if (match(Op1, m_APInt(CmpC))) {
7089 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7090 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7091 ConstantInt::get(Op1->getType(), *CmpC + 1));
7092 }
7093 break;
7094 }
7095 }
7096 }
7097
7098 // Based on the range information we know about the LHS, see if we can
7099 // simplify this comparison. For example, (x&4) < 8 is always true.
7100 switch (Pred) {
7101 default:
7102 break;
7103 case ICmpInst::ICMP_EQ:
7104 case ICmpInst::ICMP_NE: {
7105 // If all bits are known zero except for one, then we know at most one bit
7106 // is set. If the comparison is against zero, then this is a check to see if
7107 // *that* bit is set.
7108 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7109 if (Op1Known.isZero()) {
7110 // If the LHS is an AND with the same constant, look through it.
7111 Value *LHS = nullptr;
7112 const APInt *LHSC;
7113 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7114 *LHSC != Op0KnownZeroInverted)
7115 LHS = Op0;
7116
7117 Value *X;
7118 const APInt *C1;
7119 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7120 Type *XTy = X->getType();
7121 unsigned Log2C1 = C1->countr_zero();
7122 APInt C2 = Op0KnownZeroInverted;
7123 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7124 if (C2Pow2.isPowerOf2()) {
7125 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7126 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7127 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7128 unsigned Log2C2 = C2Pow2.countr_zero();
7129 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7130 auto NewPred =
7132 return new ICmpInst(NewPred, X, CmpC);
7133 }
7134 }
7135 }
7136
7137 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7138 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7139 (Op0Known & Op1Known) == Op0Known)
7140 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7141 ConstantInt::getNullValue(Op1->getType()));
7142 break;
7143 }
7144 case ICmpInst::ICMP_SGE:
7145 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7146 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7147 break;
7148 case ICmpInst::ICMP_SLE:
7149 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7150 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7151 break;
7152 case ICmpInst::ICMP_UGE:
7153 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7154 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7155 break;
7156 case ICmpInst::ICMP_ULE:
7157 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7158 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7159 break;
7160 }
7161
7162 // Turn a signed comparison into an unsigned one if both operands are known to
7163 // have the same sign. Set samesign if possible (except for equality
7164 // predicates).
7165 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7166 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7167 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7168 I.setPredicate(I.getUnsignedPredicate());
7169 I.setSameSign();
7170 return &I;
7171 }
7172
7173 return nullptr;
7174}
7175
7176/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7177/// then try to reduce patterns based on that limit.
7179 Value *X, *Y;
7180 CmpPredicate Pred;
7181
7182 // X must be 0 and bool must be true for "ULT":
7183 // X <u (zext i1 Y) --> (X == 0) & Y
7184 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7185 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7186 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7187
7188 // X must be 0 or bool must be true for "ULE":
7189 // X <=u (sext i1 Y) --> (X == 0) | Y
7190 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7191 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7192 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7193
7194 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7195 CmpPredicate Pred1, Pred2;
7196 const APInt *C;
7197 Instruction *ExtI;
7198 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7201 m_APInt(C)))))) &&
7202 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7203 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7204 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7205 auto CreateRangeCheck = [&] {
7206 Value *CmpV1 =
7207 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7208 Value *CmpV2 = Builder.CreateICmp(
7209 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7211 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7212 CmpV1, CmpV2);
7213 };
7214 if (C->isZero()) {
7215 if (Pred2 == ICmpInst::ICMP_EQ) {
7216 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7217 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7218 return replaceInstUsesWith(
7219 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7220 } else if (!IsSExt || HasOneUse) {
7221 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7222 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7223 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7224 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7225 return CreateRangeCheck();
7226 }
7227 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7228 if (Pred2 == ICmpInst::ICMP_NE) {
7229 // icmp eq X, (zext (icmp ne X, 1)) --> false
7230 // icmp ne X, (zext (icmp ne X, 1)) --> true
7231 // icmp eq X, (sext (icmp ne X, -1)) --> false
7232 // icmp ne X, (sext (icmp ne X, -1)) --> true
7233 return replaceInstUsesWith(
7234 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7235 } else if (!IsSExt || HasOneUse) {
7236 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7237 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7238 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7239 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7240 return CreateRangeCheck();
7241 }
7242 } else {
7243 // when C != 0 && C != 1:
7244 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7245 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7246 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7247 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7248 // when C != 0 && C != -1:
7249 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7250 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7251 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7252 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7253 return ICmpInst::Create(
7254 Instruction::ICmp, Pred1, X,
7255 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7256 ? (IsSExt ? -1 : 1)
7257 : 0));
7258 }
7259 }
7260
7261 return nullptr;
7262}
7263
7264/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7265/// it into the appropriate icmp lt or icmp gt instruction. This transform
7266/// allows them to be folded in visitICmpInst.
7268 ICmpInst::Predicate Pred = I.getPredicate();
7269 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7271 return nullptr;
7272
7273 Value *Op0 = I.getOperand(0);
7274 Value *Op1 = I.getOperand(1);
7275 auto *Op1C = dyn_cast<Constant>(Op1);
7276 if (!Op1C)
7277 return nullptr;
7278
7279 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7280 if (!FlippedStrictness)
7281 return nullptr;
7282
7283 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7284}
7285
7286/// If we have a comparison with a non-canonical predicate, if we can update
7287/// all the users, invert the predicate and adjust all the users.
7289 // Is the predicate already canonical?
7290 CmpInst::Predicate Pred = I.getPredicate();
7292 return nullptr;
7293
7294 // Can all users be adjusted to predicate inversion?
7295 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7296 return nullptr;
7297
7298 // Ok, we can canonicalize comparison!
7299 // Let's first invert the comparison's predicate.
7300 I.setPredicate(CmpInst::getInversePredicate(Pred));
7301 I.setName(I.getName() + ".not");
7302
7303 // And, adapt users.
7305
7306 return &I;
7307}
7308
7309/// Integer compare with boolean values can always be turned into bitwise ops.
7311 InstCombiner::BuilderTy &Builder) {
7312 Value *A = I.getOperand(0), *B = I.getOperand(1);
7313 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7314
7315 // A boolean compared to true/false can be simplified to Op0/true/false in
7316 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7317 // Cases not handled by InstSimplify are always 'not' of Op0.
7318 if (match(B, m_Zero())) {
7319 switch (I.getPredicate()) {
7320 case CmpInst::ICMP_EQ: // A == 0 -> !A
7321 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7322 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7324 default:
7325 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7326 }
7327 } else if (match(B, m_One())) {
7328 switch (I.getPredicate()) {
7329 case CmpInst::ICMP_NE: // A != 1 -> !A
7330 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7331 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7333 default:
7334 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7335 }
7336 }
7337
7338 switch (I.getPredicate()) {
7339 default:
7340 llvm_unreachable("Invalid icmp instruction!");
7341 case ICmpInst::ICMP_EQ:
7342 // icmp eq i1 A, B -> ~(A ^ B)
7343 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7344
7345 case ICmpInst::ICMP_NE:
7346 // icmp ne i1 A, B -> A ^ B
7347 return BinaryOperator::CreateXor(A, B);
7348
7349 case ICmpInst::ICMP_UGT:
7350 // icmp ugt -> icmp ult
7351 std::swap(A, B);
7352 [[fallthrough]];
7353 case ICmpInst::ICMP_ULT:
7354 // icmp ult i1 A, B -> ~A & B
7355 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7356
7357 case ICmpInst::ICMP_SGT:
7358 // icmp sgt -> icmp slt
7359 std::swap(A, B);
7360 [[fallthrough]];
7361 case ICmpInst::ICMP_SLT:
7362 // icmp slt i1 A, B -> A & ~B
7363 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7364
7365 case ICmpInst::ICMP_UGE:
7366 // icmp uge -> icmp ule
7367 std::swap(A, B);
7368 [[fallthrough]];
7369 case ICmpInst::ICMP_ULE:
7370 // icmp ule i1 A, B -> ~A | B
7371 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7372
7373 case ICmpInst::ICMP_SGE:
7374 // icmp sge -> icmp sle
7375 std::swap(A, B);
7376 [[fallthrough]];
7377 case ICmpInst::ICMP_SLE:
7378 // icmp sle i1 A, B -> A | ~B
7379 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7380 }
7381}
7382
7383// Transform pattern like:
7384// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7385// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7386// Into:
7387// (X l>> Y) != 0
7388// (X l>> Y) == 0
7390 InstCombiner::BuilderTy &Builder) {
7391 CmpPredicate Pred, NewPred;
7392 Value *X, *Y;
7393 if (match(&Cmp,
7394 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7395 switch (Pred) {
7396 case ICmpInst::ICMP_ULE:
7397 NewPred = ICmpInst::ICMP_NE;
7398 break;
7399 case ICmpInst::ICMP_UGT:
7400 NewPred = ICmpInst::ICMP_EQ;
7401 break;
7402 default:
7403 return nullptr;
7404 }
7405 } else if (match(&Cmp, m_c_ICmp(Pred,
7408 m_Add(m_Shl(m_One(), m_Value(Y)),
7409 m_AllOnes()))),
7410 m_Value(X)))) {
7411 // The variant with 'add' is not canonical, (the variant with 'not' is)
7412 // we only get it because it has extra uses, and can't be canonicalized,
7413
7414 switch (Pred) {
7415 case ICmpInst::ICMP_ULT:
7416 NewPred = ICmpInst::ICMP_NE;
7417 break;
7418 case ICmpInst::ICMP_UGE:
7419 NewPred = ICmpInst::ICMP_EQ;
7420 break;
7421 default:
7422 return nullptr;
7423 }
7424 } else
7425 return nullptr;
7426
7427 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7428 Constant *Zero = Constant::getNullValue(NewX->getType());
7429 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7430}
7431
7433 InstCombiner::BuilderTy &Builder) {
7434 const CmpInst::Predicate Pred = Cmp.getPredicate();
7435 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7436 Value *V1, *V2;
7437
7438 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7439 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7440 if (auto *I = dyn_cast<Instruction>(V))
7441 I->copyIRFlags(&Cmp);
7442 Module *M = Cmp.getModule();
7444 M, Intrinsic::vector_reverse, V->getType());
7445 return CallInst::Create(F, V);
7446 };
7447
7448 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7449 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7450 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7451 (LHS->hasOneUse() || RHS->hasOneUse()))
7452 return createCmpReverse(Pred, V1, V2);
7453
7454 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7455 if (LHS->hasOneUse() && isSplatValue(RHS))
7456 return createCmpReverse(Pred, V1, RHS);
7457 }
7458 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7459 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7460 return createCmpReverse(Pred, LHS, V2);
7461
7462 ArrayRef<int> M;
7463 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7464 return nullptr;
7465
7466 // If both arguments of the cmp are shuffles that use the same mask and
7467 // shuffle within a single vector, move the shuffle after the cmp:
7468 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7469 Type *V1Ty = V1->getType();
7470 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7471 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7472 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7473 return new ShuffleVectorInst(NewCmp, M);
7474 }
7475
7476 // Try to canonicalize compare with splatted operand and splat constant.
7477 // TODO: We could generalize this for more than splats. See/use the code in
7478 // InstCombiner::foldVectorBinop().
7479 Constant *C;
7480 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7481 return nullptr;
7482
7483 // Length-changing splats are ok, so adjust the constants as needed:
7484 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7485 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7486 int MaskSplatIndex;
7487 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7488 // We allow poison in matching, but this transform removes it for safety.
7489 // Demanded elements analysis should be able to recover some/all of that.
7490 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7491 ScalarC);
7492 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7493 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7494 return new ShuffleVectorInst(NewCmp, NewM);
7495 }
7496
7497 return nullptr;
7498}
7499
7500// extract(uadd.with.overflow(A, B), 0) ult A
7501// -> extract(uadd.with.overflow(A, B), 1)
7503 CmpInst::Predicate Pred = I.getPredicate();
7504 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7505
7506 Value *UAddOv;
7507 Value *A, *B;
7508 auto UAddOvResultPat = m_ExtractValue<0>(
7510 if (match(Op0, UAddOvResultPat) &&
7511 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7512 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7513 (match(A, m_One()) || match(B, m_One()))) ||
7514 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7515 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7516 // extract(uadd.with.overflow(A, B), 0) < A
7517 // extract(uadd.with.overflow(A, 1), 0) == 0
7518 // extract(uadd.with.overflow(A, -1), 0) != -1
7519 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7520 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7521 (Op0 == A || Op0 == B))
7522 // A > extract(uadd.with.overflow(A, B), 0)
7523 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7524 else
7525 return nullptr;
7526
7527 return ExtractValueInst::Create(UAddOv, 1);
7528}
7529
7531 if (!I.getOperand(0)->getType()->isPointerTy() ||
7533 I.getParent()->getParent(),
7534 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7535 return nullptr;
7536 }
7537 Instruction *Op;
7538 if (match(I.getOperand(0), m_Instruction(Op)) &&
7539 match(I.getOperand(1), m_Zero()) &&
7540 Op->isLaunderOrStripInvariantGroup()) {
7541 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7542 Op->getOperand(0), I.getOperand(1));
7543 }
7544 return nullptr;
7545}
7546
7548 IRBuilderBase &Builder) {
7549 if (!ICmpInst::isEquality(I.getPredicate()))
7550 return nullptr;
7551
7552 // The caller puts constants after non-constants.
7553 Value *Op = I.getOperand(0);
7554 Value *Const = I.getOperand(1);
7555
7556 // For Cond an equality condition, fold
7557 //
7558 // icmp (eq|ne) (vreduce_(or|and) Op), (Zero|AllOnes) ->
7559 // icmp (eq|ne) Op, (Zero|AllOnes)
7560 //
7561 // with a bitcast.
7562 Value *Vec;
7563 if ((match(Const, m_ZeroInt()) &&
7565 m_Value(Vec))))) ||
7566 (match(Const, m_AllOnes()) &&
7568 m_Value(Vec)))))) {
7569 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
7570 if (!VecTy)
7571 return nullptr;
7572 Type *VecEltTy = VecTy->getElementType();
7573 unsigned ScalarBW =
7574 DL.getTypeSizeInBits(VecEltTy) * VecTy->getNumElements();
7575 if (!DL.fitsInLegalInteger(ScalarBW))
7576 return nullptr;
7577 Type *ScalarTy = IntegerType::get(I.getContext(), ScalarBW);
7578 Value *NewConst = match(Const, m_ZeroInt())
7579 ? ConstantInt::get(ScalarTy, 0)
7580 : ConstantInt::getAllOnesValue(ScalarTy);
7581 return CmpInst::Create(Instruction::ICmp, I.getPredicate(),
7582 Builder.CreateBitCast(Vec, ScalarTy), NewConst);
7583 }
7584 return nullptr;
7585}
7586
7587/// This function folds patterns produced by lowering of reduce idioms, such as
7588/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7589/// attempts to generate fewer number of scalar comparisons instead of vector
7590/// comparisons when possible.
7592 InstCombiner::BuilderTy &Builder,
7593 const DataLayout &DL) {
7594 if (I.getType()->isVectorTy())
7595 return nullptr;
7596 CmpPredicate OuterPred, InnerPred;
7597 Value *LHS, *RHS;
7598
7599 // Match lowering of @llvm.vector.reduce.and. Turn
7600 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7601 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7602 /// %res = icmp <pred> i8 %scalar_ne, 0
7603 ///
7604 /// into
7605 ///
7606 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7607 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7608 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7609 ///
7610 /// for <pred> in {ne, eq}.
7611 if (!match(&I, m_ICmp(OuterPred,
7613 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7614 m_Zero())))
7615 return nullptr;
7616 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7617 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7618 return nullptr;
7619 unsigned NumBits =
7620 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7621 // TODO: Relax this to "not wider than max legal integer type"?
7622 if (!DL.isLegalInteger(NumBits))
7623 return nullptr;
7624
7625 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7626 auto *ScalarTy = Builder.getIntNTy(NumBits);
7627 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7628 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7629 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7630 I.getName());
7631 }
7632
7633 return nullptr;
7634}
7635
7636// This helper will be called with icmp operands in both orders.
7638 Value *Op0, Value *Op1,
7639 ICmpInst &CxtI) {
7640 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7641 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7642 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7643 return NI;
7644
7645 if (auto *SI = dyn_cast<SelectInst>(Op0))
7646 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7647 return NI;
7648
7649 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7650 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7651 return Res;
7652
7653 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7654 return Res;
7655 }
7656
7657 {
7658 Value *X;
7659 const APInt *C;
7660 // icmp X+Cst, X
7661 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7662 return foldICmpAddOpConst(X, *C, Pred);
7663 }
7664
7665 // abs(X) >= X --> true
7666 // abs(X) u<= X --> true
7667 // abs(X) < X --> false
7668 // abs(X) u> X --> false
7669 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7670 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7671 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7672 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7673 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7674 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7675 {
7676 Value *X;
7677 Constant *C;
7679 match(Op1, m_Specific(X))) {
7680 Value *NullValue = Constant::getNullValue(X->getType());
7681 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7682 const APInt SMin =
7683 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7684 bool IsIntMinPosion = C->isAllOnesValue();
7685 switch (Pred) {
7686 case CmpInst::ICMP_ULE:
7687 case CmpInst::ICMP_SGE:
7688 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7689 case CmpInst::ICMP_UGT:
7690 case CmpInst::ICMP_SLT:
7692 case CmpInst::ICMP_UGE:
7693 case CmpInst::ICMP_SLE:
7694 case CmpInst::ICMP_EQ: {
7695 return replaceInstUsesWith(
7696 CxtI, IsIntMinPosion
7697 ? Builder.CreateICmpSGT(X, AllOnesValue)
7698 : Builder.CreateICmpULT(
7699 X, ConstantInt::get(X->getType(), SMin + 1)));
7700 }
7701 case CmpInst::ICMP_ULT:
7702 case CmpInst::ICMP_SGT:
7703 case CmpInst::ICMP_NE: {
7704 return replaceInstUsesWith(
7705 CxtI, IsIntMinPosion
7706 ? Builder.CreateICmpSLT(X, NullValue)
7707 : Builder.CreateICmpUGT(
7708 X, ConstantInt::get(X->getType(), SMin)));
7709 }
7710 default:
7711 llvm_unreachable("Invalid predicate!");
7712 }
7713 }
7714 }
7715
7716 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7717 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7718 return replaceInstUsesWith(CxtI, V);
7719
7720 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7721 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7722 {
7723 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7724 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7726 }
7727
7728 if (!ICmpInst::isUnsigned(Pred) &&
7729 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7730 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7732 }
7733 }
7734
7735 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7736 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7737 {
7738 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7739 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7741 }
7742
7743 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7744 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7745 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7747 }
7748 }
7749
7750 // icmp (shl nsw/nuw X, L), (add nsw/nuw (shl nsw/nuw Y, L), K)
7751 // -> icmp X, (add nsw/nuw Y, K >> L)
7752 // We use AShr for nsw and LShr for nuw to safely peel off the shift.
7753 Value *X;
7754 uint64_t ShAmt;
7755 if (match(Op0, m_NUWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7756 !CxtI.isSigned()) {
7757 if (ShAmt >= X->getType()->getScalarSizeInBits())
7758 return nullptr;
7759 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7760 ShiftSemantics::Unsigned, &CxtI)) {
7761 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7763 return new ICmpInst(Pred, X, NewOp1);
7764 }
7765 }
7766
7767 if (match(Op0, m_NSWShl(m_Value(X), m_ConstantInt(ShAmt))) &&
7768 !CxtI.isUnsigned()) {
7769 if (ShAmt >= X->getType()->getScalarSizeInBits())
7770 return nullptr;
7771 if (canEvaluateShifted(Op1, ShAmt, /*IsLeftShift=*/false,
7772 ShiftSemantics::Signed, &CxtI)) {
7773 Value *NewOp1 = getShiftedValue(Op1, ShAmt, /*IsLeftShift=*/false,
7775 return new ICmpInst(Pred, X, NewOp1);
7776 }
7777 }
7778 return nullptr;
7779}
7780
7782 bool Changed = false;
7783 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7784 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7785 unsigned Op0Cplxity = getComplexity(Op0);
7786 unsigned Op1Cplxity = getComplexity(Op1);
7787
7788 /// Orders the operands of the compare so that they are listed from most
7789 /// complex to least complex. This puts constants before unary operators,
7790 /// before binary operators.
7791 if (Op0Cplxity < Op1Cplxity) {
7792 I.swapOperands();
7793 std::swap(Op0, Op1);
7794 Changed = true;
7795 }
7796
7797 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7798 return replaceInstUsesWith(I, V);
7799
7800 // Comparing -val or val with non-zero is the same as just comparing val
7801 // ie, abs(val) != 0 -> val != 0
7802 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7803 Value *Cond, *SelectTrue, *SelectFalse;
7804 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7805 m_Value(SelectFalse)))) {
7806 if (Value *V = dyn_castNegVal(SelectTrue)) {
7807 if (V == SelectFalse)
7808 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7809 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7810 if (V == SelectTrue)
7811 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7812 }
7813 }
7814 }
7815
7817 return Res;
7818
7819 if (Op0->getType()->isIntOrIntVectorTy(1))
7821 return Res;
7822
7824 return Res;
7825
7827 return Res;
7828
7830 return Res;
7831
7833 return Res;
7834
7836 return Res;
7837
7839 return Res;
7840
7842 return Res;
7843
7844 // Test if the ICmpInst instruction is used exclusively by a select as
7845 // part of a minimum or maximum operation. If so, refrain from doing
7846 // any other folding. This helps out other analyses which understand
7847 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7848 // and CodeGen. And in this case, at least one of the comparison
7849 // operands has at least one user besides the compare (the select),
7850 // which would often largely negate the benefit of folding anyway.
7851 //
7852 // Do the same for the other patterns recognized by matchSelectPattern.
7853 if (I.hasOneUse())
7854 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7855 Value *A, *B;
7857 if (SPR.Flavor != SPF_UNKNOWN)
7858 return nullptr;
7859 }
7860
7861 // Do this after checking for min/max to prevent infinite looping.
7862 if (Instruction *Res = foldICmpWithZero(I))
7863 return Res;
7864
7865 Value *X;
7866 const APInt *C;
7867 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
7868 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7869 match(Op1, m_Not(m_Specific(X)))) {
7870 if (C->isNonNegative())
7871 return new ICmpInst(ICmpInst::ICMP_SLT, X,
7872 Constant::getNullValue(X->getType()));
7873 return new ICmpInst(ICmpInst::ICMP_UGT, X,
7874 ConstantInt::get(X->getType(), ~*C));
7875 }
7876
7877 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
7878 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7879 match(Op1, m_Not(m_Specific(X)))) {
7880 if (C->isNonNegative())
7881 return new ICmpInst(ICmpInst::ICMP_SGT, X,
7882 Constant::getAllOnesValue(X->getType()));
7883 return new ICmpInst(ICmpInst::ICMP_ULT, X,
7884 ConstantInt::get(X->getType(), ~*C));
7885 }
7886
7887 // FIXME: We only do this after checking for min/max to prevent infinite
7888 // looping caused by a reverse canonicalization of these patterns for min/max.
7889 // FIXME: The organization of folds is a mess. These would naturally go into
7890 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7891 // down here after the min/max restriction.
7892 ICmpInst::Predicate Pred = I.getPredicate();
7893 if (match(Op1, m_APInt(C))) {
7894 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7895 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7896 Constant *Zero = Constant::getNullValue(Op0->getType());
7897 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7898 }
7899
7900 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7901 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7903 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7904 }
7905 }
7906
7907 // The folds in here may rely on wrapping flags and special constants, so
7908 // they can break up min/max idioms in some cases but not seemingly similar
7909 // patterns.
7910 // FIXME: It may be possible to enhance select folding to make this
7911 // unnecessary. It may also be moot if we canonicalize to min/max
7912 // intrinsics.
7913 if (Instruction *Res = foldICmpBinOp(I, Q))
7914 return Res;
7915
7917 return Res;
7918
7919 // Try to match comparison as a sign bit test. Intentionally do this after
7920 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7921 if (Instruction *New = foldSignBitTest(I))
7922 return New;
7923
7924 if (auto *PN = dyn_cast<PHINode>(Op0))
7925 if (Instruction *NV = foldOpIntoPhi(I, PN))
7926 return NV;
7927 if (auto *PN = dyn_cast<PHINode>(Op1))
7928 if (Instruction *NV = foldOpIntoPhi(I, PN))
7929 return NV;
7930
7932 return Res;
7933
7934 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7935 return Res;
7936 if (Instruction *Res =
7937 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7938 return Res;
7939
7940 if (I.isCommutative()) {
7941 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7942 replaceOperand(I, 0, Pair->first);
7943 replaceOperand(I, 1, Pair->second);
7944 return &I;
7945 }
7946 }
7947
7948 // Fold icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
7949 // when all select arms are constants, via truth table.
7951 return R;
7952
7953 // In case of a comparison with two select instructions having the same
7954 // condition, check whether one of the resulting branches can be simplified.
7955 // If so, just compare the other branch and select the appropriate result.
7956 // For example:
7957 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7958 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7959 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7960 // The icmp will result false for the false value of selects and the result
7961 // will depend upon the comparison of true values of selects if %cmp is
7962 // true. Thus, transform this into:
7963 // %cmp = icmp slt i32 %y, %z
7964 // %sel = select i1 %cond, i1 %cmp, i1 false
7965 // This handles similar cases to transform.
7966 {
7967 Value *Cond, *A, *B, *C, *D;
7968 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7970 (Op0->hasOneUse() || Op1->hasOneUse())) {
7971 // Check whether comparison of TrueValues can be simplified
7972 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7973 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7974 return SelectInst::Create(
7975 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7977 }
7978 // Check whether comparison of FalseValues can be simplified
7979 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7980 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7981 return SelectInst::Create(
7982 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7984 }
7985 }
7986 }
7987
7988 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7989 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7990 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7991 {
7992 Value *A, *B;
7993 CmpPredicate CmpPred;
7994 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7996 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7997 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7998 bool I0NUW = I0->hasNoUnsignedWrap();
7999 bool I1NUW = I1->hasNoUnsignedWrap();
8000 bool I0NSW = I0->hasNoSignedWrap();
8001 bool I1NSW = I1->hasNoSignedWrap();
8002 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
8003 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
8004 (ICmpInst::isEquality(Pred) &&
8005 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
8006 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
8007 ConstantInt::get(Op0->getType(), 0));
8008 }
8009 }
8010 }
8011
8012 // Try to optimize equality comparisons against alloca-based pointers.
8013 if (Op0->getType()->isPointerTy() && I.isEquality()) {
8014 assert(Op1->getType()->isPointerTy() &&
8015 "Comparing pointer with non-pointer?");
8016 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
8017 if (foldAllocaCmp(Alloca))
8018 return nullptr;
8019 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
8020 if (foldAllocaCmp(Alloca))
8021 return nullptr;
8022 }
8023
8024 if (Instruction *Res = foldICmpBitCast(I))
8025 return Res;
8026
8027 // TODO: Hoist this above the min/max bailout.
8029 return R;
8030
8031 {
8032 Value *X, *Y;
8033 // Transform (X & ~Y) == 0 --> (X & Y) != 0
8034 // and (X & ~Y) != 0 --> (X & Y) == 0
8035 // if A is a power of 2.
8036 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
8037 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
8038 I.isEquality())
8039 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
8040 Op1);
8041
8042 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
8043 if (Op0->getType()->isIntOrIntVectorTy()) {
8044 bool ConsumesOp0, ConsumesOp1;
8045 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
8046 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
8047 (ConsumesOp0 || ConsumesOp1)) {
8048 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
8049 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
8050 assert(InvOp0 && InvOp1 &&
8051 "Mismatch between isFreeToInvert and getFreelyInverted");
8052 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
8053 }
8054 }
8055
8056 Instruction *AddI = nullptr;
8058 m_Instruction(AddI))) &&
8059 isa<IntegerType>(X->getType())) {
8060 Value *Result;
8061 Constant *Overflow;
8062 // m_UAddWithOverflow can match patterns that do not include an explicit
8063 // "add" instruction, so check the opcode of the matched op.
8064 if (AddI->getOpcode() == Instruction::Add &&
8065 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
8066 Result, Overflow)) {
8067 replaceInstUsesWith(*AddI, Result);
8068 eraseInstFromFunction(*AddI);
8069 return replaceInstUsesWith(I, Overflow);
8070 }
8071 }
8072
8073 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
8074 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
8075 match(Op1, m_APInt(C))) {
8076 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
8077 return R;
8078 }
8079
8080 // Signbit test folds
8081 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
8082 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
8083 Instruction *ExtI;
8084 if ((I.isUnsigned() || I.isEquality()) &&
8085 match(Op1,
8087 Y->getType()->getScalarSizeInBits() == 1 &&
8088 (Op0->hasOneUse() || Op1->hasOneUse())) {
8089 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
8090 Instruction *ShiftI;
8091 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
8093 OpWidth - 1))))) {
8094 unsigned ExtOpc = ExtI->getOpcode();
8095 unsigned ShiftOpc = ShiftI->getOpcode();
8096 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
8097 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
8098 Value *SLTZero =
8099 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
8100 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
8101 return replaceInstUsesWith(I, Cmp);
8102 }
8103 }
8104 }
8105 }
8106
8107 if (Instruction *Res = foldICmpEquality(I))
8108 return Res;
8109
8111 return Res;
8112
8113 if (Instruction *Res = foldICmpOfUAddOv(I))
8114 return Res;
8115
8117 return Res;
8118
8119 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8120 // an i1 which indicates whether or not we successfully did the swap.
8121 //
8122 // Replace comparisons between the old value and the expected value with the
8123 // indicator that 'cmpxchg' returns.
8124 //
8125 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8126 // spuriously fail. In those cases, the old value may equal the expected
8127 // value but it is possible for the swap to not occur.
8128 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8129 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8130 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8131 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8132 !ACXI->isWeak())
8133 return ExtractValueInst::Create(ACXI, 1);
8134
8136 return Res;
8137
8138 if (I.getType()->isVectorTy())
8139 if (Instruction *Res = foldVectorCmp(I, Builder))
8140 return Res;
8141
8143 return Res;
8144
8146 return Res;
8147
8148 {
8149 Value *A;
8150 const APInt *C1, *C2;
8151 ICmpInst::Predicate Pred = I.getPredicate();
8152 if (ICmpInst::isEquality(Pred)) {
8153 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8154 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8155 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8156 match(Op1, m_APInt(C2))) {
8157 Type *InputTy = A->getType();
8158 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8159 // c2 must be non-negative at the bitwidth of a.
8160 if (C2->getActiveBits() < InputBitWidth) {
8161 APInt TruncC1 = C1->trunc(InputBitWidth);
8162 // Check if there are 1s in C1 high bits of size InputBitWidth.
8163 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8164 TruncC1.setBit(InputBitWidth - 1);
8165 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8166 return new ICmpInst(
8167 Pred, AndInst,
8168 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8169 }
8170 }
8171 }
8172 }
8173
8174 return Changed ? &I : nullptr;
8175}
8176
8177/// Fold fcmp ([us]itofp x, cst) if possible.
8179 Instruction *LHSI,
8180 Constant *RHSC) {
8181 const APFloat *RHS;
8182 if (!match(RHSC, m_APFloat(RHS)))
8183 return nullptr;
8184
8185 // Get the width of the mantissa. We don't want to hack on conversions that
8186 // might lose information from the integer, e.g. "i64 -> float"
8187 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8188 if (MantissaWidth == -1)
8189 return nullptr; // Unknown.
8190
8191 Type *IntTy = LHSI->getOperand(0)->getType();
8192 unsigned IntWidth = IntTy->getScalarSizeInBits();
8193 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8194
8195 if (I.isEquality()) {
8196 FCmpInst::Predicate P = I.getPredicate();
8197 bool IsExact = false;
8198 APSInt RHSCvt(IntWidth, LHSUnsigned);
8199 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8200
8201 // If the floating point constant isn't an integer value, we know if we will
8202 // ever compare equal / not equal to it.
8203 if (!IsExact) {
8204 // TODO: Can never be -0.0 and other non-representable values
8205 APFloat RHSRoundInt(*RHS);
8207 if (*RHS != RHSRoundInt) {
8209 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8210
8212 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8213 }
8214 }
8215
8216 // TODO: If the constant is exactly representable, is it always OK to do
8217 // equality compares as integer?
8218 }
8219
8220 // Check to see that the input is converted from an integer type that is small
8221 // enough that preserves all bits. TODO: check here for "known" sign bits.
8222 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8223
8224 // Following test does NOT adjust IntWidth downwards for signed inputs,
8225 // because the most negative value still requires all the mantissa bits
8226 // to distinguish it from one less than that value.
8227 if ((int)IntWidth > MantissaWidth) {
8228 // Conversion would lose accuracy. Check if loss can impact comparison.
8229 int Exp = ilogb(*RHS);
8230 if (Exp == APFloat::IEK_Inf) {
8231 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8232 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8233 // Conversion could create infinity.
8234 return nullptr;
8235 } else {
8236 // Note that if RHS is zero or NaN, then Exp is negative
8237 // and first condition is trivially false.
8238 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8239 // Conversion could affect comparison.
8240 return nullptr;
8241 }
8242 }
8243
8244 // Otherwise, we can potentially simplify the comparison. We know that it
8245 // will always come through as an integer value and we know the constant is
8246 // not a NAN (it would have been previously simplified).
8247 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8248
8250 switch (I.getPredicate()) {
8251 default:
8252 llvm_unreachable("Unexpected predicate!");
8253 case FCmpInst::FCMP_UEQ:
8254 case FCmpInst::FCMP_OEQ:
8255 Pred = ICmpInst::ICMP_EQ;
8256 break;
8257 case FCmpInst::FCMP_UGT:
8258 case FCmpInst::FCMP_OGT:
8259 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8260 break;
8261 case FCmpInst::FCMP_UGE:
8262 case FCmpInst::FCMP_OGE:
8263 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8264 break;
8265 case FCmpInst::FCMP_ULT:
8266 case FCmpInst::FCMP_OLT:
8267 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8268 break;
8269 case FCmpInst::FCMP_ULE:
8270 case FCmpInst::FCMP_OLE:
8271 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8272 break;
8273 case FCmpInst::FCMP_UNE:
8274 case FCmpInst::FCMP_ONE:
8275 Pred = ICmpInst::ICMP_NE;
8276 break;
8277 case FCmpInst::FCMP_ORD:
8278 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8279 case FCmpInst::FCMP_UNO:
8280 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8281 }
8282
8283 // Now we know that the APFloat is a normal number, zero or inf.
8284
8285 // See if the FP constant is too large for the integer. For example,
8286 // comparing an i8 to 300.0.
8287 if (!LHSUnsigned) {
8288 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8289 // and large values.
8290 APFloat SMax(RHS->getSemantics());
8291 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8293 if (SMax < *RHS) { // smax < 13123.0
8294 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8295 Pred == ICmpInst::ICMP_SLE)
8296 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8297 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8298 }
8299 } else {
8300 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8301 // +INF and large values.
8302 APFloat UMax(RHS->getSemantics());
8303 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8305 if (UMax < *RHS) { // umax < 13123.0
8306 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8307 Pred == ICmpInst::ICMP_ULE)
8308 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8309 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8310 }
8311 }
8312
8313 if (!LHSUnsigned) {
8314 // See if the RHS value is < SignedMin.
8315 APFloat SMin(RHS->getSemantics());
8316 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8318 if (SMin > *RHS) { // smin > 12312.0
8319 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8320 Pred == ICmpInst::ICMP_SGE)
8321 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8322 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8323 }
8324 } else {
8325 // See if the RHS value is < UnsignedMin.
8326 APFloat UMin(RHS->getSemantics());
8327 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8329 if (UMin > *RHS) { // umin > 12312.0
8330 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8331 Pred == ICmpInst::ICMP_UGE)
8332 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8333 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8334 }
8335 }
8336
8337 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8338 // [0, UMAX], but it may still be fractional. Check whether this is the case
8339 // using the IsExact flag.
8340 // Don't do this for zero, because -0.0 is not fractional.
8341 APSInt RHSInt(IntWidth, LHSUnsigned);
8342 bool IsExact;
8343 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8344 if (!RHS->isZero()) {
8345 if (!IsExact) {
8346 // If we had a comparison against a fractional value, we have to adjust
8347 // the compare predicate and sometimes the value. RHSC is rounded towards
8348 // zero at this point.
8349 switch (Pred) {
8350 default:
8351 llvm_unreachable("Unexpected integer comparison!");
8352 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8353 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8354 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8355 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8356 case ICmpInst::ICMP_ULE:
8357 // (float)int <= 4.4 --> int <= 4
8358 // (float)int <= -4.4 --> false
8359 if (RHS->isNegative())
8360 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8361 break;
8362 case ICmpInst::ICMP_SLE:
8363 // (float)int <= 4.4 --> int <= 4
8364 // (float)int <= -4.4 --> int < -4
8365 if (RHS->isNegative())
8366 Pred = ICmpInst::ICMP_SLT;
8367 break;
8368 case ICmpInst::ICMP_ULT:
8369 // (float)int < -4.4 --> false
8370 // (float)int < 4.4 --> int <= 4
8371 if (RHS->isNegative())
8372 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8373 Pred = ICmpInst::ICMP_ULE;
8374 break;
8375 case ICmpInst::ICMP_SLT:
8376 // (float)int < -4.4 --> int < -4
8377 // (float)int < 4.4 --> int <= 4
8378 if (!RHS->isNegative())
8379 Pred = ICmpInst::ICMP_SLE;
8380 break;
8381 case ICmpInst::ICMP_UGT:
8382 // (float)int > 4.4 --> int > 4
8383 // (float)int > -4.4 --> true
8384 if (RHS->isNegative())
8385 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8386 break;
8387 case ICmpInst::ICMP_SGT:
8388 // (float)int > 4.4 --> int > 4
8389 // (float)int > -4.4 --> int >= -4
8390 if (RHS->isNegative())
8391 Pred = ICmpInst::ICMP_SGE;
8392 break;
8393 case ICmpInst::ICMP_UGE:
8394 // (float)int >= -4.4 --> true
8395 // (float)int >= 4.4 --> int > 4
8396 if (RHS->isNegative())
8397 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8398 Pred = ICmpInst::ICMP_UGT;
8399 break;
8400 case ICmpInst::ICMP_SGE:
8401 // (float)int >= -4.4 --> int >= -4
8402 // (float)int >= 4.4 --> int > 4
8403 if (!RHS->isNegative())
8404 Pred = ICmpInst::ICMP_SGT;
8405 break;
8406 }
8407 }
8408 }
8409
8410 // Lower this FP comparison into an appropriate integer version of the
8411 // comparison.
8412 return new ICmpInst(Pred, LHSI->getOperand(0),
8413 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8414}
8415
8416/// Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8417/// where all true/false values are constants that allow the compare to be
8418/// constant-folded for every combination of C1 and C2.
8419/// We compute a 4-entry truth table and use createLogicFromTable to
8420/// synthesize a boolean expression of C1 and C2.
8422 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8423 Value *C1, *C2;
8424 Constant *TV1, *FV1, *TV2, *FV2;
8425
8426 if (!match(Op0, m_Select(m_Value(C1), m_Constant(TV1), m_Constant(FV1))) ||
8427 !match(Op1, m_Select(m_Value(C2), m_Constant(TV2), m_Constant(FV2))))
8428 return nullptr;
8429
8430 if (I.getType() != C1->getType() || I.getType() != C2->getType())
8431 return nullptr;
8432
8433 unsigned Pred = I.getPredicate();
8434 const DataLayout &DL = I.getDataLayout();
8435
8436 Constant *Res00 = ConstantFoldCompareInstOperands(Pred, FV1, FV2, DL);
8437 Constant *Res01 = ConstantFoldCompareInstOperands(Pred, FV1, TV2, DL);
8438 Constant *Res10 = ConstantFoldCompareInstOperands(Pred, TV1, FV2, DL);
8439 Constant *Res11 = ConstantFoldCompareInstOperands(Pred, TV1, TV2, DL);
8440
8441 if (!Res00 || !Res01 || !Res10 || !Res11)
8442 return nullptr;
8443
8444 if ((!Res00->isNullValue() && !Res00->isAllOnesValue()) ||
8445 (!Res01->isNullValue() && !Res01->isAllOnesValue()) ||
8446 (!Res10->isNullValue() && !Res10->isAllOnesValue()) ||
8447 (!Res11->isNullValue() && !Res11->isAllOnesValue()))
8448 return nullptr;
8449
8450 std::bitset<4> Table;
8451 if (!Res00->isNullValue())
8452 Table.set(0);
8453 if (!Res01->isNullValue())
8454 Table.set(1);
8455 if (!Res10->isNullValue())
8456 Table.set(2);
8457 if (!Res11->isNullValue())
8458 Table.set(3);
8459
8460 Value *Res = createLogicFromTable(Table, C1, C2, Builder,
8461 Op0->hasOneUse() && Op1->hasOneUse());
8462 if (!Res)
8463 return nullptr;
8464 return replaceInstUsesWith(I, Res);
8465}
8466
8467/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8469 Constant *RHSC) {
8470 // When C is not 0.0 and infinities are not allowed:
8471 // (C / X) < 0.0 is a sign-bit test of X
8472 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8473 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8474 //
8475 // Proof:
8476 // Multiply (C / X) < 0.0 by X * X / C.
8477 // - X is non zero, if it is the flag 'ninf' is violated.
8478 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8479 // the predicate. C is also non zero by definition.
8480 //
8481 // Thus X * X / C is non zero and the transformation is valid. [qed]
8482
8483 FCmpInst::Predicate Pred = I.getPredicate();
8484
8485 // Check that predicates are valid.
8486 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8487 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8488 return nullptr;
8489
8490 // Check that RHS operand is zero.
8491 if (!match(RHSC, m_AnyZeroFP()))
8492 return nullptr;
8493
8494 // Check fastmath flags ('ninf').
8495 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8496 return nullptr;
8497
8498 // Check the properties of the dividend. It must not be zero to avoid a
8499 // division by zero (see Proof).
8500 const APFloat *C;
8501 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8502 return nullptr;
8503
8504 if (C->isZero())
8505 return nullptr;
8506
8507 // Get swapped predicate if necessary.
8508 if (C->isNegative())
8509 Pred = I.getSwappedPredicate();
8510
8511 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8512}
8513
8514// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8515// Patterns include:
8516// fptrunc(x) < C --> x < ext(C)
8517// fptrunc(x) <= C --> x <= ext(C)
8518// fptrunc(x) > C --> x > ext(C)
8519// fptrunc(x) >= C --> x >= ext(C)
8520// fptrunc(x) ord/uno C --> x ord/uno 0
8521// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8522// due to precision loss.
8524 const Constant &C) {
8525 FCmpInst::Predicate Pred = I.getPredicate();
8526 Type *DestType = FPTrunc.getOperand(0)->getType();
8527
8528 const APFloat *CValue;
8529 // TODO: support vec
8530 if (!match(&C, m_APFloat(CValue)))
8531 return nullptr;
8532
8533 // Handle ord/uno
8534 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
8535 assert(!CValue->isNaN() &&
8536 "X ord/uno NaN should be folded away by simplifyFCmpInst()");
8537 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8538 ConstantFP::getZero(DestType), "", &I);
8539 }
8540
8541 // Handle <, >, <=, >=
8542 bool RoundDown = false;
8543
8544 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8545 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8546 RoundDown = true;
8547 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8548 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8549 RoundDown = false;
8550 else
8551 return nullptr;
8552
8553 if (CValue->isNaN() || CValue->isInfinity())
8554 return nullptr;
8555
8556 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8557 bool LosesInfo;
8558 APFloat Dest = Src;
8559 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8560 return Dest;
8561 };
8562
8563 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8564 APFloat NextValue = Value;
8565 NextValue.next(RoundDown);
8566 return NextValue;
8567 };
8568
8569 APFloat NextCValue = NextValue(*CValue, RoundDown);
8570
8571 const fltSemantics &DestFltSema =
8572 DestType->getScalarType()->getFltSemantics();
8573
8574 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8575 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8576
8577 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8578 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8579 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8580 // value of 'CValue'.
8581 if (NextCValue.isInfinity()) {
8582 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8583 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8584
8585 ExtNextCValue = ExtCValue + Bias;
8586 }
8587
8588 APFloat ExtMidValue =
8589 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8590
8591 const fltSemantics &SrcFltSema =
8592 C.getType()->getScalarType()->getFltSemantics();
8593
8594 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8595 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8596 if (MidValue != *CValue)
8597 ExtMidValue.next(!RoundDown);
8598
8599 // Check whether 'ExtMidValue' is a valid result since the assumption on
8600 // imaged 'NextCValue' might not hold for new float types.
8601 // ppc_fp128 can't pass here when converting from max float because of
8602 // APFloat implementation.
8603 if (NextCValue.isInfinity()) {
8604 // ExtMidValue --- narrowed ---> Finite
8605 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8606 return nullptr;
8607
8608 // NextExtMidValue --- narrowed ---> Infinity
8609 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8610 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8611 return nullptr;
8612 }
8613
8614 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8615 ConstantFP::get(DestType, ExtMidValue), "", &I);
8616}
8617
8618/// Optimize fabs(X) compared with zero.
8620 Value *X;
8621 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8622 return nullptr;
8623
8624 const APFloat *C;
8625 if (!match(I.getOperand(1), m_APFloat(C)))
8626 return nullptr;
8627
8628 if (!C->isPosZero()) {
8629 if (!C->isSmallestNormalized())
8630 return nullptr;
8631
8632 const Function *F = I.getFunction();
8633 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8634 if (Mode.Input == DenormalMode::PreserveSign ||
8636
8637 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8638 Constant *Zero = ConstantFP::getZero(X->getType());
8639 return new FCmpInst(P, X, Zero, "", I);
8640 };
8641
8642 switch (I.getPredicate()) {
8643 case FCmpInst::FCMP_OLT:
8644 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8645 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8646 case FCmpInst::FCMP_UGE:
8647 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8648 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8649 case FCmpInst::FCMP_OGE:
8650 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8651 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8652 case FCmpInst::FCMP_ULT:
8653 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8654 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8655 default:
8656 break;
8657 }
8658 }
8659
8660 return nullptr;
8661 }
8662
8663 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8664 I->setPredicate(P);
8665 return IC.replaceOperand(*I, 0, X);
8666 };
8667
8668 switch (I.getPredicate()) {
8669 case FCmpInst::FCMP_UGE:
8670 case FCmpInst::FCMP_OLT:
8671 // fabs(X) >= 0.0 --> true
8672 // fabs(X) < 0.0 --> false
8673 llvm_unreachable("fcmp should have simplified");
8674
8675 case FCmpInst::FCMP_OGT:
8676 // fabs(X) > 0.0 --> X != 0.0
8677 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8678
8679 case FCmpInst::FCMP_UGT:
8680 // fabs(X) u> 0.0 --> X u!= 0.0
8681 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8682
8683 case FCmpInst::FCMP_OLE:
8684 // fabs(X) <= 0.0 --> X == 0.0
8685 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8686
8687 case FCmpInst::FCMP_ULE:
8688 // fabs(X) u<= 0.0 --> X u== 0.0
8689 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8690
8691 case FCmpInst::FCMP_OGE:
8692 // fabs(X) >= 0.0 --> !isnan(X)
8693 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8694 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8695
8696 case FCmpInst::FCMP_ULT:
8697 // fabs(X) u< 0.0 --> isnan(X)
8698 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8699 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8700
8701 case FCmpInst::FCMP_OEQ:
8702 case FCmpInst::FCMP_UEQ:
8703 case FCmpInst::FCMP_ONE:
8704 case FCmpInst::FCMP_UNE:
8705 case FCmpInst::FCMP_ORD:
8706 case FCmpInst::FCMP_UNO:
8707 // Look through the fabs() because it doesn't change anything but the sign.
8708 // fabs(X) == 0.0 --> X == 0.0,
8709 // fabs(X) != 0.0 --> X != 0.0
8710 // isnan(fabs(X)) --> isnan(X)
8711 // !isnan(fabs(X) --> !isnan(X)
8712 return replacePredAndOp0(&I, I.getPredicate(), X);
8713
8714 default:
8715 return nullptr;
8716 }
8717}
8718
8719/// Optimize sqrt(X) compared with zero.
8721 Value *X;
8722 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8723 return nullptr;
8724
8725 if (!match(I.getOperand(1), m_PosZeroFP()))
8726 return nullptr;
8727
8728 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8729 I.setPredicate(P);
8730 return IC.replaceOperand(I, 0, X);
8731 };
8732
8733 // Clear ninf flag if sqrt doesn't have it.
8734 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8735 I.setHasNoInfs(false);
8736
8737 switch (I.getPredicate()) {
8738 case FCmpInst::FCMP_OLT:
8739 case FCmpInst::FCMP_UGE:
8740 // sqrt(X) < 0.0 --> false
8741 // sqrt(X) u>= 0.0 --> true
8742 llvm_unreachable("fcmp should have simplified");
8743 case FCmpInst::FCMP_ULT:
8744 case FCmpInst::FCMP_ULE:
8745 case FCmpInst::FCMP_OGT:
8746 case FCmpInst::FCMP_OGE:
8747 case FCmpInst::FCMP_OEQ:
8748 case FCmpInst::FCMP_UNE:
8749 // sqrt(X) u< 0.0 --> X u< 0.0
8750 // sqrt(X) u<= 0.0 --> X u<= 0.0
8751 // sqrt(X) > 0.0 --> X > 0.0
8752 // sqrt(X) >= 0.0 --> X >= 0.0
8753 // sqrt(X) == 0.0 --> X == 0.0
8754 // sqrt(X) u!= 0.0 --> X u!= 0.0
8755 return IC.replaceOperand(I, 0, X);
8756
8757 case FCmpInst::FCMP_OLE:
8758 // sqrt(X) <= 0.0 --> X == 0.0
8759 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8760 case FCmpInst::FCMP_UGT:
8761 // sqrt(X) u> 0.0 --> X u!= 0.0
8762 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8763 case FCmpInst::FCMP_UEQ:
8764 // sqrt(X) u== 0.0 --> X u<= 0.0
8765 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8766 case FCmpInst::FCMP_ONE:
8767 // sqrt(X) != 0.0 --> X > 0.0
8768 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8769 case FCmpInst::FCMP_ORD:
8770 // !isnan(sqrt(X)) --> X >= 0.0
8771 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8772 case FCmpInst::FCMP_UNO:
8773 // isnan(sqrt(X)) --> X u< 0.0
8774 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8775 default:
8776 llvm_unreachable("Unexpected predicate!");
8777 }
8778}
8779
8781 CmpInst::Predicate Pred = I.getPredicate();
8782 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8783
8784 // Canonicalize fneg as Op1.
8785 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8786 std::swap(Op0, Op1);
8787 Pred = I.getSwappedPredicate();
8788 }
8789
8790 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8791 return nullptr;
8792
8793 // Replace the negated operand with 0.0:
8794 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8795 Constant *Zero = ConstantFP::getZero(Op0->getType());
8796 return new FCmpInst(Pred, Op0, Zero, "", &I);
8797}
8798
8800 Constant *RHSC, InstCombinerImpl &CI) {
8801 const CmpInst::Predicate Pred = I.getPredicate();
8802 Value *X = LHSI->getOperand(0);
8803 Value *Y = LHSI->getOperand(1);
8804 switch (Pred) {
8805 default:
8806 break;
8807 case FCmpInst::FCMP_UGT:
8808 case FCmpInst::FCMP_ULT:
8809 case FCmpInst::FCMP_UNE:
8810 case FCmpInst::FCMP_OEQ:
8811 case FCmpInst::FCMP_OGE:
8812 case FCmpInst::FCMP_OLE:
8813 // The optimization is not valid if X and Y are infinities of the same
8814 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8815 // flag then we can assume we do not have that case. Otherwise we might be
8816 // able to prove that either X or Y is not infinity.
8817 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8821 break;
8822
8823 [[fallthrough]];
8824 case FCmpInst::FCMP_OGT:
8825 case FCmpInst::FCMP_OLT:
8826 case FCmpInst::FCMP_ONE:
8827 case FCmpInst::FCMP_UEQ:
8828 case FCmpInst::FCMP_UGE:
8829 case FCmpInst::FCMP_ULE:
8830 // fcmp pred (x - y), 0 --> fcmp pred x, y
8831 if (match(RHSC, m_AnyZeroFP()) &&
8832 I.getFunction()->getDenormalMode(
8833 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8835 CI.replaceOperand(I, 0, X);
8836 CI.replaceOperand(I, 1, Y);
8837 I.setHasNoInfs(LHSI->hasNoInfs());
8838 if (LHSI->hasNoNaNs())
8839 I.setHasNoNaNs(true);
8840 return &I;
8841 }
8842 // fcmp `pred (C - Y), C` -> `fcmp swap(pred), Y, 0`
8843 // where C and Y can't be arbitrary floating-point values.
8844 // For example, with `C = 1.0f` and `Y = 0x1p-149`, `1.0f - Y` rounds back
8845 // to `1.0f`, so the source compare is false while the rewritten compare is
8846 // true.
8847 // We need to make sure (C - Y) never rounds back to C
8848 const APFloat *C;
8849 Value *IntSrc;
8850 if (match(RHSC, m_APFloat(C)) &&
8851 match(LHSI, m_FSub(m_Specific(RHSC), m_IToFP(m_Value(IntSrc)))) &&
8852 C->isNormal()) {
8853 // Requirements on C and Y:
8854 // 1. C is finite, nonzero, normal.
8855 // 2. C shouldn't be too large, that is, ULP(C) <= 1.
8856 // 3. Y must be the form of `[su]itofp`, so the finite nonzero result of Y
8857 // must be integer-valued with an absolute value of at least 1;
8858 // as long as the step size near C does not exceed 1,
8859 // C - Y cannot be rounded back to C when Y != 0.
8860 // 4. If Y = 0, `fcmp pred (C - 0), C` are equivalent to `fcmp swap(pred)
8861 // 0, 0` for ordered and unordered predicates as long as C is finite and
8862 // nonzero.
8863 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8864 if (MantissaWidth != -1 && ilogb(*C) < MantissaWidth) {
8865 Constant *ZeroC = ConstantFP::getZero(LHSI->getType());
8866 I.setPredicate(I.getSwappedPredicate());
8867 CI.replaceOperand(I, 0, Y);
8868 CI.replaceOperand(I, 1, ZeroC);
8869 return &I;
8870 }
8871 }
8872 break;
8873 }
8874
8875 return nullptr;
8876}
8877
8878/// Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b
8879/// where 'pred' is olt, ult, ogt, ugt, oge or uge and C is a positive, Non-NaN
8880/// float when the uitofp casts are exact and C is in the valid range.
8881///
8882/// Since exact uitofp means distinct integers map to distinct floats, the only
8883/// values fabs(uitofp(a) - uitofp(b)) can take are {0.0, 1.0, 2.0, ...}.
8884/// There are no values in the open interval (0, 1), so:
8885/// fabs(...) < C where 0 < C <= 1.0 --> a == b (strict lt: C=1.0 ok)
8886// fabs(..) >= C where C >= 1.0 -> a != b
8887///
8888/// The same logic applies to sitofp.
8890 Value *FAbsArg;
8891 if (!match(I.getOperand(0), m_FAbs(m_Value(FAbsArg))))
8892 return nullptr;
8893
8894 const APFloat *C;
8895 if (!match(I.getOperand(1), PatternMatch::m_FiniteNonZero(C)))
8896 return nullptr;
8897
8898 FCmpInst::Predicate Pred = I.getPredicate();
8899 bool IsStrictLt = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT;
8900 bool IsLe = Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE;
8901 bool IsStrictGt = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT;
8902 bool IsGe = Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE;
8903 if (!IsStrictLt && !IsStrictGt && !IsGe)
8904 return nullptr;
8905
8906 APFloat One = APFloat::getOne(C->getSemantics());
8907 APFloat::cmpResult Cmp = C->compare(One);
8908
8909 // For strict-lt (olt/ult): C must be in (0, 1.0] -- C == 1.0 is fine since
8910 // the next possible value after 0.0 is 1.0, and < 1.0 excludes it.
8911 if (IsStrictLt && Cmp == APFloat::cmpGreaterThan)
8912 return nullptr;
8913 if (IsGe && Cmp == APFloat::cmpGreaterThan)
8914 return nullptr;
8915 if (IsLe && Cmp != APFloat::cmpGreaterThan)
8916 return nullptr;
8917 if (IsStrictGt && Cmp != APFloat::cmpLessThan)
8918 return nullptr;
8919
8920 // Match: fsub(uitofp(A), uitofp(B)) where both casts are uitofp or sitofp
8921 Value *A, *B;
8922 bool IsSigned;
8923 if (match(FAbsArg, m_FSub(m_UIToFP(m_Value(A)), m_UIToFP(m_Value(B))))) {
8924 IsSigned = false;
8925 } else if (match(FAbsArg,
8927 IsSigned = true;
8928 } else {
8929 return nullptr;
8930 }
8931
8932 // A and B must have the same integer type
8933 if (A->getType() != B->getType())
8934 return nullptr;
8935
8936 Type *FPTy = FAbsArg->getType();
8937 if (!IC.canBeCastedExactlyIntToFP(A, FPTy, IsSigned, &I) ||
8938 !IC.canBeCastedExactlyIntToFP(B, FPTy, IsSigned, &I))
8939 return nullptr;
8940 ICmpInst::Predicate ResultPred =
8941 IsStrictLt || IsLe ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
8942 return new ICmpInst(ResultPred, A, B);
8943}
8944
8946 InstCombinerImpl &IC) {
8947 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8948 Type *OpType = LHS->getType();
8949 CmpInst::Predicate Pred = I.getPredicate();
8950
8953
8954 if (!FloorX && !CeilX) {
8957 std::swap(LHS, RHS);
8958 Pred = I.getSwappedPredicate();
8959 }
8960 }
8961
8962 if ((FloorX || CeilX) && FCmpInst::isCommutative(Pred) && LHS->hasOneUse()) {
8963 // fcmp pred floor(x), x => fcmp pred trunc(x), x
8964 // fcmp pred ceil(x), x => fcmp pred trunc(x), x
8965 // where pred is oeq, one, ord, ueq, une, uno.
8966 Value *TruncX = IC.Builder.CreateUnaryIntrinsic(Intrinsic::trunc, RHS);
8967 return new FCmpInst(Pred, TruncX, RHS, "", &I);
8968 }
8969
8970 switch (Pred) {
8971 case FCmpInst::FCMP_OLE:
8972 // fcmp ole floor(x), x => fcmp ord x, 0
8973 if (FloorX)
8975 "", &I);
8976 break;
8977 case FCmpInst::FCMP_OGT:
8978 // fcmp ogt floor(x), x => false
8979 if (FloorX)
8980 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8981 break;
8982 case FCmpInst::FCMP_OGE:
8983 // fcmp oge ceil(x), x => fcmp ord x, 0
8984 if (CeilX)
8986 "", &I);
8987 break;
8988 case FCmpInst::FCMP_OLT:
8989 // fcmp olt ceil(x), x => false
8990 if (CeilX)
8991 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8992 break;
8993 case FCmpInst::FCMP_ULE:
8994 // fcmp ule floor(x), x => true
8995 if (FloorX)
8996 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8997 break;
8998 case FCmpInst::FCMP_UGT:
8999 // fcmp ugt floor(x), x => fcmp uno x, 0
9000 if (FloorX)
9002 "", &I);
9003 break;
9004 case FCmpInst::FCMP_UGE:
9005 // fcmp uge ceil(x), x => true
9006 if (CeilX)
9007 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9008 break;
9009 case FCmpInst::FCMP_ULT:
9010 // fcmp ult ceil(x), x => fcmp uno x, 0
9011 if (CeilX)
9013 "", &I);
9014 break;
9015 default:
9016 break;
9017 }
9018
9019 return nullptr;
9020}
9021
9022/// Returns true if a select that implements a min/max is redundant and
9023/// select result can be replaced with its non-constant operand, e.g.,
9024/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
9025/// where C is the FP constant equal to the minimum integer value
9026/// representable by A.
9028 Value *B) {
9029 const APFloat *APF;
9030 if (!match(B, m_APFloat(APF)))
9031 return false;
9032
9033 auto *I = dyn_cast<Instruction>(A);
9034 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
9035 I->getOpcode() == Instruction::UIToFP))
9036 return false;
9037
9038 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
9039 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
9040 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
9041 ? APSInt::getMinValue(BitWidth, IsUnsigned)
9042 : APSInt::getMaxValue(BitWidth, IsUnsigned);
9043 APSInt ConvertedInt(BitWidth, IsUnsigned);
9044 bool IsExact;
9046 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
9047 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
9048}
9049
9051 bool Changed = false;
9052
9053 /// Orders the operands of the compare so that they are listed from most
9054 /// complex to least complex. This puts constants before unary operators,
9055 /// before binary operators.
9056 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
9057 I.swapOperands();
9058 Changed = true;
9059 }
9060
9061 const CmpInst::Predicate Pred = I.getPredicate();
9062 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
9063 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
9064 SQ.getWithInstruction(&I)))
9065 return replaceInstUsesWith(I, V);
9066
9067 // Simplify 'fcmp pred X, X'
9068 Type *OpType = Op0->getType();
9069 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
9070 if (Op0 == Op1) {
9071 switch (Pred) {
9072 default:
9073 break;
9074 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
9075 case FCmpInst::FCMP_ULT: // True if unordered or less than
9076 case FCmpInst::FCMP_UGT: // True if unordered or greater than
9077 case FCmpInst::FCMP_UNE: // True if unordered or not equal
9078 // Canonicalize these to be 'fcmp uno %X, 0.0'.
9079 I.setPredicate(FCmpInst::FCMP_UNO);
9080 I.setOperand(1, Constant::getNullValue(OpType));
9081 return &I;
9082
9083 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
9084 case FCmpInst::FCMP_OEQ: // True if ordered and equal
9085 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
9086 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
9087 // Canonicalize these to be 'fcmp ord %X, 0.0'.
9088 I.setPredicate(FCmpInst::FCMP_ORD);
9089 I.setOperand(1, Constant::getNullValue(OpType));
9090 return &I;
9091 }
9092 }
9093
9094 if (I.isCommutative()) {
9095 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
9096 replaceOperand(I, 0, Pair->first);
9097 replaceOperand(I, 1, Pair->second);
9098 return &I;
9099 }
9100 }
9101
9102 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
9103 // then canonicalize the operand to 0.0.
9104 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
9105 if (!match(Op0, m_PosZeroFP()) &&
9106 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
9107 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
9108
9109 if (!match(Op1, m_PosZeroFP()) &&
9110 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
9111 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9112 }
9113
9114 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
9115 Value *X, *Y;
9116 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
9117 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
9118
9120 return R;
9121
9122 // Test if the FCmpInst instruction is used exclusively by a select as
9123 // part of a minimum or maximum operation. If so, refrain from doing
9124 // any other folding. This helps out other analyses which understand
9125 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
9126 // and CodeGen. And in this case, at least one of the comparison
9127 // operands has at least one user besides the compare (the select),
9128 // which would often largely negate the benefit of folding anyway.
9129 if (I.hasOneUse())
9130 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
9131 Value *A, *B;
9133 bool IsRedundantMinMaxClamp =
9134 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
9136 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
9137 return nullptr;
9138 }
9139
9140 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
9141 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
9142 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
9143 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9144
9145 // Canonicalize:
9146 // fcmp olt X, +inf -> fcmp one X, +inf
9147 // fcmp ole X, +inf -> fcmp ord X, 0
9148 // fcmp ogt X, +inf -> false
9149 // fcmp oge X, +inf -> fcmp oeq X, +inf
9150 // fcmp ult X, +inf -> fcmp une X, +inf
9151 // fcmp ule X, +inf -> true
9152 // fcmp ugt X, +inf -> fcmp uno X, 0
9153 // fcmp uge X, +inf -> fcmp ueq X, +inf
9154 // fcmp olt X, -inf -> false
9155 // fcmp ole X, -inf -> fcmp oeq X, -inf
9156 // fcmp ogt X, -inf -> fcmp one X, -inf
9157 // fcmp oge X, -inf -> fcmp ord X, 0
9158 // fcmp ult X, -inf -> fcmp uno X, 0
9159 // fcmp ule X, -inf -> fcmp ueq X, -inf
9160 // fcmp ugt X, -inf -> fcmp une X, -inf
9161 // fcmp uge X, -inf -> true
9162 const APFloat *C;
9163 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
9164 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
9165 default:
9166 break;
9167 case FCmpInst::FCMP_ORD:
9168 case FCmpInst::FCMP_UNO:
9171 case FCmpInst::FCMP_OGT:
9172 case FCmpInst::FCMP_ULE:
9173 llvm_unreachable("Should be simplified by InstSimplify");
9174 case FCmpInst::FCMP_OLT:
9175 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
9176 case FCmpInst::FCMP_OLE:
9177 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
9178 "", &I);
9179 case FCmpInst::FCMP_OGE:
9180 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
9181 case FCmpInst::FCMP_ULT:
9182 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
9183 case FCmpInst::FCMP_UGT:
9184 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
9185 "", &I);
9186 case FCmpInst::FCMP_UGE:
9187 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
9188 }
9189 }
9190
9191 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
9192 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
9193 if (match(Op1, m_PosZeroFP()) &&
9195 X->getType()->isIntOrIntVectorTy() &&
9196 !F.getDenormalMode(Op1->getType()->getScalarType()->getFltSemantics())
9197 .inputsMayBeZero()) {
9199 if (Pred == FCmpInst::FCMP_OEQ)
9200 IntPred = ICmpInst::ICMP_EQ;
9201 else if (Pred == FCmpInst::FCMP_UNE)
9202 IntPred = ICmpInst::ICMP_NE;
9203
9204 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
9205 Type *IntTy = X->getType();
9206 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
9207 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
9208 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
9209 }
9210 }
9211
9212 // Handle fcmp with instruction LHS and constant RHS.
9213 Instruction *LHSI;
9214 Constant *RHSC;
9215 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
9216 switch (LHSI->getOpcode()) {
9217 case Instruction::Select:
9218 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
9219 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
9221 return replaceOperand(I, 0, X);
9223 return NV;
9224 break;
9225 case Instruction::FSub:
9226 if (LHSI->hasOneUse())
9227 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
9228 return NV;
9229 break;
9230 case Instruction::PHI:
9231 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
9232 return NV;
9233 break;
9234 case Instruction::SIToFP:
9235 case Instruction::UIToFP:
9236 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
9237 return NV;
9238 break;
9239 case Instruction::FDiv:
9240 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
9241 return NV;
9242 break;
9243 case Instruction::Load:
9244 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
9245 if (Instruction *Res =
9247 return Res;
9248 break;
9249 case Instruction::FPTrunc:
9250 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
9251 return NV;
9252 break;
9253 }
9254 }
9255
9256 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
9257 return R;
9258
9259 if (Instruction *R = foldFCmpFAbsFSubIntToFP(I, *this))
9260 return R;
9261
9262 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
9263 return R;
9264
9265 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
9266 return R;
9267
9269 return R;
9270
9271 if (match(Op0, m_FNeg(m_Value(X)))) {
9272 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
9273 Constant *C;
9274 if (match(Op1, m_Constant(C)))
9275 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
9276 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
9277 }
9278
9279 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
9280 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
9281 return new FCmpInst(Pred, X, Op1, "", &I);
9282
9283 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
9284 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
9285 return new FCmpInst(Pred, Op0, Y, "", &I);
9286
9287 // fcmp ord/uno (fptrunc X), (fptrunc Y) -> fcmp ord/uno X, Y
9288 if ((Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) &&
9289 match(Op0, m_FPTrunc(m_Value(X))) && match(Op1, m_FPTrunc(m_Value(Y))) &&
9290 X->getType() == Y->getType())
9291 return new FCmpInst(Pred, X, Y, "", &I);
9292
9293 if (match(Op0, m_FPExt(m_Value(X)))) {
9294 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
9295 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
9296 return new FCmpInst(Pred, X, Y, "", &I);
9297
9298 const APFloat *C;
9299 if (match(Op1, m_APFloat(C))) {
9300 const fltSemantics &FPSem =
9301 X->getType()->getScalarType()->getFltSemantics();
9302 bool Lossy;
9303 APFloat TruncC = *C;
9305
9306 if (Lossy) {
9307 // X can't possibly equal the higher-precision constant, so reduce any
9308 // equality comparison.
9309 // TODO: Other predicates can be handled via getFCmpCode().
9310 switch (Pred) {
9311 case FCmpInst::FCMP_OEQ:
9312 // X is ordered and equal to an impossible constant --> false
9313 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9314 case FCmpInst::FCMP_ONE:
9315 // X is ordered and not equal to an impossible constant --> ordered
9316 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9317 ConstantFP::getZero(X->getType()));
9318 case FCmpInst::FCMP_UEQ:
9319 // X is unordered or equal to an impossible constant --> unordered
9320 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9321 ConstantFP::getZero(X->getType()));
9322 case FCmpInst::FCMP_UNE:
9323 // X is unordered or not equal to an impossible constant --> true
9324 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9325 default:
9326 break;
9327 }
9328 }
9329
9330 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9331 // Avoid lossy conversions and denormals.
9332 // Zero is a special case that's OK to convert.
9333 APFloat Fabs = TruncC;
9334 Fabs.clearSign();
9335 if (!Lossy &&
9336 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9337 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9338 return new FCmpInst(Pred, X, NewC, "", &I);
9339 }
9340 }
9341 }
9342
9343 // Convert a sign-bit test of an FP value into a cast and integer compare.
9344 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9345 // TODO: Handle non-zero compare constants.
9346 // TODO: Handle other predicates.
9348 m_Value(X)))) &&
9349 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9350 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9351 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9352 IntType = VectorType::get(IntType, VecTy->getElementCount());
9353
9354 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9355 if (Pred == FCmpInst::FCMP_OLT) {
9356 Value *IntX = Builder.CreateBitCast(X, IntType);
9357 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9358 ConstantInt::getNullValue(IntType));
9359 }
9360 }
9361
9362 {
9363 Value *CanonLHS = nullptr;
9365 // (canonicalize(x) == x) => (x == x)
9366 if (CanonLHS == Op1)
9367 return new FCmpInst(Pred, Op1, Op1, "", &I);
9368
9369 Value *CanonRHS = nullptr;
9371 // (x == canonicalize(x)) => (x == x)
9372 if (CanonRHS == Op0)
9373 return new FCmpInst(Pred, Op0, Op0, "", &I);
9374
9375 // (canonicalize(x) == canonicalize(y)) => (x == y)
9376 if (CanonLHS && CanonRHS)
9377 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9378 }
9379
9380 if (I.getType()->isVectorTy())
9381 if (Instruction *Res = foldVectorCmp(I, Builder))
9382 return Res;
9383
9384 return Changed ? &I : nullptr;
9385}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< 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:5920
void clearSign()
Definition APFloat.h:1378
bool isNaN() const
Definition APFloat.h:1557
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1168
bool isZero() const
Definition APFloat.h:1555
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1238
APInt bitcastToAPInt() const
Definition APFloat.h:1451
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1218
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1412
opStatus next(bool nextDown)
Definition APFloat.h:1334
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1178
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5849
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1328
bool isInfinity() const
Definition APFloat.h:1556
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1793
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
unsigned ceilLogBase2() const
Definition APInt.h:1789
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1210
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1983
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1963
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1088
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1670
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1970
void negate()
Negate this APInt in place.
Definition APInt.h:1493
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1477
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1640
unsigned logBase2() const
Definition APInt.h:1786
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1159
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1246
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1976
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1681
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1230
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
static APSInt getMinValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the minimum integer value with the given bit width and signedness.
Definition APSInt.h:310
static APSInt getMaxValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the maximum integer value with the given bit width and signedness.
Definition APSInt.h:302
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
static LLVM_ABI Predicate getFlippedStrictnessPredicate(Predicate pred)
This is a static version that you can use without an instruction available.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
bool isUnsigned() const
Definition InstrTypes.h:999
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Conditional Branch instruction.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
LLVM_ABI std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition Constants.cpp:68
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
iterator end()
Definition DenseMap.h:141
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:214
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
static bool isCommutative(Predicate Pred)
static bool isEquality(Predicate Pred)
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:390
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:82
Value * getPointerOperand()
Definition Operator.h:417
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:385
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:464
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1570
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:181
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2485
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1592
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:492
LLVM_ABI Value * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *Op, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2893
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldCmpSelectOfConstants(CmpInst &I)
Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2) where all true/false values are cons...
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
TargetLibraryInfo & TLI
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CxtI=nullptr) const
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
const DataLayout & DL
DomConditionCache DC
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
bool isArithmeticShift() const
Return true if this is an arithmetic shift right.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isShift() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
An instruction for reading from memory.
bool isVolatile() const
Return true if this is a load from a volatile memory location.
This class represents min/max intrinsics.
Value * getLHS() const
Value * getRHS() const
static bool isMin(Intrinsic::ID ID)
Whether the intrinsic is a smin or umin.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h: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)
auto m_Sqrt(const Opnd0 &Op0)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_UMax(const Opnd0 &Op0, const Opnd1 &Op1)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
cstfp_pred_ty< is_finitenonzero > m_FiniteNonZero()
Match a finite non-zero FP constant.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_FAbs(const Opnd0 &Op0)
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
auto m_VecReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
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:573
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:830
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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:1668
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:1677
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h: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()).
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
DWARFExpression::Operation Op
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:2019
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:26
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, const SimplifyQuery &SQ, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h: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
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.