LLVM 22.0.0git
InstCombineCompares.cpp
Go to the documentation of this file.
1//===- InstCombineCompares.cpp --------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the visitICmp and visitFCmp functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APFloat.h"
15#include "llvm/ADT/APSInt.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/Statistic.h"
22#include "llvm/Analysis/Loads.h"
26#include "llvm/IR/Constants.h"
27#include "llvm/IR/DataLayout.h"
28#include "llvm/IR/InstrTypes.h"
34#include <bitset>
35
36using namespace llvm;
37using namespace PatternMatch;
38
39#define DEBUG_TYPE "instcombine"
40
41// How many times is a select replaced by one of its operands?
42STATISTIC(NumSel, "Number of select opts");
43
44/// Compute Result = In1+In2, returning true if the result overflowed for this
45/// type.
46static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
47 bool IsSigned = false) {
48 bool Overflow;
49 if (IsSigned)
50 Result = In1.sadd_ov(In2, Overflow);
51 else
52 Result = In1.uadd_ov(In2, Overflow);
53
54 return Overflow;
55}
56
57/// Compute Result = In1-In2, returning true if the result overflowed for this
58/// type.
59static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
60 bool IsSigned = false) {
61 bool Overflow;
62 if (IsSigned)
63 Result = In1.ssub_ov(In2, Overflow);
64 else
65 Result = In1.usub_ov(In2, Overflow);
66
67 return Overflow;
68}
69
70/// Given an icmp instruction, return true if any use of this comparison is a
71/// branch on sign bit comparison.
72static bool hasBranchUse(ICmpInst &I) {
73 for (auto *U : I.users())
74 if (isa<BranchInst>(U))
75 return true;
76 return false;
77}
78
79/// Returns true if the exploded icmp can be expressed as a signed comparison
80/// to zero and updates the predicate accordingly.
81/// The signedness of the comparison is preserved.
82/// TODO: Refactor with decomposeBitTestICmp()?
83static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
84 if (!ICmpInst::isSigned(Pred))
85 return false;
86
87 if (C.isZero())
88 return ICmpInst::isRelational(Pred);
89
90 if (C.isOne()) {
91 if (Pred == ICmpInst::ICMP_SLT) {
92 Pred = ICmpInst::ICMP_SLE;
93 return true;
94 }
95 } else if (C.isAllOnes()) {
96 if (Pred == ICmpInst::ICMP_SGT) {
97 Pred = ICmpInst::ICMP_SGE;
98 return true;
99 }
100 }
101
102 return false;
103}
104
105/// This is called when we see this pattern:
106/// cmp pred (load (gep GV, ...)), cmpcst
107/// where GV is a global variable with a constant initializer. Try to simplify
108/// this into some simple computation that does not need the load. For example
109/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
110///
111/// If AndCst is non-null, then the loaded value is masked with that constant
112/// before doing the comparison. This handles cases like "A[i]&4 == 0".
114 LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst) {
116 if (LI->isVolatile() || !GV || !GV->isConstant() ||
117 !GV->hasDefinitiveInitializer())
118 return nullptr;
119
120 Type *EltTy = LI->getType();
121 TypeSize EltSize = DL.getTypeStoreSize(EltTy);
122 if (EltSize.isScalable())
123 return nullptr;
124
126 if (!Expr.Index || Expr.BasePtr != GV || Expr.Offset.getBitWidth() > 64)
127 return nullptr;
128
129 Constant *Init = GV->getInitializer();
130 TypeSize GlobalSize = DL.getTypeAllocSize(Init->getType());
131
132 Value *Idx = Expr.Index;
133 const APInt &Stride = Expr.Scale;
134 const APInt &ConstOffset = Expr.Offset;
135
136 // Allow an additional context offset, but only within the stride.
137 if (!ConstOffset.ult(Stride))
138 return nullptr;
139
140 // Don't handle overlapping loads for now.
141 if (!Stride.uge(EltSize.getFixedValue()))
142 return nullptr;
143
144 // Don't blow up on huge arrays.
145 uint64_t ArrayElementCount =
146 divideCeil((GlobalSize.getFixedValue() - ConstOffset.getZExtValue()),
147 Stride.getZExtValue());
148 if (ArrayElementCount > MaxArraySizeForCombine)
149 return nullptr;
150
151 enum { Overdefined = -3, Undefined = -2 };
152
153 // Variables for our state machines.
154
155 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
156 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
157 // and 87 is the second (and last) index. FirstTrueElement is -2 when
158 // undefined, otherwise set to the first true element. SecondTrueElement is
159 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
160 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
161
162 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
163 // form "i != 47 & i != 87". Same state transitions as for true elements.
164 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
165
166 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
167 /// define a state machine that triggers for ranges of values that the index
168 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
169 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
170 /// index in the range (inclusive). We use -2 for undefined here because we
171 /// use relative comparisons and don't want 0-1 to match -1.
172 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
173
174 // MagicBitvector - This is a magic bitvector where we set a bit if the
175 // comparison is true for element 'i'. If there are 64 elements or less in
176 // the array, this will fully represent all the comparison results.
177 uint64_t MagicBitvector = 0;
178
179 // Scan the array and see if one of our patterns matches.
180 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
181 APInt Offset = ConstOffset;
182 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i, Offset += Stride) {
184 if (!Elt)
185 return nullptr;
186
187 // If the element is masked, handle it.
188 if (AndCst) {
189 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
190 if (!Elt)
191 return nullptr;
192 }
193
194 // Find out if the comparison would be true or false for the i'th element.
196 CompareRHS, DL, &TLI);
197 if (!C)
198 return nullptr;
199
200 // If the result is undef for this element, ignore it.
201 if (isa<UndefValue>(C)) {
202 // Extend range state machines to cover this element in case there is an
203 // undef in the middle of the range.
204 if (TrueRangeEnd == (int)i - 1)
205 TrueRangeEnd = i;
206 if (FalseRangeEnd == (int)i - 1)
207 FalseRangeEnd = i;
208 continue;
209 }
210
211 // If we can't compute the result for any of the elements, we have to give
212 // up evaluating the entire conditional.
213 if (!isa<ConstantInt>(C))
214 return nullptr;
215
216 // Otherwise, we know if the comparison is true or false for this element,
217 // update our state machines.
218 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
219
220 // State machine for single/double/range index comparison.
221 if (IsTrueForElt) {
222 // Update the TrueElement state machine.
223 if (FirstTrueElement == Undefined)
224 FirstTrueElement = TrueRangeEnd = i; // First true element.
225 else {
226 // Update double-compare state machine.
227 if (SecondTrueElement == Undefined)
228 SecondTrueElement = i;
229 else
230 SecondTrueElement = Overdefined;
231
232 // Update range state machine.
233 if (TrueRangeEnd == (int)i - 1)
234 TrueRangeEnd = i;
235 else
236 TrueRangeEnd = Overdefined;
237 }
238 } else {
239 // Update the FalseElement state machine.
240 if (FirstFalseElement == Undefined)
241 FirstFalseElement = FalseRangeEnd = i; // First false element.
242 else {
243 // Update double-compare state machine.
244 if (SecondFalseElement == Undefined)
245 SecondFalseElement = i;
246 else
247 SecondFalseElement = Overdefined;
248
249 // Update range state machine.
250 if (FalseRangeEnd == (int)i - 1)
251 FalseRangeEnd = i;
252 else
253 FalseRangeEnd = Overdefined;
254 }
255 }
256
257 // If this element is in range, update our magic bitvector.
258 if (i < 64 && IsTrueForElt)
259 MagicBitvector |= 1ULL << i;
260
261 // If all of our states become overdefined, bail out early. Since the
262 // predicate is expensive, only check it every 8 elements. This is only
263 // really useful for really huge arrays.
264 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
265 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
266 FalseRangeEnd == Overdefined)
267 return nullptr;
268 }
269
270 // Now that we've scanned the entire array, emit our new comparison(s). We
271 // order the state machines in complexity of the generated code.
272
273 // If inbounds keyword is not present, Idx * Stride can overflow.
274 // Let's assume that Stride is 2 and the wanted value is at offset 0.
275 // Then, there are two possible values for Idx to match offset 0:
276 // 0x00..00, 0x80..00.
277 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
278 // comparison is false if Idx was 0x80..00.
279 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
280 auto MaskIdx = [&](Value *Idx) {
281 if (!Expr.Flags.isInBounds() && Stride.countr_zero() != 0) {
283 Mask = Builder.CreateLShr(Mask, Stride.countr_zero());
284 Idx = Builder.CreateAnd(Idx, Mask);
285 }
286 return Idx;
287 };
288
289 // If the comparison is only true for one or two elements, emit direct
290 // comparisons.
291 if (SecondTrueElement != Overdefined) {
292 Idx = MaskIdx(Idx);
293 // None true -> false.
294 if (FirstTrueElement == Undefined)
295 return replaceInstUsesWith(ICI, Builder.getFalse());
296
297 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
298
299 // True for one element -> 'i == 47'.
300 if (SecondTrueElement == Undefined)
301 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
302
303 // True for two elements -> 'i == 47 | i == 72'.
304 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
305 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
306 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
307 return BinaryOperator::CreateOr(C1, C2);
308 }
309
310 // If the comparison is only false for one or two elements, emit direct
311 // comparisons.
312 if (SecondFalseElement != Overdefined) {
313 Idx = MaskIdx(Idx);
314 // None false -> true.
315 if (FirstFalseElement == Undefined)
316 return replaceInstUsesWith(ICI, Builder.getTrue());
317
318 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
319
320 // False for one element -> 'i != 47'.
321 if (SecondFalseElement == Undefined)
322 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
323
324 // False for two elements -> 'i != 47 & i != 72'.
325 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
326 Value *SecondFalseIdx =
327 ConstantInt::get(Idx->getType(), SecondFalseElement);
328 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
329 return BinaryOperator::CreateAnd(C1, C2);
330 }
331
332 // If the comparison can be replaced with a range comparison for the elements
333 // where it is true, emit the range check.
334 if (TrueRangeEnd != Overdefined) {
335 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
336 Idx = MaskIdx(Idx);
337
338 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
339 if (FirstTrueElement) {
340 Value *Offs = ConstantInt::get(Idx->getType(), -FirstTrueElement);
341 Idx = Builder.CreateAdd(Idx, Offs);
342 }
343
344 Value *End =
345 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
346 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
347 }
348
349 // False range check.
350 if (FalseRangeEnd != Overdefined) {
351 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
352 Idx = MaskIdx(Idx);
353 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
354 if (FirstFalseElement) {
355 Value *Offs = ConstantInt::get(Idx->getType(), -FirstFalseElement);
356 Idx = Builder.CreateAdd(Idx, Offs);
357 }
358
359 Value *End =
360 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
361 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
362 }
363
364 // If a magic bitvector captures the entire comparison state
365 // of this load, replace it with computation that does:
366 // ((magic_cst >> i) & 1) != 0
367 {
368 Type *Ty = nullptr;
369
370 // Look for an appropriate type:
371 // - The type of Idx if the magic fits
372 // - The smallest fitting legal type
373 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
374 Ty = Idx->getType();
375 else
376 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
377
378 if (Ty) {
379 Idx = MaskIdx(Idx);
380 Value *V = Builder.CreateIntCast(Idx, Ty, false);
381 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
382 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
383 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
384 }
385 }
386
387 return nullptr;
388}
389
390/// Returns true if we can rewrite Start as a GEP with pointer Base
391/// and some integer offset. The nodes that need to be re-written
392/// for this transformation will be added to Explored.
394 const DataLayout &DL,
395 SetVector<Value *> &Explored) {
396 SmallVector<Value *, 16> WorkList(1, Start);
397 Explored.insert(Base);
398
399 // The following traversal gives us an order which can be used
400 // when doing the final transformation. Since in the final
401 // transformation we create the PHI replacement instructions first,
402 // we don't have to get them in any particular order.
403 //
404 // However, for other instructions we will have to traverse the
405 // operands of an instruction first, which means that we have to
406 // do a post-order traversal.
407 while (!WorkList.empty()) {
409
410 while (!WorkList.empty()) {
411 if (Explored.size() >= 100)
412 return false;
413
414 Value *V = WorkList.back();
415
416 if (Explored.contains(V)) {
417 WorkList.pop_back();
418 continue;
419 }
420
422 // We've found some value that we can't explore which is different from
423 // the base. Therefore we can't do this transformation.
424 return false;
425
426 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
427 // Only allow inbounds GEPs with at most one variable offset.
428 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
429 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
430 return false;
431
432 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
433 if (!Explored.contains(GEP->getOperand(0)))
434 WorkList.push_back(GEP->getOperand(0));
435 }
436
437 if (WorkList.back() == V) {
438 WorkList.pop_back();
439 // We've finished visiting this node, mark it as such.
440 Explored.insert(V);
441 }
442
443 if (auto *PN = dyn_cast<PHINode>(V)) {
444 // We cannot transform PHIs on unsplittable basic blocks.
445 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
446 return false;
447 Explored.insert(PN);
448 PHIs.insert(PN);
449 }
450 }
451
452 // Explore the PHI nodes further.
453 for (auto *PN : PHIs)
454 for (Value *Op : PN->incoming_values())
455 if (!Explored.contains(Op))
456 WorkList.push_back(Op);
457 }
458
459 // Make sure that we can do this. Since we can't insert GEPs in a basic
460 // block before a PHI node, we can't easily do this transformation if
461 // we have PHI node users of transformed instructions.
462 for (Value *Val : Explored) {
463 for (Value *Use : Val->uses()) {
464
465 auto *PHI = dyn_cast<PHINode>(Use);
466 auto *Inst = dyn_cast<Instruction>(Val);
467
468 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
469 !Explored.contains(PHI))
470 continue;
471
472 if (PHI->getParent() == Inst->getParent())
473 return false;
474 }
475 }
476 return true;
477}
478
479// Sets the appropriate insert point on Builder where we can add
480// a replacement Instruction for V (if that is possible).
481static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
482 bool Before = true) {
483 if (auto *PHI = dyn_cast<PHINode>(V)) {
484 BasicBlock *Parent = PHI->getParent();
485 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
486 return;
487 }
488 if (auto *I = dyn_cast<Instruction>(V)) {
489 if (!Before)
490 I = &*std::next(I->getIterator());
491 Builder.SetInsertPoint(I);
492 return;
493 }
494 if (auto *A = dyn_cast<Argument>(V)) {
495 // Set the insertion point in the entry block.
496 BasicBlock &Entry = A->getParent()->getEntryBlock();
497 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
498 return;
499 }
500 // Otherwise, this is a constant and we don't need to set a new
501 // insertion point.
502 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
503}
504
505/// Returns a re-written value of Start as an indexed GEP using Base as a
506/// pointer.
508 const DataLayout &DL,
509 SetVector<Value *> &Explored,
510 InstCombiner &IC) {
511 // Perform all the substitutions. This is a bit tricky because we can
512 // have cycles in our use-def chains.
513 // 1. Create the PHI nodes without any incoming values.
514 // 2. Create all the other values.
515 // 3. Add the edges for the PHI nodes.
516 // 4. Emit GEPs to get the original pointers.
517 // 5. Remove the original instructions.
518 Type *IndexType = IntegerType::get(
519 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
520
522 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
523
524 // Create the new PHI nodes, without adding any incoming values.
525 for (Value *Val : Explored) {
526 if (Val == Base)
527 continue;
528 // Create empty phi nodes. This avoids cyclic dependencies when creating
529 // the remaining instructions.
530 if (auto *PHI = dyn_cast<PHINode>(Val))
531 NewInsts[PHI] =
532 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
533 PHI->getName() + ".idx", PHI->getIterator());
534 }
535 IRBuilder<> Builder(Base->getContext());
536
537 // Create all the other instructions.
538 for (Value *Val : Explored) {
539 if (NewInsts.contains(Val))
540 continue;
541
542 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
543 setInsertionPoint(Builder, GEP);
544 Value *Op = NewInsts[GEP->getOperand(0)];
545 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
547 NewInsts[GEP] = OffsetV;
548 else
549 NewInsts[GEP] = Builder.CreateAdd(
550 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
551 /*NUW=*/NW.hasNoUnsignedWrap(),
552 /*NSW=*/NW.hasNoUnsignedSignedWrap());
553 continue;
554 }
555 if (isa<PHINode>(Val))
556 continue;
557
558 llvm_unreachable("Unexpected instruction type");
559 }
560
561 // Add the incoming values to the PHI nodes.
562 for (Value *Val : Explored) {
563 if (Val == Base)
564 continue;
565 // All the instructions have been created, we can now add edges to the
566 // phi nodes.
567 if (auto *PHI = dyn_cast<PHINode>(Val)) {
568 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
569 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
570 Value *NewIncoming = PHI->getIncomingValue(I);
571
572 auto It = NewInsts.find(NewIncoming);
573 if (It != NewInsts.end())
574 NewIncoming = It->second;
575
576 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
577 }
578 }
579 }
580
581 for (Value *Val : Explored) {
582 if (Val == Base)
583 continue;
584
585 setInsertionPoint(Builder, Val, false);
586 // Create GEP for external users.
587 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
588 Val->getName() + ".ptr", NW);
589 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
590 // Add old instruction to worklist for DCE. We don't directly remove it
591 // here because the original compare is one of the users.
593 }
594
595 return NewInsts[Start];
596}
597
598/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
599/// We can look through PHIs, GEPs and casts in order to determine a common base
600/// between GEPLHS and RHS.
603 const DataLayout &DL,
604 InstCombiner &IC) {
605 // FIXME: Support vector of pointers.
606 if (GEPLHS->getType()->isVectorTy())
607 return nullptr;
608
609 if (!GEPLHS->hasAllConstantIndices())
610 return nullptr;
611
612 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
613 Value *PtrBase =
615 /*AllowNonInbounds*/ false);
616
617 // Bail if we looked through addrspacecast.
618 if (PtrBase->getType() != GEPLHS->getType())
619 return nullptr;
620
621 // The set of nodes that will take part in this transformation.
622 SetVector<Value *> Nodes;
623 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
624 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
625 return nullptr;
626
627 // We know we can re-write this as
628 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
629 // Since we've only looked through inbouds GEPs we know that we
630 // can't have overflow on either side. We can therefore re-write
631 // this as:
632 // OFFSET1 cmp OFFSET2
633 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
634
635 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
636 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
637 // offset. Since Index is the offset of LHS to the base pointer, we will now
638 // compare the offsets instead of comparing the pointers.
640 IC.Builder.getInt(Offset), NewRHS);
641}
642
643/// Fold comparisons between a GEP instruction and something else. At this point
644/// we know that the GEP is on the LHS of the comparison.
647 // Don't transform signed compares of GEPs into index compares. Even if the
648 // GEP is inbounds, the final add of the base pointer can have signed overflow
649 // and would change the result of the icmp.
650 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
651 // the maximum signed value for the pointer type.
653 return nullptr;
654
655 // Look through bitcasts and addrspacecasts. We do not however want to remove
656 // 0 GEPs.
657 if (!isa<GetElementPtrInst>(RHS))
658 RHS = RHS->stripPointerCasts();
659
660 auto CanFold = [Cond](GEPNoWrapFlags NW) {
662 return true;
663
664 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
666 return NW != GEPNoWrapFlags::none();
667 };
668
669 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
670 if (!NW.hasNoUnsignedWrap()) {
671 // Convert signed to unsigned comparison.
672 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
673 }
674
675 auto *I = new ICmpInst(Cond, Op1, Op2);
676 I->setSameSign(NW.hasNoUnsignedSignedWrap());
677 return I;
678 };
679
681 if (Base.Ptr == RHS && CanFold(Base.LHSNW) && !Base.isExpensive()) {
682 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
683 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
684 Value *Offset =
685 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEPs=*/true);
686 return NewICmp(Base.LHSNW, Offset,
687 Constant::getNullValue(Offset->getType()));
688 }
689
690 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
691 isa<Constant>(RHS) && cast<Constant>(RHS)->isNullValue() &&
692 !NullPointerIsDefined(I.getFunction(),
693 RHS->getType()->getPointerAddressSpace())) {
694 // For most address spaces, an allocation can't be placed at null, but null
695 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
696 // the only valid inbounds address derived from null, is null itself.
697 // Thus, we have four cases to consider:
698 // 1) Base == nullptr, Offset == 0 -> inbounds, null
699 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
700 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
701 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
702 //
703 // (Note if we're indexing a type of size 0, that simply collapses into one
704 // of the buckets above.)
705 //
706 // In general, we're allowed to make values less poison (i.e. remove
707 // sources of full UB), so in this case, we just select between the two
708 // non-poison cases (1 and 4 above).
709 //
710 // For vectors, we apply the same reasoning on a per-lane basis.
711 auto *Base = GEPLHS->getPointerOperand();
712 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
713 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
714 Base = Builder.CreateVectorSplat(EC, Base);
715 }
716 return new ICmpInst(Cond, Base,
718 cast<Constant>(RHS), Base->getType()));
719 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
720 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
721
722 // If the base pointers are different, but the indices are the same, just
723 // compare the base pointer.
724 if (GEPLHS->getOperand(0) != GEPRHS->getOperand(0)) {
725 bool IndicesTheSame =
726 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
727 GEPLHS->getPointerOperand()->getType() ==
728 GEPRHS->getPointerOperand()->getType() &&
729 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
730 if (IndicesTheSame)
731 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
732 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
733 IndicesTheSame = false;
734 break;
735 }
736
737 // If all indices are the same, just compare the base pointers.
738 Type *BaseType = GEPLHS->getOperand(0)->getType();
739 if (IndicesTheSame &&
740 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
741 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
742
743 // If we're comparing GEPs with two base pointers that only differ in type
744 // and both GEPs have only constant indices or just one use, then fold
745 // the compare with the adjusted indices.
746 // FIXME: Support vector of pointers.
747 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
748 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
749 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
750 GEPLHS->getOperand(0)->stripPointerCasts() ==
751 GEPRHS->getOperand(0)->stripPointerCasts() &&
752 !GEPLHS->getType()->isVectorTy()) {
753 Value *LOffset = EmitGEPOffset(GEPLHS);
754 Value *ROffset = EmitGEPOffset(GEPRHS);
755
756 // If we looked through an addrspacecast between different sized address
757 // spaces, the LHS and RHS pointers are different sized
758 // integers. Truncate to the smaller one.
759 Type *LHSIndexTy = LOffset->getType();
760 Type *RHSIndexTy = ROffset->getType();
761 if (LHSIndexTy != RHSIndexTy) {
762 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
763 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
764 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
765 } else
766 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
767 }
768
770 LOffset, ROffset);
771 return replaceInstUsesWith(I, Cmp);
772 }
773 }
774
775 if (GEPLHS->getOperand(0) == GEPRHS->getOperand(0) &&
776 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
777 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
778 // If the GEPs only differ by one index, compare it.
779 unsigned NumDifferences = 0; // Keep track of # differences.
780 unsigned DiffOperand = 0; // The operand that differs.
781 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
782 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
783 Type *LHSType = GEPLHS->getOperand(i)->getType();
784 Type *RHSType = GEPRHS->getOperand(i)->getType();
785 // FIXME: Better support for vector of pointers.
786 if (LHSType->getPrimitiveSizeInBits() !=
787 RHSType->getPrimitiveSizeInBits() ||
788 (GEPLHS->getType()->isVectorTy() &&
789 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
790 // Irreconcilable differences.
791 NumDifferences = 2;
792 break;
793 }
794
795 if (NumDifferences++)
796 break;
797 DiffOperand = i;
798 }
799
800 if (NumDifferences == 0) // SAME GEP?
801 return replaceInstUsesWith(
802 I, // No comparison is needed here.
803 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
804 // If two GEPs only differ by an index, compare them.
805 // Note that nowrap flags are always needed when comparing two indices.
806 else if (NumDifferences == 1 && NW != GEPNoWrapFlags::none()) {
807 Value *LHSV = GEPLHS->getOperand(DiffOperand);
808 Value *RHSV = GEPRHS->getOperand(DiffOperand);
809 return NewICmp(NW, LHSV, RHSV);
810 }
811 }
812
813 if (Base.Ptr && CanFold(Base.LHSNW & Base.RHSNW) && !Base.isExpensive()) {
814 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
815 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
816 Value *L =
817 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEP=*/true);
818 Value *R =
819 EmitGEPOffsets(Base.RHSGEPs, Base.RHSNW, IdxTy, /*RewriteGEP=*/true);
820 return NewICmp(Base.LHSNW & Base.RHSNW, L, R);
821 }
822 }
823
824 // Try convert this to an indexed compare by looking through PHIs/casts as a
825 // last resort.
826 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
827}
828
830 // It would be tempting to fold away comparisons between allocas and any
831 // pointer not based on that alloca (e.g. an argument). However, even
832 // though such pointers cannot alias, they can still compare equal.
833 //
834 // But LLVM doesn't specify where allocas get their memory, so if the alloca
835 // doesn't escape we can argue that it's impossible to guess its value, and we
836 // can therefore act as if any such guesses are wrong.
837 //
838 // However, we need to ensure that this folding is consistent: We can't fold
839 // one comparison to false, and then leave a different comparison against the
840 // same value alone (as it might evaluate to true at runtime, leading to a
841 // contradiction). As such, this code ensures that all comparisons are folded
842 // at the same time, and there are no other escapes.
843
844 struct CmpCaptureTracker : public CaptureTracker {
845 AllocaInst *Alloca;
846 bool Captured = false;
847 /// The value of the map is a bit mask of which icmp operands the alloca is
848 /// used in.
850
851 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
852
853 void tooManyUses() override { Captured = true; }
854
855 Action captured(const Use *U, UseCaptureInfo CI) override {
856 // TODO(captures): Use UseCaptureInfo.
857 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
858 // We need to check that U is based *only* on the alloca, and doesn't
859 // have other contributions from a select/phi operand.
860 // TODO: We could check whether getUnderlyingObjects() reduces to one
861 // object, which would allow looking through phi nodes.
862 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
863 // Collect equality icmps of the alloca, and don't treat them as
864 // captures.
865 ICmps[ICmp] |= 1u << U->getOperandNo();
866 return Continue;
867 }
868
869 Captured = true;
870 return Stop;
871 }
872 };
873
874 CmpCaptureTracker Tracker(Alloca);
875 PointerMayBeCaptured(Alloca, &Tracker);
876 if (Tracker.Captured)
877 return false;
878
879 bool Changed = false;
880 for (auto [ICmp, Operands] : Tracker.ICmps) {
881 switch (Operands) {
882 case 1:
883 case 2: {
884 // The alloca is only used in one icmp operand. Assume that the
885 // equality is false.
886 auto *Res = ConstantInt::get(ICmp->getType(),
887 ICmp->getPredicate() == ICmpInst::ICMP_NE);
888 replaceInstUsesWith(*ICmp, Res);
890 Changed = true;
891 break;
892 }
893 case 3:
894 // Both icmp operands are based on the alloca, so this is comparing
895 // pointer offsets, without leaking any information about the address
896 // of the alloca. Ignore such comparisons.
897 break;
898 default:
899 llvm_unreachable("Cannot happen");
900 }
901 }
902
903 return Changed;
904}
905
906/// Fold "icmp pred (X+C), X".
908 CmpPredicate Pred) {
909 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
910 // so the values can never be equal. Similarly for all other "or equals"
911 // operators.
912 assert(!!C && "C should not be zero!");
913
914 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
915 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
916 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
917 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
918 Constant *R =
919 ConstantInt::get(X->getType(), APInt::getMaxValue(C.getBitWidth()) - C);
920 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
921 }
922
923 // (X+1) >u X --> X <u (0-1) --> X != 255
924 // (X+2) >u X --> X <u (0-2) --> X <u 254
925 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
926 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
927 return new ICmpInst(ICmpInst::ICMP_ULT, X,
928 ConstantInt::get(X->getType(), -C));
929
930 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
931
932 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
933 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
934 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
935 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
936 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
937 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
938 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
939 return new ICmpInst(ICmpInst::ICMP_SGT, X,
940 ConstantInt::get(X->getType(), SMax - C));
941
942 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
943 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
944 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
945 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
946 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
947 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
948
949 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
950 return new ICmpInst(ICmpInst::ICMP_SLT, X,
951 ConstantInt::get(X->getType(), SMax - (C - 1)));
952}
953
954/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
955/// (icmp eq/ne A, Log2(AP2/AP1)) ->
956/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
958 const APInt &AP1,
959 const APInt &AP2) {
960 assert(I.isEquality() && "Cannot fold icmp gt/lt");
961
962 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
963 if (I.getPredicate() == I.ICMP_NE)
964 Pred = CmpInst::getInversePredicate(Pred);
965 return new ICmpInst(Pred, LHS, RHS);
966 };
967
968 // Don't bother doing any work for cases which InstSimplify handles.
969 if (AP2.isZero())
970 return nullptr;
971
972 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
973 if (IsAShr) {
974 if (AP2.isAllOnes())
975 return nullptr;
976 if (AP2.isNegative() != AP1.isNegative())
977 return nullptr;
978 if (AP2.sgt(AP1))
979 return nullptr;
980 }
981
982 if (!AP1)
983 // 'A' must be large enough to shift out the highest set bit.
984 return getICmp(I.ICMP_UGT, A,
985 ConstantInt::get(A->getType(), AP2.logBase2()));
986
987 if (AP1 == AP2)
988 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
989
990 int Shift;
991 if (IsAShr && AP1.isNegative())
992 Shift = AP1.countl_one() - AP2.countl_one();
993 else
994 Shift = AP1.countl_zero() - AP2.countl_zero();
995
996 if (Shift > 0) {
997 if (IsAShr && AP1 == AP2.ashr(Shift)) {
998 // There are multiple solutions if we are comparing against -1 and the LHS
999 // of the ashr is not a power of two.
1000 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1001 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1002 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1003 } else if (AP1 == AP2.lshr(Shift)) {
1004 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1005 }
1006 }
1007
1008 // Shifting const2 will never be equal to const1.
1009 // FIXME: This should always be handled by InstSimplify?
1010 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1011 return replaceInstUsesWith(I, TorF);
1012}
1013
1014/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1015/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1017 const APInt &AP1,
1018 const APInt &AP2) {
1019 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1020
1021 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1022 if (I.getPredicate() == I.ICMP_NE)
1023 Pred = CmpInst::getInversePredicate(Pred);
1024 return new ICmpInst(Pred, LHS, RHS);
1025 };
1026
1027 // Don't bother doing any work for cases which InstSimplify handles.
1028 if (AP2.isZero())
1029 return nullptr;
1030
1031 unsigned AP2TrailingZeros = AP2.countr_zero();
1032
1033 if (!AP1 && AP2TrailingZeros != 0)
1034 return getICmp(
1035 I.ICMP_UGE, A,
1036 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1037
1038 if (AP1 == AP2)
1039 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1040
1041 // Get the distance between the lowest bits that are set.
1042 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1043
1044 if (Shift > 0 && AP2.shl(Shift) == AP1)
1045 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1046
1047 // Shifting const2 will never be equal to const1.
1048 // FIXME: This should always be handled by InstSimplify?
1049 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1050 return replaceInstUsesWith(I, TorF);
1051}
1052
1053/// The caller has matched a pattern of the form:
1054/// I = icmp ugt (add (add A, B), CI2), CI1
1055/// If this is of the form:
1056/// sum = a + b
1057/// if (sum+128 >u 255)
1058/// Then replace it with llvm.sadd.with.overflow.i8.
1059///
1061 ConstantInt *CI2, ConstantInt *CI1,
1062 InstCombinerImpl &IC) {
1063 // The transformation we're trying to do here is to transform this into an
1064 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1065 // with a narrower add, and discard the add-with-constant that is part of the
1066 // range check (if we can't eliminate it, this isn't profitable).
1067
1068 // In order to eliminate the add-with-constant, the compare can be its only
1069 // use.
1070 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1071 if (!AddWithCst->hasOneUse())
1072 return nullptr;
1073
1074 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1075 if (!CI2->getValue().isPowerOf2())
1076 return nullptr;
1077 unsigned NewWidth = CI2->getValue().countr_zero();
1078 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1079 return nullptr;
1080
1081 // The width of the new add formed is 1 more than the bias.
1082 ++NewWidth;
1083
1084 // Check to see that CI1 is an all-ones value with NewWidth bits.
1085 if (CI1->getBitWidth() == NewWidth ||
1086 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1087 return nullptr;
1088
1089 // This is only really a signed overflow check if the inputs have been
1090 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1091 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1092 if (IC.ComputeMaxSignificantBits(A, &I) > NewWidth ||
1093 IC.ComputeMaxSignificantBits(B, &I) > NewWidth)
1094 return nullptr;
1095
1096 // In order to replace the original add with a narrower
1097 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1098 // and truncates that discard the high bits of the add. Verify that this is
1099 // the case.
1100 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1101 for (User *U : OrigAdd->users()) {
1102 if (U == AddWithCst)
1103 continue;
1104
1105 // Only accept truncates for now. We would really like a nice recursive
1106 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1107 // chain to see which bits of a value are actually demanded. If the
1108 // original add had another add which was then immediately truncated, we
1109 // could still do the transformation.
1111 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1112 return nullptr;
1113 }
1114
1115 // If the pattern matches, truncate the inputs to the narrower type and
1116 // use the sadd_with_overflow intrinsic to efficiently compute both the
1117 // result and the overflow bit.
1118 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1120 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1121
1122 InstCombiner::BuilderTy &Builder = IC.Builder;
1123
1124 // Put the new code above the original add, in case there are any uses of the
1125 // add between the add and the compare.
1126 Builder.SetInsertPoint(OrigAdd);
1127
1128 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1129 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1130 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1131 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1132 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1133
1134 // The inner add was the result of the narrow add, zero extended to the
1135 // wider type. Replace it with the result computed by the intrinsic.
1136 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1137 IC.eraseInstFromFunction(*OrigAdd);
1138
1139 // The original icmp gets replaced with the overflow value.
1140 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1141}
1142
1143/// If we have:
1144/// icmp eq/ne (urem/srem %x, %y), 0
1145/// iff %y is a power-of-two, we can replace this with a bit test:
1146/// icmp eq/ne (and %x, (add %y, -1)), 0
1148 // This fold is only valid for equality predicates.
1149 if (!I.isEquality())
1150 return nullptr;
1151 CmpPredicate Pred;
1152 Value *X, *Y, *Zero;
1153 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1154 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1155 return nullptr;
1156 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
1157 return nullptr;
1158 // This may increase instruction count, we don't enforce that Y is a constant.
1159 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1160 Value *Masked = Builder.CreateAnd(X, Mask);
1161 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1162}
1163
1164/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1165/// by one-less-than-bitwidth into a sign test on the original value.
1167 Instruction *Val;
1168 CmpPredicate Pred;
1169 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1170 return nullptr;
1171
1172 Value *X;
1173 Type *XTy;
1174
1175 Constant *C;
1176 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1177 XTy = X->getType();
1178 unsigned XBitWidth = XTy->getScalarSizeInBits();
1180 APInt(XBitWidth, XBitWidth - 1))))
1181 return nullptr;
1182 } else if (isa<BinaryOperator>(Val) &&
1184 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1185 /*AnalyzeForSignBitExtraction=*/true))) {
1186 XTy = X->getType();
1187 } else
1188 return nullptr;
1189
1190 return ICmpInst::Create(Instruction::ICmp,
1194}
1195
1196// Handle icmp pred X, 0
1198 CmpInst::Predicate Pred = Cmp.getPredicate();
1199 if (!match(Cmp.getOperand(1), m_Zero()))
1200 return nullptr;
1201
1202 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1203 if (Pred == ICmpInst::ICMP_SGT) {
1204 Value *A, *B;
1205 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1206 if (isKnownPositive(A, SQ.getWithInstruction(&Cmp)))
1207 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1208 if (isKnownPositive(B, SQ.getWithInstruction(&Cmp)))
1209 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1210 }
1211 }
1212
1214 return New;
1215
1216 // Given:
1217 // icmp eq/ne (urem %x, %y), 0
1218 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1219 // icmp eq/ne %x, 0
1220 Value *X, *Y;
1221 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1222 ICmpInst::isEquality(Pred)) {
1223 KnownBits XKnown = computeKnownBits(X, &Cmp);
1224 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1225 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1226 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1227 }
1228
1229 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1230 // odd/non-zero/there is no overflow.
1231 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1232 ICmpInst::isEquality(Pred)) {
1233
1234 KnownBits XKnown = computeKnownBits(X, &Cmp);
1235 // if X % 2 != 0
1236 // (icmp eq/ne Y)
1237 if (XKnown.countMaxTrailingZeros() == 0)
1238 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1239
1240 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1241 // if Y % 2 != 0
1242 // (icmp eq/ne X)
1243 if (YKnown.countMaxTrailingZeros() == 0)
1244 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1245
1246 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1247 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1248 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1249 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1250 // but to avoid unnecessary work, first just if this is an obvious case.
1251
1252 // if X non-zero and NoOverflow(X * Y)
1253 // (icmp eq/ne Y)
1254 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1255 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1256
1257 // if Y non-zero and NoOverflow(X * Y)
1258 // (icmp eq/ne X)
1259 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1260 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1261 }
1262 // Note, we are skipping cases:
1263 // if Y % 2 != 0 AND X % 2 != 0
1264 // (false/true)
1265 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1266 // (false/true)
1267 // Those can be simplified later as we would have already replaced the (icmp
1268 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1269 // will fold to a constant elsewhere.
1270 }
1271
1272 // (icmp eq/ne f(X), 0) -> (icmp eq/ne X, 0)
1273 // where f(X) == 0 if and only if X == 0
1274 if (ICmpInst::isEquality(Pred))
1275 if (Value *Stripped = stripNullTest(Cmp.getOperand(0)))
1276 return new ICmpInst(Pred, Stripped,
1277 Constant::getNullValue(Stripped->getType()));
1278
1279 return nullptr;
1280}
1281
1282/// Fold icmp eq (num + mask) & ~mask, num
1283/// to
1284/// icmp eq (and num, mask), 0
1285/// Where mask is a low bit mask.
1287 Value *Num;
1288 CmpPredicate Pred;
1289 const APInt *Mask, *Neg;
1290
1291 if (!match(&Cmp,
1292 m_c_ICmp(Pred, m_Value(Num),
1294 m_LowBitMask(Mask))),
1295 m_APInt(Neg))))))
1296 return nullptr;
1297
1298 if (*Neg != ~*Mask)
1299 return nullptr;
1300
1301 if (!ICmpInst::isEquality(Pred))
1302 return nullptr;
1303
1304 // Create new icmp eq (num & mask), 0
1305 auto *NewAnd = Builder.CreateAnd(Num, *Mask);
1306 auto *Zero = Constant::getNullValue(Num->getType());
1307
1308 return new ICmpInst(Pred, NewAnd, Zero);
1309}
1310
1311/// Fold icmp Pred X, C.
1312/// TODO: This code structure does not make sense. The saturating add fold
1313/// should be moved to some other helper and extended as noted below (it is also
1314/// possible that code has been made unnecessary - do we canonicalize IR to
1315/// overflow/saturating intrinsics or not?).
1317 // Match the following pattern, which is a common idiom when writing
1318 // overflow-safe integer arithmetic functions. The source performs an addition
1319 // in wider type and explicitly checks for overflow using comparisons against
1320 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1321 //
1322 // TODO: This could probably be generalized to handle other overflow-safe
1323 // operations if we worked out the formulas to compute the appropriate magic
1324 // constants.
1325 //
1326 // sum = a + b
1327 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1328 CmpInst::Predicate Pred = Cmp.getPredicate();
1329 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1330 Value *A, *B;
1331 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1332 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1333 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1334 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1335 return Res;
1336
1337 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1339 if (!C)
1340 return nullptr;
1341
1342 if (auto *Phi = dyn_cast<PHINode>(Op0))
1343 if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) {
1345 for (Value *V : Phi->incoming_values()) {
1346 Constant *Res =
1348 if (!Res)
1349 return nullptr;
1350 Ops.push_back(Res);
1351 }
1352 Builder.SetInsertPoint(Phi);
1353 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1354 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1355 NewPhi->addIncoming(V, Pred);
1356 return replaceInstUsesWith(Cmp, NewPhi);
1357 }
1358
1360 return R;
1361
1362 return nullptr;
1363}
1364
1365/// Canonicalize icmp instructions based on dominating conditions.
1367 // We already checked simple implication in InstSimplify, only handle complex
1368 // cases here.
1369 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1370 const APInt *C;
1371 if (!match(Y, m_APInt(C)))
1372 return nullptr;
1373
1374 CmpInst::Predicate Pred = Cmp.getPredicate();
1376
1377 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1378 const APInt *DomC) -> Instruction * {
1379 // We have 2 compares of a variable with constants. Calculate the constant
1380 // ranges of those compares to see if we can transform the 2nd compare:
1381 // DomBB:
1382 // DomCond = icmp DomPred X, DomC
1383 // br DomCond, CmpBB, FalseBB
1384 // CmpBB:
1385 // Cmp = icmp Pred X, C
1386 ConstantRange DominatingCR =
1387 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1388 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1389 ConstantRange Difference = DominatingCR.difference(CR);
1390 if (Intersection.isEmptySet())
1391 return replaceInstUsesWith(Cmp, Builder.getFalse());
1392 if (Difference.isEmptySet())
1393 return replaceInstUsesWith(Cmp, Builder.getTrue());
1394
1395 // Canonicalizing a sign bit comparison that gets used in a branch,
1396 // pessimizes codegen by generating branch on zero instruction instead
1397 // of a test and branch. So we avoid canonicalizing in such situations
1398 // because test and branch instruction has better branch displacement
1399 // than compare and branch instruction.
1400 bool UnusedBit;
1401 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1402 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1403 return nullptr;
1404
1405 // Avoid an infinite loop with min/max canonicalization.
1406 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1407 if (Cmp.hasOneUse() &&
1408 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1409 return nullptr;
1410
1411 if (const APInt *EqC = Intersection.getSingleElement())
1412 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1413 if (const APInt *NeC = Difference.getSingleElement())
1414 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1415 return nullptr;
1416 };
1417
1418 for (BranchInst *BI : DC.conditionsFor(X)) {
1419 CmpPredicate DomPred;
1420 const APInt *DomC;
1421 if (!match(BI->getCondition(),
1422 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1423 continue;
1424
1425 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1426 if (DT.dominates(Edge0, Cmp.getParent())) {
1427 if (auto *V = handleDomCond(DomPred, DomC))
1428 return V;
1429 } else {
1430 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1431 if (DT.dominates(Edge1, Cmp.getParent()))
1432 if (auto *V =
1433 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1434 return V;
1435 }
1436 }
1437
1438 return nullptr;
1439}
1440
1441/// Fold icmp (trunc X), C.
1443 TruncInst *Trunc,
1444 const APInt &C) {
1445 ICmpInst::Predicate Pred = Cmp.getPredicate();
1446 Value *X = Trunc->getOperand(0);
1447 Type *SrcTy = X->getType();
1448 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1449 SrcBits = SrcTy->getScalarSizeInBits();
1450
1451 // Match (icmp pred (trunc nuw/nsw X), C)
1452 // Which we can convert to (icmp pred X, (sext/zext C))
1453 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1454 if (Trunc->hasNoSignedWrap())
1455 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1456 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1457 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1458 }
1459
1460 if (C.isOne() && C.getBitWidth() > 1) {
1461 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1462 Value *V = nullptr;
1463 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1464 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1465 ConstantInt::get(V->getType(), 1));
1466 }
1467
1468 // TODO: Handle any shifted constant by subtracting trailing zeros.
1469 // TODO: Handle non-equality predicates.
1470 Value *Y;
1471 if (Cmp.isEquality() && match(X, m_Shl(m_One(), m_Value(Y)))) {
1472 // (trunc (1 << Y) to iN) == 0 --> Y u>= N
1473 // (trunc (1 << Y) to iN) != 0 --> Y u< N
1474 if (C.isZero()) {
1475 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1476 return new ICmpInst(NewPred, Y, ConstantInt::get(SrcTy, DstBits));
1477 }
1478 // (trunc (1 << Y) to iN) == 2**C --> Y == C
1479 // (trunc (1 << Y) to iN) != 2**C --> Y != C
1480 if (C.isPowerOf2())
1481 return new ICmpInst(Pred, Y, ConstantInt::get(SrcTy, C.logBase2()));
1482 }
1483
1484 if (Cmp.isEquality() && Trunc->hasOneUse()) {
1485 // Canonicalize to a mask and wider compare if the wide type is suitable:
1486 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1487 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1488 Constant *Mask =
1489 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1490 Value *And = Builder.CreateAnd(X, Mask);
1491 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1492 return new ICmpInst(Pred, And, WideC);
1493 }
1494
1495 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1496 // of the high bits truncated out of x are known.
1497 KnownBits Known = computeKnownBits(X, &Cmp);
1498
1499 // If all the high bits are known, we can do this xform.
1500 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1501 // Pull in the high bits from known-ones set.
1502 APInt NewRHS = C.zext(SrcBits);
1503 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1504 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1505 }
1506 }
1507
1508 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1509 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1510 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1511 Value *ShOp;
1512 uint64_t ShAmt;
1513 bool TrueIfSigned;
1514 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1515 match(X, m_Shr(m_Value(ShOp), m_ConstantInt(ShAmt))) &&
1516 DstBits == SrcBits - ShAmt) {
1517 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1519 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1521 }
1522
1523 return nullptr;
1524}
1525
1526/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1527/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1530 const SimplifyQuery &Q) {
1531 Value *X, *Y;
1532 CmpPredicate Pred;
1533 bool YIsSExt = false;
1534 // Try to match icmp (trunc X), (trunc Y)
1535 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1536 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1537 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1538 if (Cmp.isSigned()) {
1539 // For signed comparisons, both truncs must be nsw.
1540 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1541 return nullptr;
1542 } else {
1543 // For unsigned and equality comparisons, either both must be nuw or
1544 // both must be nsw, we don't care which.
1545 if (!NoWrapFlags)
1546 return nullptr;
1547 }
1548
1549 if (X->getType() != Y->getType() &&
1550 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1551 return nullptr;
1552 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1553 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1554 std::swap(X, Y);
1555 Pred = Cmp.getSwappedPredicate(Pred);
1556 }
1557 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1558 }
1559 // Try to match icmp (trunc nuw X), (zext Y)
1560 else if (!Cmp.isSigned() &&
1561 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1562 m_OneUse(m_ZExt(m_Value(Y)))))) {
1563 // Can fold trunc nuw + zext for unsigned and equality predicates.
1564 }
1565 // Try to match icmp (trunc nsw X), (sext Y)
1566 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1568 // Can fold trunc nsw + zext/sext for all predicates.
1569 YIsSExt =
1570 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1571 } else
1572 return nullptr;
1573
1574 Type *TruncTy = Cmp.getOperand(0)->getType();
1575 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1576
1577 // If this transform will end up changing from desirable types -> undesirable
1578 // types skip it.
1579 if (isDesirableIntType(TruncBits) &&
1580 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1581 return nullptr;
1582
1583 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1584 return new ICmpInst(Pred, X, NewY);
1585}
1586
1587/// Fold icmp (xor X, Y), C.
1590 const APInt &C) {
1591 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1592 return I;
1593
1594 Value *X = Xor->getOperand(0);
1595 Value *Y = Xor->getOperand(1);
1596 const APInt *XorC;
1597 if (!match(Y, m_APInt(XorC)))
1598 return nullptr;
1599
1600 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1601 // fold the xor.
1602 ICmpInst::Predicate Pred = Cmp.getPredicate();
1603 bool TrueIfSigned = false;
1604 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1605
1606 // If the sign bit of the XorCst is not set, there is no change to
1607 // the operation, just stop using the Xor.
1608 if (!XorC->isNegative())
1609 return replaceOperand(Cmp, 0, X);
1610
1611 // Emit the opposite comparison.
1612 if (TrueIfSigned)
1613 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1614 ConstantInt::getAllOnesValue(X->getType()));
1615 else
1616 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1617 ConstantInt::getNullValue(X->getType()));
1618 }
1619
1620 if (Xor->hasOneUse()) {
1621 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1622 if (!Cmp.isEquality() && XorC->isSignMask()) {
1623 Pred = Cmp.getFlippedSignednessPredicate();
1624 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1625 }
1626
1627 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1628 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1629 Pred = Cmp.getFlippedSignednessPredicate();
1630 Pred = Cmp.getSwappedPredicate(Pred);
1631 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1632 }
1633 }
1634
1635 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1636 if (Pred == ICmpInst::ICMP_UGT) {
1637 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1638 if (*XorC == ~C && (C + 1).isPowerOf2())
1639 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1640 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1641 if (*XorC == C && (C + 1).isPowerOf2())
1642 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1643 }
1644 if (Pred == ICmpInst::ICMP_ULT) {
1645 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1646 if (*XorC == -C && C.isPowerOf2())
1647 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1648 ConstantInt::get(X->getType(), ~C));
1649 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1650 if (*XorC == C && (-C).isPowerOf2())
1651 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1652 ConstantInt::get(X->getType(), ~C));
1653 }
1654 return nullptr;
1655}
1656
1657/// For power-of-2 C:
1658/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1659/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1662 const APInt &C) {
1663 CmpInst::Predicate Pred = Cmp.getPredicate();
1664 APInt PowerOf2;
1665 if (Pred == ICmpInst::ICMP_ULT)
1666 PowerOf2 = C;
1667 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1668 PowerOf2 = C + 1;
1669 else
1670 return nullptr;
1671 if (!PowerOf2.isPowerOf2())
1672 return nullptr;
1673 Value *X;
1674 const APInt *ShiftC;
1676 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1677 return nullptr;
1678 uint64_t Shift = ShiftC->getLimitedValue();
1679 Type *XType = X->getType();
1680 if (Shift == 0 || PowerOf2.isMinSignedValue())
1681 return nullptr;
1682 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1683 APInt Bound =
1684 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1685 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1686}
1687
1688/// Fold icmp (and (sh X, Y), C2), C1.
1691 const APInt &C1,
1692 const APInt &C2) {
1693 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1694 if (!Shift || !Shift->isShift())
1695 return nullptr;
1696
1697 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1698 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1699 // code produced by the clang front-end, for bitfield access.
1700 // This seemingly simple opportunity to fold away a shift turns out to be
1701 // rather complicated. See PR17827 for details.
1702 unsigned ShiftOpcode = Shift->getOpcode();
1703 bool IsShl = ShiftOpcode == Instruction::Shl;
1704 const APInt *C3;
1705 if (match(Shift->getOperand(1), m_APInt(C3))) {
1706 APInt NewAndCst, NewCmpCst;
1707 bool AnyCmpCstBitsShiftedOut;
1708 if (ShiftOpcode == Instruction::Shl) {
1709 // For a left shift, we can fold if the comparison is not signed. We can
1710 // also fold a signed comparison if the mask value and comparison value
1711 // are not negative. These constraints may not be obvious, but we can
1712 // prove that they are correct using an SMT solver.
1713 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1714 return nullptr;
1715
1716 NewCmpCst = C1.lshr(*C3);
1717 NewAndCst = C2.lshr(*C3);
1718 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1719 } else if (ShiftOpcode == Instruction::LShr) {
1720 // For a logical right shift, we can fold if the comparison is not signed.
1721 // We can also fold a signed comparison if the shifted mask value and the
1722 // shifted comparison value are not negative. These constraints may not be
1723 // obvious, but we can prove that they are correct using an SMT solver.
1724 NewCmpCst = C1.shl(*C3);
1725 NewAndCst = C2.shl(*C3);
1726 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1727 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1728 return nullptr;
1729 } else {
1730 // For an arithmetic shift, check that both constants don't use (in a
1731 // signed sense) the top bits being shifted out.
1732 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1733 NewCmpCst = C1.shl(*C3);
1734 NewAndCst = C2.shl(*C3);
1735 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1736 if (NewAndCst.ashr(*C3) != C2)
1737 return nullptr;
1738 }
1739
1740 if (AnyCmpCstBitsShiftedOut) {
1741 // If we shifted bits out, the fold is not going to work out. As a
1742 // special case, check to see if this means that the result is always
1743 // true or false now.
1744 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1745 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1746 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1747 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1748 } else {
1749 Value *NewAnd = Builder.CreateAnd(
1750 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1751 return new ICmpInst(Cmp.getPredicate(), NewAnd,
1752 ConstantInt::get(And->getType(), NewCmpCst));
1753 }
1754 }
1755
1756 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1757 // preferable because it allows the C2 << Y expression to be hoisted out of a
1758 // loop if Y is invariant and X is not.
1759 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1760 !Shift->isArithmeticShift() &&
1761 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1762 // Compute C2 << Y.
1763 Value *NewShift =
1764 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1765 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1766
1767 // Compute X & (C2 << Y).
1768 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1769 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1770 }
1771
1772 return nullptr;
1773}
1774
1775/// Fold icmp (and X, C2), C1.
1778 const APInt &C1) {
1779 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1780
1781 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1782 // TODO: We canonicalize to the longer form for scalars because we have
1783 // better analysis/folds for icmp, and codegen may be better with icmp.
1784 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1785 match(And->getOperand(1), m_One()))
1786 return new TruncInst(And->getOperand(0), Cmp.getType());
1787
1788 const APInt *C2;
1789 Value *X;
1790 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1791 return nullptr;
1792
1793 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1794 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1795 C2->isNegatedPowerOf2())
1796 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1797 ConstantInt::get(X->getType(), ~*C2));
1798 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1799 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1800 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1801 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1802 ConstantInt::get(X->getType(), -*C2));
1803
1804 // Don't perform the following transforms if the AND has multiple uses
1805 if (!And->hasOneUse())
1806 return nullptr;
1807
1808 if (Cmp.isEquality() && C1.isZero()) {
1809 // Restrict this fold to single-use 'and' (PR10267).
1810 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1811 if (C2->isSignMask()) {
1812 Constant *Zero = Constant::getNullValue(X->getType());
1813 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1814 return new ICmpInst(NewPred, X, Zero);
1815 }
1816
1817 APInt NewC2 = *C2;
1818 KnownBits Know = computeKnownBits(And->getOperand(0), And);
1819 // Set high zeros of C2 to allow matching negated power-of-2.
1820 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1821 Know.countMinLeadingZeros());
1822
1823 // Restrict this fold only for single-use 'and' (PR10267).
1824 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1825 if (NewC2.isNegatedPowerOf2()) {
1826 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1827 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1828 return new ICmpInst(NewPred, X, NegBOC);
1829 }
1830 }
1831
1832 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1833 // the input width without changing the value produced, eliminate the cast:
1834 //
1835 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1836 //
1837 // We can do this transformation if the constants do not have their sign bits
1838 // set or if it is an equality comparison. Extending a relational comparison
1839 // when we're checking the sign bit would not work.
1840 Value *W;
1841 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1842 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1843 // TODO: Is this a good transform for vectors? Wider types may reduce
1844 // throughput. Should this transform be limited (even for scalars) by using
1845 // shouldChangeType()?
1846 if (!Cmp.getType()->isVectorTy()) {
1847 Type *WideType = W->getType();
1848 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1849 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1850 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1851 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1852 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1853 }
1854 }
1855
1856 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1857 return I;
1858
1859 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1860 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1861 //
1862 // iff pred isn't signed
1863 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1864 match(And->getOperand(1), m_One())) {
1865 Constant *One = cast<Constant>(And->getOperand(1));
1866 Value *Or = And->getOperand(0);
1867 Value *A, *B, *LShr;
1868 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1869 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1870 unsigned UsesRemoved = 0;
1871 if (And->hasOneUse())
1872 ++UsesRemoved;
1873 if (Or->hasOneUse())
1874 ++UsesRemoved;
1875 if (LShr->hasOneUse())
1876 ++UsesRemoved;
1877
1878 // Compute A & ((1 << B) | 1)
1879 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1880 if (UsesRemoved >= RequireUsesRemoved) {
1881 Value *NewOr =
1882 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1883 /*HasNUW=*/true),
1884 One, Or->getName());
1885 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1886 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1887 }
1888 }
1889 }
1890
1891 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1892 // llvm.is.fpclass(X, fcInf|fcNan)
1893 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1894 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1895 // (icmp eq (and (bitcast X to int), ExponentMask), 0) -->
1896 // llvm.is.fpclass(X, fcSubnormal|fcZero)
1897 // (icmp ne (and (bitcast X to int), ExponentMask), 0) -->
1898 // llvm.is.fpclass(X, ~(fcSubnormal|fcZero))
1899 Value *V;
1900 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1901 Attribute::NoImplicitFloat) &&
1902 Cmp.isEquality() &&
1904 Type *FPType = V->getType()->getScalarType();
1905 if (FPType->isIEEELikeFPTy() && (C1.isZero() || C1 == *C2)) {
1906 APInt ExponentMask =
1907 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1908 if (*C2 == ExponentMask) {
1909 unsigned Mask = C1.isZero()
1912 if (isICMP_NE)
1913 Mask = ~Mask & fcAllFlags;
1914 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1915 }
1916 }
1917 }
1918
1919 return nullptr;
1920}
1921
1922/// Fold icmp (and X, Y), C.
1925 const APInt &C) {
1926 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1927 return I;
1928
1929 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1930 bool TrueIfNeg;
1931 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1932 // ((X - 1) & ~X) < 0 --> X == 0
1933 // ((X - 1) & ~X) >= 0 --> X != 0
1934 Value *X;
1935 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1936 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1937 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1938 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1939 }
1940 // (X & -X) < 0 --> X == MinSignedC
1941 // (X & -X) > -1 --> X != MinSignedC
1942 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1943 Constant *MinSignedC = ConstantInt::get(
1944 X->getType(),
1945 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1946 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1947 return new ICmpInst(NewPred, X, MinSignedC);
1948 }
1949 }
1950
1951 // TODO: These all require that Y is constant too, so refactor with the above.
1952
1953 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1954 Value *X = And->getOperand(0);
1955 Value *Y = And->getOperand(1);
1956 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1957 if (auto *LI = dyn_cast<LoadInst>(X))
1958 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1959 if (Instruction *Res = foldCmpLoadFromIndexedGlobal(LI, GEP, Cmp, C2))
1960 return Res;
1961
1962 if (!Cmp.isEquality())
1963 return nullptr;
1964
1965 // X & -C == -C -> X > u ~C
1966 // X & -C != -C -> X <= u ~C
1967 // iff C is a power of 2
1968 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1969 auto NewPred =
1971 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1972 }
1973
1974 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1975 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1976 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1977 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1979 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1980 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1981 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1982 Value *And = Builder.CreateAnd(TruncY, X);
1984 }
1985 return BinaryOperator::CreateAnd(TruncY, X);
1986 }
1987
1988 // (icmp eq/ne (and (shl -1, X), Y), 0)
1989 // -> (icmp eq/ne (lshr Y, X), 0)
1990 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1991 // highly unlikely the non-zero case will ever show up in code.
1992 if (C.isZero() &&
1994 m_Value(Y))))) {
1995 Value *LShr = Builder.CreateLShr(Y, X);
1996 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
1997 }
1998
1999 // (icmp eq/ne (and (add A, Addend), Msk), C)
2000 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2001 {
2002 Value *A;
2003 const APInt *Addend, *Msk;
2004 if (match(And, m_And(m_OneUse(m_Add(m_Value(A), m_APInt(Addend))),
2005 m_LowBitMask(Msk))) &&
2006 C.ule(*Msk)) {
2007 APInt NewComperand = (C - *Addend) & *Msk;
2008 Value *MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2009 return new ICmpInst(Pred, MaskA,
2010 ConstantInt::get(MaskA->getType(), NewComperand));
2011 }
2012 }
2013
2014 return nullptr;
2015}
2016
2017/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2019 InstCombiner::BuilderTy &Builder) {
2020 // Are we using xors or subs to bitwise check for a pair or pairs of
2021 // (in)equalities? Convert to a shorter form that has more potential to be
2022 // folded even further.
2023 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2024 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2025 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2026 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2027 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2028 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2030 SmallVector<Value *, 16> WorkList(1, Or);
2031
2032 while (!WorkList.empty()) {
2033 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2034 Value *Lhs, *Rhs;
2035
2036 if (match(OrOperatorArgument,
2037 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2038 CmpValues.emplace_back(Lhs, Rhs);
2039 return;
2040 }
2041
2042 if (match(OrOperatorArgument,
2043 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2044 CmpValues.emplace_back(Lhs, Rhs);
2045 return;
2046 }
2047
2048 WorkList.push_back(OrOperatorArgument);
2049 };
2050
2051 Value *CurrentValue = WorkList.pop_back_val();
2052 Value *OrOperatorLhs, *OrOperatorRhs;
2053
2054 if (!match(CurrentValue,
2055 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2056 return nullptr;
2057 }
2058
2059 MatchOrOperatorArgument(OrOperatorRhs);
2060 MatchOrOperatorArgument(OrOperatorLhs);
2061 }
2062
2063 ICmpInst::Predicate Pred = Cmp.getPredicate();
2064 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2065 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2066 CmpValues.rbegin()->second);
2067
2068 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2069 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2070 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2071 }
2072
2073 return LhsCmp;
2074}
2075
2076/// Fold icmp (or X, Y), C.
2079 const APInt &C) {
2080 ICmpInst::Predicate Pred = Cmp.getPredicate();
2081 if (C.isOne()) {
2082 // icmp slt signum(V) 1 --> icmp slt V, 1
2083 Value *V = nullptr;
2084 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2085 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2086 ConstantInt::get(V->getType(), 1));
2087 }
2088
2089 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2090
2091 // (icmp eq/ne (or disjoint x, C0), C1)
2092 // -> (icmp eq/ne x, C0^C1)
2093 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2094 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2095 Value *NewC =
2096 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2097 return new ICmpInst(Pred, OrOp0, NewC);
2098 }
2099
2100 const APInt *MaskC;
2101 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2102 if (*MaskC == C && (C + 1).isPowerOf2()) {
2103 // X | C == C --> X <=u C
2104 // X | C != C --> X >u C
2105 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2107 return new ICmpInst(Pred, OrOp0, OrOp1);
2108 }
2109
2110 // More general: canonicalize 'equality with set bits mask' to
2111 // 'equality with clear bits mask'.
2112 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2113 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2114 if (Or->hasOneUse()) {
2115 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2116 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2117 return new ICmpInst(Pred, And, NewC);
2118 }
2119 }
2120
2121 // (X | (X-1)) s< 0 --> X s< 1
2122 // (X | (X-1)) s> -1 --> X s> 0
2123 Value *X;
2124 bool TrueIfSigned;
2125 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2127 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2128 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2129 return new ICmpInst(NewPred, X, NewC);
2130 }
2131
2132 const APInt *OrC;
2133 // icmp(X | OrC, C) --> icmp(X, 0)
2134 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2135 switch (Pred) {
2136 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2137 case ICmpInst::ICMP_SLT:
2138 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2139 case ICmpInst::ICMP_SGE:
2140 if (OrC->sge(C))
2141 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2142 break;
2143 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2144 case ICmpInst::ICMP_SLE:
2145 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2146 case ICmpInst::ICMP_SGT:
2147 if (OrC->sgt(C))
2149 ConstantInt::getNullValue(X->getType()));
2150 break;
2151 default:
2152 break;
2153 }
2154 }
2155
2156 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2157 return nullptr;
2158
2159 Value *P, *Q;
2161 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2162 // -> and (icmp eq P, null), (icmp eq Q, null).
2163 Value *CmpP =
2164 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2165 Value *CmpQ =
2166 Builder.CreateICmp(Pred, Q, ConstantInt::getNullValue(Q->getType()));
2167 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2168 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2169 }
2170
2171 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2172 return replaceInstUsesWith(Cmp, V);
2173
2174 return nullptr;
2175}
2176
2177/// Fold icmp (mul X, Y), C.
2180 const APInt &C) {
2181 ICmpInst::Predicate Pred = Cmp.getPredicate();
2182 Type *MulTy = Mul->getType();
2183 Value *X = Mul->getOperand(0);
2184
2185 // If there's no overflow:
2186 // X * X == 0 --> X == 0
2187 // X * X != 0 --> X != 0
2188 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2189 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2190 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2191
2192 const APInt *MulC;
2193 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2194 return nullptr;
2195
2196 // If this is a test of the sign bit and the multiply is sign-preserving with
2197 // a constant operand, use the multiply LHS operand instead:
2198 // (X * +MulC) < 0 --> X < 0
2199 // (X * -MulC) < 0 --> X > 0
2200 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2201 if (MulC->isNegative())
2202 Pred = ICmpInst::getSwappedPredicate(Pred);
2203 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2204 }
2205
2206 if (MulC->isZero())
2207 return nullptr;
2208
2209 // If the multiply does not wrap or the constant is odd, try to divide the
2210 // compare constant by the multiplication factor.
2211 if (Cmp.isEquality()) {
2212 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2213 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2214 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2215 return new ICmpInst(Pred, X, NewC);
2216 }
2217
2218 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2219 // correct to transform if MulC * N == C including overflow. I.e with i8
2220 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2221 // miss that case.
2222 if (C.urem(*MulC).isZero()) {
2223 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2224 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2225 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2226 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2227 return new ICmpInst(Pred, X, NewC);
2228 }
2229 }
2230 }
2231
2232 // With a matching no-overflow guarantee, fold the constants:
2233 // (X * MulC) < C --> X < (C / MulC)
2234 // (X * MulC) > C --> X > (C / MulC)
2235 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2236 Constant *NewC = nullptr;
2237 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2238 // MININT / -1 --> overflow.
2239 if (C.isMinSignedValue() && MulC->isAllOnes())
2240 return nullptr;
2241 if (MulC->isNegative())
2242 Pred = ICmpInst::getSwappedPredicate(Pred);
2243
2244 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2245 NewC = ConstantInt::get(
2247 } else {
2248 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2249 "Unexpected predicate");
2250 NewC = ConstantInt::get(
2252 }
2253 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2254 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2255 NewC = ConstantInt::get(
2257 } else {
2258 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2259 "Unexpected predicate");
2260 NewC = ConstantInt::get(
2262 }
2263 }
2264
2265 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2266}
2267
2268/// Fold icmp (shl nuw C2, Y), C.
2270 const APInt &C) {
2271 Value *Y;
2272 const APInt *C2;
2273 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2274 return nullptr;
2275
2276 Type *ShiftType = Shl->getType();
2277 unsigned TypeBits = C.getBitWidth();
2278 ICmpInst::Predicate Pred = Cmp.getPredicate();
2279 if (Cmp.isUnsigned()) {
2280 if (C2->isZero() || C2->ugt(C))
2281 return nullptr;
2282 APInt Div, Rem;
2283 APInt::udivrem(C, *C2, Div, Rem);
2284 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2285
2286 // (1 << Y) pred C -> Y pred Log2(C)
2287 if (!CIsPowerOf2) {
2288 // (1 << Y) < 30 -> Y <= 4
2289 // (1 << Y) <= 30 -> Y <= 4
2290 // (1 << Y) >= 30 -> Y > 4
2291 // (1 << Y) > 30 -> Y > 4
2292 if (Pred == ICmpInst::ICMP_ULT)
2293 Pred = ICmpInst::ICMP_ULE;
2294 else if (Pred == ICmpInst::ICMP_UGE)
2295 Pred = ICmpInst::ICMP_UGT;
2296 }
2297
2298 unsigned CLog2 = Div.logBase2();
2299 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2300 } else if (Cmp.isSigned() && C2->isOne()) {
2301 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2302 // (1 << Y) > 0 -> Y != 31
2303 // (1 << Y) > C -> Y != 31 if C is negative.
2304 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2305 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2306
2307 // (1 << Y) < 0 -> Y == 31
2308 // (1 << Y) < 1 -> Y == 31
2309 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2310 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2311 if (Pred == ICmpInst::ICMP_SLT && (C - 1).sle(0))
2312 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2313 }
2314
2315 return nullptr;
2316}
2317
2318/// Fold icmp (shl X, Y), C.
2320 BinaryOperator *Shl,
2321 const APInt &C) {
2322 const APInt *ShiftVal;
2323 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2324 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2325
2326 ICmpInst::Predicate Pred = Cmp.getPredicate();
2327 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2328 // -> (icmp pred X, Csle0)
2329 //
2330 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2331 // so X's must be what is used.
2332 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2333 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2334
2335 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2336 // -> (icmp eq/ne X, 0)
2337 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2338 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2339 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2340
2341 // (icmp slt (shl nsw X, Y), 0/1)
2342 // -> (icmp slt X, 0/1)
2343 // (icmp sgt (shl nsw X, Y), 0/-1)
2344 // -> (icmp sgt X, 0/-1)
2345 //
2346 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2347 if (Shl->hasNoSignedWrap() &&
2348 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2349 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2350 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2351
2352 const APInt *ShiftAmt;
2353 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2354 return foldICmpShlLHSC(Cmp, Shl, C);
2355
2356 // Check that the shift amount is in range. If not, don't perform undefined
2357 // shifts. When the shift is visited, it will be simplified.
2358 unsigned TypeBits = C.getBitWidth();
2359 if (ShiftAmt->uge(TypeBits))
2360 return nullptr;
2361
2362 Value *X = Shl->getOperand(0);
2363 Type *ShType = Shl->getType();
2364
2365 // NSW guarantees that we are only shifting out sign bits from the high bits,
2366 // so we can ASHR the compare constant without needing a mask and eliminate
2367 // the shift.
2368 if (Shl->hasNoSignedWrap()) {
2369 if (Pred == ICmpInst::ICMP_SGT) {
2370 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2371 APInt ShiftedC = C.ashr(*ShiftAmt);
2372 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2373 }
2374 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2375 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2376 APInt ShiftedC = C.ashr(*ShiftAmt);
2377 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2378 }
2379 if (Pred == ICmpInst::ICMP_SLT) {
2380 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2381 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2382 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2383 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2384 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2385 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2386 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2387 }
2388 }
2389
2390 // NUW guarantees that we are only shifting out zero bits from the high bits,
2391 // so we can LSHR the compare constant without needing a mask and eliminate
2392 // the shift.
2393 if (Shl->hasNoUnsignedWrap()) {
2394 if (Pred == ICmpInst::ICMP_UGT) {
2395 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2396 APInt ShiftedC = C.lshr(*ShiftAmt);
2397 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2398 }
2399 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2400 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2401 APInt ShiftedC = C.lshr(*ShiftAmt);
2402 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2403 }
2404 if (Pred == ICmpInst::ICMP_ULT) {
2405 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2406 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2407 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2408 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2409 assert(C.ugt(0) && "ult 0 should have been eliminated");
2410 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2411 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2412 }
2413 }
2414
2415 if (Cmp.isEquality() && Shl->hasOneUse()) {
2416 // Strength-reduce the shift into an 'and'.
2417 Constant *Mask = ConstantInt::get(
2418 ShType,
2419 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2420 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2421 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2422 return new ICmpInst(Pred, And, LShrC);
2423 }
2424
2425 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2426 bool TrueIfSigned = false;
2427 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2428 // (X << 31) <s 0 --> (X & 1) != 0
2429 Constant *Mask = ConstantInt::get(
2430 ShType,
2431 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2432 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2433 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2434 And, Constant::getNullValue(ShType));
2435 }
2436
2437 // Simplify 'shl' inequality test into 'and' equality test.
2438 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2439 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2440 if ((C + 1).isPowerOf2() &&
2441 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2442 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2443 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2445 And, Constant::getNullValue(ShType));
2446 }
2447 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2448 if (C.isPowerOf2() &&
2449 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2450 Value *And =
2451 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2452 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2454 And, Constant::getNullValue(ShType));
2455 }
2456 }
2457
2458 // Transform (icmp pred iM (shl iM %v, N), C)
2459 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2460 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2461 // This enables us to get rid of the shift in favor of a trunc that may be
2462 // free on the target. It has the additional benefit of comparing to a
2463 // smaller constant that may be more target-friendly.
2464 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2465 if (Shl->hasOneUse() && Amt != 0 &&
2466 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2467 ICmpInst::Predicate CmpPred = Pred;
2468 APInt RHSC = C;
2469
2470 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2471 // Try the flipped strictness predicate.
2472 // e.g.:
2473 // icmp ult i64 (shl X, 32), 8589934593 ->
2474 // icmp ule i64 (shl X, 32), 8589934592 ->
2475 // icmp ule i32 (trunc X, i32), 2 ->
2476 // icmp ult i32 (trunc X, i32), 3
2477 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2478 Pred, ConstantInt::get(ShType->getContext(), C))) {
2479 CmpPred = FlippedStrictness->first;
2480 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2481 }
2482 }
2483
2484 if (RHSC.countr_zero() >= Amt) {
2485 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2486 Constant *NewC =
2487 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2488 return new ICmpInst(CmpPred,
2489 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2490 Shl->hasNoSignedWrap()),
2491 NewC);
2492 }
2493 }
2494
2495 return nullptr;
2496}
2497
2498/// Fold icmp ({al}shr X, Y), C.
2500 BinaryOperator *Shr,
2501 const APInt &C) {
2502 // An exact shr only shifts out zero bits, so:
2503 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2504 Value *X = Shr->getOperand(0);
2505 CmpInst::Predicate Pred = Cmp.getPredicate();
2506 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2507 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2508
2509 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2510 const APInt *ShiftValC;
2511 if (match(X, m_APInt(ShiftValC))) {
2512 if (Cmp.isEquality())
2513 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2514
2515 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2516 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2517 bool TrueIfSigned;
2518 if (!IsAShr && ShiftValC->isNegative() &&
2519 isSignBitCheck(Pred, C, TrueIfSigned))
2520 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2521 Shr->getOperand(1),
2522 ConstantInt::getNullValue(X->getType()));
2523
2524 // If the shifted constant is a power-of-2, test the shift amount directly:
2525 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2526 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2527 if (!IsAShr && ShiftValC->isPowerOf2() &&
2528 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2529 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2530 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2531 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2532
2533 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2534 unsigned ShiftLZ = ShiftValC->countl_zero();
2535 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2536 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2537 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2538 }
2539 }
2540
2541 const APInt *ShiftAmtC;
2542 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2543 return nullptr;
2544
2545 // Check that the shift amount is in range. If not, don't perform undefined
2546 // shifts. When the shift is visited it will be simplified.
2547 unsigned TypeBits = C.getBitWidth();
2548 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2549 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2550 return nullptr;
2551
2552 bool IsExact = Shr->isExact();
2553 Type *ShrTy = Shr->getType();
2554 // TODO: If we could guarantee that InstSimplify would handle all of the
2555 // constant-value-based preconditions in the folds below, then we could assert
2556 // those conditions rather than checking them. This is difficult because of
2557 // undef/poison (PR34838).
2558 if (IsAShr && Shr->hasOneUse()) {
2559 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2560 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2561 // When C - 1 is a power of two and the transform can be legally
2562 // performed, prefer this form so the produced constant is close to a
2563 // power of two.
2564 // icmp slt/ult (ashr exact X, ShAmtC), C
2565 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2566 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2567 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2568 }
2569 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2570 // When ShAmtC can be shifted losslessly:
2571 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2572 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2573 APInt ShiftedC = C.shl(ShAmtVal);
2574 if (ShiftedC.ashr(ShAmtVal) == C)
2575 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2576 }
2577 if (Pred == CmpInst::ICMP_SGT) {
2578 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2579 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2580 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2581 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2582 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2583 }
2584 if (Pred == CmpInst::ICMP_UGT) {
2585 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2586 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2587 // clause accounts for that pattern.
2588 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2589 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2590 (C + 1).shl(ShAmtVal).isMinSignedValue())
2591 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2592 }
2593
2594 // If the compare constant has significant bits above the lowest sign-bit,
2595 // then convert an unsigned cmp to a test of the sign-bit:
2596 // (ashr X, ShiftC) u> C --> X s< 0
2597 // (ashr X, ShiftC) u< C --> X s> -1
2598 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2599 if (Pred == CmpInst::ICMP_UGT) {
2600 return new ICmpInst(CmpInst::ICMP_SLT, X,
2602 }
2603 if (Pred == CmpInst::ICMP_ULT) {
2604 return new ICmpInst(CmpInst::ICMP_SGT, X,
2606 }
2607 }
2608 } else if (!IsAShr) {
2609 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2610 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2611 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2612 APInt ShiftedC = C.shl(ShAmtVal);
2613 if (ShiftedC.lshr(ShAmtVal) == C)
2614 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2615 }
2616 if (Pred == CmpInst::ICMP_UGT) {
2617 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2618 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2619 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2620 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2621 }
2622 }
2623
2624 if (!Cmp.isEquality())
2625 return nullptr;
2626
2627 // Handle equality comparisons of shift-by-constant.
2628
2629 // If the comparison constant changes with the shift, the comparison cannot
2630 // succeed (bits of the comparison constant cannot match the shifted value).
2631 // This should be known by InstSimplify and already be folded to true/false.
2632 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2633 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2634 "Expected icmp+shr simplify did not occur.");
2635
2636 // If the bits shifted out are known zero, compare the unshifted value:
2637 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2638 if (Shr->isExact())
2639 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2640
2641 if (C.isZero()) {
2642 // == 0 is u< 1.
2643 if (Pred == CmpInst::ICMP_EQ)
2644 return new ICmpInst(CmpInst::ICMP_ULT, X,
2645 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal)));
2646 else
2647 return new ICmpInst(CmpInst::ICMP_UGT, X,
2648 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal) - 1));
2649 }
2650
2651 if (Shr->hasOneUse()) {
2652 // Canonicalize the shift into an 'and':
2653 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2654 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2655 Constant *Mask = ConstantInt::get(ShrTy, Val);
2656 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2657 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2658 }
2659
2660 return nullptr;
2661}
2662
2664 BinaryOperator *SRem,
2665 const APInt &C) {
2666 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2667 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2668 // Canonicalize unsigned predicates to signed:
2669 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2670 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2671 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2672 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2673
2674 const APInt *DivisorC;
2675 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2676 return nullptr;
2677
2678 APInt NormalizedC = C;
2679 if (Pred == ICmpInst::ICMP_ULT) {
2680 assert(!NormalizedC.isZero() &&
2681 "ult X, 0 should have been simplified already.");
2682 --NormalizedC;
2683 }
2684 if (C.isNegative())
2685 NormalizedC.flipAllBits();
2686 assert(!DivisorC->isZero() &&
2687 "srem X, 0 should have been simplified already.");
2688 if (!NormalizedC.uge(DivisorC->abs() - 1))
2689 return nullptr;
2690
2691 Type *Ty = SRem->getType();
2692 if (Pred == ICmpInst::ICMP_UGT)
2693 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2695 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2697 }
2698 // Match an 'is positive' or 'is negative' comparison of remainder by a
2699 // constant power-of-2 value:
2700 // (X % pow2C) sgt/slt 0
2701 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2702 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2703 return nullptr;
2704
2705 // TODO: The one-use check is standard because we do not typically want to
2706 // create longer instruction sequences, but this might be a special-case
2707 // because srem is not good for analysis or codegen.
2708 if (!SRem->hasOneUse())
2709 return nullptr;
2710
2711 const APInt *DivisorC;
2712 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2713 return nullptr;
2714
2715 // For cmp_sgt/cmp_slt only zero valued C is handled.
2716 // For cmp_eq/cmp_ne only positive valued C is handled.
2717 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2718 !C.isZero()) ||
2719 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2720 !C.isStrictlyPositive()))
2721 return nullptr;
2722
2723 // Mask off the sign bit and the modulo bits (low-bits).
2724 Type *Ty = SRem->getType();
2725 APInt SignMask = APInt::getSignMask(Ty->getScalarSizeInBits());
2726 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2727 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2728
2729 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2730 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2731
2732 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2733 // bit is set. Example:
2734 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2735 if (Pred == ICmpInst::ICMP_SGT)
2737
2738 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2739 // bit is set. Example:
2740 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2741 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2742}
2743
2744/// Fold icmp (udiv X, Y), C.
2746 BinaryOperator *UDiv,
2747 const APInt &C) {
2748 ICmpInst::Predicate Pred = Cmp.getPredicate();
2749 Value *X = UDiv->getOperand(0);
2750 Value *Y = UDiv->getOperand(1);
2751 Type *Ty = UDiv->getType();
2752
2753 const APInt *C2;
2754 if (!match(X, m_APInt(C2)))
2755 return nullptr;
2756
2757 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2758
2759 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2760 if (Pred == ICmpInst::ICMP_UGT) {
2761 assert(!C.isMaxValue() &&
2762 "icmp ugt X, UINT_MAX should have been simplified already.");
2763 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2764 ConstantInt::get(Ty, C2->udiv(C + 1)));
2765 }
2766
2767 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2768 if (Pred == ICmpInst::ICMP_ULT) {
2769 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2770 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2771 ConstantInt::get(Ty, C2->udiv(C)));
2772 }
2773
2774 return nullptr;
2775}
2776
2777/// Fold icmp ({su}div X, Y), C.
2779 BinaryOperator *Div,
2780 const APInt &C) {
2781 ICmpInst::Predicate Pred = Cmp.getPredicate();
2782 Value *X = Div->getOperand(0);
2783 Value *Y = Div->getOperand(1);
2784 Type *Ty = Div->getType();
2785 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2786
2787 // If unsigned division and the compare constant is bigger than
2788 // UMAX/2 (negative), there's only one pair of values that satisfies an
2789 // equality check, so eliminate the division:
2790 // (X u/ Y) == C --> (X == C) && (Y == 1)
2791 // (X u/ Y) != C --> (X != C) || (Y != 1)
2792 // Similarly, if signed division and the compare constant is exactly SMIN:
2793 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2794 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2795 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2796 (!DivIsSigned || C.isMinSignedValue())) {
2797 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2798 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2799 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2800 return BinaryOperator::Create(Logic, XBig, YOne);
2801 }
2802
2803 // Fold: icmp pred ([us]div X, C2), C -> range test
2804 // Fold this div into the comparison, producing a range check.
2805 // Determine, based on the divide type, what the range is being
2806 // checked. If there is an overflow on the low or high side, remember
2807 // it, otherwise compute the range [low, hi) bounding the new value.
2808 // See: InsertRangeTest above for the kinds of replacements possible.
2809 const APInt *C2;
2810 if (!match(Y, m_APInt(C2)))
2811 return nullptr;
2812
2813 // FIXME: If the operand types don't match the type of the divide
2814 // then don't attempt this transform. The code below doesn't have the
2815 // logic to deal with a signed divide and an unsigned compare (and
2816 // vice versa). This is because (x /s C2) <s C produces different
2817 // results than (x /s C2) <u C or (x /u C2) <s C or even
2818 // (x /u C2) <u C. Simply casting the operands and result won't
2819 // work. :( The if statement below tests that condition and bails
2820 // if it finds it.
2821 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2822 return nullptr;
2823
2824 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2825 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2826 // division-by-constant cases should be present, we can not assert that they
2827 // have happened before we reach this icmp instruction.
2828 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2829 return nullptr;
2830
2831 // Compute Prod = C * C2. We are essentially solving an equation of
2832 // form X / C2 = C. We solve for X by multiplying C2 and C.
2833 // By solving for X, we can turn this into a range check instead of computing
2834 // a divide.
2835 APInt Prod = C * *C2;
2836
2837 // Determine if the product overflows by seeing if the product is not equal to
2838 // the divide. Make sure we do the same kind of divide as in the LHS
2839 // instruction that we're folding.
2840 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2841
2842 // If the division is known to be exact, then there is no remainder from the
2843 // divide, so the covered range size is unit, otherwise it is the divisor.
2844 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2845
2846 // Figure out the interval that is being checked. For example, a comparison
2847 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2848 // Compute this interval based on the constants involved and the signedness of
2849 // the compare/divide. This computes a half-open interval, keeping track of
2850 // whether either value in the interval overflows. After analysis each
2851 // overflow variable is set to 0 if it's corresponding bound variable is valid
2852 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2853 int LoOverflow = 0, HiOverflow = 0;
2854 APInt LoBound, HiBound;
2855
2856 if (!DivIsSigned) { // udiv
2857 // e.g. X/5 op 3 --> [15, 20)
2858 LoBound = Prod;
2859 HiOverflow = LoOverflow = ProdOV;
2860 if (!HiOverflow) {
2861 // If this is not an exact divide, then many values in the range collapse
2862 // to the same result value.
2863 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2864 }
2865 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2866 if (C.isZero()) { // (X / pos) op 0
2867 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2868 LoBound = -(RangeSize - 1);
2869 HiBound = RangeSize;
2870 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2871 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2872 HiOverflow = LoOverflow = ProdOV;
2873 if (!HiOverflow)
2874 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2875 } else { // (X / pos) op neg
2876 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2877 HiBound = Prod + 1;
2878 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2879 if (!LoOverflow) {
2880 APInt DivNeg = -RangeSize;
2881 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2882 }
2883 }
2884 } else if (C2->isNegative()) { // Divisor is < 0.
2885 if (Div->isExact())
2886 RangeSize.negate();
2887 if (C.isZero()) { // (X / neg) op 0
2888 // e.g. X/-5 op 0 --> [-4, 5)
2889 LoBound = RangeSize + 1;
2890 HiBound = -RangeSize;
2891 if (HiBound == *C2) { // -INTMIN = INTMIN
2892 HiOverflow = 1; // [INTMIN+1, overflow)
2893 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2894 }
2895 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2896 // e.g. X/-5 op 3 --> [-19, -14)
2897 HiBound = Prod + 1;
2898 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2899 if (!LoOverflow)
2900 LoOverflow =
2901 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2902 } else { // (X / neg) op neg
2903 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2904 LoOverflow = HiOverflow = ProdOV;
2905 if (!HiOverflow)
2906 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2907 }
2908
2909 // Dividing by a negative swaps the condition. LT <-> GT
2910 Pred = ICmpInst::getSwappedPredicate(Pred);
2911 }
2912
2913 switch (Pred) {
2914 default:
2915 llvm_unreachable("Unhandled icmp predicate!");
2916 case ICmpInst::ICMP_EQ:
2917 if (LoOverflow && HiOverflow)
2918 return replaceInstUsesWith(Cmp, Builder.getFalse());
2919 if (HiOverflow)
2920 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2921 X, ConstantInt::get(Ty, LoBound));
2922 if (LoOverflow)
2923 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2924 X, ConstantInt::get(Ty, HiBound));
2925 return replaceInstUsesWith(
2926 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2927 case ICmpInst::ICMP_NE:
2928 if (LoOverflow && HiOverflow)
2929 return replaceInstUsesWith(Cmp, Builder.getTrue());
2930 if (HiOverflow)
2931 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2932 X, ConstantInt::get(Ty, LoBound));
2933 if (LoOverflow)
2934 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2935 X, ConstantInt::get(Ty, HiBound));
2936 return replaceInstUsesWith(
2937 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2938 case ICmpInst::ICMP_ULT:
2939 case ICmpInst::ICMP_SLT:
2940 if (LoOverflow == +1) // Low bound is greater than input range.
2941 return replaceInstUsesWith(Cmp, Builder.getTrue());
2942 if (LoOverflow == -1) // Low bound is less than input range.
2943 return replaceInstUsesWith(Cmp, Builder.getFalse());
2944 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2945 case ICmpInst::ICMP_UGT:
2946 case ICmpInst::ICMP_SGT:
2947 if (HiOverflow == +1) // High bound greater than input range.
2948 return replaceInstUsesWith(Cmp, Builder.getFalse());
2949 if (HiOverflow == -1) // High bound less than input range.
2950 return replaceInstUsesWith(Cmp, Builder.getTrue());
2951 if (Pred == ICmpInst::ICMP_UGT)
2952 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2953 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2954 }
2955
2956 return nullptr;
2957}
2958
2959/// Fold icmp (sub X, Y), C.
2962 const APInt &C) {
2963 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2964 ICmpInst::Predicate Pred = Cmp.getPredicate();
2965 Type *Ty = Sub->getType();
2966
2967 // (SubC - Y) == C) --> Y == (SubC - C)
2968 // (SubC - Y) != C) --> Y != (SubC - C)
2969 Constant *SubC;
2970 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2971 return new ICmpInst(Pred, Y,
2972 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2973 }
2974
2975 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2976 const APInt *C2;
2977 APInt SubResult;
2978 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2979 bool HasNSW = Sub->hasNoSignedWrap();
2980 bool HasNUW = Sub->hasNoUnsignedWrap();
2981 if (match(X, m_APInt(C2)) &&
2982 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2983 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2984 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2985
2986 // X - Y == 0 --> X == Y.
2987 // X - Y != 0 --> X != Y.
2988 // TODO: We allow this with multiple uses as long as the other uses are not
2989 // in phis. The phi use check is guarding against a codegen regression
2990 // for a loop test. If the backend could undo this (and possibly
2991 // subsequent transforms), we would not need this hack.
2992 if (Cmp.isEquality() && C.isZero() &&
2993 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2994 return new ICmpInst(Pred, X, Y);
2995
2996 // The following transforms are only worth it if the only user of the subtract
2997 // is the icmp.
2998 // TODO: This is an artificial restriction for all of the transforms below
2999 // that only need a single replacement icmp. Can these use the phi test
3000 // like the transform above here?
3001 if (!Sub->hasOneUse())
3002 return nullptr;
3003
3004 if (Sub->hasNoSignedWrap()) {
3005 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3006 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3007 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3008
3009 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3010 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3011 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3012
3013 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3014 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3015 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3016
3017 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3018 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3019 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3020 }
3021
3022 if (!match(X, m_APInt(C2)))
3023 return nullptr;
3024
3025 // C2 - Y <u C -> (Y | (C - 1)) == C2
3026 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3027 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3028 (*C2 & (C - 1)) == (C - 1))
3029 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3030
3031 // C2 - Y >u C -> (Y | C) != C2
3032 // iff C2 & C == C and C + 1 is a power of 2
3033 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3034 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3035
3036 // We have handled special cases that reduce.
3037 // Canonicalize any remaining sub to add as:
3038 // (C2 - Y) > C --> (Y + ~C2) < ~C
3039 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3040 HasNUW, HasNSW);
3041 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3042}
3043
3044static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3045 Value *Op1, IRBuilderBase &Builder,
3046 bool HasOneUse) {
3047 auto FoldConstant = [&](bool Val) {
3048 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3049 if (Op0->getType()->isVectorTy())
3051 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3052 return Res;
3053 };
3054
3055 switch (Table.to_ulong()) {
3056 case 0: // 0 0 0 0
3057 return FoldConstant(false);
3058 case 1: // 0 0 0 1
3059 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3060 case 2: // 0 0 1 0
3061 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3062 case 3: // 0 0 1 1
3063 return Builder.CreateNot(Op0);
3064 case 4: // 0 1 0 0
3065 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3066 case 5: // 0 1 0 1
3067 return Builder.CreateNot(Op1);
3068 case 6: // 0 1 1 0
3069 return Builder.CreateXor(Op0, Op1);
3070 case 7: // 0 1 1 1
3071 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3072 case 8: // 1 0 0 0
3073 return Builder.CreateAnd(Op0, Op1);
3074 case 9: // 1 0 0 1
3075 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3076 case 10: // 1 0 1 0
3077 return Op1;
3078 case 11: // 1 0 1 1
3079 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3080 case 12: // 1 1 0 0
3081 return Op0;
3082 case 13: // 1 1 0 1
3083 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3084 case 14: // 1 1 1 0
3085 return Builder.CreateOr(Op0, Op1);
3086 case 15: // 1 1 1 1
3087 return FoldConstant(true);
3088 default:
3089 llvm_unreachable("Invalid Operation");
3090 }
3091 return nullptr;
3092}
3093
3095 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3096 Value *A, *B;
3097 Constant *C1, *C2, *C3, *C4;
3098 if (!(match(BO->getOperand(0),
3099 m_Select(m_Value(A), m_Constant(C1), m_Constant(C2)))) ||
3100 !match(BO->getOperand(1),
3101 m_Select(m_Value(B), m_Constant(C3), m_Constant(C4))) ||
3102 Cmp.getType() != A->getType())
3103 return nullptr;
3104
3105 std::bitset<4> Table;
3106 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3107 Constant *L = First ? C1 : C2;
3108 Constant *R = Second ? C3 : C4;
3109 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3110 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3111 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3112 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3113 }
3114 return std::nullopt;
3115 };
3116
3117 for (unsigned I = 0; I < 4; ++I) {
3118 bool First = (I >> 1) & 1;
3119 bool Second = I & 1;
3120 if (auto Res = ComputeTable(First, Second))
3121 Table[I] = *Res;
3122 else
3123 return nullptr;
3124 }
3125
3126 // Synthesize optimal logic.
3127 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3128 return replaceInstUsesWith(Cmp, Cond);
3129 return nullptr;
3130}
3131
3132/// Fold icmp (add X, Y), C.
3135 const APInt &C) {
3136 Value *Y = Add->getOperand(1);
3137 Value *X = Add->getOperand(0);
3138
3139 Value *Op0, *Op1;
3140 Instruction *Ext0, *Ext1;
3141 const CmpInst::Predicate Pred = Cmp.getPredicate();
3142 if (match(Add,
3145 m_ZExtOrSExt(m_Value(Op1))))) &&
3146 Op0->getType()->isIntOrIntVectorTy(1) &&
3147 Op1->getType()->isIntOrIntVectorTy(1)) {
3148 unsigned BW = C.getBitWidth();
3149 std::bitset<4> Table;
3150 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
3151 APInt Res(BW, 0);
3152 if (Op0Val)
3153 Res += APInt(BW, isa<ZExtInst>(Ext0) ? 1 : -1, /*isSigned=*/true);
3154 if (Op1Val)
3155 Res += APInt(BW, isa<ZExtInst>(Ext1) ? 1 : -1, /*isSigned=*/true);
3156 return ICmpInst::compare(Res, C, Pred);
3157 };
3158
3159 Table[0] = ComputeTable(false, false);
3160 Table[1] = ComputeTable(false, true);
3161 Table[2] = ComputeTable(true, false);
3162 Table[3] = ComputeTable(true, true);
3163 if (auto *Cond =
3164 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3165 return replaceInstUsesWith(Cmp, Cond);
3166 }
3167 const APInt *C2;
3168 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3169 return nullptr;
3170
3171 // Fold icmp pred (add X, C2), C.
3172 Type *Ty = Add->getType();
3173
3174 // If the add does not wrap, we can always adjust the compare by subtracting
3175 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3176 // are canonicalized to SGT/SLT/UGT/ULT.
3177 if ((Add->hasNoSignedWrap() &&
3178 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT)) ||
3179 (Add->hasNoUnsignedWrap() &&
3180 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT))) {
3181 bool Overflow;
3182 APInt NewC =
3183 Cmp.isSigned() ? C.ssub_ov(*C2, Overflow) : C.usub_ov(*C2, Overflow);
3184 // If there is overflow, the result must be true or false.
3185 // TODO: Can we assert there is no overflow because InstSimplify always
3186 // handles those cases?
3187 if (!Overflow)
3188 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3189 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3190 }
3191
3192 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3193 C.isNonNegative() && (C - *C2).isNonNegative() &&
3194 computeConstantRange(X, /*ForSigned=*/true).add(*C2).isAllNonNegative())
3195 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3196 ConstantInt::get(Ty, C - *C2));
3197
3198 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3199 const APInt &Upper = CR.getUpper();
3200 const APInt &Lower = CR.getLower();
3201 if (Cmp.isSigned()) {
3202 if (Lower.isSignMask())
3203 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3204 if (Upper.isSignMask())
3205 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3206 } else {
3207 if (Lower.isMinValue())
3208 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3209 if (Upper.isMinValue())
3210 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3211 }
3212
3213 // This set of folds is intentionally placed after folds that use no-wrapping
3214 // flags because those folds are likely better for later analysis/codegen.
3215 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3216 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3217
3218 // Fold compare with offset to opposite sign compare if it eliminates offset:
3219 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3220 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3221 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3222
3223 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3224 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3225 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3226
3227 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3228 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3229 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3230
3231 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3232 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3233 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3234
3235 // (X + -1) <u C --> X <=u C (if X is never null)
3236 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3237 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3238 if (llvm::isKnownNonZero(X, Q))
3239 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3240 }
3241
3242 if (!Add->hasOneUse())
3243 return nullptr;
3244
3245 // X+C <u C2 -> (X & -C2) == C
3246 // iff C & (C2-1) == 0
3247 // C2 is a power of 2
3248 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3249 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3251
3252 // X+C2 <u C -> (X & C) == 2C
3253 // iff C == -(C2)
3254 // C2 is a power of 2
3255 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3256 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3257 ConstantInt::get(Ty, C * 2));
3258
3259 // X+C >u C2 -> (X & ~C2) != C
3260 // iff C & C2 == 0
3261 // C2+1 is a power of 2
3262 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3263 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3265
3266 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3267 // to the ult form.
3268 // X+C2 >u C -> X+(C2-C-1) <u ~C
3269 if (Pred == ICmpInst::ICMP_UGT)
3270 return new ICmpInst(ICmpInst::ICMP_ULT,
3271 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3272 ConstantInt::get(Ty, ~C));
3273
3274 // zext(V) + C2 pred C -> V + C3 pred' C4
3275 Value *V;
3276 if (match(X, m_ZExt(m_Value(V)))) {
3277 Type *NewCmpTy = V->getType();
3278 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3279 if (shouldChangeType(Ty, NewCmpTy)) {
3280 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3281 CmpInst::Predicate EquivPred;
3282 APInt EquivInt;
3283 APInt EquivOffset;
3284
3285 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3286 return new ICmpInst(
3287 EquivPred,
3288 EquivOffset.isZero()
3289 ? V
3290 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3291 ConstantInt::get(NewCmpTy, EquivInt));
3292 }
3293 }
3294
3295 return nullptr;
3296}
3297
3299 Value *&RHS, ConstantInt *&Less,
3300 ConstantInt *&Equal,
3301 ConstantInt *&Greater) {
3302 // TODO: Generalize this to work with other comparison idioms or ensure
3303 // they get canonicalized into this form.
3304
3305 // select i1 (a == b),
3306 // i32 Equal,
3307 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3308 // where Equal, Less and Greater are placeholders for any three constants.
3309 CmpPredicate PredA;
3310 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3311 !ICmpInst::isEquality(PredA))
3312 return false;
3313 Value *EqualVal = SI->getTrueValue();
3314 Value *UnequalVal = SI->getFalseValue();
3315 // We still can get non-canonical predicate here, so canonicalize.
3316 if (PredA == ICmpInst::ICMP_NE)
3317 std::swap(EqualVal, UnequalVal);
3318 if (!match(EqualVal, m_ConstantInt(Equal)))
3319 return false;
3320 CmpPredicate PredB;
3321 Value *LHS2, *RHS2;
3322 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3323 m_ConstantInt(Less), m_ConstantInt(Greater))))
3324 return false;
3325 // We can get predicate mismatch here, so canonicalize if possible:
3326 // First, ensure that 'LHS' match.
3327 if (LHS2 != LHS) {
3328 // x sgt y <--> y slt x
3329 std::swap(LHS2, RHS2);
3330 PredB = ICmpInst::getSwappedPredicate(PredB);
3331 }
3332 if (LHS2 != LHS)
3333 return false;
3334 // We also need to canonicalize 'RHS'.
3335 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3336 // x sgt C-1 <--> x sge C <--> not(x slt C)
3337 auto FlippedStrictness =
3339 if (!FlippedStrictness)
3340 return false;
3341 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3342 "basic correctness failure");
3343 RHS2 = FlippedStrictness->second;
3344 // And kind-of perform the result swap.
3345 std::swap(Less, Greater);
3346 PredB = ICmpInst::ICMP_SLT;
3347 }
3348 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3349}
3350
3353 ConstantInt *C) {
3354
3355 assert(C && "Cmp RHS should be a constant int!");
3356 // If we're testing a constant value against the result of a three way
3357 // comparison, the result can be expressed directly in terms of the
3358 // original values being compared. Note: We could possibly be more
3359 // aggressive here and remove the hasOneUse test. The original select is
3360 // really likely to simplify or sink when we remove a test of the result.
3361 Value *OrigLHS, *OrigRHS;
3362 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3363 if (Cmp.hasOneUse() &&
3364 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3365 C3GreaterThan)) {
3366 assert(C1LessThan && C2Equal && C3GreaterThan);
3367
3368 bool TrueWhenLessThan = ICmpInst::compare(
3369 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3370 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3371 Cmp.getPredicate());
3372 bool TrueWhenGreaterThan = ICmpInst::compare(
3373 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3374
3375 // This generates the new instruction that will replace the original Cmp
3376 // Instruction. Instead of enumerating the various combinations when
3377 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3378 // false, we rely on chaining of ORs and future passes of InstCombine to
3379 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3380
3381 // When none of the three constants satisfy the predicate for the RHS (C),
3382 // the entire original Cmp can be simplified to a false.
3383 Value *Cond = Builder.getFalse();
3384 if (TrueWhenLessThan)
3385 Cond = Builder.CreateOr(
3386 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3387 if (TrueWhenEqual)
3388 Cond = Builder.CreateOr(
3389 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3390 if (TrueWhenGreaterThan)
3391 Cond = Builder.CreateOr(
3392 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3393
3394 return replaceInstUsesWith(Cmp, Cond);
3395 }
3396 return nullptr;
3397}
3398
3400 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3401 if (!Bitcast)
3402 return nullptr;
3403
3404 ICmpInst::Predicate Pred = Cmp.getPredicate();
3405 Value *Op1 = Cmp.getOperand(1);
3406 Value *BCSrcOp = Bitcast->getOperand(0);
3407 Type *SrcType = Bitcast->getSrcTy();
3408 Type *DstType = Bitcast->getType();
3409
3410 // Make sure the bitcast doesn't change between scalar and vector and
3411 // doesn't change the number of vector elements.
3412 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3413 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3414 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3415 Value *X;
3416 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3417 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3418 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3419 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3420 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3421 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3422 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3423 match(Op1, m_Zero()))
3424 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3425
3426 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3427 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3428 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3429
3430 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3431 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3432 return new ICmpInst(Pred, X,
3433 ConstantInt::getAllOnesValue(X->getType()));
3434 }
3435
3436 // Zero-equality checks are preserved through unsigned floating-point casts:
3437 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3438 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3439 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3440 if (Cmp.isEquality() && match(Op1, m_Zero()))
3441 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3442
3443 const APInt *C;
3444 bool TrueIfSigned;
3445 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3446 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3447 // the FP extend/truncate because that cast does not change the sign-bit.
3448 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3449 // The sign-bit is always the most significant bit in those types.
3450 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3451 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3452 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3453 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3454 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3455 Type *XType = X->getType();
3456
3457 // We can't currently handle Power style floating point operations here.
3458 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3459 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3460 if (auto *XVTy = dyn_cast<VectorType>(XType))
3461 NewType = VectorType::get(NewType, XVTy->getElementCount());
3462 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3463 if (TrueIfSigned)
3464 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3465 ConstantInt::getNullValue(NewType));
3466 else
3467 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3469 }
3470 }
3471
3472 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3473 Type *FPType = SrcType->getScalarType();
3474 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3475 Attribute::NoImplicitFloat) &&
3476 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3477 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3478 if (Mask & (fcInf | fcZero)) {
3479 if (Pred == ICmpInst::ICMP_NE)
3480 Mask = ~Mask;
3481 return replaceInstUsesWith(Cmp,
3482 Builder.createIsFPClass(BCSrcOp, Mask));
3483 }
3484 }
3485 }
3486 }
3487
3488 const APInt *C;
3489 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3490 !SrcType->isIntOrIntVectorTy())
3491 return nullptr;
3492
3493 // If this is checking if all elements of a vector compare are set or not,
3494 // invert the casted vector equality compare and test if all compare
3495 // elements are clear or not. Compare against zero is generally easier for
3496 // analysis and codegen.
3497 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3498 // Example: are all elements equal? --> are zero elements not equal?
3499 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3500 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3501 if (Value *NotBCSrcOp =
3502 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3503 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3504 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3505 }
3506 }
3507
3508 // If this is checking if all elements of an extended vector are clear or not,
3509 // compare in a narrow type to eliminate the extend:
3510 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3511 Value *X;
3512 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3513 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3514 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3515 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3516 Value *NewCast = Builder.CreateBitCast(X, NewType);
3517 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3518 }
3519 }
3520
3521 // Folding: icmp <pred> iN X, C
3522 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3523 // and C is a splat of a K-bit pattern
3524 // and SC is a constant vector = <C', C', C', ..., C'>
3525 // Into:
3526 // %E = extractelement <M x iK> %vec, i32 C'
3527 // icmp <pred> iK %E, trunc(C)
3528 Value *Vec;
3529 ArrayRef<int> Mask;
3530 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3531 // Check whether every element of Mask is the same constant
3532 if (all_equal(Mask)) {
3533 auto *VecTy = cast<VectorType>(SrcType);
3534 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3535 if (C->isSplat(EltTy->getBitWidth())) {
3536 // Fold the icmp based on the value of C
3537 // If C is M copies of an iK sized bit pattern,
3538 // then:
3539 // => %E = extractelement <N x iK> %vec, i32 Elem
3540 // icmp <pred> iK %SplatVal, <pattern>
3541 Value *Elem = Builder.getInt32(Mask[0]);
3542 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3543 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3544 return new ICmpInst(Pred, Extract, NewC);
3545 }
3546 }
3547 }
3548 return nullptr;
3549}
3550
3551/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3552/// where X is some kind of instruction.
3554 const APInt *C;
3555
3556 if (match(Cmp.getOperand(1), m_APInt(C))) {
3557 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3558 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3559 return I;
3560
3561 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3562 // For now, we only support constant integers while folding the
3563 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3564 // similar to the cases handled by binary ops above.
3565 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3566 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3567 return I;
3568
3569 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3570 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3571 return I;
3572
3573 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3575 return I;
3576
3577 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3578 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3579 // TODO: This checks one-use, but that is not strictly necessary.
3580 Value *Cmp0 = Cmp.getOperand(0);
3581 Value *X, *Y;
3582 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3583 (match(Cmp0,
3585 m_Value(X), m_Value(Y)))) ||
3586 match(Cmp0,
3588 m_Value(X), m_Value(Y))))))
3589 return new ICmpInst(Cmp.getPredicate(), X, Y);
3590 }
3591
3592 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3594
3595 return nullptr;
3596}
3597
3598/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3599/// icmp eq/ne BO, C.
3601 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3602 // TODO: Some of these folds could work with arbitrary constants, but this
3603 // function is limited to scalar and vector splat constants.
3604 if (!Cmp.isEquality())
3605 return nullptr;
3606
3607 ICmpInst::Predicate Pred = Cmp.getPredicate();
3608 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3609 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3610 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3611
3612 switch (BO->getOpcode()) {
3613 case Instruction::SRem:
3614 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3615 if (C.isZero() && BO->hasOneUse()) {
3616 const APInt *BOC;
3617 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3618 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3619 return new ICmpInst(Pred, NewRem,
3621 }
3622 }
3623 break;
3624 case Instruction::Add: {
3625 // (A + C2) == C --> A == (C - C2)
3626 // (A + C2) != C --> A != (C - C2)
3627 // TODO: Remove the one-use limitation? See discussion in D58633.
3628 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3629 if (BO->hasOneUse())
3630 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3631 } else if (C.isZero()) {
3632 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3633 // efficiently invertible, or if the add has just this one use.
3634 if (Value *NegVal = dyn_castNegVal(BOp1))
3635 return new ICmpInst(Pred, BOp0, NegVal);
3636 if (Value *NegVal = dyn_castNegVal(BOp0))
3637 return new ICmpInst(Pred, NegVal, BOp1);
3638 if (BO->hasOneUse()) {
3639 // (add nuw A, B) != 0 -> (or A, B) != 0
3640 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3641 Value *Or = Builder.CreateOr(BOp0, BOp1);
3642 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3643 }
3644 Value *Neg = Builder.CreateNeg(BOp1);
3645 Neg->takeName(BO);
3646 return new ICmpInst(Pred, BOp0, Neg);
3647 }
3648 }
3649 break;
3650 }
3651 case Instruction::Xor:
3652 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3653 // For the xor case, we can xor two constants together, eliminating
3654 // the explicit xor.
3655 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3656 } else if (C.isZero()) {
3657 // Replace ((xor A, B) != 0) with (A != B)
3658 return new ICmpInst(Pred, BOp0, BOp1);
3659 }
3660 break;
3661 case Instruction::Or: {
3662 const APInt *BOC;
3663 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3664 // Comparing if all bits outside of a constant mask are set?
3665 // Replace (X | C) == -1 with (X & ~C) == ~C.
3666 // This removes the -1 constant.
3668 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3669 return new ICmpInst(Pred, And, NotBOC);
3670 }
3671 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3672 // -> (and cond, (icmp eq Other, 0))
3673 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3674 // -> (or cond, (icmp ne Other, 0))
3675 Value *Cond, *TV, *FV, *Other, *Sel;
3676 if (C.isZero() &&
3677 match(BO,
3680 m_Value(FV))),
3681 m_Value(Other)))) &&
3682 Cond->getType() == Cmp.getType()) {
3683 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3684 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3685 if (Pred == ICmpInst::ICMP_EQ
3686 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3687 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3688 Value *Cmp = Builder.CreateICmp(
3689 Pred, Other, Constant::getNullValue(Other->getType()));
3691 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3692 Cond);
3693 }
3694 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3695 // case we need to invert the select condition so we need to be careful to
3696 // avoid creating extra instructions.
3697 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3698 // -> (or (not cond), (icmp ne Other, 0))
3699 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3700 // -> (and (not cond), (icmp eq Other, 0))
3701 //
3702 // Only do this if the inner select has one use, in which case we are
3703 // replacing `select` with `(not cond)`. Otherwise, we will create more
3704 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3705 // cond was freely invertable, the select arms would have been inverted.
3706 if (Sel->hasOneUse() &&
3707 (Pred == ICmpInst::ICMP_EQ
3708 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3709 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3710 Value *NotCond = Builder.CreateNot(Cond);
3711 Value *Cmp = Builder.CreateICmp(
3712 Pred, Other, Constant::getNullValue(Other->getType()));
3714 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3715 NotCond);
3716 }
3717 }
3718 break;
3719 }
3720 case Instruction::UDiv:
3721 case Instruction::SDiv:
3722 if (BO->isExact()) {
3723 // div exact X, Y eq/ne 0 -> X eq/ne 0
3724 // div exact X, Y eq/ne 1 -> X eq/ne Y
3725 // div exact X, Y eq/ne C ->
3726 // if Y * C never-overflow && OneUse:
3727 // -> Y * C eq/ne X
3728 if (C.isZero())
3729 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3730 else if (C.isOne())
3731 return new ICmpInst(Pred, BOp0, BOp1);
3732 else if (BO->hasOneUse()) {
3734 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3735 Cmp.getOperand(1), BO);
3737 Value *YC =
3738 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3739 return new ICmpInst(Pred, YC, BOp0);
3740 }
3741 }
3742 }
3743 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3744 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3745 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3746 return new ICmpInst(NewPred, BOp1, BOp0);
3747 }
3748 break;
3749 default:
3750 break;
3751 }
3752 return nullptr;
3753}
3754
3756 const APInt &CRhs,
3757 InstCombiner::BuilderTy &Builder,
3758 const SimplifyQuery &Q) {
3759 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3760 "Non-ctpop intrin in ctpop fold");
3761 if (!CtpopLhs->hasOneUse())
3762 return nullptr;
3763
3764 // Power of 2 test:
3765 // isPow2OrZero : ctpop(X) u< 2
3766 // isPow2 : ctpop(X) == 1
3767 // NotPow2OrZero: ctpop(X) u> 1
3768 // NotPow2 : ctpop(X) != 1
3769 // If we know any bit of X can be folded to:
3770 // IsPow2 : X & (~Bit) == 0
3771 // NotPow2 : X & (~Bit) != 0
3772 const ICmpInst::Predicate Pred = I.getPredicate();
3773 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3774 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3775 Value *Op = CtpopLhs->getArgOperand(0);
3776 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3777 // No need to check for count > 1, that should be already constant folded.
3778 if (OpKnown.countMinPopulation() == 1) {
3779 Value *And = Builder.CreateAnd(
3780 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3781 return new ICmpInst(
3782 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3785 And, Constant::getNullValue(Op->getType()));
3786 }
3787 }
3788
3789 return nullptr;
3790}
3791
3792/// Fold an equality icmp with LLVM intrinsic and constant operand.
3794 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3795 Type *Ty = II->getType();
3796 unsigned BitWidth = C.getBitWidth();
3797 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3798
3799 switch (II->getIntrinsicID()) {
3800 case Intrinsic::abs:
3801 // abs(A) == 0 -> A == 0
3802 // abs(A) == INT_MIN -> A == INT_MIN
3803 if (C.isZero() || C.isMinSignedValue())
3804 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3805 break;
3806
3807 case Intrinsic::bswap:
3808 // bswap(A) == C -> A == bswap(C)
3809 return new ICmpInst(Pred, II->getArgOperand(0),
3810 ConstantInt::get(Ty, C.byteSwap()));
3811
3812 case Intrinsic::bitreverse:
3813 // bitreverse(A) == C -> A == bitreverse(C)
3814 return new ICmpInst(Pred, II->getArgOperand(0),
3815 ConstantInt::get(Ty, C.reverseBits()));
3816
3817 case Intrinsic::ctlz:
3818 case Intrinsic::cttz: {
3819 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3820 if (C == BitWidth)
3821 return new ICmpInst(Pred, II->getArgOperand(0),
3823
3824 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3825 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3826 // Limit to one use to ensure we don't increase instruction count.
3827 unsigned Num = C.getLimitedValue(BitWidth);
3828 if (Num != BitWidth && II->hasOneUse()) {
3829 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3830 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3831 : APInt::getHighBitsSet(BitWidth, Num + 1);
3832 APInt Mask2 = IsTrailing
3835 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3836 ConstantInt::get(Ty, Mask2));
3837 }
3838 break;
3839 }
3840
3841 case Intrinsic::ctpop: {
3842 // popcount(A) == 0 -> A == 0 and likewise for !=
3843 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3844 bool IsZero = C.isZero();
3845 if (IsZero || C == BitWidth)
3846 return new ICmpInst(Pred, II->getArgOperand(0),
3847 IsZero ? Constant::getNullValue(Ty)
3849
3850 break;
3851 }
3852
3853 case Intrinsic::fshl:
3854 case Intrinsic::fshr:
3855 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3856 const APInt *RotAmtC;
3857 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3858 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3859 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3860 return new ICmpInst(Pred, II->getArgOperand(0),
3861 II->getIntrinsicID() == Intrinsic::fshl
3862 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3863 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3864 }
3865 break;
3866
3867 case Intrinsic::umax:
3868 case Intrinsic::uadd_sat: {
3869 // uadd.sat(a, b) == 0 -> (a | b) == 0
3870 // umax(a, b) == 0 -> (a | b) == 0
3871 if (C.isZero() && II->hasOneUse()) {
3872 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3873 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3874 }
3875 break;
3876 }
3877
3878 case Intrinsic::ssub_sat:
3879 // ssub.sat(a, b) == 0 -> a == b
3880 if (C.isZero())
3881 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3882 break;
3883 case Intrinsic::usub_sat: {
3884 // usub.sat(a, b) == 0 -> a <= b
3885 if (C.isZero()) {
3886 ICmpInst::Predicate NewPred =
3888 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3889 }
3890 break;
3891 }
3892 default:
3893 break;
3894 }
3895
3896 return nullptr;
3897}
3898
3899/// Fold an icmp with LLVM intrinsics
3900static Instruction *
3902 InstCombiner::BuilderTy &Builder) {
3903 assert(Cmp.isEquality());
3904
3905 ICmpInst::Predicate Pred = Cmp.getPredicate();
3906 Value *Op0 = Cmp.getOperand(0);
3907 Value *Op1 = Cmp.getOperand(1);
3908 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3909 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3910 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3911 return nullptr;
3912
3913 switch (IIOp0->getIntrinsicID()) {
3914 case Intrinsic::bswap:
3915 case Intrinsic::bitreverse:
3916 // If both operands are byte-swapped or bit-reversed, just compare the
3917 // original values.
3918 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3919 case Intrinsic::fshl:
3920 case Intrinsic::fshr: {
3921 // If both operands are rotated by same amount, just compare the
3922 // original values.
3923 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3924 break;
3925 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3926 break;
3927 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3928 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3929
3930 // rotate(X, AmtX) == rotate(Y, AmtY)
3931 // -> rotate(X, AmtX - AmtY) == Y
3932 // Do this if either both rotates have one use or if only one has one use
3933 // and AmtX/AmtY are constants.
3934 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3935 if (OneUses == 2 ||
3936 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3937 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3938 Value *SubAmt =
3939 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3940 Value *CombinedRotate = Builder.CreateIntrinsic(
3941 Op0->getType(), IIOp0->getIntrinsicID(),
3942 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3943 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3944 }
3945 } break;
3946 default:
3947 break;
3948 }
3949
3950 return nullptr;
3951}
3952
3953/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3954/// where X is some kind of instruction and C is AllowPoison.
3955/// TODO: Move more folds which allow poison to this function.
3958 const APInt &C) {
3959 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3960 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3961 switch (II->getIntrinsicID()) {
3962 default:
3963 break;
3964 case Intrinsic::fshl:
3965 case Intrinsic::fshr:
3966 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3967 // (rot X, ?) == 0/-1 --> X == 0/-1
3968 if (C.isZero() || C.isAllOnes())
3969 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3970 }
3971 break;
3972 }
3973 }
3974
3975 return nullptr;
3976}
3977
3978/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3980 BinaryOperator *BO,
3981 const APInt &C) {
3982 switch (BO->getOpcode()) {
3983 case Instruction::Xor:
3984 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3985 return I;
3986 break;
3987 case Instruction::And:
3988 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3989 return I;
3990 break;
3991 case Instruction::Or:
3992 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3993 return I;
3994 break;
3995 case Instruction::Mul:
3996 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3997 return I;
3998 break;
3999 case Instruction::Shl:
4000 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
4001 return I;
4002 break;
4003 case Instruction::LShr:
4004 case Instruction::AShr:
4005 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
4006 return I;
4007 break;
4008 case Instruction::SRem:
4009 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4010 return I;
4011 break;
4012 case Instruction::UDiv:
4013 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4014 return I;
4015 [[fallthrough]];
4016 case Instruction::SDiv:
4017 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4018 return I;
4019 break;
4020 case Instruction::Sub:
4021 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4022 return I;
4023 break;
4024 case Instruction::Add:
4025 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4026 return I;
4027 break;
4028 default:
4029 break;
4030 }
4031
4032 // TODO: These folds could be refactored to be part of the above calls.
4034 return I;
4035
4036 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4037 // : C4), C5` pattern, by computing a truth table of the four constant
4038 // variants.
4040}
4041
4042static Instruction *
4044 const APInt &C,
4045 InstCombiner::BuilderTy &Builder) {
4046 // This transform may end up producing more than one instruction for the
4047 // intrinsic, so limit it to one user of the intrinsic.
4048 if (!II->hasOneUse())
4049 return nullptr;
4050
4051 // Let Y = [add/sub]_sat(X, C) pred C2
4052 // SatVal = The saturating value for the operation
4053 // WillWrap = Whether or not the operation will underflow / overflow
4054 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4055 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4056 //
4057 // When (SatVal pred C2) is true, then
4058 // Y = WillWrap ? true : ((X binop C) pred C2)
4059 // => Y = WillWrap || ((X binop C) pred C2)
4060 // else
4061 // Y = WillWrap ? false : ((X binop C) pred C2)
4062 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4063 // => Y = !WillWrap && ((X binop C) pred C2)
4064 Value *Op0 = II->getOperand(0);
4065 Value *Op1 = II->getOperand(1);
4066
4067 const APInt *COp1;
4068 // This transform only works when the intrinsic has an integral constant or
4069 // splat vector as the second operand.
4070 if (!match(Op1, m_APInt(COp1)))
4071 return nullptr;
4072
4073 APInt SatVal;
4074 switch (II->getIntrinsicID()) {
4075 default:
4077 "This function only works with usub_sat and uadd_sat for now!");
4078 case Intrinsic::uadd_sat:
4079 SatVal = APInt::getAllOnes(C.getBitWidth());
4080 break;
4081 case Intrinsic::usub_sat:
4082 SatVal = APInt::getZero(C.getBitWidth());
4083 break;
4084 }
4085
4086 // Check (SatVal pred C2)
4087 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4088
4089 // !WillWrap.
4091 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4092
4093 // WillWrap.
4094 if (SatValCheck)
4095 C1 = C1.inverse();
4096
4098 if (II->getBinaryOp() == Instruction::Add)
4099 C2 = C2.sub(*COp1);
4100 else
4101 C2 = C2.add(*COp1);
4102
4103 Instruction::BinaryOps CombiningOp =
4104 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4105
4106 std::optional<ConstantRange> Combination;
4107 if (CombiningOp == Instruction::BinaryOps::Or)
4108 Combination = C1.exactUnionWith(C2);
4109 else /* CombiningOp == Instruction::BinaryOps::And */
4110 Combination = C1.exactIntersectWith(C2);
4111
4112 if (!Combination)
4113 return nullptr;
4114
4115 CmpInst::Predicate EquivPred;
4116 APInt EquivInt;
4117 APInt EquivOffset;
4118
4119 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4120
4121 return new ICmpInst(
4122 EquivPred,
4123 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4124 ConstantInt::get(Op1->getType(), EquivInt));
4125}
4126
4127static Instruction *
4129 const APInt &C,
4130 InstCombiner::BuilderTy &Builder) {
4131 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4132 switch (Pred) {
4133 case ICmpInst::ICMP_EQ:
4134 case ICmpInst::ICMP_NE:
4135 if (C.isZero())
4136 NewPredicate = Pred;
4137 else if (C.isOne())
4138 NewPredicate =
4140 else if (C.isAllOnes())
4141 NewPredicate =
4143 break;
4144
4145 case ICmpInst::ICMP_SGT:
4146 if (C.isAllOnes())
4147 NewPredicate = ICmpInst::ICMP_UGE;
4148 else if (C.isZero())
4149 NewPredicate = ICmpInst::ICMP_UGT;
4150 break;
4151
4152 case ICmpInst::ICMP_SLT:
4153 if (C.isZero())
4154 NewPredicate = ICmpInst::ICMP_ULT;
4155 else if (C.isOne())
4156 NewPredicate = ICmpInst::ICMP_ULE;
4157 break;
4158
4159 case ICmpInst::ICMP_ULT:
4160 if (C.ugt(1))
4161 NewPredicate = ICmpInst::ICMP_UGE;
4162 break;
4163
4164 case ICmpInst::ICMP_UGT:
4165 if (!C.isZero() && !C.isAllOnes())
4166 NewPredicate = ICmpInst::ICMP_ULT;
4167 break;
4168
4169 default:
4170 break;
4171 }
4172
4173 if (!NewPredicate)
4174 return nullptr;
4175
4176 if (I->getIntrinsicID() == Intrinsic::scmp)
4177 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4178 Value *LHS = I->getOperand(0);
4179 Value *RHS = I->getOperand(1);
4180 return new ICmpInst(*NewPredicate, LHS, RHS);
4181}
4182
4183/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4186 const APInt &C) {
4187 ICmpInst::Predicate Pred = Cmp.getPredicate();
4188
4189 // Handle folds that apply for any kind of icmp.
4190 switch (II->getIntrinsicID()) {
4191 default:
4192 break;
4193 case Intrinsic::uadd_sat:
4194 case Intrinsic::usub_sat:
4195 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4196 Pred, cast<SaturatingInst>(II), C, Builder))
4197 return Folded;
4198 break;
4199 case Intrinsic::ctpop: {
4200 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4201 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4202 return R;
4203 } break;
4204 case Intrinsic::scmp:
4205 case Intrinsic::ucmp:
4206 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4207 return Folded;
4208 break;
4209 }
4210
4211 if (Cmp.isEquality())
4212 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4213
4214 Type *Ty = II->getType();
4215 unsigned BitWidth = C.getBitWidth();
4216 switch (II->getIntrinsicID()) {
4217 case Intrinsic::ctpop: {
4218 // (ctpop X > BitWidth - 1) --> X == -1
4219 Value *X = II->getArgOperand(0);
4220 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4221 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4223 // (ctpop X < BitWidth) --> X != -1
4224 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4225 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4227 break;
4228 }
4229 case Intrinsic::ctlz: {
4230 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4231 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4232 unsigned Num = C.getLimitedValue();
4233 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4234 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4235 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4236 }
4237
4238 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4239 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4240 unsigned Num = C.getLimitedValue();
4242 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4243 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4244 }
4245 break;
4246 }
4247 case Intrinsic::cttz: {
4248 // Limit to one use to ensure we don't increase instruction count.
4249 if (!II->hasOneUse())
4250 return nullptr;
4251
4252 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4253 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4254 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4255 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4256 Builder.CreateAnd(II->getArgOperand(0), Mask),
4258 }
4259
4260 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4261 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4262 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4263 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4264 Builder.CreateAnd(II->getArgOperand(0), Mask),
4266 }
4267 break;
4268 }
4269 case Intrinsic::ssub_sat:
4270 // ssub.sat(a, b) spred 0 -> a spred b
4271 if (ICmpInst::isSigned(Pred)) {
4272 if (C.isZero())
4273 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4274 // X s<= 0 is cannonicalized to X s< 1
4275 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4276 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4277 II->getArgOperand(1));
4278 // X s>= 0 is cannonicalized to X s> -1
4279 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4280 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4281 II->getArgOperand(1));
4282 }
4283 break;
4284 default:
4285 break;
4286 }
4287
4288 return nullptr;
4289}
4290
4291/// Handle icmp with constant (but not simple integer constant) RHS.
4293 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4294 Constant *RHSC = dyn_cast<Constant>(Op1);
4296 if (!RHSC || !LHSI)
4297 return nullptr;
4298
4299 switch (LHSI->getOpcode()) {
4300 case Instruction::IntToPtr:
4301 // icmp pred inttoptr(X), null -> icmp pred X, 0
4302 if (RHSC->isNullValue() &&
4303 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4304 return new ICmpInst(
4305 I.getPredicate(), LHSI->getOperand(0),
4307 break;
4308
4309 case Instruction::Load:
4310 // Try to optimize things like "A[i] > 4" to index computations.
4311 if (GetElementPtrInst *GEP =
4313 if (Instruction *Res =
4315 return Res;
4316 break;
4317 }
4318
4319 return nullptr;
4320}
4321
4323 Value *RHS, const ICmpInst &I) {
4324 // Try to fold the comparison into the select arms, which will cause the
4325 // select to be converted into a logical and/or.
4326 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4327 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4328 return Res;
4329 if (std::optional<bool> Impl = isImpliedCondition(
4330 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4331 return ConstantInt::get(I.getType(), *Impl);
4332 return nullptr;
4333 };
4334
4335 ConstantInt *CI = nullptr;
4336 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4337 if (Op1)
4338 CI = dyn_cast<ConstantInt>(Op1);
4339
4340 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4341 if (Op2)
4342 CI = dyn_cast<ConstantInt>(Op2);
4343
4344 auto Simplifies = [&](Value *Op, unsigned Idx) {
4345 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4346 const APInt *Dummy;
4347 return Op ||
4348 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4349 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4350 };
4351
4352 // We only want to perform this transformation if it will not lead to
4353 // additional code. This is true if either both sides of the select
4354 // fold to a constant (in which case the icmp is replaced with a select
4355 // which will usually simplify) or this is the only user of the
4356 // select (in which case we are trading a select+icmp for a simpler
4357 // select+icmp) or all uses of the select can be replaced based on
4358 // dominance information ("Global cases").
4359 bool Transform = false;
4360 if (Op1 && Op2)
4361 Transform = true;
4362 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4363 // Local case
4364 if (SI->hasOneUse())
4365 Transform = true;
4366 // Global cases
4367 else if (CI && !CI->isZero())
4368 // When Op1 is constant try replacing select with second operand.
4369 // Otherwise Op2 is constant and try replacing select with first
4370 // operand.
4371 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4372 }
4373 if (Transform) {
4374 if (!Op1)
4375 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4376 if (!Op2)
4377 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4378 return SelectInst::Create(SI->getOperand(0), Op1, Op2);
4379 }
4380
4381 return nullptr;
4382}
4383
4384// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4385static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4386 unsigned Depth = 0) {
4387 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4388 return true;
4389 if (V->getType()->getScalarSizeInBits() == 1)
4390 return true;
4392 return false;
4393 Value *X;
4395 if (!I)
4396 return false;
4397 switch (I->getOpcode()) {
4398 case Instruction::ZExt:
4399 // ZExt(Mask) is a Mask.
4400 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4401 case Instruction::SExt:
4402 // SExt(Mask) is a Mask.
4403 // SExt(~Mask) is a ~Mask.
4404 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4405 case Instruction::And:
4406 case Instruction::Or:
4407 // Mask0 | Mask1 is a Mask.
4408 // Mask0 & Mask1 is a Mask.
4409 // ~Mask0 | ~Mask1 is a ~Mask.
4410 // ~Mask0 & ~Mask1 is a ~Mask.
4411 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4412 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4413 case Instruction::Xor:
4414 if (match(V, m_Not(m_Value(X))))
4415 return isMaskOrZero(X, !Not, Q, Depth);
4416
4417 // (X ^ -X) is a ~Mask
4418 if (Not)
4419 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4420 // (X ^ (X - 1)) is a Mask
4421 else
4422 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4423 case Instruction::Select:
4424 // c ? Mask0 : Mask1 is a Mask.
4425 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4426 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4427 case Instruction::Shl:
4428 // (~Mask) << X is a ~Mask.
4429 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4430 case Instruction::LShr:
4431 // Mask >> X is a Mask.
4432 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4433 case Instruction::AShr:
4434 // Mask s>> X is a Mask.
4435 // ~Mask s>> X is a ~Mask.
4436 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4437 case Instruction::Add:
4438 // Pow2 - 1 is a Mask.
4439 if (!Not && match(I->getOperand(1), m_AllOnes()))
4440 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4441 Q.AC, Q.CxtI, Q.DT, Depth);
4442 break;
4443 case Instruction::Sub:
4444 // -Pow2 is a ~Mask.
4445 if (Not && match(I->getOperand(0), m_Zero()))
4446 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4447 Q.AC, Q.CxtI, Q.DT, Depth);
4448 break;
4449 case Instruction::Call: {
4450 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4451 switch (II->getIntrinsicID()) {
4452 // min/max(Mask0, Mask1) is a Mask.
4453 // min/max(~Mask0, ~Mask1) is a ~Mask.
4454 case Intrinsic::umax:
4455 case Intrinsic::smax:
4456 case Intrinsic::umin:
4457 case Intrinsic::smin:
4458 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4459 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4460
4461 // In the context of masks, bitreverse(Mask) == ~Mask
4462 case Intrinsic::bitreverse:
4463 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4464 default:
4465 break;
4466 }
4467 }
4468 break;
4469 }
4470 default:
4471 break;
4472 }
4473 return false;
4474}
4475
4476/// Some comparisons can be simplified.
4477/// In this case, we are looking for comparisons that look like
4478/// a check for a lossy truncation.
4479/// Folds:
4480/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4481/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4482/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4483/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4484/// Where Mask is some pattern that produces all-ones in low bits:
4485/// (-1 >> y)
4486/// ((-1 << y) >> y) <- non-canonical, has extra uses
4487/// ~(-1 << y)
4488/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4489/// The Mask can be a constant, too.
4490/// For some predicates, the operands are commutative.
4491/// For others, x can only be on a specific side.
4493 Value *Op1, const SimplifyQuery &Q,
4494 InstCombiner &IC) {
4495
4496 ICmpInst::Predicate DstPred;
4497 switch (Pred) {
4499 // x & Mask == x
4500 // x & ~Mask == 0
4501 // ~x | Mask == -1
4502 // -> x u<= Mask
4503 // x & ~Mask == ~Mask
4504 // -> ~Mask u<= x
4506 break;
4508 // x & Mask != x
4509 // x & ~Mask != 0
4510 // ~x | Mask != -1
4511 // -> x u> Mask
4512 // x & ~Mask != ~Mask
4513 // -> ~Mask u> x
4515 break;
4517 // x & Mask u< x
4518 // -> x u> Mask
4519 // x & ~Mask u< ~Mask
4520 // -> ~Mask u> x
4522 break;
4524 // x & Mask u>= x
4525 // -> x u<= Mask
4526 // x & ~Mask u>= ~Mask
4527 // -> ~Mask u<= x
4529 break;
4531 // x & Mask s< x [iff Mask s>= 0]
4532 // -> x s> Mask
4533 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4534 // -> ~Mask s> x
4536 break;
4538 // x & Mask s>= x [iff Mask s>= 0]
4539 // -> x s<= Mask
4540 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4541 // -> ~Mask s<= x
4543 break;
4544 default:
4545 // We don't support sgt,sle
4546 // ult/ugt are simplified to true/false respectively.
4547 return nullptr;
4548 }
4549
4550 Value *X, *M;
4551 // Put search code in lambda for early positive returns.
4552 auto IsLowBitMask = [&]() {
4553 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4554 X = Op1;
4555 // Look for: x & Mask pred x
4556 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4557 return !ICmpInst::isSigned(Pred) ||
4558 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4559 }
4560
4561 // Look for: x & ~Mask pred ~Mask
4562 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4563 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4564 }
4565 return false;
4566 }
4567 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4568 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4569
4570 auto Check = [&]() {
4571 // Look for: ~x | Mask == -1
4572 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4573 if (Value *NotX =
4574 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4575 X = NotX;
4576 return true;
4577 }
4578 }
4579 return false;
4580 };
4581 if (Check())
4582 return true;
4583 std::swap(X, M);
4584 return Check();
4585 }
4586 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4587 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4588 auto Check = [&]() {
4589 // Look for: x & ~Mask == 0
4590 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4591 if (Value *NotM =
4592 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4593 M = NotM;
4594 return true;
4595 }
4596 }
4597 return false;
4598 };
4599 if (Check())
4600 return true;
4601 std::swap(X, M);
4602 return Check();
4603 }
4604 return false;
4605 };
4606
4607 if (!IsLowBitMask())
4608 return nullptr;
4609
4610 return IC.Builder.CreateICmp(DstPred, X, M);
4611}
4612
4613/// Some comparisons can be simplified.
4614/// In this case, we are looking for comparisons that look like
4615/// a check for a lossy signed truncation.
4616/// Folds: (MaskedBits is a constant.)
4617/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4618/// Into:
4619/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4620/// Where KeptBits = bitwidth(%x) - MaskedBits
4621static Value *
4623 InstCombiner::BuilderTy &Builder) {
4624 CmpPredicate SrcPred;
4625 Value *X;
4626 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4627 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4628 if (!match(&I, m_c_ICmp(SrcPred,
4630 m_APInt(C1))),
4631 m_Deferred(X))))
4632 return nullptr;
4633
4634 // Potential handling of non-splats: for each element:
4635 // * if both are undef, replace with constant 0.
4636 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4637 // * if both are not undef, and are different, bailout.
4638 // * else, only one is undef, then pick the non-undef one.
4639
4640 // The shift amount must be equal.
4641 if (*C0 != *C1)
4642 return nullptr;
4643 const APInt &MaskedBits = *C0;
4644 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4645
4646 ICmpInst::Predicate DstPred;
4647 switch (SrcPred) {
4649 // ((%x << MaskedBits) a>> MaskedBits) == %x
4650 // =>
4651 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4653 break;
4655 // ((%x << MaskedBits) a>> MaskedBits) != %x
4656 // =>
4657 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4659 break;
4660 // FIXME: are more folds possible?
4661 default:
4662 return nullptr;
4663 }
4664
4665 auto *XType = X->getType();
4666 const unsigned XBitWidth = XType->getScalarSizeInBits();
4667 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4668 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4669
4670 // KeptBits = bitwidth(%x) - MaskedBits
4671 const APInt KeptBits = BitWidth - MaskedBits;
4672 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4673 // ICmpCst = (1 << KeptBits)
4674 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4675 assert(ICmpCst.isPowerOf2());
4676 // AddCst = (1 << (KeptBits-1))
4677 const APInt AddCst = ICmpCst.lshr(1);
4678 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4679
4680 // T0 = add %x, AddCst
4681 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4682 // T1 = T0 DstPred ICmpCst
4683 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4684
4685 return T1;
4686}
4687
4688// Given pattern:
4689// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4690// we should move shifts to the same hand of 'and', i.e. rewrite as
4691// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4692// We are only interested in opposite logical shifts here.
4693// One of the shifts can be truncated.
4694// If we can, we want to end up creating 'lshr' shift.
4695static Value *
4697 InstCombiner::BuilderTy &Builder) {
4698 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4699 !I.getOperand(0)->hasOneUse())
4700 return nullptr;
4701
4702 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4703
4704 // Look for an 'and' of two logical shifts, one of which may be truncated.
4705 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4706 Instruction *XShift, *MaybeTruncation, *YShift;
4707 if (!match(
4708 I.getOperand(0),
4709 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4711 m_AnyLogicalShift, m_Instruction(YShift))),
4712 m_Instruction(MaybeTruncation)))))
4713 return nullptr;
4714
4715 // We potentially looked past 'trunc', but only when matching YShift,
4716 // therefore YShift must have the widest type.
4717 Instruction *WidestShift = YShift;
4718 // Therefore XShift must have the shallowest type.
4719 // Or they both have identical types if there was no truncation.
4720 Instruction *NarrowestShift = XShift;
4721
4722 Type *WidestTy = WidestShift->getType();
4723 Type *NarrowestTy = NarrowestShift->getType();
4724 assert(NarrowestTy == I.getOperand(0)->getType() &&
4725 "We did not look past any shifts while matching XShift though.");
4726 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4727
4728 // If YShift is a 'lshr', swap the shifts around.
4729 if (match(YShift, m_LShr(m_Value(), m_Value())))
4730 std::swap(XShift, YShift);
4731
4732 // The shifts must be in opposite directions.
4733 auto XShiftOpcode = XShift->getOpcode();
4734 if (XShiftOpcode == YShift->getOpcode())
4735 return nullptr; // Do not care about same-direction shifts here.
4736
4737 Value *X, *XShAmt, *Y, *YShAmt;
4738 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4739 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4740
4741 // If one of the values being shifted is a constant, then we will end with
4742 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4743 // however, we will need to ensure that we won't increase instruction count.
4744 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4745 // At least one of the hands of the 'and' should be one-use shift.
4746 if (!match(I.getOperand(0),
4747 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4748 return nullptr;
4749 if (HadTrunc) {
4750 // Due to the 'trunc', we will need to widen X. For that either the old
4751 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4752 if (!MaybeTruncation->hasOneUse() &&
4753 !NarrowestShift->getOperand(1)->hasOneUse())
4754 return nullptr;
4755 }
4756 }
4757
4758 // We have two shift amounts from two different shifts. The types of those
4759 // shift amounts may not match. If that's the case let's bailout now.
4760 if (XShAmt->getType() != YShAmt->getType())
4761 return nullptr;
4762
4763 // As input, we have the following pattern:
4764 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4765 // We want to rewrite that as:
4766 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4767 // While we know that originally (Q+K) would not overflow
4768 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4769 // shift amounts. so it may now overflow in smaller bitwidth.
4770 // To ensure that does not happen, we need to ensure that the total maximal
4771 // shift amount is still representable in that smaller bit width.
4772 unsigned MaximalPossibleTotalShiftAmount =
4773 (WidestTy->getScalarSizeInBits() - 1) +
4774 (NarrowestTy->getScalarSizeInBits() - 1);
4775 APInt MaximalRepresentableShiftAmount =
4777 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4778 return nullptr;
4779
4780 // Can we fold (XShAmt+YShAmt) ?
4781 auto *NewShAmt = dyn_cast_or_null<Constant>(
4782 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4783 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4784 if (!NewShAmt)
4785 return nullptr;
4786 if (NewShAmt->getType() != WidestTy) {
4787 NewShAmt =
4788 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4789 if (!NewShAmt)
4790 return nullptr;
4791 }
4792 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4793
4794 // Is the new shift amount smaller than the bit width?
4795 // FIXME: could also rely on ConstantRange.
4796 if (!match(NewShAmt,
4798 APInt(WidestBitWidth, WidestBitWidth))))
4799 return nullptr;
4800
4801 // An extra legality check is needed if we had trunc-of-lshr.
4802 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4803 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4804 WidestShift]() {
4805 // It isn't obvious whether it's worth it to analyze non-constants here.
4806 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4807 // If *any* of these preconditions matches we can perform the fold.
4808 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4809 ? NewShAmt->getSplatValue()
4810 : NewShAmt;
4811 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4812 if (NewShAmtSplat &&
4813 (NewShAmtSplat->isNullValue() ||
4814 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4815 return true;
4816 // We consider *min* leading zeros so a single outlier
4817 // blocks the transform as opposed to allowing it.
4818 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4819 KnownBits Known = computeKnownBits(C, SQ.DL);
4820 unsigned MinLeadZero = Known.countMinLeadingZeros();
4821 // If the value being shifted has at most lowest bit set we can fold.
4822 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4823 if (MaxActiveBits <= 1)
4824 return true;
4825 // Precondition: NewShAmt u<= countLeadingZeros(C)
4826 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4827 return true;
4828 }
4829 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4830 KnownBits Known = computeKnownBits(C, SQ.DL);
4831 unsigned MinLeadZero = Known.countMinLeadingZeros();
4832 // If the value being shifted has at most lowest bit set we can fold.
4833 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4834 if (MaxActiveBits <= 1)
4835 return true;
4836 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4837 if (NewShAmtSplat) {
4838 APInt AdjNewShAmt =
4839 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4840 if (AdjNewShAmt.ule(MinLeadZero))
4841 return true;
4842 }
4843 }
4844 return false; // Can't tell if it's ok.
4845 };
4846 if (!CanFold())
4847 return nullptr;
4848 }
4849
4850 // All good, we can do this fold.
4851 X = Builder.CreateZExt(X, WidestTy);
4852 Y = Builder.CreateZExt(Y, WidestTy);
4853 // The shift is the same that was for X.
4854 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4855 ? Builder.CreateLShr(X, NewShAmt)
4856 : Builder.CreateShl(X, NewShAmt);
4857 Value *T1 = Builder.CreateAnd(T0, Y);
4858 return Builder.CreateICmp(I.getPredicate(), T1,
4859 Constant::getNullValue(WidestTy));
4860}
4861
4862/// Fold
4863/// (-1 u/ x) u< y
4864/// ((x * y) ?/ x) != y
4865/// to
4866/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4867/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4868/// will mean that we are looking for the opposite answer.
4870 CmpPredicate Pred;
4871 Value *X, *Y;
4873 Instruction *Div;
4874 bool NeedNegation;
4875 // Look for: (-1 u/ x) u</u>= y
4876 if (!I.isEquality() &&
4877 match(&I, m_c_ICmp(Pred,
4879 m_Instruction(Div)),
4880 m_Value(Y)))) {
4881 Mul = nullptr;
4882
4883 // Are we checking that overflow does not happen, or does happen?
4884 switch (Pred) {
4886 NeedNegation = false;
4887 break; // OK
4889 NeedNegation = true;
4890 break; // OK
4891 default:
4892 return nullptr; // Wrong predicate.
4893 }
4894 } else // Look for: ((x * y) / x) !=/== y
4895 if (I.isEquality() &&
4896 match(&I, m_c_ICmp(Pred, m_Value(Y),
4899 m_Value(X)),
4901 m_Deferred(X))),
4902 m_Instruction(Div))))) {
4903 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4904 } else
4905 return nullptr;
4906
4908 // If the pattern included (x * y), we'll want to insert new instructions
4909 // right before that original multiplication so that we can replace it.
4910 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4911 if (MulHadOtherUses)
4912 Builder.SetInsertPoint(Mul);
4913
4914 CallInst *Call = Builder.CreateIntrinsic(
4915 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4916 : Intrinsic::smul_with_overflow,
4917 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4918
4919 // If the multiplication was used elsewhere, to ensure that we don't leave
4920 // "duplicate" instructions, replace uses of that original multiplication
4921 // with the multiplication result from the with.overflow intrinsic.
4922 if (MulHadOtherUses)
4923 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4924
4925 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4926 if (NeedNegation) // This technically increases instruction count.
4927 Res = Builder.CreateNot(Res, "mul.not.ov");
4928
4929 // If we replaced the mul, erase it. Do this after all uses of Builder,
4930 // as the mul is used as insertion point.
4931 if (MulHadOtherUses)
4933
4934 return Res;
4935}
4936
4938 InstCombiner::BuilderTy &Builder) {
4939 CmpPredicate Pred;
4940 Value *X;
4941 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4942
4943 if (ICmpInst::isSigned(Pred))
4944 Pred = ICmpInst::getSwappedPredicate(Pred);
4945 else if (ICmpInst::isUnsigned(Pred))
4946 Pred = ICmpInst::getSignedPredicate(Pred);
4947 // else for equality-comparisons just keep the predicate.
4948
4949 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4950 Constant::getNullValue(X->getType()), I.getName());
4951 }
4952
4953 // A value is not equal to its negation unless that value is 0 or
4954 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4955 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4956 ICmpInst::isEquality(Pred)) {
4957 Type *Ty = X->getType();
4958 uint32_t BitWidth = Ty->getScalarSizeInBits();
4959 Constant *MaxSignedVal =
4960 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4961 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4962 Constant *Zero = Constant::getNullValue(Ty);
4963 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4964 }
4965
4966 return nullptr;
4967}
4968
4970 InstCombinerImpl &IC) {
4971 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4972 // Normalize and operand as operand 0.
4973 CmpInst::Predicate Pred = I.getPredicate();
4974 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4975 std::swap(Op0, Op1);
4976 Pred = ICmpInst::getSwappedPredicate(Pred);
4977 }
4978
4979 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4980 return nullptr;
4981
4982 // (icmp (X & Y) u< X --> (X & Y) != X
4983 if (Pred == ICmpInst::ICMP_ULT)
4984 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4985
4986 // (icmp (X & Y) u>= X --> (X & Y) == X
4987 if (Pred == ICmpInst::ICMP_UGE)
4988 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4989
4990 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4991 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
4992 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
4993 // so don't do this fold.
4994 if (!match(Op1, m_ImmConstant()))
4995 if (auto *NotOp1 =
4996 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
4997 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
4998 Constant::getAllOnesValue(Op1->getType()));
4999 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5000 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5001 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5002 Constant::getNullValue(Op1->getType()));
5003 }
5004
5005 if (!ICmpInst::isSigned(Pred))
5006 return nullptr;
5007
5008 KnownBits KnownY = IC.computeKnownBits(A, &I);
5009 // (X & NegY) spred X --> (X & NegY) upred X
5010 if (KnownY.isNegative())
5011 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5012
5013 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5014 return nullptr;
5015
5016 if (KnownY.isNonNegative())
5017 // (X & PosY) s<= X --> X s>= 0
5018 // (X & PosY) s> X --> X s< 0
5019 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5020 Constant::getNullValue(Op1->getType()));
5021
5023 // (NegX & Y) s<= NegX --> Y s< 0
5024 // (NegX & Y) s> NegX --> Y s>= 0
5026 Constant::getNullValue(A->getType()));
5027
5028 return nullptr;
5029}
5030
5032 InstCombinerImpl &IC) {
5033 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5034
5035 // Normalize or operand as operand 0.
5036 CmpInst::Predicate Pred = I.getPredicate();
5037 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5038 std::swap(Op0, Op1);
5039 Pred = ICmpInst::getSwappedPredicate(Pred);
5040 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5041 return nullptr;
5042 }
5043
5044 // icmp (X | Y) u<= X --> (X | Y) == X
5045 if (Pred == ICmpInst::ICMP_ULE)
5046 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5047
5048 // icmp (X | Y) u> X --> (X | Y) != X
5049 if (Pred == ICmpInst::ICMP_UGT)
5050 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5051
5052 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5053 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5054 if (Value *NotOp1 = IC.getFreelyInverted(
5055 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5056 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5057 Constant::getNullValue(Op1->getType()));
5058 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5059 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5060 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5061 Constant::getAllOnesValue(Op1->getType()));
5062 }
5063 return nullptr;
5064}
5065
5067 InstCombinerImpl &IC) {
5068 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5069 // Normalize xor operand as operand 0.
5070 CmpInst::Predicate Pred = I.getPredicate();
5071 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5072 std::swap(Op0, Op1);
5073 Pred = ICmpInst::getSwappedPredicate(Pred);
5074 }
5075 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5076 return nullptr;
5077
5078 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5079 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5080 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5081 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5083 if (PredOut != Pred && isKnownNonZero(A, Q))
5084 return new ICmpInst(PredOut, Op0, Op1);
5085
5086 // These transform work when A is negative.
5087 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5088 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5089 if (match(A, m_Negative())) {
5090 CmpInst::Predicate NewPred;
5091 switch (ICmpInst::getStrictPredicate(Pred)) {
5092 default:
5093 return nullptr;
5094 case ICmpInst::ICMP_SLT:
5095 case ICmpInst::ICMP_UGT:
5096 NewPred = ICmpInst::ICMP_SLT;
5097 break;
5098 case ICmpInst::ICMP_SGT:
5099 case ICmpInst::ICMP_ULT:
5100 NewPred = ICmpInst::ICMP_SGE;
5101 break;
5102 }
5103 Constant *Const = Constant::getNullValue(Op0->getType());
5104 return new ICmpInst(NewPred, Op0, Const);
5105 }
5106
5107 return nullptr;
5108}
5109
5110/// Return true if X is a multiple of C.
5111/// TODO: Handle non-power-of-2 factors.
5112static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5113 if (C.isOne())
5114 return true;
5115
5116 if (!C.isPowerOf2())
5117 return false;
5118
5119 return MaskedValueIsZero(X, C - 1, Q);
5120}
5121
5122/// Try to fold icmp (binop), X or icmp X, (binop).
5123/// TODO: A large part of this logic is duplicated in InstSimplify's
5124/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5125/// duplication.
5127 const SimplifyQuery &SQ) {
5128 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5129 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5130
5131 // Special logic for binary operators.
5134 if (!BO0 && !BO1)
5135 return nullptr;
5136
5137 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5138 return NewICmp;
5139
5140 const CmpInst::Predicate Pred = I.getPredicate();
5141 Value *X;
5142
5143 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5144 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5145 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5146 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5147 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5148 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5149 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5150 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5151 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5152
5153 {
5154 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5155 Constant *C;
5156 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5157 m_ImmConstant(C)))) &&
5158 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5160 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5161 }
5162 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5163 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5164 m_ImmConstant(C)))) &&
5165 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5167 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5168 }
5169 }
5170
5171 // (icmp eq/ne (X, -P2), INT_MIN)
5172 // -> (icmp slt/sge X, INT_MIN + P2)
5173 if (ICmpInst::isEquality(Pred) && BO0 &&
5174 match(I.getOperand(1), m_SignMask()) &&
5176 // Will Constant fold.
5177 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5178 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5180 BO0->getOperand(0), NewC);
5181 }
5182
5183 {
5184 // Similar to above: an unsigned overflow comparison may use offset + mask:
5185 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5186 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5187 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5188 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5189 BinaryOperator *BO;
5190 const APInt *C;
5191 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5192 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5194 CmpInst::Predicate NewPred =
5196 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5197 return new ICmpInst(NewPred, Op1, Zero);
5198 }
5199
5200 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5201 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5203 CmpInst::Predicate NewPred =
5205 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5206 return new ICmpInst(NewPred, Op0, Zero);
5207 }
5208 }
5209
5210 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5211 bool Op0HasNUW = false, Op1HasNUW = false;
5212 bool Op0HasNSW = false, Op1HasNSW = false;
5213 // Analyze the case when either Op0 or Op1 is an add instruction.
5214 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5215 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5216 bool &HasNSW, bool &HasNUW) -> bool {
5218 HasNUW = BO.hasNoUnsignedWrap();
5219 HasNSW = BO.hasNoSignedWrap();
5220 return ICmpInst::isEquality(Pred) ||
5221 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5222 (CmpInst::isSigned(Pred) && HasNSW);
5223 } else if (BO.getOpcode() == Instruction::Or) {
5224 HasNUW = true;
5225 HasNSW = true;
5226 return true;
5227 } else {
5228 return false;
5229 }
5230 };
5231 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5232
5233 if (BO0) {
5234 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5235 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5236 }
5237 if (BO1) {
5238 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5239 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5240 }
5241
5242 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5243 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5244 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5245 return new ICmpInst(Pred, A == Op1 ? B : A,
5246 Constant::getNullValue(Op1->getType()));
5247
5248 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5249 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5250 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5251 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5252 C == Op0 ? D : C);
5253
5254 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5255 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5256 NoOp1WrapProblem) {
5257 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5258 Value *Y, *Z;
5259 if (A == C) {
5260 // C + B == C + D -> B == D
5261 Y = B;
5262 Z = D;
5263 } else if (A == D) {
5264 // D + B == C + D -> B == C
5265 Y = B;
5266 Z = C;
5267 } else if (B == C) {
5268 // A + C == C + D -> A == D
5269 Y = A;
5270 Z = D;
5271 } else {
5272 assert(B == D);
5273 // A + D == C + D -> A == C
5274 Y = A;
5275 Z = C;
5276 }
5277 return new ICmpInst(Pred, Y, Z);
5278 }
5279
5280 if (ICmpInst::isRelational(Pred)) {
5281 // Return if both X and Y is divisible by Z/-Z.
5282 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5283 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5284 bool IsNegative) -> bool {
5285 const APInt *OffsetC;
5286 if (!match(Z, m_APInt(OffsetC)))
5287 return false;
5288
5289 // Fast path for Z == 1/-1.
5290 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5291 return true;
5292
5293 APInt C = *OffsetC;
5294 if (IsNegative)
5295 C.negate();
5296 // Note: -INT_MIN is also negative.
5297 if (!C.isStrictlyPositive())
5298 return false;
5299
5300 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5301 };
5302
5303 // TODO: The subtraction-related identities shown below also hold, but
5304 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5305 // wouldn't happen even if they were implemented.
5306 //
5307 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5308 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5309 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5310 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5311
5312 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5313 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5314 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5315 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5316 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5317 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5318 if (A && NoOp0WrapProblem &&
5319 ShareCommonDivisor(A, Op1, B,
5320 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5322 Op1);
5323
5324 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5325 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5326 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5327 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5328 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5329 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5330 if (C && NoOp1WrapProblem &&
5331 ShareCommonDivisor(Op0, C, D,
5332 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5334 C);
5335 }
5336
5337 // if C1 has greater magnitude than C2:
5338 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5339 // s.t. C3 = C1 - C2
5340 //
5341 // if C2 has greater magnitude than C1:
5342 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5343 // s.t. C3 = C2 - C1
5344 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5345 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5346 const APInt *AP1, *AP2;
5347 // TODO: Support non-uniform vectors.
5348 // TODO: Allow poison passthrough if B or D's element is poison.
5349 if (match(B, m_APIntAllowPoison(AP1)) &&
5350 match(D, m_APIntAllowPoison(AP2)) &&
5351 AP1->isNegative() == AP2->isNegative()) {
5352 APInt AP1Abs = AP1->abs();
5353 APInt AP2Abs = AP2->abs();
5354 if (AP1Abs.uge(AP2Abs)) {
5355 APInt Diff = *AP1 - *AP2;
5356 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5357 Value *NewAdd = Builder.CreateAdd(
5358 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5359 return new ICmpInst(Pred, NewAdd, C);
5360 } else {
5361 APInt Diff = *AP2 - *AP1;
5362 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5363 Value *NewAdd = Builder.CreateAdd(
5364 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5365 return new ICmpInst(Pred, A, NewAdd);
5366 }
5367 }
5368 Constant *Cst1, *Cst2;
5369 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5370 ICmpInst::isEquality(Pred)) {
5371 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5372 Value *NewAdd = Builder.CreateAdd(C, Diff);
5373 return new ICmpInst(Pred, A, NewAdd);
5374 }
5375 }
5376
5377 // Analyze the case when either Op0 or Op1 is a sub instruction.
5378 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5379 A = nullptr;
5380 B = nullptr;
5381 C = nullptr;
5382 D = nullptr;
5383 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5384 A = BO0->getOperand(0);
5385 B = BO0->getOperand(1);
5386 }
5387 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5388 C = BO1->getOperand(0);
5389 D = BO1->getOperand(1);
5390 }
5391
5392 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5393 if (A == Op1 && NoOp0WrapProblem)
5394 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5395 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5396 if (C == Op0 && NoOp1WrapProblem)
5397 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5398
5399 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5400 // (A - B) u>/u<= A --> B u>/u<= A
5401 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5402 return new ICmpInst(Pred, B, A);
5403 // C u</u>= (C - D) --> C u</u>= D
5404 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5405 return new ICmpInst(Pred, C, D);
5406 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5407 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5408 isKnownNonZero(B, Q))
5410 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5411 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5412 isKnownNonZero(D, Q))
5414
5415 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5416 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5417 return new ICmpInst(Pred, A, C);
5418
5419 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5420 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5421 return new ICmpInst(Pred, D, B);
5422
5423 // icmp (0-X) < cst --> x > -cst
5424 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5425 Value *X;
5426 if (match(BO0, m_Neg(m_Value(X))))
5427 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5428 if (RHSC->isNotMinSignedValue())
5429 return new ICmpInst(I.getSwappedPredicate(), X,
5430 ConstantExpr::getNeg(RHSC));
5431 }
5432
5433 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5434 return R;
5435 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5436 return R;
5437
5438 {
5439 // Try to remove shared multiplier from comparison:
5440 // X * Z pred Y * Z
5441 Value *X, *Y, *Z;
5442 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5443 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5444 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5445 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5446 if (ICmpInst::isSigned(Pred)) {
5447 if (Op0HasNSW && Op1HasNSW) {
5448 KnownBits ZKnown = computeKnownBits(Z, &I);
5449 if (ZKnown.isStrictlyPositive())
5450 return new ICmpInst(Pred, X, Y);
5451 if (ZKnown.isNegative())
5452 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5454 SQ.getWithInstruction(&I));
5455 if (LessThan && match(LessThan, m_One()))
5456 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5457 Constant::getNullValue(Z->getType()));
5458 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5459 SQ.getWithInstruction(&I));
5460 if (GreaterThan && match(GreaterThan, m_One()))
5461 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5462 }
5463 } else {
5464 bool NonZero;
5465 if (ICmpInst::isEquality(Pred)) {
5466 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5467 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5468 isKnownNonEqual(X, Y, SQ))
5469 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5470
5471 KnownBits ZKnown = computeKnownBits(Z, &I);
5472 // if Z % 2 != 0
5473 // X * Z eq/ne Y * Z -> X eq/ne Y
5474 if (ZKnown.countMaxTrailingZeros() == 0)
5475 return new ICmpInst(Pred, X, Y);
5476 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5477 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5478 // X * Z eq/ne Y * Z -> X eq/ne Y
5479 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5480 return new ICmpInst(Pred, X, Y);
5481 } else
5482 NonZero = isKnownNonZero(Z, Q);
5483
5484 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5485 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5486 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5487 return new ICmpInst(Pred, X, Y);
5488 }
5489 }
5490 }
5491
5492 BinaryOperator *SRem = nullptr;
5493 // icmp (srem X, Y), Y
5494 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5495 SRem = BO0;
5496 // icmp Y, (srem X, Y)
5497 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5498 Op0 == BO1->getOperand(1))
5499 SRem = BO1;
5500 if (SRem) {
5501 // We don't check hasOneUse to avoid increasing register pressure because
5502 // the value we use is the same value this instruction was already using.
5503 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5504 default:
5505 break;
5506 case ICmpInst::ICMP_EQ:
5507 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5508 case ICmpInst::ICMP_NE:
5509 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5510 case ICmpInst::ICMP_SGT:
5511 case ICmpInst::ICMP_SGE:
5512 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5514 case ICmpInst::ICMP_SLT:
5515 case ICmpInst::ICMP_SLE:
5516 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5518 }
5519 }
5520
5521 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5522 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5523 BO0->getOperand(1) == BO1->getOperand(1)) {
5524 switch (BO0->getOpcode()) {
5525 default:
5526 break;
5527 case Instruction::Add:
5528 case Instruction::Sub:
5529 case Instruction::Xor: {
5530 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5531 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5532
5533 const APInt *C;
5534 if (match(BO0->getOperand(1), m_APInt(C))) {
5535 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5536 if (C->isSignMask()) {
5537 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5538 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5539 }
5540
5541 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5542 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5543 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5544 NewPred = I.getSwappedPredicate(NewPred);
5545 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5546 }
5547 }
5548 break;
5549 }
5550 case Instruction::Mul: {
5551 if (!I.isEquality())
5552 break;
5553
5554 const APInt *C;
5555 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5556 !C->isOne()) {
5557 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5558 // Mask = -1 >> count-trailing-zeros(C).
5559 if (unsigned TZs = C->countr_zero()) {
5560 Constant *Mask = ConstantInt::get(
5561 BO0->getType(),
5562 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5563 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5564 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5565 return new ICmpInst(Pred, And1, And2);
5566 }
5567 }
5568 break;
5569 }
5570 case Instruction::UDiv:
5571 case Instruction::LShr:
5572 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5573 break;
5574 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5575
5576 case Instruction::SDiv:
5577 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5578 !BO0->isExact() || !BO1->isExact())
5579 break;
5580 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5581
5582 case Instruction::AShr:
5583 if (!BO0->isExact() || !BO1->isExact())
5584 break;
5585 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5586
5587 case Instruction::Shl: {
5588 bool NUW = Op0HasNUW && Op1HasNUW;
5589 bool NSW = Op0HasNSW && Op1HasNSW;
5590 if (!NUW && !NSW)
5591 break;
5592 if (!NSW && I.isSigned())
5593 break;
5594 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5595 }
5596 }
5597 }
5598
5599 if (BO0) {
5600 // Transform A & (L - 1) `ult` L --> L != 0
5601 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5602 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5603
5604 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5605 auto *Zero = Constant::getNullValue(BO0->getType());
5606 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5607 }
5608 }
5609
5610 // For unsigned predicates / eq / ne:
5611 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5612 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5613 if (!ICmpInst::isSigned(Pred)) {
5614 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5615 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5616 Constant::getNullValue(Op1->getType()));
5617 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5618 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5619 Constant::getNullValue(Op0->getType()), Op0);
5620 }
5621
5623 return replaceInstUsesWith(I, V);
5624
5625 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5626 return R;
5627
5629 return replaceInstUsesWith(I, V);
5630
5632 return replaceInstUsesWith(I, V);
5633
5634 return nullptr;
5635}
5636
5637/// Fold icmp Pred min|max(X, Y), Z.
5640 Value *Z, CmpPredicate Pred) {
5641 Value *X = MinMax->getLHS();
5642 Value *Y = MinMax->getRHS();
5643 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5644 return nullptr;
5645 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5646 // Revert the transform signed pred -> unsigned pred
5647 // TODO: We can flip the signedness of predicate if both operands of icmp
5648 // are negative.
5649 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5650 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5652 } else
5653 return nullptr;
5654 }
5655 SimplifyQuery Q = SQ.getWithInstruction(&I);
5656 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5657 if (!Val)
5658 return std::nullopt;
5659 if (match(Val, m_One()))
5660 return true;
5661 if (match(Val, m_Zero()))
5662 return false;
5663 return std::nullopt;
5664 };
5665 // Remove samesign here since it is illegal to keep it when we speculatively
5666 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5667 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5668 // -46, -32)`. `X` is allowed to be non-negative here.
5669 Pred = Pred.dropSameSign();
5670 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5671 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5672 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5673 return nullptr;
5674 if (!CmpXZ.has_value()) {
5675 std::swap(X, Y);
5676 std::swap(CmpXZ, CmpYZ);
5677 }
5678
5679 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5680 if (CmpYZ.has_value())
5681 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5682 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5683 };
5684
5685 switch (Pred) {
5686 case ICmpInst::ICMP_EQ:
5687 case ICmpInst::ICMP_NE: {
5688 // If X == Z:
5689 // Expr Result
5690 // min(X, Y) == Z X <= Y
5691 // max(X, Y) == Z X >= Y
5692 // min(X, Y) != Z X > Y
5693 // max(X, Y) != Z X < Y
5694 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5695 ICmpInst::Predicate NewPred =
5696 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5697 if (Pred == ICmpInst::ICMP_NE)
5698 NewPred = ICmpInst::getInversePredicate(NewPred);
5699 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5700 }
5701 // Otherwise (X != Z):
5702 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5703 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5704 if (!MinMaxCmpXZ.has_value()) {
5705 std::swap(X, Y);
5706 std::swap(CmpXZ, CmpYZ);
5707 // Re-check pre-condition X != Z
5708 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5709 break;
5710 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5711 }
5712 if (!MinMaxCmpXZ.has_value())
5713 break;
5714 if (*MinMaxCmpXZ) {
5715 // Expr Fact Result
5716 // min(X, Y) == Z X < Z false
5717 // max(X, Y) == Z X > Z false
5718 // min(X, Y) != Z X < Z true
5719 // max(X, Y) != Z X > Z true
5720 return replaceInstUsesWith(
5721 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5722 } else {
5723 // Expr Fact Result
5724 // min(X, Y) == Z X > Z Y == Z
5725 // max(X, Y) == Z X < Z Y == Z
5726 // min(X, Y) != Z X > Z Y != Z
5727 // max(X, Y) != Z X < Z Y != Z
5728 return FoldIntoCmpYZ();
5729 }
5730 break;
5731 }
5732 case ICmpInst::ICMP_SLT:
5733 case ICmpInst::ICMP_ULT:
5734 case ICmpInst::ICMP_SLE:
5735 case ICmpInst::ICMP_ULE:
5736 case ICmpInst::ICMP_SGT:
5737 case ICmpInst::ICMP_UGT:
5738 case ICmpInst::ICMP_SGE:
5739 case ICmpInst::ICMP_UGE: {
5740 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5741 if (*CmpXZ) {
5742 if (IsSame) {
5743 // Expr Fact Result
5744 // min(X, Y) < Z X < Z true
5745 // min(X, Y) <= Z X <= Z true
5746 // max(X, Y) > Z X > Z true
5747 // max(X, Y) >= Z X >= Z true
5748 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5749 } else {
5750 // Expr Fact Result
5751 // max(X, Y) < Z X < Z Y < Z
5752 // max(X, Y) <= Z X <= Z Y <= Z
5753 // min(X, Y) > Z X > Z Y > Z
5754 // min(X, Y) >= Z X >= Z Y >= Z
5755 return FoldIntoCmpYZ();
5756 }
5757 } else {
5758 if (IsSame) {
5759 // Expr Fact Result
5760 // min(X, Y) < Z X >= Z Y < Z
5761 // min(X, Y) <= Z X > Z Y <= Z
5762 // max(X, Y) > Z X <= Z Y > Z
5763 // max(X, Y) >= Z X < Z Y >= Z
5764 return FoldIntoCmpYZ();
5765 } else {
5766 // Expr Fact Result
5767 // max(X, Y) < Z X >= Z false
5768 // max(X, Y) <= Z X > Z false
5769 // min(X, Y) > Z X <= Z false
5770 // min(X, Y) >= Z X < Z false
5771 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5772 }
5773 }
5774 break;
5775 }
5776 default:
5777 break;
5778 }
5779
5780 return nullptr;
5781}
5782
5783// Canonicalize checking for a power-of-2-or-zero value:
5785 InstCombiner::BuilderTy &Builder) {
5786 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5787 const CmpInst::Predicate Pred = I.getPredicate();
5788 Value *A = nullptr;
5789 bool CheckIs;
5790 if (I.isEquality()) {
5791 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5792 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5793 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5794 m_Deferred(A)))) ||
5795 !match(Op1, m_ZeroInt()))
5796 A = nullptr;
5797
5798 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5799 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5800 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5801 A = Op1;
5802 else if (match(Op1,
5804 A = Op0;
5805
5806 CheckIs = Pred == ICmpInst::ICMP_EQ;
5807 } else if (ICmpInst::isUnsigned(Pred)) {
5808 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5809 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5810
5811 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5813 m_Specific(Op1))))) {
5814 A = Op1;
5815 CheckIs = Pred == ICmpInst::ICMP_UGE;
5816 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5818 m_Specific(Op0))))) {
5819 A = Op0;
5820 CheckIs = Pred == ICmpInst::ICMP_ULE;
5821 }
5822 }
5823
5824 if (A) {
5825 Type *Ty = A->getType();
5826 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5827 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5828 ConstantInt::get(Ty, 2))
5829 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5830 ConstantInt::get(Ty, 1));
5831 }
5832
5833 return nullptr;
5834}
5835
5836/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5837using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5839 bool AllowRecursion) {
5841 if (!Inst || !Inst->hasOneUse())
5842 return;
5843
5844 switch (Inst->getOpcode()) {
5845 case Instruction::Add:
5846 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5847 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5848 break;
5849 case Instruction::Sub:
5850 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5851 break;
5852 case Instruction::Xor:
5853 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5854 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5855 break;
5856 case Instruction::Select:
5857 if (AllowRecursion) {
5858 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5859 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5860 }
5861 break;
5862 default:
5863 break;
5864 }
5865}
5866
5868
5872
5874 return {OffsetKind::Invalid, nullptr, nullptr, nullptr};
5875 }
5877 return {OffsetKind::Value, V, nullptr, nullptr};
5878 }
5879 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV) {
5880 return {OffsetKind::Select, Cond, TrueV, FalseV};
5881 }
5882 bool isValid() const { return Kind != OffsetKind::Invalid; }
5884 switch (Kind) {
5886 llvm_unreachable("Invalid offset result");
5887 case OffsetKind::Value:
5888 return V0;
5889 case OffsetKind::Select:
5890 return Builder.CreateSelect(V0, V1, V2);
5891 }
5892 llvm_unreachable("Unknown OffsetKind enum");
5893 }
5894};
5895
5896/// Offset both sides of an equality icmp to see if we can save some
5897/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
5898/// Note: This operation should not introduce poison.
5900 InstCombiner::BuilderTy &Builder,
5901 const SimplifyQuery &SQ) {
5902 assert(I.isEquality() && "Expected an equality icmp");
5903 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5904 if (!Op0->getType()->isIntOrIntVectorTy())
5905 return nullptr;
5906
5907 SmallVector<OffsetOp, 4> OffsetOps;
5908 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
5909 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
5910
5911 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
5912 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
5913 // Avoid infinite loops by checking if RHS is an identity for the BinOp.
5914 if (!Simplified || Simplified == V)
5915 return nullptr;
5916 // Reject constant expressions as they don't simplify things.
5917 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
5918 return nullptr;
5919 // Check if the transformation introduces poison.
5920 return impliesPoison(RHS, V) ? Simplified : nullptr;
5921 };
5922
5923 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
5924 Value *RHS) -> OffsetResult {
5925 if (auto *Sel = dyn_cast<SelectInst>(V)) {
5926 if (!Sel->hasOneUse())
5927 return OffsetResult::invalid();
5928 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
5929 if (!TrueVal)
5930 return OffsetResult::invalid();
5931 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
5932 if (!FalseVal)
5933 return OffsetResult::invalid();
5934 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal);
5935 }
5936 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
5937 return OffsetResult::value(Simplified);
5938 return OffsetResult::invalid();
5939 };
5940
5941 for (auto [BinOp, RHS] : OffsetOps) {
5942 auto BinOpc = static_cast<unsigned>(BinOp);
5943
5944 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
5945 if (!Op0Result.isValid())
5946 continue;
5947 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
5948 if (!Op1Result.isValid())
5949 continue;
5950
5951 Value *NewLHS = Op0Result.materialize(Builder);
5952 Value *NewRHS = Op1Result.materialize(Builder);
5953 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
5954 }
5955
5956 return nullptr;
5957}
5958
5960 if (!I.isEquality())
5961 return nullptr;
5962
5963 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5964 const CmpInst::Predicate Pred = I.getPredicate();
5965 Value *A, *B, *C, *D;
5966 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5967 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5968 Value *OtherVal = A == Op1 ? B : A;
5969 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5970 }
5971
5972 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5973 // A^c1 == C^c2 --> A == C^(c1^c2)
5974 ConstantInt *C1, *C2;
5975 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5976 Op1->hasOneUse()) {
5977 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5978 Value *Xor = Builder.CreateXor(C, NC);
5979 return new ICmpInst(Pred, A, Xor);
5980 }
5981
5982 // A^B == A^D -> B == D
5983 if (A == C)
5984 return new ICmpInst(Pred, B, D);
5985 if (A == D)
5986 return new ICmpInst(Pred, B, C);
5987 if (B == C)
5988 return new ICmpInst(Pred, A, D);
5989 if (B == D)
5990 return new ICmpInst(Pred, A, C);
5991 }
5992 }
5993
5994 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5995 // A == (A^B) -> B == 0
5996 Value *OtherVal = A == Op0 ? B : A;
5997 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5998 }
5999
6000 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6001 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6002 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6003 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6004
6005 if (A == C) {
6006 X = B;
6007 Y = D;
6008 Z = A;
6009 } else if (A == D) {
6010 X = B;
6011 Y = C;
6012 Z = A;
6013 } else if (B == C) {
6014 X = A;
6015 Y = D;
6016 Z = B;
6017 } else if (B == D) {
6018 X = A;
6019 Y = C;
6020 Z = B;
6021 }
6022
6023 if (X) {
6024 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6025 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6026 // instructions.
6027 const APInt *C0, *C1;
6028 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6029 (*C0 ^ *C1).isNegatedPowerOf2();
6030
6031 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6032 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6033 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6034 int UseCnt =
6035 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6036 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6037 if (XorIsNegP2 || UseCnt >= 2) {
6038 // Build (X^Y) & Z
6039 Op1 = Builder.CreateXor(X, Y);
6040 Op1 = Builder.CreateAnd(Op1, Z);
6041 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6042 }
6043 }
6044 }
6045
6046 {
6047 // Similar to above, but specialized for constant because invert is needed:
6048 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6049 Value *X, *Y;
6050 Constant *C;
6051 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6052 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6053 Value *Xor = Builder.CreateXor(X, Y);
6054 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6055 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6056 }
6057 }
6058
6059 if (match(Op1, m_ZExt(m_Value(A))) &&
6060 (Op0->hasOneUse() || Op1->hasOneUse())) {
6061 // (B & (Pow2C-1)) == zext A --> A == trunc B
6062 // (B & (Pow2C-1)) != zext A --> A != trunc B
6063 const APInt *MaskC;
6064 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6065 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6066 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6067 }
6068
6069 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6070 // For lshr and ashr pairs.
6071 const APInt *AP1, *AP2;
6072 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6073 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6074 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6075 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6076 if (*AP1 != *AP2)
6077 return nullptr;
6078 unsigned TypeBits = AP1->getBitWidth();
6079 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6080 if (ShAmt < TypeBits && ShAmt != 0) {
6081 ICmpInst::Predicate NewPred =
6083 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6084 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6085 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6086 }
6087 }
6088
6089 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6090 ConstantInt *Cst1;
6091 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6092 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6093 unsigned TypeBits = Cst1->getBitWidth();
6094 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6095 if (ShAmt < TypeBits && ShAmt != 0) {
6096 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6097 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6098 Value *And =
6099 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6100 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6101 }
6102 }
6103
6104 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6105 // "icmp (and X, mask), cst"
6106 uint64_t ShAmt = 0;
6107 if (Op0->hasOneUse() &&
6108 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6109 match(Op1, m_ConstantInt(Cst1)) &&
6110 // Only do this when A has multiple uses. This is most important to do
6111 // when it exposes other optimizations.
6112 !A->hasOneUse()) {
6113 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6114
6115 if (ShAmt < ASize) {
6116 APInt MaskV =
6118 MaskV <<= ShAmt;
6119
6120 APInt CmpV = Cst1->getValue().zext(ASize);
6121 CmpV <<= ShAmt;
6122
6123 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6124 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6125 }
6126 }
6127
6129 return ICmp;
6130
6131 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6132 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6133 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6134 // few steps of instcombine.
6135 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6136 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6138 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6139 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6141 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6142 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6144 Add, ConstantInt::get(A->getType(), C.shl(1)));
6145 }
6146
6147 // Canonicalize:
6148 // Assume B_Pow2 != 0
6149 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6150 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6151 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6152 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6153 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6155
6156 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6157 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6158 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6159 ConstantInt::getNullValue(Op1->getType()));
6160
6161 // Canonicalize:
6162 // icmp eq/ne X, OneUse(rotate-right(X))
6163 // -> icmp eq/ne X, rotate-left(X)
6164 // We generally try to convert rotate-right -> rotate-left, this just
6165 // canonicalizes another case.
6166 if (match(&I, m_c_ICmp(m_Value(A),
6168 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6169 return new ICmpInst(
6170 Pred, A,
6171 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6172
6173 // Canonicalize:
6174 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6175 Constant *Cst;
6178 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6179
6180 {
6181 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6182 auto m_Matcher =
6185 m_Sub(m_Value(B), m_Deferred(A)));
6186 std::optional<bool> IsZero = std::nullopt;
6187 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6188 m_Deferred(A))))
6189 IsZero = false;
6190 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6191 else if (match(&I,
6192 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6193 IsZero = true;
6194
6195 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6196 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6197 // -> (icmp eq/ne (and X, P2), 0)
6198 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6199 // -> (icmp eq/ne (and X, P2), P2)
6200 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6201 *IsZero ? A
6202 : ConstantInt::getNullValue(A->getType()));
6203 }
6204
6205 if (auto *Res = foldICmpEqualityWithOffset(
6206 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6207 return Res;
6208
6209 return nullptr;
6210}
6211
6213 ICmpInst::Predicate Pred = ICmp.getPredicate();
6214 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6215
6216 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6217 // The trunc masks high bits while the compare may effectively mask low bits.
6218 Value *X;
6219 const APInt *C;
6220 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6221 return nullptr;
6222
6223 // This matches patterns corresponding to tests of the signbit as well as:
6224 // (trunc X) pred C2 --> (X & Mask) == C
6225 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*WithTrunc=*/true,
6226 /*AllowNonZeroC=*/true)) {
6227 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6228 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6229 return new ICmpInst(Res->Pred, And, C);
6230 }
6231
6232 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6233 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6234 if (II->getIntrinsicID() == Intrinsic::cttz ||
6235 II->getIntrinsicID() == Intrinsic::ctlz) {
6236 unsigned MaxRet = SrcBits;
6237 // If the "is_zero_poison" argument is set, then we know at least
6238 // one bit is set in the input, so the result is always at least one
6239 // less than the full bitwidth of that input.
6240 if (match(II->getArgOperand(1), m_One()))
6241 MaxRet--;
6242
6243 // Make sure the destination is wide enough to hold the largest output of
6244 // the intrinsic.
6245 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6246 if (Instruction *I =
6247 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6248 return I;
6249 }
6250 }
6251
6252 return nullptr;
6253}
6254
6256 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6257 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6258 Value *X;
6259 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6260 return nullptr;
6261
6262 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6263 bool IsSignedCmp = ICmp.isSigned();
6264
6265 // icmp Pred (ext X), (ext Y)
6266 Value *Y;
6267 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6268 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6269 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6270
6271 if (IsZext0 != IsZext1) {
6272 // If X and Y and both i1
6273 // (icmp eq/ne (zext X) (sext Y))
6274 // eq -> (icmp eq (or X, Y), 0)
6275 // ne -> (icmp ne (or X, Y), 0)
6276 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6277 Y->getType()->isIntOrIntVectorTy(1))
6278 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6279 Constant::getNullValue(X->getType()));
6280
6281 // If we have mismatched casts and zext has the nneg flag, we can
6282 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6283
6284 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6285 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6286
6287 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6288 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6289
6290 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6291 IsSignedExt = true;
6292 else
6293 return nullptr;
6294 }
6295
6296 // Not an extension from the same type?
6297 Type *XTy = X->getType(), *YTy = Y->getType();
6298 if (XTy != YTy) {
6299 // One of the casts must have one use because we are creating a new cast.
6300 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6301 return nullptr;
6302 // Extend the narrower operand to the type of the wider operand.
6303 CastInst::CastOps CastOpcode =
6304 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6305 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6306 X = Builder.CreateCast(CastOpcode, X, YTy);
6307 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6308 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6309 else
6310 return nullptr;
6311 }
6312
6313 // (zext X) == (zext Y) --> X == Y
6314 // (sext X) == (sext Y) --> X == Y
6315 if (ICmp.isEquality())
6316 return new ICmpInst(ICmp.getPredicate(), X, Y);
6317
6318 // A signed comparison of sign extended values simplifies into a
6319 // signed comparison.
6320 if (IsSignedCmp && IsSignedExt)
6321 return new ICmpInst(ICmp.getPredicate(), X, Y);
6322
6323 // The other three cases all fold into an unsigned comparison.
6324 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6325 }
6326
6327 // Below here, we are only folding a compare with constant.
6328 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6329 if (!C)
6330 return nullptr;
6331
6332 // If a lossless truncate is possible...
6333 Type *SrcTy = CastOp0->getSrcTy();
6334 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6335 if (Res) {
6336 if (ICmp.isEquality())
6337 return new ICmpInst(ICmp.getPredicate(), X, Res);
6338
6339 // A signed comparison of sign extended values simplifies into a
6340 // signed comparison.
6341 if (IsSignedExt && IsSignedCmp)
6342 return new ICmpInst(ICmp.getPredicate(), X, Res);
6343
6344 // The other three cases all fold into an unsigned comparison.
6345 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6346 }
6347
6348 // The re-extended constant changed, partly changed (in the case of a vector),
6349 // or could not be determined to be equal (in the case of a constant
6350 // expression), so the constant cannot be represented in the shorter type.
6351 // All the cases that fold to true or false will have already been handled
6352 // by simplifyICmpInst, so only deal with the tricky case.
6353 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6354 return nullptr;
6355
6356 // Is source op positive?
6357 // icmp ult (sext X), C --> icmp sgt X, -1
6358 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6360
6361 // Is source op negative?
6362 // icmp ugt (sext X), C --> icmp slt X, 0
6363 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6365}
6366
6367/// Handle icmp (cast x), (cast or constant).
6369 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6370 // icmp compares only pointer's value.
6371 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6372 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6373 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6374 if (SimplifiedOp0 || SimplifiedOp1)
6375 return new ICmpInst(ICmp.getPredicate(),
6376 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6377 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6378
6379 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6380 if (!CastOp0)
6381 return nullptr;
6382 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6383 return nullptr;
6384
6385 Value *Op0Src = CastOp0->getOperand(0);
6386 Type *SrcTy = CastOp0->getSrcTy();
6387 Type *DestTy = CastOp0->getDestTy();
6388
6389 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6390 // integer type is the same size as the pointer type.
6391 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6392 if (isa<VectorType>(PtrTy)) {
6393 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6394 IntTy = cast<VectorType>(IntTy)->getElementType();
6395 }
6396 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6397 };
6398 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6399 CompatibleSizes(SrcTy, DestTy)) {
6400 Value *NewOp1 = nullptr;
6401 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6402 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6403 if (PtrSrc->getType() == Op0Src->getType())
6404 NewOp1 = PtrToIntOp1->getOperand(0);
6405 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6406 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6407 }
6408
6409 if (NewOp1)
6410 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6411 }
6412
6413 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6414 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6415 CompatibleSizes(DestTy, SrcTy)) {
6416 Value *NewOp1 = nullptr;
6417 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6418 Value *IntSrc = IntToPtrOp1->getOperand(0);
6419 if (IntSrc->getType() == Op0Src->getType())
6420 NewOp1 = IntToPtrOp1->getOperand(0);
6421 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6422 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6423 }
6424
6425 if (NewOp1)
6426 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6427 }
6428
6429 if (Instruction *R = foldICmpWithTrunc(ICmp))
6430 return R;
6431
6432 return foldICmpWithZextOrSext(ICmp);
6433}
6434
6436 bool IsSigned) {
6437 switch (BinaryOp) {
6438 default:
6439 llvm_unreachable("Unsupported binary op");
6440 case Instruction::Add:
6441 case Instruction::Sub:
6442 return match(RHS, m_Zero());
6443 case Instruction::Mul:
6444 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6445 match(RHS, m_One());
6446 }
6447}
6448
6451 bool IsSigned, Value *LHS, Value *RHS,
6452 Instruction *CxtI) const {
6453 switch (BinaryOp) {
6454 default:
6455 llvm_unreachable("Unsupported binary op");
6456 case Instruction::Add:
6457 if (IsSigned)
6458 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6459 else
6460 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6461 case Instruction::Sub:
6462 if (IsSigned)
6463 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6464 else
6465 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6466 case Instruction::Mul:
6467 if (IsSigned)
6468 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6469 else
6470 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6471 }
6472}
6473
6474bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6475 bool IsSigned, Value *LHS,
6476 Value *RHS, Instruction &OrigI,
6477 Value *&Result,
6478 Constant *&Overflow) {
6479 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6480 std::swap(LHS, RHS);
6481
6482 // If the overflow check was an add followed by a compare, the insertion point
6483 // may be pointing to the compare. We want to insert the new instructions
6484 // before the add in case there are uses of the add between the add and the
6485 // compare.
6486 Builder.SetInsertPoint(&OrigI);
6487
6488 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6489 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6490 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6491
6492 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6493 Result = LHS;
6494 Overflow = ConstantInt::getFalse(OverflowTy);
6495 return true;
6496 }
6497
6498 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6500 return false;
6503 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6504 Result->takeName(&OrigI);
6505 Overflow = ConstantInt::getTrue(OverflowTy);
6506 return true;
6508 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6509 Result->takeName(&OrigI);
6510 Overflow = ConstantInt::getFalse(OverflowTy);
6511 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6512 if (IsSigned)
6513 Inst->setHasNoSignedWrap();
6514 else
6515 Inst->setHasNoUnsignedWrap();
6516 }
6517 return true;
6518 }
6519
6520 llvm_unreachable("Unexpected overflow result");
6521}
6522
6523/// Recognize and process idiom involving test for multiplication
6524/// overflow.
6525///
6526/// The caller has matched a pattern of the form:
6527/// I = cmp u (mul(zext A, zext B), V
6528/// The function checks if this is a test for overflow and if so replaces
6529/// multiplication with call to 'mul.with.overflow' intrinsic.
6530///
6531/// \param I Compare instruction.
6532/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6533/// the compare instruction. Must be of integer type.
6534/// \param OtherVal The other argument of compare instruction.
6535/// \returns Instruction which must replace the compare instruction, NULL if no
6536/// replacement required.
6538 const APInt *OtherVal,
6539 InstCombinerImpl &IC) {
6540 // Don't bother doing this transformation for pointers, don't do it for
6541 // vectors.
6542 if (!isa<IntegerType>(MulVal->getType()))
6543 return nullptr;
6544
6545 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6546 if (!MulInstr)
6547 return nullptr;
6548 assert(MulInstr->getOpcode() == Instruction::Mul);
6549
6550 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6551 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6552 assert(LHS->getOpcode() == Instruction::ZExt);
6553 assert(RHS->getOpcode() == Instruction::ZExt);
6554 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6555
6556 // Calculate type and width of the result produced by mul.with.overflow.
6557 Type *TyA = A->getType(), *TyB = B->getType();
6558 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6559 WidthB = TyB->getPrimitiveSizeInBits();
6560 unsigned MulWidth;
6561 Type *MulType;
6562 if (WidthB > WidthA) {
6563 MulWidth = WidthB;
6564 MulType = TyB;
6565 } else {
6566 MulWidth = WidthA;
6567 MulType = TyA;
6568 }
6569
6570 // In order to replace the original mul with a narrower mul.with.overflow,
6571 // all uses must ignore upper bits of the product. The number of used low
6572 // bits must be not greater than the width of mul.with.overflow.
6573 if (MulVal->hasNUsesOrMore(2))
6574 for (User *U : MulVal->users()) {
6575 if (U == &I)
6576 continue;
6577 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6578 // Check if truncation ignores bits above MulWidth.
6579 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6580 if (TruncWidth > MulWidth)
6581 return nullptr;
6582 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6583 // Check if AND ignores bits above MulWidth.
6584 if (BO->getOpcode() != Instruction::And)
6585 return nullptr;
6586 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6587 const APInt &CVal = CI->getValue();
6588 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6589 return nullptr;
6590 } else {
6591 // In this case we could have the operand of the binary operation
6592 // being defined in another block, and performing the replacement
6593 // could break the dominance relation.
6594 return nullptr;
6595 }
6596 } else {
6597 // Other uses prohibit this transformation.
6598 return nullptr;
6599 }
6600 }
6601
6602 // Recognize patterns
6603 switch (I.getPredicate()) {
6604 case ICmpInst::ICMP_UGT: {
6605 // Recognize pattern:
6606 // mulval = mul(zext A, zext B)
6607 // cmp ugt mulval, max
6608 APInt MaxVal = APInt::getMaxValue(MulWidth);
6609 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6610 if (MaxVal.eq(*OtherVal))
6611 break; // Recognized
6612 return nullptr;
6613 }
6614
6615 case ICmpInst::ICMP_ULT: {
6616 // Recognize pattern:
6617 // mulval = mul(zext A, zext B)
6618 // cmp ule mulval, max + 1
6619 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6620 if (MaxVal.eq(*OtherVal))
6621 break; // Recognized
6622 return nullptr;
6623 }
6624
6625 default:
6626 return nullptr;
6627 }
6628
6629 InstCombiner::BuilderTy &Builder = IC.Builder;
6630 Builder.SetInsertPoint(MulInstr);
6631
6632 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6633 Value *MulA = A, *MulB = B;
6634 if (WidthA < MulWidth)
6635 MulA = Builder.CreateZExt(A, MulType);
6636 if (WidthB < MulWidth)
6637 MulB = Builder.CreateZExt(B, MulType);
6638 CallInst *Call =
6639 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6640 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6641 IC.addToWorklist(MulInstr);
6642
6643 // If there are uses of mul result other than the comparison, we know that
6644 // they are truncation or binary AND. Change them to use result of
6645 // mul.with.overflow and adjust properly mask/size.
6646 if (MulVal->hasNUsesOrMore(2)) {
6647 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6648 for (User *U : make_early_inc_range(MulVal->users())) {
6649 if (U == &I)
6650 continue;
6651 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6652 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6653 IC.replaceInstUsesWith(*TI, Mul);
6654 else
6655 TI->setOperand(0, Mul);
6656 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6657 assert(BO->getOpcode() == Instruction::And);
6658 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6659 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6660 APInt ShortMask = CI->getValue().trunc(MulWidth);
6661 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6662 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6663 IC.replaceInstUsesWith(*BO, Zext);
6664 } else {
6665 llvm_unreachable("Unexpected Binary operation");
6666 }
6668 }
6669 }
6670
6671 // The original icmp gets replaced with the overflow value, maybe inverted
6672 // depending on predicate.
6673 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6674 Value *Res = Builder.CreateExtractValue(Call, 1);
6675 return BinaryOperator::CreateNot(Res);
6676 }
6677
6678 return ExtractValueInst::Create(Call, 1);
6679}
6680
6681/// When performing a comparison against a constant, it is possible that not all
6682/// the bits in the LHS are demanded. This helper method computes the mask that
6683/// IS demanded.
6685 const APInt *RHS;
6686 if (!match(I.getOperand(1), m_APInt(RHS)))
6688
6689 // If this is a normal comparison, it demands all bits. If it is a sign bit
6690 // comparison, it only demands the sign bit.
6691 bool UnusedBit;
6692 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6694
6695 switch (I.getPredicate()) {
6696 // For a UGT comparison, we don't care about any bits that
6697 // correspond to the trailing ones of the comparand. The value of these
6698 // bits doesn't impact the outcome of the comparison, because any value
6699 // greater than the RHS must differ in a bit higher than these due to carry.
6700 case ICmpInst::ICMP_UGT:
6701 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6702
6703 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6704 // Any value less than the RHS must differ in a higher bit because of carries.
6705 case ICmpInst::ICMP_ULT:
6706 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6707
6708 default:
6710 }
6711}
6712
6713/// Check that one use is in the same block as the definition and all
6714/// other uses are in blocks dominated by a given block.
6715///
6716/// \param DI Definition
6717/// \param UI Use
6718/// \param DB Block that must dominate all uses of \p DI outside
6719/// the parent block
6720/// \return true when \p UI is the only use of \p DI in the parent block
6721/// and all other uses of \p DI are in blocks dominated by \p DB.
6722///
6724 const Instruction *UI,
6725 const BasicBlock *DB) const {
6726 assert(DI && UI && "Instruction not defined\n");
6727 // Ignore incomplete definitions.
6728 if (!DI->getParent())
6729 return false;
6730 // DI and UI must be in the same block.
6731 if (DI->getParent() != UI->getParent())
6732 return false;
6733 // Protect from self-referencing blocks.
6734 if (DI->getParent() == DB)
6735 return false;
6736 for (const User *U : DI->users()) {
6737 auto *Usr = cast<Instruction>(U);
6738 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6739 return false;
6740 }
6741 return true;
6742}
6743
6744/// Return true when the instruction sequence within a block is select-cmp-br.
6746 const BasicBlock *BB = SI->getParent();
6747 if (!BB)
6748 return false;
6750 if (!BI || BI->getNumSuccessors() != 2)
6751 return false;
6752 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6753 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6754 return false;
6755 return true;
6756}
6757
6758/// True when a select result is replaced by one of its operands
6759/// in select-icmp sequence. This will eventually result in the elimination
6760/// of the select.
6761///
6762/// \param SI Select instruction
6763/// \param Icmp Compare instruction
6764/// \param SIOpd Operand that replaces the select
6765///
6766/// Notes:
6767/// - The replacement is global and requires dominator information
6768/// - The caller is responsible for the actual replacement
6769///
6770/// Example:
6771///
6772/// entry:
6773/// %4 = select i1 %3, %C* %0, %C* null
6774/// %5 = icmp eq %C* %4, null
6775/// br i1 %5, label %9, label %7
6776/// ...
6777/// ; <label>:7 ; preds = %entry
6778/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6779/// ...
6780///
6781/// can be transformed to
6782///
6783/// %5 = icmp eq %C* %0, null
6784/// %6 = select i1 %3, i1 %5, i1 true
6785/// br i1 %6, label %9, label %7
6786/// ...
6787/// ; <label>:7 ; preds = %entry
6788/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6789///
6790/// Similar when the first operand of the select is a constant or/and
6791/// the compare is for not equal rather than equal.
6792///
6793/// NOTE: The function is only called when the select and compare constants
6794/// are equal, the optimization can work only for EQ predicates. This is not a
6795/// major restriction since a NE compare should be 'normalized' to an equal
6796/// compare, which usually happens in the combiner and test case
6797/// select-cmp-br.ll checks for it.
6799 const ICmpInst *Icmp,
6800 const unsigned SIOpd) {
6801 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6803 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6804 // The check for the single predecessor is not the best that can be
6805 // done. But it protects efficiently against cases like when SI's
6806 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6807 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6808 // replaced can be reached on either path. So the uniqueness check
6809 // guarantees that the path all uses of SI (outside SI's parent) are on
6810 // is disjoint from all other paths out of SI. But that information
6811 // is more expensive to compute, and the trade-off here is in favor
6812 // of compile-time. It should also be noticed that we check for a single
6813 // predecessor and not only uniqueness. This to handle the situation when
6814 // Succ and Succ1 points to the same basic block.
6815 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6816 NumSel++;
6817 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6818 return true;
6819 }
6820 }
6821 return false;
6822}
6823
6824/// Try to fold the comparison based on range information we can get by checking
6825/// whether bits are known to be zero or one in the inputs.
6827 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6828 Type *Ty = Op0->getType();
6829 ICmpInst::Predicate Pred = I.getPredicate();
6830
6831 // Get scalar or pointer size.
6832 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6833 ? Ty->getScalarSizeInBits()
6834 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6835
6836 if (!BitWidth)
6837 return nullptr;
6838
6839 KnownBits Op0Known(BitWidth);
6840 KnownBits Op1Known(BitWidth);
6841
6842 {
6843 // Don't use dominating conditions when folding icmp using known bits. This
6844 // may convert signed into unsigned predicates in ways that other passes
6845 // (especially IndVarSimplify) may not be able to reliably undo.
6846 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6848 Op0Known, Q))
6849 return &I;
6850
6851 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6852 return &I;
6853 }
6854
6855 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6856 return new ICmpInst(
6857 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6858 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6859 return new ICmpInst(
6860 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
6861
6862 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
6863 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
6864
6865 // Given the known and unknown bits, compute a range that the LHS could be
6866 // in. Compute the Min, Max and RHS values based on the known bits. For the
6867 // EQ and NE we use unsigned values.
6868 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6869 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6870 if (I.isSigned()) {
6871 Op0Min = Op0Known.getSignedMinValue();
6872 Op0Max = Op0Known.getSignedMaxValue();
6873 Op1Min = Op1Known.getSignedMinValue();
6874 Op1Max = Op1Known.getSignedMaxValue();
6875 } else {
6876 Op0Min = Op0Known.getMinValue();
6877 Op0Max = Op0Known.getMaxValue();
6878 Op1Min = Op1Known.getMinValue();
6879 Op1Max = Op1Known.getMaxValue();
6880 }
6881
6882 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6883 // min/max canonical compare with some other compare. That could lead to
6884 // conflict with select canonicalization and infinite looping.
6885 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6886 auto isMinMaxCmp = [&](Instruction &Cmp) {
6887 if (!Cmp.hasOneUse())
6888 return false;
6889 Value *A, *B;
6890 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6892 return false;
6893 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6894 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6895 };
6896 if (!isMinMaxCmp(I)) {
6897 switch (Pred) {
6898 default:
6899 break;
6900 case ICmpInst::ICMP_ULT: {
6901 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6902 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6903 const APInt *CmpC;
6904 if (match(Op1, m_APInt(CmpC))) {
6905 // A <u C -> A == C-1 if min(A)+1 == C
6906 if (*CmpC == Op0Min + 1)
6907 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6908 ConstantInt::get(Op1->getType(), *CmpC - 1));
6909 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6910 // exceeds the log2 of C.
6911 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6912 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6913 Constant::getNullValue(Op1->getType()));
6914 }
6915 break;
6916 }
6917 case ICmpInst::ICMP_UGT: {
6918 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6919 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6920 const APInt *CmpC;
6921 if (match(Op1, m_APInt(CmpC))) {
6922 // A >u C -> A == C+1 if max(a)-1 == C
6923 if (*CmpC == Op0Max - 1)
6924 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6925 ConstantInt::get(Op1->getType(), *CmpC + 1));
6926 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6927 // exceeds the log2 of C.
6928 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6929 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6930 Constant::getNullValue(Op1->getType()));
6931 }
6932 break;
6933 }
6934 case ICmpInst::ICMP_SLT: {
6935 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6936 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6937 const APInt *CmpC;
6938 if (match(Op1, m_APInt(CmpC))) {
6939 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6940 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6941 ConstantInt::get(Op1->getType(), *CmpC - 1));
6942 }
6943 break;
6944 }
6945 case ICmpInst::ICMP_SGT: {
6946 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6947 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6948 const APInt *CmpC;
6949 if (match(Op1, m_APInt(CmpC))) {
6950 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6951 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6952 ConstantInt::get(Op1->getType(), *CmpC + 1));
6953 }
6954 break;
6955 }
6956 }
6957 }
6958
6959 // Based on the range information we know about the LHS, see if we can
6960 // simplify this comparison. For example, (x&4) < 8 is always true.
6961 switch (Pred) {
6962 default:
6963 break;
6964 case ICmpInst::ICMP_EQ:
6965 case ICmpInst::ICMP_NE: {
6966 // If all bits are known zero except for one, then we know at most one bit
6967 // is set. If the comparison is against zero, then this is a check to see if
6968 // *that* bit is set.
6969 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6970 if (Op1Known.isZero()) {
6971 // If the LHS is an AND with the same constant, look through it.
6972 Value *LHS = nullptr;
6973 const APInt *LHSC;
6974 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6975 *LHSC != Op0KnownZeroInverted)
6976 LHS = Op0;
6977
6978 Value *X;
6979 const APInt *C1;
6980 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6981 Type *XTy = X->getType();
6982 unsigned Log2C1 = C1->countr_zero();
6983 APInt C2 = Op0KnownZeroInverted;
6984 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6985 if (C2Pow2.isPowerOf2()) {
6986 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6987 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6988 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6989 unsigned Log2C2 = C2Pow2.countr_zero();
6990 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6991 auto NewPred =
6993 return new ICmpInst(NewPred, X, CmpC);
6994 }
6995 }
6996 }
6997
6998 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6999 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7000 (Op0Known & Op1Known) == Op0Known)
7001 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7002 ConstantInt::getNullValue(Op1->getType()));
7003 break;
7004 }
7005 case ICmpInst::ICMP_SGE:
7006 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7007 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7008 break;
7009 case ICmpInst::ICMP_SLE:
7010 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7011 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7012 break;
7013 case ICmpInst::ICMP_UGE:
7014 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7015 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7016 break;
7017 case ICmpInst::ICMP_ULE:
7018 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7019 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7020 break;
7021 }
7022
7023 // Turn a signed comparison into an unsigned one if both operands are known to
7024 // have the same sign. Set samesign if possible (except for equality
7025 // predicates).
7026 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7027 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7028 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7029 I.setPredicate(I.getUnsignedPredicate());
7030 I.setSameSign();
7031 return &I;
7032 }
7033
7034 return nullptr;
7035}
7036
7037/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7038/// then try to reduce patterns based on that limit.
7040 Value *X, *Y;
7041 CmpPredicate Pred;
7042
7043 // X must be 0 and bool must be true for "ULT":
7044 // X <u (zext i1 Y) --> (X == 0) & Y
7045 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7046 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7047 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7048
7049 // X must be 0 or bool must be true for "ULE":
7050 // X <=u (sext i1 Y) --> (X == 0) | Y
7051 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7052 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7053 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7054
7055 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7056 CmpPredicate Pred1, Pred2;
7057 const APInt *C;
7058 Instruction *ExtI;
7059 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7062 m_APInt(C)))))) &&
7063 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7064 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7065 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7066 auto CreateRangeCheck = [&] {
7067 Value *CmpV1 =
7068 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7069 Value *CmpV2 = Builder.CreateICmp(
7070 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7072 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7073 CmpV1, CmpV2);
7074 };
7075 if (C->isZero()) {
7076 if (Pred2 == ICmpInst::ICMP_EQ) {
7077 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7078 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7079 return replaceInstUsesWith(
7080 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7081 } else if (!IsSExt || HasOneUse) {
7082 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7083 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7084 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7085 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7086 return CreateRangeCheck();
7087 }
7088 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7089 if (Pred2 == ICmpInst::ICMP_NE) {
7090 // icmp eq X, (zext (icmp ne X, 1)) --> false
7091 // icmp ne X, (zext (icmp ne X, 1)) --> true
7092 // icmp eq X, (sext (icmp ne X, -1)) --> false
7093 // icmp ne X, (sext (icmp ne X, -1)) --> true
7094 return replaceInstUsesWith(
7095 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7096 } else if (!IsSExt || HasOneUse) {
7097 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7098 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7099 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7100 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7101 return CreateRangeCheck();
7102 }
7103 } else {
7104 // when C != 0 && C != 1:
7105 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7106 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7107 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7108 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7109 // when C != 0 && C != -1:
7110 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7111 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7112 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7113 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7114 return ICmpInst::Create(
7115 Instruction::ICmp, Pred1, X,
7116 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7117 ? (IsSExt ? -1 : 1)
7118 : 0));
7119 }
7120 }
7121
7122 return nullptr;
7123}
7124
7125/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7126/// it into the appropriate icmp lt or icmp gt instruction. This transform
7127/// allows them to be folded in visitICmpInst.
7129 ICmpInst::Predicate Pred = I.getPredicate();
7130 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7132 return nullptr;
7133
7134 Value *Op0 = I.getOperand(0);
7135 Value *Op1 = I.getOperand(1);
7136 auto *Op1C = dyn_cast<Constant>(Op1);
7137 if (!Op1C)
7138 return nullptr;
7139
7140 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7141 if (!FlippedStrictness)
7142 return nullptr;
7143
7144 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7145}
7146
7147/// If we have a comparison with a non-canonical predicate, if we can update
7148/// all the users, invert the predicate and adjust all the users.
7150 // Is the predicate already canonical?
7151 CmpInst::Predicate Pred = I.getPredicate();
7153 return nullptr;
7154
7155 // Can all users be adjusted to predicate inversion?
7156 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7157 return nullptr;
7158
7159 // Ok, we can canonicalize comparison!
7160 // Let's first invert the comparison's predicate.
7161 I.setPredicate(CmpInst::getInversePredicate(Pred));
7162 I.setName(I.getName() + ".not");
7163
7164 // And, adapt users.
7166
7167 return &I;
7168}
7169
7170/// Integer compare with boolean values can always be turned into bitwise ops.
7172 InstCombiner::BuilderTy &Builder) {
7173 Value *A = I.getOperand(0), *B = I.getOperand(1);
7174 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7175
7176 // A boolean compared to true/false can be simplified to Op0/true/false in
7177 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7178 // Cases not handled by InstSimplify are always 'not' of Op0.
7179 if (match(B, m_Zero())) {
7180 switch (I.getPredicate()) {
7181 case CmpInst::ICMP_EQ: // A == 0 -> !A
7182 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7183 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7185 default:
7186 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7187 }
7188 } else if (match(B, m_One())) {
7189 switch (I.getPredicate()) {
7190 case CmpInst::ICMP_NE: // A != 1 -> !A
7191 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7192 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7194 default:
7195 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7196 }
7197 }
7198
7199 switch (I.getPredicate()) {
7200 default:
7201 llvm_unreachable("Invalid icmp instruction!");
7202 case ICmpInst::ICMP_EQ:
7203 // icmp eq i1 A, B -> ~(A ^ B)
7204 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7205
7206 case ICmpInst::ICMP_NE:
7207 // icmp ne i1 A, B -> A ^ B
7208 return BinaryOperator::CreateXor(A, B);
7209
7210 case ICmpInst::ICMP_UGT:
7211 // icmp ugt -> icmp ult
7212 std::swap(A, B);
7213 [[fallthrough]];
7214 case ICmpInst::ICMP_ULT:
7215 // icmp ult i1 A, B -> ~A & B
7216 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7217
7218 case ICmpInst::ICMP_SGT:
7219 // icmp sgt -> icmp slt
7220 std::swap(A, B);
7221 [[fallthrough]];
7222 case ICmpInst::ICMP_SLT:
7223 // icmp slt i1 A, B -> A & ~B
7224 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7225
7226 case ICmpInst::ICMP_UGE:
7227 // icmp uge -> icmp ule
7228 std::swap(A, B);
7229 [[fallthrough]];
7230 case ICmpInst::ICMP_ULE:
7231 // icmp ule i1 A, B -> ~A | B
7232 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7233
7234 case ICmpInst::ICMP_SGE:
7235 // icmp sge -> icmp sle
7236 std::swap(A, B);
7237 [[fallthrough]];
7238 case ICmpInst::ICMP_SLE:
7239 // icmp sle i1 A, B -> A | ~B
7240 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7241 }
7242}
7243
7244// Transform pattern like:
7245// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7246// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7247// Into:
7248// (X l>> Y) != 0
7249// (X l>> Y) == 0
7251 InstCombiner::BuilderTy &Builder) {
7252 CmpPredicate Pred, NewPred;
7253 Value *X, *Y;
7254 if (match(&Cmp,
7255 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7256 switch (Pred) {
7257 case ICmpInst::ICMP_ULE:
7258 NewPred = ICmpInst::ICMP_NE;
7259 break;
7260 case ICmpInst::ICMP_UGT:
7261 NewPred = ICmpInst::ICMP_EQ;
7262 break;
7263 default:
7264 return nullptr;
7265 }
7266 } else if (match(&Cmp, m_c_ICmp(Pred,
7269 m_Add(m_Shl(m_One(), m_Value(Y)),
7270 m_AllOnes()))),
7271 m_Value(X)))) {
7272 // The variant with 'add' is not canonical, (the variant with 'not' is)
7273 // we only get it because it has extra uses, and can't be canonicalized,
7274
7275 switch (Pred) {
7276 case ICmpInst::ICMP_ULT:
7277 NewPred = ICmpInst::ICMP_NE;
7278 break;
7279 case ICmpInst::ICMP_UGE:
7280 NewPred = ICmpInst::ICMP_EQ;
7281 break;
7282 default:
7283 return nullptr;
7284 }
7285 } else
7286 return nullptr;
7287
7288 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7289 Constant *Zero = Constant::getNullValue(NewX->getType());
7290 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7291}
7292
7294 InstCombiner::BuilderTy &Builder) {
7295 const CmpInst::Predicate Pred = Cmp.getPredicate();
7296 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7297 Value *V1, *V2;
7298
7299 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7300 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7301 if (auto *I = dyn_cast<Instruction>(V))
7302 I->copyIRFlags(&Cmp);
7303 Module *M = Cmp.getModule();
7305 M, Intrinsic::vector_reverse, V->getType());
7306 return CallInst::Create(F, V);
7307 };
7308
7309 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7310 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7311 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7312 (LHS->hasOneUse() || RHS->hasOneUse()))
7313 return createCmpReverse(Pred, V1, V2);
7314
7315 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7316 if (LHS->hasOneUse() && isSplatValue(RHS))
7317 return createCmpReverse(Pred, V1, RHS);
7318 }
7319 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7320 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7321 return createCmpReverse(Pred, LHS, V2);
7322
7323 ArrayRef<int> M;
7324 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7325 return nullptr;
7326
7327 // If both arguments of the cmp are shuffles that use the same mask and
7328 // shuffle within a single vector, move the shuffle after the cmp:
7329 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7330 Type *V1Ty = V1->getType();
7331 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7332 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7333 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7334 return new ShuffleVectorInst(NewCmp, M);
7335 }
7336
7337 // Try to canonicalize compare with splatted operand and splat constant.
7338 // TODO: We could generalize this for more than splats. See/use the code in
7339 // InstCombiner::foldVectorBinop().
7340 Constant *C;
7341 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7342 return nullptr;
7343
7344 // Length-changing splats are ok, so adjust the constants as needed:
7345 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7346 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7347 int MaskSplatIndex;
7348 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7349 // We allow poison in matching, but this transform removes it for safety.
7350 // Demanded elements analysis should be able to recover some/all of that.
7351 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7352 ScalarC);
7353 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7354 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7355 return new ShuffleVectorInst(NewCmp, NewM);
7356 }
7357
7358 return nullptr;
7359}
7360
7361// extract(uadd.with.overflow(A, B), 0) ult A
7362// -> extract(uadd.with.overflow(A, B), 1)
7364 CmpInst::Predicate Pred = I.getPredicate();
7365 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7366
7367 Value *UAddOv;
7368 Value *A, *B;
7369 auto UAddOvResultPat = m_ExtractValue<0>(
7371 if (match(Op0, UAddOvResultPat) &&
7372 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7373 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7374 (match(A, m_One()) || match(B, m_One()))) ||
7375 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7376 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7377 // extract(uadd.with.overflow(A, B), 0) < A
7378 // extract(uadd.with.overflow(A, 1), 0) == 0
7379 // extract(uadd.with.overflow(A, -1), 0) != -1
7380 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7381 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7382 (Op0 == A || Op0 == B))
7383 // A > extract(uadd.with.overflow(A, B), 0)
7384 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7385 else
7386 return nullptr;
7387
7388 return ExtractValueInst::Create(UAddOv, 1);
7389}
7390
7392 if (!I.getOperand(0)->getType()->isPointerTy() ||
7394 I.getParent()->getParent(),
7395 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7396 return nullptr;
7397 }
7398 Instruction *Op;
7399 if (match(I.getOperand(0), m_Instruction(Op)) &&
7400 match(I.getOperand(1), m_Zero()) &&
7401 Op->isLaunderOrStripInvariantGroup()) {
7402 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7403 Op->getOperand(0), I.getOperand(1));
7404 }
7405 return nullptr;
7406}
7407
7408/// This function folds patterns produced by lowering of reduce idioms, such as
7409/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7410/// attempts to generate fewer number of scalar comparisons instead of vector
7411/// comparisons when possible.
7413 InstCombiner::BuilderTy &Builder,
7414 const DataLayout &DL) {
7415 if (I.getType()->isVectorTy())
7416 return nullptr;
7417 CmpPredicate OuterPred, InnerPred;
7418 Value *LHS, *RHS;
7419
7420 // Match lowering of @llvm.vector.reduce.and. Turn
7421 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7422 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7423 /// %res = icmp <pred> i8 %scalar_ne, 0
7424 ///
7425 /// into
7426 ///
7427 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7428 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7429 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7430 ///
7431 /// for <pred> in {ne, eq}.
7432 if (!match(&I, m_ICmp(OuterPred,
7434 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7435 m_Zero())))
7436 return nullptr;
7437 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7438 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7439 return nullptr;
7440 unsigned NumBits =
7441 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7442 // TODO: Relax this to "not wider than max legal integer type"?
7443 if (!DL.isLegalInteger(NumBits))
7444 return nullptr;
7445
7446 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7447 auto *ScalarTy = Builder.getIntNTy(NumBits);
7448 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7449 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7450 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7451 I.getName());
7452 }
7453
7454 return nullptr;
7455}
7456
7457// This helper will be called with icmp operands in both orders.
7459 Value *Op0, Value *Op1,
7460 ICmpInst &CxtI) {
7461 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7462 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7463 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7464 return NI;
7465
7466 if (auto *SI = dyn_cast<SelectInst>(Op0))
7467 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7468 return NI;
7469
7470 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7471 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7472 return Res;
7473
7474 {
7475 Value *X;
7476 const APInt *C;
7477 // icmp X+Cst, X
7478 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7479 return foldICmpAddOpConst(X, *C, Pred);
7480 }
7481
7482 // abs(X) >= X --> true
7483 // abs(X) u<= X --> true
7484 // abs(X) < X --> false
7485 // abs(X) u> X --> false
7486 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7487 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7488 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7489 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7490 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7491 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7492 {
7493 Value *X;
7494 Constant *C;
7496 match(Op1, m_Specific(X))) {
7497 Value *NullValue = Constant::getNullValue(X->getType());
7498 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7499 const APInt SMin =
7500 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7501 bool IsIntMinPosion = C->isAllOnesValue();
7502 switch (Pred) {
7503 case CmpInst::ICMP_ULE:
7504 case CmpInst::ICMP_SGE:
7505 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7506 case CmpInst::ICMP_UGT:
7507 case CmpInst::ICMP_SLT:
7509 case CmpInst::ICMP_UGE:
7510 case CmpInst::ICMP_SLE:
7511 case CmpInst::ICMP_EQ: {
7512 return replaceInstUsesWith(
7513 CxtI, IsIntMinPosion
7514 ? Builder.CreateICmpSGT(X, AllOnesValue)
7515 : Builder.CreateICmpULT(
7516 X, ConstantInt::get(X->getType(), SMin + 1)));
7517 }
7518 case CmpInst::ICMP_ULT:
7519 case CmpInst::ICMP_SGT:
7520 case CmpInst::ICMP_NE: {
7521 return replaceInstUsesWith(
7522 CxtI, IsIntMinPosion
7523 ? Builder.CreateICmpSLT(X, NullValue)
7524 : Builder.CreateICmpUGT(
7525 X, ConstantInt::get(X->getType(), SMin)));
7526 }
7527 default:
7528 llvm_unreachable("Invalid predicate!");
7529 }
7530 }
7531 }
7532
7533 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7534 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7535 return replaceInstUsesWith(CxtI, V);
7536
7537 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7538 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7539 {
7540 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7541 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7543 }
7544
7545 if (!ICmpInst::isUnsigned(Pred) &&
7546 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7547 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7549 }
7550 }
7551
7552 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7553 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7554 {
7555 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7556 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7558 }
7559
7560 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7561 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7562 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7564 }
7565 }
7566
7567 return nullptr;
7568}
7569
7571 bool Changed = false;
7572 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7573 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7574 unsigned Op0Cplxity = getComplexity(Op0);
7575 unsigned Op1Cplxity = getComplexity(Op1);
7576
7577 /// Orders the operands of the compare so that they are listed from most
7578 /// complex to least complex. This puts constants before unary operators,
7579 /// before binary operators.
7580 if (Op0Cplxity < Op1Cplxity) {
7581 I.swapOperands();
7582 std::swap(Op0, Op1);
7583 Changed = true;
7584 }
7585
7586 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7587 return replaceInstUsesWith(I, V);
7588
7589 // Comparing -val or val with non-zero is the same as just comparing val
7590 // ie, abs(val) != 0 -> val != 0
7591 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7592 Value *Cond, *SelectTrue, *SelectFalse;
7593 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7594 m_Value(SelectFalse)))) {
7595 if (Value *V = dyn_castNegVal(SelectTrue)) {
7596 if (V == SelectFalse)
7597 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7598 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7599 if (V == SelectTrue)
7600 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7601 }
7602 }
7603 }
7604
7606 return Res;
7607
7608 if (Op0->getType()->isIntOrIntVectorTy(1))
7610 return Res;
7611
7613 return Res;
7614
7616 return Res;
7617
7619 return Res;
7620
7622 return Res;
7623
7625 return Res;
7626
7628 return Res;
7629
7631 return Res;
7632
7633 // Test if the ICmpInst instruction is used exclusively by a select as
7634 // part of a minimum or maximum operation. If so, refrain from doing
7635 // any other folding. This helps out other analyses which understand
7636 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7637 // and CodeGen. And in this case, at least one of the comparison
7638 // operands has at least one user besides the compare (the select),
7639 // which would often largely negate the benefit of folding anyway.
7640 //
7641 // Do the same for the other patterns recognized by matchSelectPattern.
7642 if (I.hasOneUse())
7643 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7644 Value *A, *B;
7646 if (SPR.Flavor != SPF_UNKNOWN)
7647 return nullptr;
7648 }
7649
7650 // Do this after checking for min/max to prevent infinite looping.
7651 if (Instruction *Res = foldICmpWithZero(I))
7652 return Res;
7653
7654 // FIXME: We only do this after checking for min/max to prevent infinite
7655 // looping caused by a reverse canonicalization of these patterns for min/max.
7656 // FIXME: The organization of folds is a mess. These would naturally go into
7657 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7658 // down here after the min/max restriction.
7659 ICmpInst::Predicate Pred = I.getPredicate();
7660 const APInt *C;
7661 if (match(Op1, m_APInt(C))) {
7662 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7663 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7664 Constant *Zero = Constant::getNullValue(Op0->getType());
7665 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7666 }
7667
7668 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7669 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7671 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7672 }
7673 }
7674
7675 // The folds in here may rely on wrapping flags and special constants, so
7676 // they can break up min/max idioms in some cases but not seemingly similar
7677 // patterns.
7678 // FIXME: It may be possible to enhance select folding to make this
7679 // unnecessary. It may also be moot if we canonicalize to min/max
7680 // intrinsics.
7681 if (Instruction *Res = foldICmpBinOp(I, Q))
7682 return Res;
7683
7685 return Res;
7686
7687 // Try to match comparison as a sign bit test. Intentionally do this after
7688 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7689 if (Instruction *New = foldSignBitTest(I))
7690 return New;
7691
7692 if (auto *PN = dyn_cast<PHINode>(Op0))
7693 if (Instruction *NV = foldOpIntoPhi(I, PN))
7694 return NV;
7695 if (auto *PN = dyn_cast<PHINode>(Op1))
7696 if (Instruction *NV = foldOpIntoPhi(I, PN))
7697 return NV;
7698
7700 return Res;
7701
7702 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7703 return Res;
7704 if (Instruction *Res =
7705 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7706 return Res;
7707
7708 if (I.isCommutative()) {
7709 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7710 replaceOperand(I, 0, Pair->first);
7711 replaceOperand(I, 1, Pair->second);
7712 return &I;
7713 }
7714 }
7715
7716 // In case of a comparison with two select instructions having the same
7717 // condition, check whether one of the resulting branches can be simplified.
7718 // If so, just compare the other branch and select the appropriate result.
7719 // For example:
7720 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7721 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7722 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7723 // The icmp will result false for the false value of selects and the result
7724 // will depend upon the comparison of true values of selects if %cmp is
7725 // true. Thus, transform this into:
7726 // %cmp = icmp slt i32 %y, %z
7727 // %sel = select i1 %cond, i1 %cmp, i1 false
7728 // This handles similar cases to transform.
7729 {
7730 Value *Cond, *A, *B, *C, *D;
7731 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7733 (Op0->hasOneUse() || Op1->hasOneUse())) {
7734 // Check whether comparison of TrueValues can be simplified
7735 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7736 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7737 return SelectInst::Create(Cond, Res, NewICMP);
7738 }
7739 // Check whether comparison of FalseValues can be simplified
7740 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7741 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7742 return SelectInst::Create(Cond, NewICMP, Res);
7743 }
7744 }
7745 }
7746
7747 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7748 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7749 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7750 {
7751 Value *A, *B;
7752 CmpPredicate CmpPred;
7753 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7755 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7756 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7757 bool I0NUW = I0->hasNoUnsignedWrap();
7758 bool I1NUW = I1->hasNoUnsignedWrap();
7759 bool I0NSW = I0->hasNoSignedWrap();
7760 bool I1NSW = I1->hasNoSignedWrap();
7761 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
7762 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
7763 (ICmpInst::isEquality(Pred) &&
7764 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
7765 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
7766 ConstantInt::get(Op0->getType(), 0));
7767 }
7768 }
7769 }
7770
7771 // Try to optimize equality comparisons against alloca-based pointers.
7772 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7773 assert(Op1->getType()->isPointerTy() &&
7774 "Comparing pointer with non-pointer?");
7775 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7776 if (foldAllocaCmp(Alloca))
7777 return nullptr;
7778 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7779 if (foldAllocaCmp(Alloca))
7780 return nullptr;
7781 }
7782
7783 if (Instruction *Res = foldICmpBitCast(I))
7784 return Res;
7785
7786 // TODO: Hoist this above the min/max bailout.
7788 return R;
7789
7790 {
7791 Value *X, *Y;
7792 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7793 // and (X & ~Y) != 0 --> (X & Y) == 0
7794 // if A is a power of 2.
7795 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7796 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
7797 I.isEquality())
7798 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7799 Op1);
7800
7801 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7802 if (Op0->getType()->isIntOrIntVectorTy()) {
7803 bool ConsumesOp0, ConsumesOp1;
7804 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7805 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7806 (ConsumesOp0 || ConsumesOp1)) {
7807 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7808 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7809 assert(InvOp0 && InvOp1 &&
7810 "Mismatch between isFreeToInvert and getFreelyInverted");
7811 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7812 }
7813 }
7814
7815 Instruction *AddI = nullptr;
7817 m_Instruction(AddI))) &&
7818 isa<IntegerType>(X->getType())) {
7819 Value *Result;
7820 Constant *Overflow;
7821 // m_UAddWithOverflow can match patterns that do not include an explicit
7822 // "add" instruction, so check the opcode of the matched op.
7823 if (AddI->getOpcode() == Instruction::Add &&
7824 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7825 Result, Overflow)) {
7826 replaceInstUsesWith(*AddI, Result);
7827 eraseInstFromFunction(*AddI);
7828 return replaceInstUsesWith(I, Overflow);
7829 }
7830 }
7831
7832 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7833 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7834 match(Op1, m_APInt(C))) {
7835 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7836 return R;
7837 }
7838
7839 // Signbit test folds
7840 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7841 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7842 Instruction *ExtI;
7843 if ((I.isUnsigned() || I.isEquality()) &&
7844 match(Op1,
7846 Y->getType()->getScalarSizeInBits() == 1 &&
7847 (Op0->hasOneUse() || Op1->hasOneUse())) {
7848 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7849 Instruction *ShiftI;
7850 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7852 OpWidth - 1))))) {
7853 unsigned ExtOpc = ExtI->getOpcode();
7854 unsigned ShiftOpc = ShiftI->getOpcode();
7855 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7856 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7857 Value *SLTZero =
7858 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
7859 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7860 return replaceInstUsesWith(I, Cmp);
7861 }
7862 }
7863 }
7864 }
7865
7866 if (Instruction *Res = foldICmpEquality(I))
7867 return Res;
7868
7870 return Res;
7871
7872 if (Instruction *Res = foldICmpOfUAddOv(I))
7873 return Res;
7874
7875 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7876 // an i1 which indicates whether or not we successfully did the swap.
7877 //
7878 // Replace comparisons between the old value and the expected value with the
7879 // indicator that 'cmpxchg' returns.
7880 //
7881 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7882 // spuriously fail. In those cases, the old value may equal the expected
7883 // value but it is possible for the swap to not occur.
7884 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7885 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7886 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7887 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7888 !ACXI->isWeak())
7889 return ExtractValueInst::Create(ACXI, 1);
7890
7892 return Res;
7893
7894 if (I.getType()->isVectorTy())
7895 if (Instruction *Res = foldVectorCmp(I, Builder))
7896 return Res;
7897
7899 return Res;
7900
7902 return Res;
7903
7904 {
7905 Value *A;
7906 const APInt *C1, *C2;
7907 ICmpInst::Predicate Pred = I.getPredicate();
7908 if (ICmpInst::isEquality(Pred)) {
7909 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
7910 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
7911 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
7912 match(Op1, m_APInt(C2))) {
7913 Type *InputTy = A->getType();
7914 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
7915 // c2 must be non-negative at the bitwidth of a.
7916 if (C2->getActiveBits() < InputBitWidth) {
7917 APInt TruncC1 = C1->trunc(InputBitWidth);
7918 // Check if there are 1s in C1 high bits of size InputBitWidth.
7919 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
7920 TruncC1.setBit(InputBitWidth - 1);
7921 Value *AndInst = Builder.CreateAnd(A, TruncC1);
7922 return new ICmpInst(
7923 Pred, AndInst,
7924 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
7925 }
7926 }
7927 }
7928 }
7929
7930 return Changed ? &I : nullptr;
7931}
7932
7933/// Fold fcmp ([us]itofp x, cst) if possible.
7935 Instruction *LHSI,
7936 Constant *RHSC) {
7937 const APFloat *RHS;
7938 if (!match(RHSC, m_APFloat(RHS)))
7939 return nullptr;
7940
7941 // Get the width of the mantissa. We don't want to hack on conversions that
7942 // might lose information from the integer, e.g. "i64 -> float"
7943 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7944 if (MantissaWidth == -1)
7945 return nullptr; // Unknown.
7946
7947 Type *IntTy = LHSI->getOperand(0)->getType();
7948 unsigned IntWidth = IntTy->getScalarSizeInBits();
7949 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7950
7951 if (I.isEquality()) {
7952 FCmpInst::Predicate P = I.getPredicate();
7953 bool IsExact = false;
7954 APSInt RHSCvt(IntWidth, LHSUnsigned);
7955 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7956
7957 // If the floating point constant isn't an integer value, we know if we will
7958 // ever compare equal / not equal to it.
7959 if (!IsExact) {
7960 // TODO: Can never be -0.0 and other non-representable values
7961 APFloat RHSRoundInt(*RHS);
7963 if (*RHS != RHSRoundInt) {
7965 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7966
7968 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7969 }
7970 }
7971
7972 // TODO: If the constant is exactly representable, is it always OK to do
7973 // equality compares as integer?
7974 }
7975
7976 // Check to see that the input is converted from an integer type that is small
7977 // enough that preserves all bits. TODO: check here for "known" sign bits.
7978 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7979
7980 // Following test does NOT adjust IntWidth downwards for signed inputs,
7981 // because the most negative value still requires all the mantissa bits
7982 // to distinguish it from one less than that value.
7983 if ((int)IntWidth > MantissaWidth) {
7984 // Conversion would lose accuracy. Check if loss can impact comparison.
7985 int Exp = ilogb(*RHS);
7986 if (Exp == APFloat::IEK_Inf) {
7987 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7988 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7989 // Conversion could create infinity.
7990 return nullptr;
7991 } else {
7992 // Note that if RHS is zero or NaN, then Exp is negative
7993 // and first condition is trivially false.
7994 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7995 // Conversion could affect comparison.
7996 return nullptr;
7997 }
7998 }
7999
8000 // Otherwise, we can potentially simplify the comparison. We know that it
8001 // will always come through as an integer value and we know the constant is
8002 // not a NAN (it would have been previously simplified).
8003 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8004
8006 switch (I.getPredicate()) {
8007 default:
8008 llvm_unreachable("Unexpected predicate!");
8009 case FCmpInst::FCMP_UEQ:
8010 case FCmpInst::FCMP_OEQ:
8011 Pred = ICmpInst::ICMP_EQ;
8012 break;
8013 case FCmpInst::FCMP_UGT:
8014 case FCmpInst::FCMP_OGT:
8015 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8016 break;
8017 case FCmpInst::FCMP_UGE:
8018 case FCmpInst::FCMP_OGE:
8019 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8020 break;
8021 case FCmpInst::FCMP_ULT:
8022 case FCmpInst::FCMP_OLT:
8023 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8024 break;
8025 case FCmpInst::FCMP_ULE:
8026 case FCmpInst::FCMP_OLE:
8027 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8028 break;
8029 case FCmpInst::FCMP_UNE:
8030 case FCmpInst::FCMP_ONE:
8031 Pred = ICmpInst::ICMP_NE;
8032 break;
8033 case FCmpInst::FCMP_ORD:
8034 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8035 case FCmpInst::FCMP_UNO:
8036 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8037 }
8038
8039 // Now we know that the APFloat is a normal number, zero or inf.
8040
8041 // See if the FP constant is too large for the integer. For example,
8042 // comparing an i8 to 300.0.
8043 if (!LHSUnsigned) {
8044 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8045 // and large values.
8046 APFloat SMax(RHS->getSemantics());
8047 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8049 if (SMax < *RHS) { // smax < 13123.0
8050 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8051 Pred == ICmpInst::ICMP_SLE)
8052 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8053 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8054 }
8055 } else {
8056 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8057 // +INF and large values.
8058 APFloat UMax(RHS->getSemantics());
8059 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8061 if (UMax < *RHS) { // umax < 13123.0
8062 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8063 Pred == ICmpInst::ICMP_ULE)
8064 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8065 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8066 }
8067 }
8068
8069 if (!LHSUnsigned) {
8070 // See if the RHS value is < SignedMin.
8071 APFloat SMin(RHS->getSemantics());
8072 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8074 if (SMin > *RHS) { // smin > 12312.0
8075 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8076 Pred == ICmpInst::ICMP_SGE)
8077 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8078 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8079 }
8080 } else {
8081 // See if the RHS value is < UnsignedMin.
8082 APFloat UMin(RHS->getSemantics());
8083 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8085 if (UMin > *RHS) { // umin > 12312.0
8086 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8087 Pred == ICmpInst::ICMP_UGE)
8088 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8089 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8090 }
8091 }
8092
8093 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8094 // [0, UMAX], but it may still be fractional. Check whether this is the case
8095 // using the IsExact flag.
8096 // Don't do this for zero, because -0.0 is not fractional.
8097 APSInt RHSInt(IntWidth, LHSUnsigned);
8098 bool IsExact;
8099 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8100 if (!RHS->isZero()) {
8101 if (!IsExact) {
8102 // If we had a comparison against a fractional value, we have to adjust
8103 // the compare predicate and sometimes the value. RHSC is rounded towards
8104 // zero at this point.
8105 switch (Pred) {
8106 default:
8107 llvm_unreachable("Unexpected integer comparison!");
8108 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8109 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8110 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8111 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8112 case ICmpInst::ICMP_ULE:
8113 // (float)int <= 4.4 --> int <= 4
8114 // (float)int <= -4.4 --> false
8115 if (RHS->isNegative())
8116 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8117 break;
8118 case ICmpInst::ICMP_SLE:
8119 // (float)int <= 4.4 --> int <= 4
8120 // (float)int <= -4.4 --> int < -4
8121 if (RHS->isNegative())
8122 Pred = ICmpInst::ICMP_SLT;
8123 break;
8124 case ICmpInst::ICMP_ULT:
8125 // (float)int < -4.4 --> false
8126 // (float)int < 4.4 --> int <= 4
8127 if (RHS->isNegative())
8128 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8129 Pred = ICmpInst::ICMP_ULE;
8130 break;
8131 case ICmpInst::ICMP_SLT:
8132 // (float)int < -4.4 --> int < -4
8133 // (float)int < 4.4 --> int <= 4
8134 if (!RHS->isNegative())
8135 Pred = ICmpInst::ICMP_SLE;
8136 break;
8137 case ICmpInst::ICMP_UGT:
8138 // (float)int > 4.4 --> int > 4
8139 // (float)int > -4.4 --> true
8140 if (RHS->isNegative())
8141 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8142 break;
8143 case ICmpInst::ICMP_SGT:
8144 // (float)int > 4.4 --> int > 4
8145 // (float)int > -4.4 --> int >= -4
8146 if (RHS->isNegative())
8147 Pred = ICmpInst::ICMP_SGE;
8148 break;
8149 case ICmpInst::ICMP_UGE:
8150 // (float)int >= -4.4 --> true
8151 // (float)int >= 4.4 --> int > 4
8152 if (RHS->isNegative())
8153 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8154 Pred = ICmpInst::ICMP_UGT;
8155 break;
8156 case ICmpInst::ICMP_SGE:
8157 // (float)int >= -4.4 --> int >= -4
8158 // (float)int >= 4.4 --> int > 4
8159 if (!RHS->isNegative())
8160 Pred = ICmpInst::ICMP_SGT;
8161 break;
8162 }
8163 }
8164 }
8165
8166 // Lower this FP comparison into an appropriate integer version of the
8167 // comparison.
8168 return new ICmpInst(Pred, LHSI->getOperand(0),
8169 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8170}
8171
8172/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8174 Constant *RHSC) {
8175 // When C is not 0.0 and infinities are not allowed:
8176 // (C / X) < 0.0 is a sign-bit test of X
8177 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8178 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8179 //
8180 // Proof:
8181 // Multiply (C / X) < 0.0 by X * X / C.
8182 // - X is non zero, if it is the flag 'ninf' is violated.
8183 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8184 // the predicate. C is also non zero by definition.
8185 //
8186 // Thus X * X / C is non zero and the transformation is valid. [qed]
8187
8188 FCmpInst::Predicate Pred = I.getPredicate();
8189
8190 // Check that predicates are valid.
8191 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8192 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8193 return nullptr;
8194
8195 // Check that RHS operand is zero.
8196 if (!match(RHSC, m_AnyZeroFP()))
8197 return nullptr;
8198
8199 // Check fastmath flags ('ninf').
8200 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8201 return nullptr;
8202
8203 // Check the properties of the dividend. It must not be zero to avoid a
8204 // division by zero (see Proof).
8205 const APFloat *C;
8206 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8207 return nullptr;
8208
8209 if (C->isZero())
8210 return nullptr;
8211
8212 // Get swapped predicate if necessary.
8213 if (C->isNegative())
8214 Pred = I.getSwappedPredicate();
8215
8216 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8217}
8218
8219// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8220// Patterns include:
8221// fptrunc(x) < C --> x < ext(C)
8222// fptrunc(x) <= C --> x <= ext(C)
8223// fptrunc(x) > C --> x > ext(C)
8224// fptrunc(x) >= C --> x >= ext(C)
8225// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8226// due to precision loss.
8228 const Constant &C) {
8229 FCmpInst::Predicate Pred = I.getPredicate();
8230 bool RoundDown = false;
8231
8232 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8233 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8234 RoundDown = true;
8235 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8236 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8237 RoundDown = false;
8238 else
8239 return nullptr;
8240
8241 const APFloat *CValue;
8242 if (!match(&C, m_APFloat(CValue)))
8243 return nullptr;
8244
8245 if (CValue->isNaN() || CValue->isInfinity())
8246 return nullptr;
8247
8248 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8249 bool LosesInfo;
8250 APFloat Dest = Src;
8251 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8252 return Dest;
8253 };
8254
8255 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8256 APFloat NextValue = Value;
8257 NextValue.next(RoundDown);
8258 return NextValue;
8259 };
8260
8261 APFloat NextCValue = NextValue(*CValue, RoundDown);
8262
8263 Type *DestType = FPTrunc.getOperand(0)->getType();
8264 const fltSemantics &DestFltSema =
8265 DestType->getScalarType()->getFltSemantics();
8266
8267 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8268 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8269
8270 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8271 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8272 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8273 // value of 'CValue'.
8274 if (NextCValue.isInfinity()) {
8275 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8276 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8277
8278 ExtNextCValue = ExtCValue + Bias;
8279 }
8280
8281 APFloat ExtMidValue =
8282 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8283
8284 const fltSemantics &SrcFltSema =
8285 C.getType()->getScalarType()->getFltSemantics();
8286
8287 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8288 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8289 if (MidValue != *CValue)
8290 ExtMidValue.next(!RoundDown);
8291
8292 // Check whether 'ExtMidValue' is a valid result since the assumption on
8293 // imaged 'NextCValue' might not hold for new float types.
8294 // ppc_fp128 can't pass here when converting from max float because of
8295 // APFloat implementation.
8296 if (NextCValue.isInfinity()) {
8297 // ExtMidValue --- narrowed ---> Finite
8298 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8299 return nullptr;
8300
8301 // NextExtMidValue --- narrowed ---> Infinity
8302 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8303 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8304 return nullptr;
8305 }
8306
8307 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8308 ConstantFP::get(DestType, ExtMidValue), "", &I);
8309}
8310
8311/// Optimize fabs(X) compared with zero.
8313 Value *X;
8314 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8315 return nullptr;
8316
8317 const APFloat *C;
8318 if (!match(I.getOperand(1), m_APFloat(C)))
8319 return nullptr;
8320
8321 if (!C->isPosZero()) {
8322 if (!C->isSmallestNormalized())
8323 return nullptr;
8324
8325 const Function *F = I.getFunction();
8326 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8327 if (Mode.Input == DenormalMode::PreserveSign ||
8329
8330 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8331 Constant *Zero = ConstantFP::getZero(X->getType());
8332 return new FCmpInst(P, X, Zero, "", I);
8333 };
8334
8335 switch (I.getPredicate()) {
8336 case FCmpInst::FCMP_OLT:
8337 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8338 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8339 case FCmpInst::FCMP_UGE:
8340 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8341 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8342 case FCmpInst::FCMP_OGE:
8343 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8344 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8345 case FCmpInst::FCMP_ULT:
8346 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8347 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8348 default:
8349 break;
8350 }
8351 }
8352
8353 return nullptr;
8354 }
8355
8356 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8357 I->setPredicate(P);
8358 return IC.replaceOperand(*I, 0, X);
8359 };
8360
8361 switch (I.getPredicate()) {
8362 case FCmpInst::FCMP_UGE:
8363 case FCmpInst::FCMP_OLT:
8364 // fabs(X) >= 0.0 --> true
8365 // fabs(X) < 0.0 --> false
8366 llvm_unreachable("fcmp should have simplified");
8367
8368 case FCmpInst::FCMP_OGT:
8369 // fabs(X) > 0.0 --> X != 0.0
8370 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8371
8372 case FCmpInst::FCMP_UGT:
8373 // fabs(X) u> 0.0 --> X u!= 0.0
8374 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8375
8376 case FCmpInst::FCMP_OLE:
8377 // fabs(X) <= 0.0 --> X == 0.0
8378 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8379
8380 case FCmpInst::FCMP_ULE:
8381 // fabs(X) u<= 0.0 --> X u== 0.0
8382 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8383
8384 case FCmpInst::FCMP_OGE:
8385 // fabs(X) >= 0.0 --> !isnan(X)
8386 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8387 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8388
8389 case FCmpInst::FCMP_ULT:
8390 // fabs(X) u< 0.0 --> isnan(X)
8391 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8392 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8393
8394 case FCmpInst::FCMP_OEQ:
8395 case FCmpInst::FCMP_UEQ:
8396 case FCmpInst::FCMP_ONE:
8397 case FCmpInst::FCMP_UNE:
8398 case FCmpInst::FCMP_ORD:
8399 case FCmpInst::FCMP_UNO:
8400 // Look through the fabs() because it doesn't change anything but the sign.
8401 // fabs(X) == 0.0 --> X == 0.0,
8402 // fabs(X) != 0.0 --> X != 0.0
8403 // isnan(fabs(X)) --> isnan(X)
8404 // !isnan(fabs(X) --> !isnan(X)
8405 return replacePredAndOp0(&I, I.getPredicate(), X);
8406
8407 default:
8408 return nullptr;
8409 }
8410}
8411
8412/// Optimize sqrt(X) compared with zero.
8414 Value *X;
8415 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8416 return nullptr;
8417
8418 if (!match(I.getOperand(1), m_PosZeroFP()))
8419 return nullptr;
8420
8421 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8422 I.setPredicate(P);
8423 return IC.replaceOperand(I, 0, X);
8424 };
8425
8426 // Clear ninf flag if sqrt doesn't have it.
8427 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8428 I.setHasNoInfs(false);
8429
8430 switch (I.getPredicate()) {
8431 case FCmpInst::FCMP_OLT:
8432 case FCmpInst::FCMP_UGE:
8433 // sqrt(X) < 0.0 --> false
8434 // sqrt(X) u>= 0.0 --> true
8435 llvm_unreachable("fcmp should have simplified");
8436 case FCmpInst::FCMP_ULT:
8437 case FCmpInst::FCMP_ULE:
8438 case FCmpInst::FCMP_OGT:
8439 case FCmpInst::FCMP_OGE:
8440 case FCmpInst::FCMP_OEQ:
8441 case FCmpInst::FCMP_UNE:
8442 // sqrt(X) u< 0.0 --> X u< 0.0
8443 // sqrt(X) u<= 0.0 --> X u<= 0.0
8444 // sqrt(X) > 0.0 --> X > 0.0
8445 // sqrt(X) >= 0.0 --> X >= 0.0
8446 // sqrt(X) == 0.0 --> X == 0.0
8447 // sqrt(X) u!= 0.0 --> X u!= 0.0
8448 return IC.replaceOperand(I, 0, X);
8449
8450 case FCmpInst::FCMP_OLE:
8451 // sqrt(X) <= 0.0 --> X == 0.0
8452 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8453 case FCmpInst::FCMP_UGT:
8454 // sqrt(X) u> 0.0 --> X u!= 0.0
8455 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8456 case FCmpInst::FCMP_UEQ:
8457 // sqrt(X) u== 0.0 --> X u<= 0.0
8458 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8459 case FCmpInst::FCMP_ONE:
8460 // sqrt(X) != 0.0 --> X > 0.0
8461 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8462 case FCmpInst::FCMP_ORD:
8463 // !isnan(sqrt(X)) --> X >= 0.0
8464 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8465 case FCmpInst::FCMP_UNO:
8466 // isnan(sqrt(X)) --> X u< 0.0
8467 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8468 default:
8469 llvm_unreachable("Unexpected predicate!");
8470 }
8471}
8472
8474 CmpInst::Predicate Pred = I.getPredicate();
8475 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8476
8477 // Canonicalize fneg as Op1.
8478 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8479 std::swap(Op0, Op1);
8480 Pred = I.getSwappedPredicate();
8481 }
8482
8483 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8484 return nullptr;
8485
8486 // Replace the negated operand with 0.0:
8487 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8488 Constant *Zero = ConstantFP::getZero(Op0->getType());
8489 return new FCmpInst(Pred, Op0, Zero, "", &I);
8490}
8491
8493 Constant *RHSC, InstCombinerImpl &CI) {
8494 const CmpInst::Predicate Pred = I.getPredicate();
8495 Value *X = LHSI->getOperand(0);
8496 Value *Y = LHSI->getOperand(1);
8497 switch (Pred) {
8498 default:
8499 break;
8500 case FCmpInst::FCMP_UGT:
8501 case FCmpInst::FCMP_ULT:
8502 case FCmpInst::FCMP_UNE:
8503 case FCmpInst::FCMP_OEQ:
8504 case FCmpInst::FCMP_OGE:
8505 case FCmpInst::FCMP_OLE:
8506 // The optimization is not valid if X and Y are infinities of the same
8507 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8508 // flag then we can assume we do not have that case. Otherwise we might be
8509 // able to prove that either X or Y is not infinity.
8510 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8514 break;
8515
8516 [[fallthrough]];
8517 case FCmpInst::FCMP_OGT:
8518 case FCmpInst::FCMP_OLT:
8519 case FCmpInst::FCMP_ONE:
8520 case FCmpInst::FCMP_UEQ:
8521 case FCmpInst::FCMP_UGE:
8522 case FCmpInst::FCMP_ULE:
8523 // fcmp pred (x - y), 0 --> fcmp pred x, y
8524 if (match(RHSC, m_AnyZeroFP()) &&
8525 I.getFunction()->getDenormalMode(
8526 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8528 CI.replaceOperand(I, 0, X);
8529 CI.replaceOperand(I, 1, Y);
8530 return &I;
8531 }
8532 break;
8533 }
8534
8535 return nullptr;
8536}
8537
8539 InstCombinerImpl &IC) {
8540 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8541 Type *OpType = LHS->getType();
8542 CmpInst::Predicate Pred = I.getPredicate();
8543
8546
8547 if (!FloorX && !CeilX) {
8550 std::swap(LHS, RHS);
8551 Pred = I.getSwappedPredicate();
8552 }
8553 }
8554
8555 switch (Pred) {
8556 case FCmpInst::FCMP_OLE:
8557 // fcmp ole floor(x), x => fcmp ord x, 0
8558 if (FloorX)
8560 "", &I);
8561 break;
8562 case FCmpInst::FCMP_OGT:
8563 // fcmp ogt floor(x), x => false
8564 if (FloorX)
8565 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8566 break;
8567 case FCmpInst::FCMP_OGE:
8568 // fcmp oge ceil(x), x => fcmp ord x, 0
8569 if (CeilX)
8571 "", &I);
8572 break;
8573 case FCmpInst::FCMP_OLT:
8574 // fcmp olt ceil(x), x => false
8575 if (CeilX)
8576 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8577 break;
8578 case FCmpInst::FCMP_ULE:
8579 // fcmp ule floor(x), x => true
8580 if (FloorX)
8581 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8582 break;
8583 case FCmpInst::FCMP_UGT:
8584 // fcmp ugt floor(x), x => fcmp uno x, 0
8585 if (FloorX)
8587 "", &I);
8588 break;
8589 case FCmpInst::FCMP_UGE:
8590 // fcmp uge ceil(x), x => true
8591 if (CeilX)
8592 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8593 break;
8594 case FCmpInst::FCMP_ULT:
8595 // fcmp ult ceil(x), x => fcmp uno x, 0
8596 if (CeilX)
8598 "", &I);
8599 break;
8600 default:
8601 break;
8602 }
8603
8604 return nullptr;
8605}
8606
8608 bool Changed = false;
8609
8610 /// Orders the operands of the compare so that they are listed from most
8611 /// complex to least complex. This puts constants before unary operators,
8612 /// before binary operators.
8613 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8614 I.swapOperands();
8615 Changed = true;
8616 }
8617
8618 const CmpInst::Predicate Pred = I.getPredicate();
8619 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8620 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8621 SQ.getWithInstruction(&I)))
8622 return replaceInstUsesWith(I, V);
8623
8624 // Simplify 'fcmp pred X, X'
8625 Type *OpType = Op0->getType();
8626 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8627 if (Op0 == Op1) {
8628 switch (Pred) {
8629 default:
8630 break;
8631 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
8632 case FCmpInst::FCMP_ULT: // True if unordered or less than
8633 case FCmpInst::FCMP_UGT: // True if unordered or greater than
8634 case FCmpInst::FCMP_UNE: // True if unordered or not equal
8635 // Canonicalize these to be 'fcmp uno %X, 0.0'.
8636 I.setPredicate(FCmpInst::FCMP_UNO);
8637 I.setOperand(1, Constant::getNullValue(OpType));
8638 return &I;
8639
8640 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
8641 case FCmpInst::FCMP_OEQ: // True if ordered and equal
8642 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
8643 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
8644 // Canonicalize these to be 'fcmp ord %X, 0.0'.
8645 I.setPredicate(FCmpInst::FCMP_ORD);
8646 I.setOperand(1, Constant::getNullValue(OpType));
8647 return &I;
8648 }
8649 }
8650
8651 if (I.isCommutative()) {
8652 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8653 replaceOperand(I, 0, Pair->first);
8654 replaceOperand(I, 1, Pair->second);
8655 return &I;
8656 }
8657 }
8658
8659 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
8660 // then canonicalize the operand to 0.0.
8661 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
8662 if (!match(Op0, m_PosZeroFP()) &&
8663 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
8664 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
8665
8666 if (!match(Op1, m_PosZeroFP()) &&
8667 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
8668 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8669 }
8670
8671 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
8672 Value *X, *Y;
8673 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
8674 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
8675
8677 return R;
8678
8679 // Test if the FCmpInst instruction is used exclusively by a select as
8680 // part of a minimum or maximum operation. If so, refrain from doing
8681 // any other folding. This helps out other analyses which understand
8682 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
8683 // and CodeGen. And in this case, at least one of the comparison
8684 // operands has at least one user besides the compare (the select),
8685 // which would often largely negate the benefit of folding anyway.
8686 if (I.hasOneUse())
8687 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
8688 Value *A, *B;
8690 if (SPR.Flavor != SPF_UNKNOWN)
8691 return nullptr;
8692 }
8693
8694 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
8695 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
8696 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
8697 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8698
8699 // Canonicalize:
8700 // fcmp olt X, +inf -> fcmp one X, +inf
8701 // fcmp ole X, +inf -> fcmp ord X, 0
8702 // fcmp ogt X, +inf -> false
8703 // fcmp oge X, +inf -> fcmp oeq X, +inf
8704 // fcmp ult X, +inf -> fcmp une X, +inf
8705 // fcmp ule X, +inf -> true
8706 // fcmp ugt X, +inf -> fcmp uno X, 0
8707 // fcmp uge X, +inf -> fcmp ueq X, +inf
8708 // fcmp olt X, -inf -> false
8709 // fcmp ole X, -inf -> fcmp oeq X, -inf
8710 // fcmp ogt X, -inf -> fcmp one X, -inf
8711 // fcmp oge X, -inf -> fcmp ord X, 0
8712 // fcmp ult X, -inf -> fcmp uno X, 0
8713 // fcmp ule X, -inf -> fcmp ueq X, -inf
8714 // fcmp ugt X, -inf -> fcmp une X, -inf
8715 // fcmp uge X, -inf -> true
8716 const APFloat *C;
8717 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8718 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8719 default:
8720 break;
8721 case FCmpInst::FCMP_ORD:
8722 case FCmpInst::FCMP_UNO:
8725 case FCmpInst::FCMP_OGT:
8726 case FCmpInst::FCMP_ULE:
8727 llvm_unreachable("Should be simplified by InstSimplify");
8728 case FCmpInst::FCMP_OLT:
8729 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8730 case FCmpInst::FCMP_OLE:
8731 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8732 "", &I);
8733 case FCmpInst::FCMP_OGE:
8734 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8735 case FCmpInst::FCMP_ULT:
8736 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8737 case FCmpInst::FCMP_UGT:
8738 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8739 "", &I);
8740 case FCmpInst::FCMP_UGE:
8741 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8742 }
8743 }
8744
8745 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8746 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8747 if (match(Op1, m_PosZeroFP()) &&
8750 if (Pred == FCmpInst::FCMP_OEQ)
8751 IntPred = ICmpInst::ICMP_EQ;
8752 else if (Pred == FCmpInst::FCMP_UNE)
8753 IntPred = ICmpInst::ICMP_NE;
8754
8755 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8756 Type *IntTy = X->getType();
8757 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8758 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8759 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8760 }
8761 }
8762
8763 // Handle fcmp with instruction LHS and constant RHS.
8764 Instruction *LHSI;
8765 Constant *RHSC;
8766 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8767 switch (LHSI->getOpcode()) {
8768 case Instruction::Select:
8769 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8770 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8772 return replaceOperand(I, 0, X);
8774 return NV;
8775 break;
8776 case Instruction::FSub:
8777 if (LHSI->hasOneUse())
8778 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
8779 return NV;
8780 break;
8781 case Instruction::PHI:
8782 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8783 return NV;
8784 break;
8785 case Instruction::SIToFP:
8786 case Instruction::UIToFP:
8787 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8788 return NV;
8789 break;
8790 case Instruction::FDiv:
8791 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8792 return NV;
8793 break;
8794 case Instruction::Load:
8795 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8796 if (Instruction *Res =
8798 return Res;
8799 break;
8800 case Instruction::FPTrunc:
8801 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
8802 return NV;
8803 break;
8804 }
8805 }
8806
8807 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8808 return R;
8809
8810 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
8811 return R;
8812
8813 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
8814 return R;
8815
8816 if (match(Op0, m_FNeg(m_Value(X)))) {
8817 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8818 Constant *C;
8819 if (match(Op1, m_Constant(C)))
8820 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8821 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8822 }
8823
8824 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8825 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8826 return new FCmpInst(Pred, X, Op1, "", &I);
8827
8828 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8829 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8830 return new FCmpInst(Pred, Op0, Y, "", &I);
8831
8832 if (match(Op0, m_FPExt(m_Value(X)))) {
8833 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8834 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8835 return new FCmpInst(Pred, X, Y, "", &I);
8836
8837 const APFloat *C;
8838 if (match(Op1, m_APFloat(C))) {
8839 const fltSemantics &FPSem =
8840 X->getType()->getScalarType()->getFltSemantics();
8841 bool Lossy;
8842 APFloat TruncC = *C;
8843 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8844
8845 if (Lossy) {
8846 // X can't possibly equal the higher-precision constant, so reduce any
8847 // equality comparison.
8848 // TODO: Other predicates can be handled via getFCmpCode().
8849 switch (Pred) {
8850 case FCmpInst::FCMP_OEQ:
8851 // X is ordered and equal to an impossible constant --> false
8852 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8853 case FCmpInst::FCMP_ONE:
8854 // X is ordered and not equal to an impossible constant --> ordered
8855 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8856 ConstantFP::getZero(X->getType()));
8857 case FCmpInst::FCMP_UEQ:
8858 // X is unordered or equal to an impossible constant --> unordered
8859 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8860 ConstantFP::getZero(X->getType()));
8861 case FCmpInst::FCMP_UNE:
8862 // X is unordered or not equal to an impossible constant --> true
8863 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8864 default:
8865 break;
8866 }
8867 }
8868
8869 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8870 // Avoid lossy conversions and denormals.
8871 // Zero is a special case that's OK to convert.
8872 APFloat Fabs = TruncC;
8873 Fabs.clearSign();
8874 if (!Lossy &&
8875 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8876 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8877 return new FCmpInst(Pred, X, NewC, "", &I);
8878 }
8879 }
8880 }
8881
8882 // Convert a sign-bit test of an FP value into a cast and integer compare.
8883 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8884 // TODO: Handle non-zero compare constants.
8885 // TODO: Handle other predicates.
8887 m_Value(X)))) &&
8888 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8889 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8890 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8891 IntType = VectorType::get(IntType, VecTy->getElementCount());
8892
8893 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8894 if (Pred == FCmpInst::FCMP_OLT) {
8895 Value *IntX = Builder.CreateBitCast(X, IntType);
8896 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8897 ConstantInt::getNullValue(IntType));
8898 }
8899 }
8900
8901 {
8902 Value *CanonLHS = nullptr;
8904 // (canonicalize(x) == x) => (x == x)
8905 if (CanonLHS == Op1)
8906 return new FCmpInst(Pred, Op1, Op1, "", &I);
8907
8908 Value *CanonRHS = nullptr;
8910 // (x == canonicalize(x)) => (x == x)
8911 if (CanonRHS == Op0)
8912 return new FCmpInst(Pred, Op0, Op0, "", &I);
8913
8914 // (canonicalize(x) == canonicalize(y)) => (x == y)
8915 if (CanonLHS && CanonRHS)
8916 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8917 }
8918
8919 if (I.getType()->isVectorTy())
8920 if (Instruction *Res = foldVectorCmp(I, Builder))
8921 return Res;
8922
8923 return Changed ? &I : nullptr;
8924}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define Check(C,...)
Hexagon Common GEP
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static void collectOffsetOp(Value *V, SmallVectorImpl< OffsetOp > &Offsets, bool AllowRecursion)
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags NW, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static Instruction * foldICmpEqualityWithOffset(ICmpInst &I, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Offset both sides of an equality icmp to see if we can save some instructions: icmp eq/ne X,...
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Instruction * foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI, Constant *RHSC, InstCombinerImpl &CI)
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static Value * foldICmpWithLowBitMaskedVal(CmpPredicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpShlLHSC(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl nuw C2, Y), C.
static Instruction * foldFCmpWithFloorAndCeil(FCmpInst &I, InstCombinerImpl &IC)
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(CmpPredicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * foldSqrtWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize sqrt(X) compared with zero.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(CmpPredicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags &NW, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldFCmpFpTrunc(FCmpInst &I, const Instruction &FPTrunc, const Constant &C)
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q)
Return true if X is a multiple of C.
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:546
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
mir Rename Register Operands
#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:167
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6057
void clearSign()
Definition APFloat.h:1298
bool isNaN() const
Definition APFloat.h:1447
bool isZero() const
Definition APFloat.h:1445
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1158
APInt bitcastToAPInt() const
Definition APFloat.h:1353
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1138
opStatus next(bool nextDown)
Definition APFloat.h:1254
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1098
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5986
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1248
bool isInfinity() const
Definition APFloat.h:1446
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1573
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:234
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1758
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:449
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1012
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:229
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:423
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1540
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1512
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:206
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1330
APInt abs() const
Get the absolute value.
Definition APInt.h:1795
unsigned ceilLogBase2() const
Definition APInt.h:1764
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1201
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:371
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1948
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1182
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:380
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:466
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1488
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1111
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:209
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:216
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:329
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1928
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1079
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1644
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1935
void negate()
Negate this APInt in place.
Definition APInt.h:1468
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1639
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1598
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:219
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:356
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1452
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1615
unsigned logBase2() const
Definition APInt.h:1761
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:475
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:827
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:405
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1150
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:873
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:440
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:306
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:296
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:200
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1237
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1941
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:389
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:286
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:239
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:851
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1656
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1221
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
BinaryOps getOpcode() const
Definition InstrTypes.h:374
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Conditional or Unconditional Branch instruction.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
Definition InstrTypes.h:666
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:984
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:860
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:678
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:681
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:695
@ ICMP_SLT
signed less than
Definition InstrTypes.h:707
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:708
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:684
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:693
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:682
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:683
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:702
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:701
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:705
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:692
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:686
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:689
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:703
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:690
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:685
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:687
@ ICMP_NE
not equal
Definition InstrTypes.h:700
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:706
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:694
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:704
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:691
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:680
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:688
bool isSigned() const
Definition InstrTypes.h:932
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:829
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:944
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:873
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:791
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:767
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:778
bool isUnsigned() const
Definition InstrTypes.h:938
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:264
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:214
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:131
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:157
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:154
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.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:165
iterator end()
Definition DenseMap.h:81
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:156
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
static bool isEquality(Predicate Pred)
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:430
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:70
Value * getPointerOperand()
Definition Operator.h:457
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:425
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:504
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1551
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2439
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1573
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:538
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2780
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false)
Given an instruction with a select as one operand and a constant as the other operand,...
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 * 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.
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
TargetLibraryInfo & TLI
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
const DataLayout & DL
DomConditionCache DC
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
BuilderTy & Builder
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
bool isArithmeticShift() const
Return true if this is an arithmetic shift right.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isShift() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:319
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.
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, Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
Definition SetVector.h:59
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:104
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:168
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition SetVector.h:269
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class represents a truncation of integer types.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:165
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:198
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:231
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:294
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:236
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:107
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:237
Value * getOperand(unsigned i) const
Definition User.h:232
unsigned getNumOperands() const
Definition User.h:254
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition Value.cpp:158
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:701
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1101
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
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:169
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:2763
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:2781
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
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)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
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< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
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)
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.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
apfloat_match m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
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:843
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1727
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
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:646
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:1534
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
LLVM_ABI bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:759
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:336
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:203
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_UNKNOWN
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:881
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:1543
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:1741
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:548
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:399
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:71
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
LLVM_ABI bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
DWARFExpression::Operation Op
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:1963
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
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:2110
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:22
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:853
#define NC
Definition regutils.h:42
Value * materialize(InstCombiner::BuilderTy &Builder) const
static OffsetResult value(Value *V)
static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV)
static OffsetResult invalid()
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:304
static constexpr roundingMode rmTowardZero
Definition APFloat.h:308
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:101
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:235
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:267
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:144
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:282
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:241
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:138
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:122
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:107
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:98
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:279
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:128
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:60
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:203
GEPNoWrapFlags Flags
Definition Loads.h:208
Matching combinators.
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DataLayout & DL
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:249
Capture information for a specific Use.