LLVM 19.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/APSInt.h"
15#include "llvm/ADT/ScopeExit.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/Statistic.h"
25#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/InstrTypes.h"
31#include <bitset>
32
33using namespace llvm;
34using namespace PatternMatch;
35
36#define DEBUG_TYPE "instcombine"
37
38// How many times is a select replaced by one of its operands?
39STATISTIC(NumSel, "Number of select opts");
40
41
42/// Compute Result = In1+In2, returning true if the result overflowed for this
43/// type.
44static bool addWithOverflow(APInt &Result, const APInt &In1,
45 const APInt &In2, bool IsSigned = false) {
46 bool Overflow;
47 if (IsSigned)
48 Result = In1.sadd_ov(In2, Overflow);
49 else
50 Result = In1.uadd_ov(In2, Overflow);
51
52 return Overflow;
53}
54
55/// Compute Result = In1-In2, returning true if the result overflowed for this
56/// type.
57static bool subWithOverflow(APInt &Result, const APInt &In1,
58 const APInt &In2, bool IsSigned = false) {
59 bool Overflow;
60 if (IsSigned)
61 Result = In1.ssub_ov(In2, Overflow);
62 else
63 Result = In1.usub_ov(In2, Overflow);
64
65 return Overflow;
66}
67
68/// Given an icmp instruction, return true if any use of this comparison is a
69/// branch on sign bit comparison.
70static bool hasBranchUse(ICmpInst &I) {
71 for (auto *U : I.users())
72 if (isa<BranchInst>(U))
73 return true;
74 return false;
75}
76
77/// Returns true if the exploded icmp can be expressed as a signed comparison
78/// to zero and updates the predicate accordingly.
79/// The signedness of the comparison is preserved.
80/// TODO: Refactor with decomposeBitTestICmp()?
81static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
82 if (!ICmpInst::isSigned(Pred))
83 return false;
84
85 if (C.isZero())
86 return ICmpInst::isRelational(Pred);
87
88 if (C.isOne()) {
89 if (Pred == ICmpInst::ICMP_SLT) {
90 Pred = ICmpInst::ICMP_SLE;
91 return true;
92 }
93 } else if (C.isAllOnes()) {
94 if (Pred == ICmpInst::ICMP_SGT) {
95 Pred = ICmpInst::ICMP_SGE;
96 return true;
97 }
98 }
99
100 return false;
101}
102
103/// This is called when we see this pattern:
104/// cmp pred (load (gep GV, ...)), cmpcst
105/// where GV is a global variable with a constant initializer. Try to simplify
106/// this into some simple computation that does not need the load. For example
107/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
108///
109/// If AndCst is non-null, then the loaded value is masked with that constant
110/// before doing the comparison. This handles cases like "A[i]&4 == 0".
113 ConstantInt *AndCst) {
114 if (LI->isVolatile() || LI->getType() != GEP->getResultElementType() ||
115 GV->getValueType() != GEP->getSourceElementType() || !GV->isConstant() ||
117 return nullptr;
118
120 if (!isa<ConstantArray>(Init) && !isa<ConstantDataArray>(Init))
121 return nullptr;
122
123 uint64_t ArrayElementCount = Init->getType()->getArrayNumElements();
124 // Don't blow up on huge arrays.
125 if (ArrayElementCount > MaxArraySizeForCombine)
126 return nullptr;
127
128 // There are many forms of this optimization we can handle, for now, just do
129 // the simple index into a single-dimensional array.
130 //
131 // Require: GEP GV, 0, i {{, constant indices}}
132 if (GEP->getNumOperands() < 3 || !isa<ConstantInt>(GEP->getOperand(1)) ||
133 !cast<ConstantInt>(GEP->getOperand(1))->isZero() ||
134 isa<Constant>(GEP->getOperand(2)))
135 return nullptr;
136
137 // Check that indices after the variable are constants and in-range for the
138 // type they index. Collect the indices. This is typically for arrays of
139 // structs.
140 SmallVector<unsigned, 4> LaterIndices;
141
142 Type *EltTy = Init->getType()->getArrayElementType();
143 for (unsigned i = 3, e = GEP->getNumOperands(); i != e; ++i) {
144 ConstantInt *Idx = dyn_cast<ConstantInt>(GEP->getOperand(i));
145 if (!Idx)
146 return nullptr; // Variable index.
147
148 uint64_t IdxVal = Idx->getZExtValue();
149 if ((unsigned)IdxVal != IdxVal)
150 return nullptr; // Too large array index.
151
152 if (StructType *STy = dyn_cast<StructType>(EltTy))
153 EltTy = STy->getElementType(IdxVal);
154 else if (ArrayType *ATy = dyn_cast<ArrayType>(EltTy)) {
155 if (IdxVal >= ATy->getNumElements())
156 return nullptr;
157 EltTy = ATy->getElementType();
158 } else {
159 return nullptr; // Unknown type.
160 }
161
162 LaterIndices.push_back(IdxVal);
163 }
164
165 enum { Overdefined = -3, Undefined = -2 };
166
167 // Variables for our state machines.
168
169 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
170 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
171 // and 87 is the second (and last) index. FirstTrueElement is -2 when
172 // undefined, otherwise set to the first true element. SecondTrueElement is
173 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
174 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
175
176 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
177 // form "i != 47 & i != 87". Same state transitions as for true elements.
178 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
179
180 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
181 /// define a state machine that triggers for ranges of values that the index
182 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
183 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
184 /// index in the range (inclusive). We use -2 for undefined here because we
185 /// use relative comparisons and don't want 0-1 to match -1.
186 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
187
188 // MagicBitvector - This is a magic bitvector where we set a bit if the
189 // comparison is true for element 'i'. If there are 64 elements or less in
190 // the array, this will fully represent all the comparison results.
191 uint64_t MagicBitvector = 0;
192
193 // Scan the array and see if one of our patterns matches.
194 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
195 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i) {
196 Constant *Elt = Init->getAggregateElement(i);
197 if (!Elt)
198 return nullptr;
199
200 // If this is indexing an array of structures, get the structure element.
201 if (!LaterIndices.empty()) {
202 Elt = ConstantFoldExtractValueInstruction(Elt, LaterIndices);
203 if (!Elt)
204 return nullptr;
205 }
206
207 // If the element is masked, handle it.
208 if (AndCst) {
209 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
210 if (!Elt)
211 return nullptr;
212 }
213
214 // Find out if the comparison would be true or false for the i'th element.
216 CompareRHS, DL, &TLI);
217 if (!C)
218 return nullptr;
219
220 // If the result is undef for this element, ignore it.
221 if (isa<UndefValue>(C)) {
222 // Extend range state machines to cover this element in case there is an
223 // undef in the middle of the range.
224 if (TrueRangeEnd == (int)i - 1)
225 TrueRangeEnd = i;
226 if (FalseRangeEnd == (int)i - 1)
227 FalseRangeEnd = i;
228 continue;
229 }
230
231 // If we can't compute the result for any of the elements, we have to give
232 // up evaluating the entire conditional.
233 if (!isa<ConstantInt>(C))
234 return nullptr;
235
236 // Otherwise, we know if the comparison is true or false for this element,
237 // update our state machines.
238 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
239
240 // State machine for single/double/range index comparison.
241 if (IsTrueForElt) {
242 // Update the TrueElement state machine.
243 if (FirstTrueElement == Undefined)
244 FirstTrueElement = TrueRangeEnd = i; // First true element.
245 else {
246 // Update double-compare state machine.
247 if (SecondTrueElement == Undefined)
248 SecondTrueElement = i;
249 else
250 SecondTrueElement = Overdefined;
251
252 // Update range state machine.
253 if (TrueRangeEnd == (int)i - 1)
254 TrueRangeEnd = i;
255 else
256 TrueRangeEnd = Overdefined;
257 }
258 } else {
259 // Update the FalseElement state machine.
260 if (FirstFalseElement == Undefined)
261 FirstFalseElement = FalseRangeEnd = i; // First false element.
262 else {
263 // Update double-compare state machine.
264 if (SecondFalseElement == Undefined)
265 SecondFalseElement = i;
266 else
267 SecondFalseElement = Overdefined;
268
269 // Update range state machine.
270 if (FalseRangeEnd == (int)i - 1)
271 FalseRangeEnd = i;
272 else
273 FalseRangeEnd = Overdefined;
274 }
275 }
276
277 // If this element is in range, update our magic bitvector.
278 if (i < 64 && IsTrueForElt)
279 MagicBitvector |= 1ULL << i;
280
281 // If all of our states become overdefined, bail out early. Since the
282 // predicate is expensive, only check it every 8 elements. This is only
283 // really useful for really huge arrays.
284 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
285 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
286 FalseRangeEnd == Overdefined)
287 return nullptr;
288 }
289
290 // Now that we've scanned the entire array, emit our new comparison(s). We
291 // order the state machines in complexity of the generated code.
292 Value *Idx = GEP->getOperand(2);
293
294 // If the index is larger than the pointer offset size of the target, truncate
295 // the index down like the GEP would do implicitly. We don't have to do this
296 // for an inbounds GEP because the index can't be out of range.
297 if (!GEP->isInBounds()) {
298 Type *PtrIdxTy = DL.getIndexType(GEP->getType());
299 unsigned OffsetSize = PtrIdxTy->getIntegerBitWidth();
300 if (Idx->getType()->getPrimitiveSizeInBits().getFixedValue() > OffsetSize)
301 Idx = Builder.CreateTrunc(Idx, PtrIdxTy);
302 }
303
304 // If inbounds keyword is not present, Idx * ElementSize can overflow.
305 // Let's assume that ElementSize is 2 and the wanted value is at offset 0.
306 // Then, there are two possible values for Idx to match offset 0:
307 // 0x00..00, 0x80..00.
308 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
309 // comparison is false if Idx was 0x80..00.
310 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
311 unsigned ElementSize =
312 DL.getTypeAllocSize(Init->getType()->getArrayElementType());
313 auto MaskIdx = [&](Value *Idx) {
314 if (!GEP->isInBounds() && llvm::countr_zero(ElementSize) != 0) {
315 Value *Mask = ConstantInt::get(Idx->getType(), -1);
316 Mask = Builder.CreateLShr(Mask, llvm::countr_zero(ElementSize));
317 Idx = Builder.CreateAnd(Idx, Mask);
318 }
319 return Idx;
320 };
321
322 // If the comparison is only true for one or two elements, emit direct
323 // comparisons.
324 if (SecondTrueElement != Overdefined) {
325 Idx = MaskIdx(Idx);
326 // None true -> false.
327 if (FirstTrueElement == Undefined)
328 return replaceInstUsesWith(ICI, Builder.getFalse());
329
330 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
331
332 // True for one element -> 'i == 47'.
333 if (SecondTrueElement == Undefined)
334 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
335
336 // True for two elements -> 'i == 47 | i == 72'.
337 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
338 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
339 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
340 return BinaryOperator::CreateOr(C1, C2);
341 }
342
343 // If the comparison is only false for one or two elements, emit direct
344 // comparisons.
345 if (SecondFalseElement != Overdefined) {
346 Idx = MaskIdx(Idx);
347 // None false -> true.
348 if (FirstFalseElement == Undefined)
349 return replaceInstUsesWith(ICI, Builder.getTrue());
350
351 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
352
353 // False for one element -> 'i != 47'.
354 if (SecondFalseElement == Undefined)
355 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
356
357 // False for two elements -> 'i != 47 & i != 72'.
358 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
359 Value *SecondFalseIdx =
360 ConstantInt::get(Idx->getType(), SecondFalseElement);
361 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
362 return BinaryOperator::CreateAnd(C1, C2);
363 }
364
365 // If the comparison can be replaced with a range comparison for the elements
366 // where it is true, emit the range check.
367 if (TrueRangeEnd != Overdefined) {
368 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
369 Idx = MaskIdx(Idx);
370
371 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
372 if (FirstTrueElement) {
373 Value *Offs = ConstantInt::get(Idx->getType(), -FirstTrueElement);
374 Idx = Builder.CreateAdd(Idx, Offs);
375 }
376
377 Value *End =
378 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
379 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
380 }
381
382 // False range check.
383 if (FalseRangeEnd != Overdefined) {
384 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
385 Idx = MaskIdx(Idx);
386 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
387 if (FirstFalseElement) {
388 Value *Offs = ConstantInt::get(Idx->getType(), -FirstFalseElement);
389 Idx = Builder.CreateAdd(Idx, Offs);
390 }
391
392 Value *End =
393 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
394 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
395 }
396
397 // If a magic bitvector captures the entire comparison state
398 // of this load, replace it with computation that does:
399 // ((magic_cst >> i) & 1) != 0
400 {
401 Type *Ty = nullptr;
402
403 // Look for an appropriate type:
404 // - The type of Idx if the magic fits
405 // - The smallest fitting legal type
406 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
407 Ty = Idx->getType();
408 else
409 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
410
411 if (Ty) {
412 Idx = MaskIdx(Idx);
413 Value *V = Builder.CreateIntCast(Idx, Ty, false);
414 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
415 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
416 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
417 }
418 }
419
420 return nullptr;
421}
422
423/// Returns true if we can rewrite Start as a GEP with pointer Base
424/// and some integer offset. The nodes that need to be re-written
425/// for this transformation will be added to Explored.
427 const DataLayout &DL,
428 SetVector<Value *> &Explored) {
429 SmallVector<Value *, 16> WorkList(1, Start);
430 Explored.insert(Base);
431
432 // The following traversal gives us an order which can be used
433 // when doing the final transformation. Since in the final
434 // transformation we create the PHI replacement instructions first,
435 // we don't have to get them in any particular order.
436 //
437 // However, for other instructions we will have to traverse the
438 // operands of an instruction first, which means that we have to
439 // do a post-order traversal.
440 while (!WorkList.empty()) {
442
443 while (!WorkList.empty()) {
444 if (Explored.size() >= 100)
445 return false;
446
447 Value *V = WorkList.back();
448
449 if (Explored.contains(V)) {
450 WorkList.pop_back();
451 continue;
452 }
453
454 if (!isa<GetElementPtrInst>(V) && !isa<PHINode>(V))
455 // We've found some value that we can't explore which is different from
456 // the base. Therefore we can't do this transformation.
457 return false;
458
459 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
460 // Only allow inbounds GEPs with at most one variable offset.
461 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
462 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
463 return false;
464
465 if (!Explored.contains(GEP->getOperand(0)))
466 WorkList.push_back(GEP->getOperand(0));
467 }
468
469 if (WorkList.back() == V) {
470 WorkList.pop_back();
471 // We've finished visiting this node, mark it as such.
472 Explored.insert(V);
473 }
474
475 if (auto *PN = dyn_cast<PHINode>(V)) {
476 // We cannot transform PHIs on unsplittable basic blocks.
477 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
478 return false;
479 Explored.insert(PN);
480 PHIs.insert(PN);
481 }
482 }
483
484 // Explore the PHI nodes further.
485 for (auto *PN : PHIs)
486 for (Value *Op : PN->incoming_values())
487 if (!Explored.contains(Op))
488 WorkList.push_back(Op);
489 }
490
491 // Make sure that we can do this. Since we can't insert GEPs in a basic
492 // block before a PHI node, we can't easily do this transformation if
493 // we have PHI node users of transformed instructions.
494 for (Value *Val : Explored) {
495 for (Value *Use : Val->uses()) {
496
497 auto *PHI = dyn_cast<PHINode>(Use);
498 auto *Inst = dyn_cast<Instruction>(Val);
499
500 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
501 !Explored.contains(PHI))
502 continue;
503
504 if (PHI->getParent() == Inst->getParent())
505 return false;
506 }
507 }
508 return true;
509}
510
511// Sets the appropriate insert point on Builder where we can add
512// a replacement Instruction for V (if that is possible).
513static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
514 bool Before = true) {
515 if (auto *PHI = dyn_cast<PHINode>(V)) {
516 BasicBlock *Parent = PHI->getParent();
517 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
518 return;
519 }
520 if (auto *I = dyn_cast<Instruction>(V)) {
521 if (!Before)
522 I = &*std::next(I->getIterator());
523 Builder.SetInsertPoint(I);
524 return;
525 }
526 if (auto *A = dyn_cast<Argument>(V)) {
527 // Set the insertion point in the entry block.
528 BasicBlock &Entry = A->getParent()->getEntryBlock();
529 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
530 return;
531 }
532 // Otherwise, this is a constant and we don't need to set a new
533 // insertion point.
534 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
535}
536
537/// Returns a re-written value of Start as an indexed GEP using Base as a
538/// pointer.
540 const DataLayout &DL,
541 SetVector<Value *> &Explored,
542 InstCombiner &IC) {
543 // Perform all the substitutions. This is a bit tricky because we can
544 // have cycles in our use-def chains.
545 // 1. Create the PHI nodes without any incoming values.
546 // 2. Create all the other values.
547 // 3. Add the edges for the PHI nodes.
548 // 4. Emit GEPs to get the original pointers.
549 // 5. Remove the original instructions.
550 Type *IndexType = IntegerType::get(
551 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
552
554 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
555
556 // Create the new PHI nodes, without adding any incoming values.
557 for (Value *Val : Explored) {
558 if (Val == Base)
559 continue;
560 // Create empty phi nodes. This avoids cyclic dependencies when creating
561 // the remaining instructions.
562 if (auto *PHI = dyn_cast<PHINode>(Val))
563 NewInsts[PHI] =
564 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
565 PHI->getName() + ".idx", PHI->getIterator());
566 }
567 IRBuilder<> Builder(Base->getContext());
568
569 // Create all the other instructions.
570 for (Value *Val : Explored) {
571 if (NewInsts.contains(Val))
572 continue;
573
574 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
575 setInsertionPoint(Builder, GEP);
576 Value *Op = NewInsts[GEP->getOperand(0)];
577 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
578 if (isa<ConstantInt>(Op) && cast<ConstantInt>(Op)->isZero())
579 NewInsts[GEP] = OffsetV;
580 else
581 NewInsts[GEP] = Builder.CreateNSWAdd(
582 Op, OffsetV, GEP->getOperand(0)->getName() + ".add");
583 continue;
584 }
585 if (isa<PHINode>(Val))
586 continue;
587
588 llvm_unreachable("Unexpected instruction type");
589 }
590
591 // Add the incoming values to the PHI nodes.
592 for (Value *Val : Explored) {
593 if (Val == Base)
594 continue;
595 // All the instructions have been created, we can now add edges to the
596 // phi nodes.
597 if (auto *PHI = dyn_cast<PHINode>(Val)) {
598 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
599 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
600 Value *NewIncoming = PHI->getIncomingValue(I);
601
602 if (NewInsts.contains(NewIncoming))
603 NewIncoming = NewInsts[NewIncoming];
604
605 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
606 }
607 }
608 }
609
610 for (Value *Val : Explored) {
611 if (Val == Base)
612 continue;
613
614 setInsertionPoint(Builder, Val, false);
615 // Create GEP for external users.
616 Value *NewVal = Builder.CreateInBoundsGEP(
617 Builder.getInt8Ty(), Base, NewInsts[Val], Val->getName() + ".ptr");
618 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
619 // Add old instruction to worklist for DCE. We don't directly remove it
620 // here because the original compare is one of the users.
621 IC.addToWorklist(cast<Instruction>(Val));
622 }
623
624 return NewInsts[Start];
625}
626
627/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
628/// We can look through PHIs, GEPs and casts in order to determine a common base
629/// between GEPLHS and RHS.
632 const DataLayout &DL,
633 InstCombiner &IC) {
634 // FIXME: Support vector of pointers.
635 if (GEPLHS->getType()->isVectorTy())
636 return nullptr;
637
638 if (!GEPLHS->hasAllConstantIndices())
639 return nullptr;
640
641 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
642 Value *PtrBase =
644 /*AllowNonInbounds*/ false);
645
646 // Bail if we looked through addrspacecast.
647 if (PtrBase->getType() != GEPLHS->getType())
648 return nullptr;
649
650 // The set of nodes that will take part in this transformation.
651 SetVector<Value *> Nodes;
652
653 if (!canRewriteGEPAsOffset(RHS, PtrBase, DL, Nodes))
654 return nullptr;
655
656 // We know we can re-write this as
657 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
658 // Since we've only looked through inbouds GEPs we know that we
659 // can't have overflow on either side. We can therefore re-write
660 // this as:
661 // OFFSET1 cmp OFFSET2
662 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, DL, Nodes, IC);
663
664 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
665 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
666 // offset. Since Index is the offset of LHS to the base pointer, we will now
667 // compare the offsets instead of comparing the pointers.
669 IC.Builder.getInt(Offset), NewRHS);
670}
671
672/// Fold comparisons between a GEP instruction and something else. At this point
673/// we know that the GEP is on the LHS of the comparison.
676 Instruction &I) {
677 // Don't transform signed compares of GEPs into index compares. Even if the
678 // GEP is inbounds, the final add of the base pointer can have signed overflow
679 // and would change the result of the icmp.
680 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
681 // the maximum signed value for the pointer type.
683 return nullptr;
684
685 // Look through bitcasts and addrspacecasts. We do not however want to remove
686 // 0 GEPs.
687 if (!isa<GetElementPtrInst>(RHS))
689
690 Value *PtrBase = GEPLHS->getOperand(0);
691 if (PtrBase == RHS && (GEPLHS->isInBounds() || ICmpInst::isEquality(Cond))) {
692 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
693 Value *Offset = EmitGEPOffset(GEPLHS);
695 Constant::getNullValue(Offset->getType()));
696 }
697
698 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
699 isa<Constant>(RHS) && cast<Constant>(RHS)->isNullValue() &&
700 !NullPointerIsDefined(I.getFunction(),
702 // For most address spaces, an allocation can't be placed at null, but null
703 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
704 // the only valid inbounds address derived from null, is null itself.
705 // Thus, we have four cases to consider:
706 // 1) Base == nullptr, Offset == 0 -> inbounds, null
707 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
708 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
709 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
710 //
711 // (Note if we're indexing a type of size 0, that simply collapses into one
712 // of the buckets above.)
713 //
714 // In general, we're allowed to make values less poison (i.e. remove
715 // sources of full UB), so in this case, we just select between the two
716 // non-poison cases (1 and 4 above).
717 //
718 // For vectors, we apply the same reasoning on a per-lane basis.
719 auto *Base = GEPLHS->getPointerOperand();
720 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
721 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
723 }
724 return new ICmpInst(Cond, Base,
726 cast<Constant>(RHS), Base->getType()));
727 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
728 // If the base pointers are different, but the indices are the same, just
729 // compare the base pointer.
730 if (PtrBase != GEPRHS->getOperand(0)) {
731 bool IndicesTheSame =
732 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
733 GEPLHS->getPointerOperand()->getType() ==
734 GEPRHS->getPointerOperand()->getType() &&
735 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
736 if (IndicesTheSame)
737 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
738 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
739 IndicesTheSame = false;
740 break;
741 }
742
743 // If all indices are the same, just compare the base pointers.
744 Type *BaseType = GEPLHS->getOperand(0)->getType();
745 if (IndicesTheSame && CmpInst::makeCmpResultType(BaseType) == I.getType())
746 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
747
748 // If we're comparing GEPs with two base pointers that only differ in type
749 // and both GEPs have only constant indices or just one use, then fold
750 // the compare with the adjusted indices.
751 // FIXME: Support vector of pointers.
752 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
753 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
754 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
755 PtrBase->stripPointerCasts() ==
756 GEPRHS->getOperand(0)->stripPointerCasts() &&
757 !GEPLHS->getType()->isVectorTy()) {
758 Value *LOffset = EmitGEPOffset(GEPLHS);
759 Value *ROffset = EmitGEPOffset(GEPRHS);
760
761 // If we looked through an addrspacecast between different sized address
762 // spaces, the LHS and RHS pointers are different sized
763 // integers. Truncate to the smaller one.
764 Type *LHSIndexTy = LOffset->getType();
765 Type *RHSIndexTy = ROffset->getType();
766 if (LHSIndexTy != RHSIndexTy) {
767 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
768 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
769 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
770 } else
771 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
772 }
773
775 LOffset, ROffset);
776 return replaceInstUsesWith(I, Cmp);
777 }
778
779 // Otherwise, the base pointers are different and the indices are
780 // different. Try convert this to an indexed compare by looking through
781 // PHIs/casts.
782 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
783 }
784
785 bool GEPsInBounds = GEPLHS->isInBounds() && GEPRHS->isInBounds();
786 if (GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
787 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
788 // If the GEPs only differ by one index, compare it.
789 unsigned NumDifferences = 0; // Keep track of # differences.
790 unsigned DiffOperand = 0; // The operand that differs.
791 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
792 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
793 Type *LHSType = GEPLHS->getOperand(i)->getType();
794 Type *RHSType = GEPRHS->getOperand(i)->getType();
795 // FIXME: Better support for vector of pointers.
796 if (LHSType->getPrimitiveSizeInBits() !=
797 RHSType->getPrimitiveSizeInBits() ||
798 (GEPLHS->getType()->isVectorTy() &&
799 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
800 // Irreconcilable differences.
801 NumDifferences = 2;
802 break;
803 }
804
805 if (NumDifferences++) break;
806 DiffOperand = i;
807 }
808
809 if (NumDifferences == 0) // SAME GEP?
810 return replaceInstUsesWith(I, // No comparison is needed here.
811 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
812
813 else if (NumDifferences == 1 && GEPsInBounds) {
814 Value *LHSV = GEPLHS->getOperand(DiffOperand);
815 Value *RHSV = GEPRHS->getOperand(DiffOperand);
816 // Make sure we do a signed comparison here.
817 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), LHSV, RHSV);
818 }
819 }
820
821 if (GEPsInBounds || CmpInst::isEquality(Cond)) {
822 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
823 Value *L = EmitGEPOffset(GEPLHS, /*RewriteGEP=*/true);
824 Value *R = EmitGEPOffset(GEPRHS, /*RewriteGEP=*/true);
825 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), L, R);
826 }
827 }
828
829 // Try convert this to an indexed compare by looking through PHIs/casts as a
830 // last resort.
831 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
832}
833
835 // It would be tempting to fold away comparisons between allocas and any
836 // pointer not based on that alloca (e.g. an argument). However, even
837 // though such pointers cannot alias, they can still compare equal.
838 //
839 // But LLVM doesn't specify where allocas get their memory, so if the alloca
840 // doesn't escape we can argue that it's impossible to guess its value, and we
841 // can therefore act as if any such guesses are wrong.
842 //
843 // However, we need to ensure that this folding is consistent: We can't fold
844 // one comparison to false, and then leave a different comparison against the
845 // same value alone (as it might evaluate to true at runtime, leading to a
846 // contradiction). As such, this code ensures that all comparisons are folded
847 // at the same time, and there are no other escapes.
848
849 struct CmpCaptureTracker : public CaptureTracker {
850 AllocaInst *Alloca;
851 bool Captured = false;
852 /// The value of the map is a bit mask of which icmp operands the alloca is
853 /// used in.
855
856 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
857
858 void tooManyUses() override { Captured = true; }
859
860 bool captured(const Use *U) override {
861 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
862 // We need to check that U is based *only* on the alloca, and doesn't
863 // have other contributions from a select/phi operand.
864 // TODO: We could check whether getUnderlyingObjects() reduces to one
865 // object, which would allow looking through phi nodes.
866 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
867 // Collect equality icmps of the alloca, and don't treat them as
868 // captures.
869 auto Res = ICmps.insert({ICmp, 0});
870 Res.first->second |= 1u << U->getOperandNo();
871 return false;
872 }
873
874 Captured = true;
875 return true;
876 }
877 };
878
879 CmpCaptureTracker Tracker(Alloca);
880 PointerMayBeCaptured(Alloca, &Tracker);
881 if (Tracker.Captured)
882 return false;
883
884 bool Changed = false;
885 for (auto [ICmp, Operands] : Tracker.ICmps) {
886 switch (Operands) {
887 case 1:
888 case 2: {
889 // The alloca is only used in one icmp operand. Assume that the
890 // equality is false.
891 auto *Res = ConstantInt::get(
892 ICmp->getType(), ICmp->getPredicate() == ICmpInst::ICMP_NE);
893 replaceInstUsesWith(*ICmp, Res);
895 Changed = true;
896 break;
897 }
898 case 3:
899 // Both icmp operands are based on the alloca, so this is comparing
900 // pointer offsets, without leaking any information about the address
901 // of the alloca. Ignore such comparisons.
902 break;
903 default:
904 llvm_unreachable("Cannot happen");
905 }
906 }
907
908 return Changed;
909}
910
911/// Fold "icmp pred (X+C), X".
913 ICmpInst::Predicate Pred) {
914 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
915 // so the values can never be equal. Similarly for all other "or equals"
916 // operators.
917 assert(!!C && "C should not be zero!");
918
919 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
920 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
921 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
922 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
923 Constant *R = ConstantInt::get(X->getType(),
924 APInt::getMaxValue(C.getBitWidth()) - C);
925 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
926 }
927
928 // (X+1) >u X --> X <u (0-1) --> X != 255
929 // (X+2) >u X --> X <u (0-2) --> X <u 254
930 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
931 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
932 return new ICmpInst(ICmpInst::ICMP_ULT, X,
933 ConstantInt::get(X->getType(), -C));
934
935 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
936
937 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
938 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
939 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
940 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
941 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
942 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
943 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
944 return new ICmpInst(ICmpInst::ICMP_SGT, X,
945 ConstantInt::get(X->getType(), SMax - C));
946
947 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
948 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
949 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
950 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
951 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
952 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
953
954 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
955 return new ICmpInst(ICmpInst::ICMP_SLT, X,
956 ConstantInt::get(X->getType(), SMax - (C - 1)));
957}
958
959/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
960/// (icmp eq/ne A, Log2(AP2/AP1)) ->
961/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
963 const APInt &AP1,
964 const APInt &AP2) {
965 assert(I.isEquality() && "Cannot fold icmp gt/lt");
966
967 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
968 if (I.getPredicate() == I.ICMP_NE)
969 Pred = CmpInst::getInversePredicate(Pred);
970 return new ICmpInst(Pred, LHS, RHS);
971 };
972
973 // Don't bother doing any work for cases which InstSimplify handles.
974 if (AP2.isZero())
975 return nullptr;
976
977 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
978 if (IsAShr) {
979 if (AP2.isAllOnes())
980 return nullptr;
981 if (AP2.isNegative() != AP1.isNegative())
982 return nullptr;
983 if (AP2.sgt(AP1))
984 return nullptr;
985 }
986
987 if (!AP1)
988 // 'A' must be large enough to shift out the highest set bit.
989 return getICmp(I.ICMP_UGT, A,
990 ConstantInt::get(A->getType(), AP2.logBase2()));
991
992 if (AP1 == AP2)
993 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
994
995 int Shift;
996 if (IsAShr && AP1.isNegative())
997 Shift = AP1.countl_one() - AP2.countl_one();
998 else
999 Shift = AP1.countl_zero() - AP2.countl_zero();
1000
1001 if (Shift > 0) {
1002 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1003 // There are multiple solutions if we are comparing against -1 and the LHS
1004 // of the ashr is not a power of two.
1005 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1006 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1007 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1008 } else if (AP1 == AP2.lshr(Shift)) {
1009 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1010 }
1011 }
1012
1013 // Shifting const2 will never be equal to const1.
1014 // FIXME: This should always be handled by InstSimplify?
1015 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1016 return replaceInstUsesWith(I, TorF);
1017}
1018
1019/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1020/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1022 const APInt &AP1,
1023 const APInt &AP2) {
1024 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1025
1026 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1027 if (I.getPredicate() == I.ICMP_NE)
1028 Pred = CmpInst::getInversePredicate(Pred);
1029 return new ICmpInst(Pred, LHS, RHS);
1030 };
1031
1032 // Don't bother doing any work for cases which InstSimplify handles.
1033 if (AP2.isZero())
1034 return nullptr;
1035
1036 unsigned AP2TrailingZeros = AP2.countr_zero();
1037
1038 if (!AP1 && AP2TrailingZeros != 0)
1039 return getICmp(
1040 I.ICMP_UGE, A,
1041 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1042
1043 if (AP1 == AP2)
1044 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1045
1046 // Get the distance between the lowest bits that are set.
1047 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1048
1049 if (Shift > 0 && AP2.shl(Shift) == AP1)
1050 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1051
1052 // Shifting const2 will never be equal to const1.
1053 // FIXME: This should always be handled by InstSimplify?
1054 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1055 return replaceInstUsesWith(I, TorF);
1056}
1057
1058/// The caller has matched a pattern of the form:
1059/// I = icmp ugt (add (add A, B), CI2), CI1
1060/// If this is of the form:
1061/// sum = a + b
1062/// if (sum+128 >u 255)
1063/// Then replace it with llvm.sadd.with.overflow.i8.
1064///
1066 ConstantInt *CI2, ConstantInt *CI1,
1067 InstCombinerImpl &IC) {
1068 // The transformation we're trying to do here is to transform this into an
1069 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1070 // with a narrower add, and discard the add-with-constant that is part of the
1071 // range check (if we can't eliminate it, this isn't profitable).
1072
1073 // In order to eliminate the add-with-constant, the compare can be its only
1074 // use.
1075 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1076 if (!AddWithCst->hasOneUse())
1077 return nullptr;
1078
1079 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1080 if (!CI2->getValue().isPowerOf2())
1081 return nullptr;
1082 unsigned NewWidth = CI2->getValue().countr_zero();
1083 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1084 return nullptr;
1085
1086 // The width of the new add formed is 1 more than the bias.
1087 ++NewWidth;
1088
1089 // Check to see that CI1 is an all-ones value with NewWidth bits.
1090 if (CI1->getBitWidth() == NewWidth ||
1091 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1092 return nullptr;
1093
1094 // This is only really a signed overflow check if the inputs have been
1095 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1096 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1097 if (IC.ComputeMaxSignificantBits(A, 0, &I) > NewWidth ||
1098 IC.ComputeMaxSignificantBits(B, 0, &I) > NewWidth)
1099 return nullptr;
1100
1101 // In order to replace the original add with a narrower
1102 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1103 // and truncates that discard the high bits of the add. Verify that this is
1104 // the case.
1105 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1106 for (User *U : OrigAdd->users()) {
1107 if (U == AddWithCst)
1108 continue;
1109
1110 // Only accept truncates for now. We would really like a nice recursive
1111 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1112 // chain to see which bits of a value are actually demanded. If the
1113 // original add had another add which was then immediately truncated, we
1114 // could still do the transformation.
1115 TruncInst *TI = dyn_cast<TruncInst>(U);
1116 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1117 return nullptr;
1118 }
1119
1120 // If the pattern matches, truncate the inputs to the narrower type and
1121 // use the sadd_with_overflow intrinsic to efficiently compute both the
1122 // result and the overflow bit.
1123 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1125 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1126
1127 InstCombiner::BuilderTy &Builder = IC.Builder;
1128
1129 // Put the new code above the original add, in case there are any uses of the
1130 // add between the add and the compare.
1131 Builder.SetInsertPoint(OrigAdd);
1132
1133 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1134 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1135 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1136 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1137 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1138
1139 // The inner add was the result of the narrow add, zero extended to the
1140 // wider type. Replace it with the result computed by the intrinsic.
1141 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1142 IC.eraseInstFromFunction(*OrigAdd);
1143
1144 // The original icmp gets replaced with the overflow value.
1145 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1146}
1147
1148/// If we have:
1149/// icmp eq/ne (urem/srem %x, %y), 0
1150/// iff %y is a power-of-two, we can replace this with a bit test:
1151/// icmp eq/ne (and %x, (add %y, -1)), 0
1153 // This fold is only valid for equality predicates.
1154 if (!I.isEquality())
1155 return nullptr;
1157 Value *X, *Y, *Zero;
1158 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1159 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1160 return nullptr;
1161 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, 0, &I))
1162 return nullptr;
1163 // This may increase instruction count, we don't enforce that Y is a constant.
1164 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1165 Value *Masked = Builder.CreateAnd(X, Mask);
1166 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1167}
1168
1169/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1170/// by one-less-than-bitwidth into a sign test on the original value.
1172 Instruction *Val;
1174 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1175 return nullptr;
1176
1177 Value *X;
1178 Type *XTy;
1179
1180 Constant *C;
1181 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1182 XTy = X->getType();
1183 unsigned XBitWidth = XTy->getScalarSizeInBits();
1185 APInt(XBitWidth, XBitWidth - 1))))
1186 return nullptr;
1187 } else if (isa<BinaryOperator>(Val) &&
1189 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1190 /*AnalyzeForSignBitExtraction=*/true))) {
1191 XTy = X->getType();
1192 } else
1193 return nullptr;
1194
1195 return ICmpInst::Create(Instruction::ICmp,
1199}
1200
1201// Handle icmp pred X, 0
1203 CmpInst::Predicate Pred = Cmp.getPredicate();
1204 if (!match(Cmp.getOperand(1), m_Zero()))
1205 return nullptr;
1206
1207 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1208 if (Pred == ICmpInst::ICMP_SGT) {
1209 Value *A, *B;
1210 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1212 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1214 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1215 }
1216 }
1217
1219 return New;
1220
1221 // Given:
1222 // icmp eq/ne (urem %x, %y), 0
1223 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1224 // icmp eq/ne %x, 0
1225 Value *X, *Y;
1226 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1227 ICmpInst::isEquality(Pred)) {
1228 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1229 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1230 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1231 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1232 }
1233
1234 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1235 // odd/non-zero/there is no overflow.
1236 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1237 ICmpInst::isEquality(Pred)) {
1238
1239 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1240 // if X % 2 != 0
1241 // (icmp eq/ne Y)
1242 if (XKnown.countMaxTrailingZeros() == 0)
1243 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1244
1245 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1246 // if Y % 2 != 0
1247 // (icmp eq/ne X)
1248 if (YKnown.countMaxTrailingZeros() == 0)
1249 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1250
1251 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1252 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1253 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1254 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1255 // but to avoid unnecessary work, first just if this is an obvious case.
1256
1257 // if X non-zero and NoOverflow(X * Y)
1258 // (icmp eq/ne Y)
1259 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1260 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1261
1262 // if Y non-zero and NoOverflow(X * Y)
1263 // (icmp eq/ne X)
1264 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1265 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1266 }
1267 // Note, we are skipping cases:
1268 // if Y % 2 != 0 AND X % 2 != 0
1269 // (false/true)
1270 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1271 // (false/true)
1272 // Those can be simplified later as we would have already replaced the (icmp
1273 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1274 // will fold to a constant elsewhere.
1275 }
1276 return nullptr;
1277}
1278
1279/// Fold icmp Pred X, C.
1280/// TODO: This code structure does not make sense. The saturating add fold
1281/// should be moved to some other helper and extended as noted below (it is also
1282/// possible that code has been made unnecessary - do we canonicalize IR to
1283/// overflow/saturating intrinsics or not?).
1285 // Match the following pattern, which is a common idiom when writing
1286 // overflow-safe integer arithmetic functions. The source performs an addition
1287 // in wider type and explicitly checks for overflow using comparisons against
1288 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1289 //
1290 // TODO: This could probably be generalized to handle other overflow-safe
1291 // operations if we worked out the formulas to compute the appropriate magic
1292 // constants.
1293 //
1294 // sum = a + b
1295 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1296 CmpInst::Predicate Pred = Cmp.getPredicate();
1297 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1298 Value *A, *B;
1299 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1300 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1301 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1302 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1303 return Res;
1304
1305 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1306 Constant *C = dyn_cast<Constant>(Op1);
1307 if (!C)
1308 return nullptr;
1309
1310 if (auto *Phi = dyn_cast<PHINode>(Op0))
1311 if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) {
1313 for (Value *V : Phi->incoming_values()) {
1314 Constant *Res =
1315 ConstantFoldCompareInstOperands(Pred, cast<Constant>(V), C, DL);
1316 if (!Res)
1317 return nullptr;
1318 Ops.push_back(Res);
1319 }
1321 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1322 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1323 NewPhi->addIncoming(V, Pred);
1324 return replaceInstUsesWith(Cmp, NewPhi);
1325 }
1326
1328 return R;
1329
1330 return nullptr;
1331}
1332
1333/// Canonicalize icmp instructions based on dominating conditions.
1335 // We already checked simple implication in InstSimplify, only handle complex
1336 // cases here.
1337 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1338 const APInt *C;
1339 if (!match(Y, m_APInt(C)))
1340 return nullptr;
1341
1342 CmpInst::Predicate Pred = Cmp.getPredicate();
1344
1345 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1346 const APInt *DomC) -> Instruction * {
1347 // We have 2 compares of a variable with constants. Calculate the constant
1348 // ranges of those compares to see if we can transform the 2nd compare:
1349 // DomBB:
1350 // DomCond = icmp DomPred X, DomC
1351 // br DomCond, CmpBB, FalseBB
1352 // CmpBB:
1353 // Cmp = icmp Pred X, C
1354 ConstantRange DominatingCR =
1355 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1356 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1357 ConstantRange Difference = DominatingCR.difference(CR);
1358 if (Intersection.isEmptySet())
1359 return replaceInstUsesWith(Cmp, Builder.getFalse());
1360 if (Difference.isEmptySet())
1361 return replaceInstUsesWith(Cmp, Builder.getTrue());
1362
1363 // Canonicalizing a sign bit comparison that gets used in a branch,
1364 // pessimizes codegen by generating branch on zero instruction instead
1365 // of a test and branch. So we avoid canonicalizing in such situations
1366 // because test and branch instruction has better branch displacement
1367 // than compare and branch instruction.
1368 bool UnusedBit;
1369 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1370 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1371 return nullptr;
1372
1373 // Avoid an infinite loop with min/max canonicalization.
1374 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1375 if (Cmp.hasOneUse() &&
1376 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1377 return nullptr;
1378
1379 if (const APInt *EqC = Intersection.getSingleElement())
1380 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1381 if (const APInt *NeC = Difference.getSingleElement())
1382 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1383 return nullptr;
1384 };
1385
1386 for (BranchInst *BI : DC.conditionsFor(X)) {
1387 ICmpInst::Predicate DomPred;
1388 const APInt *DomC;
1389 if (!match(BI->getCondition(),
1390 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1391 continue;
1392
1393 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1394 if (DT.dominates(Edge0, Cmp.getParent())) {
1395 if (auto *V = handleDomCond(DomPred, DomC))
1396 return V;
1397 } else {
1398 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1399 if (DT.dominates(Edge1, Cmp.getParent()))
1400 if (auto *V =
1401 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1402 return V;
1403 }
1404 }
1405
1406 return nullptr;
1407}
1408
1409/// Fold icmp (trunc X), C.
1411 TruncInst *Trunc,
1412 const APInt &C) {
1413 ICmpInst::Predicate Pred = Cmp.getPredicate();
1414 Value *X = Trunc->getOperand(0);
1415 Type *SrcTy = X->getType();
1416 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1417 SrcBits = SrcTy->getScalarSizeInBits();
1418
1419 // Match (icmp pred (trunc nuw/nsw X), C)
1420 // Which we can convert to (icmp pred X, (sext/zext C))
1421 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1422 if (Trunc->hasNoSignedWrap())
1423 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1424 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1425 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1426 }
1427
1428 if (C.isOne() && C.getBitWidth() > 1) {
1429 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1430 Value *V = nullptr;
1431 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1432 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1433 ConstantInt::get(V->getType(), 1));
1434 }
1435
1436 // TODO: Handle any shifted constant by subtracting trailing zeros.
1437 // TODO: Handle non-equality predicates.
1438 Value *Y;
1439 if (Cmp.isEquality() && match(X, m_Shl(m_One(), m_Value(Y)))) {
1440 // (trunc (1 << Y) to iN) == 0 --> Y u>= N
1441 // (trunc (1 << Y) to iN) != 0 --> Y u< N
1442 if (C.isZero()) {
1443 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1444 return new ICmpInst(NewPred, Y, ConstantInt::get(SrcTy, DstBits));
1445 }
1446 // (trunc (1 << Y) to iN) == 2**C --> Y == C
1447 // (trunc (1 << Y) to iN) != 2**C --> Y != C
1448 if (C.isPowerOf2())
1449 return new ICmpInst(Pred, Y, ConstantInt::get(SrcTy, C.logBase2()));
1450 }
1451
1452 if (Cmp.isEquality() && Trunc->hasOneUse()) {
1453 // Canonicalize to a mask and wider compare if the wide type is suitable:
1454 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1455 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1456 Constant *Mask =
1457 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1458 Value *And = Builder.CreateAnd(X, Mask);
1459 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1460 return new ICmpInst(Pred, And, WideC);
1461 }
1462
1463 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1464 // of the high bits truncated out of x are known.
1465 KnownBits Known = computeKnownBits(X, 0, &Cmp);
1466
1467 // If all the high bits are known, we can do this xform.
1468 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1469 // Pull in the high bits from known-ones set.
1470 APInt NewRHS = C.zext(SrcBits);
1471 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1472 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1473 }
1474 }
1475
1476 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1477 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1478 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1479 Value *ShOp;
1480 const APInt *ShAmtC;
1481 bool TrueIfSigned;
1482 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1483 match(X, m_Shr(m_Value(ShOp), m_APInt(ShAmtC))) &&
1484 DstBits == SrcBits - ShAmtC->getZExtValue()) {
1485 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1487 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1489 }
1490
1491 return nullptr;
1492}
1493
1494/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1495/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1498 const SimplifyQuery &Q) {
1499 Value *X, *Y;
1501 bool YIsSExt = false;
1502 // Try to match icmp (trunc X), (trunc Y)
1503 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1504 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1505 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1506 if (Cmp.isSigned()) {
1507 // For signed comparisons, both truncs must be nsw.
1508 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1509 return nullptr;
1510 } else {
1511 // For unsigned and equality comparisons, either both must be nuw or
1512 // both must be nsw, we don't care which.
1513 if (!NoWrapFlags)
1514 return nullptr;
1515 }
1516
1517 if (X->getType() != Y->getType() &&
1518 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1519 return nullptr;
1520 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1521 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1522 std::swap(X, Y);
1523 Pred = Cmp.getSwappedPredicate(Pred);
1524 }
1525 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1526 }
1527 // Try to match icmp (trunc nuw X), (zext Y)
1528 else if (!Cmp.isSigned() &&
1529 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1530 m_OneUse(m_ZExt(m_Value(Y)))))) {
1531 // Can fold trunc nuw + zext for unsigned and equality predicates.
1532 }
1533 // Try to match icmp (trunc nsw X), (sext Y)
1534 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1536 // Can fold trunc nsw + zext/sext for all predicates.
1537 YIsSExt =
1538 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1539 } else
1540 return nullptr;
1541
1542 Type *TruncTy = Cmp.getOperand(0)->getType();
1543 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1544
1545 // If this transform will end up changing from desirable types -> undesirable
1546 // types skip it.
1547 if (isDesirableIntType(TruncBits) &&
1548 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1549 return nullptr;
1550
1551 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1552 return new ICmpInst(Pred, X, NewY);
1553}
1554
1555/// Fold icmp (xor X, Y), C.
1558 const APInt &C) {
1559 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1560 return I;
1561
1562 Value *X = Xor->getOperand(0);
1563 Value *Y = Xor->getOperand(1);
1564 const APInt *XorC;
1565 if (!match(Y, m_APInt(XorC)))
1566 return nullptr;
1567
1568 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1569 // fold the xor.
1570 ICmpInst::Predicate Pred = Cmp.getPredicate();
1571 bool TrueIfSigned = false;
1572 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1573
1574 // If the sign bit of the XorCst is not set, there is no change to
1575 // the operation, just stop using the Xor.
1576 if (!XorC->isNegative())
1577 return replaceOperand(Cmp, 0, X);
1578
1579 // Emit the opposite comparison.
1580 if (TrueIfSigned)
1581 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1582 ConstantInt::getAllOnesValue(X->getType()));
1583 else
1584 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1585 ConstantInt::getNullValue(X->getType()));
1586 }
1587
1588 if (Xor->hasOneUse()) {
1589 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1590 if (!Cmp.isEquality() && XorC->isSignMask()) {
1591 Pred = Cmp.getFlippedSignednessPredicate();
1592 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1593 }
1594
1595 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1596 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1597 Pred = Cmp.getFlippedSignednessPredicate();
1598 Pred = Cmp.getSwappedPredicate(Pred);
1599 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1600 }
1601 }
1602
1603 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1604 if (Pred == ICmpInst::ICMP_UGT) {
1605 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1606 if (*XorC == ~C && (C + 1).isPowerOf2())
1607 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1608 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1609 if (*XorC == C && (C + 1).isPowerOf2())
1610 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1611 }
1612 if (Pred == ICmpInst::ICMP_ULT) {
1613 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1614 if (*XorC == -C && C.isPowerOf2())
1615 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1616 ConstantInt::get(X->getType(), ~C));
1617 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1618 if (*XorC == C && (-C).isPowerOf2())
1619 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1620 ConstantInt::get(X->getType(), ~C));
1621 }
1622 return nullptr;
1623}
1624
1625/// For power-of-2 C:
1626/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1627/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1630 const APInt &C) {
1631 CmpInst::Predicate Pred = Cmp.getPredicate();
1632 APInt PowerOf2;
1633 if (Pred == ICmpInst::ICMP_ULT)
1634 PowerOf2 = C;
1635 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1636 PowerOf2 = C + 1;
1637 else
1638 return nullptr;
1639 if (!PowerOf2.isPowerOf2())
1640 return nullptr;
1641 Value *X;
1642 const APInt *ShiftC;
1644 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1645 return nullptr;
1646 uint64_t Shift = ShiftC->getLimitedValue();
1647 Type *XType = X->getType();
1648 if (Shift == 0 || PowerOf2.isMinSignedValue())
1649 return nullptr;
1650 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1651 APInt Bound =
1652 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1653 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1654}
1655
1656/// Fold icmp (and (sh X, Y), C2), C1.
1659 const APInt &C1,
1660 const APInt &C2) {
1661 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1662 if (!Shift || !Shift->isShift())
1663 return nullptr;
1664
1665 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1666 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1667 // code produced by the clang front-end, for bitfield access.
1668 // This seemingly simple opportunity to fold away a shift turns out to be
1669 // rather complicated. See PR17827 for details.
1670 unsigned ShiftOpcode = Shift->getOpcode();
1671 bool IsShl = ShiftOpcode == Instruction::Shl;
1672 const APInt *C3;
1673 if (match(Shift->getOperand(1), m_APInt(C3))) {
1674 APInt NewAndCst, NewCmpCst;
1675 bool AnyCmpCstBitsShiftedOut;
1676 if (ShiftOpcode == Instruction::Shl) {
1677 // For a left shift, we can fold if the comparison is not signed. We can
1678 // also fold a signed comparison if the mask value and comparison value
1679 // are not negative. These constraints may not be obvious, but we can
1680 // prove that they are correct using an SMT solver.
1681 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1682 return nullptr;
1683
1684 NewCmpCst = C1.lshr(*C3);
1685 NewAndCst = C2.lshr(*C3);
1686 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1687 } else if (ShiftOpcode == Instruction::LShr) {
1688 // For a logical right shift, we can fold if the comparison is not signed.
1689 // We can also fold a signed comparison if the shifted mask value and the
1690 // shifted comparison value are not negative. These constraints may not be
1691 // obvious, but we can prove that they are correct using an SMT solver.
1692 NewCmpCst = C1.shl(*C3);
1693 NewAndCst = C2.shl(*C3);
1694 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1695 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1696 return nullptr;
1697 } else {
1698 // For an arithmetic shift, check that both constants don't use (in a
1699 // signed sense) the top bits being shifted out.
1700 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1701 NewCmpCst = C1.shl(*C3);
1702 NewAndCst = C2.shl(*C3);
1703 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1704 if (NewAndCst.ashr(*C3) != C2)
1705 return nullptr;
1706 }
1707
1708 if (AnyCmpCstBitsShiftedOut) {
1709 // If we shifted bits out, the fold is not going to work out. As a
1710 // special case, check to see if this means that the result is always
1711 // true or false now.
1712 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1713 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1714 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1715 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1716 } else {
1717 Value *NewAnd = Builder.CreateAnd(
1718 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1719 return new ICmpInst(Cmp.getPredicate(),
1720 NewAnd, ConstantInt::get(And->getType(), NewCmpCst));
1721 }
1722 }
1723
1724 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1725 // preferable because it allows the C2 << Y expression to be hoisted out of a
1726 // loop if Y is invariant and X is not.
1727 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1728 !Shift->isArithmeticShift() && !isa<Constant>(Shift->getOperand(0))) {
1729 // Compute C2 << Y.
1730 Value *NewShift =
1731 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1732 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1733
1734 // Compute X & (C2 << Y).
1735 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1736 return replaceOperand(Cmp, 0, NewAnd);
1737 }
1738
1739 return nullptr;
1740}
1741
1742/// Fold icmp (and X, C2), C1.
1745 const APInt &C1) {
1746 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1747
1748 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1749 // TODO: We canonicalize to the longer form for scalars because we have
1750 // better analysis/folds for icmp, and codegen may be better with icmp.
1751 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1752 match(And->getOperand(1), m_One()))
1753 return new TruncInst(And->getOperand(0), Cmp.getType());
1754
1755 const APInt *C2;
1756 Value *X;
1757 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1758 return nullptr;
1759
1760 // Don't perform the following transforms if the AND has multiple uses
1761 if (!And->hasOneUse())
1762 return nullptr;
1763
1764 if (Cmp.isEquality() && C1.isZero()) {
1765 // Restrict this fold to single-use 'and' (PR10267).
1766 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1767 if (C2->isSignMask()) {
1768 Constant *Zero = Constant::getNullValue(X->getType());
1769 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1770 return new ICmpInst(NewPred, X, Zero);
1771 }
1772
1773 APInt NewC2 = *C2;
1774 KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
1775 // Set high zeros of C2 to allow matching negated power-of-2.
1776 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1777 Know.countMinLeadingZeros());
1778
1779 // Restrict this fold only for single-use 'and' (PR10267).
1780 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1781 if (NewC2.isNegatedPowerOf2()) {
1782 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1783 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1784 return new ICmpInst(NewPred, X, NegBOC);
1785 }
1786 }
1787
1788 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1789 // the input width without changing the value produced, eliminate the cast:
1790 //
1791 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1792 //
1793 // We can do this transformation if the constants do not have their sign bits
1794 // set or if it is an equality comparison. Extending a relational comparison
1795 // when we're checking the sign bit would not work.
1796 Value *W;
1797 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1798 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1799 // TODO: Is this a good transform for vectors? Wider types may reduce
1800 // throughput. Should this transform be limited (even for scalars) by using
1801 // shouldChangeType()?
1802 if (!Cmp.getType()->isVectorTy()) {
1803 Type *WideType = W->getType();
1804 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1805 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1806 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1807 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1808 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1809 }
1810 }
1811
1812 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1813 return I;
1814
1815 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1816 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1817 //
1818 // iff pred isn't signed
1819 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1820 match(And->getOperand(1), m_One())) {
1821 Constant *One = cast<Constant>(And->getOperand(1));
1822 Value *Or = And->getOperand(0);
1823 Value *A, *B, *LShr;
1824 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1825 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1826 unsigned UsesRemoved = 0;
1827 if (And->hasOneUse())
1828 ++UsesRemoved;
1829 if (Or->hasOneUse())
1830 ++UsesRemoved;
1831 if (LShr->hasOneUse())
1832 ++UsesRemoved;
1833
1834 // Compute A & ((1 << B) | 1)
1835 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1836 if (UsesRemoved >= RequireUsesRemoved) {
1837 Value *NewOr =
1838 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1839 /*HasNUW=*/true),
1840 One, Or->getName());
1841 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1842 return replaceOperand(Cmp, 0, NewAnd);
1843 }
1844 }
1845 }
1846
1847 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1848 // llvm.is.fpclass(X, fcInf|fcNan)
1849 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1850 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1851 Value *V;
1852 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1853 Attribute::NoImplicitFloat) &&
1854 Cmp.isEquality() &&
1856 Type *FPType = V->getType()->getScalarType();
1857 if (FPType->isIEEELikeFPTy() && C1 == *C2) {
1858 APInt ExponentMask =
1860 if (C1 == ExponentMask) {
1861 unsigned Mask = FPClassTest::fcNan | FPClassTest::fcInf;
1862 if (isICMP_NE)
1863 Mask = ~Mask & fcAllFlags;
1864 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1865 }
1866 }
1867 }
1868
1869 return nullptr;
1870}
1871
1872/// Fold icmp (and X, Y), C.
1875 const APInt &C) {
1876 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1877 return I;
1878
1879 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1880 bool TrueIfNeg;
1881 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1882 // ((X - 1) & ~X) < 0 --> X == 0
1883 // ((X - 1) & ~X) >= 0 --> X != 0
1884 Value *X;
1885 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1886 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1887 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1888 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1889 }
1890 // (X & -X) < 0 --> X == MinSignedC
1891 // (X & -X) > -1 --> X != MinSignedC
1892 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1893 Constant *MinSignedC = ConstantInt::get(
1894 X->getType(),
1895 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1896 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1897 return new ICmpInst(NewPred, X, MinSignedC);
1898 }
1899 }
1900
1901 // TODO: These all require that Y is constant too, so refactor with the above.
1902
1903 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1904 Value *X = And->getOperand(0);
1905 Value *Y = And->getOperand(1);
1906 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1907 if (auto *LI = dyn_cast<LoadInst>(X))
1908 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1909 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
1910 if (Instruction *Res =
1911 foldCmpLoadFromIndexedGlobal(LI, GEP, GV, Cmp, C2))
1912 return Res;
1913
1914 if (!Cmp.isEquality())
1915 return nullptr;
1916
1917 // X & -C == -C -> X > u ~C
1918 // X & -C != -C -> X <= u ~C
1919 // iff C is a power of 2
1920 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1921 auto NewPred =
1923 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1924 }
1925
1926 // If we are testing the intersection of 2 select-of-nonzero-constants with no
1927 // common bits set, it's the same as checking if exactly one select condition
1928 // is set:
1929 // ((A ? TC : FC) & (B ? TC : FC)) == 0 --> xor A, B
1930 // ((A ? TC : FC) & (B ? TC : FC)) != 0 --> not(xor A, B)
1931 // TODO: Generalize for non-constant values.
1932 // TODO: Handle signed/unsigned predicates.
1933 // TODO: Handle other bitwise logic connectors.
1934 // TODO: Extend to handle a non-zero compare constant.
1935 if (C.isZero() && (Pred == CmpInst::ICMP_EQ || And->hasOneUse())) {
1936 assert(Cmp.isEquality() && "Not expecting non-equality predicates");
1937 Value *A, *B;
1938 const APInt *TC, *FC;
1939 if (match(X, m_Select(m_Value(A), m_APInt(TC), m_APInt(FC))) &&
1940 match(Y,
1941 m_Select(m_Value(B), m_SpecificInt(*TC), m_SpecificInt(*FC))) &&
1942 !TC->isZero() && !FC->isZero() && !TC->intersects(*FC)) {
1943 Value *R = Builder.CreateXor(A, B);
1944 if (Pred == CmpInst::ICMP_NE)
1945 R = Builder.CreateNot(R);
1946 return replaceInstUsesWith(Cmp, R);
1947 }
1948 }
1949
1950 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1951 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1952 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1953 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1955 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1956 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1957 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1958 Value *And = Builder.CreateAnd(TruncY, X);
1960 }
1961 return BinaryOperator::CreateAnd(TruncY, X);
1962 }
1963
1964 // (icmp eq/ne (and (shl -1, X), Y), 0)
1965 // -> (icmp eq/ne (lshr Y, X), 0)
1966 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1967 // highly unlikely the non-zero case will ever show up in code.
1968 if (C.isZero() &&
1970 m_Value(Y))))) {
1971 Value *LShr = Builder.CreateLShr(Y, X);
1972 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
1973 }
1974
1975 return nullptr;
1976}
1977
1978/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
1980 InstCombiner::BuilderTy &Builder) {
1981 // Are we using xors or subs to bitwise check for a pair or pairs of
1982 // (in)equalities? Convert to a shorter form that has more potential to be
1983 // folded even further.
1984 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
1985 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
1986 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
1987 // (X1 == X2) && (X3 == X4) && (X5 == X6)
1988 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
1989 // (X1 != X2) || (X3 != X4) || (X5 != X6)
1991 SmallVector<Value *, 16> WorkList(1, Or);
1992
1993 while (!WorkList.empty()) {
1994 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
1995 Value *Lhs, *Rhs;
1996
1997 if (match(OrOperatorArgument,
1998 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
1999 CmpValues.emplace_back(Lhs, Rhs);
2000 return;
2001 }
2002
2003 if (match(OrOperatorArgument,
2004 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2005 CmpValues.emplace_back(Lhs, Rhs);
2006 return;
2007 }
2008
2009 WorkList.push_back(OrOperatorArgument);
2010 };
2011
2012 Value *CurrentValue = WorkList.pop_back_val();
2013 Value *OrOperatorLhs, *OrOperatorRhs;
2014
2015 if (!match(CurrentValue,
2016 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2017 return nullptr;
2018 }
2019
2020 MatchOrOperatorArgument(OrOperatorRhs);
2021 MatchOrOperatorArgument(OrOperatorLhs);
2022 }
2023
2024 ICmpInst::Predicate Pred = Cmp.getPredicate();
2025 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2026 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2027 CmpValues.rbegin()->second);
2028
2029 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2030 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2031 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2032 }
2033
2034 return LhsCmp;
2035}
2036
2037/// Fold icmp (or X, Y), C.
2040 const APInt &C) {
2041 ICmpInst::Predicate Pred = Cmp.getPredicate();
2042 if (C.isOne()) {
2043 // icmp slt signum(V) 1 --> icmp slt V, 1
2044 Value *V = nullptr;
2045 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2046 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2047 ConstantInt::get(V->getType(), 1));
2048 }
2049
2050 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2051
2052 // (icmp eq/ne (or disjoint x, C0), C1)
2053 // -> (icmp eq/ne x, C0^C1)
2054 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2055 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2056 Value *NewC =
2057 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2058 return new ICmpInst(Pred, OrOp0, NewC);
2059 }
2060
2061 const APInt *MaskC;
2062 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2063 if (*MaskC == C && (C + 1).isPowerOf2()) {
2064 // X | C == C --> X <=u C
2065 // X | C != C --> X >u C
2066 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2068 return new ICmpInst(Pred, OrOp0, OrOp1);
2069 }
2070
2071 // More general: canonicalize 'equality with set bits mask' to
2072 // 'equality with clear bits mask'.
2073 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2074 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2075 if (Or->hasOneUse()) {
2076 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2077 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2078 return new ICmpInst(Pred, And, NewC);
2079 }
2080 }
2081
2082 // (X | (X-1)) s< 0 --> X s< 1
2083 // (X | (X-1)) s> -1 --> X s> 0
2084 Value *X;
2085 bool TrueIfSigned;
2086 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2088 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2089 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2090 return new ICmpInst(NewPred, X, NewC);
2091 }
2092
2093 const APInt *OrC;
2094 // icmp(X | OrC, C) --> icmp(X, 0)
2095 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2096 switch (Pred) {
2097 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2098 case ICmpInst::ICMP_SLT:
2099 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2100 case ICmpInst::ICMP_SGE:
2101 if (OrC->sge(C))
2102 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2103 break;
2104 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2105 case ICmpInst::ICMP_SLE:
2106 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2107 case ICmpInst::ICMP_SGT:
2108 if (OrC->sgt(C))
2110 ConstantInt::getNullValue(X->getType()));
2111 break;
2112 default:
2113 break;
2114 }
2115 }
2116
2117 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2118 return nullptr;
2119
2120 Value *P, *Q;
2122 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2123 // -> and (icmp eq P, null), (icmp eq Q, null).
2124 Value *CmpP =
2125 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2126 Value *CmpQ =
2128 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2129 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2130 }
2131
2132 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2133 return replaceInstUsesWith(Cmp, V);
2134
2135 return nullptr;
2136}
2137
2138/// Fold icmp (mul X, Y), C.
2141 const APInt &C) {
2142 ICmpInst::Predicate Pred = Cmp.getPredicate();
2143 Type *MulTy = Mul->getType();
2144 Value *X = Mul->getOperand(0);
2145
2146 // If there's no overflow:
2147 // X * X == 0 --> X == 0
2148 // X * X != 0 --> X != 0
2149 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2150 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2151 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2152
2153 const APInt *MulC;
2154 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2155 return nullptr;
2156
2157 // If this is a test of the sign bit and the multiply is sign-preserving with
2158 // a constant operand, use the multiply LHS operand instead:
2159 // (X * +MulC) < 0 --> X < 0
2160 // (X * -MulC) < 0 --> X > 0
2161 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2162 if (MulC->isNegative())
2163 Pred = ICmpInst::getSwappedPredicate(Pred);
2164 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2165 }
2166
2167 if (MulC->isZero())
2168 return nullptr;
2169
2170 // If the multiply does not wrap or the constant is odd, try to divide the
2171 // compare constant by the multiplication factor.
2172 if (Cmp.isEquality()) {
2173 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2174 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2175 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2176 return new ICmpInst(Pred, X, NewC);
2177 }
2178
2179 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2180 // correct to transform if MulC * N == C including overflow. I.e with i8
2181 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2182 // miss that case.
2183 if (C.urem(*MulC).isZero()) {
2184 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2185 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2186 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2187 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2188 return new ICmpInst(Pred, X, NewC);
2189 }
2190 }
2191 }
2192
2193 // With a matching no-overflow guarantee, fold the constants:
2194 // (X * MulC) < C --> X < (C / MulC)
2195 // (X * MulC) > C --> X > (C / MulC)
2196 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2197 Constant *NewC = nullptr;
2198 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2199 // MININT / -1 --> overflow.
2200 if (C.isMinSignedValue() && MulC->isAllOnes())
2201 return nullptr;
2202 if (MulC->isNegative())
2203 Pred = ICmpInst::getSwappedPredicate(Pred);
2204
2205 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2206 NewC = ConstantInt::get(
2208 } else {
2209 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2210 "Unexpected predicate");
2211 NewC = ConstantInt::get(
2213 }
2214 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2215 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2216 NewC = ConstantInt::get(
2218 } else {
2219 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2220 "Unexpected predicate");
2221 NewC = ConstantInt::get(
2223 }
2224 }
2225
2226 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2227}
2228
2229/// Fold icmp (shl 1, Y), C.
2231 const APInt &C) {
2232 Value *Y;
2233 if (!match(Shl, m_Shl(m_One(), m_Value(Y))))
2234 return nullptr;
2235
2236 Type *ShiftType = Shl->getType();
2237 unsigned TypeBits = C.getBitWidth();
2238 bool CIsPowerOf2 = C.isPowerOf2();
2239 ICmpInst::Predicate Pred = Cmp.getPredicate();
2240 if (Cmp.isUnsigned()) {
2241 // (1 << Y) pred C -> Y pred Log2(C)
2242 if (!CIsPowerOf2) {
2243 // (1 << Y) < 30 -> Y <= 4
2244 // (1 << Y) <= 30 -> Y <= 4
2245 // (1 << Y) >= 30 -> Y > 4
2246 // (1 << Y) > 30 -> Y > 4
2247 if (Pred == ICmpInst::ICMP_ULT)
2248 Pred = ICmpInst::ICMP_ULE;
2249 else if (Pred == ICmpInst::ICMP_UGE)
2250 Pred = ICmpInst::ICMP_UGT;
2251 }
2252
2253 unsigned CLog2 = C.logBase2();
2254 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2255 } else if (Cmp.isSigned()) {
2256 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2257 // (1 << Y) > 0 -> Y != 31
2258 // (1 << Y) > C -> Y != 31 if C is negative.
2259 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2260 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2261
2262 // (1 << Y) < 0 -> Y == 31
2263 // (1 << Y) < 1 -> Y == 31
2264 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2265 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2266 if (Pred == ICmpInst::ICMP_SLT && (C-1).sle(0))
2267 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2268 }
2269
2270 return nullptr;
2271}
2272
2273/// Fold icmp (shl X, Y), C.
2275 BinaryOperator *Shl,
2276 const APInt &C) {
2277 const APInt *ShiftVal;
2278 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2279 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2280
2281 ICmpInst::Predicate Pred = Cmp.getPredicate();
2282 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2283 // -> (icmp pred X, Csle0)
2284 //
2285 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2286 // so X's must be what is used.
2287 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2288 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2289
2290 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2291 // -> (icmp eq/ne X, 0)
2292 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2293 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2294 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2295
2296 // (icmp slt (shl nsw X, Y), 0/1)
2297 // -> (icmp slt X, 0/1)
2298 // (icmp sgt (shl nsw X, Y), 0/-1)
2299 // -> (icmp sgt X, 0/-1)
2300 //
2301 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2302 if (Shl->hasNoSignedWrap() &&
2303 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2304 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2305 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2306
2307 const APInt *ShiftAmt;
2308 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2309 return foldICmpShlOne(Cmp, Shl, C);
2310
2311 // Check that the shift amount is in range. If not, don't perform undefined
2312 // shifts. When the shift is visited, it will be simplified.
2313 unsigned TypeBits = C.getBitWidth();
2314 if (ShiftAmt->uge(TypeBits))
2315 return nullptr;
2316
2317 Value *X = Shl->getOperand(0);
2318 Type *ShType = Shl->getType();
2319
2320 // NSW guarantees that we are only shifting out sign bits from the high bits,
2321 // so we can ASHR the compare constant without needing a mask and eliminate
2322 // the shift.
2323 if (Shl->hasNoSignedWrap()) {
2324 if (Pred == ICmpInst::ICMP_SGT) {
2325 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2326 APInt ShiftedC = C.ashr(*ShiftAmt);
2327 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2328 }
2329 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2330 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2331 APInt ShiftedC = C.ashr(*ShiftAmt);
2332 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2333 }
2334 if (Pred == ICmpInst::ICMP_SLT) {
2335 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2336 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2337 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2338 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2339 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2340 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2341 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2342 }
2343 }
2344
2345 // NUW guarantees that we are only shifting out zero bits from the high bits,
2346 // so we can LSHR the compare constant without needing a mask and eliminate
2347 // the shift.
2348 if (Shl->hasNoUnsignedWrap()) {
2349 if (Pred == ICmpInst::ICMP_UGT) {
2350 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2351 APInt ShiftedC = C.lshr(*ShiftAmt);
2352 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2353 }
2354 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2355 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2356 APInt ShiftedC = C.lshr(*ShiftAmt);
2357 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2358 }
2359 if (Pred == ICmpInst::ICMP_ULT) {
2360 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2361 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2362 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2363 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2364 assert(C.ugt(0) && "ult 0 should have been eliminated");
2365 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2366 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2367 }
2368 }
2369
2370 if (Cmp.isEquality() && Shl->hasOneUse()) {
2371 // Strength-reduce the shift into an 'and'.
2372 Constant *Mask = ConstantInt::get(
2373 ShType,
2374 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2375 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2376 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2377 return new ICmpInst(Pred, And, LShrC);
2378 }
2379
2380 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2381 bool TrueIfSigned = false;
2382 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2383 // (X << 31) <s 0 --> (X & 1) != 0
2384 Constant *Mask = ConstantInt::get(
2385 ShType,
2386 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2387 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2388 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2389 And, Constant::getNullValue(ShType));
2390 }
2391
2392 // Simplify 'shl' inequality test into 'and' equality test.
2393 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2394 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2395 if ((C + 1).isPowerOf2() &&
2396 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2397 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2398 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2400 And, Constant::getNullValue(ShType));
2401 }
2402 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2403 if (C.isPowerOf2() &&
2404 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2405 Value *And =
2406 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2407 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2409 And, Constant::getNullValue(ShType));
2410 }
2411 }
2412
2413 // Transform (icmp pred iM (shl iM %v, N), C)
2414 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2415 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2416 // This enables us to get rid of the shift in favor of a trunc that may be
2417 // free on the target. It has the additional benefit of comparing to a
2418 // smaller constant that may be more target-friendly.
2419 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2420 if (Shl->hasOneUse() && Amt != 0 &&
2421 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2422 ICmpInst::Predicate CmpPred = Pred;
2423 APInt RHSC = C;
2424
2425 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2426 // Try the flipped strictness predicate.
2427 // e.g.:
2428 // icmp ult i64 (shl X, 32), 8589934593 ->
2429 // icmp ule i64 (shl X, 32), 8589934592 ->
2430 // icmp ule i32 (trunc X, i32), 2 ->
2431 // icmp ult i32 (trunc X, i32), 3
2432 if (auto FlippedStrictness =
2434 Pred, ConstantInt::get(ShType->getContext(), C))) {
2435 CmpPred = FlippedStrictness->first;
2436 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2437 }
2438 }
2439
2440 if (RHSC.countr_zero() >= Amt) {
2441 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2442 Constant *NewC =
2443 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2444 return new ICmpInst(CmpPred,
2445 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2446 Shl->hasNoSignedWrap()),
2447 NewC);
2448 }
2449 }
2450
2451 return nullptr;
2452}
2453
2454/// Fold icmp ({al}shr X, Y), C.
2456 BinaryOperator *Shr,
2457 const APInt &C) {
2458 // An exact shr only shifts out zero bits, so:
2459 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2460 Value *X = Shr->getOperand(0);
2461 CmpInst::Predicate Pred = Cmp.getPredicate();
2462 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2463 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2464
2465 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2466 const APInt *ShiftValC;
2467 if (match(X, m_APInt(ShiftValC))) {
2468 if (Cmp.isEquality())
2469 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2470
2471 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2472 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2473 bool TrueIfSigned;
2474 if (!IsAShr && ShiftValC->isNegative() &&
2475 isSignBitCheck(Pred, C, TrueIfSigned))
2476 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2477 Shr->getOperand(1),
2478 ConstantInt::getNullValue(X->getType()));
2479
2480 // If the shifted constant is a power-of-2, test the shift amount directly:
2481 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2482 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2483 if (!IsAShr && ShiftValC->isPowerOf2() &&
2484 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2485 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2486 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2487 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2488
2489 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2490 unsigned ShiftLZ = ShiftValC->countl_zero();
2491 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2492 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2493 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2494 }
2495 }
2496
2497 const APInt *ShiftAmtC;
2498 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2499 return nullptr;
2500
2501 // Check that the shift amount is in range. If not, don't perform undefined
2502 // shifts. When the shift is visited it will be simplified.
2503 unsigned TypeBits = C.getBitWidth();
2504 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2505 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2506 return nullptr;
2507
2508 bool IsExact = Shr->isExact();
2509 Type *ShrTy = Shr->getType();
2510 // TODO: If we could guarantee that InstSimplify would handle all of the
2511 // constant-value-based preconditions in the folds below, then we could assert
2512 // those conditions rather than checking them. This is difficult because of
2513 // undef/poison (PR34838).
2514 if (IsAShr && Shr->hasOneUse()) {
2515 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2516 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2517 // When C - 1 is a power of two and the transform can be legally
2518 // performed, prefer this form so the produced constant is close to a
2519 // power of two.
2520 // icmp slt/ult (ashr exact X, ShAmtC), C
2521 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2522 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2523 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2524 }
2525 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2526 // When ShAmtC can be shifted losslessly:
2527 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2528 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2529 APInt ShiftedC = C.shl(ShAmtVal);
2530 if (ShiftedC.ashr(ShAmtVal) == C)
2531 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2532 }
2533 if (Pred == CmpInst::ICMP_SGT) {
2534 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2535 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2536 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2537 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2538 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2539 }
2540 if (Pred == CmpInst::ICMP_UGT) {
2541 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2542 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2543 // clause accounts for that pattern.
2544 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2545 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2546 (C + 1).shl(ShAmtVal).isMinSignedValue())
2547 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2548 }
2549
2550 // If the compare constant has significant bits above the lowest sign-bit,
2551 // then convert an unsigned cmp to a test of the sign-bit:
2552 // (ashr X, ShiftC) u> C --> X s< 0
2553 // (ashr X, ShiftC) u< C --> X s> -1
2554 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2555 if (Pred == CmpInst::ICMP_UGT) {
2556 return new ICmpInst(CmpInst::ICMP_SLT, X,
2558 }
2559 if (Pred == CmpInst::ICMP_ULT) {
2560 return new ICmpInst(CmpInst::ICMP_SGT, X,
2562 }
2563 }
2564 } else if (!IsAShr) {
2565 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2566 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2567 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2568 APInt ShiftedC = C.shl(ShAmtVal);
2569 if (ShiftedC.lshr(ShAmtVal) == C)
2570 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2571 }
2572 if (Pred == CmpInst::ICMP_UGT) {
2573 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2574 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2575 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2576 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2577 }
2578 }
2579
2580 if (!Cmp.isEquality())
2581 return nullptr;
2582
2583 // Handle equality comparisons of shift-by-constant.
2584
2585 // If the comparison constant changes with the shift, the comparison cannot
2586 // succeed (bits of the comparison constant cannot match the shifted value).
2587 // This should be known by InstSimplify and already be folded to true/false.
2588 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2589 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2590 "Expected icmp+shr simplify did not occur.");
2591
2592 // If the bits shifted out are known zero, compare the unshifted value:
2593 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2594 if (Shr->isExact())
2595 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2596
2597 if (C.isZero()) {
2598 // == 0 is u< 1.
2599 if (Pred == CmpInst::ICMP_EQ)
2600 return new ICmpInst(CmpInst::ICMP_ULT, X,
2601 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal)));
2602 else
2603 return new ICmpInst(CmpInst::ICMP_UGT, X,
2604 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal) - 1));
2605 }
2606
2607 if (Shr->hasOneUse()) {
2608 // Canonicalize the shift into an 'and':
2609 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2610 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2611 Constant *Mask = ConstantInt::get(ShrTy, Val);
2612 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2613 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2614 }
2615
2616 return nullptr;
2617}
2618
2620 BinaryOperator *SRem,
2621 const APInt &C) {
2622 // Match an 'is positive' or 'is negative' comparison of remainder by a
2623 // constant power-of-2 value:
2624 // (X % pow2C) sgt/slt 0
2625 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2626 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2627 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2628 return nullptr;
2629
2630 // TODO: The one-use check is standard because we do not typically want to
2631 // create longer instruction sequences, but this might be a special-case
2632 // because srem is not good for analysis or codegen.
2633 if (!SRem->hasOneUse())
2634 return nullptr;
2635
2636 const APInt *DivisorC;
2637 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2638 return nullptr;
2639
2640 // For cmp_sgt/cmp_slt only zero valued C is handled.
2641 // For cmp_eq/cmp_ne only positive valued C is handled.
2642 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2643 !C.isZero()) ||
2644 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2645 !C.isStrictlyPositive()))
2646 return nullptr;
2647
2648 // Mask off the sign bit and the modulo bits (low-bits).
2649 Type *Ty = SRem->getType();
2651 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2652 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2653
2654 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2655 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2656
2657 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2658 // bit is set. Example:
2659 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2660 if (Pred == ICmpInst::ICMP_SGT)
2662
2663 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2664 // bit is set. Example:
2665 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2666 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2667}
2668
2669/// Fold icmp (udiv X, Y), C.
2671 BinaryOperator *UDiv,
2672 const APInt &C) {
2673 ICmpInst::Predicate Pred = Cmp.getPredicate();
2674 Value *X = UDiv->getOperand(0);
2675 Value *Y = UDiv->getOperand(1);
2676 Type *Ty = UDiv->getType();
2677
2678 const APInt *C2;
2679 if (!match(X, m_APInt(C2)))
2680 return nullptr;
2681
2682 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2683
2684 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2685 if (Pred == ICmpInst::ICMP_UGT) {
2686 assert(!C.isMaxValue() &&
2687 "icmp ugt X, UINT_MAX should have been simplified already.");
2688 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2689 ConstantInt::get(Ty, C2->udiv(C + 1)));
2690 }
2691
2692 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2693 if (Pred == ICmpInst::ICMP_ULT) {
2694 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2695 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2696 ConstantInt::get(Ty, C2->udiv(C)));
2697 }
2698
2699 return nullptr;
2700}
2701
2702/// Fold icmp ({su}div X, Y), C.
2704 BinaryOperator *Div,
2705 const APInt &C) {
2706 ICmpInst::Predicate Pred = Cmp.getPredicate();
2707 Value *X = Div->getOperand(0);
2708 Value *Y = Div->getOperand(1);
2709 Type *Ty = Div->getType();
2710 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2711
2712 // If unsigned division and the compare constant is bigger than
2713 // UMAX/2 (negative), there's only one pair of values that satisfies an
2714 // equality check, so eliminate the division:
2715 // (X u/ Y) == C --> (X == C) && (Y == 1)
2716 // (X u/ Y) != C --> (X != C) || (Y != 1)
2717 // Similarly, if signed division and the compare constant is exactly SMIN:
2718 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2719 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2720 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2721 (!DivIsSigned || C.isMinSignedValue())) {
2722 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2723 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2724 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2725 return BinaryOperator::Create(Logic, XBig, YOne);
2726 }
2727
2728 // Fold: icmp pred ([us]div X, C2), C -> range test
2729 // Fold this div into the comparison, producing a range check.
2730 // Determine, based on the divide type, what the range is being
2731 // checked. If there is an overflow on the low or high side, remember
2732 // it, otherwise compute the range [low, hi) bounding the new value.
2733 // See: InsertRangeTest above for the kinds of replacements possible.
2734 const APInt *C2;
2735 if (!match(Y, m_APInt(C2)))
2736 return nullptr;
2737
2738 // FIXME: If the operand types don't match the type of the divide
2739 // then don't attempt this transform. The code below doesn't have the
2740 // logic to deal with a signed divide and an unsigned compare (and
2741 // vice versa). This is because (x /s C2) <s C produces different
2742 // results than (x /s C2) <u C or (x /u C2) <s C or even
2743 // (x /u C2) <u C. Simply casting the operands and result won't
2744 // work. :( The if statement below tests that condition and bails
2745 // if it finds it.
2746 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2747 return nullptr;
2748
2749 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2750 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2751 // division-by-constant cases should be present, we can not assert that they
2752 // have happened before we reach this icmp instruction.
2753 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2754 return nullptr;
2755
2756 // Compute Prod = C * C2. We are essentially solving an equation of
2757 // form X / C2 = C. We solve for X by multiplying C2 and C.
2758 // By solving for X, we can turn this into a range check instead of computing
2759 // a divide.
2760 APInt Prod = C * *C2;
2761
2762 // Determine if the product overflows by seeing if the product is not equal to
2763 // the divide. Make sure we do the same kind of divide as in the LHS
2764 // instruction that we're folding.
2765 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2766
2767 // If the division is known to be exact, then there is no remainder from the
2768 // divide, so the covered range size is unit, otherwise it is the divisor.
2769 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2770
2771 // Figure out the interval that is being checked. For example, a comparison
2772 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2773 // Compute this interval based on the constants involved and the signedness of
2774 // the compare/divide. This computes a half-open interval, keeping track of
2775 // whether either value in the interval overflows. After analysis each
2776 // overflow variable is set to 0 if it's corresponding bound variable is valid
2777 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2778 int LoOverflow = 0, HiOverflow = 0;
2779 APInt LoBound, HiBound;
2780
2781 if (!DivIsSigned) { // udiv
2782 // e.g. X/5 op 3 --> [15, 20)
2783 LoBound = Prod;
2784 HiOverflow = LoOverflow = ProdOV;
2785 if (!HiOverflow) {
2786 // If this is not an exact divide, then many values in the range collapse
2787 // to the same result value.
2788 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2789 }
2790 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2791 if (C.isZero()) { // (X / pos) op 0
2792 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2793 LoBound = -(RangeSize - 1);
2794 HiBound = RangeSize;
2795 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2796 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2797 HiOverflow = LoOverflow = ProdOV;
2798 if (!HiOverflow)
2799 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2800 } else { // (X / pos) op neg
2801 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2802 HiBound = Prod + 1;
2803 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2804 if (!LoOverflow) {
2805 APInt DivNeg = -RangeSize;
2806 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2807 }
2808 }
2809 } else if (C2->isNegative()) { // Divisor is < 0.
2810 if (Div->isExact())
2811 RangeSize.negate();
2812 if (C.isZero()) { // (X / neg) op 0
2813 // e.g. X/-5 op 0 --> [-4, 5)
2814 LoBound = RangeSize + 1;
2815 HiBound = -RangeSize;
2816 if (HiBound == *C2) { // -INTMIN = INTMIN
2817 HiOverflow = 1; // [INTMIN+1, overflow)
2818 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2819 }
2820 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2821 // e.g. X/-5 op 3 --> [-19, -14)
2822 HiBound = Prod + 1;
2823 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2824 if (!LoOverflow)
2825 LoOverflow =
2826 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2827 } else { // (X / neg) op neg
2828 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2829 LoOverflow = HiOverflow = ProdOV;
2830 if (!HiOverflow)
2831 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2832 }
2833
2834 // Dividing by a negative swaps the condition. LT <-> GT
2835 Pred = ICmpInst::getSwappedPredicate(Pred);
2836 }
2837
2838 switch (Pred) {
2839 default:
2840 llvm_unreachable("Unhandled icmp predicate!");
2841 case ICmpInst::ICMP_EQ:
2842 if (LoOverflow && HiOverflow)
2843 return replaceInstUsesWith(Cmp, Builder.getFalse());
2844 if (HiOverflow)
2845 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2846 X, ConstantInt::get(Ty, LoBound));
2847 if (LoOverflow)
2848 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2849 X, ConstantInt::get(Ty, HiBound));
2850 return replaceInstUsesWith(
2851 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2852 case ICmpInst::ICMP_NE:
2853 if (LoOverflow && HiOverflow)
2854 return replaceInstUsesWith(Cmp, Builder.getTrue());
2855 if (HiOverflow)
2856 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2857 X, ConstantInt::get(Ty, LoBound));
2858 if (LoOverflow)
2859 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2860 X, ConstantInt::get(Ty, HiBound));
2861 return replaceInstUsesWith(
2862 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2863 case ICmpInst::ICMP_ULT:
2864 case ICmpInst::ICMP_SLT:
2865 if (LoOverflow == +1) // Low bound is greater than input range.
2866 return replaceInstUsesWith(Cmp, Builder.getTrue());
2867 if (LoOverflow == -1) // Low bound is less than input range.
2868 return replaceInstUsesWith(Cmp, Builder.getFalse());
2869 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2870 case ICmpInst::ICMP_UGT:
2871 case ICmpInst::ICMP_SGT:
2872 if (HiOverflow == +1) // High bound greater than input range.
2873 return replaceInstUsesWith(Cmp, Builder.getFalse());
2874 if (HiOverflow == -1) // High bound less than input range.
2875 return replaceInstUsesWith(Cmp, Builder.getTrue());
2876 if (Pred == ICmpInst::ICMP_UGT)
2877 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2878 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2879 }
2880
2881 return nullptr;
2882}
2883
2884/// Fold icmp (sub X, Y), C.
2886 BinaryOperator *Sub,
2887 const APInt &C) {
2888 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2889 ICmpInst::Predicate Pred = Cmp.getPredicate();
2890 Type *Ty = Sub->getType();
2891
2892 // (SubC - Y) == C) --> Y == (SubC - C)
2893 // (SubC - Y) != C) --> Y != (SubC - C)
2894 Constant *SubC;
2895 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2896 return new ICmpInst(Pred, Y,
2897 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2898 }
2899
2900 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2901 const APInt *C2;
2902 APInt SubResult;
2903 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2904 bool HasNSW = Sub->hasNoSignedWrap();
2905 bool HasNUW = Sub->hasNoUnsignedWrap();
2906 if (match(X, m_APInt(C2)) &&
2907 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2908 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2909 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2910
2911 // X - Y == 0 --> X == Y.
2912 // X - Y != 0 --> X != Y.
2913 // TODO: We allow this with multiple uses as long as the other uses are not
2914 // in phis. The phi use check is guarding against a codegen regression
2915 // for a loop test. If the backend could undo this (and possibly
2916 // subsequent transforms), we would not need this hack.
2917 if (Cmp.isEquality() && C.isZero() &&
2918 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2919 return new ICmpInst(Pred, X, Y);
2920
2921 // The following transforms are only worth it if the only user of the subtract
2922 // is the icmp.
2923 // TODO: This is an artificial restriction for all of the transforms below
2924 // that only need a single replacement icmp. Can these use the phi test
2925 // like the transform above here?
2926 if (!Sub->hasOneUse())
2927 return nullptr;
2928
2929 if (Sub->hasNoSignedWrap()) {
2930 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
2931 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
2932 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
2933
2934 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
2935 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
2936 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
2937
2938 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
2939 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
2940 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
2941
2942 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
2943 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
2944 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
2945 }
2946
2947 if (!match(X, m_APInt(C2)))
2948 return nullptr;
2949
2950 // C2 - Y <u C -> (Y | (C - 1)) == C2
2951 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
2952 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
2953 (*C2 & (C - 1)) == (C - 1))
2954 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
2955
2956 // C2 - Y >u C -> (Y | C) != C2
2957 // iff C2 & C == C and C + 1 is a power of 2
2958 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
2959 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
2960
2961 // We have handled special cases that reduce.
2962 // Canonicalize any remaining sub to add as:
2963 // (C2 - Y) > C --> (Y + ~C2) < ~C
2964 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
2965 HasNUW, HasNSW);
2966 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
2967}
2968
2969static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
2970 Value *Op1, IRBuilderBase &Builder,
2971 bool HasOneUse) {
2972 auto FoldConstant = [&](bool Val) {
2973 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
2974 if (Op0->getType()->isVectorTy())
2976 cast<VectorType>(Op0->getType())->getElementCount(), Res);
2977 return Res;
2978 };
2979
2980 switch (Table.to_ulong()) {
2981 case 0: // 0 0 0 0
2982 return FoldConstant(false);
2983 case 1: // 0 0 0 1
2984 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
2985 case 2: // 0 0 1 0
2986 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
2987 case 3: // 0 0 1 1
2988 return Builder.CreateNot(Op0);
2989 case 4: // 0 1 0 0
2990 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
2991 case 5: // 0 1 0 1
2992 return Builder.CreateNot(Op1);
2993 case 6: // 0 1 1 0
2994 return Builder.CreateXor(Op0, Op1);
2995 case 7: // 0 1 1 1
2996 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
2997 case 8: // 1 0 0 0
2998 return Builder.CreateAnd(Op0, Op1);
2999 case 9: // 1 0 0 1
3000 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3001 case 10: // 1 0 1 0
3002 return Op1;
3003 case 11: // 1 0 1 1
3004 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3005 case 12: // 1 1 0 0
3006 return Op0;
3007 case 13: // 1 1 0 1
3008 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3009 case 14: // 1 1 1 0
3010 return Builder.CreateOr(Op0, Op1);
3011 case 15: // 1 1 1 1
3012 return FoldConstant(true);
3013 default:
3014 llvm_unreachable("Invalid Operation");
3015 }
3016 return nullptr;
3017}
3018
3019/// Fold icmp (add X, Y), C.
3022 const APInt &C) {
3023 Value *Y = Add->getOperand(1);
3024 Value *X = Add->getOperand(0);
3025
3026 Value *Op0, *Op1;
3027 Instruction *Ext0, *Ext1;
3028 const CmpInst::Predicate Pred = Cmp.getPredicate();
3029 if (match(Add,
3032 m_ZExtOrSExt(m_Value(Op1))))) &&
3033 Op0->getType()->isIntOrIntVectorTy(1) &&
3034 Op1->getType()->isIntOrIntVectorTy(1)) {
3035 unsigned BW = C.getBitWidth();
3036 std::bitset<4> Table;
3037 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
3038 int Res = 0;
3039 if (Op0Val)
3040 Res += isa<ZExtInst>(Ext0) ? 1 : -1;
3041 if (Op1Val)
3042 Res += isa<ZExtInst>(Ext1) ? 1 : -1;
3043 return ICmpInst::compare(APInt(BW, Res, true), C, Pred);
3044 };
3045
3046 Table[0] = ComputeTable(false, false);
3047 Table[1] = ComputeTable(false, true);
3048 Table[2] = ComputeTable(true, false);
3049 Table[3] = ComputeTable(true, true);
3050 if (auto *Cond =
3051 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3052 return replaceInstUsesWith(Cmp, Cond);
3053 }
3054 const APInt *C2;
3055 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3056 return nullptr;
3057
3058 // Fold icmp pred (add X, C2), C.
3059 Type *Ty = Add->getType();
3060
3061 // If the add does not wrap, we can always adjust the compare by subtracting
3062 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3063 // are canonicalized to SGT/SLT/UGT/ULT.
3064 if ((Add->hasNoSignedWrap() &&
3065 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT)) ||
3066 (Add->hasNoUnsignedWrap() &&
3067 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT))) {
3068 bool Overflow;
3069 APInt NewC =
3070 Cmp.isSigned() ? C.ssub_ov(*C2, Overflow) : C.usub_ov(*C2, Overflow);
3071 // If there is overflow, the result must be true or false.
3072 // TODO: Can we assert there is no overflow because InstSimplify always
3073 // handles those cases?
3074 if (!Overflow)
3075 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3076 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3077 }
3078
3079 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3080 const APInt &Upper = CR.getUpper();
3081 const APInt &Lower = CR.getLower();
3082 if (Cmp.isSigned()) {
3083 if (Lower.isSignMask())
3084 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3085 if (Upper.isSignMask())
3086 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3087 } else {
3088 if (Lower.isMinValue())
3089 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3090 if (Upper.isMinValue())
3091 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3092 }
3093
3094 // This set of folds is intentionally placed after folds that use no-wrapping
3095 // flags because those folds are likely better for later analysis/codegen.
3098
3099 // Fold compare with offset to opposite sign compare if it eliminates offset:
3100 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3101 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3102 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3103
3104 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3105 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3106 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3107
3108 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3109 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3110 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3111
3112 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3113 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3114 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3115
3116 // (X + -1) <u C --> X <=u C (if X is never null)
3117 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3118 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3119 if (llvm::isKnownNonZero(X, Q))
3120 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3121 }
3122
3123 if (!Add->hasOneUse())
3124 return nullptr;
3125
3126 // X+C <u C2 -> (X & -C2) == C
3127 // iff C & (C2-1) == 0
3128 // C2 is a power of 2
3129 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3131 ConstantExpr::getNeg(cast<Constant>(Y)));
3132
3133 // X+C2 <u C -> (X & C) == 2C
3134 // iff C == -(C2)
3135 // C2 is a power of 2
3136 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3138 ConstantInt::get(Ty, C * 2));
3139
3140 // X+C >u C2 -> (X & ~C2) != C
3141 // iff C & C2 == 0
3142 // C2+1 is a power of 2
3143 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3145 ConstantExpr::getNeg(cast<Constant>(Y)));
3146
3147 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3148 // to the ult form.
3149 // X+C2 >u C -> X+(C2-C-1) <u ~C
3150 if (Pred == ICmpInst::ICMP_UGT)
3151 return new ICmpInst(ICmpInst::ICMP_ULT,
3152 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3153 ConstantInt::get(Ty, ~C));
3154
3155 return nullptr;
3156}
3157
3159 Value *&RHS, ConstantInt *&Less,
3160 ConstantInt *&Equal,
3161 ConstantInt *&Greater) {
3162 // TODO: Generalize this to work with other comparison idioms or ensure
3163 // they get canonicalized into this form.
3164
3165 // select i1 (a == b),
3166 // i32 Equal,
3167 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3168 // where Equal, Less and Greater are placeholders for any three constants.
3169 ICmpInst::Predicate PredA;
3170 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3171 !ICmpInst::isEquality(PredA))
3172 return false;
3173 Value *EqualVal = SI->getTrueValue();
3174 Value *UnequalVal = SI->getFalseValue();
3175 // We still can get non-canonical predicate here, so canonicalize.
3176 if (PredA == ICmpInst::ICMP_NE)
3177 std::swap(EqualVal, UnequalVal);
3178 if (!match(EqualVal, m_ConstantInt(Equal)))
3179 return false;
3180 ICmpInst::Predicate PredB;
3181 Value *LHS2, *RHS2;
3182 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3183 m_ConstantInt(Less), m_ConstantInt(Greater))))
3184 return false;
3185 // We can get predicate mismatch here, so canonicalize if possible:
3186 // First, ensure that 'LHS' match.
3187 if (LHS2 != LHS) {
3188 // x sgt y <--> y slt x
3189 std::swap(LHS2, RHS2);
3190 PredB = ICmpInst::getSwappedPredicate(PredB);
3191 }
3192 if (LHS2 != LHS)
3193 return false;
3194 // We also need to canonicalize 'RHS'.
3195 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3196 // x sgt C-1 <--> x sge C <--> not(x slt C)
3197 auto FlippedStrictness =
3199 PredB, cast<Constant>(RHS2));
3200 if (!FlippedStrictness)
3201 return false;
3202 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3203 "basic correctness failure");
3204 RHS2 = FlippedStrictness->second;
3205 // And kind-of perform the result swap.
3206 std::swap(Less, Greater);
3207 PredB = ICmpInst::ICMP_SLT;
3208 }
3209 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3210}
3211
3214 ConstantInt *C) {
3215
3216 assert(C && "Cmp RHS should be a constant int!");
3217 // If we're testing a constant value against the result of a three way
3218 // comparison, the result can be expressed directly in terms of the
3219 // original values being compared. Note: We could possibly be more
3220 // aggressive here and remove the hasOneUse test. The original select is
3221 // really likely to simplify or sink when we remove a test of the result.
3222 Value *OrigLHS, *OrigRHS;
3223 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3224 if (Cmp.hasOneUse() &&
3225 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3226 C3GreaterThan)) {
3227 assert(C1LessThan && C2Equal && C3GreaterThan);
3228
3229 bool TrueWhenLessThan = ICmpInst::compare(
3230 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3231 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3232 Cmp.getPredicate());
3233 bool TrueWhenGreaterThan = ICmpInst::compare(
3234 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3235
3236 // This generates the new instruction that will replace the original Cmp
3237 // Instruction. Instead of enumerating the various combinations when
3238 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3239 // false, we rely on chaining of ORs and future passes of InstCombine to
3240 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3241
3242 // When none of the three constants satisfy the predicate for the RHS (C),
3243 // the entire original Cmp can be simplified to a false.
3245 if (TrueWhenLessThan)
3247 OrigLHS, OrigRHS));
3248 if (TrueWhenEqual)
3250 OrigLHS, OrigRHS));
3251 if (TrueWhenGreaterThan)
3253 OrigLHS, OrigRHS));
3254
3255 return replaceInstUsesWith(Cmp, Cond);
3256 }
3257 return nullptr;
3258}
3259
3261 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3262 if (!Bitcast)
3263 return nullptr;
3264
3265 ICmpInst::Predicate Pred = Cmp.getPredicate();
3266 Value *Op1 = Cmp.getOperand(1);
3267 Value *BCSrcOp = Bitcast->getOperand(0);
3268 Type *SrcType = Bitcast->getSrcTy();
3269 Type *DstType = Bitcast->getType();
3270
3271 // Make sure the bitcast doesn't change between scalar and vector and
3272 // doesn't change the number of vector elements.
3273 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3274 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3275 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3276 Value *X;
3277 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3278 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3279 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3280 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3281 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3282 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3283 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3284 match(Op1, m_Zero()))
3285 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3286
3287 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3288 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3289 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3290
3291 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3292 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3293 return new ICmpInst(Pred, X,
3294 ConstantInt::getAllOnesValue(X->getType()));
3295 }
3296
3297 // Zero-equality checks are preserved through unsigned floating-point casts:
3298 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3299 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3300 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3301 if (Cmp.isEquality() && match(Op1, m_Zero()))
3302 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3303
3304 const APInt *C;
3305 bool TrueIfSigned;
3306 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3307 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3308 // the FP extend/truncate because that cast does not change the sign-bit.
3309 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3310 // The sign-bit is always the most significant bit in those types.
3311 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3312 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3313 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3314 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3315 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3316 Type *XType = X->getType();
3317
3318 // We can't currently handle Power style floating point operations here.
3319 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3320 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3321 if (auto *XVTy = dyn_cast<VectorType>(XType))
3322 NewType = VectorType::get(NewType, XVTy->getElementCount());
3323 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3324 if (TrueIfSigned)
3325 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3326 ConstantInt::getNullValue(NewType));
3327 else
3328 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3330 }
3331 }
3332
3333 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3334 Type *FPType = SrcType->getScalarType();
3335 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3336 Attribute::NoImplicitFloat) &&
3337 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3338 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3339 if (Mask & (fcInf | fcZero)) {
3340 if (Pred == ICmpInst::ICMP_NE)
3341 Mask = ~Mask;
3342 return replaceInstUsesWith(Cmp,
3343 Builder.createIsFPClass(BCSrcOp, Mask));
3344 }
3345 }
3346 }
3347 }
3348
3349 const APInt *C;
3350 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3351 !SrcType->isIntOrIntVectorTy())
3352 return nullptr;
3353
3354 // If this is checking if all elements of a vector compare are set or not,
3355 // invert the casted vector equality compare and test if all compare
3356 // elements are clear or not. Compare against zero is generally easier for
3357 // analysis and codegen.
3358 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3359 // Example: are all elements equal? --> are zero elements not equal?
3360 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3361 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3362 if (Value *NotBCSrcOp =
3363 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3364 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3365 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3366 }
3367 }
3368
3369 // If this is checking if all elements of an extended vector are clear or not,
3370 // compare in a narrow type to eliminate the extend:
3371 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3372 Value *X;
3373 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3374 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3375 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3376 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3377 Value *NewCast = Builder.CreateBitCast(X, NewType);
3378 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3379 }
3380 }
3381
3382 // Folding: icmp <pred> iN X, C
3383 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3384 // and C is a splat of a K-bit pattern
3385 // and SC is a constant vector = <C', C', C', ..., C'>
3386 // Into:
3387 // %E = extractelement <M x iK> %vec, i32 C'
3388 // icmp <pred> iK %E, trunc(C)
3389 Value *Vec;
3390 ArrayRef<int> Mask;
3391 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3392 // Check whether every element of Mask is the same constant
3393 if (all_equal(Mask)) {
3394 auto *VecTy = cast<VectorType>(SrcType);
3395 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3396 if (C->isSplat(EltTy->getBitWidth())) {
3397 // Fold the icmp based on the value of C
3398 // If C is M copies of an iK sized bit pattern,
3399 // then:
3400 // => %E = extractelement <N x iK> %vec, i32 Elem
3401 // icmp <pred> iK %SplatVal, <pattern>
3402 Value *Elem = Builder.getInt32(Mask[0]);
3403 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3404 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3405 return new ICmpInst(Pred, Extract, NewC);
3406 }
3407 }
3408 }
3409 return nullptr;
3410}
3411
3412/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3413/// where X is some kind of instruction.
3415 const APInt *C;
3416
3417 if (match(Cmp.getOperand(1), m_APInt(C))) {
3418 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3419 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3420 return I;
3421
3422 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3423 // For now, we only support constant integers while folding the
3424 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3425 // similar to the cases handled by binary ops above.
3426 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3427 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3428 return I;
3429
3430 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3431 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3432 return I;
3433
3434 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3436 return I;
3437
3438 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3439 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3440 // TODO: This checks one-use, but that is not strictly necessary.
3441 Value *Cmp0 = Cmp.getOperand(0);
3442 Value *X, *Y;
3443 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3444 (match(Cmp0,
3445 m_ExtractValue<0>(m_Intrinsic<Intrinsic::ssub_with_overflow>(
3446 m_Value(X), m_Value(Y)))) ||
3447 match(Cmp0,
3448 m_ExtractValue<0>(m_Intrinsic<Intrinsic::usub_with_overflow>(
3449 m_Value(X), m_Value(Y))))))
3450 return new ICmpInst(Cmp.getPredicate(), X, Y);
3451 }
3452
3453 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3455
3456 return nullptr;
3457}
3458
3459/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3460/// icmp eq/ne BO, C.
3462 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3463 // TODO: Some of these folds could work with arbitrary constants, but this
3464 // function is limited to scalar and vector splat constants.
3465 if (!Cmp.isEquality())
3466 return nullptr;
3467
3468 ICmpInst::Predicate Pred = Cmp.getPredicate();
3469 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3470 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3471 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3472
3473 switch (BO->getOpcode()) {
3474 case Instruction::SRem:
3475 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3476 if (C.isZero() && BO->hasOneUse()) {
3477 const APInt *BOC;
3478 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3479 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3480 return new ICmpInst(Pred, NewRem,
3482 }
3483 }
3484 break;
3485 case Instruction::Add: {
3486 // (A + C2) == C --> A == (C - C2)
3487 // (A + C2) != C --> A != (C - C2)
3488 // TODO: Remove the one-use limitation? See discussion in D58633.
3489 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3490 if (BO->hasOneUse())
3491 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3492 } else if (C.isZero()) {
3493 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3494 // efficiently invertible, or if the add has just this one use.
3495 if (Value *NegVal = dyn_castNegVal(BOp1))
3496 return new ICmpInst(Pred, BOp0, NegVal);
3497 if (Value *NegVal = dyn_castNegVal(BOp0))
3498 return new ICmpInst(Pred, NegVal, BOp1);
3499 if (BO->hasOneUse()) {
3500 // (add nuw A, B) != 0 -> (or A, B) != 0
3501 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3502 Value *Or = Builder.CreateOr(BOp0, BOp1);
3503 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3504 }
3505 Value *Neg = Builder.CreateNeg(BOp1);
3506 Neg->takeName(BO);
3507 return new ICmpInst(Pred, BOp0, Neg);
3508 }
3509 }
3510 break;
3511 }
3512 case Instruction::Xor:
3513 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3514 // For the xor case, we can xor two constants together, eliminating
3515 // the explicit xor.
3516 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3517 } else if (C.isZero()) {
3518 // Replace ((xor A, B) != 0) with (A != B)
3519 return new ICmpInst(Pred, BOp0, BOp1);
3520 }
3521 break;
3522 case Instruction::Or: {
3523 const APInt *BOC;
3524 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3525 // Comparing if all bits outside of a constant mask are set?
3526 // Replace (X | C) == -1 with (X & ~C) == ~C.
3527 // This removes the -1 constant.
3528 Constant *NotBOC = ConstantExpr::getNot(cast<Constant>(BOp1));
3529 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3530 return new ICmpInst(Pred, And, NotBOC);
3531 }
3532 break;
3533 }
3534 case Instruction::UDiv:
3535 case Instruction::SDiv:
3536 if (BO->isExact()) {
3537 // div exact X, Y eq/ne 0 -> X eq/ne 0
3538 // div exact X, Y eq/ne 1 -> X eq/ne Y
3539 // div exact X, Y eq/ne C ->
3540 // if Y * C never-overflow && OneUse:
3541 // -> Y * C eq/ne X
3542 if (C.isZero())
3543 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3544 else if (C.isOne())
3545 return new ICmpInst(Pred, BOp0, BOp1);
3546 else if (BO->hasOneUse()) {
3548 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3549 Cmp.getOperand(1), BO);
3551 Value *YC =
3552 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3553 return new ICmpInst(Pred, YC, BOp0);
3554 }
3555 }
3556 }
3557 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3558 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3559 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3560 return new ICmpInst(NewPred, BOp1, BOp0);
3561 }
3562 break;
3563 default:
3564 break;
3565 }
3566 return nullptr;
3567}
3568
3570 const APInt &CRhs,
3571 InstCombiner::BuilderTy &Builder,
3572 const SimplifyQuery &Q) {
3573 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3574 "Non-ctpop intrin in ctpop fold");
3575 if (!CtpopLhs->hasOneUse())
3576 return nullptr;
3577
3578 // Power of 2 test:
3579 // isPow2OrZero : ctpop(X) u< 2
3580 // isPow2 : ctpop(X) == 1
3581 // NotPow2OrZero: ctpop(X) u> 1
3582 // NotPow2 : ctpop(X) != 1
3583 // If we know any bit of X can be folded to:
3584 // IsPow2 : X & (~Bit) == 0
3585 // NotPow2 : X & (~Bit) != 0
3586 const ICmpInst::Predicate Pred = I.getPredicate();
3587 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3588 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3589 Value *Op = CtpopLhs->getArgOperand(0);
3590 KnownBits OpKnown = computeKnownBits(Op, Q.DL,
3591 /*Depth*/ 0, Q.AC, Q.CxtI, Q.DT);
3592 // No need to check for count > 1, that should be already constant folded.
3593 if (OpKnown.countMinPopulation() == 1) {
3594 Value *And = Builder.CreateAnd(
3595 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3596 return new ICmpInst(
3597 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3600 And, Constant::getNullValue(Op->getType()));
3601 }
3602 }
3603
3604 return nullptr;
3605}
3606
3607/// Fold an equality icmp with LLVM intrinsic and constant operand.
3609 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3610 Type *Ty = II->getType();
3611 unsigned BitWidth = C.getBitWidth();
3612 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3613
3614 switch (II->getIntrinsicID()) {
3615 case Intrinsic::abs:
3616 // abs(A) == 0 -> A == 0
3617 // abs(A) == INT_MIN -> A == INT_MIN
3618 if (C.isZero() || C.isMinSignedValue())
3619 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3620 break;
3621
3622 case Intrinsic::bswap:
3623 // bswap(A) == C -> A == bswap(C)
3624 return new ICmpInst(Pred, II->getArgOperand(0),
3625 ConstantInt::get(Ty, C.byteSwap()));
3626
3627 case Intrinsic::bitreverse:
3628 // bitreverse(A) == C -> A == bitreverse(C)
3629 return new ICmpInst(Pred, II->getArgOperand(0),
3630 ConstantInt::get(Ty, C.reverseBits()));
3631
3632 case Intrinsic::ctlz:
3633 case Intrinsic::cttz: {
3634 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3635 if (C == BitWidth)
3636 return new ICmpInst(Pred, II->getArgOperand(0),
3638
3639 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3640 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3641 // Limit to one use to ensure we don't increase instruction count.
3642 unsigned Num = C.getLimitedValue(BitWidth);
3643 if (Num != BitWidth && II->hasOneUse()) {
3644 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3645 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3646 : APInt::getHighBitsSet(BitWidth, Num + 1);
3647 APInt Mask2 = IsTrailing
3650 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3651 ConstantInt::get(Ty, Mask2));
3652 }
3653 break;
3654 }
3655
3656 case Intrinsic::ctpop: {
3657 // popcount(A) == 0 -> A == 0 and likewise for !=
3658 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3659 bool IsZero = C.isZero();
3660 if (IsZero || C == BitWidth)
3661 return new ICmpInst(Pred, II->getArgOperand(0),
3662 IsZero ? Constant::getNullValue(Ty)
3664
3665 break;
3666 }
3667
3668 case Intrinsic::fshl:
3669 case Intrinsic::fshr:
3670 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3671 const APInt *RotAmtC;
3672 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3673 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3674 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3675 return new ICmpInst(Pred, II->getArgOperand(0),
3676 II->getIntrinsicID() == Intrinsic::fshl
3677 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3678 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3679 }
3680 break;
3681
3682 case Intrinsic::umax:
3683 case Intrinsic::uadd_sat: {
3684 // uadd.sat(a, b) == 0 -> (a | b) == 0
3685 // umax(a, b) == 0 -> (a | b) == 0
3686 if (C.isZero() && II->hasOneUse()) {
3687 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3688 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3689 }
3690 break;
3691 }
3692
3693 case Intrinsic::ssub_sat:
3694 // ssub.sat(a, b) == 0 -> a == b
3695 if (C.isZero())
3696 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3697 break;
3698 case Intrinsic::usub_sat: {
3699 // usub.sat(a, b) == 0 -> a <= b
3700 if (C.isZero()) {
3701 ICmpInst::Predicate NewPred =
3703 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3704 }
3705 break;
3706 }
3707 default:
3708 break;
3709 }
3710
3711 return nullptr;
3712}
3713
3714/// Fold an icmp with LLVM intrinsics
3715static Instruction *
3717 InstCombiner::BuilderTy &Builder) {
3718 assert(Cmp.isEquality());
3719
3720 ICmpInst::Predicate Pred = Cmp.getPredicate();
3721 Value *Op0 = Cmp.getOperand(0);
3722 Value *Op1 = Cmp.getOperand(1);
3723 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3724 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3725 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3726 return nullptr;
3727
3728 switch (IIOp0->getIntrinsicID()) {
3729 case Intrinsic::bswap:
3730 case Intrinsic::bitreverse:
3731 // If both operands are byte-swapped or bit-reversed, just compare the
3732 // original values.
3733 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3734 case Intrinsic::fshl:
3735 case Intrinsic::fshr: {
3736 // If both operands are rotated by same amount, just compare the
3737 // original values.
3738 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3739 break;
3740 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3741 break;
3742 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3743 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3744
3745 // rotate(X, AmtX) == rotate(Y, AmtY)
3746 // -> rotate(X, AmtX - AmtY) == Y
3747 // Do this if either both rotates have one use or if only one has one use
3748 // and AmtX/AmtY are constants.
3749 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3750 if (OneUses == 2 ||
3751 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3752 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3753 Value *SubAmt =
3754 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3755 Value *CombinedRotate = Builder.CreateIntrinsic(
3756 Op0->getType(), IIOp0->getIntrinsicID(),
3757 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3758 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3759 }
3760 } break;
3761 default:
3762 break;
3763 }
3764
3765 return nullptr;
3766}
3767
3768/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3769/// where X is some kind of instruction and C is AllowPoison.
3770/// TODO: Move more folds which allow poison to this function.
3773 const APInt &C) {
3774 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3775 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3776 switch (II->getIntrinsicID()) {
3777 default:
3778 break;
3779 case Intrinsic::fshl:
3780 case Intrinsic::fshr:
3781 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3782 // (rot X, ?) == 0/-1 --> X == 0/-1
3783 if (C.isZero() || C.isAllOnes())
3784 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3785 }
3786 break;
3787 }
3788 }
3789
3790 return nullptr;
3791}
3792
3793/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3795 BinaryOperator *BO,
3796 const APInt &C) {
3797 switch (BO->getOpcode()) {
3798 case Instruction::Xor:
3799 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3800 return I;
3801 break;
3802 case Instruction::And:
3803 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3804 return I;
3805 break;
3806 case Instruction::Or:
3807 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3808 return I;
3809 break;
3810 case Instruction::Mul:
3811 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3812 return I;
3813 break;
3814 case Instruction::Shl:
3815 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
3816 return I;
3817 break;
3818 case Instruction::LShr:
3819 case Instruction::AShr:
3820 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
3821 return I;
3822 break;
3823 case Instruction::SRem:
3824 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
3825 return I;
3826 break;
3827 case Instruction::UDiv:
3828 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
3829 return I;
3830 [[fallthrough]];
3831 case Instruction::SDiv:
3832 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
3833 return I;
3834 break;
3835 case Instruction::Sub:
3836 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
3837 return I;
3838 break;
3839 case Instruction::Add:
3840 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
3841 return I;
3842 break;
3843 default:
3844 break;
3845 }
3846
3847 // TODO: These folds could be refactored to be part of the above calls.
3848 return foldICmpBinOpEqualityWithConstant(Cmp, BO, C);
3849}
3850
3851static Instruction *
3853 SaturatingInst *II, const APInt &C,
3854 InstCombiner::BuilderTy &Builder) {
3855 // This transform may end up producing more than one instruction for the
3856 // intrinsic, so limit it to one user of the intrinsic.
3857 if (!II->hasOneUse())
3858 return nullptr;
3859
3860 // Let Y = [add/sub]_sat(X, C) pred C2
3861 // SatVal = The saturating value for the operation
3862 // WillWrap = Whether or not the operation will underflow / overflow
3863 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
3864 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
3865 //
3866 // When (SatVal pred C2) is true, then
3867 // Y = WillWrap ? true : ((X binop C) pred C2)
3868 // => Y = WillWrap || ((X binop C) pred C2)
3869 // else
3870 // Y = WillWrap ? false : ((X binop C) pred C2)
3871 // => Y = !WillWrap ? ((X binop C) pred C2) : false
3872 // => Y = !WillWrap && ((X binop C) pred C2)
3873 Value *Op0 = II->getOperand(0);
3874 Value *Op1 = II->getOperand(1);
3875
3876 const APInt *COp1;
3877 // This transform only works when the intrinsic has an integral constant or
3878 // splat vector as the second operand.
3879 if (!match(Op1, m_APInt(COp1)))
3880 return nullptr;
3881
3882 APInt SatVal;
3883 switch (II->getIntrinsicID()) {
3884 default:
3886 "This function only works with usub_sat and uadd_sat for now!");
3887 case Intrinsic::uadd_sat:
3888 SatVal = APInt::getAllOnes(C.getBitWidth());
3889 break;
3890 case Intrinsic::usub_sat:
3891 SatVal = APInt::getZero(C.getBitWidth());
3892 break;
3893 }
3894
3895 // Check (SatVal pred C2)
3896 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
3897
3898 // !WillWrap.
3900 II->getBinaryOp(), *COp1, II->getNoWrapKind());
3901
3902 // WillWrap.
3903 if (SatValCheck)
3904 C1 = C1.inverse();
3905
3907 if (II->getBinaryOp() == Instruction::Add)
3908 C2 = C2.sub(*COp1);
3909 else
3910 C2 = C2.add(*COp1);
3911
3912 Instruction::BinaryOps CombiningOp =
3913 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
3914
3915 std::optional<ConstantRange> Combination;
3916 if (CombiningOp == Instruction::BinaryOps::Or)
3917 Combination = C1.exactUnionWith(C2);
3918 else /* CombiningOp == Instruction::BinaryOps::And */
3919 Combination = C1.exactIntersectWith(C2);
3920
3921 if (!Combination)
3922 return nullptr;
3923
3924 CmpInst::Predicate EquivPred;
3925 APInt EquivInt;
3926 APInt EquivOffset;
3927
3928 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3929
3930 return new ICmpInst(
3931 EquivPred,
3932 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
3933 ConstantInt::get(Op1->getType(), EquivInt));
3934}
3935
3936static Instruction *
3938 const APInt &C,
3939 InstCombiner::BuilderTy &Builder) {
3940 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
3941 switch (Pred) {
3942 case ICmpInst::ICMP_EQ:
3943 case ICmpInst::ICMP_NE:
3944 if (C.isZero())
3945 NewPredicate = Pred;
3946 else if (C.isOne())
3947 NewPredicate =
3949 else if (C.isAllOnes())
3950 NewPredicate =
3952 break;
3953
3954 case ICmpInst::ICMP_SGT:
3955 if (C.isAllOnes())
3956 NewPredicate = ICmpInst::ICMP_UGE;
3957 else if (C.isZero())
3958 NewPredicate = ICmpInst::ICMP_UGT;
3959 break;
3960
3961 case ICmpInst::ICMP_SLT:
3962 if (C.isZero())
3963 NewPredicate = ICmpInst::ICMP_ULT;
3964 else if (C.isOne())
3965 NewPredicate = ICmpInst::ICMP_ULE;
3966 break;
3967
3968 default:
3969 break;
3970 }
3971
3972 if (!NewPredicate)
3973 return nullptr;
3974
3975 if (I->getIntrinsicID() == Intrinsic::scmp)
3976 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
3977 Value *LHS = I->getOperand(0);
3978 Value *RHS = I->getOperand(1);
3979 return new ICmpInst(*NewPredicate, LHS, RHS);
3980}
3981
3982/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
3985 const APInt &C) {
3986 ICmpInst::Predicate Pred = Cmp.getPredicate();
3987
3988 // Handle folds that apply for any kind of icmp.
3989 switch (II->getIntrinsicID()) {
3990 default:
3991 break;
3992 case Intrinsic::uadd_sat:
3993 case Intrinsic::usub_sat:
3994 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
3995 Pred, cast<SaturatingInst>(II), C, Builder))
3996 return Folded;
3997 break;
3998 case Intrinsic::ctpop: {
3999 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4000 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4001 return R;
4002 } break;
4003 case Intrinsic::scmp:
4004 case Intrinsic::ucmp:
4005 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4006 return Folded;
4007 break;
4008 }
4009
4010 if (Cmp.isEquality())
4011 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4012
4013 Type *Ty = II->getType();
4014 unsigned BitWidth = C.getBitWidth();
4015 switch (II->getIntrinsicID()) {
4016 case Intrinsic::ctpop: {
4017 // (ctpop X > BitWidth - 1) --> X == -1
4018 Value *X = II->getArgOperand(0);
4019 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4020 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4022 // (ctpop X < BitWidth) --> X != -1
4023 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4024 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4026 break;
4027 }
4028 case Intrinsic::ctlz: {
4029 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4030 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4031 unsigned Num = C.getLimitedValue();
4032 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4033 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4034 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4035 }
4036
4037 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4038 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4039 unsigned Num = C.getLimitedValue();
4041 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4042 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4043 }
4044 break;
4045 }
4046 case Intrinsic::cttz: {
4047 // Limit to one use to ensure we don't increase instruction count.
4048 if (!II->hasOneUse())
4049 return nullptr;
4050
4051 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4052 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4053 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4054 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4055 Builder.CreateAnd(II->getArgOperand(0), Mask),
4057 }
4058
4059 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4060 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4061 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4062 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4063 Builder.CreateAnd(II->getArgOperand(0), Mask),
4065 }
4066 break;
4067 }
4068 case Intrinsic::ssub_sat:
4069 // ssub.sat(a, b) spred 0 -> a spred b
4070 if (ICmpInst::isSigned(Pred)) {
4071 if (C.isZero())
4072 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4073 // X s<= 0 is cannonicalized to X s< 1
4074 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4075 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4076 II->getArgOperand(1));
4077 // X s>= 0 is cannonicalized to X s> -1
4078 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4079 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4080 II->getArgOperand(1));
4081 }
4082 break;
4083 default:
4084 break;
4085 }
4086
4087 return nullptr;
4088}
4089
4090/// Handle icmp with constant (but not simple integer constant) RHS.
4092 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4093 Constant *RHSC = dyn_cast<Constant>(Op1);
4094 Instruction *LHSI = dyn_cast<Instruction>(Op0);
4095 if (!RHSC || !LHSI)
4096 return nullptr;
4097
4098 switch (LHSI->getOpcode()) {
4099 case Instruction::PHI:
4100 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
4101 return NV;
4102 break;
4103 case Instruction::IntToPtr:
4104 // icmp pred inttoptr(X), null -> icmp pred X, 0
4105 if (RHSC->isNullValue() &&
4106 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4107 return new ICmpInst(
4108 I.getPredicate(), LHSI->getOperand(0),
4110 break;
4111
4112 case Instruction::Load:
4113 // Try to optimize things like "A[i] > 4" to index computations.
4114 if (GetElementPtrInst *GEP =
4115 dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
4116 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
4117 if (Instruction *Res =
4118 foldCmpLoadFromIndexedGlobal(cast<LoadInst>(LHSI), GEP, GV, I))
4119 return Res;
4120 break;
4121 }
4122
4123 return nullptr;
4124}
4125
4127 SelectInst *SI, Value *RHS,
4128 const ICmpInst &I) {
4129 // Try to fold the comparison into the select arms, which will cause the
4130 // select to be converted into a logical and/or.
4131 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4132 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4133 return Res;
4134 if (std::optional<bool> Impl = isImpliedCondition(
4135 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4136 return ConstantInt::get(I.getType(), *Impl);
4137 return nullptr;
4138 };
4139
4140 ConstantInt *CI = nullptr;
4141 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4142 if (Op1)
4143 CI = dyn_cast<ConstantInt>(Op1);
4144
4145 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4146 if (Op2)
4147 CI = dyn_cast<ConstantInt>(Op2);
4148
4149 // We only want to perform this transformation if it will not lead to
4150 // additional code. This is true if either both sides of the select
4151 // fold to a constant (in which case the icmp is replaced with a select
4152 // which will usually simplify) or this is the only user of the
4153 // select (in which case we are trading a select+icmp for a simpler
4154 // select+icmp) or all uses of the select can be replaced based on
4155 // dominance information ("Global cases").
4156 bool Transform = false;
4157 if (Op1 && Op2)
4158 Transform = true;
4159 else if (Op1 || Op2) {
4160 // Local case
4161 if (SI->hasOneUse())
4162 Transform = true;
4163 // Global cases
4164 else if (CI && !CI->isZero())
4165 // When Op1 is constant try replacing select with second operand.
4166 // Otherwise Op2 is constant and try replacing select with first
4167 // operand.
4168 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4169 }
4170 if (Transform) {
4171 if (!Op1)
4172 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4173 if (!Op2)
4174 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4175 return SelectInst::Create(SI->getOperand(0), Op1, Op2);
4176 }
4177
4178 return nullptr;
4179}
4180
4181// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4182static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4183 unsigned Depth = 0) {
4184 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4185 return true;
4186 if (V->getType()->getScalarSizeInBits() == 1)
4187 return true;
4189 return false;
4190 Value *X;
4191 const Instruction *I = dyn_cast<Instruction>(V);
4192 if (!I)
4193 return false;
4194 switch (I->getOpcode()) {
4195 case Instruction::ZExt:
4196 // ZExt(Mask) is a Mask.
4197 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4198 case Instruction::SExt:
4199 // SExt(Mask) is a Mask.
4200 // SExt(~Mask) is a ~Mask.
4201 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4202 case Instruction::And:
4203 case Instruction::Or:
4204 // Mask0 | Mask1 is a Mask.
4205 // Mask0 & Mask1 is a Mask.
4206 // ~Mask0 | ~Mask1 is a ~Mask.
4207 // ~Mask0 & ~Mask1 is a ~Mask.
4208 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4209 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4210 case Instruction::Xor:
4211 if (match(V, m_Not(m_Value(X))))
4212 return isMaskOrZero(X, !Not, Q, Depth);
4213
4214 // (X ^ -X) is a ~Mask
4215 if (Not)
4216 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4217 // (X ^ (X - 1)) is a Mask
4218 else
4219 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4220 case Instruction::Select:
4221 // c ? Mask0 : Mask1 is a Mask.
4222 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4223 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4224 case Instruction::Shl:
4225 // (~Mask) << X is a ~Mask.
4226 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4227 case Instruction::LShr:
4228 // Mask >> X is a Mask.
4229 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4230 case Instruction::AShr:
4231 // Mask s>> X is a Mask.
4232 // ~Mask s>> X is a ~Mask.
4233 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4234 case Instruction::Add:
4235 // Pow2 - 1 is a Mask.
4236 if (!Not && match(I->getOperand(1), m_AllOnes()))
4237 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4238 Depth, Q.AC, Q.CxtI, Q.DT);
4239 break;
4240 case Instruction::Sub:
4241 // -Pow2 is a ~Mask.
4242 if (Not && match(I->getOperand(0), m_Zero()))
4243 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4244 Depth, Q.AC, Q.CxtI, Q.DT);
4245 break;
4246 case Instruction::Call: {
4247 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4248 switch (II->getIntrinsicID()) {
4249 // min/max(Mask0, Mask1) is a Mask.
4250 // min/max(~Mask0, ~Mask1) is a ~Mask.
4251 case Intrinsic::umax:
4252 case Intrinsic::smax:
4253 case Intrinsic::umin:
4254 case Intrinsic::smin:
4255 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4256 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4257
4258 // In the context of masks, bitreverse(Mask) == ~Mask
4259 case Intrinsic::bitreverse:
4260 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4261 default:
4262 break;
4263 }
4264 }
4265 break;
4266 }
4267 default:
4268 break;
4269 }
4270 return false;
4271}
4272
4273/// Some comparisons can be simplified.
4274/// In this case, we are looking for comparisons that look like
4275/// a check for a lossy truncation.
4276/// Folds:
4277/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4278/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4279/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4280/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4281/// Where Mask is some pattern that produces all-ones in low bits:
4282/// (-1 >> y)
4283/// ((-1 << y) >> y) <- non-canonical, has extra uses
4284/// ~(-1 << y)
4285/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4286/// The Mask can be a constant, too.
4287/// For some predicates, the operands are commutative.
4288/// For others, x can only be on a specific side.
4290 Value *Op1, const SimplifyQuery &Q,
4291 InstCombiner &IC) {
4292
4293 ICmpInst::Predicate DstPred;
4294 switch (Pred) {
4296 // x & Mask == x
4297 // x & ~Mask == 0
4298 // ~x | Mask == -1
4299 // -> x u<= Mask
4300 // x & ~Mask == ~Mask
4301 // -> ~Mask u<= x
4303 break;
4305 // x & Mask != x
4306 // x & ~Mask != 0
4307 // ~x | Mask != -1
4308 // -> x u> Mask
4309 // x & ~Mask != ~Mask
4310 // -> ~Mask u> x
4312 break;
4314 // x & Mask u< x
4315 // -> x u> Mask
4316 // x & ~Mask u< ~Mask
4317 // -> ~Mask u> x
4319 break;
4321 // x & Mask u>= x
4322 // -> x u<= Mask
4323 // x & ~Mask u>= ~Mask
4324 // -> ~Mask u<= x
4326 break;
4328 // x & Mask s< x [iff Mask s>= 0]
4329 // -> x s> Mask
4330 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4331 // -> ~Mask s> x
4333 break;
4335 // x & Mask s>= x [iff Mask s>= 0]
4336 // -> x s<= Mask
4337 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4338 // -> ~Mask s<= x
4340 break;
4341 default:
4342 // We don't support sgt,sle
4343 // ult/ugt are simplified to true/false respectively.
4344 return nullptr;
4345 }
4346
4347 Value *X, *M;
4348 // Put search code in lambda for early positive returns.
4349 auto IsLowBitMask = [&]() {
4350 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4351 X = Op1;
4352 // Look for: x & Mask pred x
4353 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4354 return !ICmpInst::isSigned(Pred) ||
4355 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4356 }
4357
4358 // Look for: x & ~Mask pred ~Mask
4359 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4360 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4361 }
4362 return false;
4363 }
4364 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4365 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4366
4367 auto Check = [&]() {
4368 // Look for: ~x | Mask == -1
4369 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4370 if (Value *NotX =
4371 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4372 X = NotX;
4373 return true;
4374 }
4375 }
4376 return false;
4377 };
4378 if (Check())
4379 return true;
4380 std::swap(X, M);
4381 return Check();
4382 }
4383 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4384 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4385 auto Check = [&]() {
4386 // Look for: x & ~Mask == 0
4387 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4388 if (Value *NotM =
4389 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4390 M = NotM;
4391 return true;
4392 }
4393 }
4394 return false;
4395 };
4396 if (Check())
4397 return true;
4398 std::swap(X, M);
4399 return Check();
4400 }
4401 return false;
4402 };
4403
4404 if (!IsLowBitMask())
4405 return nullptr;
4406
4407 return IC.Builder.CreateICmp(DstPred, X, M);
4408}
4409
4410/// Some comparisons can be simplified.
4411/// In this case, we are looking for comparisons that look like
4412/// a check for a lossy signed truncation.
4413/// Folds: (MaskedBits is a constant.)
4414/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4415/// Into:
4416/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4417/// Where KeptBits = bitwidth(%x) - MaskedBits
4418static Value *
4420 InstCombiner::BuilderTy &Builder) {
4421 ICmpInst::Predicate SrcPred;
4422 Value *X;
4423 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4424 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4425 if (!match(&I, m_c_ICmp(SrcPred,
4427 m_APInt(C1))),
4428 m_Deferred(X))))
4429 return nullptr;
4430
4431 // Potential handling of non-splats: for each element:
4432 // * if both are undef, replace with constant 0.
4433 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4434 // * if both are not undef, and are different, bailout.
4435 // * else, only one is undef, then pick the non-undef one.
4436
4437 // The shift amount must be equal.
4438 if (*C0 != *C1)
4439 return nullptr;
4440 const APInt &MaskedBits = *C0;
4441 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4442
4443 ICmpInst::Predicate DstPred;
4444 switch (SrcPred) {
4446 // ((%x << MaskedBits) a>> MaskedBits) == %x
4447 // =>
4448 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4450 break;
4452 // ((%x << MaskedBits) a>> MaskedBits) != %x
4453 // =>
4454 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4456 break;
4457 // FIXME: are more folds possible?
4458 default:
4459 return nullptr;
4460 }
4461
4462 auto *XType = X->getType();
4463 const unsigned XBitWidth = XType->getScalarSizeInBits();
4464 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4465 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4466
4467 // KeptBits = bitwidth(%x) - MaskedBits
4468 const APInt KeptBits = BitWidth - MaskedBits;
4469 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4470 // ICmpCst = (1 << KeptBits)
4471 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4472 assert(ICmpCst.isPowerOf2());
4473 // AddCst = (1 << (KeptBits-1))
4474 const APInt AddCst = ICmpCst.lshr(1);
4475 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4476
4477 // T0 = add %x, AddCst
4478 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4479 // T1 = T0 DstPred ICmpCst
4480 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4481
4482 return T1;
4483}
4484
4485// Given pattern:
4486// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4487// we should move shifts to the same hand of 'and', i.e. rewrite as
4488// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4489// We are only interested in opposite logical shifts here.
4490// One of the shifts can be truncated.
4491// If we can, we want to end up creating 'lshr' shift.
4492static Value *
4494 InstCombiner::BuilderTy &Builder) {
4495 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4496 !I.getOperand(0)->hasOneUse())
4497 return nullptr;
4498
4499 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4500
4501 // Look for an 'and' of two logical shifts, one of which may be truncated.
4502 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4503 Instruction *XShift, *MaybeTruncation, *YShift;
4504 if (!match(
4505 I.getOperand(0),
4506 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4508 m_AnyLogicalShift, m_Instruction(YShift))),
4509 m_Instruction(MaybeTruncation)))))
4510 return nullptr;
4511
4512 // We potentially looked past 'trunc', but only when matching YShift,
4513 // therefore YShift must have the widest type.
4514 Instruction *WidestShift = YShift;
4515 // Therefore XShift must have the shallowest type.
4516 // Or they both have identical types if there was no truncation.
4517 Instruction *NarrowestShift = XShift;
4518
4519 Type *WidestTy = WidestShift->getType();
4520 Type *NarrowestTy = NarrowestShift->getType();
4521 assert(NarrowestTy == I.getOperand(0)->getType() &&
4522 "We did not look past any shifts while matching XShift though.");
4523 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4524
4525 // If YShift is a 'lshr', swap the shifts around.
4526 if (match(YShift, m_LShr(m_Value(), m_Value())))
4527 std::swap(XShift, YShift);
4528
4529 // The shifts must be in opposite directions.
4530 auto XShiftOpcode = XShift->getOpcode();
4531 if (XShiftOpcode == YShift->getOpcode())
4532 return nullptr; // Do not care about same-direction shifts here.
4533
4534 Value *X, *XShAmt, *Y, *YShAmt;
4535 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4536 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4537
4538 // If one of the values being shifted is a constant, then we will end with
4539 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4540 // however, we will need to ensure that we won't increase instruction count.
4541 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4542 // At least one of the hands of the 'and' should be one-use shift.
4543 if (!match(I.getOperand(0),
4544 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4545 return nullptr;
4546 if (HadTrunc) {
4547 // Due to the 'trunc', we will need to widen X. For that either the old
4548 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4549 if (!MaybeTruncation->hasOneUse() &&
4550 !NarrowestShift->getOperand(1)->hasOneUse())
4551 return nullptr;
4552 }
4553 }
4554
4555 // We have two shift amounts from two different shifts. The types of those
4556 // shift amounts may not match. If that's the case let's bailout now.
4557 if (XShAmt->getType() != YShAmt->getType())
4558 return nullptr;
4559
4560 // As input, we have the following pattern:
4561 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4562 // We want to rewrite that as:
4563 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4564 // While we know that originally (Q+K) would not overflow
4565 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4566 // shift amounts. so it may now overflow in smaller bitwidth.
4567 // To ensure that does not happen, we need to ensure that the total maximal
4568 // shift amount is still representable in that smaller bit width.
4569 unsigned MaximalPossibleTotalShiftAmount =
4570 (WidestTy->getScalarSizeInBits() - 1) +
4571 (NarrowestTy->getScalarSizeInBits() - 1);
4572 APInt MaximalRepresentableShiftAmount =
4574 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4575 return nullptr;
4576
4577 // Can we fold (XShAmt+YShAmt) ?
4578 auto *NewShAmt = dyn_cast_or_null<Constant>(
4579 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4580 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4581 if (!NewShAmt)
4582 return nullptr;
4583 if (NewShAmt->getType() != WidestTy) {
4584 NewShAmt =
4585 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4586 if (!NewShAmt)
4587 return nullptr;
4588 }
4589 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4590
4591 // Is the new shift amount smaller than the bit width?
4592 // FIXME: could also rely on ConstantRange.
4593 if (!match(NewShAmt,
4595 APInt(WidestBitWidth, WidestBitWidth))))
4596 return nullptr;
4597
4598 // An extra legality check is needed if we had trunc-of-lshr.
4599 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4600 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4601 WidestShift]() {
4602 // It isn't obvious whether it's worth it to analyze non-constants here.
4603 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4604 // If *any* of these preconditions matches we can perform the fold.
4605 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4606 ? NewShAmt->getSplatValue()
4607 : NewShAmt;
4608 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4609 if (NewShAmtSplat &&
4610 (NewShAmtSplat->isNullValue() ||
4611 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4612 return true;
4613 // We consider *min* leading zeros so a single outlier
4614 // blocks the transform as opposed to allowing it.
4615 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4616 KnownBits Known = computeKnownBits(C, SQ.DL);
4617 unsigned MinLeadZero = Known.countMinLeadingZeros();
4618 // If the value being shifted has at most lowest bit set we can fold.
4619 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4620 if (MaxActiveBits <= 1)
4621 return true;
4622 // Precondition: NewShAmt u<= countLeadingZeros(C)
4623 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4624 return true;
4625 }
4626 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4627 KnownBits Known = computeKnownBits(C, SQ.DL);
4628 unsigned MinLeadZero = Known.countMinLeadingZeros();
4629 // If the value being shifted has at most lowest bit set we can fold.
4630 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4631 if (MaxActiveBits <= 1)
4632 return true;
4633 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4634 if (NewShAmtSplat) {
4635 APInt AdjNewShAmt =
4636 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4637 if (AdjNewShAmt.ule(MinLeadZero))
4638 return true;
4639 }
4640 }
4641 return false; // Can't tell if it's ok.
4642 };
4643 if (!CanFold())
4644 return nullptr;
4645 }
4646
4647 // All good, we can do this fold.
4648 X = Builder.CreateZExt(X, WidestTy);
4649 Y = Builder.CreateZExt(Y, WidestTy);
4650 // The shift is the same that was for X.
4651 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4652 ? Builder.CreateLShr(X, NewShAmt)
4653 : Builder.CreateShl(X, NewShAmt);
4654 Value *T1 = Builder.CreateAnd(T0, Y);
4655 return Builder.CreateICmp(I.getPredicate(), T1,
4656 Constant::getNullValue(WidestTy));
4657}
4658
4659/// Fold
4660/// (-1 u/ x) u< y
4661/// ((x * y) ?/ x) != y
4662/// to
4663/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4664/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4665/// will mean that we are looking for the opposite answer.
4668 Value *X, *Y;
4670 Instruction *Div;
4671 bool NeedNegation;
4672 // Look for: (-1 u/ x) u</u>= y
4673 if (!I.isEquality() &&
4674 match(&I, m_c_ICmp(Pred,
4676 m_Instruction(Div)),
4677 m_Value(Y)))) {
4678 Mul = nullptr;
4679
4680 // Are we checking that overflow does not happen, or does happen?
4681 switch (Pred) {
4683 NeedNegation = false;
4684 break; // OK
4686 NeedNegation = true;
4687 break; // OK
4688 default:
4689 return nullptr; // Wrong predicate.
4690 }
4691 } else // Look for: ((x * y) / x) !=/== y
4692 if (I.isEquality() &&
4693 match(&I,
4694 m_c_ICmp(Pred, m_Value(Y),
4697 m_Value(X)),
4699 m_Deferred(X))),
4700 m_Instruction(Div))))) {
4701 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4702 } else
4703 return nullptr;
4704
4706 // If the pattern included (x * y), we'll want to insert new instructions
4707 // right before that original multiplication so that we can replace it.
4708 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4709 if (MulHadOtherUses)
4711
4712 Function *F = Intrinsic::getDeclaration(I.getModule(),
4713 Div->getOpcode() == Instruction::UDiv
4714 ? Intrinsic::umul_with_overflow
4715 : Intrinsic::smul_with_overflow,
4716 X->getType());
4717 CallInst *Call = Builder.CreateCall(F, {X, Y}, "mul");
4718
4719 // If the multiplication was used elsewhere, to ensure that we don't leave
4720 // "duplicate" instructions, replace uses of that original multiplication
4721 // with the multiplication result from the with.overflow intrinsic.
4722 if (MulHadOtherUses)
4723 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4724
4725 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4726 if (NeedNegation) // This technically increases instruction count.
4727 Res = Builder.CreateNot(Res, "mul.not.ov");
4728
4729 // If we replaced the mul, erase it. Do this after all uses of Builder,
4730 // as the mul is used as insertion point.
4731 if (MulHadOtherUses)
4733
4734 return Res;
4735}
4736
4738 InstCombiner::BuilderTy &Builder) {
4739 CmpInst::Predicate Pred;
4740 Value *X;
4741 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4742
4743 if (ICmpInst::isSigned(Pred))
4744 Pred = ICmpInst::getSwappedPredicate(Pred);
4745 else if (ICmpInst::isUnsigned(Pred))
4746 Pred = ICmpInst::getSignedPredicate(Pred);
4747 // else for equality-comparisons just keep the predicate.
4748
4749 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4750 Constant::getNullValue(X->getType()), I.getName());
4751 }
4752
4753 // A value is not equal to its negation unless that value is 0 or
4754 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4755 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4756 ICmpInst::isEquality(Pred)) {
4757 Type *Ty = X->getType();
4759 Constant *MaxSignedVal =
4760 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4761 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4762 Constant *Zero = Constant::getNullValue(Ty);
4763 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4764 }
4765
4766 return nullptr;
4767}
4768
4770 InstCombinerImpl &IC) {
4771 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4772 // Normalize and operand as operand 0.
4773 CmpInst::Predicate Pred = I.getPredicate();
4774 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4775 std::swap(Op0, Op1);
4776 Pred = ICmpInst::getSwappedPredicate(Pred);
4777 }
4778
4779 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4780 return nullptr;
4781
4782 // (icmp (X & Y) u< X --> (X & Y) != X
4783 if (Pred == ICmpInst::ICMP_ULT)
4784 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4785
4786 // (icmp (X & Y) u>= X --> (X & Y) == X
4787 if (Pred == ICmpInst::ICMP_UGE)
4788 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4789
4790 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4791 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
4792 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
4793 // so don't do this fold.
4794 if (!match(Op1, m_ImmConstant()))
4795 if (auto *NotOp1 =
4796 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
4797 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
4798 Constant::getAllOnesValue(Op1->getType()));
4799 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
4800 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4801 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
4802 Constant::getNullValue(Op1->getType()));
4803 }
4804
4805 if (!ICmpInst::isSigned(Pred))
4806 return nullptr;
4807
4808 KnownBits KnownY = IC.computeKnownBits(A, /*Depth=*/0, &I);
4809 // (X & NegY) spred X --> (X & NegY) upred X
4810 if (KnownY.isNegative())
4811 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
4812
4813 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
4814 return nullptr;
4815
4816 if (KnownY.isNonNegative())
4817 // (X & PosY) s<= X --> X s>= 0
4818 // (X & PosY) s> X --> X s< 0
4819 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
4820 Constant::getNullValue(Op1->getType()));
4821
4823 // (NegX & Y) s<= NegX --> Y s< 0
4824 // (NegX & Y) s> NegX --> Y s>= 0
4826 Constant::getNullValue(A->getType()));
4827
4828 return nullptr;
4829}
4830
4832 InstCombinerImpl &IC) {
4833 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4834
4835 // Normalize or operand as operand 0.
4836 CmpInst::Predicate Pred = I.getPredicate();
4837 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
4838 std::swap(Op0, Op1);
4839 Pred = ICmpInst::getSwappedPredicate(Pred);
4840 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
4841 return nullptr;
4842 }
4843
4844 // icmp (X | Y) u<= X --> (X | Y) == X
4845 if (Pred == ICmpInst::ICMP_ULE)
4846 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4847
4848 // icmp (X | Y) u> X --> (X | Y) != X
4849 if (Pred == ICmpInst::ICMP_UGT)
4850 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4851
4852 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4853 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
4854 if (Value *NotOp1 =
4855 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
4856 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
4857 Constant::getNullValue(Op1->getType()));
4858 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
4859 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4860 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
4861 Constant::getAllOnesValue(Op1->getType()));
4862 }
4863 return nullptr;
4864}
4865
4867 InstCombinerImpl &IC) {
4868 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4869 // Normalize xor operand as operand 0.
4870 CmpInst::Predicate Pred = I.getPredicate();
4871 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
4872 std::swap(Op0, Op1);
4873 Pred = ICmpInst::getSwappedPredicate(Pred);
4874 }
4875 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
4876 return nullptr;
4877
4878 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
4879 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
4880 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
4881 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
4883 if (PredOut != Pred && isKnownNonZero(A, Q))
4884 return new ICmpInst(PredOut, Op0, Op1);
4885
4886 return nullptr;
4887}
4888
4889/// Try to fold icmp (binop), X or icmp X, (binop).
4890/// TODO: A large part of this logic is duplicated in InstSimplify's
4891/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
4892/// duplication.
4894 const SimplifyQuery &SQ) {
4896 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4897
4898 // Special logic for binary operators.
4899 BinaryOperator *BO0 = dyn_cast<BinaryOperator>(Op0);
4900 BinaryOperator *BO1 = dyn_cast<BinaryOperator>(Op1);
4901 if (!BO0 && !BO1)
4902 return nullptr;
4903
4904 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
4905 return NewICmp;
4906
4907 const CmpInst::Predicate Pred = I.getPredicate();
4908 Value *X;
4909
4910 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
4911 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
4912 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
4913 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
4914 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
4915 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
4916 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
4917 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
4918 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
4919
4920 {
4921 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
4922 Constant *C;
4923 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
4924 m_ImmConstant(C)))) &&
4925 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
4927 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
4928 }
4929 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
4930 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
4931 m_ImmConstant(C)))) &&
4932 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
4934 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
4935 }
4936 }
4937
4938 {
4939 // Similar to above: an unsigned overflow comparison may use offset + mask:
4940 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
4941 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
4942 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
4943 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
4944 BinaryOperator *BO;
4945 const APInt *C;
4946 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
4947 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4949 CmpInst::Predicate NewPred =
4951 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4952 return new ICmpInst(NewPred, Op1, Zero);
4953 }
4954
4955 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
4956 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4958 CmpInst::Predicate NewPred =
4960 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4961 return new ICmpInst(NewPred, Op0, Zero);
4962 }
4963 }
4964
4965 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
4966 bool Op0HasNUW = false, Op1HasNUW = false;
4967 bool Op0HasNSW = false, Op1HasNSW = false;
4968 // Analyze the case when either Op0 or Op1 is an add instruction.
4969 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
4970 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
4971 bool &HasNSW, bool &HasNUW) -> bool {
4972 if (isa<OverflowingBinaryOperator>(BO)) {
4973 HasNUW = BO.hasNoUnsignedWrap();
4974 HasNSW = BO.hasNoSignedWrap();
4975 return ICmpInst::isEquality(Pred) ||
4976 (CmpInst::isUnsigned(Pred) && HasNUW) ||
4977 (CmpInst::isSigned(Pred) && HasNSW);
4978 } else if (BO.getOpcode() == Instruction::Or) {
4979 HasNUW = true;
4980 HasNSW = true;
4981 return true;
4982 } else {
4983 return false;
4984 }
4985 };
4986 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
4987
4988 if (BO0) {
4989 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
4990 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
4991 }
4992 if (BO1) {
4993 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
4994 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
4995 }
4996
4997 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
4998 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
4999 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5000 return new ICmpInst(Pred, A == Op1 ? B : A,
5001 Constant::getNullValue(Op1->getType()));
5002
5003 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5004 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5005 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5006 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5007 C == Op0 ? D : C);
5008
5009 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5010 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5011 NoOp1WrapProblem) {
5012 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5013 Value *Y, *Z;
5014 if (A == C) {
5015 // C + B == C + D -> B == D
5016 Y = B;
5017 Z = D;
5018 } else if (A == D) {
5019 // D + B == C + D -> B == C
5020 Y = B;
5021 Z = C;
5022 } else if (B == C) {
5023 // A + C == C + D -> A == D
5024 Y = A;
5025 Z = D;
5026 } else {
5027 assert(B == D);
5028 // A + D == C + D -> A == C
5029 Y = A;
5030 Z = C;
5031 }
5032 return new ICmpInst(Pred, Y, Z);
5033 }
5034
5035 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5036 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLT &&
5037 match(B, m_AllOnes()))
5038 return new ICmpInst(CmpInst::ICMP_SLE, A, Op1);
5039
5040 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5041 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGE &&
5042 match(B, m_AllOnes()))
5043 return new ICmpInst(CmpInst::ICMP_SGT, A, Op1);
5044
5045 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5046 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLE && match(B, m_One()))
5047 return new ICmpInst(CmpInst::ICMP_SLT, A, Op1);
5048
5049 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5050 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGT && match(B, m_One()))
5051 return new ICmpInst(CmpInst::ICMP_SGE, A, Op1);
5052
5053 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5054 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGT &&
5055 match(D, m_AllOnes()))
5056 return new ICmpInst(CmpInst::ICMP_SGE, Op0, C);
5057
5058 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5059 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLE &&
5060 match(D, m_AllOnes()))
5061 return new ICmpInst(CmpInst::ICMP_SLT, Op0, C);
5062
5063 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5064 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGE && match(D, m_One()))
5065 return new ICmpInst(CmpInst::ICMP_SGT, Op0, C);
5066
5067 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5068 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLT && match(D, m_One()))
5069 return new ICmpInst(CmpInst::ICMP_SLE, Op0, C);
5070
5071 // TODO: The subtraction-related identities shown below also hold, but
5072 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5073 // wouldn't happen even if they were implemented.
5074 //
5075 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5076 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5077 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5078 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5079
5080 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5081 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_ULE && match(B, m_One()))
5082 return new ICmpInst(CmpInst::ICMP_ULT, A, Op1);
5083
5084 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5085 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_UGT && match(B, m_One()))
5086 return new ICmpInst(CmpInst::ICMP_UGE, A, Op1);
5087
5088 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5089 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_UGE && match(D, m_One()))
5090 return new ICmpInst(CmpInst::ICMP_UGT, Op0, C);
5091
5092 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5093 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_ULT && match(D, m_One()))
5094 return new ICmpInst(CmpInst::ICMP_ULE, Op0, C);
5095
5096 // if C1 has greater magnitude than C2:
5097 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5098 // s.t. C3 = C1 - C2
5099 //
5100 // if C2 has greater magnitude than C1:
5101 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5102 // s.t. C3 = C2 - C1
5103 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5104 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5105 const APInt *AP1, *AP2;
5106 // TODO: Support non-uniform vectors.
5107 // TODO: Allow poison passthrough if B or D's element is poison.
5108 if (match(B, m_APIntAllowPoison(AP1)) &&
5109 match(D, m_APIntAllowPoison(AP2)) &&
5110 AP1->isNegative() == AP2->isNegative()) {
5111 APInt AP1Abs = AP1->abs();
5112 APInt AP2Abs = AP2->abs();
5113 if (AP1Abs.uge(AP2Abs)) {
5114 APInt Diff = *AP1 - *AP2;
5115 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5116 Value *NewAdd = Builder.CreateAdd(
5117 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5118 return new ICmpInst(Pred, NewAdd, C);
5119 } else {
5120 APInt Diff = *AP2 - *AP1;
5121 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5122 Value *NewAdd = Builder.CreateAdd(
5123 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5124 return new ICmpInst(Pred, A, NewAdd);
5125 }
5126 }
5127 Constant *Cst1, *Cst2;
5128 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5129 ICmpInst::isEquality(Pred)) {
5130 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5131 Value *NewAdd = Builder.CreateAdd(C, Diff);
5132 return new ICmpInst(Pred, A, NewAdd);
5133 }
5134 }
5135
5136 // Analyze the case when either Op0 or Op1 is a sub instruction.
5137 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5138 A = nullptr;
5139 B = nullptr;
5140 C = nullptr;
5141 D = nullptr;
5142 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5143 A = BO0->getOperand(0);
5144 B = BO0->getOperand(1);
5145 }
5146 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5147 C = BO1->getOperand(0);
5148 D = BO1->getOperand(1);
5149 }
5150
5151 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5152 if (A == Op1 && NoOp0WrapProblem)
5153 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5154 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5155 if (C == Op0 && NoOp1WrapProblem)
5156 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5157
5158 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5159 // (A - B) u>/u<= A --> B u>/u<= A
5160 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5161 return new ICmpInst(Pred, B, A);
5162 // C u</u>= (C - D) --> C u</u>= D
5163 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5164 return new ICmpInst(Pred, C, D);
5165 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5166 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5167 isKnownNonZero(B, Q))
5169 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5170 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5171 isKnownNonZero(D, Q))
5173
5174 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5175 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5176 return new ICmpInst(Pred, A, C);
5177
5178 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5179 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5180 return new ICmpInst(Pred, D, B);
5181
5182 // icmp (0-X) < cst --> x > -cst
5183 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5184 Value *X;
5185 if (match(BO0, m_Neg(m_Value(X))))
5186 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5187 if (RHSC->isNotMinSignedValue())
5188 return new ICmpInst(I.getSwappedPredicate(), X,
5189 ConstantExpr::getNeg(RHSC));
5190 }
5191
5192 if (Instruction * R = foldICmpXorXX(I, Q, *this))
5193 return R;
5194 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5195 return R;
5196
5197 {
5198 // Try to remove shared multiplier from comparison:
5199 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z
5200 Value *X, *Y, *Z;
5201 if (Pred == ICmpInst::getUnsignedPredicate(Pred) &&
5202 ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5203 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5204 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5205 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))))) {
5206 bool NonZero;
5207 if (ICmpInst::isEquality(Pred)) {
5208 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5209 // if Z % 2 != 0
5210 // X * Z eq/ne Y * Z -> X eq/ne Y
5211 if (ZKnown.countMaxTrailingZeros() == 0)
5212 return new ICmpInst(Pred, X, Y);
5213 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5214 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5215 // X * Z eq/ne Y * Z -> X eq/ne Y
5216 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5217 return new ICmpInst(Pred, X, Y);
5218 } else
5219 NonZero = isKnownNonZero(Z, Q);
5220
5221 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5222 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5223 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5224 return new ICmpInst(Pred, X, Y);
5225 }
5226 }
5227
5228 BinaryOperator *SRem = nullptr;
5229 // icmp (srem X, Y), Y
5230 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5231 SRem = BO0;
5232 // icmp Y, (srem X, Y)
5233 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5234 Op0 == BO1->getOperand(1))
5235 SRem = BO1;
5236 if (SRem) {
5237 // We don't check hasOneUse to avoid increasing register pressure because
5238 // the value we use is the same value this instruction was already using.
5239 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5240 default:
5241 break;
5242 case ICmpInst::ICMP_EQ:
5243 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5244 case ICmpInst::ICMP_NE:
5245 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5246 case ICmpInst::ICMP_SGT:
5247 case ICmpInst::ICMP_SGE:
5248 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5250 case ICmpInst::ICMP_SLT:
5251 case ICmpInst::ICMP_SLE:
5252 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5254 }
5255 }
5256
5257 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5258 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5259 BO0->getOperand(1) == BO1->getOperand(1)) {
5260 switch (BO0->getOpcode()) {
5261 default:
5262 break;
5263 case Instruction::Add:
5264 case Instruction::Sub:
5265 case Instruction::Xor: {
5266 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5267 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5268
5269 const APInt *C;
5270 if (match(BO0->getOperand(1), m_APInt(C))) {
5271 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5272 if (C->isSignMask()) {
5273 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5274 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5275 }
5276
5277 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5278 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5279 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5280 NewPred = I.getSwappedPredicate(NewPred);
5281 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5282 }
5283 }
5284 break;
5285 }
5286 case Instruction::Mul: {
5287 if (!I.isEquality())
5288 break;
5289
5290 const APInt *C;
5291 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5292 !C->isOne()) {
5293 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5294 // Mask = -1 >> count-trailing-zeros(C).
5295 if (unsigned TZs = C->countr_zero()) {
5296 Constant *Mask = ConstantInt::get(
5297 BO0->getType(),
5298 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5299 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5300 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5301 return new ICmpInst(Pred, And1, And2);
5302 }
5303 }
5304 break;
5305 }
5306 case Instruction::UDiv:
5307 case Instruction::LShr:
5308 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5309 break;
5310 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5311
5312 case Instruction::SDiv:
5313 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5314 !BO0->isExact() || !BO1->isExact())
5315 break;
5316 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5317
5318 case Instruction::AShr:
5319 if (!BO0->isExact() || !BO1->isExact())
5320 break;
5321 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5322
5323 case Instruction::Shl: {
5324 bool NUW = Op0HasNUW && Op1HasNUW;
5325 bool NSW = Op0HasNSW && Op1HasNSW;
5326 if (!NUW && !NSW)
5327 break;
5328 if (!NSW && I.isSigned())
5329 break;
5330 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5331 }
5332 }
5333 }
5334
5335 if (BO0) {
5336 // Transform A & (L - 1) `ult` L --> L != 0
5337 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5338 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5339
5340 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5341 auto *Zero = Constant::getNullValue(BO0->getType());
5342 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5343 }
5344 }
5345
5346 // For unsigned predicates / eq / ne:
5347 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5348 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5349 if (!ICmpInst::isSigned(Pred)) {
5350 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5351 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5352 Constant::getNullValue(Op1->getType()));
5353 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5354 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5355 Constant::getNullValue(Op0->getType()), Op0);
5356 }
5357
5359 return replaceInstUsesWith(I, V);
5360
5361 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5362 return R;
5363
5365 return replaceInstUsesWith(I, V);
5366
5368 return replaceInstUsesWith(I, V);
5369
5370 return nullptr;
5371}
5372
5373/// Fold icmp Pred min|max(X, Y), Z.
5376 Value *Z,
5377 ICmpInst::Predicate Pred) {
5378 Value *X = MinMax->getLHS();
5379 Value *Y = MinMax->getRHS();
5380 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5381 return nullptr;
5382 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5383 // Revert the transform signed pred -> unsigned pred
5384 // TODO: We can flip the signedness of predicate if both operands of icmp
5385 // are negative.
5389 } else
5390 return nullptr;
5391 }
5393 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5394 if (!Val)
5395 return std::nullopt;
5396 if (match(Val, m_One()))
5397 return true;
5398 if (match(Val, m_Zero()))
5399 return false;
5400 return std::nullopt;
5401 };
5402 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5403 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5404 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5405 return nullptr;
5406 if (!CmpXZ.has_value()) {
5407 std::swap(X, Y);
5408 std::swap(CmpXZ, CmpYZ);
5409 }
5410
5411 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5412 if (CmpYZ.has_value())
5413 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5414 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5415 };
5416
5417 switch (Pred) {
5418 case ICmpInst::ICMP_EQ:
5419 case ICmpInst::ICMP_NE: {
5420 // If X == Z:
5421 // Expr Result
5422 // min(X, Y) == Z X <= Y
5423 // max(X, Y) == Z X >= Y
5424 // min(X, Y) != Z X > Y
5425 // max(X, Y) != Z X < Y
5426 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5427 ICmpInst::Predicate NewPred =
5428 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5429 if (Pred == ICmpInst::ICMP_NE)
5430 NewPred = ICmpInst::getInversePredicate(NewPred);
5431 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5432 }
5433 // Otherwise (X != Z):
5434 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5435 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5436 if (!MinMaxCmpXZ.has_value()) {
5437 std::swap(X, Y);
5438 std::swap(CmpXZ, CmpYZ);
5439 // Re-check pre-condition X != Z
5440 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5441 break;
5442 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5443 }
5444 if (!MinMaxCmpXZ.has_value())
5445 break;
5446 if (*MinMaxCmpXZ) {
5447 // Expr Fact Result
5448 // min(X, Y) == Z X < Z false
5449 // max(X, Y) == Z X > Z false
5450 // min(X, Y) != Z X < Z true
5451 // max(X, Y) != Z X > Z true
5452 return replaceInstUsesWith(
5453 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5454 } else {
5455 // Expr Fact Result
5456 // min(X, Y) == Z X > Z Y == Z
5457 // max(X, Y) == Z X < Z Y == Z
5458 // min(X, Y) != Z X > Z Y != Z
5459 // max(X, Y) != Z X < Z Y != Z
5460 return FoldIntoCmpYZ();
5461 }
5462 break;
5463 }
5464 case ICmpInst::ICMP_SLT:
5465 case ICmpInst::ICMP_ULT:
5466 case ICmpInst::ICMP_SLE:
5467 case ICmpInst::ICMP_ULE:
5468 case ICmpInst::ICMP_SGT:
5469 case ICmpInst::ICMP_UGT:
5470 case ICmpInst::ICMP_SGE:
5471 case ICmpInst::ICMP_UGE: {
5472 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5473 if (*CmpXZ) {
5474 if (IsSame) {
5475 // Expr Fact Result
5476 // min(X, Y) < Z X < Z true
5477 // min(X, Y) <= Z X <= Z true
5478 // max(X, Y) > Z X > Z true
5479 // max(X, Y) >= Z X >= Z true
5480 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5481 } else {
5482 // Expr Fact Result
5483 // max(X, Y) < Z X < Z Y < Z
5484 // max(X, Y) <= Z X <= Z Y <= Z
5485 // min(X, Y) > Z X > Z Y > Z
5486 // min(X, Y) >= Z X >= Z Y >= Z
5487 return FoldIntoCmpYZ();
5488 }
5489 } else {
5490 if (IsSame) {
5491 // Expr Fact Result
5492 // min(X, Y) < Z X >= Z Y < Z
5493 // min(X, Y) <= Z X > Z Y <= Z
5494 // max(X, Y) > Z X <= Z Y > Z
5495 // max(X, Y) >= Z X < Z Y >= Z
5496 return FoldIntoCmpYZ();
5497 } else {
5498 // Expr Fact Result
5499 // max(X, Y) < Z X >= Z false
5500 // max(X, Y) <= Z X > Z false
5501 // min(X, Y) > Z X <= Z false
5502 // min(X, Y) >= Z X < Z false
5503 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5504 }
5505 }
5506 break;
5507 }
5508 default:
5509 break;
5510 }
5511
5512 return nullptr;
5513}
5514
5515// Canonicalize checking for a power-of-2-or-zero value:
5517 InstCombiner::BuilderTy &Builder) {
5518 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5519 const CmpInst::Predicate Pred = I.getPredicate();
5520 Value *A = nullptr;
5521 bool CheckIs;
5522 if (I.isEquality()) {
5523 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5524 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5525 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5526 m_Deferred(A)))) ||
5527 !match(Op1, m_ZeroInt()))
5528 A = nullptr;
5529
5530 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5531 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5532 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5533 A = Op1;
5534 else if (match(Op1,
5536 A = Op0;
5537
5538 CheckIs = Pred == ICmpInst::ICMP_EQ;
5539 } else if (ICmpInst::isUnsigned(Pred)) {
5540 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5541 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5542
5543 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5545 m_Specific(Op1))))) {
5546 A = Op1;
5547 CheckIs = Pred == ICmpInst::ICMP_UGE;
5548 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5550 m_Specific(Op0))))) {
5551 A = Op0;
5552 CheckIs = Pred == ICmpInst::ICMP_ULE;
5553 }
5554 }
5555
5556 if (A) {
5557 Type *Ty = A->getType();
5558 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5559 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5560 ConstantInt::get(Ty, 2))
5561 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5562 ConstantInt::get(Ty, 1));
5563 }
5564
5565 return nullptr;
5566}
5567
5569 if (!I.isEquality())
5570 return nullptr;
5571
5572 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5573 const CmpInst::Predicate Pred = I.getPredicate();
5574 Value *A, *B, *C, *D;
5575 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5576 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5577 Value *OtherVal = A == Op1 ? B : A;
5578 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5579 }
5580
5581 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5582 // A^c1 == C^c2 --> A == C^(c1^c2)
5583 ConstantInt *C1, *C2;
5584 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5585 Op1->hasOneUse()) {
5586 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5588 return new ICmpInst(Pred, A, Xor);
5589 }
5590
5591 // A^B == A^D -> B == D
5592 if (A == C)
5593 return new ICmpInst(Pred, B, D);
5594 if (A == D)
5595 return new ICmpInst(Pred, B, C);
5596 if (B == C)
5597 return new ICmpInst(Pred, A, D);
5598 if (B == D)
5599 return new ICmpInst(Pred, A, C);
5600 }
5601 }
5602
5603 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5604 // A == (A^B) -> B == 0
5605 Value *OtherVal = A == Op0 ? B : A;
5606 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5607 }
5608
5609 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
5610 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
5611 match(Op1, m_And(m_Value(C), m_Value(D)))) {
5612 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
5613
5614 if (A == C) {
5615 X = B;
5616 Y = D;
5617 Z = A;
5618 } else if (A == D) {
5619 X = B;
5620 Y = C;
5621 Z = A;
5622 } else if (B == C) {
5623 X = A;
5624 Y = D;
5625 Z = B;
5626 } else if (B == D) {
5627 X = A;
5628 Y = C;
5629 Z = B;
5630 }
5631
5632 if (X) {
5633 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
5634 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
5635 // instructions.
5636 const APInt *C0, *C1;
5637 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
5638 (*C0 ^ *C1).isNegatedPowerOf2();
5639
5640 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
5641 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
5642 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
5643 int UseCnt =
5644 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
5645 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
5646 if (XorIsNegP2 || UseCnt >= 2) {
5647 // Build (X^Y) & Z
5648 Op1 = Builder.CreateXor(X, Y);
5649 Op1 = Builder.CreateAnd(Op1, Z);
5650 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
5651 }
5652 }
5653 }
5654
5655 {
5656 // Similar to above, but specialized for constant because invert is needed:
5657 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
5658 Value *X, *Y;
5659 Constant *C;
5660 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
5661 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
5664 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
5665 }
5666 }
5667
5668 if (match(Op1, m_ZExt(m_Value(A))) &&
5669 (Op0->hasOneUse() || Op1->hasOneUse())) {
5670 // (B & (Pow2C-1)) == zext A --> A == trunc B
5671 // (B & (Pow2C-1)) != zext A --> A != trunc B
5672 const APInt *MaskC;
5673 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
5674 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
5675 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
5676 }
5677
5678 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
5679 // For lshr and ashr pairs.
5680 const APInt *AP1, *AP2;
5681 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5682 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
5683 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5684 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
5685 if (AP1 != AP2)
5686 return nullptr;
5687 unsigned TypeBits = AP1->getBitWidth();
5688 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
5689 if (ShAmt < TypeBits && ShAmt != 0) {
5690 ICmpInst::Predicate NewPred =
5692 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5693 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
5694 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
5695 }
5696 }
5697
5698 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
5699 ConstantInt *Cst1;
5700 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
5701 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
5702 unsigned TypeBits = Cst1->getBitWidth();
5703 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
5704 if (ShAmt < TypeBits && ShAmt != 0) {
5705 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5706 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
5708 I.getName() + ".mask");
5709 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
5710 }
5711 }
5712
5713 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
5714 // "icmp (and X, mask), cst"
5715 uint64_t ShAmt = 0;
5716 if (Op0->hasOneUse() &&
5717 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
5718 match(Op1, m_ConstantInt(Cst1)) &&
5719 // Only do this when A has multiple uses. This is most important to do
5720 // when it exposes other optimizations.
5721 !A->hasOneUse()) {
5722 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
5723
5724 if (ShAmt < ASize) {
5725 APInt MaskV =
5727 MaskV <<= ShAmt;
5728
5729 APInt CmpV = Cst1->getValue().zext(ASize);
5730 CmpV <<= ShAmt;
5731
5732 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
5733 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
5734 }
5735 }
5736
5738 return ICmp;
5739
5740 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks the
5741 // top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s INT_MAX",
5742 // which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a few steps
5743 // of instcombine.
5744 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
5745 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
5747 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
5748 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
5750 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
5751 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
5753 Add, ConstantInt::get(A->getType(), C.shl(1)));
5754 }
5755
5756 // Canonicalize:
5757 // Assume B_Pow2 != 0
5758 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
5759 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
5760 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
5761 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, 0, &I))
5762 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
5764
5765 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
5766 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, 0, &I))
5767 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
5768 ConstantInt::getNullValue(Op1->getType()));
5769
5770 // Canonicalize:
5771 // icmp eq/ne X, OneUse(rotate-right(X))
5772 // -> icmp eq/ne X, rotate-left(X)
5773 // We generally try to convert rotate-right -> rotate-left, this just
5774 // canonicalizes another case.
5775 CmpInst::Predicate PredUnused = Pred;
5776 if (match(&I, m_c_ICmp(PredUnused, m_Value(A),
5777 m_OneUse(m_Intrinsic<Intrinsic::fshr>(
5778 m_Deferred(A), m_Deferred(A), m_Value(B))))))
5779 return new ICmpInst(
5780 Pred, A,
5781 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
5782
5783 // Canonicalize:
5784 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
5785 Constant *Cst;
5786 if (match(&I, m_c_ICmp(PredUnused,
5789 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
5790
5791 {
5792 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5793 auto m_Matcher =
5796 m_Sub(m_Value(B), m_Deferred(A)));
5797 std::optional<bool> IsZero = std::nullopt;
5798 if (match(&I, m_c_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5799 m_Deferred(A))))
5800 IsZero = false;
5801 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5802 else if (match(&I,
5803 m_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5804 m_Zero())))
5805 IsZero = true;
5806
5807 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, /*Depth*/ 0, &I))
5808 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5809 // -> (icmp eq/ne (and X, P2), 0)
5810 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5811 // -> (icmp eq/ne (and X, P2), P2)
5812 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
5813 *IsZero ? A
5814 : ConstantInt::getNullValue(A->getType()));
5815 }
5816
5817 return nullptr;
5818}
5819
5821 ICmpInst::Predicate Pred = ICmp.getPredicate();
5822 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
5823
5824 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
5825 // The trunc masks high bits while the compare may effectively mask low bits.
5826 Value *X;
5827 const APInt *C;
5828 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
5829 return nullptr;
5830
5831 // This matches patterns corresponding to tests of the signbit as well as:
5832 // (trunc X) u< C --> (X & -C) == 0 (are all masked-high-bits clear?)
5833 // (trunc X) u> C --> (X & ~C) != 0 (are any masked-high-bits set?)
5834 APInt Mask;
5835 if (decomposeBitTestICmp(Op0, Op1, Pred, X, Mask, true /* WithTrunc */)) {
5836 Value *And = Builder.CreateAnd(X, Mask);
5837 Constant *Zero = ConstantInt::getNullValue(X->getType());
5838 return new ICmpInst(Pred, And, Zero);
5839 }
5840
5841 unsigned SrcBits = X->getType()->getScalarSizeInBits();
5842 if (Pred == ICmpInst::ICMP_ULT && C->isNegatedPowerOf2()) {
5843 // If C is a negative power-of-2 (high-bit mask):
5844 // (trunc X) u< C --> (X & C) != C (are any masked-high-bits clear?)
5845 Constant *MaskC = ConstantInt::get(X->getType(), C->zext(SrcBits));
5846 Value *And = Builder.CreateAnd(X, MaskC);
5847 return new ICmpInst(ICmpInst::ICMP_NE, And, MaskC);
5848 }
5849
5850 if (Pred == ICmpInst::ICMP_UGT && (~*C).isPowerOf2()) {
5851 // If C is not-of-power-of-2 (one clear bit):
5852 // (trunc X) u> C --> (X & (C+1)) == C+1 (are all masked-high-bits set?)
5853 Constant *MaskC = ConstantInt::get(X->getType(), (*C + 1).zext(SrcBits));
5854 Value *And = Builder.CreateAnd(X, MaskC);
5855 return new ICmpInst(ICmpInst::ICMP_EQ, And, MaskC);
5856 }
5857
5858 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
5859 if (II->getIntrinsicID() == Intrinsic::cttz ||
5860 II->getIntrinsicID() == Intrinsic::ctlz) {
5861 unsigned MaxRet = SrcBits;
5862 // If the "is_zero_poison" argument is set, then we know at least
5863 // one bit is set in the input, so the result is always at least one
5864 // less than the full bitwidth of that input.
5865 if (match(II->getArgOperand(1), m_One()))
5866 MaxRet--;
5867
5868 // Make sure the destination is wide enough to hold the largest output of
5869 // the intrinsic.
5870 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
5871 if (Instruction *I =
5872 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
5873 return I;
5874 }
5875 }
5876
5877 return nullptr;
5878}
5879
5881 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
5882 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
5883 Value *X;
5884 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
5885 return nullptr;
5886
5887 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
5888 bool IsSignedCmp = ICmp.isSigned();
5889
5890 // icmp Pred (ext X), (ext Y)
5891 Value *Y;
5892 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
5893 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
5894 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
5895
5896 if (IsZext0 != IsZext1) {
5897 // If X and Y and both i1
5898 // (icmp eq/ne (zext X) (sext Y))
5899 // eq -> (icmp eq (or X, Y), 0)
5900 // ne -> (icmp ne (or X, Y), 0)
5901 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
5902 Y->getType()->isIntOrIntVectorTy(1))
5903 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
5904 Constant::getNullValue(X->getType()));
5905
5906 // If we have mismatched casts and zext has the nneg flag, we can
5907 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
5908
5909 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
5910 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
5911
5912 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
5913 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
5914
5915 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
5916 IsSignedExt = true;
5917 else
5918 return nullptr;
5919 }
5920
5921 // Not an extension from the same type?
5922 Type *XTy = X->getType(), *YTy = Y->getType();
5923 if (XTy != YTy) {
5924 // One of the casts must have one use because we are creating a new cast.
5925 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
5926 return nullptr;
5927 // Extend the narrower operand to the type of the wider operand.
5928 CastInst::CastOps CastOpcode =
5929 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
5930 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
5931 X = Builder.CreateCast(CastOpcode, X, YTy);
5932 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
5933 Y = Builder.CreateCast(CastOpcode, Y, XTy);
5934 else
5935 return nullptr;
5936 }
5937
5938 // (zext X) == (zext Y) --> X == Y
5939 // (sext X) == (sext Y) --> X == Y
5940 if (ICmp.isEquality())
5941 return new ICmpInst(ICmp.getPredicate(), X, Y);
5942
5943 // A signed comparison of sign extended values simplifies into a
5944 // signed comparison.
5945 if (IsSignedCmp && IsSignedExt)
5946 return new ICmpInst(ICmp.getPredicate(), X, Y);
5947
5948 // The other three cases all fold into an unsigned comparison.
5949 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
5950 }
5951
5952 // Below here, we are only folding a compare with constant.
5953 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
5954 if (!C)
5955 return nullptr;
5956
5957 // If a lossless truncate is possible...
5958 Type *SrcTy = CastOp0->getSrcTy();
5959 Constant *Res = getLosslessTrunc(C, SrcTy, CastOp0->getOpcode());
5960 if (Res) {
5961 if (ICmp.isEquality())
5962 return new ICmpInst(ICmp.getPredicate(), X, Res);
5963
5964 // A signed comparison of sign extended values simplifies into a
5965 // signed comparison.
5966 if (IsSignedExt && IsSignedCmp)
5967 return new ICmpInst(ICmp.getPredicate(), X, Res);
5968
5969 // The other three cases all fold into an unsigned comparison.
5970 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
5971 }
5972
5973 // The re-extended constant changed, partly changed (in the case of a vector),
5974 // or could not be determined to be equal (in the case of a constant
5975 // expression), so the constant cannot be represented in the shorter type.
5976 // All the cases that fold to true or false will have already been handled
5977 // by simplifyICmpInst, so only deal with the tricky case.
5978 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
5979 return nullptr;
5980
5981 // Is source op positive?
5982 // icmp ult (sext X), C --> icmp sgt X, -1
5983 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
5985
5986 // Is source op negative?
5987 // icmp ugt (sext X), C --> icmp slt X, 0
5988 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
5990}
5991
5992/// Handle icmp (cast x), (cast or constant).
5994 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
5995 // icmp compares only pointer's value.
5996 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
5997 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
5998 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
5999 if (SimplifiedOp0 || SimplifiedOp1)
6000 return new ICmpInst(ICmp.getPredicate(),
6001 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6002 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6003
6004 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6005 if (!CastOp0)
6006 return nullptr;
6007 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6008 return nullptr;
6009
6010 Value *Op0Src = CastOp0->getOperand(0);
6011 Type *SrcTy = CastOp0->getSrcTy();
6012 Type *DestTy = CastOp0->getDestTy();
6013
6014 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6015 // integer type is the same size as the pointer type.
6016 auto CompatibleSizes = [&](Type *SrcTy, Type *DestTy) {
6017 if (isa<VectorType>(SrcTy)) {
6018 SrcTy = cast<VectorType>(SrcTy)->getElementType();
6019 DestTy = cast<VectorType>(DestTy)->getElementType();
6020 }
6021 return DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth();
6022 };
6023 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6024 CompatibleSizes(SrcTy, DestTy)) {
6025 Value *NewOp1 = nullptr;
6026 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6027 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6028 if (PtrSrc->getType() == Op0Src->getType())
6029 NewOp1 = PtrToIntOp1->getOperand(0);
6030 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6031 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6032 }
6033
6034 if (NewOp1)
6035 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6036 }
6037
6038 if (Instruction *R = foldICmpWithTrunc(ICmp))
6039 return R;
6040
6041 return foldICmpWithZextOrSext(ICmp);
6042}
6043
6044static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
6045 switch (BinaryOp) {
6046 default:
6047 llvm_unreachable("Unsupported binary op");
6048 case Instruction::Add:
6049 case Instruction::Sub:
6050 return match(RHS, m_Zero());
6051 case Instruction::Mul:
6052 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6053 match(RHS, m_One());
6054 }
6055}
6056
6059 bool IsSigned, Value *LHS, Value *RHS,
6060 Instruction *CxtI) const {
6061 switch (BinaryOp) {
6062 default:
6063 llvm_unreachable("Unsupported binary op");
6064 case Instruction::Add:
6065 if (IsSigned)
6066 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6067 else
6068 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6069 case Instruction::Sub:
6070 if (IsSigned)
6071 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6072 else
6073 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6074 case Instruction::Mul:
6075 if (IsSigned)
6076 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6077 else
6078 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6079 }
6080}
6081
6082bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6083 bool IsSigned, Value *LHS,
6084 Value *RHS, Instruction &OrigI,
6085 Value *&Result,
6086 Constant *&Overflow) {
6087 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6088 std::swap(LHS, RHS);
6089
6090 // If the overflow check was an add followed by a compare, the insertion point
6091 // may be pointing to the compare. We want to insert the new instructions
6092 // before the add in case there are uses of the add between the add and the
6093 // compare.
6094 Builder.SetInsertPoint(&OrigI);
6095
6096 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6097 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6098 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6099
6100 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6101 Result = LHS;
6102 Overflow = ConstantInt::getFalse(OverflowTy);
6103 return true;
6104 }
6105
6106 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6108 return false;
6111 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6112 Result->takeName(&OrigI);
6113 Overflow = ConstantInt::getTrue(OverflowTy);
6114 return true;
6116 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6117 Result->takeName(&OrigI);
6118 Overflow = ConstantInt::getFalse(OverflowTy);
6119 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6120 if (IsSigned)
6121 Inst->setHasNoSignedWrap();
6122 else
6123 Inst->setHasNoUnsignedWrap();
6124 }
6125 return true;
6126 }
6127
6128 llvm_unreachable("Unexpected overflow result");
6129}
6130
6131/// Recognize and process idiom involving test for multiplication
6132/// overflow.
6133///
6134/// The caller has matched a pattern of the form:
6135/// I = cmp u (mul(zext A, zext B), V
6136/// The function checks if this is a test for overflow and if so replaces
6137/// multiplication with call to 'mul.with.overflow' intrinsic.
6138///
6139/// \param I Compare instruction.
6140/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6141/// the compare instruction. Must be of integer type.
6142/// \param OtherVal The other argument of compare instruction.
6143/// \returns Instruction which must replace the compare instruction, NULL if no
6144/// replacement required.
6146 const APInt *OtherVal,
6147 InstCombinerImpl &IC) {
6148 // Don't bother doing this transformation for pointers, don't do it for
6149 // vectors.
6150 if (!isa<IntegerType>(MulVal->getType()))
6151 return nullptr;
6152
6153 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6154 if (!MulInstr)
6155 return nullptr;
6156 assert(MulInstr->getOpcode() == Instruction::Mul);
6157
6158 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6159 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6160 assert(LHS->getOpcode() == Instruction::ZExt);
6161 assert(RHS->getOpcode() == Instruction::ZExt);
6162 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6163
6164 // Calculate type and width of the result produced by mul.with.overflow.
6165 Type *TyA = A->getType(), *TyB = B->getType();
6166 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6167 WidthB = TyB->getPrimitiveSizeInBits();
6168 unsigned MulWidth;
6169 Type *MulType;
6170 if (WidthB > WidthA) {
6171 MulWidth = WidthB;
6172 MulType = TyB;
6173 } else {
6174 MulWidth = WidthA;
6175 MulType = TyA;
6176 }
6177
6178 // In order to replace the original mul with a narrower mul.with.overflow,
6179 // all uses must ignore upper bits of the product. The number of used low
6180 // bits must be not greater than the width of mul.with.overflow.
6181 if (MulVal->hasNUsesOrMore(2))
6182 for (User *U : MulVal->users()) {
6183 if (U == &I)
6184 continue;
6185 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6186 // Check if truncation ignores bits above MulWidth.
6187 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6188 if (TruncWidth > MulWidth)
6189 return nullptr;
6190 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6191 // Check if AND ignores bits above MulWidth.
6192 if (BO->getOpcode() != Instruction::And)
6193 return nullptr;
6194 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6195 const APInt &CVal = CI->getValue();
6196 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6197 return nullptr;
6198 } else {
6199 // In this case we could have the operand of the binary operation
6200 // being defined in another block, and performing the replacement
6201 // could break the dominance relation.
6202 return nullptr;
6203 }
6204 } else {
6205 // Other uses prohibit this transformation.
6206 return nullptr;
6207 }
6208 }
6209
6210 // Recognize patterns
6211 switch (I.getPredicate()) {
6212 case ICmpInst::ICMP_UGT: {
6213 // Recognize pattern:
6214 // mulval = mul(zext A, zext B)
6215 // cmp ugt mulval, max
6216 APInt MaxVal = APInt::getMaxValue(MulWidth);
6217 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6218 if (MaxVal.eq(*OtherVal))
6219 break; // Recognized
6220 return nullptr;
6221 }
6222
6223 case ICmpInst::ICMP_ULT: {
6224 // Recognize pattern:
6225 // mulval = mul(zext A, zext B)
6226 // cmp ule mulval, max + 1
6227 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6228 if (MaxVal.eq(*OtherVal))
6229 break; // Recognized
6230 return nullptr;
6231 }
6232
6233 default:
6234 return nullptr;
6235 }
6236
6237 InstCombiner::BuilderTy &Builder = IC.Builder;
6238 Builder.SetInsertPoint(MulInstr);
6239
6240 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6241 Value *MulA = A, *MulB = B;
6242 if (WidthA < MulWidth)
6243 MulA = Builder.CreateZExt(A, MulType);
6244 if (WidthB < MulWidth)
6245 MulB = Builder.CreateZExt(B, MulType);
6247 I.getModule(), Intrinsic::umul_with_overflow, MulType);
6248 CallInst *Call = Builder.CreateCall(F, {MulA, MulB}, "umul");
6249 IC.addToWorklist(MulInstr);
6250
6251 // If there are uses of mul result other than the comparison, we know that
6252 // they are truncation or binary AND. Change them to use result of
6253 // mul.with.overflow and adjust properly mask/size.
6254 if (MulVal->hasNUsesOrMore(2)) {
6255 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6256 for (User *U : make_early_inc_range(MulVal->users())) {
6257 if (U == &I)
6258 continue;
6259 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6260 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6261 IC.replaceInstUsesWith(*TI, Mul);
6262 else
6263 TI->setOperand(0, Mul);
6264 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6265 assert(BO->getOpcode() == Instruction::And);
6266 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6267 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6268 APInt ShortMask = CI->getValue().trunc(MulWidth);
6269 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6270 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6271 IC.replaceInstUsesWith(*BO, Zext);
6272 } else {
6273 llvm_unreachable("Unexpected Binary operation");
6274 }
6275 IC.addToWorklist(cast<Instruction>(U));
6276 }
6277 }
6278
6279 // The original icmp gets replaced with the overflow value, maybe inverted
6280 // depending on predicate.
6281 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6282 Value *Res = Builder.CreateExtractValue(Call, 1);
6283 return BinaryOperator::CreateNot(Res);
6284 }
6285
6286 return ExtractValueInst::Create(Call, 1);
6287}
6288
6289/// When performing a comparison against a constant, it is possible that not all
6290/// the bits in the LHS are demanded. This helper method computes the mask that
6291/// IS demanded.
6293 const APInt *RHS;
6294 if (!match(I.getOperand(1), m_APInt(RHS)))
6296
6297 // If this is a normal comparison, it demands all bits. If it is a sign bit
6298 // comparison, it only demands the sign bit.
6299 bool UnusedBit;
6300 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6302
6303 switch (I.getPredicate()) {
6304 // For a UGT comparison, we don't care about any bits that
6305 // correspond to the trailing ones of the comparand. The value of these
6306 // bits doesn't impact the outcome of the comparison, because any value
6307 // greater than the RHS must differ in a bit higher than these due to carry.
6308 case ICmpInst::ICMP_UGT:
6309 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6310
6311 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6312 // Any value less than the RHS must differ in a higher bit because of carries.
6313 case ICmpInst::ICMP_ULT:
6314 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6315
6316 default:
6318 }
6319}
6320
6321/// Check that one use is in the same block as the definition and all
6322/// other uses are in blocks dominated by a given block.
6323///
6324/// \param DI Definition
6325/// \param UI Use
6326/// \param DB Block that must dominate all uses of \p DI outside
6327/// the parent block
6328/// \return true when \p UI is the only use of \p DI in the parent block
6329/// and all other uses of \p DI are in blocks dominated by \p DB.
6330///
6332 const Instruction *UI,
6333 const BasicBlock *DB) const {
6334 assert(DI && UI && "Instruction not defined\n");
6335 // Ignore incomplete definitions.
6336 if (!DI->getParent())
6337 return false;
6338 // DI and UI must be in the same block.
6339 if (DI->getParent() != UI->getParent())
6340 return false;
6341 // Protect from self-referencing blocks.
6342 if (DI->getParent() == DB)
6343 return false;
6344 for (const User *U : DI->users()) {
6345 auto *Usr = cast<Instruction>(U);
6346 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6347 return false;
6348 }
6349 return true;
6350}
6351
6352/// Return true when the instruction sequence within a block is select-cmp-br.
6353static bool isChainSelectCmpBranch(const SelectInst *SI) {
6354 const BasicBlock *BB = SI->getParent();
6355 if (!BB)
6356 return false;
6357 auto *BI = dyn_cast_or_null<BranchInst>(BB->getTerminator());
6358 if (!BI || BI->getNumSuccessors() != 2)
6359 return false;
6360 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6361 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6362 return false;
6363 return true;
6364}
6365
6366/// True when a select result is replaced by one of its operands
6367/// in select-icmp sequence. This will eventually result in the elimination
6368/// of the select.
6369///
6370/// \param SI Select instruction
6371/// \param Icmp Compare instruction
6372/// \param SIOpd Operand that replaces the select
6373///
6374/// Notes:
6375/// - The replacement is global and requires dominator information
6376/// - The caller is responsible for the actual replacement
6377///
6378/// Example:
6379///
6380/// entry:
6381/// %4 = select i1 %3, %C* %0, %C* null
6382/// %5 = icmp eq %C* %4, null
6383/// br i1 %5, label %9, label %7
6384/// ...
6385/// ; <label>:7 ; preds = %entry
6386/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6387/// ...
6388///
6389/// can be transformed to
6390///
6391/// %5 = icmp eq %C* %0, null
6392/// %6 = select i1 %3, i1 %5, i1 true
6393/// br i1 %6, label %9, label %7
6394/// ...
6395/// ; <label>:7 ; preds = %entry
6396/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6397///
6398/// Similar when the first operand of the select is a constant or/and
6399/// the compare is for not equal rather than equal.
6400///
6401/// NOTE: The function is only called when the select and compare constants
6402/// are equal, the optimization can work only for EQ predicates. This is not a
6403/// major restriction since a NE compare should be 'normalized' to an equal
6404/// compare, which usually happens in the combiner and test case
6405/// select-cmp-br.ll checks for it.
6407 const ICmpInst *Icmp,
6408 const unsigned SIOpd) {
6409 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6411 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6412 // The check for the single predecessor is not the best that can be
6413 // done. But it protects efficiently against cases like when SI's
6414 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6415 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6416 // replaced can be reached on either path. So the uniqueness check
6417 // guarantees that the path all uses of SI (outside SI's parent) are on
6418 // is disjoint from all other paths out of SI. But that information
6419 // is more expensive to compute, and the trade-off here is in favor
6420 // of compile-time. It should also be noticed that we check for a single
6421 // predecessor and not only uniqueness. This to handle the situation when
6422 // Succ and Succ1 points to the same basic block.
6423 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6424 NumSel++;
6425 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6426 return true;
6427 }
6428 }
6429 return false;
6430}
6431
6432/// Try to fold the comparison based on range information we can get by checking
6433/// whether bits are known to be zero or one in the inputs.
6435 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6436 Type *Ty = Op0->getType();
6437 ICmpInst::Predicate Pred = I.getPredicate();
6438
6439 // Get scalar or pointer size.
6440 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6441 ? Ty->getScalarSizeInBits()
6443
6444 if (!BitWidth)
6445 return nullptr;
6446
6447 KnownBits Op0Known(BitWidth);
6448 KnownBits Op1Known(BitWidth);
6449
6450 {
6451 // Don't use dominating conditions when folding icmp using known bits. This
6452 // may convert signed into unsigned predicates in ways that other passes
6453 // (especially IndVarSimplify) may not be able to reliably undo.
6454 SQ.DC = nullptr;
6455 auto _ = make_scope_exit([&]() { SQ.DC = &DC; });
6457 Op0Known, 0))
6458 return &I;
6459
6460 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, 0))
6461 return &I;
6462 }
6463
6464 // Given the known and unknown bits, compute a range that the LHS could be
6465 // in. Compute the Min, Max and RHS values based on the known bits. For the
6466 // EQ and NE we use unsigned values.
6467 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6468 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6469 if (I.isSigned()) {
6470 Op0Min = Op0Known.getSignedMinValue();
6471 Op0Max = Op0Known.getSignedMaxValue();
6472 Op1Min = Op1Known.getSignedMinValue();
6473 Op1Max = Op1Known.getSignedMaxValue();
6474 } else {
6475 Op0Min = Op0Known.getMinValue();
6476 Op0Max = Op0Known.getMaxValue();
6477 Op1Min = Op1Known.getMinValue();
6478 Op1Max = Op1Known.getMaxValue();
6479 }
6480
6481 // If Min and Max are known to be the same, then SimplifyDemandedBits figured
6482 // out that the LHS or RHS is a constant. Constant fold this now, so that
6483 // code below can assume that Min != Max.
6484 if (!isa<Constant>(Op0) && Op0Min == Op0Max)
6485 return new ICmpInst(Pred, ConstantExpr::getIntegerValue(Ty, Op0Min), Op1);
6486 if (!isa<Constant>(Op1) && Op1Min == Op1Max)
6487 return new ICmpInst(Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Min));
6488
6489 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6490 // min/max canonical compare with some other compare. That could lead to
6491 // conflict with select canonicalization and infinite looping.
6492 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6493 auto isMinMaxCmp = [&](Instruction &Cmp) {
6494 if (!Cmp.hasOneUse())
6495 return false;
6496 Value *A, *B;
6497 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6499 return false;
6500 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6501 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6502 };
6503 if (!isMinMaxCmp(I)) {
6504 switch (Pred) {
6505 default:
6506 break;
6507 case ICmpInst::ICMP_ULT: {
6508 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6509 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6510 const APInt *CmpC;
6511 if (match(Op1, m_APInt(CmpC))) {
6512 // A <u C -> A == C-1 if min(A)+1 == C
6513 if (*CmpC == Op0Min + 1)
6514 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6515 ConstantInt::get(Op1->getType(), *CmpC - 1));
6516 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6517 // exceeds the log2 of C.
6518 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6519 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6520 Constant::getNullValue(Op1->getType()));
6521 }
6522 break;
6523 }
6524 case ICmpInst::ICMP_UGT: {
6525 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6526 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6527 const APInt *CmpC;
6528 if (match(Op1, m_APInt(CmpC))) {
6529 // A >u C -> A == C+1 if max(a)-1 == C
6530 if (*CmpC == Op0Max - 1)
6531 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6532 ConstantInt::get(Op1->getType(), *CmpC + 1));
6533 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6534 // exceeds the log2 of C.
6535 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6536 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6537 Constant::getNullValue(Op1->getType()));
6538 }
6539 break;
6540 }
6541 case ICmpInst::ICMP_SLT: {
6542 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6543 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6544 const APInt *CmpC;
6545 if (match(Op1, m_APInt(CmpC))) {
6546 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6547 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6548 ConstantInt::get(Op1->getType(), *CmpC - 1));
6549 }
6550 break;
6551 }
6552 case ICmpInst::ICMP_SGT: {
6553 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6554 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6555 const APInt *CmpC;
6556 if (match(Op1, m_APInt(CmpC))) {
6557 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6558 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6559 ConstantInt::get(Op1->getType(), *CmpC + 1));
6560 }
6561 break;
6562 }
6563 }
6564 }
6565
6566 // Based on the range information we know about the LHS, see if we can
6567 // simplify this comparison. For example, (x&4) < 8 is always true.
6568 switch (Pred) {
6569 default:
6570 llvm_unreachable("Unknown icmp opcode!");
6571 case ICmpInst::ICMP_EQ:
6572 case ICmpInst::ICMP_NE: {
6573 if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
6574 return replaceInstUsesWith(
6575 I, ConstantInt::getBool(I.getType(), Pred == CmpInst::ICMP_NE));
6576
6577 // If all bits are known zero except for one, then we know at most one bit
6578 // is set. If the comparison is against zero, then this is a check to see if
6579 // *that* bit is set.
6580 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6581 if (Op1Known.isZero()) {
6582 // If the LHS is an AND with the same constant, look through it.
6583 Value *LHS = nullptr;
6584 const APInt *LHSC;
6585 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6586 *LHSC != Op0KnownZeroInverted)
6587 LHS = Op0;
6588
6589 Value *X;
6590 const APInt *C1;
6591 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6592 Type *XTy = X->getType();
6593 unsigned Log2C1 = C1->countr_zero();
6594 APInt C2 = Op0KnownZeroInverted;
6595 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6596 if (C2Pow2.isPowerOf2()) {
6597 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6598 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6599 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6600 unsigned Log2C2 = C2Pow2.countr_zero();
6601 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6602 auto NewPred =
6604 return new ICmpInst(NewPred, X, CmpC);
6605 }
6606 }
6607 }
6608
6609 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6610 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
6611 (Op0Known & Op1Known) == Op0Known)
6612 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6613 ConstantInt::getNullValue(Op1->getType()));
6614 break;
6615 }
6616 case ICmpInst::ICMP_ULT: {
6617 if (Op0Max.ult(Op1Min)) // A <u B -> true if max(A) < min(B)
6618 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6619 if (Op0Min.uge(Op1Max)) // A <u B -> false if min(A) >= max(B)
6620 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6621 break;
6622 }
6623 case ICmpInst::ICMP_UGT: {
6624 if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B)
6625 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6626 if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B)
6627 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6628 break;
6629 }
6630 case ICmpInst::ICMP_SLT: {
6631 if (Op0Max.slt(Op1Min)) // A <s B -> true if max(A) < min(C)
6632 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6633 if (Op0Min.sge(Op1Max)) // A <s B -> false if min(A) >= max(C)
6634 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6635 break;
6636 }
6637 case ICmpInst::ICMP_SGT: {
6638 if (Op0Min.sgt(Op1Max)) // A >s B -> true if min(A) > max(B)
6639 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6640 if (Op0Max.sle(Op1Min)) // A >s B -> false if max(A) <= min(B)
6641 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6642 break;
6643 }
6644 case ICmpInst::ICMP_SGE:
6645 assert(!isa<ConstantInt>(Op1) && "ICMP_SGE with ConstantInt not folded!");
6646 if (Op0Min.sge(Op1Max)) // A >=s B -> true if min(A) >= max(B)
6647 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6648 if (Op0Max.slt(Op1Min)) // A >=s B -> false if max(A) < min(B)
6649 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6650 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
6651 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6652 break;
6653 case ICmpInst::ICMP_SLE:
6654 assert(!isa<ConstantInt>(Op1) && "ICMP_SLE with ConstantInt not folded!");
6655 if (Op0Max.sle(Op1Min)) // A <=s B -> true if max(A) <= min(B)
6656 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6657 if (Op0Min.sgt(Op1Max)) // A <=s B -> false if min(A) > max(B)
6658 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6659 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
6660 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6661 break;
6662 case ICmpInst::ICMP_UGE:
6663 assert(!isa<ConstantInt>(Op1) && "ICMP_UGE with ConstantInt not folded!");
6664 if (Op0Min.uge(Op1Max)) // A >=u B -> true if min(A) >= max(B)
6665 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6666 if (Op0Max.ult(Op1Min)) // A >=u B -> false if max(A) < min(B)
6667 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6668 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
6669 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6670 break;
6671 case ICmpInst::ICMP_ULE:
6672 assert(!isa<ConstantInt>(Op1) && "ICMP_ULE with ConstantInt not folded!");
6673 if (Op0Max.ule(Op1Min)) // A <=u B -> true if max(A) <= min(B)
6674 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6675 if (Op0Min.ugt(Op1Max)) // A <=u B -> false if min(A) > max(B)
6676 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6677 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
6678 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6679 break;
6680 }
6681
6682 // Turn a signed comparison into an unsigned one if both operands are known to
6683 // have the same sign.
6684 if (I.isSigned() &&
6685 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6686 (Op0Known.One.isNegative() && Op1Known.One.isNegative())))
6687 return new ICmpInst(I.getUnsignedPredicate(), Op0, Op1);
6688
6689 return nullptr;
6690}
6691
6692/// If one operand of an icmp is effectively a bool (value range of {0,1}),
6693/// then try to reduce patterns based on that limit.
6695 Value *X, *Y;
6697
6698 // X must be 0 and bool must be true for "ULT":
6699 // X <u (zext i1 Y) --> (X == 0) & Y
6700 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
6701 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
6702 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
6703
6704 // X must be 0 or bool must be true for "ULE":
6705 // X <=u (sext i1 Y) --> (X == 0) | Y
6706 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
6707 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
6708 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
6709
6710 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
6711 ICmpInst::Predicate Pred1, Pred2;
6712 const APInt *C;
6713 Instruction *ExtI;
6714 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
6717 m_APInt(C)))))) &&
6718 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
6719 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
6720 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
6721 auto CreateRangeCheck = [&] {
6722 Value *CmpV1 =
6723 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
6724 Value *CmpV2 = Builder.CreateICmp(
6725 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
6727 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
6728 CmpV1, CmpV2);
6729 };
6730 if (C->isZero()) {
6731 if (Pred2 == ICmpInst::ICMP_EQ) {
6732 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
6733 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
6734 return replaceInstUsesWith(
6735 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6736 } else if (!IsSExt || HasOneUse) {
6737 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
6738 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
6739 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
6740 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X == -1
6741 return CreateRangeCheck();
6742 }
6743 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
6744 if (Pred2 == ICmpInst::ICMP_NE) {
6745 // icmp eq X, (zext (icmp ne X, 1)) --> false
6746 // icmp ne X, (zext (icmp ne X, 1)) --> true
6747 // icmp eq X, (sext (icmp ne X, -1)) --> false
6748 // icmp ne X, (sext (icmp ne X, -1)) --> true
6749 return replaceInstUsesWith(
6750 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6751 } else if (!IsSExt || HasOneUse) {
6752 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
6753 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
6754 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
6755 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
6756 return CreateRangeCheck();
6757 }
6758 } else {
6759 // when C != 0 && C != 1:
6760 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
6761 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
6762 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
6763 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
6764 // when C != 0 && C != -1:
6765 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
6766 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
6767 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
6768 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
6769 return ICmpInst::Create(
6770 Instruction::ICmp, Pred1, X,
6771 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
6772 ? (IsSExt ? -1 : 1)
6773 : 0));
6774 }
6775 }
6776
6777 return nullptr;
6778}
6779
6780std::optional<std::pair<CmpInst::Predicate, Constant *>>
6782 Constant *C) {
6784 "Only for relational integer predicates.");
6785
6786 Type *Type = C->getType();
6787 bool IsSigned = ICmpInst::isSigned(Pred);
6788
6790 bool WillIncrement =
6791 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
6792
6793 // Check if the constant operand can be safely incremented/decremented
6794 // without overflowing/underflowing.
6795 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
6796 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
6797 };
6798
6799 Constant *SafeReplacementConstant = nullptr;
6800 if (auto *CI = dyn_cast<ConstantInt>(C)) {
6801 // Bail out if the constant can't be safely incremented/decremented.
6802 if (!ConstantIsOk(CI))
6803 return std::nullopt;
6804 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
6805 unsigned NumElts = FVTy->getNumElements();
6806 for (unsigned i = 0; i != NumElts; ++i) {
6807 Constant *Elt = C->getAggregateElement(i);
6808 if (!Elt)
6809 return std::nullopt;
6810
6811 if (isa<UndefValue>(Elt))
6812 continue;
6813
6814 // Bail out if we can't determine if this constant is min/max or if we
6815 // know that this constant is min/max.
6816 auto *CI = dyn_cast<ConstantInt>(Elt);
6817 if (!CI || !ConstantIsOk(CI))
6818 return std::nullopt;
6819
6820 if (!SafeReplacementConstant)
6821 SafeReplacementConstant = CI;
6822 }
6823 } else if (isa<VectorType>(C->getType())) {
6824 // Handle scalable splat
6825 Value *SplatC = C->getSplatValue();
6826 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
6827 // Bail out if the constant can't be safely incremented/decremented.
6828 if (!CI || !ConstantIsOk(CI))
6829 return std::nullopt;
6830 } else {
6831 // ConstantExpr?
6832 return std::nullopt;
6833 }
6834
6835 // It may not be safe to change a compare predicate in the presence of
6836 // undefined elements, so replace those elements with the first safe constant
6837 // that we found.
6838 // TODO: in case of poison, it is safe; let's replace undefs only.
6839 if (C->containsUndefOrPoisonElement()) {
6840 assert(SafeReplacementConstant && "Replacement constant not set");
6841 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
6842 }
6843
6845
6846 // Increment or decrement the constant.
6847 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
6848 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
6849
6850 return std::make_pair(NewPred, NewC);
6851}
6852
6853/// If we have an icmp le or icmp ge instruction with a constant operand, turn
6854/// it into the appropriate icmp lt or icmp gt instruction. This transform
6855/// allows them to be folded in visitICmpInst.
6857 ICmpInst::Predicate Pred = I.getPredicate();
6858 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
6860 return nullptr;
6861
6862 Value *Op0 = I.getOperand(0);
6863 Value *Op1 = I.getOperand(1);
6864 auto *Op1C = dyn_cast<Constant>(Op1);
6865 if (!Op1C)
6866 return nullptr;
6867
6868 auto FlippedStrictness =
6870 if (!FlippedStrictness)
6871 return nullptr;
6872
6873 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
6874}
6875
6876/// If we have a comparison with a non-canonical predicate, if we can update
6877/// all the users, invert the predicate and adjust all the users.
6879 // Is the predicate already canonical?
6880 CmpInst::Predicate Pred = I.getPredicate();
6882 return nullptr;
6883
6884 // Can all users be adjusted to predicate inversion?
6885 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
6886 return nullptr;
6887
6888 // Ok, we can canonicalize comparison!
6889 // Let's first invert the comparison's predicate.
6890 I.setPredicate(CmpInst::getInversePredicate(Pred));
6891 I.setName(I.getName() + ".not");
6892
6893 // And, adapt users.
6895
6896 return &I;
6897}
6898
6899/// Integer compare with boolean values can always be turned into bitwise ops.
6901 InstCombiner::BuilderTy &Builder) {
6902 Value *A = I.getOperand(0), *B = I.getOperand(1);
6903 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
6904
6905 // A boolean compared to true/false can be simplified to Op0/true/false in
6906 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
6907 // Cases not handled by InstSimplify are always 'not' of Op0.
6908 if (match(B, m_Zero())) {
6909 switch (I.getPredicate()) {
6910 case CmpInst::ICMP_EQ: // A == 0 -> !A
6911 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
6912 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
6914 default:
6915 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6916 }
6917 } else if (match(B, m_One())) {
6918 switch (I.getPredicate()) {
6919 case CmpInst::ICMP_NE: // A != 1 -> !A
6920 case CmpInst::ICMP_ULT: // A <u 1 -> !A
6921 case CmpInst::ICMP_SGT: // A >s -1 -> !A
6923 default:
6924 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6925 }
6926 }
6927
6928 switch (I.getPredicate()) {
6929 default:
6930 llvm_unreachable("Invalid icmp instruction!");
6931 case ICmpInst::ICMP_EQ:
6932 // icmp eq i1 A, B -> ~(A ^ B)
6933 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
6934
6935 case ICmpInst::ICMP_NE:
6936 // icmp ne i1 A, B -> A ^ B
6937 return BinaryOperator::CreateXor(A, B);
6938
6939 case ICmpInst::ICMP_UGT:
6940 // icmp ugt -> icmp ult
6941 std::swap(A, B);
6942 [[fallthrough]];
6943 case ICmpInst::ICMP_ULT:
6944 // icmp ult i1 A, B -> ~A & B
6945 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
6946
6947 case ICmpInst::ICMP_SGT:
6948 // icmp sgt -> icmp slt
6949 std::swap(A, B);
6950 [[fallthrough]];
6951 case ICmpInst::ICMP_SLT:
6952 // icmp slt i1 A, B -> A & ~B
6953 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
6954
6955 case ICmpInst::ICMP_UGE:
6956 // icmp uge -> icmp ule
6957 std::swap(A, B);
6958 [[fallthrough]];
6959 case ICmpInst::ICMP_ULE:
6960 // icmp ule i1 A, B -> ~A | B
6961 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
6962
6963 case ICmpInst::ICMP_SGE:
6964 // icmp sge -> icmp sle
6965 std::swap(A, B);
6966 [[fallthrough]];
6967 case ICmpInst::ICMP_SLE:
6968 // icmp sle i1 A, B -> A | ~B
6969 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
6970 }
6971}
6972
6973// Transform pattern like:
6974// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
6975// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
6976// Into:
6977// (X l>> Y) != 0
6978// (X l>> Y) == 0
6980 InstCombiner::BuilderTy &Builder) {
6981 ICmpInst::Predicate Pred, NewPred;
6982 Value *X, *Y;
6983 if (match(&Cmp,
6984 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
6985 switch (Pred) {
6986 case ICmpInst::ICMP_ULE:
6987 NewPred = ICmpInst::ICMP_NE;
6988 break;
6989 case ICmpInst::ICMP_UGT:
6990 NewPred = ICmpInst::ICMP_EQ;
6991 break;
6992 default:
6993 return nullptr;
6994 }
6995 } else if (match(&Cmp, m_c_ICmp(Pred,
6998 m_Add(m_Shl(m_One(), m_Value(Y)),
6999 m_AllOnes()))),
7000 m_Value(X)))) {
7001 // The variant with 'add' is not canonical, (the variant with 'not' is)
7002 // we only get it because it has extra uses, and can't be canonicalized,
7003
7004 switch (Pred) {
7005 case ICmpInst::ICMP_ULT:
7006 NewPred = ICmpInst::ICMP_NE;
7007 break;
7008 case ICmpInst::ICMP_UGE:
7009 NewPred = ICmpInst::ICMP_EQ;
7010 break;
7011 default:
7012 return nullptr;
7013 }
7014 } else
7015 return nullptr;
7016
7017 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7018 Constant *Zero = Constant::getNullValue(NewX->getType());
7019 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7020}
7021
7023 InstCombiner::BuilderTy &Builder) {
7024 const CmpInst::Predicate Pred = Cmp.getPredicate();
7025 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7026 Value *V1, *V2;
7027
7028 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7029 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7030 if (auto *I = dyn_cast<Instruction>(V))
7031 I->copyIRFlags(&Cmp);
7032 Module *M = Cmp.getModule();
7033 Function *F =
7034 Intrinsic::getDeclaration(M, Intrinsic::vector_reverse, V->getType());
7035 return CallInst::Create(F, V);
7036 };
7037
7038 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7039 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7040 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7041 (LHS->hasOneUse() || RHS->hasOneUse()))
7042 return createCmpReverse(Pred, V1, V2);
7043
7044 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7045 if (LHS->hasOneUse() && isSplatValue(RHS))
7046 return createCmpReverse(Pred, V1, RHS);
7047 }
7048 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7049 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7050 return createCmpReverse(Pred, LHS, V2);
7051
7052 ArrayRef<int> M;
7053 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7054 return nullptr;
7055
7056 // If both arguments of the cmp are shuffles that use the same mask and
7057 // shuffle within a single vector, move the shuffle after the cmp:
7058 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7059 Type *V1Ty = V1->getType();
7060 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7061 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7062 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7063 return new ShuffleVectorInst(NewCmp, M);
7064 }
7065
7066 // Try to canonicalize compare with splatted operand and splat constant.
7067 // TODO: We could generalize this for more than splats. See/use the code in
7068 // InstCombiner::foldVectorBinop().
7069 Constant *C;
7070 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7071 return nullptr;
7072
7073 // Length-changing splats are ok, so adjust the constants as needed:
7074 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7075 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7076 int MaskSplatIndex;
7077 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7078 // We allow poison in matching, but this transform removes it for safety.
7079 // Demanded elements analysis should be able to recover some/all of that.
7080 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7081 ScalarC);
7082 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7083 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7084 return new ShuffleVectorInst(NewCmp, NewM);
7085 }
7086
7087 return nullptr;
7088}
7089
7090// extract(uadd.with.overflow(A, B), 0) ult A
7091// -> extract(uadd.with.overflow(A, B), 1)
7093 CmpInst::Predicate Pred = I.getPredicate();
7094 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7095
7096 Value *UAddOv;
7097 Value *A, *B;
7098 auto UAddOvResultPat = m_ExtractValue<0>(
7099 m_Intrinsic<Intrinsic::uadd_with_overflow>(m_Value(A), m_Value(B)));
7100 if (match(Op0, UAddOvResultPat) &&
7101 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7102 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7103 (match(A, m_One()) || match(B, m_One()))) ||
7104 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7105 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7106 // extract(uadd.with.overflow(A, B), 0) < A
7107 // extract(uadd.with.overflow(A, 1), 0) == 0
7108 // extract(uadd.with.overflow(A, -1), 0) != -1
7109 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7110 else if (match(Op1, UAddOvResultPat) &&
7111 Pred == ICmpInst::ICMP_UGT && (Op0 == A || Op0 == B))
7112 // A > extract(uadd.with.overflow(A, B), 0)
7113 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7114 else
7115 return nullptr;
7116
7117 return ExtractValueInst::Create(UAddOv, 1);
7118}
7119
7121 if (!I.getOperand(0)->getType()->isPointerTy() ||
7123 I.getParent()->getParent(),
7124 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7125 return nullptr;
7126 }
7127 Instruction *Op;
7128 if (match(I.getOperand(0), m_Instruction(Op)) &&
7129 match(I.getOperand(1), m_Zero()) &&
7130 Op->isLaunderOrStripInvariantGroup()) {
7131 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7132 Op->getOperand(0), I.getOperand(1));
7133 }
7134 return nullptr;
7135}
7136
7137/// This function folds patterns produced by lowering of reduce idioms, such as
7138/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7139/// attempts to generate fewer number of scalar comparisons instead of vector
7140/// comparisons when possible.
7142 InstCombiner::BuilderTy &Builder,
7143 const DataLayout &DL) {
7144 if (I.getType()->isVectorTy())
7145 return nullptr;
7146 ICmpInst::Predicate OuterPred, InnerPred;
7147 Value *LHS, *RHS;
7148
7149 // Match lowering of @llvm.vector.reduce.and. Turn
7150 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7151 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7152 /// %res = icmp <pred> i8 %scalar_ne, 0
7153 ///
7154 /// into
7155 ///
7156 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7157 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7158 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7159 ///
7160 /// for <pred> in {ne, eq}.
7161 if (!match(&I, m_ICmp(OuterPred,
7163 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7164 m_Zero())))
7165 return nullptr;
7166 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7167 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7168 return nullptr;
7169 unsigned NumBits =
7170 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7171 // TODO: Relax this to "not wider than max legal integer type"?
7172 if (!DL.isLegalInteger(NumBits))
7173 return nullptr;
7174
7175 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7176 auto *ScalarTy = Builder.getIntNTy(NumBits);
7177 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7178 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7179 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7180 I.getName());
7181 }
7182
7183 return nullptr;
7184}
7185
7186// This helper will be called with icmp operands in both orders.
7188 Value *Op0, Value *Op1,
7189 ICmpInst &CxtI) {
7190 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7191 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7192 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7193 return NI;
7194
7195 if (auto *SI = dyn_cast<SelectInst>(Op0))
7196 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7197 return NI;
7198
7199 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7200 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7201 return Res;
7202
7203 {
7204 Value *X;
7205 const APInt *C;
7206 // icmp X+Cst, X
7207 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7208 return foldICmpAddOpConst(X, *C, Pred);
7209 }
7210
7211 // abs(X) >= X --> true
7212 // abs(X) u<= X --> true
7213 // abs(X) < X --> false
7214 // abs(X) u> X --> false
7215 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7216 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7217 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7218 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7219 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7220 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7221 {
7222 Value *X;
7223 Constant *C;
7224 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X), m_Constant(C))) &&
7225 match(Op1, m_Specific(X))) {
7226 Value *NullValue = Constant::getNullValue(X->getType());
7227 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7228 const APInt SMin =
7229 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7230 bool IsIntMinPosion = C->isAllOnesValue();
7231 switch (Pred) {
7232 case CmpInst::ICMP_ULE:
7233 case CmpInst::ICMP_SGE:
7234 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7235 case CmpInst::ICMP_UGT:
7236 case CmpInst::ICMP_SLT:
7238 case CmpInst::ICMP_UGE:
7239 case CmpInst::ICMP_SLE:
7240 case CmpInst::ICMP_EQ: {
7241 return replaceInstUsesWith(
7242 CxtI, IsIntMinPosion
7243 ? Builder.CreateICmpSGT(X, AllOnesValue)
7245 X, ConstantInt::get(X->getType(), SMin + 1)));
7246 }
7247 case CmpInst::ICMP_ULT:
7248 case CmpInst::ICMP_SGT:
7249 case CmpInst::ICMP_NE: {
7250 return replaceInstUsesWith(
7251 CxtI, IsIntMinPosion
7252 ? Builder.CreateICmpSLT(X, NullValue)
7254 X, ConstantInt::get(X->getType(), SMin)));
7255 }
7256 default:
7257 llvm_unreachable("Invalid predicate!");
7258 }
7259 }
7260 }
7261
7262 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7263 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7264 return replaceInstUsesWith(CxtI, V);
7265
7266 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7267 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7268 {
7269 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7270 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7272 }
7273
7274 if (!ICmpInst::isUnsigned(Pred) &&
7275 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7276 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7278 }
7279 }
7280
7281 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7282 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7283 {
7284 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7285 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7287 }
7288
7289 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7290 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7291 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7293 }
7294 }
7295
7296 return nullptr;
7297}
7298
7300 bool Changed = false;
7302 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7303 unsigned Op0Cplxity = getComplexity(Op0);
7304 unsigned Op1Cplxity = getComplexity(Op1);
7305
7306 /// Orders the operands of the compare so that they are listed from most
7307 /// complex to least complex. This puts constants before unary operators,
7308 /// before binary operators.
7309 if (Op0Cplxity < Op1Cplxity) {
7310 I.swapOperands();
7311 std::swap(Op0, Op1);
7312 Changed = true;
7313 }
7314
7315 if (Value *V = simplifyICmpInst(I.getPredicate(), Op0, Op1, Q))
7316 return replaceInstUsesWith(I, V);
7317
7318 // Comparing -val or val with non-zero is the same as just comparing val
7319 // ie, abs(val) != 0 -> val != 0
7320 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7321 Value *Cond, *SelectTrue, *SelectFalse;
7322 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7323 m_Value(SelectFalse)))) {
7324 if (Value *V = dyn_castNegVal(SelectTrue)) {
7325 if (V == SelectFalse)
7326 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7327 }
7328 else if (Value *V = dyn_castNegVal(SelectFalse)) {
7329 if (V == SelectTrue)
7330 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7331 }
7332 }
7333 }
7334
7335 if (Op0->getType()->isIntOrIntVectorTy(1))
7337 return Res;
7338
7340 return Res;
7341
7343 return Res;
7344
7346 return Res;
7347
7349 return Res;
7350
7352 return Res;
7353
7355 return Res;
7356
7358 return Res;
7359
7360 // Test if the ICmpInst instruction is used exclusively by a select as
7361 // part of a minimum or maximum operation. If so, refrain from doing
7362 // any other folding. This helps out other analyses which understand
7363 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7364 // and CodeGen. And in this case, at least one of the comparison
7365 // operands has at least one user besides the compare (the select),
7366 // which would often largely negate the benefit of folding anyway.
7367 //
7368 // Do the same for the other patterns recognized by matchSelectPattern.
7369 if (I.hasOneUse())
7370 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7371 Value *A, *B;
7373 if (SPR.Flavor != SPF_UNKNOWN)
7374 return nullptr;
7375 }
7376
7377 // Do this after checking for min/max to prevent infinite looping.
7378 if (Instruction *Res = foldICmpWithZero(I))
7379 return Res;
7380
7381 // FIXME: We only do this after checking for min/max to prevent infinite
7382 // looping caused by a reverse canonicalization of these patterns for min/max.
7383 // FIXME: The organization of folds is a mess. These would naturally go into
7384 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7385 // down here after the min/max restriction.
7386 ICmpInst::Predicate Pred = I.getPredicate();
7387 const APInt *C;
7388 if (match(Op1, m_APInt(C))) {
7389 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7390 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7391 Constant *Zero = Constant::getNullValue(Op0->getType());
7392 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7393 }
7394
7395 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7396 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7398 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7399 }
7400 }
7401
7402 // The folds in here may rely on wrapping flags and special constants, so
7403 // they can break up min/max idioms in some cases but not seemingly similar
7404 // patterns.
7405 // FIXME: It may be possible to enhance select folding to make this
7406 // unnecessary. It may also be moot if we canonicalize to min/max
7407 // intrinsics.
7408 if (Instruction *Res = foldICmpBinOp(I, Q))
7409 return Res;
7410
7412 return Res;
7413
7414 // Try to match comparison as a sign bit test. Intentionally do this after
7415 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7416 if (Instruction *New = foldSignBitTest(I))
7417 return New;
7418
7420 return Res;
7421
7422 if (Instruction *Res = foldICmpCommutative(I.getPredicate(), Op0, Op1, I))
7423 return Res;
7424 if (Instruction *Res =
7425 foldICmpCommutative(I.getSwappedPredicate(), Op1, Op0, I))
7426 return Res;
7427
7428 if (I.isCommutative()) {
7429 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7430 replaceOperand(I, 0, Pair->first);
7431 replaceOperand(I, 1, Pair->second);
7432 return &I;
7433 }
7434 }
7435
7436 // In case of a comparison with two select instructions having the same
7437 // condition, check whether one of the resulting branches can be simplified.
7438 // If so, just compare the other branch and select the appropriate result.
7439 // For example:
7440 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7441 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7442 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7443 // The icmp will result false for the false value of selects and the result
7444 // will depend upon the comparison of true values of selects if %cmp is
7445 // true. Thus, transform this into:
7446 // %cmp = icmp slt i32 %y, %z
7447 // %sel = select i1 %cond, i1 %cmp, i1 false
7448 // This handles similar cases to transform.
7449 {
7450 Value *Cond, *A, *B, *C, *D;
7451 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7453 (Op0->hasOneUse() || Op1->hasOneUse())) {
7454 // Check whether comparison of TrueValues can be simplified
7455 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7456 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7457 return SelectInst::Create(Cond, Res, NewICMP);
7458 }
7459 // Check whether comparison of FalseValues can be simplified
7460 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7461 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7462 return SelectInst::Create(Cond, NewICMP, Res);
7463 }
7464 }
7465 }
7466
7467 // Try to optimize equality comparisons against alloca-based pointers.
7468 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7469 assert(Op1->getType()->isPointerTy() && "Comparing pointer with non-pointer?");
7470 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7471 if (foldAllocaCmp(Alloca))
7472 return nullptr;
7473 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7474 if (foldAllocaCmp(Alloca))
7475 return nullptr;
7476 }
7477
7478 if (Instruction *Res = foldICmpBitCast(I))
7479 return Res;
7480
7481 // TODO: Hoist this above the min/max bailout.
7483 return R;
7484
7485 {
7486 Value *X, *Y;
7487 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7488 // and (X & ~Y) != 0 --> (X & Y) == 0
7489 // if A is a power of 2.
7490 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7491 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, 0, &I) &&
7492 I.isEquality())
7493 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7494 Op1);
7495
7496 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7497 if (Op0->getType()->isIntOrIntVectorTy()) {
7498 bool ConsumesOp0, ConsumesOp1;
7499 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7500 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7501 (ConsumesOp0 || ConsumesOp1)) {
7502 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7503 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7504 assert(InvOp0 && InvOp1 &&
7505 "Mismatch between isFreeToInvert and getFreelyInverted");
7506 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7507 }
7508 }
7509
7510 Instruction *AddI = nullptr;
7512 m_Instruction(AddI))) &&
7513 isa<IntegerType>(X->getType())) {
7514 Value *Result;
7515 Constant *Overflow;
7516 // m_UAddWithOverflow can match patterns that do not include an explicit
7517 // "add" instruction, so check the opcode of the matched op.
7518 if (AddI->getOpcode() == Instruction::Add &&
7519 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7520 Result, Overflow)) {
7521 replaceInstUsesWith(*AddI, Result);
7522 eraseInstFromFunction(*AddI);
7523 return replaceInstUsesWith(I, Overflow);
7524 }
7525 }
7526
7527 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7528 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7529 match(Op1, m_APInt(C))) {
7530 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7531 return R;
7532 }
7533
7534 // Signbit test folds
7535 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7536 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7537 Instruction *ExtI;
7538 if ((I.isUnsigned() || I.isEquality()) &&
7539 match(Op1,
7541 Y->getType()->getScalarSizeInBits() == 1 &&
7542 (Op0->hasOneUse() || Op1->hasOneUse())) {
7543 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7544 Instruction *ShiftI;
7545 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7547 OpWidth - 1))))) {
7548 unsigned ExtOpc = ExtI->getOpcode();
7549 unsigned ShiftOpc = ShiftI->getOpcode();
7550 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7551 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7552 Value *SLTZero =
7554 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7555 return replaceInstUsesWith(I, Cmp);
7556 }
7557 }
7558 }
7559 }
7560
7561 if (Instruction *Res = foldICmpEquality(I))
7562 return Res;
7563
7565 return Res;
7566
7567 if (Instruction *Res = foldICmpOfUAddOv(I))
7568 return Res;
7569
7570 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7571 // an i1 which indicates whether or not we successfully did the swap.
7572 //
7573 // Replace comparisons between the old value and the expected value with the
7574 // indicator that 'cmpxchg' returns.
7575 //
7576 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7577 // spuriously fail. In those cases, the old value may equal the expected
7578 // value but it is possible for the swap to not occur.
7579 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7580 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7581 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7582 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7583 !ACXI->isWeak())
7584 return ExtractValueInst::Create(ACXI, 1);
7585
7587 return Res;
7588
7589 if (I.getType()->isVectorTy())
7590 if (Instruction *Res = foldVectorCmp(I, Builder))
7591 return Res;
7592
7594 return Res;
7595
7597 return Res;
7598
7599 return Changed ? &I : nullptr;
7600}
7601
7602/// Fold fcmp ([us]itofp x, cst) if possible.
7604 Instruction *LHSI,
7605 Constant *RHSC) {
7606 const APFloat *RHS;
7607 if (!match(RHSC, m_APFloat(RHS)))
7608 return nullptr;
7609
7610 // Get the width of the mantissa. We don't want to hack on conversions that
7611 // might lose information from the integer, e.g. "i64 -> float"
7612 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7613 if (MantissaWidth == -1) return nullptr; // Unknown.
7614
7615 Type *IntTy = LHSI->getOperand(0)->getType();
7616 unsigned IntWidth = IntTy->getScalarSizeInBits();
7617 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7618
7619 if (I.isEquality()) {
7620 FCmpInst::Predicate P = I.getPredicate();
7621 bool IsExact = false;
7622 APSInt RHSCvt(IntWidth, LHSUnsigned);
7623 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7624
7625 // If the floating point constant isn't an integer value, we know if we will
7626 // ever compare equal / not equal to it.
7627 if (!IsExact) {
7628 // TODO: Can never be -0.0 and other non-representable values
7629 APFloat RHSRoundInt(*RHS);
7631 if (*RHS != RHSRoundInt) {
7633 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7634
7636 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7637 }
7638 }
7639
7640 // TODO: If the constant is exactly representable, is it always OK to do
7641 // equality compares as integer?
7642 }
7643
7644 // Check to see that the input is converted from an integer type that is small
7645 // enough that preserves all bits. TODO: check here for "known" sign bits.
7646 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7647
7648 // Following test does NOT adjust IntWidth downwards for signed inputs,
7649 // because the most negative value still requires all the mantissa bits
7650 // to distinguish it from one less than that value.
7651 if ((int)IntWidth > MantissaWidth) {
7652 // Conversion would lose accuracy. Check if loss can impact comparison.
7653 int Exp = ilogb(*RHS);
7654 if (Exp == APFloat::IEK_Inf) {
7655 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7656 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7657 // Conversion could create infinity.
7658 return nullptr;
7659 } else {
7660 // Note that if RHS is zero or NaN, then Exp is negative
7661 // and first condition is trivially false.
7662 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7663 // Conversion could affect comparison.
7664 return nullptr;
7665 }
7666 }
7667
7668 // Otherwise, we can potentially simplify the comparison. We know that it
7669 // will always come through as an integer value and we know the constant is
7670 // not a NAN (it would have been previously simplified).
7671 assert(!RHS->isNaN() && "NaN comparison not already folded!");
7672
7674 switch (I.getPredicate()) {
7675 default: llvm_unreachable("Unexpected predicate!");
7676 case FCmpInst::FCMP_UEQ:
7677 case FCmpInst::FCMP_OEQ:
7678 Pred = ICmpInst::ICMP_EQ;
7679 break;
7680 case FCmpInst::FCMP_UGT:
7681 case FCmpInst::FCMP_OGT:
7682 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
7683 break;
7684 case FCmpInst::FCMP_UGE:
7685 case FCmpInst::FCMP_OGE:
7686 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
7687 break;
7688 case FCmpInst::FCMP_ULT:
7689 case FCmpInst::FCMP_OLT:
7690 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
7691 break;
7692 case FCmpInst::FCMP_ULE:
7693 case FCmpInst::FCMP_OLE:
7694 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
7695 break;
7696 case FCmpInst::FCMP_UNE:
7697 case FCmpInst::FCMP_ONE:
7698 Pred = ICmpInst::ICMP_NE;
7699 break;
7700 case FCmpInst::FCMP_ORD:
7701 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7702 case FCmpInst::FCMP_UNO:
7703 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7704 }
7705
7706 // Now we know that the APFloat is a normal number, zero or inf.
7707
7708 // See if the FP constant is too large for the integer. For example,
7709 // comparing an i8 to 300.0.
7710 if (!LHSUnsigned) {
7711 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
7712 // and large values.
7713 APFloat SMax(RHS->getSemantics());
7714 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
7716 if (SMax < *RHS) { // smax < 13123.0
7717 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
7718 Pred == ICmpInst::ICMP_SLE)
7719 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7720 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7721 }
7722 } else {
7723 // If the RHS value is > UnsignedMax, fold the comparison. This handles
7724 // +INF and large values.
7725 APFloat UMax(RHS->getSemantics());
7726 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
7728 if (UMax < *RHS) { // umax < 13123.0
7729 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
7730 Pred == ICmpInst::ICMP_ULE)
7731 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7732 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7733 }
7734 }
7735
7736 if (!LHSUnsigned) {
7737 // See if the RHS value is < SignedMin.
7738 APFloat SMin(RHS->getSemantics());
7739 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
7741 if (SMin > *RHS) { // smin > 12312.0
7742 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
7743 Pred == ICmpInst::ICMP_SGE)
7744 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7745 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7746 }
7747 } else {
7748 // See if the RHS value is < UnsignedMin.
7749 APFloat UMin(RHS->getSemantics());
7750 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
7752 if (UMin > *RHS) { // umin > 12312.0
7753 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
7754 Pred == ICmpInst::ICMP_UGE)
7755 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7756 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7757 }
7758 }
7759
7760 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
7761 // [0, UMAX], but it may still be fractional. Check whether this is the case
7762 // using the IsExact flag.
7763 // Don't do this for zero, because -0.0 is not fractional.
7764 APSInt RHSInt(IntWidth, LHSUnsigned);
7765 bool IsExact;
7766 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
7767 if (!RHS->isZero()) {
7768 if (!IsExact) {
7769 // If we had a comparison against a fractional value, we have to adjust
7770 // the compare predicate and sometimes the value. RHSC is rounded towards
7771 // zero at this point.
7772 switch (Pred) {
7773 default: llvm_unreachable("Unexpected integer comparison!");
7774 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
7775 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7776 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
7777 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7778 case ICmpInst::ICMP_ULE:
7779 // (float)int <= 4.4 --> int <= 4
7780 // (float)int <= -4.4 --> false
7781 if (RHS->isNegative())
7782 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7783 break;
7784 case ICmpInst::ICMP_SLE:
7785 // (float)int <= 4.4 --> int <= 4
7786 // (float)int <= -4.4 --> int < -4
7787 if (RHS->isNegative())
7788 Pred = ICmpInst::ICMP_SLT;
7789 break;
7790 case ICmpInst::ICMP_ULT:
7791 // (float)int < -4.4 --> false
7792 // (float)int < 4.4 --> int <= 4
7793 if (RHS->isNegative())
7794 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7795 Pred = ICmpInst::ICMP_ULE;
7796 break;
7797 case ICmpInst::ICMP_SLT:
7798 // (float)int < -4.4 --> int < -4
7799 // (float)int < 4.4 --> int <= 4
7800 if (!RHS->isNegative())
7801 Pred = ICmpInst::ICMP_SLE;
7802 break;
7803 case ICmpInst::ICMP_UGT:
7804 // (float)int > 4.4 --> int > 4
7805 // (float)int > -4.4 --> true
7806 if (RHS->isNegative())
7807 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7808 break;
7809 case ICmpInst::ICMP_SGT:
7810 // (float)int > 4.4 --> int > 4
7811 // (float)int > -4.4 --> int >= -4
7812 if (RHS->isNegative())
7813 Pred = ICmpInst::ICMP_SGE;
7814 break;
7815 case ICmpInst::ICMP_UGE:
7816 // (float)int >= -4.4 --> true
7817 // (float)int >= 4.4 --> int > 4
7818 if (RHS->isNegative())
7819 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7820 Pred = ICmpInst::ICMP_UGT;
7821 break;
7822 case ICmpInst::ICMP_SGE:
7823 // (float)int >= -4.4 --> int >= -4
7824 // (float)int >= 4.4 --> int > 4
7825 if (!RHS->isNegative())
7826 Pred = ICmpInst::ICMP_SGT;
7827 break;
7828 }
7829 }
7830 }
7831
7832 // Lower this FP comparison into an appropriate integer version of the
7833 // comparison.
7834 return new ICmpInst(Pred, LHSI->getOperand(0),
7835 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
7836}
7837
7838/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
7840 Constant *RHSC) {
7841 // When C is not 0.0 and infinities are not allowed:
7842 // (C / X) < 0.0 is a sign-bit test of X
7843 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
7844 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
7845 //
7846 // Proof:
7847 // Multiply (C / X) < 0.0 by X * X / C.
7848 // - X is non zero, if it is the flag 'ninf' is violated.
7849 // - C defines the sign of X * X * C. Thus it also defines whether to swap
7850 // the predicate. C is also non zero by definition.
7851 //
7852 // Thus X * X / C is non zero and the transformation is valid. [qed]
7853
7854 FCmpInst::Predicate Pred = I.getPredicate();
7855
7856 // Check that predicates are valid.
7857 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
7858 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
7859 return nullptr;
7860
7861 // Check that RHS operand is zero.
7862 if (!match(RHSC, m_AnyZeroFP()))
7863 return nullptr;
7864
7865 // Check fastmath flags ('ninf').
7866 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
7867 return nullptr;
7868
7869 // Check the properties of the dividend. It must not be zero to avoid a
7870 // division by zero (see Proof).
7871 const APFloat *C;
7872 if (!match(LHSI->getOperand(0), m_APFloat(C)))
7873 return nullptr;
7874
7875 if (C->isZero())
7876 return nullptr;
7877
7878 // Get swapped predicate if necessary.
7879 if (C->isNegative())
7880 Pred = I.getSwappedPredicate();
7881
7882 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
7883}
7884
7885/// Optimize fabs(X) compared with zero.
7887 Value *X;
7888 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
7889 return nullptr;
7890
7891 const APFloat *C;
7892 if (!match(I.getOperand(1), m_APFloat(C)))
7893 return nullptr;
7894
7895 if (!C->isPosZero()) {
7896 if (!C->isSmallestNormalized())
7897 return nullptr;
7898
7899 const Function *F = I.getFunction();
7900 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
7901 if (Mode.Input == DenormalMode::PreserveSign ||
7902 Mode.Input == DenormalMode::PositiveZero) {
7903
7904 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7905 Constant *Zero = ConstantFP::getZero(X->getType());
7906 return new FCmpInst(P, X, Zero, "", I);
7907 };
7908
7909 switch (I.getPredicate()) {
7910 case FCmpInst::FCMP_OLT:
7911 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
7912 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
7913 case FCmpInst::FCMP_UGE:
7914 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
7915 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
7916 case FCmpInst::FCMP_OGE:
7917 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
7918 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
7919 case FCmpInst::FCMP_ULT:
7920 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
7921 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
7922 default:
7923 break;
7924 }
7925 }
7926
7927 return nullptr;
7928 }
7929
7930 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7931 I->setPredicate(P);
7932 return IC.replaceOperand(*I, 0, X);
7933 };
7934
7935 switch (I.getPredicate()) {
7936 case FCmpInst::FCMP_UGE:
7937 case FCmpInst::FCMP_OLT:
7938 // fabs(X) >= 0.0 --> true
7939 // fabs(X) < 0.0 --> false
7940 llvm_unreachable("fcmp should have simplified");
7941
7942 case FCmpInst::FCMP_OGT:
7943 // fabs(X) > 0.0 --> X != 0.0
7944 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
7945
7946 case FCmpInst::FCMP_UGT:
7947 // fabs(X) u> 0.0 --> X u!= 0.0
7948 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
7949
7950 case FCmpInst::FCMP_OLE:
7951 // fabs(X) <= 0.0 --> X == 0.0
7952 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
7953
7954 case FCmpInst::FCMP_ULE:
7955 // fabs(X) u<= 0.0 --> X u== 0.0
7956 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
7957
7958 case FCmpInst::FCMP_OGE:
7959 // fabs(X) >= 0.0 --> !isnan(X)
7960 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7961 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
7962
7963 case FCmpInst::FCMP_ULT:
7964 // fabs(X) u< 0.0 --> isnan(X)
7965 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7966 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
7967
7968 case FCmpInst::FCMP_OEQ:
7969 case FCmpInst::FCMP_UEQ:
7970 case FCmpInst::FCMP_ONE:
7971 case FCmpInst::FCMP_UNE:
7972 case FCmpInst::FCMP_ORD:
7973 case FCmpInst::FCMP_UNO:
7974 // Look through the fabs() because it doesn't change anything but the sign.
7975 // fabs(X) == 0.0 --> X == 0.0,
7976 // fabs(X) != 0.0 --> X != 0.0
7977 // isnan(fabs(X)) --> isnan(X)
7978 // !isnan(fabs(X) --> !isnan(X)
7979 return replacePredAndOp0(&I, I.getPredicate(), X);
7980
7981 default:
7982 return nullptr;
7983 }
7984}
7985
7987 CmpInst::Predicate Pred = I.getPredicate();
7988 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7989
7990 // Canonicalize fneg as Op1.
7991 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
7992 std::swap(Op0, Op1);
7993 Pred = I.getSwappedPredicate();
7994 }
7995
7996 if (!match(Op1, m_FNeg(m_Specific(Op0))))
7997 return nullptr;
7998
7999 // Replace the negated operand with 0.0:
8000 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8001 Constant *Zero = ConstantFP::getZero(Op0->getType());
8002 return new FCmpInst(Pred, Op0, Zero, "", &I);
8003}
8004
8006 Constant *RHSC, InstCombinerImpl &CI) {
8007 const CmpInst::Predicate Pred = I.getPredicate();
8008 Value *X = LHSI->getOperand(0);
8009 Value *Y = LHSI->getOperand(1);
8010 switch (Pred) {
8011 default:
8012 break;
8013 case FCmpInst::FCMP_UGT:
8014 case FCmpInst::FCMP_ULT:
8015 case FCmpInst::FCMP_UNE:
8016 case FCmpInst::FCMP_OEQ:
8017 case FCmpInst::FCMP_OGE:
8018 case FCmpInst::FCMP_OLE:
8019 // The optimization is not valid if X and Y are infinities of the same
8020 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8021 // flag then we can assume we do not have that case. Otherwise we might be
8022 // able to prove that either X or Y is not infinity.
8023 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8024 !isKnownNeverInfinity(Y, /*Depth=*/0,
8026 !isKnownNeverInfinity(X, /*Depth=*/0,
8028 break;
8029
8030 [[fallthrough]];
8031 case FCmpInst::FCMP_OGT:
8032 case FCmpInst::FCMP_OLT:
8033 case FCmpInst::FCMP_ONE:
8034 case FCmpInst::FCMP_UEQ:
8035 case FCmpInst::FCMP_UGE:
8036 case FCmpInst::FCMP_ULE:
8037 // fcmp pred (x - y), 0 --> fcmp pred x, y
8038 if (match(RHSC, m_AnyZeroFP()) &&
8039 I.getFunction()->getDenormalMode(
8040 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8042 CI.replaceOperand(I, 0, X);
8043 CI.replaceOperand(I, 1, Y);
8044 return &I;
8045 }
8046 break;
8047 }
8048
8049 return nullptr;
8050}
8051
8053 bool Changed = false;
8054
8055 /// Orders the operands of the compare so that they are listed from most
8056 /// complex to least complex. This puts constants before unary operators,
8057 /// before binary operators.
8058 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8059 I.swapOperands();
8060 Changed = true;
8061 }
8062
8063 const CmpInst::Predicate Pred = I.getPredicate();
8064 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8065 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8067 return replaceInstUsesWith(I, V);
8068
8069 // Simplify 'fcmp pred X, X'
8070 Type *OpType = Op0->getType();
8071 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8072 if (Op0 == Op1) {
8073 switch (Pred) {
8074 default: break;
8075 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
8076 case FCmpInst::FCMP_ULT: // True if unordered or less than
8077 case FCmpInst::FCMP_UGT: // True if unordered or greater than
8078 case FCmpInst::FCMP_UNE: // True if unordered or not equal
8079 // Canonicalize these to be 'fcmp uno %X, 0.0'.
8080 I.setPredicate(FCmpInst::FCMP_UNO);
8081 I.setOperand(1, Constant::getNullValue(OpType));
8082 return &I;
8083
8084 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
8085 case FCmpInst::FCMP_OEQ: // True if ordered and equal
8086 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
8087 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
8088 // Canonicalize these to be 'fcmp ord %X, 0.0'.
8089 I.setPredicate(FCmpInst::FCMP_ORD);
8090 I.setOperand(1, Constant::getNullValue(OpType));
8091 return &I;
8092 }
8093 }
8094
8095 if (I.isCommutative()) {
8096 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8097 replaceOperand(I, 0, Pair->first);
8098 replaceOperand(I, 1, Pair->second);
8099 return &I;
8100 }
8101 }
8102
8103 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
8104 // then canonicalize the operand to 0.0.
8105 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
8106 if (!match(Op0, m_PosZeroFP()) &&
8107 isKnownNeverNaN(Op0, 0, getSimplifyQuery().getWithInstruction(&I)))
8108 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
8109
8110 if (!match(Op1, m_PosZeroFP()) &&
8111 isKnownNeverNaN(Op1, 0, getSimplifyQuery().getWithInstruction(&I)))
8112 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8113 }
8114
8115 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
8116 Value *X, *Y;
8117 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
8118 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
8119
8121 return R;
8122
8123 // Test if the FCmpInst instruction is used exclusively by a select as
8124 // part of a minimum or maximum operation. If so, refrain from doing
8125 // any other folding. This helps out other analyses which understand
8126 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
8127 // and CodeGen. And in this case, at least one of the comparison
8128 // operands has at least one user besides the compare (the select),
8129 // which would often largely negate the benefit of folding anyway.
8130 if (I.hasOneUse())
8131 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
8132 Value *A, *B;
8134 if (SPR.Flavor != SPF_UNKNOWN)
8135 return nullptr;
8136 }
8137
8138 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
8139 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
8140 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
8141 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8142
8143 // Canonicalize:
8144 // fcmp olt X, +inf -> fcmp one X, +inf
8145 // fcmp ole X, +inf -> fcmp ord X, 0
8146 // fcmp ogt X, +inf -> false
8147 // fcmp oge X, +inf -> fcmp oeq X, +inf
8148 // fcmp ult X, +inf -> fcmp une X, +inf
8149 // fcmp ule X, +inf -> true
8150 // fcmp ugt X, +inf -> fcmp uno X, 0
8151 // fcmp uge X, +inf -> fcmp ueq X, +inf
8152 // fcmp olt X, -inf -> false
8153 // fcmp ole X, -inf -> fcmp oeq X, -inf
8154 // fcmp ogt X, -inf -> fcmp one X, -inf
8155 // fcmp oge X, -inf -> fcmp ord X, 0
8156 // fcmp ult X, -inf -> fcmp uno X, 0
8157 // fcmp ule X, -inf -> fcmp ueq X, -inf
8158 // fcmp ugt X, -inf -> fcmp une X, -inf
8159 // fcmp uge X, -inf -> true
8160 const APFloat *C;
8161 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8162 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8163 default:
8164 break;
8165 case FCmpInst::FCMP_ORD:
8166 case FCmpInst::FCMP_UNO:
8169 case FCmpInst::FCMP_OGT:
8170 case FCmpInst::FCMP_ULE:
8171 llvm_unreachable("Should be simplified by InstSimplify");
8172 case FCmpInst::FCMP_OLT:
8173 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8174 case FCmpInst::FCMP_OLE:
8175 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8176 "", &I);
8177 case FCmpInst::FCMP_OGE:
8178 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8179 case FCmpInst::FCMP_ULT:
8180 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8181 case FCmpInst::FCMP_UGT:
8182 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8183 "", &I);
8184 case FCmpInst::FCMP_UGE:
8185 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8186 }
8187 }
8188
8189 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8190 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8191 if (match(Op1, m_PosZeroFP()) &&
8194 if (Pred == FCmpInst::FCMP_OEQ)
8195 IntPred = ICmpInst::ICMP_EQ;
8196 else if (Pred == FCmpInst::FCMP_UNE)
8197 IntPred = ICmpInst::ICMP_NE;
8198
8199 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8200 Type *IntTy = X->getType();
8201 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8202 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8203 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8204 }
8205 }
8206
8207 // Handle fcmp with instruction LHS and constant RHS.
8208 Instruction *LHSI;
8209 Constant *RHSC;
8210 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8211 switch (LHSI->getOpcode()) {
8212 case Instruction::Select:
8213 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8214 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8215 (match(LHSI,
8217 match(LHSI, m_Select(m_Value(), m_FNeg(m_Value(X)), m_Deferred(X)))))
8218 return replaceOperand(I, 0, X);
8219 if (Instruction *NV = FoldOpIntoSelect(I, cast<SelectInst>(LHSI)))
8220 return NV;
8221 break;
8222 case Instruction::FSub:
8223 if (LHSI->hasOneUse())
8224 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
8225 return NV;
8226 break;
8227 case Instruction::PHI:
8228 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8229 return NV;
8230 break;
8231 case Instruction::SIToFP:
8232 case Instruction::UIToFP:
8233 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8234 return NV;
8235 break;
8236 case Instruction::FDiv:
8237 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8238 return NV;
8239 break;
8240 case Instruction::Load:
8241 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8242 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
8244 cast<LoadInst>(LHSI), GEP, GV, I))
8245 return Res;
8246 break;
8247 }
8248 }
8249
8250 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8251 return R;
8252
8253 if (match(Op0, m_FNeg(m_Value(X)))) {
8254 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8255 Constant *C;
8256 if (match(Op1, m_Constant(C)))
8257 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8258 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8259 }
8260
8261 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8262 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8263 return new FCmpInst(Pred, X, Op1, "", &I);
8264
8265 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8266 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8267 return new FCmpInst(Pred, Op0, Y, "", &I);
8268
8269 if (match(Op0, m_FPExt(m_Value(X)))) {
8270 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8271 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8272 return new FCmpInst(Pred, X, Y, "", &I);
8273
8274 const APFloat *C;
8275 if (match(Op1, m_APFloat(C))) {
8276 const fltSemantics &FPSem =
8277 X->getType()->getScalarType()->getFltSemantics();
8278 bool Lossy;
8279 APFloat TruncC = *C;
8280 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8281
8282 if (Lossy) {
8283 // X can't possibly equal the higher-precision constant, so reduce any
8284 // equality comparison.
8285 // TODO: Other predicates can be handled via getFCmpCode().
8286 switch (Pred) {
8287 case FCmpInst::FCMP_OEQ:
8288 // X is ordered and equal to an impossible constant --> false
8289 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8290 case FCmpInst::FCMP_ONE:
8291 // X is ordered and not equal to an impossible constant --> ordered
8292 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8293 ConstantFP::getZero(X->getType()));
8294 case FCmpInst::FCMP_UEQ:
8295 // X is unordered or equal to an impossible constant --> unordered
8296 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8297 ConstantFP::getZero(X->getType()));
8298 case FCmpInst::FCMP_UNE:
8299 // X is unordered or not equal to an impossible constant --> true
8300 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8301 default:
8302 break;
8303 }
8304 }
8305
8306 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8307 // Avoid lossy conversions and denormals.
8308 // Zero is a special case that's OK to convert.
8309 APFloat Fabs = TruncC;
8310 Fabs.clearSign();
8311 if (!Lossy &&
8312 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8313 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8314 return new FCmpInst(Pred, X, NewC, "", &I);
8315 }
8316 }
8317 }
8318
8319 // Convert a sign-bit test of an FP value into a cast and integer compare.
8320 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8321 // TODO: Handle non-zero compare constants.
8322 // TODO: Handle other predicates.
8323 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
8324 m_Value(X)))) &&
8325 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8326 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8327 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8328 IntType = VectorType::get(IntType, VecTy->getElementCount());
8329
8330 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8331 if (Pred == FCmpInst::FCMP_OLT) {
8332 Value *IntX = Builder.CreateBitCast(X, IntType);
8333 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8334 ConstantInt::getNullValue(IntType));
8335 }
8336 }
8337
8338 {
8339 Value *CanonLHS = nullptr, *CanonRHS = nullptr;
8340 match(Op0, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonLHS)));
8341 match(Op1, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonRHS)));
8342
8343 // (canonicalize(x) == x) => (x == x)
8344 if (CanonLHS == Op1)
8345 return new FCmpInst(Pred, Op1, Op1, "", &I);
8346
8347 // (x == canonicalize(x)) => (x == x)
8348 if (CanonRHS == Op0)
8349 return new FCmpInst(Pred, Op0, Op0, "", &I);
8350
8351 // (canonicalize(x) == canonicalize(y)) => (x == y)
8352 if (CanonLHS && CanonRHS)
8353 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8354 }
8355
8356 if (I.getType()->isVectorTy())
8357 if (Instruction *Res = foldVectorCmp(I, Builder))
8358 return Res;
8359
8360 return Changed ? &I : nullptr;
8361}
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU Register Bank Select
Rewrite undef for PHI
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
#define Check(C,...)
Hexagon Common GEP
#define _
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 Instruction * foldICmpUSubSatOrUAddSatWithConstant(ICmpInst::Predicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
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 Value * foldICmpWithLowBitMaskedVal(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
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 Instruction * foldICmpShlOne(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl 1, Y), C.
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
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 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 * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(ICmpInst::Predicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, 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 * 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 * 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 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 * 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 Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, 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 * 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.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:528
#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
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:40
Value * RHS
Value * LHS
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5282
void clearSign()
Definition: APFloat.h:1203
bool isZero() const
Definition: APFloat.h:1344
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.h:1058
APInt bitcastToAPInt() const
Definition: APFloat.h:1254
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1038
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:998
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition: APFloat.cpp:5269
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.h:1153
Class for arbitrary precision integers.
Definition: APInt.h:77
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1543
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:213
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition: APInt.h:428
APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:981
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition: APInt.h:208
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition: APInt.h:402
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1499
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition: APInt.h:1471
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:906
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:185
APInt abs() const
Get the absolute value.
Definition: APInt.h:1752
unsigned ceilLogBase2() const
Definition: APInt.h:1721
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition: APInt.h:1180
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:350
APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1918
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition: APInt.h:1161
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:359
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition: APInt.h:445
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1447
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition: APInt.h:1090
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:188
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition: APInt.h:195
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:308
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1898
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition: APInt.h:1228
bool eq(const APInt &RHS) const
Equality comparison.
Definition: APInt.h:1058
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1614
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition: APInt.h:1145
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1905
void negate()
Negate this APInt in place.
Definition: APInt.h:1429
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1597
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1556
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:198
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition: APInt.h:335
unsigned countl_one() const
Count the number of leading one bits.
Definition: APInt.h:1573
unsigned logBase2() const
Definition: APInt.h:1718
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:454
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition: APInt.h:806
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition: APInt.h:384
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition: APInt.h:1129
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition: APInt.h:852
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:419
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:285
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition: APInt.h:1109
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition: APInt.h:275
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:179
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1216
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1911
bool isOne() const
Determine if this is a value of 1.
Definition: APInt.h:368
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition: APInt.h:265
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:218
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition: APInt.h:830
unsigned countr_one() const
Count the number of trailing one bits.
Definition: APInt.h:1614
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1200
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
an instruction to allocate memory on the stack
Definition: Instructions.h:60
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Class to represent array types.
Definition: DerivedTypes.h:371
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
Definition: BasicBlock.cpp:414
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
Definition: BasicBlock.cpp:457
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:229
BinaryOps getOpcode() const
Definition: InstrTypes.h:442
static BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static 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
Definition: InstrTypes.h:1410
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:747
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition: InstrTypes.h:1104
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition: InstrTypes.h:940
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition: InstrTypes.h:997
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:757
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:760
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:774
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:786
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:787
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:763
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:772
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:761
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:762
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:781
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:780
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:784
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:771
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:765
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:768
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:782
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:769
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:764
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:766
@ ICMP_EQ
equal
Definition: InstrTypes.h:778
@ ICMP_NE
not equal
Definition: InstrTypes.h:779
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:785
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:773
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:783
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:770
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:759
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:767
bool isSigned() const
Definition: InstrTypes.h:1007
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:909
bool isTrueWhenEqual() const
This is just a convenience.
Definition: InstrTypes.h:1056
static 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:953
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition: InstrTypes.h:871
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:847
bool isStrictPredicate() const
Definition: InstrTypes.h:925
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition: InstrTypes.h:975
Predicate getFlippedSignednessPredicate()
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->Failed assert.
Definition: InstrTypes.h:1050
bool isIntPredicate() const
Definition: InstrTypes.h:865
bool isUnsigned() const
Definition: InstrTypes.h:1013
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2231
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
Definition: Constants.cpp:2192
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2568
static Constant * getNot(Constant *C)
Definition: Constants.cpp:2555
static Constant * getXor(Constant *C1, Constant *C2)
Definition: Constants.cpp:2582
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2561
static Constant * getNeg(Constant *C, bool HasNSW=false)
Definition: Constants.cpp:2549
static Constant * getZero(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1038
This is the shared class of boolean and integer constants.
Definition: Constants.h:81
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:256
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:850
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:206
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition: Constants.h:124
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:857
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:149
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:146
static ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:864
This class represents a range of values.
Definition: ConstantRange.h:47
ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
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...
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.
ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
bool isEmptySet() const
Return true if this set contains no members.
static 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...
ConstantRange inverse() const
Return a new range that is the logical not of the current set.
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...
ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
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 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 Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:1450
This is an important base class in LLVM.
Definition: Constant.h:41
static 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...
Definition: Constants.cpp:400
static Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
Definition: Constants.cpp:768
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:417
const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
Definition: Constants.cpp:1745
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:370
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
Definition: DataLayout.cpp:878
unsigned getPointerTypeSizeInBits(Type *) const
Layout pointer size, in bits, based on the type.
Definition: DataLayout.cpp:763
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
Definition: DataLayout.cpp:905
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:504
Type * getSmallestLegalIntType(LLVMContext &C, unsigned Width=0) const
Returns the smallest integer type with size at least as big as Width bits.
Definition: DataLayout.cpp:893
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:145
ArrayRef< BranchInst * > conditionsFor(const Value *V) const
Access the list of branches which affect this value.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Definition: Dominators.cpp:122
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.
bool isEquality() const
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition: Operator.h:411
Type * getSourceElementType() const
Definition: Operator.cpp:68
Value * getPointerOperand()
Definition: Operator.h:438
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition: Operator.h:485
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:914
Type * getValueType() const
Definition: GlobalValue.h:296
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
This instruction compares its operands according to the predicate given to the constructor.
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
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.
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:92
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Definition: IRBuilder.cpp:913
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2255
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition: IRBuilder.h:2458
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
Definition: IRBuilder.h:537
Value * CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2263
Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Definition: IRBuilder.cpp:1192
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition: IRBuilder.h:2514
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition: IRBuilder.h:464
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Definition: IRBuilder.cpp:932
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition: IRBuilder.h:1435
Value * CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1334
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Definition: IRBuilder.h:1872
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2243
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition: IRBuilder.h:1719
Value * createIsFPClass(Value *FPNum, unsigned Test)
Definition: IRBuilder.cpp:1287
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition: IRBuilder.h:484
Value * CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2364
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition: IRBuilder.h:2395
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1747
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2239
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1342
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2125
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2247
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1414
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition: IRBuilder.h:2019
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1473
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1325
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition: IRBuilder.h:469
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition: IRBuilder.h:2005
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1495
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:1664
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2271
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2159
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:2194
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition: IRBuilder.h:2542
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition: IRBuilder.h:178
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args=std::nullopt, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2410
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1517
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2349
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Definition: IRBuilder.h:514
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition: IRBuilder.h:500
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1402
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1359
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2664
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...
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN)
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 * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, ICmpInst::Predicate Pred)
Fold icmp Pred min|max(X, Y), Z.
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
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) ?/ x) != y to @llvm.
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 * 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 * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, GlobalVariable *GV, 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 * 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.
Constant * getLosslessTrunc(Constant *C, Type *TruncTy, unsigned ExtOp)
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 * foldICmpAddOpConst(Value *X, const APInt &C, ICmpInst::Predicate Pred)
Fold "icmp pred (X+C), X".
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 * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
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)
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 * foldICmpCommutative(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * visitICmpInst(ICmpInst &I)
Instruction * foldSelectICmp(ICmpInst::Predicate Pred, SelectInst *SI, Value *RHS, const 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)
The core instruction combiner logic.
Definition: InstCombiner.h:47
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:499
SimplifyQuery SQ
Definition: InstCombiner.h:76
static bool isCanonicalPredicate(CmpInst::Predicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Definition: InstCombiner.h:157
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
Definition: InstCombiner.h:232
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
Definition: InstCombiner.h:462
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
Definition: InstCombiner.h:139
TargetLibraryInfo & TLI
Definition: InstCombiner.h:73
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Definition: InstCombiner.h:441
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Definition: InstCombiner.h:386
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
Definition: InstCombiner.h:55
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:485
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
Definition: InstCombiner.h:180
static std::optional< std::pair< CmpInst::Predicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, Constant *C)
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:492
const DataLayout & DL
Definition: InstCombiner.h:75
DomConditionCache DC
Definition: InstCombiner.h:81
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ? InstCombine's freelyInvertA...
Definition: InstCombiner.h:248
void addToWorklist(Instruction *I)
Definition: InstCombiner.h:336
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
Definition: InstCombiner.h:410
DominatorTree & DT
Definition: InstCombiner.h:74
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:470
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
Definition: InstCombiner.h:431
BuilderTy & Builder
Definition: InstCombiner.h:60
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:477
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
Definition: InstCombiner.h:213
const SimplifyQuery & getSimplifyQuery() const
Definition: InstCombiner.h:342
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
Definition: InstCombiner.h:457
bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
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.
Definition: Instruction.h:318
bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
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.
Definition: Instruction.h:274
bool isShift() const
Definition: Instruction.h:281
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:278
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:48
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:55
An instruction for reading from memory.
Definition: Instructions.h:173
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: MapVector.h:141
This class represents min/max intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
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:57
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:98
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition: SetVector.h:254
This instruction constructs a fixed permutation of two input vectors.
bool empty() const
Definition: SmallVector.h:94
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
Class to represent struct types.
Definition: DerivedTypes.h:216
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
unsigned getIntegerBitWidth() const
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:265
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:234
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:255
static IntegerType * getInt1Ty(LLVMContext &C)
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:166
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
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:129
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:228
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
Definition: Type.h:171
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:348
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
void setOperand(unsigned i, Value *Val)
Definition: User.h:174
Value * getOperand(unsigned i) const
Definition: User.h:169
unsigned getNumOperands() const
Definition: User.h:191
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition: Value.cpp:153
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:693
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1074
iterator_range< use_iterator > uses()
Definition: Value.h:376
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
void takeName(Value *V)
Transfer the name from V to this value.
Definition: Value.cpp:383
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Definition: Type.cpp:676
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:199
const ParentTy * getParent() const
Definition: ilist_node.h:32
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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:2732
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:2750
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1484
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
Definition: PatternMatch.h:524
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:673
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
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.
Definition: PatternMatch.h:100
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.
Definition: PatternMatch.h:619
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.
Definition: PatternMatch.h:165
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
Definition: PatternMatch.h:972
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
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.
Definition: PatternMatch.h:816
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
Definition: PatternMatch.h:764
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:875
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)
Definition: PatternMatch.h:980
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.
Definition: PatternMatch.h:560
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
Definition: PatternMatch.h:168
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
Definition: PatternMatch.h:592
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
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.
Definition: PatternMatch.h:245
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
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()...
Definition: PatternMatch.h:893
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
Definition: PatternMatch.h:599
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
Definition: PatternMatch.h:305
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
CmpClass_match< LHS, RHS, ICmpInst, ICmpInst::Predicate > m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R)
OneUse_match< T > m_OneUse(const T &SubPattern)
Definition: PatternMatch.h:67
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
match_combine_and< class_match< Constant >, match_unless< constantexpr_match > > m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
Definition: PatternMatch.h:854
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::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)
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
Definition: PatternMatch.h:639
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
CmpClass_match< LHS, RHS, ICmpInst, ICmpInst::Predicate, true > m_c_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
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.
Definition: PatternMatch.h:481
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:683
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
Definition: PatternMatch.h:299
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
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)
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.
Definition: PatternMatch.h:773
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
apfloat_match m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
Definition: PatternMatch.h:316
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.
Definition: PatternMatch.h:152
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
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.
Definition: PatternMatch.h:612
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.
Definition: PatternMatch.h:203
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
Definition: PatternMatch.h:239
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.
Definition: PatternMatch.h:698
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
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:853
OverflowResult
@ 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:1722
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
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.
bool isKnownNeverInfinity(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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:656
bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if the given value is known to have exactly one bit set when defined.
Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition: bit.h:215
Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
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:324
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:281
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
Definition: ValueTracking.h:48
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_UNKNOWN
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
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...
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Definition: Function.cpp:2073
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:1736
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
Value * simplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
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.
bool isKnownNegative(const Value *V, const SimplifyQuery &DL, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
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:1921
bool decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate &Pred, Value *&X, APInt &Mask, bool LookThroughTrunc=true)
Decompose an icmp into the form ((X & Mask) pred 0) if possible.
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:2039
bool isKnownNeverNaN(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
Value * simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define NC
Definition: regutils.h:42
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:246
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:250
This callback is used in conjunction with PointerMayBeCaptured.
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:97
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:76
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:231
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:263
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition: KnownBits.h:140
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:278
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:40
bool isConstant() const
Returns true if we know the value of all bits.
Definition: KnownBits.h:50
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:237
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:134
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition: KnownBits.h:118
bool isNegative() const
Returns true if this value is known to be negative.
Definition: KnownBits.h:94
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition: KnownBits.h:275
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition: KnownBits.h:124
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition: KnownBits.h:56
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
Definition: SimplifyQuery.h:61
const Instruction * CxtI
Definition: SimplifyQuery.h:65
const DominatorTree * DT
Definition: SimplifyQuery.h:63
SimplifyQuery getWithInstruction(const Instruction *I) const
Definition: SimplifyQuery.h:96
AssumptionCache * AC
Definition: SimplifyQuery.h:64
const DomConditionCache * DC
Definition: SimplifyQuery.h:66
A MapVector that performs no allocations if smaller than a certain size.
Definition: MapVector.h:254