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(), IsaPred<Constant>)) {
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/// Match and fold patterns like:
5784/// icmp eq/ne X, min(max(X, Lo), Hi)
5785/// which represents a range check and can be repsented as a ConstantRange.
5786///
5787/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5788/// (X - Lo) u< (Hi + 1 - Lo)
5789/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5790/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5792 MinMaxIntrinsic *Min) {
5793 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5794 return nullptr;
5795
5796 const APInt *Lo = nullptr, *Hi = nullptr;
5797 if (Min->isSigned()) {
5798 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5799 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5800 return nullptr;
5801 } else {
5802 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5803 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5804 return nullptr;
5805 }
5806
5809 APInt C, Offset;
5810 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5811 CR.getEquivalentICmp(Pred, C, Offset);
5812 else
5813 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5814
5815 if (!Offset.isZero())
5816 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5817
5818 return replaceInstUsesWith(
5819 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5820}
5821
5822// Canonicalize checking for a power-of-2-or-zero value:
5824 InstCombiner::BuilderTy &Builder) {
5825 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5826 const CmpInst::Predicate Pred = I.getPredicate();
5827 Value *A = nullptr;
5828 bool CheckIs;
5829 if (I.isEquality()) {
5830 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5831 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5832 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5833 m_Deferred(A)))) ||
5834 !match(Op1, m_ZeroInt()))
5835 A = nullptr;
5836
5837 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5838 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5839 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5840 A = Op1;
5841 else if (match(Op1,
5843 A = Op0;
5844
5845 CheckIs = Pred == ICmpInst::ICMP_EQ;
5846 } else if (ICmpInst::isUnsigned(Pred)) {
5847 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5848 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5849
5850 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5852 m_Specific(Op1))))) {
5853 A = Op1;
5854 CheckIs = Pred == ICmpInst::ICMP_UGE;
5855 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5857 m_Specific(Op0))))) {
5858 A = Op0;
5859 CheckIs = Pred == ICmpInst::ICMP_ULE;
5860 }
5861 }
5862
5863 if (A) {
5864 Type *Ty = A->getType();
5865 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5866 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5867 ConstantInt::get(Ty, 2))
5868 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5869 ConstantInt::get(Ty, 1));
5870 }
5871
5872 return nullptr;
5873}
5874
5875/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5876using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5878 bool AllowRecursion) {
5880 if (!Inst || !Inst->hasOneUse())
5881 return;
5882
5883 switch (Inst->getOpcode()) {
5884 case Instruction::Add:
5885 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5886 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5887 break;
5888 case Instruction::Sub:
5889 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5890 break;
5891 case Instruction::Xor:
5892 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5893 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5894 break;
5895 case Instruction::Select:
5896 if (AllowRecursion) {
5897 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5898 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5899 }
5900 break;
5901 default:
5902 break;
5903 }
5904}
5905
5907
5911
5913 return {OffsetKind::Invalid, nullptr, nullptr, nullptr};
5914 }
5916 return {OffsetKind::Value, V, nullptr, nullptr};
5917 }
5918 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV) {
5919 return {OffsetKind::Select, Cond, TrueV, FalseV};
5920 }
5921 bool isValid() const { return Kind != OffsetKind::Invalid; }
5923 switch (Kind) {
5925 llvm_unreachable("Invalid offset result");
5926 case OffsetKind::Value:
5927 return V0;
5928 case OffsetKind::Select:
5929 return Builder.CreateSelect(V0, V1, V2);
5930 }
5931 llvm_unreachable("Unknown OffsetKind enum");
5932 }
5933};
5934
5935/// Offset both sides of an equality icmp to see if we can save some
5936/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
5937/// Note: This operation should not introduce poison.
5939 InstCombiner::BuilderTy &Builder,
5940 const SimplifyQuery &SQ) {
5941 assert(I.isEquality() && "Expected an equality icmp");
5942 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5943 if (!Op0->getType()->isIntOrIntVectorTy())
5944 return nullptr;
5945
5946 SmallVector<OffsetOp, 4> OffsetOps;
5947 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
5948 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
5949
5950 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
5951 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
5952 // Avoid infinite loops by checking if RHS is an identity for the BinOp.
5953 if (!Simplified || Simplified == V)
5954 return nullptr;
5955 // Reject constant expressions as they don't simplify things.
5956 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
5957 return nullptr;
5958 // Check if the transformation introduces poison.
5959 return impliesPoison(RHS, V) ? Simplified : nullptr;
5960 };
5961
5962 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
5963 Value *RHS) -> OffsetResult {
5964 if (auto *Sel = dyn_cast<SelectInst>(V)) {
5965 if (!Sel->hasOneUse())
5966 return OffsetResult::invalid();
5967 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
5968 if (!TrueVal)
5969 return OffsetResult::invalid();
5970 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
5971 if (!FalseVal)
5972 return OffsetResult::invalid();
5973 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal);
5974 }
5975 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
5976 return OffsetResult::value(Simplified);
5977 return OffsetResult::invalid();
5978 };
5979
5980 for (auto [BinOp, RHS] : OffsetOps) {
5981 auto BinOpc = static_cast<unsigned>(BinOp);
5982
5983 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
5984 if (!Op0Result.isValid())
5985 continue;
5986 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
5987 if (!Op1Result.isValid())
5988 continue;
5989
5990 Value *NewLHS = Op0Result.materialize(Builder);
5991 Value *NewRHS = Op1Result.materialize(Builder);
5992 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
5993 }
5994
5995 return nullptr;
5996}
5997
5999 if (!I.isEquality())
6000 return nullptr;
6001
6002 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6003 const CmpInst::Predicate Pred = I.getPredicate();
6004 Value *A, *B, *C, *D;
6005 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6006 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6007 Value *OtherVal = A == Op1 ? B : A;
6008 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6009 }
6010
6011 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6012 // A^c1 == C^c2 --> A == C^(c1^c2)
6013 ConstantInt *C1, *C2;
6014 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6015 Op1->hasOneUse()) {
6016 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6017 Value *Xor = Builder.CreateXor(C, NC);
6018 return new ICmpInst(Pred, A, Xor);
6019 }
6020
6021 // A^B == A^D -> B == D
6022 if (A == C)
6023 return new ICmpInst(Pred, B, D);
6024 if (A == D)
6025 return new ICmpInst(Pred, B, C);
6026 if (B == C)
6027 return new ICmpInst(Pred, A, D);
6028 if (B == D)
6029 return new ICmpInst(Pred, A, C);
6030 }
6031 }
6032
6033 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6034 // A == (A^B) -> B == 0
6035 Value *OtherVal = A == Op0 ? B : A;
6036 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6037 }
6038
6039 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6040 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6041 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6042 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6043
6044 if (A == C) {
6045 X = B;
6046 Y = D;
6047 Z = A;
6048 } else if (A == D) {
6049 X = B;
6050 Y = C;
6051 Z = A;
6052 } else if (B == C) {
6053 X = A;
6054 Y = D;
6055 Z = B;
6056 } else if (B == D) {
6057 X = A;
6058 Y = C;
6059 Z = B;
6060 }
6061
6062 if (X) {
6063 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6064 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6065 // instructions.
6066 const APInt *C0, *C1;
6067 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6068 (*C0 ^ *C1).isNegatedPowerOf2();
6069
6070 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6071 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6072 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6073 int UseCnt =
6074 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6075 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6076 if (XorIsNegP2 || UseCnt >= 2) {
6077 // Build (X^Y) & Z
6078 Op1 = Builder.CreateXor(X, Y);
6079 Op1 = Builder.CreateAnd(Op1, Z);
6080 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6081 }
6082 }
6083 }
6084
6085 {
6086 // Similar to above, but specialized for constant because invert is needed:
6087 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6088 Value *X, *Y;
6089 Constant *C;
6090 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6091 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6092 Value *Xor = Builder.CreateXor(X, Y);
6093 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6094 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6095 }
6096 }
6097
6098 if (match(Op1, m_ZExt(m_Value(A))) &&
6099 (Op0->hasOneUse() || Op1->hasOneUse())) {
6100 // (B & (Pow2C-1)) == zext A --> A == trunc B
6101 // (B & (Pow2C-1)) != zext A --> A != trunc B
6102 const APInt *MaskC;
6103 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6104 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6105 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6106 }
6107
6108 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6109 // For lshr and ashr pairs.
6110 const APInt *AP1, *AP2;
6111 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6112 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6113 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6114 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6115 if (*AP1 != *AP2)
6116 return nullptr;
6117 unsigned TypeBits = AP1->getBitWidth();
6118 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6119 if (ShAmt < TypeBits && ShAmt != 0) {
6120 ICmpInst::Predicate NewPred =
6122 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6123 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6124 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6125 }
6126 }
6127
6128 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6129 ConstantInt *Cst1;
6130 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6131 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6132 unsigned TypeBits = Cst1->getBitWidth();
6133 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6134 if (ShAmt < TypeBits && ShAmt != 0) {
6135 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6136 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6137 Value *And =
6138 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6139 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6140 }
6141 }
6142
6143 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6144 // "icmp (and X, mask), cst"
6145 uint64_t ShAmt = 0;
6146 if (Op0->hasOneUse() &&
6147 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6148 match(Op1, m_ConstantInt(Cst1)) &&
6149 // Only do this when A has multiple uses. This is most important to do
6150 // when it exposes other optimizations.
6151 !A->hasOneUse()) {
6152 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6153
6154 if (ShAmt < ASize) {
6155 APInt MaskV =
6157 MaskV <<= ShAmt;
6158
6159 APInt CmpV = Cst1->getValue().zext(ASize);
6160 CmpV <<= ShAmt;
6161
6162 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6163 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6164 }
6165 }
6166
6168 return ICmp;
6169
6170 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6171 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6172 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6173 // few steps of instcombine.
6174 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6175 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6177 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6178 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6180 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6181 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6183 Add, ConstantInt::get(A->getType(), C.shl(1)));
6184 }
6185
6186 // Canonicalize:
6187 // Assume B_Pow2 != 0
6188 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6189 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6190 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6191 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6192 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6194
6195 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6196 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6197 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6198 ConstantInt::getNullValue(Op1->getType()));
6199
6200 // Canonicalize:
6201 // icmp eq/ne X, OneUse(rotate-right(X))
6202 // -> icmp eq/ne X, rotate-left(X)
6203 // We generally try to convert rotate-right -> rotate-left, this just
6204 // canonicalizes another case.
6205 if (match(&I, m_c_ICmp(m_Value(A),
6207 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6208 return new ICmpInst(
6209 Pred, A,
6210 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6211
6212 // Canonicalize:
6213 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6214 Constant *Cst;
6217 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6218
6219 {
6220 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6221 auto m_Matcher =
6224 m_Sub(m_Value(B), m_Deferred(A)));
6225 std::optional<bool> IsZero = std::nullopt;
6226 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6227 m_Deferred(A))))
6228 IsZero = false;
6229 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6230 else if (match(&I,
6231 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6232 IsZero = true;
6233
6234 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6235 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6236 // -> (icmp eq/ne (and X, P2), 0)
6237 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6238 // -> (icmp eq/ne (and X, P2), P2)
6239 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6240 *IsZero ? A
6241 : ConstantInt::getNullValue(A->getType()));
6242 }
6243
6244 if (auto *Res = foldICmpEqualityWithOffset(
6245 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6246 return Res;
6247
6248 return nullptr;
6249}
6250
6252 ICmpInst::Predicate Pred = ICmp.getPredicate();
6253 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6254
6255 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6256 // The trunc masks high bits while the compare may effectively mask low bits.
6257 Value *X;
6258 const APInt *C;
6259 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6260 return nullptr;
6261
6262 // This matches patterns corresponding to tests of the signbit as well as:
6263 // (trunc X) pred C2 --> (X & Mask) == C
6264 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*WithTrunc=*/true,
6265 /*AllowNonZeroC=*/true)) {
6266 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6267 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6268 return new ICmpInst(Res->Pred, And, C);
6269 }
6270
6271 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6272 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6273 if (II->getIntrinsicID() == Intrinsic::cttz ||
6274 II->getIntrinsicID() == Intrinsic::ctlz) {
6275 unsigned MaxRet = SrcBits;
6276 // If the "is_zero_poison" argument is set, then we know at least
6277 // one bit is set in the input, so the result is always at least one
6278 // less than the full bitwidth of that input.
6279 if (match(II->getArgOperand(1), m_One()))
6280 MaxRet--;
6281
6282 // Make sure the destination is wide enough to hold the largest output of
6283 // the intrinsic.
6284 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6285 if (Instruction *I =
6286 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6287 return I;
6288 }
6289 }
6290
6291 return nullptr;
6292}
6293
6295 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6296 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6297 Value *X;
6298 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6299 return nullptr;
6300
6301 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6302 bool IsSignedCmp = ICmp.isSigned();
6303
6304 // icmp Pred (ext X), (ext Y)
6305 Value *Y;
6306 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6307 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6308 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6309
6310 if (IsZext0 != IsZext1) {
6311 // If X and Y and both i1
6312 // (icmp eq/ne (zext X) (sext Y))
6313 // eq -> (icmp eq (or X, Y), 0)
6314 // ne -> (icmp ne (or X, Y), 0)
6315 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6316 Y->getType()->isIntOrIntVectorTy(1))
6317 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6318 Constant::getNullValue(X->getType()));
6319
6320 // If we have mismatched casts and zext has the nneg flag, we can
6321 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6322
6323 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6324 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6325
6326 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6327 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6328
6329 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6330 IsSignedExt = true;
6331 else
6332 return nullptr;
6333 }
6334
6335 // Not an extension from the same type?
6336 Type *XTy = X->getType(), *YTy = Y->getType();
6337 if (XTy != YTy) {
6338 // One of the casts must have one use because we are creating a new cast.
6339 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6340 return nullptr;
6341 // Extend the narrower operand to the type of the wider operand.
6342 CastInst::CastOps CastOpcode =
6343 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6344 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6345 X = Builder.CreateCast(CastOpcode, X, YTy);
6346 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6347 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6348 else
6349 return nullptr;
6350 }
6351
6352 // (zext X) == (zext Y) --> X == Y
6353 // (sext X) == (sext Y) --> X == Y
6354 if (ICmp.isEquality())
6355 return new ICmpInst(ICmp.getPredicate(), X, Y);
6356
6357 // A signed comparison of sign extended values simplifies into a
6358 // signed comparison.
6359 if (IsSignedCmp && IsSignedExt)
6360 return new ICmpInst(ICmp.getPredicate(), X, Y);
6361
6362 // The other three cases all fold into an unsigned comparison.
6363 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6364 }
6365
6366 // Below here, we are only folding a compare with constant.
6367 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6368 if (!C)
6369 return nullptr;
6370
6371 // If a lossless truncate is possible...
6372 Type *SrcTy = CastOp0->getSrcTy();
6373 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6374 if (Res) {
6375 if (ICmp.isEquality())
6376 return new ICmpInst(ICmp.getPredicate(), X, Res);
6377
6378 // A signed comparison of sign extended values simplifies into a
6379 // signed comparison.
6380 if (IsSignedExt && IsSignedCmp)
6381 return new ICmpInst(ICmp.getPredicate(), X, Res);
6382
6383 // The other three cases all fold into an unsigned comparison.
6384 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6385 }
6386
6387 // The re-extended constant changed, partly changed (in the case of a vector),
6388 // or could not be determined to be equal (in the case of a constant
6389 // expression), so the constant cannot be represented in the shorter type.
6390 // All the cases that fold to true or false will have already been handled
6391 // by simplifyICmpInst, so only deal with the tricky case.
6392 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6393 return nullptr;
6394
6395 // Is source op positive?
6396 // icmp ult (sext X), C --> icmp sgt X, -1
6397 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6399
6400 // Is source op negative?
6401 // icmp ugt (sext X), C --> icmp slt X, 0
6402 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6404}
6405
6406/// Handle icmp (cast x), (cast or constant).
6408 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6409 // icmp compares only pointer's value.
6410 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6411 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6412 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6413 if (SimplifiedOp0 || SimplifiedOp1)
6414 return new ICmpInst(ICmp.getPredicate(),
6415 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6416 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6417
6418 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6419 if (!CastOp0)
6420 return nullptr;
6421 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6422 return nullptr;
6423
6424 Value *Op0Src = CastOp0->getOperand(0);
6425 Type *SrcTy = CastOp0->getSrcTy();
6426 Type *DestTy = CastOp0->getDestTy();
6427
6428 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6429 // integer type is the same size as the pointer type.
6430 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6431 if (isa<VectorType>(PtrTy)) {
6432 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6433 IntTy = cast<VectorType>(IntTy)->getElementType();
6434 }
6435 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6436 };
6437 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6438 CompatibleSizes(SrcTy, DestTy)) {
6439 Value *NewOp1 = nullptr;
6440 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6441 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6442 if (PtrSrc->getType() == Op0Src->getType())
6443 NewOp1 = PtrToIntOp1->getOperand(0);
6444 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6445 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6446 }
6447
6448 if (NewOp1)
6449 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6450 }
6451
6452 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6453 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6454 CompatibleSizes(DestTy, SrcTy)) {
6455 Value *NewOp1 = nullptr;
6456 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6457 Value *IntSrc = IntToPtrOp1->getOperand(0);
6458 if (IntSrc->getType() == Op0Src->getType())
6459 NewOp1 = IntToPtrOp1->getOperand(0);
6460 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6461 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6462 }
6463
6464 if (NewOp1)
6465 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6466 }
6467
6468 if (Instruction *R = foldICmpWithTrunc(ICmp))
6469 return R;
6470
6471 return foldICmpWithZextOrSext(ICmp);
6472}
6473
6475 bool IsSigned) {
6476 switch (BinaryOp) {
6477 default:
6478 llvm_unreachable("Unsupported binary op");
6479 case Instruction::Add:
6480 case Instruction::Sub:
6481 return match(RHS, m_Zero());
6482 case Instruction::Mul:
6483 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6484 match(RHS, m_One());
6485 }
6486}
6487
6490 bool IsSigned, Value *LHS, Value *RHS,
6491 Instruction *CxtI) const {
6492 switch (BinaryOp) {
6493 default:
6494 llvm_unreachable("Unsupported binary op");
6495 case Instruction::Add:
6496 if (IsSigned)
6497 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6498 else
6499 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6500 case Instruction::Sub:
6501 if (IsSigned)
6502 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6503 else
6504 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6505 case Instruction::Mul:
6506 if (IsSigned)
6507 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6508 else
6509 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6510 }
6511}
6512
6513bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6514 bool IsSigned, Value *LHS,
6515 Value *RHS, Instruction &OrigI,
6516 Value *&Result,
6517 Constant *&Overflow) {
6518 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6519 std::swap(LHS, RHS);
6520
6521 // If the overflow check was an add followed by a compare, the insertion point
6522 // may be pointing to the compare. We want to insert the new instructions
6523 // before the add in case there are uses of the add between the add and the
6524 // compare.
6525 Builder.SetInsertPoint(&OrigI);
6526
6527 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6528 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6529 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6530
6531 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6532 Result = LHS;
6533 Overflow = ConstantInt::getFalse(OverflowTy);
6534 return true;
6535 }
6536
6537 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6539 return false;
6542 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6543 Result->takeName(&OrigI);
6544 Overflow = ConstantInt::getTrue(OverflowTy);
6545 return true;
6547 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6548 Result->takeName(&OrigI);
6549 Overflow = ConstantInt::getFalse(OverflowTy);
6550 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6551 if (IsSigned)
6552 Inst->setHasNoSignedWrap();
6553 else
6554 Inst->setHasNoUnsignedWrap();
6555 }
6556 return true;
6557 }
6558
6559 llvm_unreachable("Unexpected overflow result");
6560}
6561
6562/// Recognize and process idiom involving test for multiplication
6563/// overflow.
6564///
6565/// The caller has matched a pattern of the form:
6566/// I = cmp u (mul(zext A, zext B), V
6567/// The function checks if this is a test for overflow and if so replaces
6568/// multiplication with call to 'mul.with.overflow' intrinsic.
6569///
6570/// \param I Compare instruction.
6571/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6572/// the compare instruction. Must be of integer type.
6573/// \param OtherVal The other argument of compare instruction.
6574/// \returns Instruction which must replace the compare instruction, NULL if no
6575/// replacement required.
6577 const APInt *OtherVal,
6578 InstCombinerImpl &IC) {
6579 // Don't bother doing this transformation for pointers, don't do it for
6580 // vectors.
6581 if (!isa<IntegerType>(MulVal->getType()))
6582 return nullptr;
6583
6584 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6585 if (!MulInstr)
6586 return nullptr;
6587 assert(MulInstr->getOpcode() == Instruction::Mul);
6588
6589 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6590 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6591 assert(LHS->getOpcode() == Instruction::ZExt);
6592 assert(RHS->getOpcode() == Instruction::ZExt);
6593 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6594
6595 // Calculate type and width of the result produced by mul.with.overflow.
6596 Type *TyA = A->getType(), *TyB = B->getType();
6597 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6598 WidthB = TyB->getPrimitiveSizeInBits();
6599 unsigned MulWidth;
6600 Type *MulType;
6601 if (WidthB > WidthA) {
6602 MulWidth = WidthB;
6603 MulType = TyB;
6604 } else {
6605 MulWidth = WidthA;
6606 MulType = TyA;
6607 }
6608
6609 // In order to replace the original mul with a narrower mul.with.overflow,
6610 // all uses must ignore upper bits of the product. The number of used low
6611 // bits must be not greater than the width of mul.with.overflow.
6612 if (MulVal->hasNUsesOrMore(2))
6613 for (User *U : MulVal->users()) {
6614 if (U == &I)
6615 continue;
6616 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6617 // Check if truncation ignores bits above MulWidth.
6618 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6619 if (TruncWidth > MulWidth)
6620 return nullptr;
6621 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6622 // Check if AND ignores bits above MulWidth.
6623 if (BO->getOpcode() != Instruction::And)
6624 return nullptr;
6625 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6626 const APInt &CVal = CI->getValue();
6627 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6628 return nullptr;
6629 } else {
6630 // In this case we could have the operand of the binary operation
6631 // being defined in another block, and performing the replacement
6632 // could break the dominance relation.
6633 return nullptr;
6634 }
6635 } else {
6636 // Other uses prohibit this transformation.
6637 return nullptr;
6638 }
6639 }
6640
6641 // Recognize patterns
6642 switch (I.getPredicate()) {
6643 case ICmpInst::ICMP_UGT: {
6644 // Recognize pattern:
6645 // mulval = mul(zext A, zext B)
6646 // cmp ugt mulval, max
6647 APInt MaxVal = APInt::getMaxValue(MulWidth);
6648 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6649 if (MaxVal.eq(*OtherVal))
6650 break; // Recognized
6651 return nullptr;
6652 }
6653
6654 case ICmpInst::ICMP_ULT: {
6655 // Recognize pattern:
6656 // mulval = mul(zext A, zext B)
6657 // cmp ule mulval, max + 1
6658 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6659 if (MaxVal.eq(*OtherVal))
6660 break; // Recognized
6661 return nullptr;
6662 }
6663
6664 default:
6665 return nullptr;
6666 }
6667
6668 InstCombiner::BuilderTy &Builder = IC.Builder;
6669 Builder.SetInsertPoint(MulInstr);
6670
6671 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6672 Value *MulA = A, *MulB = B;
6673 if (WidthA < MulWidth)
6674 MulA = Builder.CreateZExt(A, MulType);
6675 if (WidthB < MulWidth)
6676 MulB = Builder.CreateZExt(B, MulType);
6677 CallInst *Call =
6678 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6679 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6680 IC.addToWorklist(MulInstr);
6681
6682 // If there are uses of mul result other than the comparison, we know that
6683 // they are truncation or binary AND. Change them to use result of
6684 // mul.with.overflow and adjust properly mask/size.
6685 if (MulVal->hasNUsesOrMore(2)) {
6686 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6687 for (User *U : make_early_inc_range(MulVal->users())) {
6688 if (U == &I)
6689 continue;
6690 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6691 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6692 IC.replaceInstUsesWith(*TI, Mul);
6693 else
6694 TI->setOperand(0, Mul);
6695 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6696 assert(BO->getOpcode() == Instruction::And);
6697 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6698 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6699 APInt ShortMask = CI->getValue().trunc(MulWidth);
6700 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6701 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6702 IC.replaceInstUsesWith(*BO, Zext);
6703 } else {
6704 llvm_unreachable("Unexpected Binary operation");
6705 }
6707 }
6708 }
6709
6710 // The original icmp gets replaced with the overflow value, maybe inverted
6711 // depending on predicate.
6712 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6713 Value *Res = Builder.CreateExtractValue(Call, 1);
6714 return BinaryOperator::CreateNot(Res);
6715 }
6716
6717 return ExtractValueInst::Create(Call, 1);
6718}
6719
6720/// When performing a comparison against a constant, it is possible that not all
6721/// the bits in the LHS are demanded. This helper method computes the mask that
6722/// IS demanded.
6724 const APInt *RHS;
6725 if (!match(I.getOperand(1), m_APInt(RHS)))
6727
6728 // If this is a normal comparison, it demands all bits. If it is a sign bit
6729 // comparison, it only demands the sign bit.
6730 bool UnusedBit;
6731 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6733
6734 switch (I.getPredicate()) {
6735 // For a UGT comparison, we don't care about any bits that
6736 // correspond to the trailing ones of the comparand. The value of these
6737 // bits doesn't impact the outcome of the comparison, because any value
6738 // greater than the RHS must differ in a bit higher than these due to carry.
6739 case ICmpInst::ICMP_UGT:
6740 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6741
6742 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6743 // Any value less than the RHS must differ in a higher bit because of carries.
6744 case ICmpInst::ICMP_ULT:
6745 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6746
6747 default:
6749 }
6750}
6751
6752/// Check that one use is in the same block as the definition and all
6753/// other uses are in blocks dominated by a given block.
6754///
6755/// \param DI Definition
6756/// \param UI Use
6757/// \param DB Block that must dominate all uses of \p DI outside
6758/// the parent block
6759/// \return true when \p UI is the only use of \p DI in the parent block
6760/// and all other uses of \p DI are in blocks dominated by \p DB.
6761///
6763 const Instruction *UI,
6764 const BasicBlock *DB) const {
6765 assert(DI && UI && "Instruction not defined\n");
6766 // Ignore incomplete definitions.
6767 if (!DI->getParent())
6768 return false;
6769 // DI and UI must be in the same block.
6770 if (DI->getParent() != UI->getParent())
6771 return false;
6772 // Protect from self-referencing blocks.
6773 if (DI->getParent() == DB)
6774 return false;
6775 for (const User *U : DI->users()) {
6776 auto *Usr = cast<Instruction>(U);
6777 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6778 return false;
6779 }
6780 return true;
6781}
6782
6783/// Return true when the instruction sequence within a block is select-cmp-br.
6785 const BasicBlock *BB = SI->getParent();
6786 if (!BB)
6787 return false;
6789 if (!BI || BI->getNumSuccessors() != 2)
6790 return false;
6791 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6792 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6793 return false;
6794 return true;
6795}
6796
6797/// True when a select result is replaced by one of its operands
6798/// in select-icmp sequence. This will eventually result in the elimination
6799/// of the select.
6800///
6801/// \param SI Select instruction
6802/// \param Icmp Compare instruction
6803/// \param SIOpd Operand that replaces the select
6804///
6805/// Notes:
6806/// - The replacement is global and requires dominator information
6807/// - The caller is responsible for the actual replacement
6808///
6809/// Example:
6810///
6811/// entry:
6812/// %4 = select i1 %3, %C* %0, %C* null
6813/// %5 = icmp eq %C* %4, null
6814/// br i1 %5, label %9, label %7
6815/// ...
6816/// ; <label>:7 ; preds = %entry
6817/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6818/// ...
6819///
6820/// can be transformed to
6821///
6822/// %5 = icmp eq %C* %0, null
6823/// %6 = select i1 %3, i1 %5, i1 true
6824/// br i1 %6, label %9, label %7
6825/// ...
6826/// ; <label>:7 ; preds = %entry
6827/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6828///
6829/// Similar when the first operand of the select is a constant or/and
6830/// the compare is for not equal rather than equal.
6831///
6832/// NOTE: The function is only called when the select and compare constants
6833/// are equal, the optimization can work only for EQ predicates. This is not a
6834/// major restriction since a NE compare should be 'normalized' to an equal
6835/// compare, which usually happens in the combiner and test case
6836/// select-cmp-br.ll checks for it.
6838 const ICmpInst *Icmp,
6839 const unsigned SIOpd) {
6840 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6842 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6843 // The check for the single predecessor is not the best that can be
6844 // done. But it protects efficiently against cases like when SI's
6845 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6846 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6847 // replaced can be reached on either path. So the uniqueness check
6848 // guarantees that the path all uses of SI (outside SI's parent) are on
6849 // is disjoint from all other paths out of SI. But that information
6850 // is more expensive to compute, and the trade-off here is in favor
6851 // of compile-time. It should also be noticed that we check for a single
6852 // predecessor and not only uniqueness. This to handle the situation when
6853 // Succ and Succ1 points to the same basic block.
6854 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6855 NumSel++;
6856 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6857 return true;
6858 }
6859 }
6860 return false;
6861}
6862
6863/// Try to fold the comparison based on range information we can get by checking
6864/// whether bits are known to be zero or one in the inputs.
6866 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6867 Type *Ty = Op0->getType();
6868 ICmpInst::Predicate Pred = I.getPredicate();
6869
6870 // Get scalar or pointer size.
6871 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6872 ? Ty->getScalarSizeInBits()
6873 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6874
6875 if (!BitWidth)
6876 return nullptr;
6877
6878 KnownBits Op0Known(BitWidth);
6879 KnownBits Op1Known(BitWidth);
6880
6881 {
6882 // Don't use dominating conditions when folding icmp using known bits. This
6883 // may convert signed into unsigned predicates in ways that other passes
6884 // (especially IndVarSimplify) may not be able to reliably undo.
6885 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6887 Op0Known, Q))
6888 return &I;
6889
6890 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6891 return &I;
6892 }
6893
6894 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6895 return new ICmpInst(
6896 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6897 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6898 return new ICmpInst(
6899 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
6900
6901 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
6902 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
6903
6904 // Given the known and unknown bits, compute a range that the LHS could be
6905 // in. Compute the Min, Max and RHS values based on the known bits. For the
6906 // EQ and NE we use unsigned values.
6907 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6908 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6909 if (I.isSigned()) {
6910 Op0Min = Op0Known.getSignedMinValue();
6911 Op0Max = Op0Known.getSignedMaxValue();
6912 Op1Min = Op1Known.getSignedMinValue();
6913 Op1Max = Op1Known.getSignedMaxValue();
6914 } else {
6915 Op0Min = Op0Known.getMinValue();
6916 Op0Max = Op0Known.getMaxValue();
6917 Op1Min = Op1Known.getMinValue();
6918 Op1Max = Op1Known.getMaxValue();
6919 }
6920
6921 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6922 // min/max canonical compare with some other compare. That could lead to
6923 // conflict with select canonicalization and infinite looping.
6924 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6925 auto isMinMaxCmp = [&](Instruction &Cmp) {
6926 if (!Cmp.hasOneUse())
6927 return false;
6928 Value *A, *B;
6929 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6931 return false;
6932 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6933 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6934 };
6935 if (!isMinMaxCmp(I)) {
6936 switch (Pred) {
6937 default:
6938 break;
6939 case ICmpInst::ICMP_ULT: {
6940 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6941 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6942 const APInt *CmpC;
6943 if (match(Op1, m_APInt(CmpC))) {
6944 // A <u C -> A == C-1 if min(A)+1 == C
6945 if (*CmpC == Op0Min + 1)
6946 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6947 ConstantInt::get(Op1->getType(), *CmpC - 1));
6948 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6949 // exceeds the log2 of C.
6950 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6951 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6952 Constant::getNullValue(Op1->getType()));
6953 }
6954 break;
6955 }
6956 case ICmpInst::ICMP_UGT: {
6957 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6958 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6959 const APInt *CmpC;
6960 if (match(Op1, m_APInt(CmpC))) {
6961 // A >u C -> A == C+1 if max(a)-1 == C
6962 if (*CmpC == Op0Max - 1)
6963 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6964 ConstantInt::get(Op1->getType(), *CmpC + 1));
6965 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6966 // exceeds the log2 of C.
6967 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6968 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6969 Constant::getNullValue(Op1->getType()));
6970 }
6971 break;
6972 }
6973 case ICmpInst::ICMP_SLT: {
6974 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6975 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6976 const APInt *CmpC;
6977 if (match(Op1, m_APInt(CmpC))) {
6978 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6979 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6980 ConstantInt::get(Op1->getType(), *CmpC - 1));
6981 }
6982 break;
6983 }
6984 case ICmpInst::ICMP_SGT: {
6985 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6986 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6987 const APInt *CmpC;
6988 if (match(Op1, m_APInt(CmpC))) {
6989 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6990 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6991 ConstantInt::get(Op1->getType(), *CmpC + 1));
6992 }
6993 break;
6994 }
6995 }
6996 }
6997
6998 // Based on the range information we know about the LHS, see if we can
6999 // simplify this comparison. For example, (x&4) < 8 is always true.
7000 switch (Pred) {
7001 default:
7002 break;
7003 case ICmpInst::ICMP_EQ:
7004 case ICmpInst::ICMP_NE: {
7005 // If all bits are known zero except for one, then we know at most one bit
7006 // is set. If the comparison is against zero, then this is a check to see if
7007 // *that* bit is set.
7008 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7009 if (Op1Known.isZero()) {
7010 // If the LHS is an AND with the same constant, look through it.
7011 Value *LHS = nullptr;
7012 const APInt *LHSC;
7013 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7014 *LHSC != Op0KnownZeroInverted)
7015 LHS = Op0;
7016
7017 Value *X;
7018 const APInt *C1;
7019 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7020 Type *XTy = X->getType();
7021 unsigned Log2C1 = C1->countr_zero();
7022 APInt C2 = Op0KnownZeroInverted;
7023 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7024 if (C2Pow2.isPowerOf2()) {
7025 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7026 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7027 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7028 unsigned Log2C2 = C2Pow2.countr_zero();
7029 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7030 auto NewPred =
7032 return new ICmpInst(NewPred, X, CmpC);
7033 }
7034 }
7035 }
7036
7037 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7038 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7039 (Op0Known & Op1Known) == Op0Known)
7040 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7041 ConstantInt::getNullValue(Op1->getType()));
7042 break;
7043 }
7044 case ICmpInst::ICMP_SGE:
7045 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7046 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7047 break;
7048 case ICmpInst::ICMP_SLE:
7049 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7050 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7051 break;
7052 case ICmpInst::ICMP_UGE:
7053 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7054 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7055 break;
7056 case ICmpInst::ICMP_ULE:
7057 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7058 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7059 break;
7060 }
7061
7062 // Turn a signed comparison into an unsigned one if both operands are known to
7063 // have the same sign. Set samesign if possible (except for equality
7064 // predicates).
7065 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7066 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7067 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7068 I.setPredicate(I.getUnsignedPredicate());
7069 I.setSameSign();
7070 return &I;
7071 }
7072
7073 return nullptr;
7074}
7075
7076/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7077/// then try to reduce patterns based on that limit.
7079 Value *X, *Y;
7080 CmpPredicate Pred;
7081
7082 // X must be 0 and bool must be true for "ULT":
7083 // X <u (zext i1 Y) --> (X == 0) & Y
7084 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7085 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7086 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7087
7088 // X must be 0 or bool must be true for "ULE":
7089 // X <=u (sext i1 Y) --> (X == 0) | Y
7090 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7091 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7092 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7093
7094 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7095 CmpPredicate Pred1, Pred2;
7096 const APInt *C;
7097 Instruction *ExtI;
7098 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7101 m_APInt(C)))))) &&
7102 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7103 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7104 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7105 auto CreateRangeCheck = [&] {
7106 Value *CmpV1 =
7107 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7108 Value *CmpV2 = Builder.CreateICmp(
7109 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7111 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7112 CmpV1, CmpV2);
7113 };
7114 if (C->isZero()) {
7115 if (Pred2 == ICmpInst::ICMP_EQ) {
7116 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7117 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7118 return replaceInstUsesWith(
7119 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7120 } else if (!IsSExt || HasOneUse) {
7121 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7122 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7123 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7124 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7125 return CreateRangeCheck();
7126 }
7127 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7128 if (Pred2 == ICmpInst::ICMP_NE) {
7129 // icmp eq X, (zext (icmp ne X, 1)) --> false
7130 // icmp ne X, (zext (icmp ne X, 1)) --> true
7131 // icmp eq X, (sext (icmp ne X, -1)) --> false
7132 // icmp ne X, (sext (icmp ne X, -1)) --> true
7133 return replaceInstUsesWith(
7134 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7135 } else if (!IsSExt || HasOneUse) {
7136 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7137 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7138 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7139 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7140 return CreateRangeCheck();
7141 }
7142 } else {
7143 // when C != 0 && C != 1:
7144 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7145 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7146 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7147 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7148 // when C != 0 && C != -1:
7149 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7150 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7151 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7152 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7153 return ICmpInst::Create(
7154 Instruction::ICmp, Pred1, X,
7155 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7156 ? (IsSExt ? -1 : 1)
7157 : 0));
7158 }
7159 }
7160
7161 return nullptr;
7162}
7163
7164/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7165/// it into the appropriate icmp lt or icmp gt instruction. This transform
7166/// allows them to be folded in visitICmpInst.
7168 ICmpInst::Predicate Pred = I.getPredicate();
7169 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7171 return nullptr;
7172
7173 Value *Op0 = I.getOperand(0);
7174 Value *Op1 = I.getOperand(1);
7175 auto *Op1C = dyn_cast<Constant>(Op1);
7176 if (!Op1C)
7177 return nullptr;
7178
7179 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7180 if (!FlippedStrictness)
7181 return nullptr;
7182
7183 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7184}
7185
7186/// If we have a comparison with a non-canonical predicate, if we can update
7187/// all the users, invert the predicate and adjust all the users.
7189 // Is the predicate already canonical?
7190 CmpInst::Predicate Pred = I.getPredicate();
7192 return nullptr;
7193
7194 // Can all users be adjusted to predicate inversion?
7195 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7196 return nullptr;
7197
7198 // Ok, we can canonicalize comparison!
7199 // Let's first invert the comparison's predicate.
7200 I.setPredicate(CmpInst::getInversePredicate(Pred));
7201 I.setName(I.getName() + ".not");
7202
7203 // And, adapt users.
7205
7206 return &I;
7207}
7208
7209/// Integer compare with boolean values can always be turned into bitwise ops.
7211 InstCombiner::BuilderTy &Builder) {
7212 Value *A = I.getOperand(0), *B = I.getOperand(1);
7213 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7214
7215 // A boolean compared to true/false can be simplified to Op0/true/false in
7216 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7217 // Cases not handled by InstSimplify are always 'not' of Op0.
7218 if (match(B, m_Zero())) {
7219 switch (I.getPredicate()) {
7220 case CmpInst::ICMP_EQ: // A == 0 -> !A
7221 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7222 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7224 default:
7225 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7226 }
7227 } else if (match(B, m_One())) {
7228 switch (I.getPredicate()) {
7229 case CmpInst::ICMP_NE: // A != 1 -> !A
7230 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7231 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7233 default:
7234 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7235 }
7236 }
7237
7238 switch (I.getPredicate()) {
7239 default:
7240 llvm_unreachable("Invalid icmp instruction!");
7241 case ICmpInst::ICMP_EQ:
7242 // icmp eq i1 A, B -> ~(A ^ B)
7243 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7244
7245 case ICmpInst::ICMP_NE:
7246 // icmp ne i1 A, B -> A ^ B
7247 return BinaryOperator::CreateXor(A, B);
7248
7249 case ICmpInst::ICMP_UGT:
7250 // icmp ugt -> icmp ult
7251 std::swap(A, B);
7252 [[fallthrough]];
7253 case ICmpInst::ICMP_ULT:
7254 // icmp ult i1 A, B -> ~A & B
7255 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7256
7257 case ICmpInst::ICMP_SGT:
7258 // icmp sgt -> icmp slt
7259 std::swap(A, B);
7260 [[fallthrough]];
7261 case ICmpInst::ICMP_SLT:
7262 // icmp slt i1 A, B -> A & ~B
7263 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7264
7265 case ICmpInst::ICMP_UGE:
7266 // icmp uge -> icmp ule
7267 std::swap(A, B);
7268 [[fallthrough]];
7269 case ICmpInst::ICMP_ULE:
7270 // icmp ule i1 A, B -> ~A | B
7271 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7272
7273 case ICmpInst::ICMP_SGE:
7274 // icmp sge -> icmp sle
7275 std::swap(A, B);
7276 [[fallthrough]];
7277 case ICmpInst::ICMP_SLE:
7278 // icmp sle i1 A, B -> A | ~B
7279 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7280 }
7281}
7282
7283// Transform pattern like:
7284// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7285// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7286// Into:
7287// (X l>> Y) != 0
7288// (X l>> Y) == 0
7290 InstCombiner::BuilderTy &Builder) {
7291 CmpPredicate Pred, NewPred;
7292 Value *X, *Y;
7293 if (match(&Cmp,
7294 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7295 switch (Pred) {
7296 case ICmpInst::ICMP_ULE:
7297 NewPred = ICmpInst::ICMP_NE;
7298 break;
7299 case ICmpInst::ICMP_UGT:
7300 NewPred = ICmpInst::ICMP_EQ;
7301 break;
7302 default:
7303 return nullptr;
7304 }
7305 } else if (match(&Cmp, m_c_ICmp(Pred,
7308 m_Add(m_Shl(m_One(), m_Value(Y)),
7309 m_AllOnes()))),
7310 m_Value(X)))) {
7311 // The variant with 'add' is not canonical, (the variant with 'not' is)
7312 // we only get it because it has extra uses, and can't be canonicalized,
7313
7314 switch (Pred) {
7315 case ICmpInst::ICMP_ULT:
7316 NewPred = ICmpInst::ICMP_NE;
7317 break;
7318 case ICmpInst::ICMP_UGE:
7319 NewPred = ICmpInst::ICMP_EQ;
7320 break;
7321 default:
7322 return nullptr;
7323 }
7324 } else
7325 return nullptr;
7326
7327 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7328 Constant *Zero = Constant::getNullValue(NewX->getType());
7329 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7330}
7331
7333 InstCombiner::BuilderTy &Builder) {
7334 const CmpInst::Predicate Pred = Cmp.getPredicate();
7335 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7336 Value *V1, *V2;
7337
7338 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7339 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7340 if (auto *I = dyn_cast<Instruction>(V))
7341 I->copyIRFlags(&Cmp);
7342 Module *M = Cmp.getModule();
7344 M, Intrinsic::vector_reverse, V->getType());
7345 return CallInst::Create(F, V);
7346 };
7347
7348 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7349 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7350 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7351 (LHS->hasOneUse() || RHS->hasOneUse()))
7352 return createCmpReverse(Pred, V1, V2);
7353
7354 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7355 if (LHS->hasOneUse() && isSplatValue(RHS))
7356 return createCmpReverse(Pred, V1, RHS);
7357 }
7358 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7359 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7360 return createCmpReverse(Pred, LHS, V2);
7361
7362 ArrayRef<int> M;
7363 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7364 return nullptr;
7365
7366 // If both arguments of the cmp are shuffles that use the same mask and
7367 // shuffle within a single vector, move the shuffle after the cmp:
7368 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7369 Type *V1Ty = V1->getType();
7370 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7371 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7372 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7373 return new ShuffleVectorInst(NewCmp, M);
7374 }
7375
7376 // Try to canonicalize compare with splatted operand and splat constant.
7377 // TODO: We could generalize this for more than splats. See/use the code in
7378 // InstCombiner::foldVectorBinop().
7379 Constant *C;
7380 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7381 return nullptr;
7382
7383 // Length-changing splats are ok, so adjust the constants as needed:
7384 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7385 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7386 int MaskSplatIndex;
7387 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7388 // We allow poison in matching, but this transform removes it for safety.
7389 // Demanded elements analysis should be able to recover some/all of that.
7390 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7391 ScalarC);
7392 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7393 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7394 return new ShuffleVectorInst(NewCmp, NewM);
7395 }
7396
7397 return nullptr;
7398}
7399
7400// extract(uadd.with.overflow(A, B), 0) ult A
7401// -> extract(uadd.with.overflow(A, B), 1)
7403 CmpInst::Predicate Pred = I.getPredicate();
7404 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7405
7406 Value *UAddOv;
7407 Value *A, *B;
7408 auto UAddOvResultPat = m_ExtractValue<0>(
7410 if (match(Op0, UAddOvResultPat) &&
7411 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7412 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7413 (match(A, m_One()) || match(B, m_One()))) ||
7414 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7415 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7416 // extract(uadd.with.overflow(A, B), 0) < A
7417 // extract(uadd.with.overflow(A, 1), 0) == 0
7418 // extract(uadd.with.overflow(A, -1), 0) != -1
7419 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7420 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7421 (Op0 == A || Op0 == B))
7422 // A > extract(uadd.with.overflow(A, B), 0)
7423 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7424 else
7425 return nullptr;
7426
7427 return ExtractValueInst::Create(UAddOv, 1);
7428}
7429
7431 if (!I.getOperand(0)->getType()->isPointerTy() ||
7433 I.getParent()->getParent(),
7434 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7435 return nullptr;
7436 }
7437 Instruction *Op;
7438 if (match(I.getOperand(0), m_Instruction(Op)) &&
7439 match(I.getOperand(1), m_Zero()) &&
7440 Op->isLaunderOrStripInvariantGroup()) {
7441 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7442 Op->getOperand(0), I.getOperand(1));
7443 }
7444 return nullptr;
7445}
7446
7447/// This function folds patterns produced by lowering of reduce idioms, such as
7448/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7449/// attempts to generate fewer number of scalar comparisons instead of vector
7450/// comparisons when possible.
7452 InstCombiner::BuilderTy &Builder,
7453 const DataLayout &DL) {
7454 if (I.getType()->isVectorTy())
7455 return nullptr;
7456 CmpPredicate OuterPred, InnerPred;
7457 Value *LHS, *RHS;
7458
7459 // Match lowering of @llvm.vector.reduce.and. Turn
7460 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7461 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7462 /// %res = icmp <pred> i8 %scalar_ne, 0
7463 ///
7464 /// into
7465 ///
7466 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7467 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7468 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7469 ///
7470 /// for <pred> in {ne, eq}.
7471 if (!match(&I, m_ICmp(OuterPred,
7473 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7474 m_Zero())))
7475 return nullptr;
7476 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7477 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7478 return nullptr;
7479 unsigned NumBits =
7480 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7481 // TODO: Relax this to "not wider than max legal integer type"?
7482 if (!DL.isLegalInteger(NumBits))
7483 return nullptr;
7484
7485 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7486 auto *ScalarTy = Builder.getIntNTy(NumBits);
7487 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7488 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7489 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7490 I.getName());
7491 }
7492
7493 return nullptr;
7494}
7495
7496// This helper will be called with icmp operands in both orders.
7498 Value *Op0, Value *Op1,
7499 ICmpInst &CxtI) {
7500 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7501 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7502 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7503 return NI;
7504
7505 if (auto *SI = dyn_cast<SelectInst>(Op0))
7506 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7507 return NI;
7508
7509 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7510 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7511 return Res;
7512
7513 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7514 return Res;
7515 }
7516
7517 {
7518 Value *X;
7519 const APInt *C;
7520 // icmp X+Cst, X
7521 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7522 return foldICmpAddOpConst(X, *C, Pred);
7523 }
7524
7525 // abs(X) >= X --> true
7526 // abs(X) u<= X --> true
7527 // abs(X) < X --> false
7528 // abs(X) u> X --> false
7529 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7530 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7531 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7532 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7533 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7534 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7535 {
7536 Value *X;
7537 Constant *C;
7539 match(Op1, m_Specific(X))) {
7540 Value *NullValue = Constant::getNullValue(X->getType());
7541 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7542 const APInt SMin =
7543 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7544 bool IsIntMinPosion = C->isAllOnesValue();
7545 switch (Pred) {
7546 case CmpInst::ICMP_ULE:
7547 case CmpInst::ICMP_SGE:
7548 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7549 case CmpInst::ICMP_UGT:
7550 case CmpInst::ICMP_SLT:
7552 case CmpInst::ICMP_UGE:
7553 case CmpInst::ICMP_SLE:
7554 case CmpInst::ICMP_EQ: {
7555 return replaceInstUsesWith(
7556 CxtI, IsIntMinPosion
7557 ? Builder.CreateICmpSGT(X, AllOnesValue)
7558 : Builder.CreateICmpULT(
7559 X, ConstantInt::get(X->getType(), SMin + 1)));
7560 }
7561 case CmpInst::ICMP_ULT:
7562 case CmpInst::ICMP_SGT:
7563 case CmpInst::ICMP_NE: {
7564 return replaceInstUsesWith(
7565 CxtI, IsIntMinPosion
7566 ? Builder.CreateICmpSLT(X, NullValue)
7567 : Builder.CreateICmpUGT(
7568 X, ConstantInt::get(X->getType(), SMin)));
7569 }
7570 default:
7571 llvm_unreachable("Invalid predicate!");
7572 }
7573 }
7574 }
7575
7576 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7577 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7578 return replaceInstUsesWith(CxtI, V);
7579
7580 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7581 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7582 {
7583 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7584 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7586 }
7587
7588 if (!ICmpInst::isUnsigned(Pred) &&
7589 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7590 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7592 }
7593 }
7594
7595 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7596 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7597 {
7598 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7599 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7601 }
7602
7603 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7604 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7605 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7607 }
7608 }
7609
7610 return nullptr;
7611}
7612
7614 bool Changed = false;
7615 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7616 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7617 unsigned Op0Cplxity = getComplexity(Op0);
7618 unsigned Op1Cplxity = getComplexity(Op1);
7619
7620 /// Orders the operands of the compare so that they are listed from most
7621 /// complex to least complex. This puts constants before unary operators,
7622 /// before binary operators.
7623 if (Op0Cplxity < Op1Cplxity) {
7624 I.swapOperands();
7625 std::swap(Op0, Op1);
7626 Changed = true;
7627 }
7628
7629 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7630 return replaceInstUsesWith(I, V);
7631
7632 // Comparing -val or val with non-zero is the same as just comparing val
7633 // ie, abs(val) != 0 -> val != 0
7634 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7635 Value *Cond, *SelectTrue, *SelectFalse;
7636 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7637 m_Value(SelectFalse)))) {
7638 if (Value *V = dyn_castNegVal(SelectTrue)) {
7639 if (V == SelectFalse)
7640 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7641 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7642 if (V == SelectTrue)
7643 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7644 }
7645 }
7646 }
7647
7649 return Res;
7650
7651 if (Op0->getType()->isIntOrIntVectorTy(1))
7653 return Res;
7654
7656 return Res;
7657
7659 return Res;
7660
7662 return Res;
7663
7665 return Res;
7666
7668 return Res;
7669
7671 return Res;
7672
7674 return Res;
7675
7676 // Test if the ICmpInst instruction is used exclusively by a select as
7677 // part of a minimum or maximum operation. If so, refrain from doing
7678 // any other folding. This helps out other analyses which understand
7679 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7680 // and CodeGen. And in this case, at least one of the comparison
7681 // operands has at least one user besides the compare (the select),
7682 // which would often largely negate the benefit of folding anyway.
7683 //
7684 // Do the same for the other patterns recognized by matchSelectPattern.
7685 if (I.hasOneUse())
7686 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7687 Value *A, *B;
7689 if (SPR.Flavor != SPF_UNKNOWN)
7690 return nullptr;
7691 }
7692
7693 // Do this after checking for min/max to prevent infinite looping.
7694 if (Instruction *Res = foldICmpWithZero(I))
7695 return Res;
7696
7697 // FIXME: We only do this after checking for min/max to prevent infinite
7698 // looping caused by a reverse canonicalization of these patterns for min/max.
7699 // FIXME: The organization of folds is a mess. These would naturally go into
7700 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7701 // down here after the min/max restriction.
7702 ICmpInst::Predicate Pred = I.getPredicate();
7703 const APInt *C;
7704 if (match(Op1, m_APInt(C))) {
7705 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7706 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7707 Constant *Zero = Constant::getNullValue(Op0->getType());
7708 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7709 }
7710
7711 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7712 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7714 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7715 }
7716 }
7717
7718 // The folds in here may rely on wrapping flags and special constants, so
7719 // they can break up min/max idioms in some cases but not seemingly similar
7720 // patterns.
7721 // FIXME: It may be possible to enhance select folding to make this
7722 // unnecessary. It may also be moot if we canonicalize to min/max
7723 // intrinsics.
7724 if (Instruction *Res = foldICmpBinOp(I, Q))
7725 return Res;
7726
7728 return Res;
7729
7730 // Try to match comparison as a sign bit test. Intentionally do this after
7731 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7732 if (Instruction *New = foldSignBitTest(I))
7733 return New;
7734
7735 if (auto *PN = dyn_cast<PHINode>(Op0))
7736 if (Instruction *NV = foldOpIntoPhi(I, PN))
7737 return NV;
7738 if (auto *PN = dyn_cast<PHINode>(Op1))
7739 if (Instruction *NV = foldOpIntoPhi(I, PN))
7740 return NV;
7741
7743 return Res;
7744
7745 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7746 return Res;
7747 if (Instruction *Res =
7748 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7749 return Res;
7750
7751 if (I.isCommutative()) {
7752 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7753 replaceOperand(I, 0, Pair->first);
7754 replaceOperand(I, 1, Pair->second);
7755 return &I;
7756 }
7757 }
7758
7759 // In case of a comparison with two select instructions having the same
7760 // condition, check whether one of the resulting branches can be simplified.
7761 // If so, just compare the other branch and select the appropriate result.
7762 // For example:
7763 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7764 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7765 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7766 // The icmp will result false for the false value of selects and the result
7767 // will depend upon the comparison of true values of selects if %cmp is
7768 // true. Thus, transform this into:
7769 // %cmp = icmp slt i32 %y, %z
7770 // %sel = select i1 %cond, i1 %cmp, i1 false
7771 // This handles similar cases to transform.
7772 {
7773 Value *Cond, *A, *B, *C, *D;
7774 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7776 (Op0->hasOneUse() || Op1->hasOneUse())) {
7777 // Check whether comparison of TrueValues can be simplified
7778 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7779 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7780 return SelectInst::Create(Cond, Res, NewICMP);
7781 }
7782 // Check whether comparison of FalseValues can be simplified
7783 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7784 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7785 return SelectInst::Create(Cond, NewICMP, Res);
7786 }
7787 }
7788 }
7789
7790 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7791 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7792 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7793 {
7794 Value *A, *B;
7795 CmpPredicate CmpPred;
7796 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7798 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7799 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7800 bool I0NUW = I0->hasNoUnsignedWrap();
7801 bool I1NUW = I1->hasNoUnsignedWrap();
7802 bool I0NSW = I0->hasNoSignedWrap();
7803 bool I1NSW = I1->hasNoSignedWrap();
7804 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
7805 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
7806 (ICmpInst::isEquality(Pred) &&
7807 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
7808 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
7809 ConstantInt::get(Op0->getType(), 0));
7810 }
7811 }
7812 }
7813
7814 // Try to optimize equality comparisons against alloca-based pointers.
7815 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7816 assert(Op1->getType()->isPointerTy() &&
7817 "Comparing pointer with non-pointer?");
7818 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7819 if (foldAllocaCmp(Alloca))
7820 return nullptr;
7821 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7822 if (foldAllocaCmp(Alloca))
7823 return nullptr;
7824 }
7825
7826 if (Instruction *Res = foldICmpBitCast(I))
7827 return Res;
7828
7829 // TODO: Hoist this above the min/max bailout.
7831 return R;
7832
7833 {
7834 Value *X, *Y;
7835 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7836 // and (X & ~Y) != 0 --> (X & Y) == 0
7837 // if A is a power of 2.
7838 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7839 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
7840 I.isEquality())
7841 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7842 Op1);
7843
7844 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7845 if (Op0->getType()->isIntOrIntVectorTy()) {
7846 bool ConsumesOp0, ConsumesOp1;
7847 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7848 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7849 (ConsumesOp0 || ConsumesOp1)) {
7850 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7851 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7852 assert(InvOp0 && InvOp1 &&
7853 "Mismatch between isFreeToInvert and getFreelyInverted");
7854 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7855 }
7856 }
7857
7858 Instruction *AddI = nullptr;
7860 m_Instruction(AddI))) &&
7861 isa<IntegerType>(X->getType())) {
7862 Value *Result;
7863 Constant *Overflow;
7864 // m_UAddWithOverflow can match patterns that do not include an explicit
7865 // "add" instruction, so check the opcode of the matched op.
7866 if (AddI->getOpcode() == Instruction::Add &&
7867 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7868 Result, Overflow)) {
7869 replaceInstUsesWith(*AddI, Result);
7870 eraseInstFromFunction(*AddI);
7871 return replaceInstUsesWith(I, Overflow);
7872 }
7873 }
7874
7875 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7876 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7877 match(Op1, m_APInt(C))) {
7878 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7879 return R;
7880 }
7881
7882 // Signbit test folds
7883 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7884 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7885 Instruction *ExtI;
7886 if ((I.isUnsigned() || I.isEquality()) &&
7887 match(Op1,
7889 Y->getType()->getScalarSizeInBits() == 1 &&
7890 (Op0->hasOneUse() || Op1->hasOneUse())) {
7891 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7892 Instruction *ShiftI;
7893 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7895 OpWidth - 1))))) {
7896 unsigned ExtOpc = ExtI->getOpcode();
7897 unsigned ShiftOpc = ShiftI->getOpcode();
7898 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7899 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7900 Value *SLTZero =
7901 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
7902 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7903 return replaceInstUsesWith(I, Cmp);
7904 }
7905 }
7906 }
7907 }
7908
7909 if (Instruction *Res = foldICmpEquality(I))
7910 return Res;
7911
7913 return Res;
7914
7915 if (Instruction *Res = foldICmpOfUAddOv(I))
7916 return Res;
7917
7918 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7919 // an i1 which indicates whether or not we successfully did the swap.
7920 //
7921 // Replace comparisons between the old value and the expected value with the
7922 // indicator that 'cmpxchg' returns.
7923 //
7924 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7925 // spuriously fail. In those cases, the old value may equal the expected
7926 // value but it is possible for the swap to not occur.
7927 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7928 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7929 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7930 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7931 !ACXI->isWeak())
7932 return ExtractValueInst::Create(ACXI, 1);
7933
7935 return Res;
7936
7937 if (I.getType()->isVectorTy())
7938 if (Instruction *Res = foldVectorCmp(I, Builder))
7939 return Res;
7940
7942 return Res;
7943
7945 return Res;
7946
7947 {
7948 Value *A;
7949 const APInt *C1, *C2;
7950 ICmpInst::Predicate Pred = I.getPredicate();
7951 if (ICmpInst::isEquality(Pred)) {
7952 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
7953 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
7954 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
7955 match(Op1, m_APInt(C2))) {
7956 Type *InputTy = A->getType();
7957 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
7958 // c2 must be non-negative at the bitwidth of a.
7959 if (C2->getActiveBits() < InputBitWidth) {
7960 APInt TruncC1 = C1->trunc(InputBitWidth);
7961 // Check if there are 1s in C1 high bits of size InputBitWidth.
7962 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
7963 TruncC1.setBit(InputBitWidth - 1);
7964 Value *AndInst = Builder.CreateAnd(A, TruncC1);
7965 return new ICmpInst(
7966 Pred, AndInst,
7967 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
7968 }
7969 }
7970 }
7971 }
7972
7973 return Changed ? &I : nullptr;
7974}
7975
7976/// Fold fcmp ([us]itofp x, cst) if possible.
7978 Instruction *LHSI,
7979 Constant *RHSC) {
7980 const APFloat *RHS;
7981 if (!match(RHSC, m_APFloat(RHS)))
7982 return nullptr;
7983
7984 // Get the width of the mantissa. We don't want to hack on conversions that
7985 // might lose information from the integer, e.g. "i64 -> float"
7986 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7987 if (MantissaWidth == -1)
7988 return nullptr; // Unknown.
7989
7990 Type *IntTy = LHSI->getOperand(0)->getType();
7991 unsigned IntWidth = IntTy->getScalarSizeInBits();
7992 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7993
7994 if (I.isEquality()) {
7995 FCmpInst::Predicate P = I.getPredicate();
7996 bool IsExact = false;
7997 APSInt RHSCvt(IntWidth, LHSUnsigned);
7998 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7999
8000 // If the floating point constant isn't an integer value, we know if we will
8001 // ever compare equal / not equal to it.
8002 if (!IsExact) {
8003 // TODO: Can never be -0.0 and other non-representable values
8004 APFloat RHSRoundInt(*RHS);
8006 if (*RHS != RHSRoundInt) {
8008 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8009
8011 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8012 }
8013 }
8014
8015 // TODO: If the constant is exactly representable, is it always OK to do
8016 // equality compares as integer?
8017 }
8018
8019 // Check to see that the input is converted from an integer type that is small
8020 // enough that preserves all bits. TODO: check here for "known" sign bits.
8021 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8022
8023 // Following test does NOT adjust IntWidth downwards for signed inputs,
8024 // because the most negative value still requires all the mantissa bits
8025 // to distinguish it from one less than that value.
8026 if ((int)IntWidth > MantissaWidth) {
8027 // Conversion would lose accuracy. Check if loss can impact comparison.
8028 int Exp = ilogb(*RHS);
8029 if (Exp == APFloat::IEK_Inf) {
8030 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8031 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8032 // Conversion could create infinity.
8033 return nullptr;
8034 } else {
8035 // Note that if RHS is zero or NaN, then Exp is negative
8036 // and first condition is trivially false.
8037 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8038 // Conversion could affect comparison.
8039 return nullptr;
8040 }
8041 }
8042
8043 // Otherwise, we can potentially simplify the comparison. We know that it
8044 // will always come through as an integer value and we know the constant is
8045 // not a NAN (it would have been previously simplified).
8046 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8047
8049 switch (I.getPredicate()) {
8050 default:
8051 llvm_unreachable("Unexpected predicate!");
8052 case FCmpInst::FCMP_UEQ:
8053 case FCmpInst::FCMP_OEQ:
8054 Pred = ICmpInst::ICMP_EQ;
8055 break;
8056 case FCmpInst::FCMP_UGT:
8057 case FCmpInst::FCMP_OGT:
8058 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8059 break;
8060 case FCmpInst::FCMP_UGE:
8061 case FCmpInst::FCMP_OGE:
8062 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8063 break;
8064 case FCmpInst::FCMP_ULT:
8065 case FCmpInst::FCMP_OLT:
8066 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8067 break;
8068 case FCmpInst::FCMP_ULE:
8069 case FCmpInst::FCMP_OLE:
8070 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8071 break;
8072 case FCmpInst::FCMP_UNE:
8073 case FCmpInst::FCMP_ONE:
8074 Pred = ICmpInst::ICMP_NE;
8075 break;
8076 case FCmpInst::FCMP_ORD:
8077 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8078 case FCmpInst::FCMP_UNO:
8079 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8080 }
8081
8082 // Now we know that the APFloat is a normal number, zero or inf.
8083
8084 // See if the FP constant is too large for the integer. For example,
8085 // comparing an i8 to 300.0.
8086 if (!LHSUnsigned) {
8087 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8088 // and large values.
8089 APFloat SMax(RHS->getSemantics());
8090 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8092 if (SMax < *RHS) { // smax < 13123.0
8093 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8094 Pred == ICmpInst::ICMP_SLE)
8095 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8096 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8097 }
8098 } else {
8099 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8100 // +INF and large values.
8101 APFloat UMax(RHS->getSemantics());
8102 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8104 if (UMax < *RHS) { // umax < 13123.0
8105 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8106 Pred == ICmpInst::ICMP_ULE)
8107 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8108 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8109 }
8110 }
8111
8112 if (!LHSUnsigned) {
8113 // See if the RHS value is < SignedMin.
8114 APFloat SMin(RHS->getSemantics());
8115 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8117 if (SMin > *RHS) { // smin > 12312.0
8118 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8119 Pred == ICmpInst::ICMP_SGE)
8120 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8121 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8122 }
8123 } else {
8124 // See if the RHS value is < UnsignedMin.
8125 APFloat UMin(RHS->getSemantics());
8126 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8128 if (UMin > *RHS) { // umin > 12312.0
8129 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8130 Pred == ICmpInst::ICMP_UGE)
8131 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8132 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8133 }
8134 }
8135
8136 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8137 // [0, UMAX], but it may still be fractional. Check whether this is the case
8138 // using the IsExact flag.
8139 // Don't do this for zero, because -0.0 is not fractional.
8140 APSInt RHSInt(IntWidth, LHSUnsigned);
8141 bool IsExact;
8142 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8143 if (!RHS->isZero()) {
8144 if (!IsExact) {
8145 // If we had a comparison against a fractional value, we have to adjust
8146 // the compare predicate and sometimes the value. RHSC is rounded towards
8147 // zero at this point.
8148 switch (Pred) {
8149 default:
8150 llvm_unreachable("Unexpected integer comparison!");
8151 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8152 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8153 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8154 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8155 case ICmpInst::ICMP_ULE:
8156 // (float)int <= 4.4 --> int <= 4
8157 // (float)int <= -4.4 --> false
8158 if (RHS->isNegative())
8159 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8160 break;
8161 case ICmpInst::ICMP_SLE:
8162 // (float)int <= 4.4 --> int <= 4
8163 // (float)int <= -4.4 --> int < -4
8164 if (RHS->isNegative())
8165 Pred = ICmpInst::ICMP_SLT;
8166 break;
8167 case ICmpInst::ICMP_ULT:
8168 // (float)int < -4.4 --> false
8169 // (float)int < 4.4 --> int <= 4
8170 if (RHS->isNegative())
8171 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8172 Pred = ICmpInst::ICMP_ULE;
8173 break;
8174 case ICmpInst::ICMP_SLT:
8175 // (float)int < -4.4 --> int < -4
8176 // (float)int < 4.4 --> int <= 4
8177 if (!RHS->isNegative())
8178 Pred = ICmpInst::ICMP_SLE;
8179 break;
8180 case ICmpInst::ICMP_UGT:
8181 // (float)int > 4.4 --> int > 4
8182 // (float)int > -4.4 --> true
8183 if (RHS->isNegative())
8184 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8185 break;
8186 case ICmpInst::ICMP_SGT:
8187 // (float)int > 4.4 --> int > 4
8188 // (float)int > -4.4 --> int >= -4
8189 if (RHS->isNegative())
8190 Pred = ICmpInst::ICMP_SGE;
8191 break;
8192 case ICmpInst::ICMP_UGE:
8193 // (float)int >= -4.4 --> true
8194 // (float)int >= 4.4 --> int > 4
8195 if (RHS->isNegative())
8196 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8197 Pred = ICmpInst::ICMP_UGT;
8198 break;
8199 case ICmpInst::ICMP_SGE:
8200 // (float)int >= -4.4 --> int >= -4
8201 // (float)int >= 4.4 --> int > 4
8202 if (!RHS->isNegative())
8203 Pred = ICmpInst::ICMP_SGT;
8204 break;
8205 }
8206 }
8207 }
8208
8209 // Lower this FP comparison into an appropriate integer version of the
8210 // comparison.
8211 return new ICmpInst(Pred, LHSI->getOperand(0),
8212 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8213}
8214
8215/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8217 Constant *RHSC) {
8218 // When C is not 0.0 and infinities are not allowed:
8219 // (C / X) < 0.0 is a sign-bit test of X
8220 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8221 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8222 //
8223 // Proof:
8224 // Multiply (C / X) < 0.0 by X * X / C.
8225 // - X is non zero, if it is the flag 'ninf' is violated.
8226 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8227 // the predicate. C is also non zero by definition.
8228 //
8229 // Thus X * X / C is non zero and the transformation is valid. [qed]
8230
8231 FCmpInst::Predicate Pred = I.getPredicate();
8232
8233 // Check that predicates are valid.
8234 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8235 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8236 return nullptr;
8237
8238 // Check that RHS operand is zero.
8239 if (!match(RHSC, m_AnyZeroFP()))
8240 return nullptr;
8241
8242 // Check fastmath flags ('ninf').
8243 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8244 return nullptr;
8245
8246 // Check the properties of the dividend. It must not be zero to avoid a
8247 // division by zero (see Proof).
8248 const APFloat *C;
8249 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8250 return nullptr;
8251
8252 if (C->isZero())
8253 return nullptr;
8254
8255 // Get swapped predicate if necessary.
8256 if (C->isNegative())
8257 Pred = I.getSwappedPredicate();
8258
8259 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8260}
8261
8262// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8263// Patterns include:
8264// fptrunc(x) < C --> x < ext(C)
8265// fptrunc(x) <= C --> x <= ext(C)
8266// fptrunc(x) > C --> x > ext(C)
8267// fptrunc(x) >= C --> x >= ext(C)
8268// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8269// due to precision loss.
8271 const Constant &C) {
8272 FCmpInst::Predicate Pred = I.getPredicate();
8273 bool RoundDown = false;
8274
8275 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8276 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8277 RoundDown = true;
8278 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8279 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8280 RoundDown = false;
8281 else
8282 return nullptr;
8283
8284 const APFloat *CValue;
8285 if (!match(&C, m_APFloat(CValue)))
8286 return nullptr;
8287
8288 if (CValue->isNaN() || CValue->isInfinity())
8289 return nullptr;
8290
8291 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8292 bool LosesInfo;
8293 APFloat Dest = Src;
8294 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8295 return Dest;
8296 };
8297
8298 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8299 APFloat NextValue = Value;
8300 NextValue.next(RoundDown);
8301 return NextValue;
8302 };
8303
8304 APFloat NextCValue = NextValue(*CValue, RoundDown);
8305
8306 Type *DestType = FPTrunc.getOperand(0)->getType();
8307 const fltSemantics &DestFltSema =
8308 DestType->getScalarType()->getFltSemantics();
8309
8310 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8311 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8312
8313 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8314 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8315 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8316 // value of 'CValue'.
8317 if (NextCValue.isInfinity()) {
8318 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8319 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8320
8321 ExtNextCValue = ExtCValue + Bias;
8322 }
8323
8324 APFloat ExtMidValue =
8325 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8326
8327 const fltSemantics &SrcFltSema =
8328 C.getType()->getScalarType()->getFltSemantics();
8329
8330 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8331 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8332 if (MidValue != *CValue)
8333 ExtMidValue.next(!RoundDown);
8334
8335 // Check whether 'ExtMidValue' is a valid result since the assumption on
8336 // imaged 'NextCValue' might not hold for new float types.
8337 // ppc_fp128 can't pass here when converting from max float because of
8338 // APFloat implementation.
8339 if (NextCValue.isInfinity()) {
8340 // ExtMidValue --- narrowed ---> Finite
8341 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8342 return nullptr;
8343
8344 // NextExtMidValue --- narrowed ---> Infinity
8345 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8346 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8347 return nullptr;
8348 }
8349
8350 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8351 ConstantFP::get(DestType, ExtMidValue), "", &I);
8352}
8353
8354/// Optimize fabs(X) compared with zero.
8356 Value *X;
8357 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8358 return nullptr;
8359
8360 const APFloat *C;
8361 if (!match(I.getOperand(1), m_APFloat(C)))
8362 return nullptr;
8363
8364 if (!C->isPosZero()) {
8365 if (!C->isSmallestNormalized())
8366 return nullptr;
8367
8368 const Function *F = I.getFunction();
8369 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8370 if (Mode.Input == DenormalMode::PreserveSign ||
8372
8373 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8374 Constant *Zero = ConstantFP::getZero(X->getType());
8375 return new FCmpInst(P, X, Zero, "", I);
8376 };
8377
8378 switch (I.getPredicate()) {
8379 case FCmpInst::FCMP_OLT:
8380 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8381 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8382 case FCmpInst::FCMP_UGE:
8383 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8384 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8385 case FCmpInst::FCMP_OGE:
8386 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8387 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8388 case FCmpInst::FCMP_ULT:
8389 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8390 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8391 default:
8392 break;
8393 }
8394 }
8395
8396 return nullptr;
8397 }
8398
8399 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8400 I->setPredicate(P);
8401 return IC.replaceOperand(*I, 0, X);
8402 };
8403
8404 switch (I.getPredicate()) {
8405 case FCmpInst::FCMP_UGE:
8406 case FCmpInst::FCMP_OLT:
8407 // fabs(X) >= 0.0 --> true
8408 // fabs(X) < 0.0 --> false
8409 llvm_unreachable("fcmp should have simplified");
8410
8411 case FCmpInst::FCMP_OGT:
8412 // fabs(X) > 0.0 --> X != 0.0
8413 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8414
8415 case FCmpInst::FCMP_UGT:
8416 // fabs(X) u> 0.0 --> X u!= 0.0
8417 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8418
8419 case FCmpInst::FCMP_OLE:
8420 // fabs(X) <= 0.0 --> X == 0.0
8421 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8422
8423 case FCmpInst::FCMP_ULE:
8424 // fabs(X) u<= 0.0 --> X u== 0.0
8425 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8426
8427 case FCmpInst::FCMP_OGE:
8428 // fabs(X) >= 0.0 --> !isnan(X)
8429 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8430 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8431
8432 case FCmpInst::FCMP_ULT:
8433 // fabs(X) u< 0.0 --> isnan(X)
8434 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8435 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8436
8437 case FCmpInst::FCMP_OEQ:
8438 case FCmpInst::FCMP_UEQ:
8439 case FCmpInst::FCMP_ONE:
8440 case FCmpInst::FCMP_UNE:
8441 case FCmpInst::FCMP_ORD:
8442 case FCmpInst::FCMP_UNO:
8443 // Look through the fabs() because it doesn't change anything but the sign.
8444 // fabs(X) == 0.0 --> X == 0.0,
8445 // fabs(X) != 0.0 --> X != 0.0
8446 // isnan(fabs(X)) --> isnan(X)
8447 // !isnan(fabs(X) --> !isnan(X)
8448 return replacePredAndOp0(&I, I.getPredicate(), X);
8449
8450 default:
8451 return nullptr;
8452 }
8453}
8454
8455/// Optimize sqrt(X) compared with zero.
8457 Value *X;
8458 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8459 return nullptr;
8460
8461 if (!match(I.getOperand(1), m_PosZeroFP()))
8462 return nullptr;
8463
8464 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8465 I.setPredicate(P);
8466 return IC.replaceOperand(I, 0, X);
8467 };
8468
8469 // Clear ninf flag if sqrt doesn't have it.
8470 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8471 I.setHasNoInfs(false);
8472
8473 switch (I.getPredicate()) {
8474 case FCmpInst::FCMP_OLT:
8475 case FCmpInst::FCMP_UGE:
8476 // sqrt(X) < 0.0 --> false
8477 // sqrt(X) u>= 0.0 --> true
8478 llvm_unreachable("fcmp should have simplified");
8479 case FCmpInst::FCMP_ULT:
8480 case FCmpInst::FCMP_ULE:
8481 case FCmpInst::FCMP_OGT:
8482 case FCmpInst::FCMP_OGE:
8483 case FCmpInst::FCMP_OEQ:
8484 case FCmpInst::FCMP_UNE:
8485 // sqrt(X) u< 0.0 --> X u< 0.0
8486 // sqrt(X) u<= 0.0 --> X u<= 0.0
8487 // sqrt(X) > 0.0 --> X > 0.0
8488 // sqrt(X) >= 0.0 --> X >= 0.0
8489 // sqrt(X) == 0.0 --> X == 0.0
8490 // sqrt(X) u!= 0.0 --> X u!= 0.0
8491 return IC.replaceOperand(I, 0, X);
8492
8493 case FCmpInst::FCMP_OLE:
8494 // sqrt(X) <= 0.0 --> X == 0.0
8495 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8496 case FCmpInst::FCMP_UGT:
8497 // sqrt(X) u> 0.0 --> X u!= 0.0
8498 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8499 case FCmpInst::FCMP_UEQ:
8500 // sqrt(X) u== 0.0 --> X u<= 0.0
8501 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8502 case FCmpInst::FCMP_ONE:
8503 // sqrt(X) != 0.0 --> X > 0.0
8504 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8505 case FCmpInst::FCMP_ORD:
8506 // !isnan(sqrt(X)) --> X >= 0.0
8507 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8508 case FCmpInst::FCMP_UNO:
8509 // isnan(sqrt(X)) --> X u< 0.0
8510 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8511 default:
8512 llvm_unreachable("Unexpected predicate!");
8513 }
8514}
8515
8517 CmpInst::Predicate Pred = I.getPredicate();
8518 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8519
8520 // Canonicalize fneg as Op1.
8521 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8522 std::swap(Op0, Op1);
8523 Pred = I.getSwappedPredicate();
8524 }
8525
8526 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8527 return nullptr;
8528
8529 // Replace the negated operand with 0.0:
8530 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8531 Constant *Zero = ConstantFP::getZero(Op0->getType());
8532 return new FCmpInst(Pred, Op0, Zero, "", &I);
8533}
8534
8536 Constant *RHSC, InstCombinerImpl &CI) {
8537 const CmpInst::Predicate Pred = I.getPredicate();
8538 Value *X = LHSI->getOperand(0);
8539 Value *Y = LHSI->getOperand(1);
8540 switch (Pred) {
8541 default:
8542 break;
8543 case FCmpInst::FCMP_UGT:
8544 case FCmpInst::FCMP_ULT:
8545 case FCmpInst::FCMP_UNE:
8546 case FCmpInst::FCMP_OEQ:
8547 case FCmpInst::FCMP_OGE:
8548 case FCmpInst::FCMP_OLE:
8549 // The optimization is not valid if X and Y are infinities of the same
8550 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8551 // flag then we can assume we do not have that case. Otherwise we might be
8552 // able to prove that either X or Y is not infinity.
8553 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8557 break;
8558
8559 [[fallthrough]];
8560 case FCmpInst::FCMP_OGT:
8561 case FCmpInst::FCMP_OLT:
8562 case FCmpInst::FCMP_ONE:
8563 case FCmpInst::FCMP_UEQ:
8564 case FCmpInst::FCMP_UGE:
8565 case FCmpInst::FCMP_ULE:
8566 // fcmp pred (x - y), 0 --> fcmp pred x, y
8567 if (match(RHSC, m_AnyZeroFP()) &&
8568 I.getFunction()->getDenormalMode(
8569 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8571 CI.replaceOperand(I, 0, X);
8572 CI.replaceOperand(I, 1, Y);
8573 I.setHasNoInfs(LHSI->hasNoInfs());
8574 if (LHSI->hasNoNaNs())
8575 I.setHasNoNaNs(true);
8576 return &I;
8577 }
8578 break;
8579 }
8580
8581 return nullptr;
8582}
8583
8585 InstCombinerImpl &IC) {
8586 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8587 Type *OpType = LHS->getType();
8588 CmpInst::Predicate Pred = I.getPredicate();
8589
8592
8593 if (!FloorX && !CeilX) {
8596 std::swap(LHS, RHS);
8597 Pred = I.getSwappedPredicate();
8598 }
8599 }
8600
8601 switch (Pred) {
8602 case FCmpInst::FCMP_OLE:
8603 // fcmp ole floor(x), x => fcmp ord x, 0
8604 if (FloorX)
8606 "", &I);
8607 break;
8608 case FCmpInst::FCMP_OGT:
8609 // fcmp ogt floor(x), x => false
8610 if (FloorX)
8611 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8612 break;
8613 case FCmpInst::FCMP_OGE:
8614 // fcmp oge ceil(x), x => fcmp ord x, 0
8615 if (CeilX)
8617 "", &I);
8618 break;
8619 case FCmpInst::FCMP_OLT:
8620 // fcmp olt ceil(x), x => false
8621 if (CeilX)
8622 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8623 break;
8624 case FCmpInst::FCMP_ULE:
8625 // fcmp ule floor(x), x => true
8626 if (FloorX)
8627 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8628 break;
8629 case FCmpInst::FCMP_UGT:
8630 // fcmp ugt floor(x), x => fcmp uno x, 0
8631 if (FloorX)
8633 "", &I);
8634 break;
8635 case FCmpInst::FCMP_UGE:
8636 // fcmp uge ceil(x), x => true
8637 if (CeilX)
8638 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8639 break;
8640 case FCmpInst::FCMP_ULT:
8641 // fcmp ult ceil(x), x => fcmp uno x, 0
8642 if (CeilX)
8644 "", &I);
8645 break;
8646 default:
8647 break;
8648 }
8649
8650 return nullptr;
8651}
8652
8654 bool Changed = false;
8655
8656 /// Orders the operands of the compare so that they are listed from most
8657 /// complex to least complex. This puts constants before unary operators,
8658 /// before binary operators.
8659 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8660 I.swapOperands();
8661 Changed = true;
8662 }
8663
8664 const CmpInst::Predicate Pred = I.getPredicate();
8665 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8666 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8667 SQ.getWithInstruction(&I)))
8668 return replaceInstUsesWith(I, V);
8669
8670 // Simplify 'fcmp pred X, X'
8671 Type *OpType = Op0->getType();
8672 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8673 if (Op0 == Op1) {
8674 switch (Pred) {
8675 default:
8676 break;
8677 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
8678 case FCmpInst::FCMP_ULT: // True if unordered or less than
8679 case FCmpInst::FCMP_UGT: // True if unordered or greater than
8680 case FCmpInst::FCMP_UNE: // True if unordered or not equal
8681 // Canonicalize these to be 'fcmp uno %X, 0.0'.
8682 I.setPredicate(FCmpInst::FCMP_UNO);
8683 I.setOperand(1, Constant::getNullValue(OpType));
8684 return &I;
8685
8686 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
8687 case FCmpInst::FCMP_OEQ: // True if ordered and equal
8688 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
8689 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
8690 // Canonicalize these to be 'fcmp ord %X, 0.0'.
8691 I.setPredicate(FCmpInst::FCMP_ORD);
8692 I.setOperand(1, Constant::getNullValue(OpType));
8693 return &I;
8694 }
8695 }
8696
8697 if (I.isCommutative()) {
8698 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8699 replaceOperand(I, 0, Pair->first);
8700 replaceOperand(I, 1, Pair->second);
8701 return &I;
8702 }
8703 }
8704
8705 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
8706 // then canonicalize the operand to 0.0.
8707 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
8708 if (!match(Op0, m_PosZeroFP()) &&
8709 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
8710 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
8711
8712 if (!match(Op1, m_PosZeroFP()) &&
8713 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
8714 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8715 }
8716
8717 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
8718 Value *X, *Y;
8719 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
8720 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
8721
8723 return R;
8724
8725 // Test if the FCmpInst instruction is used exclusively by a select as
8726 // part of a minimum or maximum operation. If so, refrain from doing
8727 // any other folding. This helps out other analyses which understand
8728 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
8729 // and CodeGen. And in this case, at least one of the comparison
8730 // operands has at least one user besides the compare (the select),
8731 // which would often largely negate the benefit of folding anyway.
8732 if (I.hasOneUse())
8733 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
8734 Value *A, *B;
8736 if (SPR.Flavor != SPF_UNKNOWN)
8737 return nullptr;
8738 }
8739
8740 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
8741 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
8742 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
8743 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8744
8745 // Canonicalize:
8746 // fcmp olt X, +inf -> fcmp one X, +inf
8747 // fcmp ole X, +inf -> fcmp ord X, 0
8748 // fcmp ogt X, +inf -> false
8749 // fcmp oge X, +inf -> fcmp oeq X, +inf
8750 // fcmp ult X, +inf -> fcmp une X, +inf
8751 // fcmp ule X, +inf -> true
8752 // fcmp ugt X, +inf -> fcmp uno X, 0
8753 // fcmp uge X, +inf -> fcmp ueq X, +inf
8754 // fcmp olt X, -inf -> false
8755 // fcmp ole X, -inf -> fcmp oeq X, -inf
8756 // fcmp ogt X, -inf -> fcmp one X, -inf
8757 // fcmp oge X, -inf -> fcmp ord X, 0
8758 // fcmp ult X, -inf -> fcmp uno X, 0
8759 // fcmp ule X, -inf -> fcmp ueq X, -inf
8760 // fcmp ugt X, -inf -> fcmp une X, -inf
8761 // fcmp uge X, -inf -> true
8762 const APFloat *C;
8763 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8764 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8765 default:
8766 break;
8767 case FCmpInst::FCMP_ORD:
8768 case FCmpInst::FCMP_UNO:
8771 case FCmpInst::FCMP_OGT:
8772 case FCmpInst::FCMP_ULE:
8773 llvm_unreachable("Should be simplified by InstSimplify");
8774 case FCmpInst::FCMP_OLT:
8775 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8776 case FCmpInst::FCMP_OLE:
8777 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8778 "", &I);
8779 case FCmpInst::FCMP_OGE:
8780 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8781 case FCmpInst::FCMP_ULT:
8782 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8783 case FCmpInst::FCMP_UGT:
8784 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8785 "", &I);
8786 case FCmpInst::FCMP_UGE:
8787 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8788 }
8789 }
8790
8791 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8792 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8793 if (match(Op1, m_PosZeroFP()) &&
8796 if (Pred == FCmpInst::FCMP_OEQ)
8797 IntPred = ICmpInst::ICMP_EQ;
8798 else if (Pred == FCmpInst::FCMP_UNE)
8799 IntPred = ICmpInst::ICMP_NE;
8800
8801 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8802 Type *IntTy = X->getType();
8803 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8804 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8805 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8806 }
8807 }
8808
8809 // Handle fcmp with instruction LHS and constant RHS.
8810 Instruction *LHSI;
8811 Constant *RHSC;
8812 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8813 switch (LHSI->getOpcode()) {
8814 case Instruction::Select:
8815 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8816 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8818 return replaceOperand(I, 0, X);
8820 return NV;
8821 break;
8822 case Instruction::FSub:
8823 if (LHSI->hasOneUse())
8824 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
8825 return NV;
8826 break;
8827 case Instruction::PHI:
8828 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8829 return NV;
8830 break;
8831 case Instruction::SIToFP:
8832 case Instruction::UIToFP:
8833 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8834 return NV;
8835 break;
8836 case Instruction::FDiv:
8837 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8838 return NV;
8839 break;
8840 case Instruction::Load:
8841 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8842 if (Instruction *Res =
8844 return Res;
8845 break;
8846 case Instruction::FPTrunc:
8847 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
8848 return NV;
8849 break;
8850 }
8851 }
8852
8853 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8854 return R;
8855
8856 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
8857 return R;
8858
8859 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
8860 return R;
8861
8862 if (match(Op0, m_FNeg(m_Value(X)))) {
8863 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8864 Constant *C;
8865 if (match(Op1, m_Constant(C)))
8866 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8867 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8868 }
8869
8870 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8871 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8872 return new FCmpInst(Pred, X, Op1, "", &I);
8873
8874 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8875 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8876 return new FCmpInst(Pred, Op0, Y, "", &I);
8877
8878 if (match(Op0, m_FPExt(m_Value(X)))) {
8879 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8880 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8881 return new FCmpInst(Pred, X, Y, "", &I);
8882
8883 const APFloat *C;
8884 if (match(Op1, m_APFloat(C))) {
8885 const fltSemantics &FPSem =
8886 X->getType()->getScalarType()->getFltSemantics();
8887 bool Lossy;
8888 APFloat TruncC = *C;
8889 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8890
8891 if (Lossy) {
8892 // X can't possibly equal the higher-precision constant, so reduce any
8893 // equality comparison.
8894 // TODO: Other predicates can be handled via getFCmpCode().
8895 switch (Pred) {
8896 case FCmpInst::FCMP_OEQ:
8897 // X is ordered and equal to an impossible constant --> false
8898 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8899 case FCmpInst::FCMP_ONE:
8900 // X is ordered and not equal to an impossible constant --> ordered
8901 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8902 ConstantFP::getZero(X->getType()));
8903 case FCmpInst::FCMP_UEQ:
8904 // X is unordered or equal to an impossible constant --> unordered
8905 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8906 ConstantFP::getZero(X->getType()));
8907 case FCmpInst::FCMP_UNE:
8908 // X is unordered or not equal to an impossible constant --> true
8909 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8910 default:
8911 break;
8912 }
8913 }
8914
8915 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8916 // Avoid lossy conversions and denormals.
8917 // Zero is a special case that's OK to convert.
8918 APFloat Fabs = TruncC;
8919 Fabs.clearSign();
8920 if (!Lossy &&
8921 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8922 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8923 return new FCmpInst(Pred, X, NewC, "", &I);
8924 }
8925 }
8926 }
8927
8928 // Convert a sign-bit test of an FP value into a cast and integer compare.
8929 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8930 // TODO: Handle non-zero compare constants.
8931 // TODO: Handle other predicates.
8933 m_Value(X)))) &&
8934 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8935 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8936 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8937 IntType = VectorType::get(IntType, VecTy->getElementCount());
8938
8939 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8940 if (Pred == FCmpInst::FCMP_OLT) {
8941 Value *IntX = Builder.CreateBitCast(X, IntType);
8942 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8943 ConstantInt::getNullValue(IntType));
8944 }
8945 }
8946
8947 {
8948 Value *CanonLHS = nullptr;
8950 // (canonicalize(x) == x) => (x == x)
8951 if (CanonLHS == Op1)
8952 return new FCmpInst(Pred, Op1, Op1, "", &I);
8953
8954 Value *CanonRHS = nullptr;
8956 // (x == canonicalize(x)) => (x == x)
8957 if (CanonRHS == Op0)
8958 return new FCmpInst(Pred, Op0, Op0, "", &I);
8959
8960 // (canonicalize(x) == canonicalize(y)) => (x == y)
8961 if (CanonLHS && CanonRHS)
8962 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8963 }
8964
8965 if (I.getType()->isVectorTy())
8966 if (Instruction *Res = foldVectorCmp(I, Builder))
8967 return Res;
8968
8969 return Changed ? &I : nullptr;
8970}
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:539
#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:171
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
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:664
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:982
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:858
static LLVM_ABI Predicate getFlippedStrictnessPredicate(Predicate pred)
This is a static version that you can use without an instruction available.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:679
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:693
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:682
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:691
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:680
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:681
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:690
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:684
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:687
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:688
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:683
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:704
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:692
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:689
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:678
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:686
bool isSigned() const
Definition InstrTypes.h:930
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:942
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:871
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:789
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:776
bool isUnsigned() const
Definition InstrTypes.h:936
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h: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.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:167
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:158
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:2442
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:2783
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 * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
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.
Value * getLHS() const
Value * getRHS() const
static bool isMin(Intrinsic::ID ID)
Whether the intrinsic is a smin or umin.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, 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:102
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:150
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition SetVector.h:251
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:1099
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:201
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.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
This is an optimization pass for GlobalISel generic memory operations.
@ 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:831
@ 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:644
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:634
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:754
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:342
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:222
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:885
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:405
@ 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:560
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.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:831
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:869
#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:108
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:242
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:274
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:151
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:289
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:248
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:145
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:129
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:114
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:286
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:135
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:257
Capture information for a specific Use.