LLVM 20.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/SetVector.h"
16#include "llvm/ADT/Statistic.h"
24#include "llvm/IR/DataLayout.h"
25#include "llvm/IR/InstrTypes.h"
30#include <bitset>
31
32using namespace llvm;
33using namespace PatternMatch;
34
35#define DEBUG_TYPE "instcombine"
36
37// How many times is a select replaced by one of its operands?
38STATISTIC(NumSel, "Number of select opts");
39
40
41/// Compute Result = In1+In2, returning true if the result overflowed for this
42/// type.
43static bool addWithOverflow(APInt &Result, const APInt &In1,
44 const APInt &In2, bool IsSigned = false) {
45 bool Overflow;
46 if (IsSigned)
47 Result = In1.sadd_ov(In2, Overflow);
48 else
49 Result = In1.uadd_ov(In2, Overflow);
50
51 return Overflow;
52}
53
54/// Compute Result = In1-In2, returning true if the result overflowed for this
55/// type.
56static bool subWithOverflow(APInt &Result, const APInt &In1,
57 const APInt &In2, bool IsSigned = false) {
58 bool Overflow;
59 if (IsSigned)
60 Result = In1.ssub_ov(In2, Overflow);
61 else
62 Result = In1.usub_ov(In2, Overflow);
63
64 return Overflow;
65}
66
67/// Given an icmp instruction, return true if any use of this comparison is a
68/// branch on sign bit comparison.
69static bool hasBranchUse(ICmpInst &I) {
70 for (auto *U : I.users())
71 if (isa<BranchInst>(U))
72 return true;
73 return false;
74}
75
76/// Returns true if the exploded icmp can be expressed as a signed comparison
77/// to zero and updates the predicate accordingly.
78/// The signedness of the comparison is preserved.
79/// TODO: Refactor with decomposeBitTestICmp()?
80static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
81 if (!ICmpInst::isSigned(Pred))
82 return false;
83
84 if (C.isZero())
85 return ICmpInst::isRelational(Pred);
86
87 if (C.isOne()) {
88 if (Pred == ICmpInst::ICMP_SLT) {
89 Pred = ICmpInst::ICMP_SLE;
90 return true;
91 }
92 } else if (C.isAllOnes()) {
93 if (Pred == ICmpInst::ICMP_SGT) {
94 Pred = ICmpInst::ICMP_SGE;
95 return true;
96 }
97 }
98
99 return false;
100}
101
102/// This is called when we see this pattern:
103/// cmp pred (load (gep GV, ...)), cmpcst
104/// where GV is a global variable with a constant initializer. Try to simplify
105/// this into some simple computation that does not need the load. For example
106/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
107///
108/// If AndCst is non-null, then the loaded value is masked with that constant
109/// before doing the comparison. This handles cases like "A[i]&4 == 0".
112 ConstantInt *AndCst) {
113 if (LI->isVolatile() || LI->getType() != GEP->getResultElementType() ||
114 GV->getValueType() != GEP->getSourceElementType() || !GV->isConstant() ||
116 return nullptr;
117
119 if (!isa<ConstantArray>(Init) && !isa<ConstantDataArray>(Init))
120 return nullptr;
121
122 uint64_t ArrayElementCount = Init->getType()->getArrayNumElements();
123 // Don't blow up on huge arrays.
124 if (ArrayElementCount > MaxArraySizeForCombine)
125 return nullptr;
126
127 // There are many forms of this optimization we can handle, for now, just do
128 // the simple index into a single-dimensional array.
129 //
130 // Require: GEP GV, 0, i {{, constant indices}}
131 if (GEP->getNumOperands() < 3 || !isa<ConstantInt>(GEP->getOperand(1)) ||
132 !cast<ConstantInt>(GEP->getOperand(1))->isZero() ||
133 isa<Constant>(GEP->getOperand(2)))
134 return nullptr;
135
136 // Check that indices after the variable are constants and in-range for the
137 // type they index. Collect the indices. This is typically for arrays of
138 // structs.
139 SmallVector<unsigned, 4> LaterIndices;
140
141 Type *EltTy = Init->getType()->getArrayElementType();
142 for (unsigned i = 3, e = GEP->getNumOperands(); i != e; ++i) {
143 ConstantInt *Idx = dyn_cast<ConstantInt>(GEP->getOperand(i));
144 if (!Idx)
145 return nullptr; // Variable index.
146
147 uint64_t IdxVal = Idx->getZExtValue();
148 if ((unsigned)IdxVal != IdxVal)
149 return nullptr; // Too large array index.
150
151 if (StructType *STy = dyn_cast<StructType>(EltTy))
152 EltTy = STy->getElementType(IdxVal);
153 else if (ArrayType *ATy = dyn_cast<ArrayType>(EltTy)) {
154 if (IdxVal >= ATy->getNumElements())
155 return nullptr;
156 EltTy = ATy->getElementType();
157 } else {
158 return nullptr; // Unknown type.
159 }
160
161 LaterIndices.push_back(IdxVal);
162 }
163
164 enum { Overdefined = -3, Undefined = -2 };
165
166 // Variables for our state machines.
167
168 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
169 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
170 // and 87 is the second (and last) index. FirstTrueElement is -2 when
171 // undefined, otherwise set to the first true element. SecondTrueElement is
172 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
173 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
174
175 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
176 // form "i != 47 & i != 87". Same state transitions as for true elements.
177 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
178
179 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
180 /// define a state machine that triggers for ranges of values that the index
181 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
182 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
183 /// index in the range (inclusive). We use -2 for undefined here because we
184 /// use relative comparisons and don't want 0-1 to match -1.
185 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
186
187 // MagicBitvector - This is a magic bitvector where we set a bit if the
188 // comparison is true for element 'i'. If there are 64 elements or less in
189 // the array, this will fully represent all the comparison results.
190 uint64_t MagicBitvector = 0;
191
192 // Scan the array and see if one of our patterns matches.
193 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
194 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i) {
195 Constant *Elt = Init->getAggregateElement(i);
196 if (!Elt)
197 return nullptr;
198
199 // If this is indexing an array of structures, get the structure element.
200 if (!LaterIndices.empty()) {
201 Elt = ConstantFoldExtractValueInstruction(Elt, LaterIndices);
202 if (!Elt)
203 return nullptr;
204 }
205
206 // If the element is masked, handle it.
207 if (AndCst) {
208 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
209 if (!Elt)
210 return nullptr;
211 }
212
213 // Find out if the comparison would be true or false for the i'th element.
215 CompareRHS, DL, &TLI);
216 if (!C)
217 return nullptr;
218
219 // If the result is undef for this element, ignore it.
220 if (isa<UndefValue>(C)) {
221 // Extend range state machines to cover this element in case there is an
222 // undef in the middle of the range.
223 if (TrueRangeEnd == (int)i - 1)
224 TrueRangeEnd = i;
225 if (FalseRangeEnd == (int)i - 1)
226 FalseRangeEnd = i;
227 continue;
228 }
229
230 // If we can't compute the result for any of the elements, we have to give
231 // up evaluating the entire conditional.
232 if (!isa<ConstantInt>(C))
233 return nullptr;
234
235 // Otherwise, we know if the comparison is true or false for this element,
236 // update our state machines.
237 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
238
239 // State machine for single/double/range index comparison.
240 if (IsTrueForElt) {
241 // Update the TrueElement state machine.
242 if (FirstTrueElement == Undefined)
243 FirstTrueElement = TrueRangeEnd = i; // First true element.
244 else {
245 // Update double-compare state machine.
246 if (SecondTrueElement == Undefined)
247 SecondTrueElement = i;
248 else
249 SecondTrueElement = Overdefined;
250
251 // Update range state machine.
252 if (TrueRangeEnd == (int)i - 1)
253 TrueRangeEnd = i;
254 else
255 TrueRangeEnd = Overdefined;
256 }
257 } else {
258 // Update the FalseElement state machine.
259 if (FirstFalseElement == Undefined)
260 FirstFalseElement = FalseRangeEnd = i; // First false element.
261 else {
262 // Update double-compare state machine.
263 if (SecondFalseElement == Undefined)
264 SecondFalseElement = i;
265 else
266 SecondFalseElement = Overdefined;
267
268 // Update range state machine.
269 if (FalseRangeEnd == (int)i - 1)
270 FalseRangeEnd = i;
271 else
272 FalseRangeEnd = Overdefined;
273 }
274 }
275
276 // If this element is in range, update our magic bitvector.
277 if (i < 64 && IsTrueForElt)
278 MagicBitvector |= 1ULL << i;
279
280 // If all of our states become overdefined, bail out early. Since the
281 // predicate is expensive, only check it every 8 elements. This is only
282 // really useful for really huge arrays.
283 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
284 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
285 FalseRangeEnd == Overdefined)
286 return nullptr;
287 }
288
289 // Now that we've scanned the entire array, emit our new comparison(s). We
290 // order the state machines in complexity of the generated code.
291 Value *Idx = GEP->getOperand(2);
292
293 // If the index is larger than the pointer offset size of the target, truncate
294 // the index down like the GEP would do implicitly. We don't have to do this
295 // for an inbounds GEP because the index can't be out of range.
296 if (!GEP->isInBounds()) {
297 Type *PtrIdxTy = DL.getIndexType(GEP->getType());
298 unsigned OffsetSize = PtrIdxTy->getIntegerBitWidth();
299 if (Idx->getType()->getPrimitiveSizeInBits().getFixedValue() > OffsetSize)
300 Idx = Builder.CreateTrunc(Idx, PtrIdxTy);
301 }
302
303 // If inbounds keyword is not present, Idx * ElementSize can overflow.
304 // Let's assume that ElementSize is 2 and the wanted value is at offset 0.
305 // Then, there are two possible values for Idx to match offset 0:
306 // 0x00..00, 0x80..00.
307 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
308 // comparison is false if Idx was 0x80..00.
309 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
310 unsigned ElementSize =
311 DL.getTypeAllocSize(Init->getType()->getArrayElementType());
312 auto MaskIdx = [&](Value *Idx) {
313 if (!GEP->isInBounds() && llvm::countr_zero(ElementSize) != 0) {
314 Value *Mask = Constant::getAllOnesValue(Idx->getType());
315 Mask = Builder.CreateLShr(Mask, llvm::countr_zero(ElementSize));
316 Idx = Builder.CreateAnd(Idx, Mask);
317 }
318 return Idx;
319 };
320
321 // If the comparison is only true for one or two elements, emit direct
322 // comparisons.
323 if (SecondTrueElement != Overdefined) {
324 Idx = MaskIdx(Idx);
325 // None true -> false.
326 if (FirstTrueElement == Undefined)
327 return replaceInstUsesWith(ICI, Builder.getFalse());
328
329 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
330
331 // True for one element -> 'i == 47'.
332 if (SecondTrueElement == Undefined)
333 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
334
335 // True for two elements -> 'i == 47 | i == 72'.
336 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
337 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
338 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
339 return BinaryOperator::CreateOr(C1, C2);
340 }
341
342 // If the comparison is only false for one or two elements, emit direct
343 // comparisons.
344 if (SecondFalseElement != Overdefined) {
345 Idx = MaskIdx(Idx);
346 // None false -> true.
347 if (FirstFalseElement == Undefined)
348 return replaceInstUsesWith(ICI, Builder.getTrue());
349
350 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
351
352 // False for one element -> 'i != 47'.
353 if (SecondFalseElement == Undefined)
354 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
355
356 // False for two elements -> 'i != 47 & i != 72'.
357 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
358 Value *SecondFalseIdx =
359 ConstantInt::get(Idx->getType(), SecondFalseElement);
360 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
361 return BinaryOperator::CreateAnd(C1, C2);
362 }
363
364 // If the comparison can be replaced with a range comparison for the elements
365 // where it is true, emit the range check.
366 if (TrueRangeEnd != Overdefined) {
367 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
368 Idx = MaskIdx(Idx);
369
370 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
371 if (FirstTrueElement) {
372 Value *Offs = ConstantInt::get(Idx->getType(), -FirstTrueElement);
373 Idx = Builder.CreateAdd(Idx, Offs);
374 }
375
376 Value *End =
377 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
378 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
379 }
380
381 // False range check.
382 if (FalseRangeEnd != Overdefined) {
383 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
384 Idx = MaskIdx(Idx);
385 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
386 if (FirstFalseElement) {
387 Value *Offs = ConstantInt::get(Idx->getType(), -FirstFalseElement);
388 Idx = Builder.CreateAdd(Idx, Offs);
389 }
390
391 Value *End =
392 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
393 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
394 }
395
396 // If a magic bitvector captures the entire comparison state
397 // of this load, replace it with computation that does:
398 // ((magic_cst >> i) & 1) != 0
399 {
400 Type *Ty = nullptr;
401
402 // Look for an appropriate type:
403 // - The type of Idx if the magic fits
404 // - The smallest fitting legal type
405 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
406 Ty = Idx->getType();
407 else
408 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
409
410 if (Ty) {
411 Idx = MaskIdx(Idx);
412 Value *V = Builder.CreateIntCast(Idx, Ty, false);
413 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
414 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
415 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
416 }
417 }
418
419 return nullptr;
420}
421
422/// Returns true if we can rewrite Start as a GEP with pointer Base
423/// and some integer offset. The nodes that need to be re-written
424/// for this transformation will be added to Explored.
426 const DataLayout &DL,
427 SetVector<Value *> &Explored) {
428 SmallVector<Value *, 16> WorkList(1, Start);
429 Explored.insert(Base);
430
431 // The following traversal gives us an order which can be used
432 // when doing the final transformation. Since in the final
433 // transformation we create the PHI replacement instructions first,
434 // we don't have to get them in any particular order.
435 //
436 // However, for other instructions we will have to traverse the
437 // operands of an instruction first, which means that we have to
438 // do a post-order traversal.
439 while (!WorkList.empty()) {
441
442 while (!WorkList.empty()) {
443 if (Explored.size() >= 100)
444 return false;
445
446 Value *V = WorkList.back();
447
448 if (Explored.contains(V)) {
449 WorkList.pop_back();
450 continue;
451 }
452
453 if (!isa<GetElementPtrInst>(V) && !isa<PHINode>(V))
454 // We've found some value that we can't explore which is different from
455 // the base. Therefore we can't do this transformation.
456 return false;
457
458 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
459 // Only allow inbounds GEPs with at most one variable offset.
460 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
461 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
462 return false;
463
464 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
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.CreateAdd(
582 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
583 /*NUW=*/NW.hasNoUnsignedWrap(),
584 /*NSW=*/NW.hasNoUnsignedSignedWrap());
585 continue;
586 }
587 if (isa<PHINode>(Val))
588 continue;
589
590 llvm_unreachable("Unexpected instruction type");
591 }
592
593 // Add the incoming values to the PHI nodes.
594 for (Value *Val : Explored) {
595 if (Val == Base)
596 continue;
597 // All the instructions have been created, we can now add edges to the
598 // phi nodes.
599 if (auto *PHI = dyn_cast<PHINode>(Val)) {
600 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
601 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
602 Value *NewIncoming = PHI->getIncomingValue(I);
603
604 auto It = NewInsts.find(NewIncoming);
605 if (It != NewInsts.end())
606 NewIncoming = It->second;
607
608 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
609 }
610 }
611 }
612
613 for (Value *Val : Explored) {
614 if (Val == Base)
615 continue;
616
617 setInsertionPoint(Builder, Val, false);
618 // Create GEP for external users.
619 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
620 Val->getName() + ".ptr", NW);
621 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
622 // Add old instruction to worklist for DCE. We don't directly remove it
623 // here because the original compare is one of the users.
624 IC.addToWorklist(cast<Instruction>(Val));
625 }
626
627 return NewInsts[Start];
628}
629
630/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
631/// We can look through PHIs, GEPs and casts in order to determine a common base
632/// between GEPLHS and RHS.
635 const DataLayout &DL,
636 InstCombiner &IC) {
637 // FIXME: Support vector of pointers.
638 if (GEPLHS->getType()->isVectorTy())
639 return nullptr;
640
641 if (!GEPLHS->hasAllConstantIndices())
642 return nullptr;
643
644 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
645 Value *PtrBase =
647 /*AllowNonInbounds*/ false);
648
649 // Bail if we looked through addrspacecast.
650 if (PtrBase->getType() != GEPLHS->getType())
651 return nullptr;
652
653 // The set of nodes that will take part in this transformation.
654 SetVector<Value *> Nodes;
655 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
656 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
657 return nullptr;
658
659 // We know we can re-write this as
660 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
661 // Since we've only looked through inbouds GEPs we know that we
662 // can't have overflow on either side. We can therefore re-write
663 // this as:
664 // OFFSET1 cmp OFFSET2
665 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
666
667 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
668 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
669 // offset. Since Index is the offset of LHS to the base pointer, we will now
670 // compare the offsets instead of comparing the pointers.
672 IC.Builder.getInt(Offset), NewRHS);
673}
674
675/// Fold comparisons between a GEP instruction and something else. At this point
676/// we know that the GEP is on the LHS of the comparison.
679 // Don't transform signed compares of GEPs into index compares. Even if the
680 // GEP is inbounds, the final add of the base pointer can have signed overflow
681 // and would change the result of the icmp.
682 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
683 // the maximum signed value for the pointer type.
685 return nullptr;
686
687 // Look through bitcasts and addrspacecasts. We do not however want to remove
688 // 0 GEPs.
689 if (!isa<GetElementPtrInst>(RHS))
691
692 auto CanFold = [Cond](GEPNoWrapFlags NW) {
694 return true;
695
696 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
698 return NW != GEPNoWrapFlags::none();
699 };
700
701 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
702 if (!NW.hasNoUnsignedWrap()) {
703 // Convert signed to unsigned comparison.
704 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
705 }
706
707 auto *I = new ICmpInst(Cond, Op1, Op2);
708 I->setSameSign(NW.hasNoUnsignedSignedWrap());
709 return I;
710 };
711
712 Value *PtrBase = GEPLHS->getOperand(0);
713 if (PtrBase == RHS && CanFold(GEPLHS->getNoWrapFlags())) {
714 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
715 Value *Offset = EmitGEPOffset(GEPLHS);
716 return NewICmp(GEPLHS->getNoWrapFlags(), Offset,
717 Constant::getNullValue(Offset->getType()));
718 }
719
720 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
721 isa<Constant>(RHS) && cast<Constant>(RHS)->isNullValue() &&
722 !NullPointerIsDefined(I.getFunction(),
724 // For most address spaces, an allocation can't be placed at null, but null
725 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
726 // the only valid inbounds address derived from null, is null itself.
727 // Thus, we have four cases to consider:
728 // 1) Base == nullptr, Offset == 0 -> inbounds, null
729 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
730 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
731 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
732 //
733 // (Note if we're indexing a type of size 0, that simply collapses into one
734 // of the buckets above.)
735 //
736 // In general, we're allowed to make values less poison (i.e. remove
737 // sources of full UB), so in this case, we just select between the two
738 // non-poison cases (1 and 4 above).
739 //
740 // For vectors, we apply the same reasoning on a per-lane basis.
741 auto *Base = GEPLHS->getPointerOperand();
742 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
743 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
745 }
746 return new ICmpInst(Cond, Base,
748 cast<Constant>(RHS), Base->getType()));
749 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
750 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
751
752 // If the base pointers are different, but the indices are the same, just
753 // compare the base pointer.
754 if (PtrBase != GEPRHS->getOperand(0)) {
755 bool IndicesTheSame =
756 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
757 GEPLHS->getPointerOperand()->getType() ==
758 GEPRHS->getPointerOperand()->getType() &&
759 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
760 if (IndicesTheSame)
761 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
762 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
763 IndicesTheSame = false;
764 break;
765 }
766
767 // If all indices are the same, just compare the base pointers.
768 Type *BaseType = GEPLHS->getOperand(0)->getType();
769 if (IndicesTheSame &&
770 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
771 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
772
773 // If we're comparing GEPs with two base pointers that only differ in type
774 // and both GEPs have only constant indices or just one use, then fold
775 // the compare with the adjusted indices.
776 // FIXME: Support vector of pointers.
777 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
778 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
779 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
780 PtrBase->stripPointerCasts() ==
781 GEPRHS->getOperand(0)->stripPointerCasts() &&
782 !GEPLHS->getType()->isVectorTy()) {
783 Value *LOffset = EmitGEPOffset(GEPLHS);
784 Value *ROffset = EmitGEPOffset(GEPRHS);
785
786 // If we looked through an addrspacecast between different sized address
787 // spaces, the LHS and RHS pointers are different sized
788 // integers. Truncate to the smaller one.
789 Type *LHSIndexTy = LOffset->getType();
790 Type *RHSIndexTy = ROffset->getType();
791 if (LHSIndexTy != RHSIndexTy) {
792 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
793 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
794 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
795 } else
796 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
797 }
798
800 LOffset, ROffset);
801 return replaceInstUsesWith(I, Cmp);
802 }
803
804 // Otherwise, the base pointers are different and the indices are
805 // different. Try convert this to an indexed compare by looking through
806 // PHIs/casts.
807 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
808 }
809
810 if (GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
811 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
812 // If the GEPs only differ by one index, compare it.
813 unsigned NumDifferences = 0; // Keep track of # differences.
814 unsigned DiffOperand = 0; // The operand that differs.
815 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
816 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
817 Type *LHSType = GEPLHS->getOperand(i)->getType();
818 Type *RHSType = GEPRHS->getOperand(i)->getType();
819 // FIXME: Better support for vector of pointers.
820 if (LHSType->getPrimitiveSizeInBits() !=
821 RHSType->getPrimitiveSizeInBits() ||
822 (GEPLHS->getType()->isVectorTy() &&
823 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
824 // Irreconcilable differences.
825 NumDifferences = 2;
826 break;
827 }
828
829 if (NumDifferences++) break;
830 DiffOperand = i;
831 }
832
833 if (NumDifferences == 0) // SAME GEP?
834 return replaceInstUsesWith(I, // No comparison is needed here.
835 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
836
837 else if (NumDifferences == 1 && CanFold(NW)) {
838 Value *LHSV = GEPLHS->getOperand(DiffOperand);
839 Value *RHSV = GEPRHS->getOperand(DiffOperand);
840 return NewICmp(NW, LHSV, RHSV);
841 }
842 }
843
844 if (CanFold(NW)) {
845 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
846 Value *L = EmitGEPOffset(GEPLHS, /*RewriteGEP=*/true);
847 Value *R = EmitGEPOffset(GEPRHS, /*RewriteGEP=*/true);
848 return NewICmp(NW, L, R);
849 }
850 }
851
852 // Try convert this to an indexed compare by looking through PHIs/casts as a
853 // last resort.
854 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
855}
856
858 // It would be tempting to fold away comparisons between allocas and any
859 // pointer not based on that alloca (e.g. an argument). However, even
860 // though such pointers cannot alias, they can still compare equal.
861 //
862 // But LLVM doesn't specify where allocas get their memory, so if the alloca
863 // doesn't escape we can argue that it's impossible to guess its value, and we
864 // can therefore act as if any such guesses are wrong.
865 //
866 // However, we need to ensure that this folding is consistent: We can't fold
867 // one comparison to false, and then leave a different comparison against the
868 // same value alone (as it might evaluate to true at runtime, leading to a
869 // contradiction). As such, this code ensures that all comparisons are folded
870 // at the same time, and there are no other escapes.
871
872 struct CmpCaptureTracker : public CaptureTracker {
873 AllocaInst *Alloca;
874 bool Captured = false;
875 /// The value of the map is a bit mask of which icmp operands the alloca is
876 /// used in.
878
879 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
880
881 void tooManyUses() override { Captured = true; }
882
883 bool captured(const Use *U) override {
884 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
885 // We need to check that U is based *only* on the alloca, and doesn't
886 // have other contributions from a select/phi operand.
887 // TODO: We could check whether getUnderlyingObjects() reduces to one
888 // object, which would allow looking through phi nodes.
889 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
890 // Collect equality icmps of the alloca, and don't treat them as
891 // captures.
892 ICmps[ICmp] |= 1u << U->getOperandNo();
893 return false;
894 }
895
896 Captured = true;
897 return true;
898 }
899 };
900
901 CmpCaptureTracker Tracker(Alloca);
902 PointerMayBeCaptured(Alloca, &Tracker);
903 if (Tracker.Captured)
904 return false;
905
906 bool Changed = false;
907 for (auto [ICmp, Operands] : Tracker.ICmps) {
908 switch (Operands) {
909 case 1:
910 case 2: {
911 // The alloca is only used in one icmp operand. Assume that the
912 // equality is false.
913 auto *Res = ConstantInt::get(
914 ICmp->getType(), ICmp->getPredicate() == ICmpInst::ICMP_NE);
915 replaceInstUsesWith(*ICmp, Res);
917 Changed = true;
918 break;
919 }
920 case 3:
921 // Both icmp operands are based on the alloca, so this is comparing
922 // pointer offsets, without leaking any information about the address
923 // of the alloca. Ignore such comparisons.
924 break;
925 default:
926 llvm_unreachable("Cannot happen");
927 }
928 }
929
930 return Changed;
931}
932
933/// Fold "icmp pred (X+C), X".
935 CmpPredicate Pred) {
936 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
937 // so the values can never be equal. Similarly for all other "or equals"
938 // operators.
939 assert(!!C && "C should not be zero!");
940
941 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
942 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
943 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
944 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
945 Constant *R = ConstantInt::get(X->getType(),
946 APInt::getMaxValue(C.getBitWidth()) - C);
947 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
948 }
949
950 // (X+1) >u X --> X <u (0-1) --> X != 255
951 // (X+2) >u X --> X <u (0-2) --> X <u 254
952 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
953 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
954 return new ICmpInst(ICmpInst::ICMP_ULT, X,
955 ConstantInt::get(X->getType(), -C));
956
957 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
958
959 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
960 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
961 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
962 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
963 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
964 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
965 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
966 return new ICmpInst(ICmpInst::ICMP_SGT, X,
967 ConstantInt::get(X->getType(), SMax - C));
968
969 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
970 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
971 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
972 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
973 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
974 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
975
976 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
977 return new ICmpInst(ICmpInst::ICMP_SLT, X,
978 ConstantInt::get(X->getType(), SMax - (C - 1)));
979}
980
981/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
982/// (icmp eq/ne A, Log2(AP2/AP1)) ->
983/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
985 const APInt &AP1,
986 const APInt &AP2) {
987 assert(I.isEquality() && "Cannot fold icmp gt/lt");
988
989 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
990 if (I.getPredicate() == I.ICMP_NE)
991 Pred = CmpInst::getInversePredicate(Pred);
992 return new ICmpInst(Pred, LHS, RHS);
993 };
994
995 // Don't bother doing any work for cases which InstSimplify handles.
996 if (AP2.isZero())
997 return nullptr;
998
999 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
1000 if (IsAShr) {
1001 if (AP2.isAllOnes())
1002 return nullptr;
1003 if (AP2.isNegative() != AP1.isNegative())
1004 return nullptr;
1005 if (AP2.sgt(AP1))
1006 return nullptr;
1007 }
1008
1009 if (!AP1)
1010 // 'A' must be large enough to shift out the highest set bit.
1011 return getICmp(I.ICMP_UGT, A,
1012 ConstantInt::get(A->getType(), AP2.logBase2()));
1013
1014 if (AP1 == AP2)
1015 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1016
1017 int Shift;
1018 if (IsAShr && AP1.isNegative())
1019 Shift = AP1.countl_one() - AP2.countl_one();
1020 else
1021 Shift = AP1.countl_zero() - AP2.countl_zero();
1022
1023 if (Shift > 0) {
1024 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1025 // There are multiple solutions if we are comparing against -1 and the LHS
1026 // of the ashr is not a power of two.
1027 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1028 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1029 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1030 } else if (AP1 == AP2.lshr(Shift)) {
1031 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1032 }
1033 }
1034
1035 // Shifting const2 will never be equal to const1.
1036 // FIXME: This should always be handled by InstSimplify?
1037 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1038 return replaceInstUsesWith(I, TorF);
1039}
1040
1041/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1042/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1044 const APInt &AP1,
1045 const APInt &AP2) {
1046 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1047
1048 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1049 if (I.getPredicate() == I.ICMP_NE)
1050 Pred = CmpInst::getInversePredicate(Pred);
1051 return new ICmpInst(Pred, LHS, RHS);
1052 };
1053
1054 // Don't bother doing any work for cases which InstSimplify handles.
1055 if (AP2.isZero())
1056 return nullptr;
1057
1058 unsigned AP2TrailingZeros = AP2.countr_zero();
1059
1060 if (!AP1 && AP2TrailingZeros != 0)
1061 return getICmp(
1062 I.ICMP_UGE, A,
1063 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1064
1065 if (AP1 == AP2)
1066 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1067
1068 // Get the distance between the lowest bits that are set.
1069 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1070
1071 if (Shift > 0 && AP2.shl(Shift) == AP1)
1072 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1073
1074 // Shifting const2 will never be equal to const1.
1075 // FIXME: This should always be handled by InstSimplify?
1076 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1077 return replaceInstUsesWith(I, TorF);
1078}
1079
1080/// The caller has matched a pattern of the form:
1081/// I = icmp ugt (add (add A, B), CI2), CI1
1082/// If this is of the form:
1083/// sum = a + b
1084/// if (sum+128 >u 255)
1085/// Then replace it with llvm.sadd.with.overflow.i8.
1086///
1088 ConstantInt *CI2, ConstantInt *CI1,
1089 InstCombinerImpl &IC) {
1090 // The transformation we're trying to do here is to transform this into an
1091 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1092 // with a narrower add, and discard the add-with-constant that is part of the
1093 // range check (if we can't eliminate it, this isn't profitable).
1094
1095 // In order to eliminate the add-with-constant, the compare can be its only
1096 // use.
1097 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1098 if (!AddWithCst->hasOneUse())
1099 return nullptr;
1100
1101 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1102 if (!CI2->getValue().isPowerOf2())
1103 return nullptr;
1104 unsigned NewWidth = CI2->getValue().countr_zero();
1105 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1106 return nullptr;
1107
1108 // The width of the new add formed is 1 more than the bias.
1109 ++NewWidth;
1110
1111 // Check to see that CI1 is an all-ones value with NewWidth bits.
1112 if (CI1->getBitWidth() == NewWidth ||
1113 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1114 return nullptr;
1115
1116 // This is only really a signed overflow check if the inputs have been
1117 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1118 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1119 if (IC.ComputeMaxSignificantBits(A, 0, &I) > NewWidth ||
1120 IC.ComputeMaxSignificantBits(B, 0, &I) > NewWidth)
1121 return nullptr;
1122
1123 // In order to replace the original add with a narrower
1124 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1125 // and truncates that discard the high bits of the add. Verify that this is
1126 // the case.
1127 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1128 for (User *U : OrigAdd->users()) {
1129 if (U == AddWithCst)
1130 continue;
1131
1132 // Only accept truncates for now. We would really like a nice recursive
1133 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1134 // chain to see which bits of a value are actually demanded. If the
1135 // original add had another add which was then immediately truncated, we
1136 // could still do the transformation.
1137 TruncInst *TI = dyn_cast<TruncInst>(U);
1138 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1139 return nullptr;
1140 }
1141
1142 // If the pattern matches, truncate the inputs to the narrower type and
1143 // use the sadd_with_overflow intrinsic to efficiently compute both the
1144 // result and the overflow bit.
1145 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1147 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1148
1149 InstCombiner::BuilderTy &Builder = IC.Builder;
1150
1151 // Put the new code above the original add, in case there are any uses of the
1152 // add between the add and the compare.
1153 Builder.SetInsertPoint(OrigAdd);
1154
1155 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1156 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1157 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1158 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1159 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1160
1161 // The inner add was the result of the narrow add, zero extended to the
1162 // wider type. Replace it with the result computed by the intrinsic.
1163 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1164 IC.eraseInstFromFunction(*OrigAdd);
1165
1166 // The original icmp gets replaced with the overflow value.
1167 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1168}
1169
1170/// If we have:
1171/// icmp eq/ne (urem/srem %x, %y), 0
1172/// iff %y is a power-of-two, we can replace this with a bit test:
1173/// icmp eq/ne (and %x, (add %y, -1)), 0
1175 // This fold is only valid for equality predicates.
1176 if (!I.isEquality())
1177 return nullptr;
1178 CmpPredicate Pred;
1179 Value *X, *Y, *Zero;
1180 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1181 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1182 return nullptr;
1183 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, 0, &I))
1184 return nullptr;
1185 // This may increase instruction count, we don't enforce that Y is a constant.
1186 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1187 Value *Masked = Builder.CreateAnd(X, Mask);
1188 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1189}
1190
1191/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1192/// by one-less-than-bitwidth into a sign test on the original value.
1194 Instruction *Val;
1195 CmpPredicate Pred;
1196 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1197 return nullptr;
1198
1199 Value *X;
1200 Type *XTy;
1201
1202 Constant *C;
1203 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1204 XTy = X->getType();
1205 unsigned XBitWidth = XTy->getScalarSizeInBits();
1207 APInt(XBitWidth, XBitWidth - 1))))
1208 return nullptr;
1209 } else if (isa<BinaryOperator>(Val) &&
1211 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1212 /*AnalyzeForSignBitExtraction=*/true))) {
1213 XTy = X->getType();
1214 } else
1215 return nullptr;
1216
1217 return ICmpInst::Create(Instruction::ICmp,
1221}
1222
1223// Handle icmp pred X, 0
1225 CmpInst::Predicate Pred = Cmp.getPredicate();
1226 if (!match(Cmp.getOperand(1), m_Zero()))
1227 return nullptr;
1228
1229 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1230 if (Pred == ICmpInst::ICMP_SGT) {
1231 Value *A, *B;
1232 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1234 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1236 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1237 }
1238 }
1239
1241 return New;
1242
1243 // Given:
1244 // icmp eq/ne (urem %x, %y), 0
1245 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1246 // icmp eq/ne %x, 0
1247 Value *X, *Y;
1248 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1249 ICmpInst::isEquality(Pred)) {
1250 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1251 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1252 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1253 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1254 }
1255
1256 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1257 // odd/non-zero/there is no overflow.
1258 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1259 ICmpInst::isEquality(Pred)) {
1260
1261 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1262 // if X % 2 != 0
1263 // (icmp eq/ne Y)
1264 if (XKnown.countMaxTrailingZeros() == 0)
1265 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1266
1267 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1268 // if Y % 2 != 0
1269 // (icmp eq/ne X)
1270 if (YKnown.countMaxTrailingZeros() == 0)
1271 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1272
1273 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1274 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1275 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1276 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1277 // but to avoid unnecessary work, first just if this is an obvious case.
1278
1279 // if X non-zero and NoOverflow(X * Y)
1280 // (icmp eq/ne Y)
1281 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1282 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1283
1284 // if Y non-zero and NoOverflow(X * Y)
1285 // (icmp eq/ne X)
1286 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1287 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1288 }
1289 // Note, we are skipping cases:
1290 // if Y % 2 != 0 AND X % 2 != 0
1291 // (false/true)
1292 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1293 // (false/true)
1294 // Those can be simplified later as we would have already replaced the (icmp
1295 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1296 // will fold to a constant elsewhere.
1297 }
1298 return nullptr;
1299}
1300
1301/// Fold icmp Pred X, C.
1302/// TODO: This code structure does not make sense. The saturating add fold
1303/// should be moved to some other helper and extended as noted below (it is also
1304/// possible that code has been made unnecessary - do we canonicalize IR to
1305/// overflow/saturating intrinsics or not?).
1307 // Match the following pattern, which is a common idiom when writing
1308 // overflow-safe integer arithmetic functions. The source performs an addition
1309 // in wider type and explicitly checks for overflow using comparisons against
1310 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1311 //
1312 // TODO: This could probably be generalized to handle other overflow-safe
1313 // operations if we worked out the formulas to compute the appropriate magic
1314 // constants.
1315 //
1316 // sum = a + b
1317 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1318 CmpInst::Predicate Pred = Cmp.getPredicate();
1319 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1320 Value *A, *B;
1321 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1322 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1323 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1324 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1325 return Res;
1326
1327 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1328 Constant *C = dyn_cast<Constant>(Op1);
1329 if (!C)
1330 return nullptr;
1331
1332 if (auto *Phi = dyn_cast<PHINode>(Op0))
1333 if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) {
1335 for (Value *V : Phi->incoming_values()) {
1336 Constant *Res =
1337 ConstantFoldCompareInstOperands(Pred, cast<Constant>(V), C, DL);
1338 if (!Res)
1339 return nullptr;
1340 Ops.push_back(Res);
1341 }
1343 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1344 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1345 NewPhi->addIncoming(V, Pred);
1346 return replaceInstUsesWith(Cmp, NewPhi);
1347 }
1348
1350 return R;
1351
1352 return nullptr;
1353}
1354
1355/// Canonicalize icmp instructions based on dominating conditions.
1357 // We already checked simple implication in InstSimplify, only handle complex
1358 // cases here.
1359 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1360 const APInt *C;
1361 if (!match(Y, m_APInt(C)))
1362 return nullptr;
1363
1364 CmpInst::Predicate Pred = Cmp.getPredicate();
1366
1367 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1368 const APInt *DomC) -> Instruction * {
1369 // We have 2 compares of a variable with constants. Calculate the constant
1370 // ranges of those compares to see if we can transform the 2nd compare:
1371 // DomBB:
1372 // DomCond = icmp DomPred X, DomC
1373 // br DomCond, CmpBB, FalseBB
1374 // CmpBB:
1375 // Cmp = icmp Pred X, C
1376 ConstantRange DominatingCR =
1377 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1378 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1379 ConstantRange Difference = DominatingCR.difference(CR);
1380 if (Intersection.isEmptySet())
1381 return replaceInstUsesWith(Cmp, Builder.getFalse());
1382 if (Difference.isEmptySet())
1383 return replaceInstUsesWith(Cmp, Builder.getTrue());
1384
1385 // Canonicalizing a sign bit comparison that gets used in a branch,
1386 // pessimizes codegen by generating branch on zero instruction instead
1387 // of a test and branch. So we avoid canonicalizing in such situations
1388 // because test and branch instruction has better branch displacement
1389 // than compare and branch instruction.
1390 bool UnusedBit;
1391 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1392 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1393 return nullptr;
1394
1395 // Avoid an infinite loop with min/max canonicalization.
1396 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1397 if (Cmp.hasOneUse() &&
1398 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1399 return nullptr;
1400
1401 if (const APInt *EqC = Intersection.getSingleElement())
1402 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1403 if (const APInt *NeC = Difference.getSingleElement())
1404 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1405 return nullptr;
1406 };
1407
1408 for (BranchInst *BI : DC.conditionsFor(X)) {
1409 CmpPredicate DomPred;
1410 const APInt *DomC;
1411 if (!match(BI->getCondition(),
1412 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1413 continue;
1414
1415 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1416 if (DT.dominates(Edge0, Cmp.getParent())) {
1417 if (auto *V = handleDomCond(DomPred, DomC))
1418 return V;
1419 } else {
1420 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1421 if (DT.dominates(Edge1, Cmp.getParent()))
1422 if (auto *V =
1423 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1424 return V;
1425 }
1426 }
1427
1428 return nullptr;
1429}
1430
1431/// Fold icmp (trunc X), C.
1433 TruncInst *Trunc,
1434 const APInt &C) {
1435 ICmpInst::Predicate Pred = Cmp.getPredicate();
1436 Value *X = Trunc->getOperand(0);
1437 Type *SrcTy = X->getType();
1438 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1439 SrcBits = SrcTy->getScalarSizeInBits();
1440
1441 // Match (icmp pred (trunc nuw/nsw X), C)
1442 // Which we can convert to (icmp pred X, (sext/zext C))
1443 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1444 if (Trunc->hasNoSignedWrap())
1445 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1446 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1447 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1448 }
1449
1450 if (C.isOne() && C.getBitWidth() > 1) {
1451 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1452 Value *V = nullptr;
1453 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1454 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1455 ConstantInt::get(V->getType(), 1));
1456 }
1457
1458 // TODO: Handle any shifted constant by subtracting trailing zeros.
1459 // TODO: Handle non-equality predicates.
1460 Value *Y;
1461 if (Cmp.isEquality() && match(X, m_Shl(m_One(), m_Value(Y)))) {
1462 // (trunc (1 << Y) to iN) == 0 --> Y u>= N
1463 // (trunc (1 << Y) to iN) != 0 --> Y u< N
1464 if (C.isZero()) {
1465 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1466 return new ICmpInst(NewPred, Y, ConstantInt::get(SrcTy, DstBits));
1467 }
1468 // (trunc (1 << Y) to iN) == 2**C --> Y == C
1469 // (trunc (1 << Y) to iN) != 2**C --> Y != C
1470 if (C.isPowerOf2())
1471 return new ICmpInst(Pred, Y, ConstantInt::get(SrcTy, C.logBase2()));
1472 }
1473
1474 if (Cmp.isEquality() && Trunc->hasOneUse()) {
1475 // Canonicalize to a mask and wider compare if the wide type is suitable:
1476 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1477 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1478 Constant *Mask =
1479 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1480 Value *And = Builder.CreateAnd(X, Mask);
1481 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1482 return new ICmpInst(Pred, And, WideC);
1483 }
1484
1485 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1486 // of the high bits truncated out of x are known.
1487 KnownBits Known = computeKnownBits(X, 0, &Cmp);
1488
1489 // If all the high bits are known, we can do this xform.
1490 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1491 // Pull in the high bits from known-ones set.
1492 APInt NewRHS = C.zext(SrcBits);
1493 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1494 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1495 }
1496 }
1497
1498 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1499 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1500 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1501 Value *ShOp;
1502 const APInt *ShAmtC;
1503 bool TrueIfSigned;
1504 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1505 match(X, m_Shr(m_Value(ShOp), m_APInt(ShAmtC))) &&
1506 DstBits == SrcBits - ShAmtC->getZExtValue()) {
1507 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1509 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1511 }
1512
1513 return nullptr;
1514}
1515
1516/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1517/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1520 const SimplifyQuery &Q) {
1521 Value *X, *Y;
1522 CmpPredicate Pred;
1523 bool YIsSExt = false;
1524 // Try to match icmp (trunc X), (trunc Y)
1525 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1526 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1527 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1528 if (Cmp.isSigned()) {
1529 // For signed comparisons, both truncs must be nsw.
1530 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1531 return nullptr;
1532 } else {
1533 // For unsigned and equality comparisons, either both must be nuw or
1534 // both must be nsw, we don't care which.
1535 if (!NoWrapFlags)
1536 return nullptr;
1537 }
1538
1539 if (X->getType() != Y->getType() &&
1540 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1541 return nullptr;
1542 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1543 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1544 std::swap(X, Y);
1545 Pred = Cmp.getSwappedPredicate(Pred);
1546 }
1547 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1548 }
1549 // Try to match icmp (trunc nuw X), (zext Y)
1550 else if (!Cmp.isSigned() &&
1551 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1552 m_OneUse(m_ZExt(m_Value(Y)))))) {
1553 // Can fold trunc nuw + zext for unsigned and equality predicates.
1554 }
1555 // Try to match icmp (trunc nsw X), (sext Y)
1556 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1558 // Can fold trunc nsw + zext/sext for all predicates.
1559 YIsSExt =
1560 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1561 } else
1562 return nullptr;
1563
1564 Type *TruncTy = Cmp.getOperand(0)->getType();
1565 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1566
1567 // If this transform will end up changing from desirable types -> undesirable
1568 // types skip it.
1569 if (isDesirableIntType(TruncBits) &&
1570 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1571 return nullptr;
1572
1573 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1574 return new ICmpInst(Pred, X, NewY);
1575}
1576
1577/// Fold icmp (xor X, Y), C.
1580 const APInt &C) {
1581 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1582 return I;
1583
1584 Value *X = Xor->getOperand(0);
1585 Value *Y = Xor->getOperand(1);
1586 const APInt *XorC;
1587 if (!match(Y, m_APInt(XorC)))
1588 return nullptr;
1589
1590 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1591 // fold the xor.
1592 ICmpInst::Predicate Pred = Cmp.getPredicate();
1593 bool TrueIfSigned = false;
1594 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1595
1596 // If the sign bit of the XorCst is not set, there is no change to
1597 // the operation, just stop using the Xor.
1598 if (!XorC->isNegative())
1599 return replaceOperand(Cmp, 0, X);
1600
1601 // Emit the opposite comparison.
1602 if (TrueIfSigned)
1603 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1604 ConstantInt::getAllOnesValue(X->getType()));
1605 else
1606 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1607 ConstantInt::getNullValue(X->getType()));
1608 }
1609
1610 if (Xor->hasOneUse()) {
1611 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1612 if (!Cmp.isEquality() && XorC->isSignMask()) {
1613 Pred = Cmp.getFlippedSignednessPredicate();
1614 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1615 }
1616
1617 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1618 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1619 Pred = Cmp.getFlippedSignednessPredicate();
1620 Pred = Cmp.getSwappedPredicate(Pred);
1621 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1622 }
1623 }
1624
1625 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1626 if (Pred == ICmpInst::ICMP_UGT) {
1627 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1628 if (*XorC == ~C && (C + 1).isPowerOf2())
1629 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1630 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1631 if (*XorC == C && (C + 1).isPowerOf2())
1632 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1633 }
1634 if (Pred == ICmpInst::ICMP_ULT) {
1635 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1636 if (*XorC == -C && C.isPowerOf2())
1637 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1638 ConstantInt::get(X->getType(), ~C));
1639 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1640 if (*XorC == C && (-C).isPowerOf2())
1641 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1642 ConstantInt::get(X->getType(), ~C));
1643 }
1644 return nullptr;
1645}
1646
1647/// For power-of-2 C:
1648/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1649/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1652 const APInt &C) {
1653 CmpInst::Predicate Pred = Cmp.getPredicate();
1654 APInt PowerOf2;
1655 if (Pred == ICmpInst::ICMP_ULT)
1656 PowerOf2 = C;
1657 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1658 PowerOf2 = C + 1;
1659 else
1660 return nullptr;
1661 if (!PowerOf2.isPowerOf2())
1662 return nullptr;
1663 Value *X;
1664 const APInt *ShiftC;
1666 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1667 return nullptr;
1668 uint64_t Shift = ShiftC->getLimitedValue();
1669 Type *XType = X->getType();
1670 if (Shift == 0 || PowerOf2.isMinSignedValue())
1671 return nullptr;
1672 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1673 APInt Bound =
1674 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1675 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1676}
1677
1678/// Fold icmp (and (sh X, Y), C2), C1.
1681 const APInt &C1,
1682 const APInt &C2) {
1683 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1684 if (!Shift || !Shift->isShift())
1685 return nullptr;
1686
1687 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1688 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1689 // code produced by the clang front-end, for bitfield access.
1690 // This seemingly simple opportunity to fold away a shift turns out to be
1691 // rather complicated. See PR17827 for details.
1692 unsigned ShiftOpcode = Shift->getOpcode();
1693 bool IsShl = ShiftOpcode == Instruction::Shl;
1694 const APInt *C3;
1695 if (match(Shift->getOperand(1), m_APInt(C3))) {
1696 APInt NewAndCst, NewCmpCst;
1697 bool AnyCmpCstBitsShiftedOut;
1698 if (ShiftOpcode == Instruction::Shl) {
1699 // For a left shift, we can fold if the comparison is not signed. We can
1700 // also fold a signed comparison if the mask value and comparison value
1701 // are not negative. These constraints may not be obvious, but we can
1702 // prove that they are correct using an SMT solver.
1703 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1704 return nullptr;
1705
1706 NewCmpCst = C1.lshr(*C3);
1707 NewAndCst = C2.lshr(*C3);
1708 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1709 } else if (ShiftOpcode == Instruction::LShr) {
1710 // For a logical right shift, we can fold if the comparison is not signed.
1711 // We can also fold a signed comparison if the shifted mask value and the
1712 // shifted comparison value are not negative. These constraints may not be
1713 // obvious, but we can prove that they are correct using an SMT solver.
1714 NewCmpCst = C1.shl(*C3);
1715 NewAndCst = C2.shl(*C3);
1716 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1717 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1718 return nullptr;
1719 } else {
1720 // For an arithmetic shift, check that both constants don't use (in a
1721 // signed sense) the top bits being shifted out.
1722 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1723 NewCmpCst = C1.shl(*C3);
1724 NewAndCst = C2.shl(*C3);
1725 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1726 if (NewAndCst.ashr(*C3) != C2)
1727 return nullptr;
1728 }
1729
1730 if (AnyCmpCstBitsShiftedOut) {
1731 // If we shifted bits out, the fold is not going to work out. As a
1732 // special case, check to see if this means that the result is always
1733 // true or false now.
1734 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1735 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1736 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1737 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1738 } else {
1739 Value *NewAnd = Builder.CreateAnd(
1740 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1741 return new ICmpInst(Cmp.getPredicate(),
1742 NewAnd, ConstantInt::get(And->getType(), NewCmpCst));
1743 }
1744 }
1745
1746 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1747 // preferable because it allows the C2 << Y expression to be hoisted out of a
1748 // loop if Y is invariant and X is not.
1749 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1750 !Shift->isArithmeticShift() &&
1751 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1752 // Compute C2 << Y.
1753 Value *NewShift =
1754 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1755 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1756
1757 // Compute X & (C2 << Y).
1758 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1759 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1760 }
1761
1762 return nullptr;
1763}
1764
1765/// Fold icmp (and X, C2), C1.
1768 const APInt &C1) {
1769 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1770
1771 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1772 // TODO: We canonicalize to the longer form for scalars because we have
1773 // better analysis/folds for icmp, and codegen may be better with icmp.
1774 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1775 match(And->getOperand(1), m_One()))
1776 return new TruncInst(And->getOperand(0), Cmp.getType());
1777
1778 const APInt *C2;
1779 Value *X;
1780 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1781 return nullptr;
1782
1783 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1784 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1785 C2->isNegatedPowerOf2())
1786 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1787 ConstantInt::get(X->getType(), ~*C2));
1788 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1789 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1790 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1791 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1792 ConstantInt::get(X->getType(), -*C2));
1793
1794 // Don't perform the following transforms if the AND has multiple uses
1795 if (!And->hasOneUse())
1796 return nullptr;
1797
1798 if (Cmp.isEquality() && C1.isZero()) {
1799 // Restrict this fold to single-use 'and' (PR10267).
1800 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1801 if (C2->isSignMask()) {
1802 Constant *Zero = Constant::getNullValue(X->getType());
1803 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1804 return new ICmpInst(NewPred, X, Zero);
1805 }
1806
1807 APInt NewC2 = *C2;
1808 KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
1809 // Set high zeros of C2 to allow matching negated power-of-2.
1810 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1811 Know.countMinLeadingZeros());
1812
1813 // Restrict this fold only for single-use 'and' (PR10267).
1814 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1815 if (NewC2.isNegatedPowerOf2()) {
1816 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1817 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1818 return new ICmpInst(NewPred, X, NegBOC);
1819 }
1820 }
1821
1822 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1823 // the input width without changing the value produced, eliminate the cast:
1824 //
1825 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1826 //
1827 // We can do this transformation if the constants do not have their sign bits
1828 // set or if it is an equality comparison. Extending a relational comparison
1829 // when we're checking the sign bit would not work.
1830 Value *W;
1831 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1832 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1833 // TODO: Is this a good transform for vectors? Wider types may reduce
1834 // throughput. Should this transform be limited (even for scalars) by using
1835 // shouldChangeType()?
1836 if (!Cmp.getType()->isVectorTy()) {
1837 Type *WideType = W->getType();
1838 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1839 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1840 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1841 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1842 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1843 }
1844 }
1845
1846 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1847 return I;
1848
1849 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1850 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1851 //
1852 // iff pred isn't signed
1853 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1854 match(And->getOperand(1), m_One())) {
1855 Constant *One = cast<Constant>(And->getOperand(1));
1856 Value *Or = And->getOperand(0);
1857 Value *A, *B, *LShr;
1858 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1859 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1860 unsigned UsesRemoved = 0;
1861 if (And->hasOneUse())
1862 ++UsesRemoved;
1863 if (Or->hasOneUse())
1864 ++UsesRemoved;
1865 if (LShr->hasOneUse())
1866 ++UsesRemoved;
1867
1868 // Compute A & ((1 << B) | 1)
1869 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1870 if (UsesRemoved >= RequireUsesRemoved) {
1871 Value *NewOr =
1872 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1873 /*HasNUW=*/true),
1874 One, Or->getName());
1875 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1876 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1877 }
1878 }
1879 }
1880
1881 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1882 // llvm.is.fpclass(X, fcInf|fcNan)
1883 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1884 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1885 Value *V;
1886 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1887 Attribute::NoImplicitFloat) &&
1888 Cmp.isEquality() &&
1890 Type *FPType = V->getType()->getScalarType();
1891 if (FPType->isIEEELikeFPTy() && C1 == *C2) {
1892 APInt ExponentMask =
1893 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1894 if (C1 == ExponentMask) {
1895 unsigned Mask = FPClassTest::fcNan | FPClassTest::fcInf;
1896 if (isICMP_NE)
1897 Mask = ~Mask & fcAllFlags;
1898 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1899 }
1900 }
1901 }
1902
1903 return nullptr;
1904}
1905
1906/// Fold icmp (and X, Y), C.
1909 const APInt &C) {
1910 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1911 return I;
1912
1913 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1914 bool TrueIfNeg;
1915 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1916 // ((X - 1) & ~X) < 0 --> X == 0
1917 // ((X - 1) & ~X) >= 0 --> X != 0
1918 Value *X;
1919 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1920 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1921 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1922 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1923 }
1924 // (X & -X) < 0 --> X == MinSignedC
1925 // (X & -X) > -1 --> X != MinSignedC
1926 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1927 Constant *MinSignedC = ConstantInt::get(
1928 X->getType(),
1929 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1930 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1931 return new ICmpInst(NewPred, X, MinSignedC);
1932 }
1933 }
1934
1935 // TODO: These all require that Y is constant too, so refactor with the above.
1936
1937 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1938 Value *X = And->getOperand(0);
1939 Value *Y = And->getOperand(1);
1940 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1941 if (auto *LI = dyn_cast<LoadInst>(X))
1942 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1943 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
1944 if (Instruction *Res =
1945 foldCmpLoadFromIndexedGlobal(LI, GEP, GV, Cmp, C2))
1946 return Res;
1947
1948 if (!Cmp.isEquality())
1949 return nullptr;
1950
1951 // X & -C == -C -> X > u ~C
1952 // X & -C != -C -> X <= u ~C
1953 // iff C is a power of 2
1954 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1955 auto NewPred =
1957 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1958 }
1959
1960 // If we are testing the intersection of 2 select-of-nonzero-constants with no
1961 // common bits set, it's the same as checking if exactly one select condition
1962 // is set:
1963 // ((A ? TC : FC) & (B ? TC : FC)) == 0 --> xor A, B
1964 // ((A ? TC : FC) & (B ? TC : FC)) != 0 --> not(xor A, B)
1965 // TODO: Generalize for non-constant values.
1966 // TODO: Handle signed/unsigned predicates.
1967 // TODO: Handle other bitwise logic connectors.
1968 // TODO: Extend to handle a non-zero compare constant.
1969 if (C.isZero() && (Pred == CmpInst::ICMP_EQ || And->hasOneUse())) {
1970 assert(Cmp.isEquality() && "Not expecting non-equality predicates");
1971 Value *A, *B;
1972 const APInt *TC, *FC;
1973 if (match(X, m_Select(m_Value(A), m_APInt(TC), m_APInt(FC))) &&
1974 match(Y,
1975 m_Select(m_Value(B), m_SpecificInt(*TC), m_SpecificInt(*FC))) &&
1976 !TC->isZero() && !FC->isZero() && !TC->intersects(*FC)) {
1977 Value *R = Builder.CreateXor(A, B);
1978 if (Pred == CmpInst::ICMP_NE)
1979 R = Builder.CreateNot(R);
1980 return replaceInstUsesWith(Cmp, R);
1981 }
1982 }
1983
1984 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1985 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1986 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1987 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1989 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1990 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1991 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1992 Value *And = Builder.CreateAnd(TruncY, X);
1994 }
1995 return BinaryOperator::CreateAnd(TruncY, X);
1996 }
1997
1998 // (icmp eq/ne (and (shl -1, X), Y), 0)
1999 // -> (icmp eq/ne (lshr Y, X), 0)
2000 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
2001 // highly unlikely the non-zero case will ever show up in code.
2002 if (C.isZero() &&
2004 m_Value(Y))))) {
2005 Value *LShr = Builder.CreateLShr(Y, X);
2006 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
2007 }
2008
2009 // (icmp eq/ne (and (add A, Addend), Msk), C)
2010 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2011 {
2012 Value *A;
2013 const APInt *Addend, *Msk;
2014 if (match(And, m_And(m_OneUse(m_Add(m_Value(A), m_APInt(Addend))),
2015 m_APInt(Msk))) &&
2016 Msk->isMask() && C.ule(*Msk)) {
2017 APInt NewComperand = (C - *Addend) & *Msk;
2018 Value* MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2019 return new ICmpInst(
2020 Pred, MaskA,
2021 Constant::getIntegerValue(MaskA->getType(), NewComperand));
2022 }
2023 }
2024
2025 return nullptr;
2026}
2027
2028/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2030 InstCombiner::BuilderTy &Builder) {
2031 // Are we using xors or subs to bitwise check for a pair or pairs of
2032 // (in)equalities? Convert to a shorter form that has more potential to be
2033 // folded even further.
2034 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2035 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2036 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2037 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2038 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2039 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2041 SmallVector<Value *, 16> WorkList(1, Or);
2042
2043 while (!WorkList.empty()) {
2044 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2045 Value *Lhs, *Rhs;
2046
2047 if (match(OrOperatorArgument,
2048 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2049 CmpValues.emplace_back(Lhs, Rhs);
2050 return;
2051 }
2052
2053 if (match(OrOperatorArgument,
2054 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2055 CmpValues.emplace_back(Lhs, Rhs);
2056 return;
2057 }
2058
2059 WorkList.push_back(OrOperatorArgument);
2060 };
2061
2062 Value *CurrentValue = WorkList.pop_back_val();
2063 Value *OrOperatorLhs, *OrOperatorRhs;
2064
2065 if (!match(CurrentValue,
2066 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2067 return nullptr;
2068 }
2069
2070 MatchOrOperatorArgument(OrOperatorRhs);
2071 MatchOrOperatorArgument(OrOperatorLhs);
2072 }
2073
2074 ICmpInst::Predicate Pred = Cmp.getPredicate();
2075 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2076 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2077 CmpValues.rbegin()->second);
2078
2079 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2080 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2081 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2082 }
2083
2084 return LhsCmp;
2085}
2086
2087/// Fold icmp (or X, Y), C.
2090 const APInt &C) {
2091 ICmpInst::Predicate Pred = Cmp.getPredicate();
2092 if (C.isOne()) {
2093 // icmp slt signum(V) 1 --> icmp slt V, 1
2094 Value *V = nullptr;
2095 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2096 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2097 ConstantInt::get(V->getType(), 1));
2098 }
2099
2100 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2101
2102 // (icmp eq/ne (or disjoint x, C0), C1)
2103 // -> (icmp eq/ne x, C0^C1)
2104 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2105 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2106 Value *NewC =
2107 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2108 return new ICmpInst(Pred, OrOp0, NewC);
2109 }
2110
2111 const APInt *MaskC;
2112 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2113 if (*MaskC == C && (C + 1).isPowerOf2()) {
2114 // X | C == C --> X <=u C
2115 // X | C != C --> X >u C
2116 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2118 return new ICmpInst(Pred, OrOp0, OrOp1);
2119 }
2120
2121 // More general: canonicalize 'equality with set bits mask' to
2122 // 'equality with clear bits mask'.
2123 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2124 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2125 if (Or->hasOneUse()) {
2126 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2127 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2128 return new ICmpInst(Pred, And, NewC);
2129 }
2130 }
2131
2132 // (X | (X-1)) s< 0 --> X s< 1
2133 // (X | (X-1)) s> -1 --> X s> 0
2134 Value *X;
2135 bool TrueIfSigned;
2136 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2138 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2139 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2140 return new ICmpInst(NewPred, X, NewC);
2141 }
2142
2143 const APInt *OrC;
2144 // icmp(X | OrC, C) --> icmp(X, 0)
2145 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2146 switch (Pred) {
2147 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2148 case ICmpInst::ICMP_SLT:
2149 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2150 case ICmpInst::ICMP_SGE:
2151 if (OrC->sge(C))
2152 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2153 break;
2154 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2155 case ICmpInst::ICMP_SLE:
2156 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2157 case ICmpInst::ICMP_SGT:
2158 if (OrC->sgt(C))
2160 ConstantInt::getNullValue(X->getType()));
2161 break;
2162 default:
2163 break;
2164 }
2165 }
2166
2167 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2168 return nullptr;
2169
2170 Value *P, *Q;
2172 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2173 // -> and (icmp eq P, null), (icmp eq Q, null).
2174 Value *CmpP =
2175 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2176 Value *CmpQ =
2178 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2179 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2180 }
2181
2182 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2183 return replaceInstUsesWith(Cmp, V);
2184
2185 return nullptr;
2186}
2187
2188/// Fold icmp (mul X, Y), C.
2191 const APInt &C) {
2192 ICmpInst::Predicate Pred = Cmp.getPredicate();
2193 Type *MulTy = Mul->getType();
2194 Value *X = Mul->getOperand(0);
2195
2196 // If there's no overflow:
2197 // X * X == 0 --> X == 0
2198 // X * X != 0 --> X != 0
2199 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2200 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2201 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2202
2203 const APInt *MulC;
2204 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2205 return nullptr;
2206
2207 // If this is a test of the sign bit and the multiply is sign-preserving with
2208 // a constant operand, use the multiply LHS operand instead:
2209 // (X * +MulC) < 0 --> X < 0
2210 // (X * -MulC) < 0 --> X > 0
2211 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2212 if (MulC->isNegative())
2213 Pred = ICmpInst::getSwappedPredicate(Pred);
2214 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2215 }
2216
2217 if (MulC->isZero())
2218 return nullptr;
2219
2220 // If the multiply does not wrap or the constant is odd, try to divide the
2221 // compare constant by the multiplication factor.
2222 if (Cmp.isEquality()) {
2223 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2224 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2225 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2226 return new ICmpInst(Pred, X, NewC);
2227 }
2228
2229 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2230 // correct to transform if MulC * N == C including overflow. I.e with i8
2231 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2232 // miss that case.
2233 if (C.urem(*MulC).isZero()) {
2234 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2235 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2236 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2237 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2238 return new ICmpInst(Pred, X, NewC);
2239 }
2240 }
2241 }
2242
2243 // With a matching no-overflow guarantee, fold the constants:
2244 // (X * MulC) < C --> X < (C / MulC)
2245 // (X * MulC) > C --> X > (C / MulC)
2246 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2247 Constant *NewC = nullptr;
2248 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2249 // MININT / -1 --> overflow.
2250 if (C.isMinSignedValue() && MulC->isAllOnes())
2251 return nullptr;
2252 if (MulC->isNegative())
2253 Pred = ICmpInst::getSwappedPredicate(Pred);
2254
2255 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2256 NewC = ConstantInt::get(
2258 } else {
2259 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2260 "Unexpected predicate");
2261 NewC = ConstantInt::get(
2263 }
2264 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2265 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2266 NewC = ConstantInt::get(
2268 } else {
2269 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2270 "Unexpected predicate");
2271 NewC = ConstantInt::get(
2273 }
2274 }
2275
2276 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2277}
2278
2279/// Fold icmp (shl nuw C2, Y), C.
2281 const APInt &C) {
2282 Value *Y;
2283 const APInt *C2;
2284 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2285 return nullptr;
2286
2287 Type *ShiftType = Shl->getType();
2288 unsigned TypeBits = C.getBitWidth();
2289 ICmpInst::Predicate Pred = Cmp.getPredicate();
2290 if (Cmp.isUnsigned()) {
2291 if (C2->isZero() || C2->ugt(C))
2292 return nullptr;
2293 APInt Div, Rem;
2294 APInt::udivrem(C, *C2, Div, Rem);
2295 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2296
2297 // (1 << Y) pred C -> Y pred Log2(C)
2298 if (!CIsPowerOf2) {
2299 // (1 << Y) < 30 -> Y <= 4
2300 // (1 << Y) <= 30 -> Y <= 4
2301 // (1 << Y) >= 30 -> Y > 4
2302 // (1 << Y) > 30 -> Y > 4
2303 if (Pred == ICmpInst::ICMP_ULT)
2304 Pred = ICmpInst::ICMP_ULE;
2305 else if (Pred == ICmpInst::ICMP_UGE)
2306 Pred = ICmpInst::ICMP_UGT;
2307 }
2308
2309 unsigned CLog2 = Div.logBase2();
2310 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2311 } else if (Cmp.isSigned() && C2->isOne()) {
2312 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2313 // (1 << Y) > 0 -> Y != 31
2314 // (1 << Y) > C -> Y != 31 if C is negative.
2315 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2316 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2317
2318 // (1 << Y) < 0 -> Y == 31
2319 // (1 << Y) < 1 -> Y == 31
2320 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2321 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2322 if (Pred == ICmpInst::ICMP_SLT && (C-1).sle(0))
2323 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2324 }
2325
2326 return nullptr;
2327}
2328
2329/// Fold icmp (shl X, Y), C.
2331 BinaryOperator *Shl,
2332 const APInt &C) {
2333 const APInt *ShiftVal;
2334 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2335 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2336
2337 ICmpInst::Predicate Pred = Cmp.getPredicate();
2338 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2339 // -> (icmp pred X, Csle0)
2340 //
2341 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2342 // so X's must be what is used.
2343 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2344 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2345
2346 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2347 // -> (icmp eq/ne X, 0)
2348 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2349 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2350 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2351
2352 // (icmp slt (shl nsw X, Y), 0/1)
2353 // -> (icmp slt X, 0/1)
2354 // (icmp sgt (shl nsw X, Y), 0/-1)
2355 // -> (icmp sgt X, 0/-1)
2356 //
2357 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2358 if (Shl->hasNoSignedWrap() &&
2359 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2360 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2361 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2362
2363 const APInt *ShiftAmt;
2364 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2365 return foldICmpShlLHSC(Cmp, Shl, C);
2366
2367 // Check that the shift amount is in range. If not, don't perform undefined
2368 // shifts. When the shift is visited, it will be simplified.
2369 unsigned TypeBits = C.getBitWidth();
2370 if (ShiftAmt->uge(TypeBits))
2371 return nullptr;
2372
2373 Value *X = Shl->getOperand(0);
2374 Type *ShType = Shl->getType();
2375
2376 // NSW guarantees that we are only shifting out sign bits from the high bits,
2377 // so we can ASHR the compare constant without needing a mask and eliminate
2378 // the shift.
2379 if (Shl->hasNoSignedWrap()) {
2380 if (Pred == ICmpInst::ICMP_SGT) {
2381 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2382 APInt ShiftedC = C.ashr(*ShiftAmt);
2383 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2384 }
2385 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2386 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2387 APInt ShiftedC = C.ashr(*ShiftAmt);
2388 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2389 }
2390 if (Pred == ICmpInst::ICMP_SLT) {
2391 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2392 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2393 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2394 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2395 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2396 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2397 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2398 }
2399 }
2400
2401 // NUW guarantees that we are only shifting out zero bits from the high bits,
2402 // so we can LSHR the compare constant without needing a mask and eliminate
2403 // the shift.
2404 if (Shl->hasNoUnsignedWrap()) {
2405 if (Pred == ICmpInst::ICMP_UGT) {
2406 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2407 APInt ShiftedC = C.lshr(*ShiftAmt);
2408 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2409 }
2410 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2411 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2412 APInt ShiftedC = C.lshr(*ShiftAmt);
2413 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2414 }
2415 if (Pred == ICmpInst::ICMP_ULT) {
2416 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2417 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2418 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2419 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2420 assert(C.ugt(0) && "ult 0 should have been eliminated");
2421 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2422 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2423 }
2424 }
2425
2426 if (Cmp.isEquality() && Shl->hasOneUse()) {
2427 // Strength-reduce the shift into an 'and'.
2428 Constant *Mask = ConstantInt::get(
2429 ShType,
2430 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2431 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2432 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2433 return new ICmpInst(Pred, And, LShrC);
2434 }
2435
2436 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2437 bool TrueIfSigned = false;
2438 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2439 // (X << 31) <s 0 --> (X & 1) != 0
2440 Constant *Mask = ConstantInt::get(
2441 ShType,
2442 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2443 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2444 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2445 And, Constant::getNullValue(ShType));
2446 }
2447
2448 // Simplify 'shl' inequality test into 'and' equality test.
2449 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2450 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2451 if ((C + 1).isPowerOf2() &&
2452 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2453 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2454 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2456 And, Constant::getNullValue(ShType));
2457 }
2458 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2459 if (C.isPowerOf2() &&
2460 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2461 Value *And =
2462 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2463 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2465 And, Constant::getNullValue(ShType));
2466 }
2467 }
2468
2469 // Transform (icmp pred iM (shl iM %v, N), C)
2470 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2471 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2472 // This enables us to get rid of the shift in favor of a trunc that may be
2473 // free on the target. It has the additional benefit of comparing to a
2474 // smaller constant that may be more target-friendly.
2475 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2476 if (Shl->hasOneUse() && Amt != 0 &&
2477 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2478 ICmpInst::Predicate CmpPred = Pred;
2479 APInt RHSC = C;
2480
2481 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2482 // Try the flipped strictness predicate.
2483 // e.g.:
2484 // icmp ult i64 (shl X, 32), 8589934593 ->
2485 // icmp ule i64 (shl X, 32), 8589934592 ->
2486 // icmp ule i32 (trunc X, i32), 2 ->
2487 // icmp ult i32 (trunc X, i32), 3
2488 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2489 Pred, ConstantInt::get(ShType->getContext(), C))) {
2490 CmpPred = FlippedStrictness->first;
2491 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2492 }
2493 }
2494
2495 if (RHSC.countr_zero() >= Amt) {
2496 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2497 Constant *NewC =
2498 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2499 return new ICmpInst(CmpPred,
2500 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2501 Shl->hasNoSignedWrap()),
2502 NewC);
2503 }
2504 }
2505
2506 return nullptr;
2507}
2508
2509/// Fold icmp ({al}shr X, Y), C.
2511 BinaryOperator *Shr,
2512 const APInt &C) {
2513 // An exact shr only shifts out zero bits, so:
2514 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2515 Value *X = Shr->getOperand(0);
2516 CmpInst::Predicate Pred = Cmp.getPredicate();
2517 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2518 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2519
2520 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2521 const APInt *ShiftValC;
2522 if (match(X, m_APInt(ShiftValC))) {
2523 if (Cmp.isEquality())
2524 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2525
2526 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2527 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2528 bool TrueIfSigned;
2529 if (!IsAShr && ShiftValC->isNegative() &&
2530 isSignBitCheck(Pred, C, TrueIfSigned))
2531 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2532 Shr->getOperand(1),
2533 ConstantInt::getNullValue(X->getType()));
2534
2535 // If the shifted constant is a power-of-2, test the shift amount directly:
2536 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2537 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2538 if (!IsAShr && ShiftValC->isPowerOf2() &&
2539 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2540 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2541 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2542 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2543
2544 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2545 unsigned ShiftLZ = ShiftValC->countl_zero();
2546 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2547 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2548 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2549 }
2550 }
2551
2552 const APInt *ShiftAmtC;
2553 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2554 return nullptr;
2555
2556 // Check that the shift amount is in range. If not, don't perform undefined
2557 // shifts. When the shift is visited it will be simplified.
2558 unsigned TypeBits = C.getBitWidth();
2559 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2560 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2561 return nullptr;
2562
2563 bool IsExact = Shr->isExact();
2564 Type *ShrTy = Shr->getType();
2565 // TODO: If we could guarantee that InstSimplify would handle all of the
2566 // constant-value-based preconditions in the folds below, then we could assert
2567 // those conditions rather than checking them. This is difficult because of
2568 // undef/poison (PR34838).
2569 if (IsAShr && Shr->hasOneUse()) {
2570 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2571 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2572 // When C - 1 is a power of two and the transform can be legally
2573 // performed, prefer this form so the produced constant is close to a
2574 // power of two.
2575 // icmp slt/ult (ashr exact X, ShAmtC), C
2576 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2577 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2578 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2579 }
2580 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2581 // When ShAmtC can be shifted losslessly:
2582 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2583 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2584 APInt ShiftedC = C.shl(ShAmtVal);
2585 if (ShiftedC.ashr(ShAmtVal) == C)
2586 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2587 }
2588 if (Pred == CmpInst::ICMP_SGT) {
2589 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2590 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2591 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2592 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2593 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2594 }
2595 if (Pred == CmpInst::ICMP_UGT) {
2596 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2597 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2598 // clause accounts for that pattern.
2599 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2600 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2601 (C + 1).shl(ShAmtVal).isMinSignedValue())
2602 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2603 }
2604
2605 // If the compare constant has significant bits above the lowest sign-bit,
2606 // then convert an unsigned cmp to a test of the sign-bit:
2607 // (ashr X, ShiftC) u> C --> X s< 0
2608 // (ashr X, ShiftC) u< C --> X s> -1
2609 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2610 if (Pred == CmpInst::ICMP_UGT) {
2611 return new ICmpInst(CmpInst::ICMP_SLT, X,
2613 }
2614 if (Pred == CmpInst::ICMP_ULT) {
2615 return new ICmpInst(CmpInst::ICMP_SGT, X,
2617 }
2618 }
2619 } else if (!IsAShr) {
2620 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2621 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2622 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2623 APInt ShiftedC = C.shl(ShAmtVal);
2624 if (ShiftedC.lshr(ShAmtVal) == C)
2625 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2626 }
2627 if (Pred == CmpInst::ICMP_UGT) {
2628 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2629 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2630 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2631 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2632 }
2633 }
2634
2635 if (!Cmp.isEquality())
2636 return nullptr;
2637
2638 // Handle equality comparisons of shift-by-constant.
2639
2640 // If the comparison constant changes with the shift, the comparison cannot
2641 // succeed (bits of the comparison constant cannot match the shifted value).
2642 // This should be known by InstSimplify and already be folded to true/false.
2643 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2644 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2645 "Expected icmp+shr simplify did not occur.");
2646
2647 // If the bits shifted out are known zero, compare the unshifted value:
2648 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2649 if (Shr->isExact())
2650 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2651
2652 if (C.isZero()) {
2653 // == 0 is u< 1.
2654 if (Pred == CmpInst::ICMP_EQ)
2655 return new ICmpInst(CmpInst::ICMP_ULT, X,
2656 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal)));
2657 else
2658 return new ICmpInst(CmpInst::ICMP_UGT, X,
2659 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal) - 1));
2660 }
2661
2662 if (Shr->hasOneUse()) {
2663 // Canonicalize the shift into an 'and':
2664 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2665 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2666 Constant *Mask = ConstantInt::get(ShrTy, Val);
2667 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2668 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2669 }
2670
2671 return nullptr;
2672}
2673
2675 BinaryOperator *SRem,
2676 const APInt &C) {
2677 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2678 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2679 // Canonicalize unsigned predicates to signed:
2680 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2681 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2682 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2683 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2684
2685 const APInt *DivisorC;
2686 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2687 return nullptr;
2688
2689 APInt NormalizedC = C;
2690 if (Pred == ICmpInst::ICMP_ULT) {
2691 assert(!NormalizedC.isZero() &&
2692 "ult X, 0 should have been simplified already.");
2693 --NormalizedC;
2694 }
2695 if (C.isNegative())
2696 NormalizedC.flipAllBits();
2697 assert(!DivisorC->isZero() &&
2698 "srem X, 0 should have been simplified already.");
2699 if (!NormalizedC.uge(DivisorC->abs() - 1))
2700 return nullptr;
2701
2702 Type *Ty = SRem->getType();
2703 if (Pred == ICmpInst::ICMP_UGT)
2704 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2706 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2708 }
2709 // Match an 'is positive' or 'is negative' comparison of remainder by a
2710 // constant power-of-2 value:
2711 // (X % pow2C) sgt/slt 0
2712 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2713 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2714 return nullptr;
2715
2716 // TODO: The one-use check is standard because we do not typically want to
2717 // create longer instruction sequences, but this might be a special-case
2718 // because srem is not good for analysis or codegen.
2719 if (!SRem->hasOneUse())
2720 return nullptr;
2721
2722 const APInt *DivisorC;
2723 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2724 return nullptr;
2725
2726 // For cmp_sgt/cmp_slt only zero valued C is handled.
2727 // For cmp_eq/cmp_ne only positive valued C is handled.
2728 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2729 !C.isZero()) ||
2730 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2731 !C.isStrictlyPositive()))
2732 return nullptr;
2733
2734 // Mask off the sign bit and the modulo bits (low-bits).
2735 Type *Ty = SRem->getType();
2737 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2738 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2739
2740 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2741 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2742
2743 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2744 // bit is set. Example:
2745 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2746 if (Pred == ICmpInst::ICMP_SGT)
2748
2749 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2750 // bit is set. Example:
2751 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2752 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2753}
2754
2755/// Fold icmp (udiv X, Y), C.
2757 BinaryOperator *UDiv,
2758 const APInt &C) {
2759 ICmpInst::Predicate Pred = Cmp.getPredicate();
2760 Value *X = UDiv->getOperand(0);
2761 Value *Y = UDiv->getOperand(1);
2762 Type *Ty = UDiv->getType();
2763
2764 const APInt *C2;
2765 if (!match(X, m_APInt(C2)))
2766 return nullptr;
2767
2768 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2769
2770 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2771 if (Pred == ICmpInst::ICMP_UGT) {
2772 assert(!C.isMaxValue() &&
2773 "icmp ugt X, UINT_MAX should have been simplified already.");
2774 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2775 ConstantInt::get(Ty, C2->udiv(C + 1)));
2776 }
2777
2778 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2779 if (Pred == ICmpInst::ICMP_ULT) {
2780 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2781 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2782 ConstantInt::get(Ty, C2->udiv(C)));
2783 }
2784
2785 return nullptr;
2786}
2787
2788/// Fold icmp ({su}div X, Y), C.
2790 BinaryOperator *Div,
2791 const APInt &C) {
2792 ICmpInst::Predicate Pred = Cmp.getPredicate();
2793 Value *X = Div->getOperand(0);
2794 Value *Y = Div->getOperand(1);
2795 Type *Ty = Div->getType();
2796 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2797
2798 // If unsigned division and the compare constant is bigger than
2799 // UMAX/2 (negative), there's only one pair of values that satisfies an
2800 // equality check, so eliminate the division:
2801 // (X u/ Y) == C --> (X == C) && (Y == 1)
2802 // (X u/ Y) != C --> (X != C) || (Y != 1)
2803 // Similarly, if signed division and the compare constant is exactly SMIN:
2804 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2805 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2806 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2807 (!DivIsSigned || C.isMinSignedValue())) {
2808 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2809 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2810 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2811 return BinaryOperator::Create(Logic, XBig, YOne);
2812 }
2813
2814 // Fold: icmp pred ([us]div X, C2), C -> range test
2815 // Fold this div into the comparison, producing a range check.
2816 // Determine, based on the divide type, what the range is being
2817 // checked. If there is an overflow on the low or high side, remember
2818 // it, otherwise compute the range [low, hi) bounding the new value.
2819 // See: InsertRangeTest above for the kinds of replacements possible.
2820 const APInt *C2;
2821 if (!match(Y, m_APInt(C2)))
2822 return nullptr;
2823
2824 // FIXME: If the operand types don't match the type of the divide
2825 // then don't attempt this transform. The code below doesn't have the
2826 // logic to deal with a signed divide and an unsigned compare (and
2827 // vice versa). This is because (x /s C2) <s C produces different
2828 // results than (x /s C2) <u C or (x /u C2) <s C or even
2829 // (x /u C2) <u C. Simply casting the operands and result won't
2830 // work. :( The if statement below tests that condition and bails
2831 // if it finds it.
2832 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2833 return nullptr;
2834
2835 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2836 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2837 // division-by-constant cases should be present, we can not assert that they
2838 // have happened before we reach this icmp instruction.
2839 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2840 return nullptr;
2841
2842 // Compute Prod = C * C2. We are essentially solving an equation of
2843 // form X / C2 = C. We solve for X by multiplying C2 and C.
2844 // By solving for X, we can turn this into a range check instead of computing
2845 // a divide.
2846 APInt Prod = C * *C2;
2847
2848 // Determine if the product overflows by seeing if the product is not equal to
2849 // the divide. Make sure we do the same kind of divide as in the LHS
2850 // instruction that we're folding.
2851 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2852
2853 // If the division is known to be exact, then there is no remainder from the
2854 // divide, so the covered range size is unit, otherwise it is the divisor.
2855 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2856
2857 // Figure out the interval that is being checked. For example, a comparison
2858 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2859 // Compute this interval based on the constants involved and the signedness of
2860 // the compare/divide. This computes a half-open interval, keeping track of
2861 // whether either value in the interval overflows. After analysis each
2862 // overflow variable is set to 0 if it's corresponding bound variable is valid
2863 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2864 int LoOverflow = 0, HiOverflow = 0;
2865 APInt LoBound, HiBound;
2866
2867 if (!DivIsSigned) { // udiv
2868 // e.g. X/5 op 3 --> [15, 20)
2869 LoBound = Prod;
2870 HiOverflow = LoOverflow = ProdOV;
2871 if (!HiOverflow) {
2872 // If this is not an exact divide, then many values in the range collapse
2873 // to the same result value.
2874 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2875 }
2876 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2877 if (C.isZero()) { // (X / pos) op 0
2878 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2879 LoBound = -(RangeSize - 1);
2880 HiBound = RangeSize;
2881 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2882 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2883 HiOverflow = LoOverflow = ProdOV;
2884 if (!HiOverflow)
2885 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2886 } else { // (X / pos) op neg
2887 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2888 HiBound = Prod + 1;
2889 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2890 if (!LoOverflow) {
2891 APInt DivNeg = -RangeSize;
2892 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2893 }
2894 }
2895 } else if (C2->isNegative()) { // Divisor is < 0.
2896 if (Div->isExact())
2897 RangeSize.negate();
2898 if (C.isZero()) { // (X / neg) op 0
2899 // e.g. X/-5 op 0 --> [-4, 5)
2900 LoBound = RangeSize + 1;
2901 HiBound = -RangeSize;
2902 if (HiBound == *C2) { // -INTMIN = INTMIN
2903 HiOverflow = 1; // [INTMIN+1, overflow)
2904 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2905 }
2906 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2907 // e.g. X/-5 op 3 --> [-19, -14)
2908 HiBound = Prod + 1;
2909 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2910 if (!LoOverflow)
2911 LoOverflow =
2912 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2913 } else { // (X / neg) op neg
2914 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2915 LoOverflow = HiOverflow = ProdOV;
2916 if (!HiOverflow)
2917 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2918 }
2919
2920 // Dividing by a negative swaps the condition. LT <-> GT
2921 Pred = ICmpInst::getSwappedPredicate(Pred);
2922 }
2923
2924 switch (Pred) {
2925 default:
2926 llvm_unreachable("Unhandled icmp predicate!");
2927 case ICmpInst::ICMP_EQ:
2928 if (LoOverflow && HiOverflow)
2929 return replaceInstUsesWith(Cmp, Builder.getFalse());
2930 if (HiOverflow)
2931 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2932 X, ConstantInt::get(Ty, LoBound));
2933 if (LoOverflow)
2934 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2935 X, ConstantInt::get(Ty, HiBound));
2936 return replaceInstUsesWith(
2937 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2938 case ICmpInst::ICMP_NE:
2939 if (LoOverflow && HiOverflow)
2940 return replaceInstUsesWith(Cmp, Builder.getTrue());
2941 if (HiOverflow)
2942 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2943 X, ConstantInt::get(Ty, LoBound));
2944 if (LoOverflow)
2945 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2946 X, ConstantInt::get(Ty, HiBound));
2947 return replaceInstUsesWith(
2948 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2949 case ICmpInst::ICMP_ULT:
2950 case ICmpInst::ICMP_SLT:
2951 if (LoOverflow == +1) // Low bound is greater than input range.
2952 return replaceInstUsesWith(Cmp, Builder.getTrue());
2953 if (LoOverflow == -1) // Low bound is less than input range.
2954 return replaceInstUsesWith(Cmp, Builder.getFalse());
2955 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2956 case ICmpInst::ICMP_UGT:
2957 case ICmpInst::ICMP_SGT:
2958 if (HiOverflow == +1) // High bound greater than input range.
2959 return replaceInstUsesWith(Cmp, Builder.getFalse());
2960 if (HiOverflow == -1) // High bound less than input range.
2961 return replaceInstUsesWith(Cmp, Builder.getTrue());
2962 if (Pred == ICmpInst::ICMP_UGT)
2963 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2964 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2965 }
2966
2967 return nullptr;
2968}
2969
2970/// Fold icmp (sub X, Y), C.
2972 BinaryOperator *Sub,
2973 const APInt &C) {
2974 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2975 ICmpInst::Predicate Pred = Cmp.getPredicate();
2976 Type *Ty = Sub->getType();
2977
2978 // (SubC - Y) == C) --> Y == (SubC - C)
2979 // (SubC - Y) != C) --> Y != (SubC - C)
2980 Constant *SubC;
2981 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2982 return new ICmpInst(Pred, Y,
2983 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2984 }
2985
2986 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2987 const APInt *C2;
2988 APInt SubResult;
2989 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2990 bool HasNSW = Sub->hasNoSignedWrap();
2991 bool HasNUW = Sub->hasNoUnsignedWrap();
2992 if (match(X, m_APInt(C2)) &&
2993 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2994 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2995 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2996
2997 // X - Y == 0 --> X == Y.
2998 // X - Y != 0 --> X != Y.
2999 // TODO: We allow this with multiple uses as long as the other uses are not
3000 // in phis. The phi use check is guarding against a codegen regression
3001 // for a loop test. If the backend could undo this (and possibly
3002 // subsequent transforms), we would not need this hack.
3003 if (Cmp.isEquality() && C.isZero() &&
3004 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
3005 return new ICmpInst(Pred, X, Y);
3006
3007 // The following transforms are only worth it if the only user of the subtract
3008 // is the icmp.
3009 // TODO: This is an artificial restriction for all of the transforms below
3010 // that only need a single replacement icmp. Can these use the phi test
3011 // like the transform above here?
3012 if (!Sub->hasOneUse())
3013 return nullptr;
3014
3015 if (Sub->hasNoSignedWrap()) {
3016 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3017 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3018 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3019
3020 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3021 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3022 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3023
3024 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3025 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3026 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3027
3028 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3029 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3030 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3031 }
3032
3033 if (!match(X, m_APInt(C2)))
3034 return nullptr;
3035
3036 // C2 - Y <u C -> (Y | (C - 1)) == C2
3037 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3038 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3039 (*C2 & (C - 1)) == (C - 1))
3040 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3041
3042 // C2 - Y >u C -> (Y | C) != C2
3043 // iff C2 & C == C and C + 1 is a power of 2
3044 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3045 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3046
3047 // We have handled special cases that reduce.
3048 // Canonicalize any remaining sub to add as:
3049 // (C2 - Y) > C --> (Y + ~C2) < ~C
3050 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3051 HasNUW, HasNSW);
3052 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3053}
3054
3055static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3056 Value *Op1, IRBuilderBase &Builder,
3057 bool HasOneUse) {
3058 auto FoldConstant = [&](bool Val) {
3059 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3060 if (Op0->getType()->isVectorTy())
3062 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3063 return Res;
3064 };
3065
3066 switch (Table.to_ulong()) {
3067 case 0: // 0 0 0 0
3068 return FoldConstant(false);
3069 case 1: // 0 0 0 1
3070 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3071 case 2: // 0 0 1 0
3072 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3073 case 3: // 0 0 1 1
3074 return Builder.CreateNot(Op0);
3075 case 4: // 0 1 0 0
3076 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3077 case 5: // 0 1 0 1
3078 return Builder.CreateNot(Op1);
3079 case 6: // 0 1 1 0
3080 return Builder.CreateXor(Op0, Op1);
3081 case 7: // 0 1 1 1
3082 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3083 case 8: // 1 0 0 0
3084 return Builder.CreateAnd(Op0, Op1);
3085 case 9: // 1 0 0 1
3086 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3087 case 10: // 1 0 1 0
3088 return Op1;
3089 case 11: // 1 0 1 1
3090 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3091 case 12: // 1 1 0 0
3092 return Op0;
3093 case 13: // 1 1 0 1
3094 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3095 case 14: // 1 1 1 0
3096 return Builder.CreateOr(Op0, Op1);
3097 case 15: // 1 1 1 1
3098 return FoldConstant(true);
3099 default:
3100 llvm_unreachable("Invalid Operation");
3101 }
3102 return nullptr;
3103}
3104
3105/// Fold icmp (add X, Y), C.
3108 const APInt &C) {
3109 Value *Y = Add->getOperand(1);
3110 Value *X = Add->getOperand(0);
3111
3112 Value *Op0, *Op1;
3113 Instruction *Ext0, *Ext1;
3114 const CmpInst::Predicate Pred = Cmp.getPredicate();
3115 if (match(Add,
3118 m_ZExtOrSExt(m_Value(Op1))))) &&
3119 Op0->getType()->isIntOrIntVectorTy(1) &&
3120 Op1->getType()->isIntOrIntVectorTy(1)) {
3121 unsigned BW = C.getBitWidth();
3122 std::bitset<4> Table;
3123 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
3124 APInt Res(BW, 0);
3125 if (Op0Val)
3126 Res += APInt(BW, isa<ZExtInst>(Ext0) ? 1 : -1, /*isSigned=*/true);
3127 if (Op1Val)
3128 Res += APInt(BW, isa<ZExtInst>(Ext1) ? 1 : -1, /*isSigned=*/true);
3129 return ICmpInst::compare(Res, C, Pred);
3130 };
3131
3132 Table[0] = ComputeTable(false, false);
3133 Table[1] = ComputeTable(false, true);
3134 Table[2] = ComputeTable(true, false);
3135 Table[3] = ComputeTable(true, true);
3136 if (auto *Cond =
3137 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3138 return replaceInstUsesWith(Cmp, Cond);
3139 }
3140 const APInt *C2;
3141 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3142 return nullptr;
3143
3144 // Fold icmp pred (add X, C2), C.
3145 Type *Ty = Add->getType();
3146
3147 // If the add does not wrap, we can always adjust the compare by subtracting
3148 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3149 // are canonicalized to SGT/SLT/UGT/ULT.
3150 if ((Add->hasNoSignedWrap() &&
3151 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT)) ||
3152 (Add->hasNoUnsignedWrap() &&
3153 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT))) {
3154 bool Overflow;
3155 APInt NewC =
3156 Cmp.isSigned() ? C.ssub_ov(*C2, Overflow) : C.usub_ov(*C2, Overflow);
3157 // If there is overflow, the result must be true or false.
3158 // TODO: Can we assert there is no overflow because InstSimplify always
3159 // handles those cases?
3160 if (!Overflow)
3161 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3162 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3163 }
3164
3165 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3166 C.isNonNegative() && (C - *C2).isNonNegative() &&
3167 computeConstantRange(X, /*ForSigned=*/true).add(*C2).isAllNonNegative())
3168 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3169 ConstantInt::get(Ty, C - *C2));
3170
3171 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3172 const APInt &Upper = CR.getUpper();
3173 const APInt &Lower = CR.getLower();
3174 if (Cmp.isSigned()) {
3175 if (Lower.isSignMask())
3176 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3177 if (Upper.isSignMask())
3178 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3179 } else {
3180 if (Lower.isMinValue())
3181 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3182 if (Upper.isMinValue())
3183 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3184 }
3185
3186 // This set of folds is intentionally placed after folds that use no-wrapping
3187 // flags because those folds are likely better for later analysis/codegen.
3190
3191 // Fold compare with offset to opposite sign compare if it eliminates offset:
3192 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3193 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3194 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3195
3196 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3197 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3198 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3199
3200 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3201 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3202 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3203
3204 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3205 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3206 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3207
3208 // (X + -1) <u C --> X <=u C (if X is never null)
3209 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3210 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3211 if (llvm::isKnownNonZero(X, Q))
3212 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3213 }
3214
3215 if (!Add->hasOneUse())
3216 return nullptr;
3217
3218 // X+C <u C2 -> (X & -C2) == C
3219 // iff C & (C2-1) == 0
3220 // C2 is a power of 2
3221 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3223 ConstantExpr::getNeg(cast<Constant>(Y)));
3224
3225 // X+C2 <u C -> (X & C) == 2C
3226 // iff C == -(C2)
3227 // C2 is a power of 2
3228 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3230 ConstantInt::get(Ty, C * 2));
3231
3232 // X+C >u C2 -> (X & ~C2) != C
3233 // iff C & C2 == 0
3234 // C2+1 is a power of 2
3235 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3237 ConstantExpr::getNeg(cast<Constant>(Y)));
3238
3239 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3240 // to the ult form.
3241 // X+C2 >u C -> X+(C2-C-1) <u ~C
3242 if (Pred == ICmpInst::ICMP_UGT)
3243 return new ICmpInst(ICmpInst::ICMP_ULT,
3244 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3245 ConstantInt::get(Ty, ~C));
3246
3247 // zext(V) + C2 pred C -> V + C3 pred' C4
3248 Value *V;
3249 if (match(X, m_ZExt(m_Value(V)))) {
3250 Type *NewCmpTy = V->getType();
3251 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3252 if (shouldChangeType(Ty, NewCmpTy)) {
3253 if (CR.getActiveBits() <= NewCmpBW) {
3254 ConstantRange SrcCR = CR.truncate(NewCmpBW);
3255 CmpInst::Predicate EquivPred;
3256 APInt EquivInt;
3257 APInt EquivOffset;
3258
3259 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3260 return new ICmpInst(
3261 EquivPred,
3262 EquivOffset.isZero()
3263 ? V
3264 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3265 ConstantInt::get(NewCmpTy, EquivInt));
3266 }
3267 }
3268 }
3269
3270 return nullptr;
3271}
3272
3274 Value *&RHS, ConstantInt *&Less,
3275 ConstantInt *&Equal,
3276 ConstantInt *&Greater) {
3277 // TODO: Generalize this to work with other comparison idioms or ensure
3278 // they get canonicalized into this form.
3279
3280 // select i1 (a == b),
3281 // i32 Equal,
3282 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3283 // where Equal, Less and Greater are placeholders for any three constants.
3284 CmpPredicate PredA;
3285 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3286 !ICmpInst::isEquality(PredA))
3287 return false;
3288 Value *EqualVal = SI->getTrueValue();
3289 Value *UnequalVal = SI->getFalseValue();
3290 // We still can get non-canonical predicate here, so canonicalize.
3291 if (PredA == ICmpInst::ICMP_NE)
3292 std::swap(EqualVal, UnequalVal);
3293 if (!match(EqualVal, m_ConstantInt(Equal)))
3294 return false;
3295 CmpPredicate PredB;
3296 Value *LHS2, *RHS2;
3297 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3298 m_ConstantInt(Less), m_ConstantInt(Greater))))
3299 return false;
3300 // We can get predicate mismatch here, so canonicalize if possible:
3301 // First, ensure that 'LHS' match.
3302 if (LHS2 != LHS) {
3303 // x sgt y <--> y slt x
3304 std::swap(LHS2, RHS2);
3305 PredB = ICmpInst::getSwappedPredicate(PredB);
3306 }
3307 if (LHS2 != LHS)
3308 return false;
3309 // We also need to canonicalize 'RHS'.
3310 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3311 // x sgt C-1 <--> x sge C <--> not(x slt C)
3312 auto FlippedStrictness =
3313 getFlippedStrictnessPredicateAndConstant(PredB, cast<Constant>(RHS2));
3314 if (!FlippedStrictness)
3315 return false;
3316 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3317 "basic correctness failure");
3318 RHS2 = FlippedStrictness->second;
3319 // And kind-of perform the result swap.
3320 std::swap(Less, Greater);
3321 PredB = ICmpInst::ICMP_SLT;
3322 }
3323 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3324}
3325
3328 ConstantInt *C) {
3329
3330 assert(C && "Cmp RHS should be a constant int!");
3331 // If we're testing a constant value against the result of a three way
3332 // comparison, the result can be expressed directly in terms of the
3333 // original values being compared. Note: We could possibly be more
3334 // aggressive here and remove the hasOneUse test. The original select is
3335 // really likely to simplify or sink when we remove a test of the result.
3336 Value *OrigLHS, *OrigRHS;
3337 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3338 if (Cmp.hasOneUse() &&
3339 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3340 C3GreaterThan)) {
3341 assert(C1LessThan && C2Equal && C3GreaterThan);
3342
3343 bool TrueWhenLessThan = ICmpInst::compare(
3344 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3345 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3346 Cmp.getPredicate());
3347 bool TrueWhenGreaterThan = ICmpInst::compare(
3348 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3349
3350 // This generates the new instruction that will replace the original Cmp
3351 // Instruction. Instead of enumerating the various combinations when
3352 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3353 // false, we rely on chaining of ORs and future passes of InstCombine to
3354 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3355
3356 // When none of the three constants satisfy the predicate for the RHS (C),
3357 // the entire original Cmp can be simplified to a false.
3359 if (TrueWhenLessThan)
3361 OrigLHS, OrigRHS));
3362 if (TrueWhenEqual)
3364 OrigLHS, OrigRHS));
3365 if (TrueWhenGreaterThan)
3367 OrigLHS, OrigRHS));
3368
3369 return replaceInstUsesWith(Cmp, Cond);
3370 }
3371 return nullptr;
3372}
3373
3375 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3376 if (!Bitcast)
3377 return nullptr;
3378
3379 ICmpInst::Predicate Pred = Cmp.getPredicate();
3380 Value *Op1 = Cmp.getOperand(1);
3381 Value *BCSrcOp = Bitcast->getOperand(0);
3382 Type *SrcType = Bitcast->getSrcTy();
3383 Type *DstType = Bitcast->getType();
3384
3385 // Make sure the bitcast doesn't change between scalar and vector and
3386 // doesn't change the number of vector elements.
3387 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3388 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3389 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3390 Value *X;
3391 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3392 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3393 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3394 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3395 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3396 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3397 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3398 match(Op1, m_Zero()))
3399 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3400
3401 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3402 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3403 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3404
3405 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3406 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3407 return new ICmpInst(Pred, X,
3408 ConstantInt::getAllOnesValue(X->getType()));
3409 }
3410
3411 // Zero-equality checks are preserved through unsigned floating-point casts:
3412 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3413 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3414 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3415 if (Cmp.isEquality() && match(Op1, m_Zero()))
3416 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3417
3418 const APInt *C;
3419 bool TrueIfSigned;
3420 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3421 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3422 // the FP extend/truncate because that cast does not change the sign-bit.
3423 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3424 // The sign-bit is always the most significant bit in those types.
3425 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3426 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3427 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3428 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3429 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3430 Type *XType = X->getType();
3431
3432 // We can't currently handle Power style floating point operations here.
3433 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3434 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3435 if (auto *XVTy = dyn_cast<VectorType>(XType))
3436 NewType = VectorType::get(NewType, XVTy->getElementCount());
3437 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3438 if (TrueIfSigned)
3439 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3440 ConstantInt::getNullValue(NewType));
3441 else
3442 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3444 }
3445 }
3446
3447 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3448 Type *FPType = SrcType->getScalarType();
3449 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3450 Attribute::NoImplicitFloat) &&
3451 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3452 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3453 if (Mask & (fcInf | fcZero)) {
3454 if (Pred == ICmpInst::ICMP_NE)
3455 Mask = ~Mask;
3456 return replaceInstUsesWith(Cmp,
3457 Builder.createIsFPClass(BCSrcOp, Mask));
3458 }
3459 }
3460 }
3461 }
3462
3463 const APInt *C;
3464 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3465 !SrcType->isIntOrIntVectorTy())
3466 return nullptr;
3467
3468 // If this is checking if all elements of a vector compare are set or not,
3469 // invert the casted vector equality compare and test if all compare
3470 // elements are clear or not. Compare against zero is generally easier for
3471 // analysis and codegen.
3472 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3473 // Example: are all elements equal? --> are zero elements not equal?
3474 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3475 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3476 if (Value *NotBCSrcOp =
3477 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3478 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3479 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3480 }
3481 }
3482
3483 // If this is checking if all elements of an extended vector are clear or not,
3484 // compare in a narrow type to eliminate the extend:
3485 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3486 Value *X;
3487 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3488 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3489 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3490 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3491 Value *NewCast = Builder.CreateBitCast(X, NewType);
3492 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3493 }
3494 }
3495
3496 // Folding: icmp <pred> iN X, C
3497 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3498 // and C is a splat of a K-bit pattern
3499 // and SC is a constant vector = <C', C', C', ..., C'>
3500 // Into:
3501 // %E = extractelement <M x iK> %vec, i32 C'
3502 // icmp <pred> iK %E, trunc(C)
3503 Value *Vec;
3504 ArrayRef<int> Mask;
3505 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3506 // Check whether every element of Mask is the same constant
3507 if (all_equal(Mask)) {
3508 auto *VecTy = cast<VectorType>(SrcType);
3509 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3510 if (C->isSplat(EltTy->getBitWidth())) {
3511 // Fold the icmp based on the value of C
3512 // If C is M copies of an iK sized bit pattern,
3513 // then:
3514 // => %E = extractelement <N x iK> %vec, i32 Elem
3515 // icmp <pred> iK %SplatVal, <pattern>
3516 Value *Elem = Builder.getInt32(Mask[0]);
3517 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3518 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3519 return new ICmpInst(Pred, Extract, NewC);
3520 }
3521 }
3522 }
3523 return nullptr;
3524}
3525
3526/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3527/// where X is some kind of instruction.
3529 const APInt *C;
3530
3531 if (match(Cmp.getOperand(1), m_APInt(C))) {
3532 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3533 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3534 return I;
3535
3536 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3537 // For now, we only support constant integers while folding the
3538 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3539 // similar to the cases handled by binary ops above.
3540 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3541 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3542 return I;
3543
3544 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3545 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3546 return I;
3547
3548 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3550 return I;
3551
3552 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3553 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3554 // TODO: This checks one-use, but that is not strictly necessary.
3555 Value *Cmp0 = Cmp.getOperand(0);
3556 Value *X, *Y;
3557 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3558 (match(Cmp0,
3559 m_ExtractValue<0>(m_Intrinsic<Intrinsic::ssub_with_overflow>(
3560 m_Value(X), m_Value(Y)))) ||
3561 match(Cmp0,
3562 m_ExtractValue<0>(m_Intrinsic<Intrinsic::usub_with_overflow>(
3563 m_Value(X), m_Value(Y))))))
3564 return new ICmpInst(Cmp.getPredicate(), X, Y);
3565 }
3566
3567 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3569
3570 return nullptr;
3571}
3572
3573/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3574/// icmp eq/ne BO, C.
3576 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3577 // TODO: Some of these folds could work with arbitrary constants, but this
3578 // function is limited to scalar and vector splat constants.
3579 if (!Cmp.isEquality())
3580 return nullptr;
3581
3582 ICmpInst::Predicate Pred = Cmp.getPredicate();
3583 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3584 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3585 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3586
3587 switch (BO->getOpcode()) {
3588 case Instruction::SRem:
3589 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3590 if (C.isZero() && BO->hasOneUse()) {
3591 const APInt *BOC;
3592 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3593 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3594 return new ICmpInst(Pred, NewRem,
3596 }
3597 }
3598 break;
3599 case Instruction::Add: {
3600 // (A + C2) == C --> A == (C - C2)
3601 // (A + C2) != C --> A != (C - C2)
3602 // TODO: Remove the one-use limitation? See discussion in D58633.
3603 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3604 if (BO->hasOneUse())
3605 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3606 } else if (C.isZero()) {
3607 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3608 // efficiently invertible, or if the add has just this one use.
3609 if (Value *NegVal = dyn_castNegVal(BOp1))
3610 return new ICmpInst(Pred, BOp0, NegVal);
3611 if (Value *NegVal = dyn_castNegVal(BOp0))
3612 return new ICmpInst(Pred, NegVal, BOp1);
3613 if (BO->hasOneUse()) {
3614 // (add nuw A, B) != 0 -> (or A, B) != 0
3615 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3616 Value *Or = Builder.CreateOr(BOp0, BOp1);
3617 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3618 }
3619 Value *Neg = Builder.CreateNeg(BOp1);
3620 Neg->takeName(BO);
3621 return new ICmpInst(Pred, BOp0, Neg);
3622 }
3623 }
3624 break;
3625 }
3626 case Instruction::Xor:
3627 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3628 // For the xor case, we can xor two constants together, eliminating
3629 // the explicit xor.
3630 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3631 } else if (C.isZero()) {
3632 // Replace ((xor A, B) != 0) with (A != B)
3633 return new ICmpInst(Pred, BOp0, BOp1);
3634 }
3635 break;
3636 case Instruction::Or: {
3637 const APInt *BOC;
3638 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3639 // Comparing if all bits outside of a constant mask are set?
3640 // Replace (X | C) == -1 with (X & ~C) == ~C.
3641 // This removes the -1 constant.
3642 Constant *NotBOC = ConstantExpr::getNot(cast<Constant>(BOp1));
3643 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3644 return new ICmpInst(Pred, And, NotBOC);
3645 }
3646 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3647 // -> (and cond, (icmp eq Other, 0))
3648 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3649 // -> (or cond, (icmp ne Other, 0))
3650 Value *Cond, *TV, *FV, *Other, *Sel;
3651 if (C.isZero() &&
3652 match(BO,
3655 m_Value(FV))),
3656 m_Value(Other)))) &&
3657 Cond->getType() == Cmp.getType()) {
3658 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3659 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3660 if (Pred == ICmpInst::ICMP_EQ
3661 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3662 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3663 Value *Cmp = Builder.CreateICmp(
3664 Pred, Other, Constant::getNullValue(Other->getType()));
3666 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3667 Cond);
3668 }
3669 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3670 // case we need to invert the select condition so we need to be careful to
3671 // avoid creating extra instructions.
3672 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3673 // -> (or (not cond), (icmp ne Other, 0))
3674 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3675 // -> (and (not cond), (icmp eq Other, 0))
3676 //
3677 // Only do this if the inner select has one use, in which case we are
3678 // replacing `select` with `(not cond)`. Otherwise, we will create more
3679 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3680 // cond was freely invertable, the select arms would have been inverted.
3681 if (Sel->hasOneUse() &&
3682 (Pred == ICmpInst::ICMP_EQ
3683 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3684 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3685 Value *NotCond = Builder.CreateNot(Cond);
3686 Value *Cmp = Builder.CreateICmp(
3687 Pred, Other, Constant::getNullValue(Other->getType()));
3689 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3690 NotCond);
3691 }
3692 }
3693 break;
3694 }
3695 case Instruction::UDiv:
3696 case Instruction::SDiv:
3697 if (BO->isExact()) {
3698 // div exact X, Y eq/ne 0 -> X eq/ne 0
3699 // div exact X, Y eq/ne 1 -> X eq/ne Y
3700 // div exact X, Y eq/ne C ->
3701 // if Y * C never-overflow && OneUse:
3702 // -> Y * C eq/ne X
3703 if (C.isZero())
3704 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3705 else if (C.isOne())
3706 return new ICmpInst(Pred, BOp0, BOp1);
3707 else if (BO->hasOneUse()) {
3709 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3710 Cmp.getOperand(1), BO);
3712 Value *YC =
3713 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3714 return new ICmpInst(Pred, YC, BOp0);
3715 }
3716 }
3717 }
3718 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3719 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3720 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3721 return new ICmpInst(NewPred, BOp1, BOp0);
3722 }
3723 break;
3724 default:
3725 break;
3726 }
3727 return nullptr;
3728}
3729
3731 const APInt &CRhs,
3732 InstCombiner::BuilderTy &Builder,
3733 const SimplifyQuery &Q) {
3734 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3735 "Non-ctpop intrin in ctpop fold");
3736 if (!CtpopLhs->hasOneUse())
3737 return nullptr;
3738
3739 // Power of 2 test:
3740 // isPow2OrZero : ctpop(X) u< 2
3741 // isPow2 : ctpop(X) == 1
3742 // NotPow2OrZero: ctpop(X) u> 1
3743 // NotPow2 : ctpop(X) != 1
3744 // If we know any bit of X can be folded to:
3745 // IsPow2 : X & (~Bit) == 0
3746 // NotPow2 : X & (~Bit) != 0
3747 const ICmpInst::Predicate Pred = I.getPredicate();
3748 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3749 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3750 Value *Op = CtpopLhs->getArgOperand(0);
3751 KnownBits OpKnown = computeKnownBits(Op, Q.DL,
3752 /*Depth*/ 0, Q.AC, Q.CxtI, Q.DT);
3753 // No need to check for count > 1, that should be already constant folded.
3754 if (OpKnown.countMinPopulation() == 1) {
3755 Value *And = Builder.CreateAnd(
3756 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3757 return new ICmpInst(
3758 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3761 And, Constant::getNullValue(Op->getType()));
3762 }
3763 }
3764
3765 return nullptr;
3766}
3767
3768/// Fold an equality icmp with LLVM intrinsic and constant operand.
3770 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3771 Type *Ty = II->getType();
3772 unsigned BitWidth = C.getBitWidth();
3773 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3774
3775 switch (II->getIntrinsicID()) {
3776 case Intrinsic::abs:
3777 // abs(A) == 0 -> A == 0
3778 // abs(A) == INT_MIN -> A == INT_MIN
3779 if (C.isZero() || C.isMinSignedValue())
3780 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3781 break;
3782
3783 case Intrinsic::bswap:
3784 // bswap(A) == C -> A == bswap(C)
3785 return new ICmpInst(Pred, II->getArgOperand(0),
3786 ConstantInt::get(Ty, C.byteSwap()));
3787
3788 case Intrinsic::bitreverse:
3789 // bitreverse(A) == C -> A == bitreverse(C)
3790 return new ICmpInst(Pred, II->getArgOperand(0),
3791 ConstantInt::get(Ty, C.reverseBits()));
3792
3793 case Intrinsic::ctlz:
3794 case Intrinsic::cttz: {
3795 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3796 if (C == BitWidth)
3797 return new ICmpInst(Pred, II->getArgOperand(0),
3799
3800 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3801 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3802 // Limit to one use to ensure we don't increase instruction count.
3803 unsigned Num = C.getLimitedValue(BitWidth);
3804 if (Num != BitWidth && II->hasOneUse()) {
3805 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3806 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3807 : APInt::getHighBitsSet(BitWidth, Num + 1);
3808 APInt Mask2 = IsTrailing
3811 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3812 ConstantInt::get(Ty, Mask2));
3813 }
3814 break;
3815 }
3816
3817 case Intrinsic::ctpop: {
3818 // popcount(A) == 0 -> A == 0 and likewise for !=
3819 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3820 bool IsZero = C.isZero();
3821 if (IsZero || C == BitWidth)
3822 return new ICmpInst(Pred, II->getArgOperand(0),
3823 IsZero ? Constant::getNullValue(Ty)
3825
3826 break;
3827 }
3828
3829 case Intrinsic::fshl:
3830 case Intrinsic::fshr:
3831 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3832 const APInt *RotAmtC;
3833 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3834 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3835 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3836 return new ICmpInst(Pred, II->getArgOperand(0),
3837 II->getIntrinsicID() == Intrinsic::fshl
3838 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3839 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3840 }
3841 break;
3842
3843 case Intrinsic::umax:
3844 case Intrinsic::uadd_sat: {
3845 // uadd.sat(a, b) == 0 -> (a | b) == 0
3846 // umax(a, b) == 0 -> (a | b) == 0
3847 if (C.isZero() && II->hasOneUse()) {
3848 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3849 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3850 }
3851 break;
3852 }
3853
3854 case Intrinsic::ssub_sat:
3855 // ssub.sat(a, b) == 0 -> a == b
3856 if (C.isZero())
3857 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3858 break;
3859 case Intrinsic::usub_sat: {
3860 // usub.sat(a, b) == 0 -> a <= b
3861 if (C.isZero()) {
3862 ICmpInst::Predicate NewPred =
3864 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3865 }
3866 break;
3867 }
3868 default:
3869 break;
3870 }
3871
3872 return nullptr;
3873}
3874
3875/// Fold an icmp with LLVM intrinsics
3876static Instruction *
3878 InstCombiner::BuilderTy &Builder) {
3879 assert(Cmp.isEquality());
3880
3881 ICmpInst::Predicate Pred = Cmp.getPredicate();
3882 Value *Op0 = Cmp.getOperand(0);
3883 Value *Op1 = Cmp.getOperand(1);
3884 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3885 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3886 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3887 return nullptr;
3888
3889 switch (IIOp0->getIntrinsicID()) {
3890 case Intrinsic::bswap:
3891 case Intrinsic::bitreverse:
3892 // If both operands are byte-swapped or bit-reversed, just compare the
3893 // original values.
3894 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3895 case Intrinsic::fshl:
3896 case Intrinsic::fshr: {
3897 // If both operands are rotated by same amount, just compare the
3898 // original values.
3899 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3900 break;
3901 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3902 break;
3903 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3904 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3905
3906 // rotate(X, AmtX) == rotate(Y, AmtY)
3907 // -> rotate(X, AmtX - AmtY) == Y
3908 // Do this if either both rotates have one use or if only one has one use
3909 // and AmtX/AmtY are constants.
3910 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3911 if (OneUses == 2 ||
3912 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3913 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3914 Value *SubAmt =
3915 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3916 Value *CombinedRotate = Builder.CreateIntrinsic(
3917 Op0->getType(), IIOp0->getIntrinsicID(),
3918 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3919 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3920 }
3921 } break;
3922 default:
3923 break;
3924 }
3925
3926 return nullptr;
3927}
3928
3929/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3930/// where X is some kind of instruction and C is AllowPoison.
3931/// TODO: Move more folds which allow poison to this function.
3934 const APInt &C) {
3935 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3936 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3937 switch (II->getIntrinsicID()) {
3938 default:
3939 break;
3940 case Intrinsic::fshl:
3941 case Intrinsic::fshr:
3942 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3943 // (rot X, ?) == 0/-1 --> X == 0/-1
3944 if (C.isZero() || C.isAllOnes())
3945 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3946 }
3947 break;
3948 }
3949 }
3950
3951 return nullptr;
3952}
3953
3954/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3956 BinaryOperator *BO,
3957 const APInt &C) {
3958 switch (BO->getOpcode()) {
3959 case Instruction::Xor:
3960 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3961 return I;
3962 break;
3963 case Instruction::And:
3964 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3965 return I;
3966 break;
3967 case Instruction::Or:
3968 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3969 return I;
3970 break;
3971 case Instruction::Mul:
3972 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3973 return I;
3974 break;
3975 case Instruction::Shl:
3976 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
3977 return I;
3978 break;
3979 case Instruction::LShr:
3980 case Instruction::AShr:
3981 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
3982 return I;
3983 break;
3984 case Instruction::SRem:
3985 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
3986 return I;
3987 break;
3988 case Instruction::UDiv:
3989 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
3990 return I;
3991 [[fallthrough]];
3992 case Instruction::SDiv:
3993 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
3994 return I;
3995 break;
3996 case Instruction::Sub:
3997 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
3998 return I;
3999 break;
4000 case Instruction::Add:
4001 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4002 return I;
4003 break;
4004 default:
4005 break;
4006 }
4007
4008 // TODO: These folds could be refactored to be part of the above calls.
4009 return foldICmpBinOpEqualityWithConstant(Cmp, BO, C);
4010}
4011
4012static Instruction *
4014 const APInt &C,
4015 InstCombiner::BuilderTy &Builder) {
4016 // This transform may end up producing more than one instruction for the
4017 // intrinsic, so limit it to one user of the intrinsic.
4018 if (!II->hasOneUse())
4019 return nullptr;
4020
4021 // Let Y = [add/sub]_sat(X, C) pred C2
4022 // SatVal = The saturating value for the operation
4023 // WillWrap = Whether or not the operation will underflow / overflow
4024 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4025 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4026 //
4027 // When (SatVal pred C2) is true, then
4028 // Y = WillWrap ? true : ((X binop C) pred C2)
4029 // => Y = WillWrap || ((X binop C) pred C2)
4030 // else
4031 // Y = WillWrap ? false : ((X binop C) pred C2)
4032 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4033 // => Y = !WillWrap && ((X binop C) pred C2)
4034 Value *Op0 = II->getOperand(0);
4035 Value *Op1 = II->getOperand(1);
4036
4037 const APInt *COp1;
4038 // This transform only works when the intrinsic has an integral constant or
4039 // splat vector as the second operand.
4040 if (!match(Op1, m_APInt(COp1)))
4041 return nullptr;
4042
4043 APInt SatVal;
4044 switch (II->getIntrinsicID()) {
4045 default:
4047 "This function only works with usub_sat and uadd_sat for now!");
4048 case Intrinsic::uadd_sat:
4049 SatVal = APInt::getAllOnes(C.getBitWidth());
4050 break;
4051 case Intrinsic::usub_sat:
4052 SatVal = APInt::getZero(C.getBitWidth());
4053 break;
4054 }
4055
4056 // Check (SatVal pred C2)
4057 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4058
4059 // !WillWrap.
4061 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4062
4063 // WillWrap.
4064 if (SatValCheck)
4065 C1 = C1.inverse();
4066
4068 if (II->getBinaryOp() == Instruction::Add)
4069 C2 = C2.sub(*COp1);
4070 else
4071 C2 = C2.add(*COp1);
4072
4073 Instruction::BinaryOps CombiningOp =
4074 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4075
4076 std::optional<ConstantRange> Combination;
4077 if (CombiningOp == Instruction::BinaryOps::Or)
4078 Combination = C1.exactUnionWith(C2);
4079 else /* CombiningOp == Instruction::BinaryOps::And */
4080 Combination = C1.exactIntersectWith(C2);
4081
4082 if (!Combination)
4083 return nullptr;
4084
4085 CmpInst::Predicate EquivPred;
4086 APInt EquivInt;
4087 APInt EquivOffset;
4088
4089 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4090
4091 return new ICmpInst(
4092 EquivPred,
4093 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4094 ConstantInt::get(Op1->getType(), EquivInt));
4095}
4096
4097static Instruction *
4099 const APInt &C,
4100 InstCombiner::BuilderTy &Builder) {
4101 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4102 switch (Pred) {
4103 case ICmpInst::ICMP_EQ:
4104 case ICmpInst::ICMP_NE:
4105 if (C.isZero())
4106 NewPredicate = Pred;
4107 else if (C.isOne())
4108 NewPredicate =
4110 else if (C.isAllOnes())
4111 NewPredicate =
4113 break;
4114
4115 case ICmpInst::ICMP_SGT:
4116 if (C.isAllOnes())
4117 NewPredicate = ICmpInst::ICMP_UGE;
4118 else if (C.isZero())
4119 NewPredicate = ICmpInst::ICMP_UGT;
4120 break;
4121
4122 case ICmpInst::ICMP_SLT:
4123 if (C.isZero())
4124 NewPredicate = ICmpInst::ICMP_ULT;
4125 else if (C.isOne())
4126 NewPredicate = ICmpInst::ICMP_ULE;
4127 break;
4128
4129 case ICmpInst::ICMP_ULT:
4130 if (C.ugt(1))
4131 NewPredicate = ICmpInst::ICMP_UGE;
4132 break;
4133
4134 case ICmpInst::ICMP_UGT:
4135 if (!C.isZero() && !C.isAllOnes())
4136 NewPredicate = ICmpInst::ICMP_ULT;
4137 break;
4138
4139 default:
4140 break;
4141 }
4142
4143 if (!NewPredicate)
4144 return nullptr;
4145
4146 if (I->getIntrinsicID() == Intrinsic::scmp)
4147 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4148 Value *LHS = I->getOperand(0);
4149 Value *RHS = I->getOperand(1);
4150 return new ICmpInst(*NewPredicate, LHS, RHS);
4151}
4152
4153/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4156 const APInt &C) {
4157 ICmpInst::Predicate Pred = Cmp.getPredicate();
4158
4159 // Handle folds that apply for any kind of icmp.
4160 switch (II->getIntrinsicID()) {
4161 default:
4162 break;
4163 case Intrinsic::uadd_sat:
4164 case Intrinsic::usub_sat:
4165 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4166 Pred, cast<SaturatingInst>(II), C, Builder))
4167 return Folded;
4168 break;
4169 case Intrinsic::ctpop: {
4170 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4171 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4172 return R;
4173 } break;
4174 case Intrinsic::scmp:
4175 case Intrinsic::ucmp:
4176 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4177 return Folded;
4178 break;
4179 }
4180
4181 if (Cmp.isEquality())
4182 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4183
4184 Type *Ty = II->getType();
4185 unsigned BitWidth = C.getBitWidth();
4186 switch (II->getIntrinsicID()) {
4187 case Intrinsic::ctpop: {
4188 // (ctpop X > BitWidth - 1) --> X == -1
4189 Value *X = II->getArgOperand(0);
4190 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4191 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4193 // (ctpop X < BitWidth) --> X != -1
4194 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4195 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4197 break;
4198 }
4199 case Intrinsic::ctlz: {
4200 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4201 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4202 unsigned Num = C.getLimitedValue();
4203 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4204 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4205 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4206 }
4207
4208 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4209 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4210 unsigned Num = C.getLimitedValue();
4212 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4213 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4214 }
4215 break;
4216 }
4217 case Intrinsic::cttz: {
4218 // Limit to one use to ensure we don't increase instruction count.
4219 if (!II->hasOneUse())
4220 return nullptr;
4221
4222 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4223 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4224 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4225 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4226 Builder.CreateAnd(II->getArgOperand(0), Mask),
4228 }
4229
4230 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4231 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4232 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4233 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4234 Builder.CreateAnd(II->getArgOperand(0), Mask),
4236 }
4237 break;
4238 }
4239 case Intrinsic::ssub_sat:
4240 // ssub.sat(a, b) spred 0 -> a spred b
4241 if (ICmpInst::isSigned(Pred)) {
4242 if (C.isZero())
4243 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4244 // X s<= 0 is cannonicalized to X s< 1
4245 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4246 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4247 II->getArgOperand(1));
4248 // X s>= 0 is cannonicalized to X s> -1
4249 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4250 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4251 II->getArgOperand(1));
4252 }
4253 break;
4254 default:
4255 break;
4256 }
4257
4258 return nullptr;
4259}
4260
4261/// Handle icmp with constant (but not simple integer constant) RHS.
4263 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4264 Constant *RHSC = dyn_cast<Constant>(Op1);
4265 Instruction *LHSI = dyn_cast<Instruction>(Op0);
4266 if (!RHSC || !LHSI)
4267 return nullptr;
4268
4269 switch (LHSI->getOpcode()) {
4270 case Instruction::PHI:
4271 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
4272 return NV;
4273 break;
4274 case Instruction::IntToPtr:
4275 // icmp pred inttoptr(X), null -> icmp pred X, 0
4276 if (RHSC->isNullValue() &&
4277 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4278 return new ICmpInst(
4279 I.getPredicate(), LHSI->getOperand(0),
4281 break;
4282
4283 case Instruction::Load:
4284 // Try to optimize things like "A[i] > 4" to index computations.
4285 if (GetElementPtrInst *GEP =
4286 dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
4287 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
4288 if (Instruction *Res =
4289 foldCmpLoadFromIndexedGlobal(cast<LoadInst>(LHSI), GEP, GV, I))
4290 return Res;
4291 break;
4292 }
4293
4294 return nullptr;
4295}
4296
4298 Value *RHS, const ICmpInst &I) {
4299 // Try to fold the comparison into the select arms, which will cause the
4300 // select to be converted into a logical and/or.
4301 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4302 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4303 return Res;
4304 if (std::optional<bool> Impl = isImpliedCondition(
4305 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4306 return ConstantInt::get(I.getType(), *Impl);
4307 return nullptr;
4308 };
4309
4310 ConstantInt *CI = nullptr;
4311 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4312 if (Op1)
4313 CI = dyn_cast<ConstantInt>(Op1);
4314
4315 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4316 if (Op2)
4317 CI = dyn_cast<ConstantInt>(Op2);
4318
4319 auto Simplifies = [&](Value *Op, unsigned Idx) {
4320 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4321 const APInt *Dummy;
4322 return Op ||
4323 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4324 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4325 };
4326
4327 // We only want to perform this transformation if it will not lead to
4328 // additional code. This is true if either both sides of the select
4329 // fold to a constant (in which case the icmp is replaced with a select
4330 // which will usually simplify) or this is the only user of the
4331 // select (in which case we are trading a select+icmp for a simpler
4332 // select+icmp) or all uses of the select can be replaced based on
4333 // dominance information ("Global cases").
4334 bool Transform = false;
4335 if (Op1 && Op2)
4336 Transform = true;
4337 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4338 // Local case
4339 if (SI->hasOneUse())
4340 Transform = true;
4341 // Global cases
4342 else if (CI && !CI->isZero())
4343 // When Op1 is constant try replacing select with second operand.
4344 // Otherwise Op2 is constant and try replacing select with first
4345 // operand.
4346 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4347 }
4348 if (Transform) {
4349 if (!Op1)
4350 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4351 if (!Op2)
4352 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4353 return SelectInst::Create(SI->getOperand(0), Op1, Op2);
4354 }
4355
4356 return nullptr;
4357}
4358
4359// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4360static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4361 unsigned Depth = 0) {
4362 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4363 return true;
4364 if (V->getType()->getScalarSizeInBits() == 1)
4365 return true;
4367 return false;
4368 Value *X;
4369 const Instruction *I = dyn_cast<Instruction>(V);
4370 if (!I)
4371 return false;
4372 switch (I->getOpcode()) {
4373 case Instruction::ZExt:
4374 // ZExt(Mask) is a Mask.
4375 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4376 case Instruction::SExt:
4377 // SExt(Mask) is a Mask.
4378 // SExt(~Mask) is a ~Mask.
4379 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4380 case Instruction::And:
4381 case Instruction::Or:
4382 // Mask0 | Mask1 is a Mask.
4383 // Mask0 & Mask1 is a Mask.
4384 // ~Mask0 | ~Mask1 is a ~Mask.
4385 // ~Mask0 & ~Mask1 is a ~Mask.
4386 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4387 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4388 case Instruction::Xor:
4389 if (match(V, m_Not(m_Value(X))))
4390 return isMaskOrZero(X, !Not, Q, Depth);
4391
4392 // (X ^ -X) is a ~Mask
4393 if (Not)
4394 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4395 // (X ^ (X - 1)) is a Mask
4396 else
4397 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4398 case Instruction::Select:
4399 // c ? Mask0 : Mask1 is a Mask.
4400 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4401 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4402 case Instruction::Shl:
4403 // (~Mask) << X is a ~Mask.
4404 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4405 case Instruction::LShr:
4406 // Mask >> X is a Mask.
4407 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4408 case Instruction::AShr:
4409 // Mask s>> X is a Mask.
4410 // ~Mask s>> X is a ~Mask.
4411 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4412 case Instruction::Add:
4413 // Pow2 - 1 is a Mask.
4414 if (!Not && match(I->getOperand(1), m_AllOnes()))
4415 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4416 Depth, Q.AC, Q.CxtI, Q.DT);
4417 break;
4418 case Instruction::Sub:
4419 // -Pow2 is a ~Mask.
4420 if (Not && match(I->getOperand(0), m_Zero()))
4421 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4422 Depth, Q.AC, Q.CxtI, Q.DT);
4423 break;
4424 case Instruction::Call: {
4425 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4426 switch (II->getIntrinsicID()) {
4427 // min/max(Mask0, Mask1) is a Mask.
4428 // min/max(~Mask0, ~Mask1) is a ~Mask.
4429 case Intrinsic::umax:
4430 case Intrinsic::smax:
4431 case Intrinsic::umin:
4432 case Intrinsic::smin:
4433 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4434 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4435
4436 // In the context of masks, bitreverse(Mask) == ~Mask
4437 case Intrinsic::bitreverse:
4438 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4439 default:
4440 break;
4441 }
4442 }
4443 break;
4444 }
4445 default:
4446 break;
4447 }
4448 return false;
4449}
4450
4451/// Some comparisons can be simplified.
4452/// In this case, we are looking for comparisons that look like
4453/// a check for a lossy truncation.
4454/// Folds:
4455/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4456/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4457/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4458/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4459/// Where Mask is some pattern that produces all-ones in low bits:
4460/// (-1 >> y)
4461/// ((-1 << y) >> y) <- non-canonical, has extra uses
4462/// ~(-1 << y)
4463/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4464/// The Mask can be a constant, too.
4465/// For some predicates, the operands are commutative.
4466/// For others, x can only be on a specific side.
4468 Value *Op1, const SimplifyQuery &Q,
4469 InstCombiner &IC) {
4470
4471 ICmpInst::Predicate DstPred;
4472 switch (Pred) {
4474 // x & Mask == x
4475 // x & ~Mask == 0
4476 // ~x | Mask == -1
4477 // -> x u<= Mask
4478 // x & ~Mask == ~Mask
4479 // -> ~Mask u<= x
4481 break;
4483 // x & Mask != x
4484 // x & ~Mask != 0
4485 // ~x | Mask != -1
4486 // -> x u> Mask
4487 // x & ~Mask != ~Mask
4488 // -> ~Mask u> x
4490 break;
4492 // x & Mask u< x
4493 // -> x u> Mask
4494 // x & ~Mask u< ~Mask
4495 // -> ~Mask u> x
4497 break;
4499 // x & Mask u>= x
4500 // -> x u<= Mask
4501 // x & ~Mask u>= ~Mask
4502 // -> ~Mask u<= x
4504 break;
4506 // x & Mask s< x [iff Mask s>= 0]
4507 // -> x s> Mask
4508 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4509 // -> ~Mask s> x
4511 break;
4513 // x & Mask s>= x [iff Mask s>= 0]
4514 // -> x s<= Mask
4515 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4516 // -> ~Mask s<= x
4518 break;
4519 default:
4520 // We don't support sgt,sle
4521 // ult/ugt are simplified to true/false respectively.
4522 return nullptr;
4523 }
4524
4525 Value *X, *M;
4526 // Put search code in lambda for early positive returns.
4527 auto IsLowBitMask = [&]() {
4528 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4529 X = Op1;
4530 // Look for: x & Mask pred x
4531 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4532 return !ICmpInst::isSigned(Pred) ||
4533 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4534 }
4535
4536 // Look for: x & ~Mask pred ~Mask
4537 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4538 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4539 }
4540 return false;
4541 }
4542 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4543 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4544
4545 auto Check = [&]() {
4546 // Look for: ~x | Mask == -1
4547 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4548 if (Value *NotX =
4549 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4550 X = NotX;
4551 return true;
4552 }
4553 }
4554 return false;
4555 };
4556 if (Check())
4557 return true;
4558 std::swap(X, M);
4559 return Check();
4560 }
4561 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4562 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4563 auto Check = [&]() {
4564 // Look for: x & ~Mask == 0
4565 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4566 if (Value *NotM =
4567 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4568 M = NotM;
4569 return true;
4570 }
4571 }
4572 return false;
4573 };
4574 if (Check())
4575 return true;
4576 std::swap(X, M);
4577 return Check();
4578 }
4579 return false;
4580 };
4581
4582 if (!IsLowBitMask())
4583 return nullptr;
4584
4585 return IC.Builder.CreateICmp(DstPred, X, M);
4586}
4587
4588/// Some comparisons can be simplified.
4589/// In this case, we are looking for comparisons that look like
4590/// a check for a lossy signed truncation.
4591/// Folds: (MaskedBits is a constant.)
4592/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4593/// Into:
4594/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4595/// Where KeptBits = bitwidth(%x) - MaskedBits
4596static Value *
4598 InstCombiner::BuilderTy &Builder) {
4599 CmpPredicate SrcPred;
4600 Value *X;
4601 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4602 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4603 if (!match(&I, m_c_ICmp(SrcPred,
4605 m_APInt(C1))),
4606 m_Deferred(X))))
4607 return nullptr;
4608
4609 // Potential handling of non-splats: for each element:
4610 // * if both are undef, replace with constant 0.
4611 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4612 // * if both are not undef, and are different, bailout.
4613 // * else, only one is undef, then pick the non-undef one.
4614
4615 // The shift amount must be equal.
4616 if (*C0 != *C1)
4617 return nullptr;
4618 const APInt &MaskedBits = *C0;
4619 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4620
4621 ICmpInst::Predicate DstPred;
4622 switch (SrcPred) {
4624 // ((%x << MaskedBits) a>> MaskedBits) == %x
4625 // =>
4626 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4628 break;
4630 // ((%x << MaskedBits) a>> MaskedBits) != %x
4631 // =>
4632 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4634 break;
4635 // FIXME: are more folds possible?
4636 default:
4637 return nullptr;
4638 }
4639
4640 auto *XType = X->getType();
4641 const unsigned XBitWidth = XType->getScalarSizeInBits();
4642 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4643 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4644
4645 // KeptBits = bitwidth(%x) - MaskedBits
4646 const APInt KeptBits = BitWidth - MaskedBits;
4647 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4648 // ICmpCst = (1 << KeptBits)
4649 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4650 assert(ICmpCst.isPowerOf2());
4651 // AddCst = (1 << (KeptBits-1))
4652 const APInt AddCst = ICmpCst.lshr(1);
4653 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4654
4655 // T0 = add %x, AddCst
4656 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4657 // T1 = T0 DstPred ICmpCst
4658 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4659
4660 return T1;
4661}
4662
4663// Given pattern:
4664// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4665// we should move shifts to the same hand of 'and', i.e. rewrite as
4666// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4667// We are only interested in opposite logical shifts here.
4668// One of the shifts can be truncated.
4669// If we can, we want to end up creating 'lshr' shift.
4670static Value *
4672 InstCombiner::BuilderTy &Builder) {
4673 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4674 !I.getOperand(0)->hasOneUse())
4675 return nullptr;
4676
4677 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4678
4679 // Look for an 'and' of two logical shifts, one of which may be truncated.
4680 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4681 Instruction *XShift, *MaybeTruncation, *YShift;
4682 if (!match(
4683 I.getOperand(0),
4684 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4686 m_AnyLogicalShift, m_Instruction(YShift))),
4687 m_Instruction(MaybeTruncation)))))
4688 return nullptr;
4689
4690 // We potentially looked past 'trunc', but only when matching YShift,
4691 // therefore YShift must have the widest type.
4692 Instruction *WidestShift = YShift;
4693 // Therefore XShift must have the shallowest type.
4694 // Or they both have identical types if there was no truncation.
4695 Instruction *NarrowestShift = XShift;
4696
4697 Type *WidestTy = WidestShift->getType();
4698 Type *NarrowestTy = NarrowestShift->getType();
4699 assert(NarrowestTy == I.getOperand(0)->getType() &&
4700 "We did not look past any shifts while matching XShift though.");
4701 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4702
4703 // If YShift is a 'lshr', swap the shifts around.
4704 if (match(YShift, m_LShr(m_Value(), m_Value())))
4705 std::swap(XShift, YShift);
4706
4707 // The shifts must be in opposite directions.
4708 auto XShiftOpcode = XShift->getOpcode();
4709 if (XShiftOpcode == YShift->getOpcode())
4710 return nullptr; // Do not care about same-direction shifts here.
4711
4712 Value *X, *XShAmt, *Y, *YShAmt;
4713 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4714 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4715
4716 // If one of the values being shifted is a constant, then we will end with
4717 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4718 // however, we will need to ensure that we won't increase instruction count.
4719 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4720 // At least one of the hands of the 'and' should be one-use shift.
4721 if (!match(I.getOperand(0),
4722 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4723 return nullptr;
4724 if (HadTrunc) {
4725 // Due to the 'trunc', we will need to widen X. For that either the old
4726 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4727 if (!MaybeTruncation->hasOneUse() &&
4728 !NarrowestShift->getOperand(1)->hasOneUse())
4729 return nullptr;
4730 }
4731 }
4732
4733 // We have two shift amounts from two different shifts. The types of those
4734 // shift amounts may not match. If that's the case let's bailout now.
4735 if (XShAmt->getType() != YShAmt->getType())
4736 return nullptr;
4737
4738 // As input, we have the following pattern:
4739 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4740 // We want to rewrite that as:
4741 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4742 // While we know that originally (Q+K) would not overflow
4743 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4744 // shift amounts. so it may now overflow in smaller bitwidth.
4745 // To ensure that does not happen, we need to ensure that the total maximal
4746 // shift amount is still representable in that smaller bit width.
4747 unsigned MaximalPossibleTotalShiftAmount =
4748 (WidestTy->getScalarSizeInBits() - 1) +
4749 (NarrowestTy->getScalarSizeInBits() - 1);
4750 APInt MaximalRepresentableShiftAmount =
4752 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4753 return nullptr;
4754
4755 // Can we fold (XShAmt+YShAmt) ?
4756 auto *NewShAmt = dyn_cast_or_null<Constant>(
4757 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4758 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4759 if (!NewShAmt)
4760 return nullptr;
4761 if (NewShAmt->getType() != WidestTy) {
4762 NewShAmt =
4763 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4764 if (!NewShAmt)
4765 return nullptr;
4766 }
4767 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4768
4769 // Is the new shift amount smaller than the bit width?
4770 // FIXME: could also rely on ConstantRange.
4771 if (!match(NewShAmt,
4773 APInt(WidestBitWidth, WidestBitWidth))))
4774 return nullptr;
4775
4776 // An extra legality check is needed if we had trunc-of-lshr.
4777 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4778 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4779 WidestShift]() {
4780 // It isn't obvious whether it's worth it to analyze non-constants here.
4781 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4782 // If *any* of these preconditions matches we can perform the fold.
4783 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4784 ? NewShAmt->getSplatValue()
4785 : NewShAmt;
4786 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4787 if (NewShAmtSplat &&
4788 (NewShAmtSplat->isNullValue() ||
4789 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4790 return true;
4791 // We consider *min* leading zeros so a single outlier
4792 // blocks the transform as opposed to allowing it.
4793 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4794 KnownBits Known = computeKnownBits(C, SQ.DL);
4795 unsigned MinLeadZero = Known.countMinLeadingZeros();
4796 // If the value being shifted has at most lowest bit set we can fold.
4797 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4798 if (MaxActiveBits <= 1)
4799 return true;
4800 // Precondition: NewShAmt u<= countLeadingZeros(C)
4801 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4802 return true;
4803 }
4804 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4805 KnownBits Known = computeKnownBits(C, SQ.DL);
4806 unsigned MinLeadZero = Known.countMinLeadingZeros();
4807 // If the value being shifted has at most lowest bit set we can fold.
4808 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4809 if (MaxActiveBits <= 1)
4810 return true;
4811 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4812 if (NewShAmtSplat) {
4813 APInt AdjNewShAmt =
4814 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4815 if (AdjNewShAmt.ule(MinLeadZero))
4816 return true;
4817 }
4818 }
4819 return false; // Can't tell if it's ok.
4820 };
4821 if (!CanFold())
4822 return nullptr;
4823 }
4824
4825 // All good, we can do this fold.
4826 X = Builder.CreateZExt(X, WidestTy);
4827 Y = Builder.CreateZExt(Y, WidestTy);
4828 // The shift is the same that was for X.
4829 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4830 ? Builder.CreateLShr(X, NewShAmt)
4831 : Builder.CreateShl(X, NewShAmt);
4832 Value *T1 = Builder.CreateAnd(T0, Y);
4833 return Builder.CreateICmp(I.getPredicate(), T1,
4834 Constant::getNullValue(WidestTy));
4835}
4836
4837/// Fold
4838/// (-1 u/ x) u< y
4839/// ((x * y) ?/ x) != y
4840/// to
4841/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4842/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4843/// will mean that we are looking for the opposite answer.
4845 CmpPredicate Pred;
4846 Value *X, *Y;
4848 Instruction *Div;
4849 bool NeedNegation;
4850 // Look for: (-1 u/ x) u</u>= y
4851 if (!I.isEquality() &&
4852 match(&I, m_c_ICmp(Pred,
4854 m_Instruction(Div)),
4855 m_Value(Y)))) {
4856 Mul = nullptr;
4857
4858 // Are we checking that overflow does not happen, or does happen?
4859 switch (Pred) {
4861 NeedNegation = false;
4862 break; // OK
4864 NeedNegation = true;
4865 break; // OK
4866 default:
4867 return nullptr; // Wrong predicate.
4868 }
4869 } else // Look for: ((x * y) / x) !=/== y
4870 if (I.isEquality() &&
4871 match(&I,
4872 m_c_ICmp(Pred, m_Value(Y),
4875 m_Value(X)),
4877 m_Deferred(X))),
4878 m_Instruction(Div))))) {
4879 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4880 } else
4881 return nullptr;
4882
4884 // If the pattern included (x * y), we'll want to insert new instructions
4885 // right before that original multiplication so that we can replace it.
4886 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4887 if (MulHadOtherUses)
4889
4891 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4892 : Intrinsic::smul_with_overflow,
4893 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4894
4895 // If the multiplication was used elsewhere, to ensure that we don't leave
4896 // "duplicate" instructions, replace uses of that original multiplication
4897 // with the multiplication result from the with.overflow intrinsic.
4898 if (MulHadOtherUses)
4899 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4900
4901 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4902 if (NeedNegation) // This technically increases instruction count.
4903 Res = Builder.CreateNot(Res, "mul.not.ov");
4904
4905 // If we replaced the mul, erase it. Do this after all uses of Builder,
4906 // as the mul is used as insertion point.
4907 if (MulHadOtherUses)
4909
4910 return Res;
4911}
4912
4914 InstCombiner::BuilderTy &Builder) {
4915 CmpPredicate Pred;
4916 Value *X;
4917 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4918
4919 if (ICmpInst::isSigned(Pred))
4920 Pred = ICmpInst::getSwappedPredicate(Pred);
4921 else if (ICmpInst::isUnsigned(Pred))
4922 Pred = ICmpInst::getSignedPredicate(Pred);
4923 // else for equality-comparisons just keep the predicate.
4924
4925 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4926 Constant::getNullValue(X->getType()), I.getName());
4927 }
4928
4929 // A value is not equal to its negation unless that value is 0 or
4930 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4931 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4932 ICmpInst::isEquality(Pred)) {
4933 Type *Ty = X->getType();
4935 Constant *MaxSignedVal =
4936 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4937 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4938 Constant *Zero = Constant::getNullValue(Ty);
4939 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4940 }
4941
4942 return nullptr;
4943}
4944
4946 InstCombinerImpl &IC) {
4947 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4948 // Normalize and operand as operand 0.
4949 CmpInst::Predicate Pred = I.getPredicate();
4950 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4951 std::swap(Op0, Op1);
4952 Pred = ICmpInst::getSwappedPredicate(Pred);
4953 }
4954
4955 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4956 return nullptr;
4957
4958 // (icmp (X & Y) u< X --> (X & Y) != X
4959 if (Pred == ICmpInst::ICMP_ULT)
4960 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4961
4962 // (icmp (X & Y) u>= X --> (X & Y) == X
4963 if (Pred == ICmpInst::ICMP_UGE)
4964 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4965
4966 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4967 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
4968 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
4969 // so don't do this fold.
4970 if (!match(Op1, m_ImmConstant()))
4971 if (auto *NotOp1 =
4972 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
4973 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
4974 Constant::getAllOnesValue(Op1->getType()));
4975 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
4976 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4977 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
4978 Constant::getNullValue(Op1->getType()));
4979 }
4980
4981 if (!ICmpInst::isSigned(Pred))
4982 return nullptr;
4983
4984 KnownBits KnownY = IC.computeKnownBits(A, /*Depth=*/0, &I);
4985 // (X & NegY) spred X --> (X & NegY) upred X
4986 if (KnownY.isNegative())
4987 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
4988
4989 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
4990 return nullptr;
4991
4992 if (KnownY.isNonNegative())
4993 // (X & PosY) s<= X --> X s>= 0
4994 // (X & PosY) s> X --> X s< 0
4995 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
4996 Constant::getNullValue(Op1->getType()));
4997
4999 // (NegX & Y) s<= NegX --> Y s< 0
5000 // (NegX & Y) s> NegX --> Y s>= 0
5002 Constant::getNullValue(A->getType()));
5003
5004 return nullptr;
5005}
5006
5008 InstCombinerImpl &IC) {
5009 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5010
5011 // Normalize or operand as operand 0.
5012 CmpInst::Predicate Pred = I.getPredicate();
5013 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5014 std::swap(Op0, Op1);
5015 Pred = ICmpInst::getSwappedPredicate(Pred);
5016 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5017 return nullptr;
5018 }
5019
5020 // icmp (X | Y) u<= X --> (X | Y) == X
5021 if (Pred == ICmpInst::ICMP_ULE)
5022 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5023
5024 // icmp (X | Y) u> X --> (X | Y) != X
5025 if (Pred == ICmpInst::ICMP_UGT)
5026 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5027
5028 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5029 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5030 if (Value *NotOp1 =
5031 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5032 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5033 Constant::getNullValue(Op1->getType()));
5034 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5035 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5036 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5037 Constant::getAllOnesValue(Op1->getType()));
5038 }
5039 return nullptr;
5040}
5041
5043 InstCombinerImpl &IC) {
5044 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5045 // Normalize xor operand as operand 0.
5046 CmpInst::Predicate Pred = I.getPredicate();
5047 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5048 std::swap(Op0, Op1);
5049 Pred = ICmpInst::getSwappedPredicate(Pred);
5050 }
5051 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5052 return nullptr;
5053
5054 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5055 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5056 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5057 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5059 if (PredOut != Pred && isKnownNonZero(A, Q))
5060 return new ICmpInst(PredOut, Op0, Op1);
5061
5062 return nullptr;
5063}
5064
5065/// Try to fold icmp (binop), X or icmp X, (binop).
5066/// TODO: A large part of this logic is duplicated in InstSimplify's
5067/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5068/// duplication.
5070 const SimplifyQuery &SQ) {
5072 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5073
5074 // Special logic for binary operators.
5075 BinaryOperator *BO0 = dyn_cast<BinaryOperator>(Op0);
5076 BinaryOperator *BO1 = dyn_cast<BinaryOperator>(Op1);
5077 if (!BO0 && !BO1)
5078 return nullptr;
5079
5080 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5081 return NewICmp;
5082
5083 const CmpInst::Predicate Pred = I.getPredicate();
5084 Value *X;
5085
5086 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5087 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5088 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5089 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5090 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5091 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5092 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5093 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5094 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5095
5096 {
5097 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5098 Constant *C;
5099 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5100 m_ImmConstant(C)))) &&
5101 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5103 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5104 }
5105 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5106 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5107 m_ImmConstant(C)))) &&
5108 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5110 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5111 }
5112 }
5113
5114 // (icmp eq/ne (X, -P2), INT_MIN)
5115 // -> (icmp slt/sge X, INT_MIN + P2)
5116 if (ICmpInst::isEquality(Pred) && BO0 &&
5117 match(I.getOperand(1), m_SignMask()) &&
5119 // Will Constant fold.
5120 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5121 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5123 BO0->getOperand(0), NewC);
5124 }
5125
5126 {
5127 // Similar to above: an unsigned overflow comparison may use offset + mask:
5128 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5129 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5130 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5131 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5132 BinaryOperator *BO;
5133 const APInt *C;
5134 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5135 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5137 CmpInst::Predicate NewPred =
5139 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5140 return new ICmpInst(NewPred, Op1, Zero);
5141 }
5142
5143 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5144 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5146 CmpInst::Predicate NewPred =
5148 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5149 return new ICmpInst(NewPred, Op0, Zero);
5150 }
5151 }
5152
5153 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5154 bool Op0HasNUW = false, Op1HasNUW = false;
5155 bool Op0HasNSW = false, Op1HasNSW = false;
5156 // Analyze the case when either Op0 or Op1 is an add instruction.
5157 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5158 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5159 bool &HasNSW, bool &HasNUW) -> bool {
5160 if (isa<OverflowingBinaryOperator>(BO)) {
5161 HasNUW = BO.hasNoUnsignedWrap();
5162 HasNSW = BO.hasNoSignedWrap();
5163 return ICmpInst::isEquality(Pred) ||
5164 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5165 (CmpInst::isSigned(Pred) && HasNSW);
5166 } else if (BO.getOpcode() == Instruction::Or) {
5167 HasNUW = true;
5168 HasNSW = true;
5169 return true;
5170 } else {
5171 return false;
5172 }
5173 };
5174 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5175
5176 if (BO0) {
5177 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5178 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5179 }
5180 if (BO1) {
5181 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5182 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5183 }
5184
5185 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5186 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5187 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5188 return new ICmpInst(Pred, A == Op1 ? B : A,
5189 Constant::getNullValue(Op1->getType()));
5190
5191 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5192 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5193 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5194 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5195 C == Op0 ? D : C);
5196
5197 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5198 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5199 NoOp1WrapProblem) {
5200 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5201 Value *Y, *Z;
5202 if (A == C) {
5203 // C + B == C + D -> B == D
5204 Y = B;
5205 Z = D;
5206 } else if (A == D) {
5207 // D + B == C + D -> B == C
5208 Y = B;
5209 Z = C;
5210 } else if (B == C) {
5211 // A + C == C + D -> A == D
5212 Y = A;
5213 Z = D;
5214 } else {
5215 assert(B == D);
5216 // A + D == C + D -> A == C
5217 Y = A;
5218 Z = C;
5219 }
5220 return new ICmpInst(Pred, Y, Z);
5221 }
5222
5223 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5224 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLT &&
5225 match(B, m_AllOnes()))
5226 return new ICmpInst(CmpInst::ICMP_SLE, A, Op1);
5227
5228 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5229 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGE &&
5230 match(B, m_AllOnes()))
5231 return new ICmpInst(CmpInst::ICMP_SGT, A, Op1);
5232
5233 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5234 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLE && match(B, m_One()))
5235 return new ICmpInst(CmpInst::ICMP_SLT, A, Op1);
5236
5237 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5238 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGT && match(B, m_One()))
5239 return new ICmpInst(CmpInst::ICMP_SGE, A, Op1);
5240
5241 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5242 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGT &&
5243 match(D, m_AllOnes()))
5244 return new ICmpInst(CmpInst::ICMP_SGE, Op0, C);
5245
5246 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5247 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLE &&
5248 match(D, m_AllOnes()))
5249 return new ICmpInst(CmpInst::ICMP_SLT, Op0, C);
5250
5251 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5252 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGE && match(D, m_One()))
5253 return new ICmpInst(CmpInst::ICMP_SGT, Op0, C);
5254
5255 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5256 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLT && match(D, m_One()))
5257 return new ICmpInst(CmpInst::ICMP_SLE, Op0, C);
5258
5259 // TODO: The subtraction-related identities shown below also hold, but
5260 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5261 // wouldn't happen even if they were implemented.
5262 //
5263 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5264 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5265 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5266 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5267
5268 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5269 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_ULE && match(B, m_One()))
5270 return new ICmpInst(CmpInst::ICMP_ULT, A, Op1);
5271
5272 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5273 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_UGT && match(B, m_One()))
5274 return new ICmpInst(CmpInst::ICMP_UGE, A, Op1);
5275
5276 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5277 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_UGE && match(D, m_One()))
5278 return new ICmpInst(CmpInst::ICMP_UGT, Op0, C);
5279
5280 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5281 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_ULT && match(D, m_One()))
5282 return new ICmpInst(CmpInst::ICMP_ULE, Op0, C);
5283
5284 // if C1 has greater magnitude than C2:
5285 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5286 // s.t. C3 = C1 - C2
5287 //
5288 // if C2 has greater magnitude than C1:
5289 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5290 // s.t. C3 = C2 - C1
5291 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5292 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5293 const APInt *AP1, *AP2;
5294 // TODO: Support non-uniform vectors.
5295 // TODO: Allow poison passthrough if B or D's element is poison.
5296 if (match(B, m_APIntAllowPoison(AP1)) &&
5297 match(D, m_APIntAllowPoison(AP2)) &&
5298 AP1->isNegative() == AP2->isNegative()) {
5299 APInt AP1Abs = AP1->abs();
5300 APInt AP2Abs = AP2->abs();
5301 if (AP1Abs.uge(AP2Abs)) {
5302 APInt Diff = *AP1 - *AP2;
5303 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5304 Value *NewAdd = Builder.CreateAdd(
5305 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5306 return new ICmpInst(Pred, NewAdd, C);
5307 } else {
5308 APInt Diff = *AP2 - *AP1;
5309 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5310 Value *NewAdd = Builder.CreateAdd(
5311 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5312 return new ICmpInst(Pred, A, NewAdd);
5313 }
5314 }
5315 Constant *Cst1, *Cst2;
5316 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5317 ICmpInst::isEquality(Pred)) {
5318 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5319 Value *NewAdd = Builder.CreateAdd(C, Diff);
5320 return new ICmpInst(Pred, A, NewAdd);
5321 }
5322 }
5323
5324 // Analyze the case when either Op0 or Op1 is a sub instruction.
5325 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5326 A = nullptr;
5327 B = nullptr;
5328 C = nullptr;
5329 D = nullptr;
5330 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5331 A = BO0->getOperand(0);
5332 B = BO0->getOperand(1);
5333 }
5334 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5335 C = BO1->getOperand(0);
5336 D = BO1->getOperand(1);
5337 }
5338
5339 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5340 if (A == Op1 && NoOp0WrapProblem)
5341 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5342 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5343 if (C == Op0 && NoOp1WrapProblem)
5344 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5345
5346 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5347 // (A - B) u>/u<= A --> B u>/u<= A
5348 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5349 return new ICmpInst(Pred, B, A);
5350 // C u</u>= (C - D) --> C u</u>= D
5351 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5352 return new ICmpInst(Pred, C, D);
5353 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5354 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5355 isKnownNonZero(B, Q))
5357 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5358 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5359 isKnownNonZero(D, Q))
5361
5362 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5363 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5364 return new ICmpInst(Pred, A, C);
5365
5366 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5367 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5368 return new ICmpInst(Pred, D, B);
5369
5370 // icmp (0-X) < cst --> x > -cst
5371 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5372 Value *X;
5373 if (match(BO0, m_Neg(m_Value(X))))
5374 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5375 if (RHSC->isNotMinSignedValue())
5376 return new ICmpInst(I.getSwappedPredicate(), X,
5377 ConstantExpr::getNeg(RHSC));
5378 }
5379
5380 if (Instruction * R = foldICmpXorXX(I, Q, *this))
5381 return R;
5382 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5383 return R;
5384
5385 {
5386 // Try to remove shared multiplier from comparison:
5387 // X * Z pred Y * Z
5388 Value *X, *Y, *Z;
5389 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5390 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5391 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5392 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5393 if (ICmpInst::isSigned(Pred)) {
5394 if (Op0HasNSW && Op1HasNSW) {
5395 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5396 if (ZKnown.isStrictlyPositive())
5397 return new ICmpInst(Pred, X, Y);
5398 if (ZKnown.isNegative())
5399 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5402 if (LessThan && match(LessThan, m_One()))
5403 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5404 Constant::getNullValue(Z->getType()));
5405 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5407 if (GreaterThan && match(GreaterThan, m_One()))
5408 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5409 }
5410 } else {
5411 bool NonZero;
5412 if (ICmpInst::isEquality(Pred)) {
5413 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5414 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5415 isKnownNonEqual(X, Y, DL, &AC, &I, &DT))
5416 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5417
5418 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5419 // if Z % 2 != 0
5420 // X * Z eq/ne Y * Z -> X eq/ne Y
5421 if (ZKnown.countMaxTrailingZeros() == 0)
5422 return new ICmpInst(Pred, X, Y);
5423 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5424 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5425 // X * Z eq/ne Y * Z -> X eq/ne Y
5426 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5427 return new ICmpInst(Pred, X, Y);
5428 } else
5429 NonZero = isKnownNonZero(Z, Q);
5430
5431 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5432 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5433 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5434 return new ICmpInst(Pred, X, Y);
5435 }
5436 }
5437 }
5438
5439 BinaryOperator *SRem = nullptr;
5440 // icmp (srem X, Y), Y
5441 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5442 SRem = BO0;
5443 // icmp Y, (srem X, Y)
5444 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5445 Op0 == BO1->getOperand(1))
5446 SRem = BO1;
5447 if (SRem) {
5448 // We don't check hasOneUse to avoid increasing register pressure because
5449 // the value we use is the same value this instruction was already using.
5450 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5451 default:
5452 break;
5453 case ICmpInst::ICMP_EQ:
5454 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5455 case ICmpInst::ICMP_NE:
5456 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5457 case ICmpInst::ICMP_SGT:
5458 case ICmpInst::ICMP_SGE:
5459 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5461 case ICmpInst::ICMP_SLT:
5462 case ICmpInst::ICMP_SLE:
5463 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5465 }
5466 }
5467
5468 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5469 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5470 BO0->getOperand(1) == BO1->getOperand(1)) {
5471 switch (BO0->getOpcode()) {
5472 default:
5473 break;
5474 case Instruction::Add:
5475 case Instruction::Sub:
5476 case Instruction::Xor: {
5477 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5478 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5479
5480 const APInt *C;
5481 if (match(BO0->getOperand(1), m_APInt(C))) {
5482 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5483 if (C->isSignMask()) {
5484 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5485 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5486 }
5487
5488 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5489 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5490 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5491 NewPred = I.getSwappedPredicate(NewPred);
5492 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5493 }
5494 }
5495 break;
5496 }
5497 case Instruction::Mul: {
5498 if (!I.isEquality())
5499 break;
5500
5501 const APInt *C;
5502 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5503 !C->isOne()) {
5504 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5505 // Mask = -1 >> count-trailing-zeros(C).
5506 if (unsigned TZs = C->countr_zero()) {
5507 Constant *Mask = ConstantInt::get(
5508 BO0->getType(),
5509 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5510 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5511 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5512 return new ICmpInst(Pred, And1, And2);
5513 }
5514 }
5515 break;
5516 }
5517 case Instruction::UDiv:
5518 case Instruction::LShr:
5519 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5520 break;
5521 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5522
5523 case Instruction::SDiv:
5524 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5525 !BO0->isExact() || !BO1->isExact())
5526 break;
5527 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5528
5529 case Instruction::AShr:
5530 if (!BO0->isExact() || !BO1->isExact())
5531 break;
5532 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5533
5534 case Instruction::Shl: {
5535 bool NUW = Op0HasNUW && Op1HasNUW;
5536 bool NSW = Op0HasNSW && Op1HasNSW;
5537 if (!NUW && !NSW)
5538 break;
5539 if (!NSW && I.isSigned())
5540 break;
5541 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5542 }
5543 }
5544 }
5545
5546 if (BO0) {
5547 // Transform A & (L - 1) `ult` L --> L != 0
5548 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5549 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5550
5551 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5552 auto *Zero = Constant::getNullValue(BO0->getType());
5553 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5554 }
5555 }
5556
5557 // For unsigned predicates / eq / ne:
5558 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5559 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5560 if (!ICmpInst::isSigned(Pred)) {
5561 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5562 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5563 Constant::getNullValue(Op1->getType()));
5564 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5565 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5566 Constant::getNullValue(Op0->getType()), Op0);
5567 }
5568
5570 return replaceInstUsesWith(I, V);
5571
5572 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5573 return R;
5574
5576 return replaceInstUsesWith(I, V);
5577
5579 return replaceInstUsesWith(I, V);
5580
5581 return nullptr;
5582}
5583
5584/// Fold icmp Pred min|max(X, Y), Z.
5587 Value *Z, CmpPredicate Pred) {
5588 Value *X = MinMax->getLHS();
5589 Value *Y = MinMax->getRHS();
5590 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5591 return nullptr;
5592 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5593 // Revert the transform signed pred -> unsigned pred
5594 // TODO: We can flip the signedness of predicate if both operands of icmp
5595 // are negative.
5599 } else
5600 return nullptr;
5601 }
5603 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5604 if (!Val)
5605 return std::nullopt;
5606 if (match(Val, m_One()))
5607 return true;
5608 if (match(Val, m_Zero()))
5609 return false;
5610 return std::nullopt;
5611 };
5612 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5613 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5614 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5615 return nullptr;
5616 if (!CmpXZ.has_value()) {
5617 std::swap(X, Y);
5618 std::swap(CmpXZ, CmpYZ);
5619 }
5620
5621 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5622 if (CmpYZ.has_value())
5623 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5624 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5625 };
5626
5627 switch (Pred) {
5628 case ICmpInst::ICMP_EQ:
5629 case ICmpInst::ICMP_NE: {
5630 // If X == Z:
5631 // Expr Result
5632 // min(X, Y) == Z X <= Y
5633 // max(X, Y) == Z X >= Y
5634 // min(X, Y) != Z X > Y
5635 // max(X, Y) != Z X < Y
5636 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5637 ICmpInst::Predicate NewPred =
5638 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5639 if (Pred == ICmpInst::ICMP_NE)
5640 NewPred = ICmpInst::getInversePredicate(NewPred);
5641 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5642 }
5643 // Otherwise (X != Z):
5644 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5645 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5646 if (!MinMaxCmpXZ.has_value()) {
5647 std::swap(X, Y);
5648 std::swap(CmpXZ, CmpYZ);
5649 // Re-check pre-condition X != Z
5650 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5651 break;
5652 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5653 }
5654 if (!MinMaxCmpXZ.has_value())
5655 break;
5656 if (*MinMaxCmpXZ) {
5657 // Expr Fact Result
5658 // min(X, Y) == Z X < Z false
5659 // max(X, Y) == Z X > Z false
5660 // min(X, Y) != Z X < Z true
5661 // max(X, Y) != Z X > Z true
5662 return replaceInstUsesWith(
5663 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5664 } else {
5665 // Expr Fact Result
5666 // min(X, Y) == Z X > Z Y == Z
5667 // max(X, Y) == Z X < Z Y == Z
5668 // min(X, Y) != Z X > Z Y != Z
5669 // max(X, Y) != Z X < Z Y != Z
5670 return FoldIntoCmpYZ();
5671 }
5672 break;
5673 }
5674 case ICmpInst::ICMP_SLT:
5675 case ICmpInst::ICMP_ULT:
5676 case ICmpInst::ICMP_SLE:
5677 case ICmpInst::ICMP_ULE:
5678 case ICmpInst::ICMP_SGT:
5679 case ICmpInst::ICMP_UGT:
5680 case ICmpInst::ICMP_SGE:
5681 case ICmpInst::ICMP_UGE: {
5682 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5683 if (*CmpXZ) {
5684 if (IsSame) {
5685 // Expr Fact Result
5686 // min(X, Y) < Z X < Z true
5687 // min(X, Y) <= Z X <= Z true
5688 // max(X, Y) > Z X > Z true
5689 // max(X, Y) >= Z X >= Z true
5690 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5691 } else {
5692 // Expr Fact Result
5693 // max(X, Y) < Z X < Z Y < Z
5694 // max(X, Y) <= Z X <= Z Y <= Z
5695 // min(X, Y) > Z X > Z Y > Z
5696 // min(X, Y) >= Z X >= Z Y >= Z
5697 return FoldIntoCmpYZ();
5698 }
5699 } else {
5700 if (IsSame) {
5701 // Expr Fact Result
5702 // min(X, Y) < Z X >= Z Y < Z
5703 // min(X, Y) <= Z X > Z Y <= Z
5704 // max(X, Y) > Z X <= Z Y > Z
5705 // max(X, Y) >= Z X < Z Y >= Z
5706 return FoldIntoCmpYZ();
5707 } else {
5708 // Expr Fact Result
5709 // max(X, Y) < Z X >= Z false
5710 // max(X, Y) <= Z X > Z false
5711 // min(X, Y) > Z X <= Z false
5712 // min(X, Y) >= Z X < Z false
5713 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5714 }
5715 }
5716 break;
5717 }
5718 default:
5719 break;
5720 }
5721
5722 return nullptr;
5723}
5724
5725// Canonicalize checking for a power-of-2-or-zero value:
5727 InstCombiner::BuilderTy &Builder) {
5728 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5729 const CmpInst::Predicate Pred = I.getPredicate();
5730 Value *A = nullptr;
5731 bool CheckIs;
5732 if (I.isEquality()) {
5733 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5734 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5735 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5736 m_Deferred(A)))) ||
5737 !match(Op1, m_ZeroInt()))
5738 A = nullptr;
5739
5740 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5741 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5742 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5743 A = Op1;
5744 else if (match(Op1,
5746 A = Op0;
5747
5748 CheckIs = Pred == ICmpInst::ICMP_EQ;
5749 } else if (ICmpInst::isUnsigned(Pred)) {
5750 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5751 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5752
5753 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5755 m_Specific(Op1))))) {
5756 A = Op1;
5757 CheckIs = Pred == ICmpInst::ICMP_UGE;
5758 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5760 m_Specific(Op0))))) {
5761 A = Op0;
5762 CheckIs = Pred == ICmpInst::ICMP_ULE;
5763 }
5764 }
5765
5766 if (A) {
5767 Type *Ty = A->getType();
5768 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5769 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5770 ConstantInt::get(Ty, 2))
5771 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5772 ConstantInt::get(Ty, 1));
5773 }
5774
5775 return nullptr;
5776}
5777
5779 if (!I.isEquality())
5780 return nullptr;
5781
5782 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5783 const CmpInst::Predicate Pred = I.getPredicate();
5784 Value *A, *B, *C, *D;
5785 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5786 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5787 Value *OtherVal = A == Op1 ? B : A;
5788 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5789 }
5790
5791 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5792 // A^c1 == C^c2 --> A == C^(c1^c2)
5793 ConstantInt *C1, *C2;
5794 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5795 Op1->hasOneUse()) {
5796 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5798 return new ICmpInst(Pred, A, Xor);
5799 }
5800
5801 // A^B == A^D -> B == D
5802 if (A == C)
5803 return new ICmpInst(Pred, B, D);
5804 if (A == D)
5805 return new ICmpInst(Pred, B, C);
5806 if (B == C)
5807 return new ICmpInst(Pred, A, D);
5808 if (B == D)
5809 return new ICmpInst(Pred, A, C);
5810 }
5811 }
5812
5813 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5814 // A == (A^B) -> B == 0
5815 Value *OtherVal = A == Op0 ? B : A;
5816 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5817 }
5818
5819 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
5820 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
5821 match(Op1, m_And(m_Value(C), m_Value(D)))) {
5822 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
5823
5824 if (A == C) {
5825 X = B;
5826 Y = D;
5827 Z = A;
5828 } else if (A == D) {
5829 X = B;
5830 Y = C;
5831 Z = A;
5832 } else if (B == C) {
5833 X = A;
5834 Y = D;
5835 Z = B;
5836 } else if (B == D) {
5837 X = A;
5838 Y = C;
5839 Z = B;
5840 }
5841
5842 if (X) {
5843 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
5844 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
5845 // instructions.
5846 const APInt *C0, *C1;
5847 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
5848 (*C0 ^ *C1).isNegatedPowerOf2();
5849
5850 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
5851 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
5852 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
5853 int UseCnt =
5854 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
5855 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
5856 if (XorIsNegP2 || UseCnt >= 2) {
5857 // Build (X^Y) & Z
5858 Op1 = Builder.CreateXor(X, Y);
5859 Op1 = Builder.CreateAnd(Op1, Z);
5860 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
5861 }
5862 }
5863 }
5864
5865 {
5866 // Similar to above, but specialized for constant because invert is needed:
5867 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
5868 Value *X, *Y;
5869 Constant *C;
5870 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
5871 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
5874 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
5875 }
5876 }
5877
5878 if (match(Op1, m_ZExt(m_Value(A))) &&
5879 (Op0->hasOneUse() || Op1->hasOneUse())) {
5880 // (B & (Pow2C-1)) == zext A --> A == trunc B
5881 // (B & (Pow2C-1)) != zext A --> A != trunc B
5882 const APInt *MaskC;
5883 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
5884 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
5885 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
5886 }
5887
5888 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
5889 // For lshr and ashr pairs.
5890 const APInt *AP1, *AP2;
5891 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5892 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
5893 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5894 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
5895 if (AP1 != AP2)
5896 return nullptr;
5897 unsigned TypeBits = AP1->getBitWidth();
5898 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
5899 if (ShAmt < TypeBits && ShAmt != 0) {
5900 ICmpInst::Predicate NewPred =
5902 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5903 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
5904 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
5905 }
5906 }
5907
5908 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
5909 ConstantInt *Cst1;
5910 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
5911 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
5912 unsigned TypeBits = Cst1->getBitWidth();
5913 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
5914 if (ShAmt < TypeBits && ShAmt != 0) {
5915 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5916 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
5918 I.getName() + ".mask");
5919 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
5920 }
5921 }
5922
5923 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
5924 // "icmp (and X, mask), cst"
5925 uint64_t ShAmt = 0;
5926 if (Op0->hasOneUse() &&
5927 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
5928 match(Op1, m_ConstantInt(Cst1)) &&
5929 // Only do this when A has multiple uses. This is most important to do
5930 // when it exposes other optimizations.
5931 !A->hasOneUse()) {
5932 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
5933
5934 if (ShAmt < ASize) {
5935 APInt MaskV =
5937 MaskV <<= ShAmt;
5938
5939 APInt CmpV = Cst1->getValue().zext(ASize);
5940 CmpV <<= ShAmt;
5941
5942 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
5943 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
5944 }
5945 }
5946
5948 return ICmp;
5949
5950 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks the
5951 // top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s INT_MAX",
5952 // which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a few steps
5953 // of instcombine.
5954 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
5955 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
5957 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
5958 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
5960 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
5961 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
5963 Add, ConstantInt::get(A->getType(), C.shl(1)));
5964 }
5965
5966 // Canonicalize:
5967 // Assume B_Pow2 != 0
5968 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
5969 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
5970 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
5971 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, 0, &I))
5972 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
5974
5975 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
5976 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, 0, &I))
5977 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
5978 ConstantInt::getNullValue(Op1->getType()));
5979
5980 // Canonicalize:
5981 // icmp eq/ne X, OneUse(rotate-right(X))
5982 // -> icmp eq/ne X, rotate-left(X)
5983 // We generally try to convert rotate-right -> rotate-left, this just
5984 // canonicalizes another case.
5985 if (match(&I, m_c_ICmp(m_Value(A),
5986 m_OneUse(m_Intrinsic<Intrinsic::fshr>(
5987 m_Deferred(A), m_Deferred(A), m_Value(B))))))
5988 return new ICmpInst(
5989 Pred, A,
5990 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
5991
5992 // Canonicalize:
5993 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
5994 Constant *Cst;
5997 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
5998
5999 {
6000 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6001 auto m_Matcher =
6004 m_Sub(m_Value(B), m_Deferred(A)));
6005 std::optional<bool> IsZero = std::nullopt;
6006 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6007 m_Deferred(A))))
6008 IsZero = false;
6009 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6010 else if (match(&I,
6011 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6012 IsZero = true;
6013
6014 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, /*Depth*/ 0, &I))
6015 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6016 // -> (icmp eq/ne (and X, P2), 0)
6017 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6018 // -> (icmp eq/ne (and X, P2), P2)
6019 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6020 *IsZero ? A
6021 : ConstantInt::getNullValue(A->getType()));
6022 }
6023
6024 return nullptr;
6025}
6026
6028 ICmpInst::Predicate Pred = ICmp.getPredicate();
6029 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6030
6031 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6032 // The trunc masks high bits while the compare may effectively mask low bits.
6033 Value *X;
6034 const APInt *C;
6035 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6036 return nullptr;
6037
6038 // This matches patterns corresponding to tests of the signbit as well as:
6039 // (trunc X) pred C2 --> (X & Mask) == C
6040 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*WithTrunc=*/true,
6041 /*AllowNonZeroC=*/true)) {
6042 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6043 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6044 return new ICmpInst(Res->Pred, And, C);
6045 }
6046
6047 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6048 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6049 if (II->getIntrinsicID() == Intrinsic::cttz ||
6050 II->getIntrinsicID() == Intrinsic::ctlz) {
6051 unsigned MaxRet = SrcBits;
6052 // If the "is_zero_poison" argument is set, then we know at least
6053 // one bit is set in the input, so the result is always at least one
6054 // less than the full bitwidth of that input.
6055 if (match(II->getArgOperand(1), m_One()))
6056 MaxRet--;
6057
6058 // Make sure the destination is wide enough to hold the largest output of
6059 // the intrinsic.
6060 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6061 if (Instruction *I =
6062 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6063 return I;
6064 }
6065 }
6066
6067 return nullptr;
6068}
6069
6071 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6072 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6073 Value *X;
6074 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6075 return nullptr;
6076
6077 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6078 bool IsSignedCmp = ICmp.isSigned();
6079
6080 // icmp Pred (ext X), (ext Y)
6081 Value *Y;
6082 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6083 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6084 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6085
6086 if (IsZext0 != IsZext1) {
6087 // If X and Y and both i1
6088 // (icmp eq/ne (zext X) (sext Y))
6089 // eq -> (icmp eq (or X, Y), 0)
6090 // ne -> (icmp ne (or X, Y), 0)
6091 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6092 Y->getType()->isIntOrIntVectorTy(1))
6093 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6094 Constant::getNullValue(X->getType()));
6095
6096 // If we have mismatched casts and zext has the nneg flag, we can
6097 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6098
6099 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6100 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6101
6102 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6103 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6104
6105 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6106 IsSignedExt = true;
6107 else
6108 return nullptr;
6109 }
6110
6111 // Not an extension from the same type?
6112 Type *XTy = X->getType(), *YTy = Y->getType();
6113 if (XTy != YTy) {
6114 // One of the casts must have one use because we are creating a new cast.
6115 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6116 return nullptr;
6117 // Extend the narrower operand to the type of the wider operand.
6118 CastInst::CastOps CastOpcode =
6119 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6120 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6121 X = Builder.CreateCast(CastOpcode, X, YTy);
6122 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6123 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6124 else
6125 return nullptr;
6126 }
6127
6128 // (zext X) == (zext Y) --> X == Y
6129 // (sext X) == (sext Y) --> X == Y
6130 if (ICmp.isEquality())
6131 return new ICmpInst(ICmp.getPredicate(), X, Y);
6132
6133 // A signed comparison of sign extended values simplifies into a
6134 // signed comparison.
6135 if (IsSignedCmp && IsSignedExt)
6136 return new ICmpInst(ICmp.getPredicate(), X, Y);
6137
6138 // The other three cases all fold into an unsigned comparison.
6139 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6140 }
6141
6142 // Below here, we are only folding a compare with constant.
6143 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6144 if (!C)
6145 return nullptr;
6146
6147 // If a lossless truncate is possible...
6148 Type *SrcTy = CastOp0->getSrcTy();
6149 Constant *Res = getLosslessTrunc(C, SrcTy, CastOp0->getOpcode());
6150 if (Res) {
6151 if (ICmp.isEquality())
6152 return new ICmpInst(ICmp.getPredicate(), X, Res);
6153
6154 // A signed comparison of sign extended values simplifies into a
6155 // signed comparison.
6156 if (IsSignedExt && IsSignedCmp)
6157 return new ICmpInst(ICmp.getPredicate(), X, Res);
6158
6159 // The other three cases all fold into an unsigned comparison.
6160 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6161 }
6162
6163 // The re-extended constant changed, partly changed (in the case of a vector),
6164 // or could not be determined to be equal (in the case of a constant
6165 // expression), so the constant cannot be represented in the shorter type.
6166 // All the cases that fold to true or false will have already been handled
6167 // by simplifyICmpInst, so only deal with the tricky case.
6168 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6169 return nullptr;
6170
6171 // Is source op positive?
6172 // icmp ult (sext X), C --> icmp sgt X, -1
6173 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6175
6176 // Is source op negative?
6177 // icmp ugt (sext X), C --> icmp slt X, 0
6178 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6180}
6181
6182/// Handle icmp (cast x), (cast or constant).
6184 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6185 // icmp compares only pointer's value.
6186 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6187 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6188 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6189 if (SimplifiedOp0 || SimplifiedOp1)
6190 return new ICmpInst(ICmp.getPredicate(),
6191 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6192 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6193
6194 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6195 if (!CastOp0)
6196 return nullptr;
6197 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6198 return nullptr;
6199
6200 Value *Op0Src = CastOp0->getOperand(0);
6201 Type *SrcTy = CastOp0->getSrcTy();
6202 Type *DestTy = CastOp0->getDestTy();
6203
6204 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6205 // integer type is the same size as the pointer type.
6206 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6207 if (isa<VectorType>(PtrTy)) {
6208 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6209 IntTy = cast<VectorType>(IntTy)->getElementType();
6210 }
6211 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6212 };
6213 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6214 CompatibleSizes(SrcTy, DestTy)) {
6215 Value *NewOp1 = nullptr;
6216 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6217 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6218 if (PtrSrc->getType() == Op0Src->getType())
6219 NewOp1 = PtrToIntOp1->getOperand(0);
6220 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6221 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6222 }
6223
6224 if (NewOp1)
6225 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6226 }
6227
6228 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6229 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6230 CompatibleSizes(DestTy, SrcTy)) {
6231 Value *NewOp1 = nullptr;
6232 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6233 Value *IntSrc = IntToPtrOp1->getOperand(0);
6234 if (IntSrc->getType() == Op0Src->getType())
6235 NewOp1 = IntToPtrOp1->getOperand(0);
6236 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6237 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6238 }
6239
6240 if (NewOp1)
6241 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6242 }
6243
6244 if (Instruction *R = foldICmpWithTrunc(ICmp))
6245 return R;
6246
6247 return foldICmpWithZextOrSext(ICmp);
6248}
6249
6250static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
6251 switch (BinaryOp) {
6252 default:
6253 llvm_unreachable("Unsupported binary op");
6254 case Instruction::Add:
6255 case Instruction::Sub:
6256 return match(RHS, m_Zero());
6257 case Instruction::Mul:
6258 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6259 match(RHS, m_One());
6260 }
6261}
6262
6265 bool IsSigned, Value *LHS, Value *RHS,
6266 Instruction *CxtI) const {
6267 switch (BinaryOp) {
6268 default:
6269 llvm_unreachable("Unsupported binary op");
6270 case Instruction::Add:
6271 if (IsSigned)
6272 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6273 else
6274 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6275 case Instruction::Sub:
6276 if (IsSigned)
6277 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6278 else
6279 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6280 case Instruction::Mul:
6281 if (IsSigned)
6282 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6283 else
6284 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6285 }
6286}
6287
6288bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6289 bool IsSigned, Value *LHS,
6290 Value *RHS, Instruction &OrigI,
6291 Value *&Result,
6292 Constant *&Overflow) {
6293 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6294 std::swap(LHS, RHS);
6295
6296 // If the overflow check was an add followed by a compare, the insertion point
6297 // may be pointing to the compare. We want to insert the new instructions
6298 // before the add in case there are uses of the add between the add and the
6299 // compare.
6300 Builder.SetInsertPoint(&OrigI);
6301
6302 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6303 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6304 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6305
6306 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6307 Result = LHS;
6308 Overflow = ConstantInt::getFalse(OverflowTy);
6309 return true;
6310 }
6311
6312 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6314 return false;
6317 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6318 Result->takeName(&OrigI);
6319 Overflow = ConstantInt::getTrue(OverflowTy);
6320 return true;
6322 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6323 Result->takeName(&OrigI);
6324 Overflow = ConstantInt::getFalse(OverflowTy);
6325 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6326 if (IsSigned)
6327 Inst->setHasNoSignedWrap();
6328 else
6329 Inst->setHasNoUnsignedWrap();
6330 }
6331 return true;
6332 }
6333
6334 llvm_unreachable("Unexpected overflow result");
6335}
6336
6337/// Recognize and process idiom involving test for multiplication
6338/// overflow.
6339///
6340/// The caller has matched a pattern of the form:
6341/// I = cmp u (mul(zext A, zext B), V
6342/// The function checks if this is a test for overflow and if so replaces
6343/// multiplication with call to 'mul.with.overflow' intrinsic.
6344///
6345/// \param I Compare instruction.
6346/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6347/// the compare instruction. Must be of integer type.
6348/// \param OtherVal The other argument of compare instruction.
6349/// \returns Instruction which must replace the compare instruction, NULL if no
6350/// replacement required.
6352 const APInt *OtherVal,
6353 InstCombinerImpl &IC) {
6354 // Don't bother doing this transformation for pointers, don't do it for
6355 // vectors.
6356 if (!isa<IntegerType>(MulVal->getType()))
6357 return nullptr;
6358
6359 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6360 if (!MulInstr)
6361 return nullptr;
6362 assert(MulInstr->getOpcode() == Instruction::Mul);
6363
6364 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6365 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6366 assert(LHS->getOpcode() == Instruction::ZExt);
6367 assert(RHS->getOpcode() == Instruction::ZExt);
6368 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6369
6370 // Calculate type and width of the result produced by mul.with.overflow.
6371 Type *TyA = A->getType(), *TyB = B->getType();
6372 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6373 WidthB = TyB->getPrimitiveSizeInBits();
6374 unsigned MulWidth;
6375 Type *MulType;
6376 if (WidthB > WidthA) {
6377 MulWidth = WidthB;
6378 MulType = TyB;
6379 } else {
6380 MulWidth = WidthA;
6381 MulType = TyA;
6382 }
6383
6384 // In order to replace the original mul with a narrower mul.with.overflow,
6385 // all uses must ignore upper bits of the product. The number of used low
6386 // bits must be not greater than the width of mul.with.overflow.
6387 if (MulVal->hasNUsesOrMore(2))
6388 for (User *U : MulVal->users()) {
6389 if (U == &I)
6390 continue;
6391 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6392 // Check if truncation ignores bits above MulWidth.
6393 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6394 if (TruncWidth > MulWidth)
6395 return nullptr;
6396 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6397 // Check if AND ignores bits above MulWidth.
6398 if (BO->getOpcode() != Instruction::And)
6399 return nullptr;
6400 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6401 const APInt &CVal = CI->getValue();
6402 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6403 return nullptr;
6404 } else {
6405 // In this case we could have the operand of the binary operation
6406 // being defined in another block, and performing the replacement
6407 // could break the dominance relation.
6408 return nullptr;
6409 }
6410 } else {
6411 // Other uses prohibit this transformation.
6412 return nullptr;
6413 }
6414 }
6415
6416 // Recognize patterns
6417 switch (I.getPredicate()) {
6418 case ICmpInst::ICMP_UGT: {
6419 // Recognize pattern:
6420 // mulval = mul(zext A, zext B)
6421 // cmp ugt mulval, max
6422 APInt MaxVal = APInt::getMaxValue(MulWidth);
6423 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6424 if (MaxVal.eq(*OtherVal))
6425 break; // Recognized
6426 return nullptr;
6427 }
6428
6429 case ICmpInst::ICMP_ULT: {
6430 // Recognize pattern:
6431 // mulval = mul(zext A, zext B)
6432 // cmp ule mulval, max + 1
6433 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6434 if (MaxVal.eq(*OtherVal))
6435 break; // Recognized
6436 return nullptr;
6437 }
6438
6439 default:
6440 return nullptr;
6441 }
6442
6443 InstCombiner::BuilderTy &Builder = IC.Builder;
6444 Builder.SetInsertPoint(MulInstr);
6445
6446 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6447 Value *MulA = A, *MulB = B;
6448 if (WidthA < MulWidth)
6449 MulA = Builder.CreateZExt(A, MulType);
6450 if (WidthB < MulWidth)
6451 MulB = Builder.CreateZExt(B, MulType);
6452 CallInst *Call =
6453 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6454 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6455 IC.addToWorklist(MulInstr);
6456
6457 // If there are uses of mul result other than the comparison, we know that
6458 // they are truncation or binary AND. Change them to use result of
6459 // mul.with.overflow and adjust properly mask/size.
6460 if (MulVal->hasNUsesOrMore(2)) {
6461 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6462 for (User *U : make_early_inc_range(MulVal->users())) {
6463 if (U == &I)
6464 continue;
6465 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6466 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6467 IC.replaceInstUsesWith(*TI, Mul);
6468 else
6469 TI->setOperand(0, Mul);
6470 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6471 assert(BO->getOpcode() == Instruction::And);
6472 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6473 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6474 APInt ShortMask = CI->getValue().trunc(MulWidth);
6475 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6476 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6477 IC.replaceInstUsesWith(*BO, Zext);
6478 } else {
6479 llvm_unreachable("Unexpected Binary operation");
6480 }
6481 IC.addToWorklist(cast<Instruction>(U));
6482 }
6483 }
6484
6485 // The original icmp gets replaced with the overflow value, maybe inverted
6486 // depending on predicate.
6487 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6488 Value *Res = Builder.CreateExtractValue(Call, 1);
6489 return BinaryOperator::CreateNot(Res);
6490 }
6491
6492 return ExtractValueInst::Create(Call, 1);
6493}
6494
6495/// When performing a comparison against a constant, it is possible that not all
6496/// the bits in the LHS are demanded. This helper method computes the mask that
6497/// IS demanded.
6499 const APInt *RHS;
6500 if (!match(I.getOperand(1), m_APInt(RHS)))
6502
6503 // If this is a normal comparison, it demands all bits. If it is a sign bit
6504 // comparison, it only demands the sign bit.
6505 bool UnusedBit;
6506 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6508
6509 switch (I.getPredicate()) {
6510 // For a UGT comparison, we don't care about any bits that
6511 // correspond to the trailing ones of the comparand. The value of these
6512 // bits doesn't impact the outcome of the comparison, because any value
6513 // greater than the RHS must differ in a bit higher than these due to carry.
6514 case ICmpInst::ICMP_UGT:
6515 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6516
6517 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6518 // Any value less than the RHS must differ in a higher bit because of carries.
6519 case ICmpInst::ICMP_ULT:
6520 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6521
6522 default:
6524 }
6525}
6526
6527/// Check that one use is in the same block as the definition and all
6528/// other uses are in blocks dominated by a given block.
6529///
6530/// \param DI Definition
6531/// \param UI Use
6532/// \param DB Block that must dominate all uses of \p DI outside
6533/// the parent block
6534/// \return true when \p UI is the only use of \p DI in the parent block
6535/// and all other uses of \p DI are in blocks dominated by \p DB.
6536///
6538 const Instruction *UI,
6539 const BasicBlock *DB) const {
6540 assert(DI && UI && "Instruction not defined\n");
6541 // Ignore incomplete definitions.
6542 if (!DI->getParent())
6543 return false;
6544 // DI and UI must be in the same block.
6545 if (DI->getParent() != UI->getParent())
6546 return false;
6547 // Protect from self-referencing blocks.
6548 if (DI->getParent() == DB)
6549 return false;
6550 for (const User *U : DI->users()) {
6551 auto *Usr = cast<Instruction>(U);
6552 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6553 return false;
6554 }
6555 return true;
6556}
6557
6558/// Return true when the instruction sequence within a block is select-cmp-br.
6559static bool isChainSelectCmpBranch(const SelectInst *SI) {
6560 const BasicBlock *BB = SI->getParent();
6561 if (!BB)
6562 return false;
6563 auto *BI = dyn_cast_or_null<BranchInst>(BB->getTerminator());
6564 if (!BI || BI->getNumSuccessors() != 2)
6565 return false;
6566 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6567 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6568 return false;
6569 return true;
6570}
6571
6572/// True when a select result is replaced by one of its operands
6573/// in select-icmp sequence. This will eventually result in the elimination
6574/// of the select.
6575///
6576/// \param SI Select instruction
6577/// \param Icmp Compare instruction
6578/// \param SIOpd Operand that replaces the select
6579///
6580/// Notes:
6581/// - The replacement is global and requires dominator information
6582/// - The caller is responsible for the actual replacement
6583///
6584/// Example:
6585///
6586/// entry:
6587/// %4 = select i1 %3, %C* %0, %C* null
6588/// %5 = icmp eq %C* %4, null
6589/// br i1 %5, label %9, label %7
6590/// ...
6591/// ; <label>:7 ; preds = %entry
6592/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6593/// ...
6594///
6595/// can be transformed to
6596///
6597/// %5 = icmp eq %C* %0, null
6598/// %6 = select i1 %3, i1 %5, i1 true
6599/// br i1 %6, label %9, label %7
6600/// ...
6601/// ; <label>:7 ; preds = %entry
6602/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6603///
6604/// Similar when the first operand of the select is a constant or/and
6605/// the compare is for not equal rather than equal.
6606///
6607/// NOTE: The function is only called when the select and compare constants
6608/// are equal, the optimization can work only for EQ predicates. This is not a
6609/// major restriction since a NE compare should be 'normalized' to an equal
6610/// compare, which usually happens in the combiner and test case
6611/// select-cmp-br.ll checks for it.
6613 const ICmpInst *Icmp,
6614 const unsigned SIOpd) {
6615 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6617 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6618 // The check for the single predecessor is not the best that can be
6619 // done. But it protects efficiently against cases like when SI's
6620 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6621 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6622 // replaced can be reached on either path. So the uniqueness check
6623 // guarantees that the path all uses of SI (outside SI's parent) are on
6624 // is disjoint from all other paths out of SI. But that information
6625 // is more expensive to compute, and the trade-off here is in favor
6626 // of compile-time. It should also be noticed that we check for a single
6627 // predecessor and not only uniqueness. This to handle the situation when
6628 // Succ and Succ1 points to the same basic block.
6629 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6630 NumSel++;
6631 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6632 return true;
6633 }
6634 }
6635 return false;
6636}
6637
6638/// Try to fold the comparison based on range information we can get by checking
6639/// whether bits are known to be zero or one in the inputs.
6641 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6642 Type *Ty = Op0->getType();
6643 ICmpInst::Predicate Pred = I.getPredicate();
6644
6645 // Get scalar or pointer size.
6646 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6647 ? Ty->getScalarSizeInBits()
6649
6650 if (!BitWidth)
6651 return nullptr;
6652
6653 KnownBits Op0Known(BitWidth);
6654 KnownBits Op1Known(BitWidth);
6655
6656 {
6657 // Don't use dominating conditions when folding icmp using known bits. This
6658 // may convert signed into unsigned predicates in ways that other passes
6659 // (especially IndVarSimplify) may not be able to reliably undo.
6662 Op0Known, /*Depth=*/0, Q))
6663 return &I;
6664
6666 /*Depth=*/0, Q))
6667 return &I;
6668 }
6669
6670 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6671 return new ICmpInst(
6672 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6673 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6674 return new ICmpInst(
6675 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
6676
6677 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
6678 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
6679
6680 // Given the known and unknown bits, compute a range that the LHS could be
6681 // in. Compute the Min, Max and RHS values based on the known bits. For the
6682 // EQ and NE we use unsigned values.
6683 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6684 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6685 if (I.isSigned()) {
6686 Op0Min = Op0Known.getSignedMinValue();
6687 Op0Max = Op0Known.getSignedMaxValue();
6688 Op1Min = Op1Known.getSignedMinValue();
6689 Op1Max = Op1Known.getSignedMaxValue();
6690 } else {
6691 Op0Min = Op0Known.getMinValue();
6692 Op0Max = Op0Known.getMaxValue();
6693 Op1Min = Op1Known.getMinValue();
6694 Op1Max = Op1Known.getMaxValue();
6695 }
6696
6697 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6698 // min/max canonical compare with some other compare. That could lead to
6699 // conflict with select canonicalization and infinite looping.
6700 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6701 auto isMinMaxCmp = [&](Instruction &Cmp) {
6702 if (!Cmp.hasOneUse())
6703 return false;
6704 Value *A, *B;
6705 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6707 return false;
6708 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6709 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6710 };
6711 if (!isMinMaxCmp(I)) {
6712 switch (Pred) {
6713 default:
6714 break;
6715 case ICmpInst::ICMP_ULT: {
6716 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6717 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6718 const APInt *CmpC;
6719 if (match(Op1, m_APInt(CmpC))) {
6720 // A <u C -> A == C-1 if min(A)+1 == C
6721 if (*CmpC == Op0Min + 1)
6722 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6723 ConstantInt::get(Op1->getType(), *CmpC - 1));
6724 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6725 // exceeds the log2 of C.
6726 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6727 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6728 Constant::getNullValue(Op1->getType()));
6729 }
6730 break;
6731 }
6732 case ICmpInst::ICMP_UGT: {
6733 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6734 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6735 const APInt *CmpC;
6736 if (match(Op1, m_APInt(CmpC))) {
6737 // A >u C -> A == C+1 if max(a)-1 == C
6738 if (*CmpC == Op0Max - 1)
6739 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6740 ConstantInt::get(Op1->getType(), *CmpC + 1));
6741 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6742 // exceeds the log2 of C.
6743 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6744 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6745 Constant::getNullValue(Op1->getType()));
6746 }
6747 break;
6748 }
6749 case ICmpInst::ICMP_SLT: {
6750 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6751 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6752 const APInt *CmpC;
6753 if (match(Op1, m_APInt(CmpC))) {
6754 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6755 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6756 ConstantInt::get(Op1->getType(), *CmpC - 1));
6757 }
6758 break;
6759 }
6760 case ICmpInst::ICMP_SGT: {
6761 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6762 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6763 const APInt *CmpC;
6764 if (match(Op1, m_APInt(CmpC))) {
6765 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6766 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6767 ConstantInt::get(Op1->getType(), *CmpC + 1));
6768 }
6769 break;
6770 }
6771 }
6772 }
6773
6774 // Based on the range information we know about the LHS, see if we can
6775 // simplify this comparison. For example, (x&4) < 8 is always true.
6776 switch (Pred) {
6777 default:
6778 break;
6779 case ICmpInst::ICMP_EQ:
6780 case ICmpInst::ICMP_NE: {
6781 // If all bits are known zero except for one, then we know at most one bit
6782 // is set. If the comparison is against zero, then this is a check to see if
6783 // *that* bit is set.
6784 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6785 if (Op1Known.isZero()) {
6786 // If the LHS is an AND with the same constant, look through it.
6787 Value *LHS = nullptr;
6788 const APInt *LHSC;
6789 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6790 *LHSC != Op0KnownZeroInverted)
6791 LHS = Op0;
6792
6793 Value *X;
6794 const APInt *C1;
6795 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6796 Type *XTy = X->getType();
6797 unsigned Log2C1 = C1->countr_zero();
6798 APInt C2 = Op0KnownZeroInverted;
6799 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6800 if (C2Pow2.isPowerOf2()) {
6801 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6802 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6803 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6804 unsigned Log2C2 = C2Pow2.countr_zero();
6805 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6806 auto NewPred =
6808 return new ICmpInst(NewPred, X, CmpC);
6809 }
6810 }
6811 }
6812
6813 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6814 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
6815 (Op0Known & Op1Known) == Op0Known)
6816 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6817 ConstantInt::getNullValue(Op1->getType()));
6818 break;
6819 }
6820 case ICmpInst::ICMP_SGE:
6821 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
6822 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6823 break;
6824 case ICmpInst::ICMP_SLE:
6825 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
6826 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6827 break;
6828 case ICmpInst::ICMP_UGE:
6829 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
6830 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6831 break;
6832 case ICmpInst::ICMP_ULE:
6833 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
6834 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6835 break;
6836 }
6837
6838 // Turn a signed comparison into an unsigned one if both operands are known to
6839 // have the same sign. Set samesign if possible (except for equality
6840 // predicates).
6841 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
6842 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6843 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
6844 I.setPredicate(I.getUnsignedPredicate());
6845 I.setSameSign();
6846 return &I;
6847 }
6848
6849 return nullptr;
6850}
6851
6852/// If one operand of an icmp is effectively a bool (value range of {0,1}),
6853/// then try to reduce patterns based on that limit.
6855 Value *X, *Y;
6856 CmpPredicate Pred;
6857
6858 // X must be 0 and bool must be true for "ULT":
6859 // X <u (zext i1 Y) --> (X == 0) & Y
6860 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
6861 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
6862 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
6863
6864 // X must be 0 or bool must be true for "ULE":
6865 // X <=u (sext i1 Y) --> (X == 0) | Y
6866 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
6867 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
6868 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
6869
6870 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
6871 CmpPredicate Pred1, Pred2;
6872 const APInt *C;
6873 Instruction *ExtI;
6874 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
6877 m_APInt(C)))))) &&
6878 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
6879 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
6880 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
6881 auto CreateRangeCheck = [&] {
6882 Value *CmpV1 =
6883 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
6884 Value *CmpV2 = Builder.CreateICmp(
6885 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
6887 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
6888 CmpV1, CmpV2);
6889 };
6890 if (C->isZero()) {
6891 if (Pred2 == ICmpInst::ICMP_EQ) {
6892 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
6893 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
6894 return replaceInstUsesWith(
6895 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6896 } else if (!IsSExt || HasOneUse) {
6897 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
6898 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
6899 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
6900 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X == -1
6901 return CreateRangeCheck();
6902 }
6903 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
6904 if (Pred2 == ICmpInst::ICMP_NE) {
6905 // icmp eq X, (zext (icmp ne X, 1)) --> false
6906 // icmp ne X, (zext (icmp ne X, 1)) --> true
6907 // icmp eq X, (sext (icmp ne X, -1)) --> false
6908 // icmp ne X, (sext (icmp ne X, -1)) --> true
6909 return replaceInstUsesWith(
6910 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6911 } else if (!IsSExt || HasOneUse) {
6912 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
6913 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
6914 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
6915 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
6916 return CreateRangeCheck();
6917 }
6918 } else {
6919 // when C != 0 && C != 1:
6920 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
6921 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
6922 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
6923 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
6924 // when C != 0 && C != -1:
6925 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
6926 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
6927 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
6928 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
6929 return ICmpInst::Create(
6930 Instruction::ICmp, Pred1, X,
6931 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
6932 ? (IsSExt ? -1 : 1)
6933 : 0));
6934 }
6935 }
6936
6937 return nullptr;
6938}
6939
6940/// If we have an icmp le or icmp ge instruction with a constant operand, turn
6941/// it into the appropriate icmp lt or icmp gt instruction. This transform
6942/// allows them to be folded in visitICmpInst.
6944 ICmpInst::Predicate Pred = I.getPredicate();
6945 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
6947 return nullptr;
6948
6949 Value *Op0 = I.getOperand(0);
6950 Value *Op1 = I.getOperand(1);
6951 auto *Op1C = dyn_cast<Constant>(Op1);
6952 if (!Op1C)
6953 return nullptr;
6954
6955 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
6956 if (!FlippedStrictness)
6957 return nullptr;
6958
6959 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
6960}
6961
6962/// If we have a comparison with a non-canonical predicate, if we can update
6963/// all the users, invert the predicate and adjust all the users.
6965 // Is the predicate already canonical?
6966 CmpInst::Predicate Pred = I.getPredicate();
6968 return nullptr;
6969
6970 // Can all users be adjusted to predicate inversion?
6971 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
6972 return nullptr;
6973
6974 // Ok, we can canonicalize comparison!
6975 // Let's first invert the comparison's predicate.
6976 I.setPredicate(CmpInst::getInversePredicate(Pred));
6977 I.setName(I.getName() + ".not");
6978
6979 // And, adapt users.
6981
6982 return &I;
6983}
6984
6985/// Integer compare with boolean values can always be turned into bitwise ops.
6987 InstCombiner::BuilderTy &Builder) {
6988 Value *A = I.getOperand(0), *B = I.getOperand(1);
6989 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
6990
6991 // A boolean compared to true/false can be simplified to Op0/true/false in
6992 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
6993 // Cases not handled by InstSimplify are always 'not' of Op0.
6994 if (match(B, m_Zero())) {
6995 switch (I.getPredicate()) {
6996 case CmpInst::ICMP_EQ: // A == 0 -> !A
6997 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
6998 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7000 default:
7001 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7002 }
7003 } else if (match(B, m_One())) {
7004 switch (I.getPredicate()) {
7005 case CmpInst::ICMP_NE: // A != 1 -> !A
7006 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7007 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7009 default:
7010 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7011 }
7012 }
7013
7014 switch (I.getPredicate()) {
7015 default:
7016 llvm_unreachable("Invalid icmp instruction!");
7017 case ICmpInst::ICMP_EQ:
7018 // icmp eq i1 A, B -> ~(A ^ B)
7019 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7020
7021 case ICmpInst::ICMP_NE:
7022 // icmp ne i1 A, B -> A ^ B
7023 return BinaryOperator::CreateXor(A, B);
7024
7025 case ICmpInst::ICMP_UGT:
7026 // icmp ugt -> icmp ult
7027 std::swap(A, B);
7028 [[fallthrough]];
7029 case ICmpInst::ICMP_ULT:
7030 // icmp ult i1 A, B -> ~A & B
7031 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7032
7033 case ICmpInst::ICMP_SGT:
7034 // icmp sgt -> icmp slt
7035 std::swap(A, B);
7036 [[fallthrough]];
7037 case ICmpInst::ICMP_SLT:
7038 // icmp slt i1 A, B -> A & ~B
7039 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7040
7041 case ICmpInst::ICMP_UGE:
7042 // icmp uge -> icmp ule
7043 std::swap(A, B);
7044 [[fallthrough]];
7045 case ICmpInst::ICMP_ULE:
7046 // icmp ule i1 A, B -> ~A | B
7047 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7048
7049 case ICmpInst::ICMP_SGE:
7050 // icmp sge -> icmp sle
7051 std::swap(A, B);
7052 [[fallthrough]];
7053 case ICmpInst::ICMP_SLE:
7054 // icmp sle i1 A, B -> A | ~B
7055 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7056 }
7057}
7058
7059// Transform pattern like:
7060// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7061// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7062// Into:
7063// (X l>> Y) != 0
7064// (X l>> Y) == 0
7066 InstCombiner::BuilderTy &Builder) {
7067 CmpPredicate Pred, NewPred;
7068 Value *X, *Y;
7069 if (match(&Cmp,
7070 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7071 switch (Pred) {
7072 case ICmpInst::ICMP_ULE:
7073 NewPred = ICmpInst::ICMP_NE;
7074 break;
7075 case ICmpInst::ICMP_UGT:
7076 NewPred = ICmpInst::ICMP_EQ;
7077 break;
7078 default:
7079 return nullptr;
7080 }
7081 } else if (match(&Cmp, m_c_ICmp(Pred,
7084 m_Add(m_Shl(m_One(), m_Value(Y)),
7085 m_AllOnes()))),
7086 m_Value(X)))) {
7087 // The variant with 'add' is not canonical, (the variant with 'not' is)
7088 // we only get it because it has extra uses, and can't be canonicalized,
7089
7090 switch (Pred) {
7091 case ICmpInst::ICMP_ULT:
7092 NewPred = ICmpInst::ICMP_NE;
7093 break;
7094 case ICmpInst::ICMP_UGE:
7095 NewPred = ICmpInst::ICMP_EQ;
7096 break;
7097 default:
7098 return nullptr;
7099 }
7100 } else
7101 return nullptr;
7102
7103 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7104 Constant *Zero = Constant::getNullValue(NewX->getType());
7105 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7106}
7107
7109 InstCombiner::BuilderTy &Builder) {
7110 const CmpInst::Predicate Pred = Cmp.getPredicate();
7111 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7112 Value *V1, *V2;
7113
7114 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7115 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7116 if (auto *I = dyn_cast<Instruction>(V))
7117 I->copyIRFlags(&Cmp);
7118 Module *M = Cmp.getModule();
7120 M, Intrinsic::vector_reverse, V->getType());
7121 return CallInst::Create(F, V);
7122 };
7123
7124 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7125 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7126 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7127 (LHS->hasOneUse() || RHS->hasOneUse()))
7128 return createCmpReverse(Pred, V1, V2);
7129
7130 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7131 if (LHS->hasOneUse() && isSplatValue(RHS))
7132 return createCmpReverse(Pred, V1, RHS);
7133 }
7134 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7135 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7136 return createCmpReverse(Pred, LHS, V2);
7137
7138 ArrayRef<int> M;
7139 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7140 return nullptr;
7141
7142 // If both arguments of the cmp are shuffles that use the same mask and
7143 // shuffle within a single vector, move the shuffle after the cmp:
7144 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7145 Type *V1Ty = V1->getType();
7146 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7147 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7148 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7149 return new ShuffleVectorInst(NewCmp, M);
7150 }
7151
7152 // Try to canonicalize compare with splatted operand and splat constant.
7153 // TODO: We could generalize this for more than splats. See/use the code in
7154 // InstCombiner::foldVectorBinop().
7155 Constant *C;
7156 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7157 return nullptr;
7158
7159 // Length-changing splats are ok, so adjust the constants as needed:
7160 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7161 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7162 int MaskSplatIndex;
7163 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7164 // We allow poison in matching, but this transform removes it for safety.
7165 // Demanded elements analysis should be able to recover some/all of that.
7166 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7167 ScalarC);
7168 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7169 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7170 return new ShuffleVectorInst(NewCmp, NewM);
7171 }
7172
7173 return nullptr;
7174}
7175
7176// extract(uadd.with.overflow(A, B), 0) ult A
7177// -> extract(uadd.with.overflow(A, B), 1)
7179 CmpInst::Predicate Pred = I.getPredicate();
7180 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7181
7182 Value *UAddOv;
7183 Value *A, *B;
7184 auto UAddOvResultPat = m_ExtractValue<0>(
7185 m_Intrinsic<Intrinsic::uadd_with_overflow>(m_Value(A), m_Value(B)));
7186 if (match(Op0, UAddOvResultPat) &&
7187 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7188 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7189 (match(A, m_One()) || match(B, m_One()))) ||
7190 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7191 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7192 // extract(uadd.with.overflow(A, B), 0) < A
7193 // extract(uadd.with.overflow(A, 1), 0) == 0
7194 // extract(uadd.with.overflow(A, -1), 0) != -1
7195 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7196 else if (match(Op1, UAddOvResultPat) &&
7197 Pred == ICmpInst::ICMP_UGT && (Op0 == A || Op0 == B))
7198 // A > extract(uadd.with.overflow(A, B), 0)
7199 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7200 else
7201 return nullptr;
7202
7203 return ExtractValueInst::Create(UAddOv, 1);
7204}
7205
7207 if (!I.getOperand(0)->getType()->isPointerTy() ||
7209 I.getParent()->getParent(),
7210 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7211 return nullptr;
7212 }
7213 Instruction *Op;
7214 if (match(I.getOperand(0), m_Instruction(Op)) &&
7215 match(I.getOperand(1), m_Zero()) &&
7216 Op->isLaunderOrStripInvariantGroup()) {
7217 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7218 Op->getOperand(0), I.getOperand(1));
7219 }
7220 return nullptr;
7221}
7222
7223/// This function folds patterns produced by lowering of reduce idioms, such as
7224/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7225/// attempts to generate fewer number of scalar comparisons instead of vector
7226/// comparisons when possible.
7228 InstCombiner::BuilderTy &Builder,
7229 const DataLayout &DL) {
7230 if (I.getType()->isVectorTy())
7231 return nullptr;
7232 CmpPredicate OuterPred, InnerPred;
7233 Value *LHS, *RHS;
7234
7235 // Match lowering of @llvm.vector.reduce.and. Turn
7236 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7237 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7238 /// %res = icmp <pred> i8 %scalar_ne, 0
7239 ///
7240 /// into
7241 ///
7242 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7243 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7244 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7245 ///
7246 /// for <pred> in {ne, eq}.
7247 if (!match(&I, m_ICmp(OuterPred,
7249 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7250 m_Zero())))
7251 return nullptr;
7252 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7253 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7254 return nullptr;
7255 unsigned NumBits =
7256 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7257 // TODO: Relax this to "not wider than max legal integer type"?
7258 if (!DL.isLegalInteger(NumBits))
7259 return nullptr;
7260
7261 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7262 auto *ScalarTy = Builder.getIntNTy(NumBits);
7263 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7264 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7265 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7266 I.getName());
7267 }
7268
7269 return nullptr;
7270}
7271
7272// This helper will be called with icmp operands in both orders.
7274 Value *Op0, Value *Op1,
7275 ICmpInst &CxtI) {
7276 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7277 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7278 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7279 return NI;
7280
7281 if (auto *SI = dyn_cast<SelectInst>(Op0))
7282 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7283 return NI;
7284
7285 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7286 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7287 return Res;
7288
7289 {
7290 Value *X;
7291 const APInt *C;
7292 // icmp X+Cst, X
7293 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7294 return foldICmpAddOpConst(X, *C, Pred);
7295 }
7296
7297 // abs(X) >= X --> true
7298 // abs(X) u<= X --> true
7299 // abs(X) < X --> false
7300 // abs(X) u> X --> false
7301 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7302 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7303 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7304 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7305 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7306 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7307 {
7308 Value *X;
7309 Constant *C;
7310 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X), m_Constant(C))) &&
7311 match(Op1, m_Specific(X))) {
7312 Value *NullValue = Constant::getNullValue(X->getType());
7313 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7314 const APInt SMin =
7315 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7316 bool IsIntMinPosion = C->isAllOnesValue();
7317 switch (Pred) {
7318 case CmpInst::ICMP_ULE:
7319 case CmpInst::ICMP_SGE:
7320 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7321 case CmpInst::ICMP_UGT:
7322 case CmpInst::ICMP_SLT:
7324 case CmpInst::ICMP_UGE:
7325 case CmpInst::ICMP_SLE:
7326 case CmpInst::ICMP_EQ: {
7327 return replaceInstUsesWith(
7328 CxtI, IsIntMinPosion
7329 ? Builder.CreateICmpSGT(X, AllOnesValue)
7331 X, ConstantInt::get(X->getType(), SMin + 1)));
7332 }
7333 case CmpInst::ICMP_ULT:
7334 case CmpInst::ICMP_SGT:
7335 case CmpInst::ICMP_NE: {
7336 return replaceInstUsesWith(
7337 CxtI, IsIntMinPosion
7338 ? Builder.CreateICmpSLT(X, NullValue)
7340 X, ConstantInt::get(X->getType(), SMin)));
7341 }
7342 default:
7343 llvm_unreachable("Invalid predicate!");
7344 }
7345 }
7346 }
7347
7348 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7349 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7350 return replaceInstUsesWith(CxtI, V);
7351
7352 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7353 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7354 {
7355 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7356 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7358 }
7359
7360 if (!ICmpInst::isUnsigned(Pred) &&
7361 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7362 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7364 }
7365 }
7366
7367 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7368 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7369 {
7370 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7371 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7373 }
7374
7375 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7376 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7377 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7379 }
7380 }
7381
7382 return nullptr;
7383}
7384
7386 bool Changed = false;
7388 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7389 unsigned Op0Cplxity = getComplexity(Op0);
7390 unsigned Op1Cplxity = getComplexity(Op1);
7391
7392 /// Orders the operands of the compare so that they are listed from most
7393 /// complex to least complex. This puts constants before unary operators,
7394 /// before binary operators.
7395 if (Op0Cplxity < Op1Cplxity) {
7396 I.swapOperands();
7397 std::swap(Op0, Op1);
7398 Changed = true;
7399 }
7400
7401 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7402 return replaceInstUsesWith(I, V);
7403
7404 // Comparing -val or val with non-zero is the same as just comparing val
7405 // ie, abs(val) != 0 -> val != 0
7406 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7407 Value *Cond, *SelectTrue, *SelectFalse;
7408 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7409 m_Value(SelectFalse)))) {
7410 if (Value *V = dyn_castNegVal(SelectTrue)) {
7411 if (V == SelectFalse)
7412 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7413 }
7414 else if (Value *V = dyn_castNegVal(SelectFalse)) {
7415 if (V == SelectTrue)
7416 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7417 }
7418 }
7419 }
7420
7421 if (Op0->getType()->isIntOrIntVectorTy(1))
7423 return Res;
7424
7426 return Res;
7427
7429 return Res;
7430
7432 return Res;
7433
7435 return Res;
7436
7438 return Res;
7439
7441 return Res;
7442
7444 return Res;
7445
7446 // Test if the ICmpInst instruction is used exclusively by a select as
7447 // part of a minimum or maximum operation. If so, refrain from doing
7448 // any other folding. This helps out other analyses which understand
7449 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7450 // and CodeGen. And in this case, at least one of the comparison
7451 // operands has at least one user besides the compare (the select),
7452 // which would often largely negate the benefit of folding anyway.
7453 //
7454 // Do the same for the other patterns recognized by matchSelectPattern.
7455 if (I.hasOneUse())
7456 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7457 Value *A, *B;
7459 if (SPR.Flavor != SPF_UNKNOWN)
7460 return nullptr;
7461 }
7462
7463 // Do this after checking for min/max to prevent infinite looping.
7464 if (Instruction *Res = foldICmpWithZero(I))
7465 return Res;
7466
7467 // FIXME: We only do this after checking for min/max to prevent infinite
7468 // looping caused by a reverse canonicalization of these patterns for min/max.
7469 // FIXME: The organization of folds is a mess. These would naturally go into
7470 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7471 // down here after the min/max restriction.
7472 ICmpInst::Predicate Pred = I.getPredicate();
7473 const APInt *C;
7474 if (match(Op1, m_APInt(C))) {
7475 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7476 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7477 Constant *Zero = Constant::getNullValue(Op0->getType());
7478 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7479 }
7480
7481 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7482 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7484 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7485 }
7486 }
7487
7488 // The folds in here may rely on wrapping flags and special constants, so
7489 // they can break up min/max idioms in some cases but not seemingly similar
7490 // patterns.
7491 // FIXME: It may be possible to enhance select folding to make this
7492 // unnecessary. It may also be moot if we canonicalize to min/max
7493 // intrinsics.
7494 if (Instruction *Res = foldICmpBinOp(I, Q))
7495 return Res;
7496
7498 return Res;
7499
7500 // Try to match comparison as a sign bit test. Intentionally do this after
7501 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7502 if (Instruction *New = foldSignBitTest(I))
7503 return New;
7504
7506 return Res;
7507
7508 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7509 return Res;
7510 if (Instruction *Res =
7511 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7512 return Res;
7513
7514 if (I.isCommutative()) {
7515 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7516 replaceOperand(I, 0, Pair->first);
7517 replaceOperand(I, 1, Pair->second);
7518 return &I;
7519 }
7520 }
7521
7522 // In case of a comparison with two select instructions having the same
7523 // condition, check whether one of the resulting branches can be simplified.
7524 // If so, just compare the other branch and select the appropriate result.
7525 // For example:
7526 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7527 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7528 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7529 // The icmp will result false for the false value of selects and the result
7530 // will depend upon the comparison of true values of selects if %cmp is
7531 // true. Thus, transform this into:
7532 // %cmp = icmp slt i32 %y, %z
7533 // %sel = select i1 %cond, i1 %cmp, i1 false
7534 // This handles similar cases to transform.
7535 {
7536 Value *Cond, *A, *B, *C, *D;
7537 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7539 (Op0->hasOneUse() || Op1->hasOneUse())) {
7540 // Check whether comparison of TrueValues can be simplified
7541 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7542 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7543 return SelectInst::Create(Cond, Res, NewICMP);
7544 }
7545 // Check whether comparison of FalseValues can be simplified
7546 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7547 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7548 return SelectInst::Create(Cond, NewICMP, Res);
7549 }
7550 }
7551 }
7552
7553 // Try to optimize equality comparisons against alloca-based pointers.
7554 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7555 assert(Op1->getType()->isPointerTy() && "Comparing pointer with non-pointer?");
7556 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7557 if (foldAllocaCmp(Alloca))
7558 return nullptr;
7559 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7560 if (foldAllocaCmp(Alloca))
7561 return nullptr;
7562 }
7563
7564 if (Instruction *Res = foldICmpBitCast(I))
7565 return Res;
7566
7567 // TODO: Hoist this above the min/max bailout.
7569 return R;
7570
7571 {
7572 Value *X, *Y;
7573 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7574 // and (X & ~Y) != 0 --> (X & Y) == 0
7575 // if A is a power of 2.
7576 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7577 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, 0, &I) &&
7578 I.isEquality())
7579 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7580 Op1);
7581
7582 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7583 if (Op0->getType()->isIntOrIntVectorTy()) {
7584 bool ConsumesOp0, ConsumesOp1;
7585 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7586 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7587 (ConsumesOp0 || ConsumesOp1)) {
7588 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7589 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7590 assert(InvOp0 && InvOp1 &&
7591 "Mismatch between isFreeToInvert and getFreelyInverted");
7592 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7593 }
7594 }
7595
7596 Instruction *AddI = nullptr;
7598 m_Instruction(AddI))) &&
7599 isa<IntegerType>(X->getType())) {
7600 Value *Result;
7601 Constant *Overflow;
7602 // m_UAddWithOverflow can match patterns that do not include an explicit
7603 // "add" instruction, so check the opcode of the matched op.
7604 if (AddI->getOpcode() == Instruction::Add &&
7605 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7606 Result, Overflow)) {
7607 replaceInstUsesWith(*AddI, Result);
7608 eraseInstFromFunction(*AddI);
7609 return replaceInstUsesWith(I, Overflow);
7610 }
7611 }
7612
7613 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7614 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7615 match(Op1, m_APInt(C))) {
7616 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7617 return R;
7618 }
7619
7620 // Signbit test folds
7621 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7622 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7623 Instruction *ExtI;
7624 if ((I.isUnsigned() || I.isEquality()) &&
7625 match(Op1,
7627 Y->getType()->getScalarSizeInBits() == 1 &&
7628 (Op0->hasOneUse() || Op1->hasOneUse())) {
7629 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7630 Instruction *ShiftI;
7631 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7633 OpWidth - 1))))) {
7634 unsigned ExtOpc = ExtI->getOpcode();
7635 unsigned ShiftOpc = ShiftI->getOpcode();
7636 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7637 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7638 Value *SLTZero =
7640 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7641 return replaceInstUsesWith(I, Cmp);
7642 }
7643 }
7644 }
7645 }
7646
7647 if (Instruction *Res = foldICmpEquality(I))
7648 return Res;
7649
7651 return Res;
7652
7653 if (Instruction *Res = foldICmpOfUAddOv(I))
7654 return Res;
7655
7656 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7657 // an i1 which indicates whether or not we successfully did the swap.
7658 //
7659 // Replace comparisons between the old value and the expected value with the
7660 // indicator that 'cmpxchg' returns.
7661 //
7662 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7663 // spuriously fail. In those cases, the old value may equal the expected
7664 // value but it is possible for the swap to not occur.
7665 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7666 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7667 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7668 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7669 !ACXI->isWeak())
7670 return ExtractValueInst::Create(ACXI, 1);
7671
7673 return Res;
7674
7675 if (I.getType()->isVectorTy())
7676 if (Instruction *Res = foldVectorCmp(I, Builder))
7677 return Res;
7678
7680 return Res;
7681
7683 return Res;
7684
7685 {
7686 Value *A;
7687 const APInt *C1, *C2;
7688 ICmpInst::Predicate Pred = I.getPredicate();
7689 if (ICmpInst::isEquality(Pred)) {
7690 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
7691 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
7692 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
7693 match(Op1, m_APInt(C2))) {
7694 Type *InputTy = A->getType();
7695 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
7696 // c2 must be non-negative at the bitwidth of a.
7697 if (C2->getActiveBits() < InputBitWidth) {
7698 APInt TruncC1 = C1->trunc(InputBitWidth);
7699 // Check if there are 1s in C1 high bits of size InputBitWidth.
7700 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
7701 TruncC1.setBit(InputBitWidth - 1);
7702 Value *AndInst = Builder.CreateAnd(A, TruncC1);
7703 return new ICmpInst(
7704 Pred, AndInst,
7705 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
7706 }
7707 }
7708 }
7709 }
7710
7711 return Changed ? &I : nullptr;
7712}
7713
7714/// Fold fcmp ([us]itofp x, cst) if possible.
7716 Instruction *LHSI,
7717 Constant *RHSC) {
7718 const APFloat *RHS;
7719 if (!match(RHSC, m_APFloat(RHS)))
7720 return nullptr;
7721
7722 // Get the width of the mantissa. We don't want to hack on conversions that
7723 // might lose information from the integer, e.g. "i64 -> float"
7724 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7725 if (MantissaWidth == -1) return nullptr; // Unknown.
7726
7727 Type *IntTy = LHSI->getOperand(0)->getType();
7728 unsigned IntWidth = IntTy->getScalarSizeInBits();
7729 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7730
7731 if (I.isEquality()) {
7732 FCmpInst::Predicate P = I.getPredicate();
7733 bool IsExact = false;
7734 APSInt RHSCvt(IntWidth, LHSUnsigned);
7735 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7736
7737 // If the floating point constant isn't an integer value, we know if we will
7738 // ever compare equal / not equal to it.
7739 if (!IsExact) {
7740 // TODO: Can never be -0.0 and other non-representable values
7741 APFloat RHSRoundInt(*RHS);
7743 if (*RHS != RHSRoundInt) {
7745 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7746
7748 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7749 }
7750 }
7751
7752 // TODO: If the constant is exactly representable, is it always OK to do
7753 // equality compares as integer?
7754 }
7755
7756 // Check to see that the input is converted from an integer type that is small
7757 // enough that preserves all bits. TODO: check here for "known" sign bits.
7758 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7759
7760 // Following test does NOT adjust IntWidth downwards for signed inputs,
7761 // because the most negative value still requires all the mantissa bits
7762 // to distinguish it from one less than that value.
7763 if ((int)IntWidth > MantissaWidth) {
7764 // Conversion would lose accuracy. Check if loss can impact comparison.
7765 int Exp = ilogb(*RHS);
7766 if (Exp == APFloat::IEK_Inf) {
7767 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7768 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7769 // Conversion could create infinity.
7770 return nullptr;
7771 } else {
7772 // Note that if RHS is zero or NaN, then Exp is negative
7773 // and first condition is trivially false.
7774 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7775 // Conversion could affect comparison.
7776 return nullptr;
7777 }
7778 }
7779
7780 // Otherwise, we can potentially simplify the comparison. We know that it
7781 // will always come through as an integer value and we know the constant is
7782 // not a NAN (it would have been previously simplified).
7783 assert(!RHS->isNaN() && "NaN comparison not already folded!");
7784
7786 switch (I.getPredicate()) {
7787 default: llvm_unreachable("Unexpected predicate!");
7788 case FCmpInst::FCMP_UEQ:
7789 case FCmpInst::FCMP_OEQ:
7790 Pred = ICmpInst::ICMP_EQ;
7791 break;
7792 case FCmpInst::FCMP_UGT:
7793 case FCmpInst::FCMP_OGT:
7794 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
7795 break;
7796 case FCmpInst::FCMP_UGE:
7797 case FCmpInst::FCMP_OGE:
7798 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
7799 break;
7800 case FCmpInst::FCMP_ULT:
7801 case FCmpInst::FCMP_OLT:
7802 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
7803 break;
7804 case FCmpInst::FCMP_ULE:
7805 case FCmpInst::FCMP_OLE:
7806 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
7807 break;
7808 case FCmpInst::FCMP_UNE:
7809 case FCmpInst::FCMP_ONE:
7810 Pred = ICmpInst::ICMP_NE;
7811 break;
7812 case FCmpInst::FCMP_ORD:
7813 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7814 case FCmpInst::FCMP_UNO:
7815 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7816 }
7817
7818 // Now we know that the APFloat is a normal number, zero or inf.
7819
7820 // See if the FP constant is too large for the integer. For example,
7821 // comparing an i8 to 300.0.
7822 if (!LHSUnsigned) {
7823 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
7824 // and large values.
7825 APFloat SMax(RHS->getSemantics());
7826 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
7828 if (SMax < *RHS) { // smax < 13123.0
7829 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
7830 Pred == ICmpInst::ICMP_SLE)
7831 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7832 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7833 }
7834 } else {
7835 // If the RHS value is > UnsignedMax, fold the comparison. This handles
7836 // +INF and large values.
7837 APFloat UMax(RHS->getSemantics());
7838 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
7840 if (UMax < *RHS) { // umax < 13123.0
7841 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
7842 Pred == ICmpInst::ICMP_ULE)
7843 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7844 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7845 }
7846 }
7847
7848 if (!LHSUnsigned) {
7849 // See if the RHS value is < SignedMin.
7850 APFloat SMin(RHS->getSemantics());
7851 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
7853 if (SMin > *RHS) { // smin > 12312.0
7854 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
7855 Pred == ICmpInst::ICMP_SGE)
7856 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7857 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7858 }
7859 } else {
7860 // See if the RHS value is < UnsignedMin.
7861 APFloat UMin(RHS->getSemantics());
7862 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
7864 if (UMin > *RHS) { // umin > 12312.0
7865 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
7866 Pred == ICmpInst::ICMP_UGE)
7867 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7868 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7869 }
7870 }
7871
7872 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
7873 // [0, UMAX], but it may still be fractional. Check whether this is the case
7874 // using the IsExact flag.
7875 // Don't do this for zero, because -0.0 is not fractional.
7876 APSInt RHSInt(IntWidth, LHSUnsigned);
7877 bool IsExact;
7878 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
7879 if (!RHS->isZero()) {
7880 if (!IsExact) {
7881 // If we had a comparison against a fractional value, we have to adjust
7882 // the compare predicate and sometimes the value. RHSC is rounded towards
7883 // zero at this point.
7884 switch (Pred) {
7885 default: llvm_unreachable("Unexpected integer comparison!");
7886 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
7887 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7888 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
7889 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7890 case ICmpInst::ICMP_ULE:
7891 // (float)int <= 4.4 --> int <= 4
7892 // (float)int <= -4.4 --> false
7893 if (RHS->isNegative())
7894 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7895 break;
7896 case ICmpInst::ICMP_SLE:
7897 // (float)int <= 4.4 --> int <= 4
7898 // (float)int <= -4.4 --> int < -4
7899 if (RHS->isNegative())
7900 Pred = ICmpInst::ICMP_SLT;
7901 break;
7902 case ICmpInst::ICMP_ULT:
7903 // (float)int < -4.4 --> false
7904 // (float)int < 4.4 --> int <= 4
7905 if (RHS->isNegative())
7906 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7907 Pred = ICmpInst::ICMP_ULE;
7908 break;
7909 case ICmpInst::ICMP_SLT:
7910 // (float)int < -4.4 --> int < -4
7911 // (float)int < 4.4 --> int <= 4
7912 if (!RHS->isNegative())
7913 Pred = ICmpInst::ICMP_SLE;
7914 break;
7915 case ICmpInst::ICMP_UGT:
7916 // (float)int > 4.4 --> int > 4
7917 // (float)int > -4.4 --> true
7918 if (RHS->isNegative())
7919 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7920 break;
7921 case ICmpInst::ICMP_SGT:
7922 // (float)int > 4.4 --> int > 4
7923 // (float)int > -4.4 --> int >= -4
7924 if (RHS->isNegative())
7925 Pred = ICmpInst::ICMP_SGE;
7926 break;
7927 case ICmpInst::ICMP_UGE:
7928 // (float)int >= -4.4 --> true
7929 // (float)int >= 4.4 --> int > 4
7930 if (RHS->isNegative())
7931 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7932 Pred = ICmpInst::ICMP_UGT;
7933 break;
7934 case ICmpInst::ICMP_SGE:
7935 // (float)int >= -4.4 --> int >= -4
7936 // (float)int >= 4.4 --> int > 4
7937 if (!RHS->isNegative())
7938 Pred = ICmpInst::ICMP_SGT;
7939 break;
7940 }
7941 }
7942 }
7943
7944 // Lower this FP comparison into an appropriate integer version of the
7945 // comparison.
7946 return new ICmpInst(Pred, LHSI->getOperand(0),
7947 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
7948}
7949
7950/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
7952 Constant *RHSC) {
7953 // When C is not 0.0 and infinities are not allowed:
7954 // (C / X) < 0.0 is a sign-bit test of X
7955 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
7956 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
7957 //
7958 // Proof:
7959 // Multiply (C / X) < 0.0 by X * X / C.
7960 // - X is non zero, if it is the flag 'ninf' is violated.
7961 // - C defines the sign of X * X * C. Thus it also defines whether to swap
7962 // the predicate. C is also non zero by definition.
7963 //
7964 // Thus X * X / C is non zero and the transformation is valid. [qed]
7965
7966 FCmpInst::Predicate Pred = I.getPredicate();
7967
7968 // Check that predicates are valid.
7969 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
7970 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
7971 return nullptr;
7972
7973 // Check that RHS operand is zero.
7974 if (!match(RHSC, m_AnyZeroFP()))
7975 return nullptr;
7976
7977 // Check fastmath flags ('ninf').
7978 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
7979 return nullptr;
7980
7981 // Check the properties of the dividend. It must not be zero to avoid a
7982 // division by zero (see Proof).
7983 const APFloat *C;
7984 if (!match(LHSI->getOperand(0), m_APFloat(C)))
7985 return nullptr;
7986
7987 if (C->isZero())
7988 return nullptr;
7989
7990 // Get swapped predicate if necessary.
7991 if (C->isNegative())
7992 Pred = I.getSwappedPredicate();
7993
7994 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
7995}
7996
7997/// Optimize fabs(X) compared with zero.
7999 Value *X;
8000 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8001 return nullptr;
8002
8003 const APFloat *C;
8004 if (!match(I.getOperand(1), m_APFloat(C)))
8005 return nullptr;
8006
8007 if (!C->isPosZero()) {
8008 if (!C->isSmallestNormalized())
8009 return nullptr;
8010
8011 const Function *F = I.getFunction();
8012 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8013 if (Mode.Input == DenormalMode::PreserveSign ||
8014 Mode.Input == DenormalMode::PositiveZero) {
8015
8016 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8017 Constant *Zero = ConstantFP::getZero(X->getType());
8018 return new FCmpInst(P, X, Zero, "", I);
8019 };
8020
8021 switch (I.getPredicate()) {
8022 case FCmpInst::FCMP_OLT:
8023 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8024 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8025 case FCmpInst::FCMP_UGE:
8026 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8027 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8028 case FCmpInst::FCMP_OGE:
8029 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8030 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8031 case FCmpInst::FCMP_ULT:
8032 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8033 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8034 default:
8035 break;
8036 }
8037 }
8038
8039 return nullptr;
8040 }
8041
8042 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8043 I->setPredicate(P);
8044 return IC.replaceOperand(*I, 0, X);
8045 };
8046
8047 switch (I.getPredicate()) {
8048 case FCmpInst::FCMP_UGE:
8049 case FCmpInst::FCMP_OLT:
8050 // fabs(X) >= 0.0 --> true
8051 // fabs(X) < 0.0 --> false
8052 llvm_unreachable("fcmp should have simplified");
8053
8054 case FCmpInst::FCMP_OGT:
8055 // fabs(X) > 0.0 --> X != 0.0
8056 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8057
8058 case FCmpInst::FCMP_UGT:
8059 // fabs(X) u> 0.0 --> X u!= 0.0
8060 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8061
8062 case FCmpInst::FCMP_OLE:
8063 // fabs(X) <= 0.0 --> X == 0.0
8064 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8065
8066 case FCmpInst::FCMP_ULE:
8067 // fabs(X) u<= 0.0 --> X u== 0.0
8068 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8069
8070 case FCmpInst::FCMP_OGE:
8071 // fabs(X) >= 0.0 --> !isnan(X)
8072 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8073 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8074
8075 case FCmpInst::FCMP_ULT:
8076 // fabs(X) u< 0.0 --> isnan(X)
8077 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8078 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8079
8080 case FCmpInst::FCMP_OEQ:
8081 case FCmpInst::FCMP_UEQ:
8082 case FCmpInst::FCMP_ONE:
8083 case FCmpInst::FCMP_UNE:
8084 case FCmpInst::FCMP_ORD:
8085 case FCmpInst::FCMP_UNO:
8086 // Look through the fabs() because it doesn't change anything but the sign.
8087 // fabs(X) == 0.0 --> X == 0.0,
8088 // fabs(X) != 0.0 --> X != 0.0
8089 // isnan(fabs(X)) --> isnan(X)
8090 // !isnan(fabs(X) --> !isnan(X)
8091 return replacePredAndOp0(&I, I.getPredicate(), X);
8092
8093 default:
8094 return nullptr;
8095 }
8096}
8097
8098/// Optimize sqrt(X) compared with zero.
8100 Value *X;
8101 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8102 return nullptr;
8103
8104 if (!match(I.getOperand(1), m_PosZeroFP()))
8105 return nullptr;
8106
8107 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8108 I.setPredicate(P);
8109 return IC.replaceOperand(I, 0, X);
8110 };
8111
8112 // Clear ninf flag if sqrt doesn't have it.
8113 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8114 I.setHasNoInfs(false);
8115
8116 switch (I.getPredicate()) {
8117 case FCmpInst::FCMP_OLT:
8118 case FCmpInst::FCMP_UGE:
8119 // sqrt(X) < 0.0 --> false
8120 // sqrt(X) u>= 0.0 --> true
8121 llvm_unreachable("fcmp should have simplified");
8122 case FCmpInst::FCMP_ULT:
8123 case FCmpInst::FCMP_ULE:
8124 case FCmpInst::FCMP_OGT:
8125 case FCmpInst::FCMP_OGE:
8126 case FCmpInst::FCMP_OEQ:
8127 case FCmpInst::FCMP_UNE:
8128 // sqrt(X) u< 0.0 --> X u< 0.0
8129 // sqrt(X) u<= 0.0 --> X u<= 0.0
8130 // sqrt(X) > 0.0 --> X > 0.0
8131 // sqrt(X) >= 0.0 --> X >= 0.0
8132 // sqrt(X) == 0.0 --> X == 0.0
8133 // sqrt(X) u!= 0.0 --> X u!= 0.0
8134 return IC.replaceOperand(I, 0, X);
8135
8136 case FCmpInst::FCMP_OLE:
8137 // sqrt(X) <= 0.0 --> X == 0.0
8138 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8139 case FCmpInst::FCMP_UGT:
8140 // sqrt(X) u> 0.0 --> X u!= 0.0
8141 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8142 case FCmpInst::FCMP_UEQ:
8143 // sqrt(X) u== 0.0 --> X u<= 0.0
8144 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8145 case FCmpInst::FCMP_ONE:
8146 // sqrt(X) != 0.0 --> X > 0.0
8147 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8148 case FCmpInst::FCMP_ORD:
8149 // !isnan(sqrt(X)) --> X >= 0.0
8150 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8151 case FCmpInst::FCMP_UNO:
8152 // isnan(sqrt(X)) --> X u< 0.0
8153 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8154 default:
8155 llvm_unreachable("Unexpected predicate!");
8156 }
8157}
8158
8160 CmpInst::Predicate Pred = I.getPredicate();
8161 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8162
8163 // Canonicalize fneg as Op1.
8164 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8165 std::swap(Op0, Op1);
8166 Pred = I.getSwappedPredicate();
8167 }
8168
8169 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8170 return nullptr;
8171
8172 // Replace the negated operand with 0.0:
8173 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8174 Constant *Zero = ConstantFP::getZero(Op0->getType());
8175 return new FCmpInst(Pred, Op0, Zero, "", &I);
8176}
8177
8179 Constant *RHSC, InstCombinerImpl &CI) {
8180 const CmpInst::Predicate Pred = I.getPredicate();
8181 Value *X = LHSI->getOperand(0);
8182 Value *Y = LHSI->getOperand(1);
8183 switch (Pred) {
8184 default:
8185 break;
8186 case FCmpInst::FCMP_UGT:
8187 case FCmpInst::FCMP_ULT:
8188 case FCmpInst::FCMP_UNE:
8189 case FCmpInst::FCMP_OEQ:
8190 case FCmpInst::FCMP_OGE:
8191 case FCmpInst::FCMP_OLE:
8192 // The optimization is not valid if X and Y are infinities of the same
8193 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8194 // flag then we can assume we do not have that case. Otherwise we might be
8195 // able to prove that either X or Y is not infinity.
8196 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8197 !isKnownNeverInfinity(Y, /*Depth=*/0,
8199 !isKnownNeverInfinity(X, /*Depth=*/0,
8201 break;
8202
8203 [[fallthrough]];
8204 case FCmpInst::FCMP_OGT:
8205 case FCmpInst::FCMP_OLT:
8206 case FCmpInst::FCMP_ONE:
8207 case FCmpInst::FCMP_UEQ:
8208 case FCmpInst::FCMP_UGE:
8209 case FCmpInst::FCMP_ULE:
8210 // fcmp pred (x - y), 0 --> fcmp pred x, y
8211 if (match(RHSC, m_AnyZeroFP()) &&
8212 I.getFunction()->getDenormalMode(
8213 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8215 CI.replaceOperand(I, 0, X);
8216 CI.replaceOperand(I, 1, Y);
8217 return &I;
8218 }
8219 break;
8220 }
8221
8222 return nullptr;
8223}
8224
8226 InstCombinerImpl &IC) {
8227 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8228 Type *OpType = LHS->getType();
8229 CmpInst::Predicate Pred = I.getPredicate();
8230
8231 bool FloorX = match(LHS, m_Intrinsic<Intrinsic::floor>(m_Specific(RHS)));
8232 bool CeilX = match(LHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(RHS)));
8233
8234 if (!FloorX && !CeilX) {
8235 if ((FloorX = match(RHS, m_Intrinsic<Intrinsic::floor>(m_Specific(LHS)))) ||
8236 (CeilX = match(RHS, m_Intrinsic<Intrinsic::ceil>(m_Specific(LHS))))) {
8237 std::swap(LHS, RHS);
8238 Pred = I.getSwappedPredicate();
8239 }
8240 }
8241
8242 switch (Pred) {
8243 case FCmpInst::FCMP_OLE:
8244 // fcmp ole floor(x), x => fcmp ord x, 0
8245 if (FloorX)
8247 "", &I);
8248 break;
8249 case FCmpInst::FCMP_OGT:
8250 // fcmp ogt floor(x), x => false
8251 if (FloorX)
8252 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8253 break;
8254 case FCmpInst::FCMP_OGE:
8255 // fcmp oge ceil(x), x => fcmp ord x, 0
8256 if (CeilX)
8258 "", &I);
8259 break;
8260 case FCmpInst::FCMP_OLT:
8261 // fcmp olt ceil(x), x => false
8262 if (CeilX)
8263 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8264 break;
8265 case FCmpInst::FCMP_ULE:
8266 // fcmp ule floor(x), x => true
8267 if (FloorX)
8268 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8269 break;
8270 case FCmpInst::FCMP_UGT:
8271 // fcmp ugt floor(x), x => fcmp uno x, 0
8272 if (FloorX)
8274 "", &I);
8275 break;
8276 case FCmpInst::FCMP_UGE:
8277 // fcmp uge ceil(x), x => true
8278 if (CeilX)
8279 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8280 break;
8281 case FCmpInst::FCMP_ULT:
8282 // fcmp ult ceil(x), x => fcmp uno x, 0
8283 if (CeilX)
8285 "", &I);
8286 break;
8287 default:
8288 break;
8289 }
8290
8291 return nullptr;
8292}
8293
8295 bool Changed = false;
8296
8297 /// Orders the operands of the compare so that they are listed from most
8298 /// complex to least complex. This puts constants before unary operators,
8299 /// before binary operators.
8300 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8301 I.swapOperands();
8302 Changed = true;
8303 }
8304
8305 const CmpInst::Predicate Pred = I.getPredicate();
8306 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8307 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8309 return replaceInstUsesWith(I, V);
8310
8311 // Simplify 'fcmp pred X, X'
8312 Type *OpType = Op0->getType();
8313 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8314 if (Op0 == Op1) {
8315 switch (Pred) {
8316 default: break;
8317 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
8318 case FCmpInst::FCMP_ULT: // True if unordered or less than
8319 case FCmpInst::FCMP_UGT: // True if unordered or greater than
8320 case FCmpInst::FCMP_UNE: // True if unordered or not equal
8321 // Canonicalize these to be 'fcmp uno %X, 0.0'.
8322 I.setPredicate(FCmpInst::FCMP_UNO);
8323 I.setOperand(1, Constant::getNullValue(OpType));
8324 return &I;
8325
8326 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
8327 case FCmpInst::FCMP_OEQ: // True if ordered and equal
8328 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
8329 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
8330 // Canonicalize these to be 'fcmp ord %X, 0.0'.
8331 I.setPredicate(FCmpInst::FCMP_ORD);
8332 I.setOperand(1, Constant::getNullValue(OpType));
8333 return &I;
8334 }
8335 }
8336
8337 if (I.isCommutative()) {
8338 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
8339 replaceOperand(I, 0, Pair->first);
8340 replaceOperand(I, 1, Pair->second);
8341 return &I;
8342 }
8343 }
8344
8345 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
8346 // then canonicalize the operand to 0.0.
8347 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
8348 if (!match(Op0, m_PosZeroFP()) &&
8349 isKnownNeverNaN(Op0, 0, getSimplifyQuery().getWithInstruction(&I)))
8350 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
8351
8352 if (!match(Op1, m_PosZeroFP()) &&
8353 isKnownNeverNaN(Op1, 0, getSimplifyQuery().getWithInstruction(&I)))
8354 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8355 }
8356
8357 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
8358 Value *X, *Y;
8359 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
8360 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
8361
8363 return R;
8364
8365 // Test if the FCmpInst instruction is used exclusively by a select as
8366 // part of a minimum or maximum operation. If so, refrain from doing
8367 // any other folding. This helps out other analyses which understand
8368 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
8369 // and CodeGen. And in this case, at least one of the comparison
8370 // operands has at least one user besides the compare (the select),
8371 // which would often largely negate the benefit of folding anyway.
8372 if (I.hasOneUse())
8373 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
8374 Value *A, *B;
8376 if (SPR.Flavor != SPF_UNKNOWN)
8377 return nullptr;
8378 }
8379
8380 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
8381 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
8382 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
8383 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
8384
8385 // Canonicalize:
8386 // fcmp olt X, +inf -> fcmp one X, +inf
8387 // fcmp ole X, +inf -> fcmp ord X, 0
8388 // fcmp ogt X, +inf -> false
8389 // fcmp oge X, +inf -> fcmp oeq X, +inf
8390 // fcmp ult X, +inf -> fcmp une X, +inf
8391 // fcmp ule X, +inf -> true
8392 // fcmp ugt X, +inf -> fcmp uno X, 0
8393 // fcmp uge X, +inf -> fcmp ueq X, +inf
8394 // fcmp olt X, -inf -> false
8395 // fcmp ole X, -inf -> fcmp oeq X, -inf
8396 // fcmp ogt X, -inf -> fcmp one X, -inf
8397 // fcmp oge X, -inf -> fcmp ord X, 0
8398 // fcmp ult X, -inf -> fcmp uno X, 0
8399 // fcmp ule X, -inf -> fcmp ueq X, -inf
8400 // fcmp ugt X, -inf -> fcmp une X, -inf
8401 // fcmp uge X, -inf -> true
8402 const APFloat *C;
8403 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8404 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8405 default:
8406 break;
8407 case FCmpInst::FCMP_ORD:
8408 case FCmpInst::FCMP_UNO:
8411 case FCmpInst::FCMP_OGT:
8412 case FCmpInst::FCMP_ULE:
8413 llvm_unreachable("Should be simplified by InstSimplify");
8414 case FCmpInst::FCMP_OLT:
8415 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8416 case FCmpInst::FCMP_OLE:
8417 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8418 "", &I);
8419 case FCmpInst::FCMP_OGE:
8420 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8421 case FCmpInst::FCMP_ULT:
8422 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8423 case FCmpInst::FCMP_UGT:
8424 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8425 "", &I);
8426 case FCmpInst::FCMP_UGE:
8427 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8428 }
8429 }
8430
8431 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8432 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8433 if (match(Op1, m_PosZeroFP()) &&
8436 if (Pred == FCmpInst::FCMP_OEQ)
8437 IntPred = ICmpInst::ICMP_EQ;
8438 else if (Pred == FCmpInst::FCMP_UNE)
8439 IntPred = ICmpInst::ICMP_NE;
8440
8441 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8442 Type *IntTy = X->getType();
8443 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8444 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8445 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8446 }
8447 }
8448
8449 // Handle fcmp with instruction LHS and constant RHS.
8450 Instruction *LHSI;
8451 Constant *RHSC;
8452 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8453 switch (LHSI->getOpcode()) {
8454 case Instruction::Select:
8455 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8456 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8458 return replaceOperand(I, 0, X);
8459 if (Instruction *NV = FoldOpIntoSelect(I, cast<SelectInst>(LHSI)))
8460 return NV;
8461 break;
8462 case Instruction::FSub:
8463 if (LHSI->hasOneUse())
8464 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
8465 return NV;
8466 break;
8467 case Instruction::PHI:
8468 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8469 return NV;
8470 break;
8471 case Instruction::SIToFP:
8472 case Instruction::UIToFP:
8473 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8474 return NV;
8475 break;
8476 case Instruction::FDiv:
8477 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8478 return NV;
8479 break;
8480 case Instruction::Load:
8481 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8482 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
8484 cast<LoadInst>(LHSI), GEP, GV, I))
8485 return Res;
8486 break;
8487 }
8488 }
8489
8490 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8491 return R;
8492
8493 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
8494 return R;
8495
8496 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
8497 return R;
8498
8499 if (match(Op0, m_FNeg(m_Value(X)))) {
8500 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8501 Constant *C;
8502 if (match(Op1, m_Constant(C)))
8503 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8504 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8505 }
8506
8507 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8508 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8509 return new FCmpInst(Pred, X, Op1, "", &I);
8510
8511 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8512 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8513 return new FCmpInst(Pred, Op0, Y, "", &I);
8514
8515 if (match(Op0, m_FPExt(m_Value(X)))) {
8516 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8517 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8518 return new FCmpInst(Pred, X, Y, "", &I);
8519
8520 const APFloat *C;
8521 if (match(Op1, m_APFloat(C))) {
8522 const fltSemantics &FPSem =
8523 X->getType()->getScalarType()->getFltSemantics();
8524 bool Lossy;
8525 APFloat TruncC = *C;
8526 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8527
8528 if (Lossy) {
8529 // X can't possibly equal the higher-precision constant, so reduce any
8530 // equality comparison.
8531 // TODO: Other predicates can be handled via getFCmpCode().
8532 switch (Pred) {
8533 case FCmpInst::FCMP_OEQ:
8534 // X is ordered and equal to an impossible constant --> false
8535 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8536 case FCmpInst::FCMP_ONE:
8537 // X is ordered and not equal to an impossible constant --> ordered
8538 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8539 ConstantFP::getZero(X->getType()));
8540 case FCmpInst::FCMP_UEQ:
8541 // X is unordered or equal to an impossible constant --> unordered
8542 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8543 ConstantFP::getZero(X->getType()));
8544 case FCmpInst::FCMP_UNE:
8545 // X is unordered or not equal to an impossible constant --> true
8546 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8547 default:
8548 break;
8549 }
8550 }
8551
8552 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8553 // Avoid lossy conversions and denormals.
8554 // Zero is a special case that's OK to convert.
8555 APFloat Fabs = TruncC;
8556 Fabs.clearSign();
8557 if (!Lossy &&
8558 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8559 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8560 return new FCmpInst(Pred, X, NewC, "", &I);
8561 }
8562 }
8563 }
8564
8565 // Convert a sign-bit test of an FP value into a cast and integer compare.
8566 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8567 // TODO: Handle non-zero compare constants.
8568 // TODO: Handle other predicates.
8569 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
8570 m_Value(X)))) &&
8571 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8572 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8573 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8574 IntType = VectorType::get(IntType, VecTy->getElementCount());
8575
8576 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8577 if (Pred == FCmpInst::FCMP_OLT) {
8578 Value *IntX = Builder.CreateBitCast(X, IntType);
8579 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8580 ConstantInt::getNullValue(IntType));
8581 }
8582 }
8583
8584 {
8585 Value *CanonLHS = nullptr, *CanonRHS = nullptr;
8586 match(Op0, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonLHS)));
8587 match(Op1, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonRHS)));
8588
8589 // (canonicalize(x) == x) => (x == x)
8590 if (CanonLHS == Op1)
8591 return new FCmpInst(Pred, Op1, Op1, "", &I);
8592
8593 // (x == canonicalize(x)) => (x == x)
8594 if (CanonRHS == Op0)
8595 return new FCmpInst(Pred, Op0, Op0, "", &I);
8596
8597 // (canonicalize(x) == canonicalize(y)) => (x == y)
8598 if (CanonLHS && CanonRHS)
8599 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8600 }
8601
8602 if (I.getType()->isVectorTy())
8603 if (Instruction *Res = foldVectorCmp(I, Builder))
8604 return Res;
8605
8606 return Changed ? &I : nullptr;
8607}
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...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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
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 Value * rewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags NW, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Instruction * foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI, Constant *RHSC, InstCombinerImpl &CI)
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static Value * foldICmpWithLowBitMaskedVal(CmpPredicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpShlLHSC(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl nuw C2, Y), C.
static Instruction * foldFCmpWithFloorAndCeil(FCmpInst &I, InstCombinerImpl &IC)
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(CmpPredicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * foldSqrtWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize sqrt(X) compared with zero.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(CmpPredicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags &NW, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:557
#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 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:166
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:39
Value * RHS
Value * LHS
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5463
void clearSign()
Definition: APFloat.h:1300
bool isZero() const
Definition: APFloat.h:1441
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.h:1160
APInt bitcastToAPInt() const
Definition: APFloat.h:1351
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1140
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:1100
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition: APFloat.cpp:5450
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.h:1250
Class for arbitrary precision integers.
Definition: APInt.h:78
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1547
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:234
static void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition: APInt.cpp:1732
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition: APInt.h:449
APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:986
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition: APInt.h:229
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition: APInt.h:423
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1520
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition: APInt.h:1492
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:910
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:206
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition: APInt.h:1330
APInt abs() const
Get the absolute value.
Definition: APInt.h:1773
unsigned ceilLogBase2() const
Definition: APInt.h:1742
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition: APInt.h:1201
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:371
APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1922
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition: APInt.h:1182
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:380
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition: APInt.h:466
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1468
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition: APInt.h:1111
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:209
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition: APInt.h:216
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:329
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1902
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:1249
bool eq(const APInt &RHS) const
Equality comparison.
Definition: APInt.h:1079
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1618
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1909
void negate()
Negate this APInt in place.
Definition: APInt.h:1450
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1618
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1577
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:219
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition: APInt.h:356
void flipAllBits()
Toggle every bit to its opposite value.
Definition: APInt.h:1434
unsigned countl_one() const
Count the number of leading one bits.
Definition: APInt.h:1594
unsigned logBase2() const
Definition: APInt.h:1739
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition: APInt.h:475
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition: APInt.h:827
bool isMask(unsigned numBits) const
Definition: APInt.h:488
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition: APInt.h:405
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition: APInt.h:1150
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition: APInt.h:873
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:440
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:306
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition: APInt.h:296
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:200
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1237
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1915
bool isOne() const
Determine if this is a value of 1.
Definition: APInt.h:389
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition: APInt.h:286
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:239
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition: APInt.h:851
unsigned countr_one() const
Count the number of trailing one bits.
Definition: APInt.h:1635
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1221
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
an instruction to allocate memory on the stack
Definition: Instructions.h:63
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:395
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:416
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
Definition: BasicBlock.cpp:459
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:239
BinaryOps getOpcode() const
Definition: InstrTypes.h:370
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:1286
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:661
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition: InstrTypes.h:980
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition: InstrTypes.h:856
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:673
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:676
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:690
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:702
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:703
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:679
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:688
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:677
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:678
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:697
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:696
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:700
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:687
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:681
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:684
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:698
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:685
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:680
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:682
@ ICMP_EQ
equal
Definition: InstrTypes.h:694
@ ICMP_NE
not equal
Definition: InstrTypes.h:695
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:701
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:689
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:699
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:686
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:675
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:683
bool isSigned() const
Definition: InstrTypes.h:928
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:825
bool isTrueWhenEqual() const
This is just a convenience.
Definition: InstrTypes.h:940
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:869
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition: InstrTypes.h:787
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:763
bool isStrictPredicate() const
Definition: InstrTypes.h:841
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition: InstrTypes.h:891
bool isIntPredicate() const
Definition: InstrTypes.h:781
bool isUnsigned() const
Definition: InstrTypes.h:934
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
Definition: CmpPredicate.h:22
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2307
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
Definition: Constants.cpp:2268
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2644
static Constant * getNot(Constant *C)
Definition: Constants.cpp:2631
static Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2293
static Constant * getXor(Constant *C1, Constant *C2)
Definition: Constants.cpp:2658
static Constant * getNeg(Constant *C, bool HasNSW=false)
Definition: Constants.cpp:2625
static Constant * getZero(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1057
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
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:258
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:866
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:208
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition: Constants.h:126
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:873
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:151
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:148
static ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:880
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...
bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
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 truncate(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
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:1472
This is an important base class in LLVM.
Definition: Constant.h:42
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:403
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:420
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:1771
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:373
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:63
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:851
unsigned getPointerTypeSizeInBits(Type *) const
Layout pointer size, in bits, based on the type.
Definition: DataLayout.cpp:743
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
Definition: DataLayout.cpp:878
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:457
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:866
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:156
iterator end()
Definition: DenseMap.h:84
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:147
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
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition: Operator.h:435
Type * getSourceElementType() const
Definition: Operator.cpp:70
Value * getPointerOperand()
Definition: Operator.h:462
GEPNoWrapFlags getNoWrapFlags() const
Definition: Operator.h:430
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition: Operator.h:509
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:933
Type * getValueType() const
Definition: GlobalValue.h:297
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 getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:113
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2286
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition: IRBuilder.h:2499
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
Definition: IRBuilder.h:558
Value * CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2294
Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Definition: IRBuilder.cpp:1163
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition: IRBuilder.h:2555
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition: IRBuilder.h:485
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition: IRBuilder.h:1480
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr, FMFSource FMFSource={})
Definition: IRBuilder.h:2186
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2274
Value * CreateGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Definition: IRBuilder.h:1874
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition: IRBuilder.h:1733
Value * createIsFPClass(Value *FPNum, unsigned Test)
Definition: IRBuilder.cpp:1248
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Definition: IRBuilder.cpp:900
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition: IRBuilder.h:505
Value * CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2404
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition: IRBuilder.h:2435
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1757
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2270
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1387
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2152
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2278
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Definition: IRBuilder.cpp:881
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1459
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition: IRBuilder.h:2033
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1518
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1370
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition: IRBuilder.h:490
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2449
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition: IRBuilder.h:2019
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1540
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:1671
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2302
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:2225
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition: IRBuilder.h:2583
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition: IRBuilder.h:199
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1562
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2380
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Definition: IRBuilder.h:535
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition: IRBuilder.h:521
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1447
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1404
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2705
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * 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 * 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 * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, unsigned Depth, const SimplifyQuery &Q) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
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.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
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 * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * 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)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
Definition: InstCombiner.h:48
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:502
SimplifyQuery SQ
Definition: InstCombiner.h:77
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
Definition: InstCombiner.h:228
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
Definition: InstCombiner.h:465
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
Definition: InstCombiner.h:143
TargetLibraryInfo & TLI
Definition: InstCombiner.h:74
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Definition: InstCombiner.h:443
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Definition: InstCombiner.h:388
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
Definition: InstCombiner.h:56
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:488
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
Definition: InstCombiner.h:183
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:495
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Definition: InstCombiner.h:160
const DataLayout & DL
Definition: InstCombiner.h:76
DomConditionCache DC
Definition: InstCombiner.h:82
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:244
AssumptionCache & AC
Definition: InstCombiner.h:73
void addToWorklist(Instruction *I)
Definition: InstCombiner.h:332
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
Definition: InstCombiner.h:412
DominatorTree & DT
Definition: InstCombiner.h:75
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:473
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
Definition: InstCombiner.h:433
BuilderTy & Builder
Definition: InstCombiner.h:61
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:480
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
Definition: InstCombiner.h:209
const SimplifyQuery & getSimplifyQuery() const
Definition: InstCombiner.h:338
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
Definition: InstCombiner.h:460
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:323
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:282
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:311
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:176
bool isVolatile() const
Return true if this is a load from a volatile memory location.
Definition: Instructions.h:205
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:81
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:937
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
Class to represent struct types.
Definition: DerivedTypes.h:218
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:270
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:243
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
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:165
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:128
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:237
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:355
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:233
Value * getOperand(unsigned i) const
Definition: User.h:228
unsigned getNumOperands() const
Definition: User.h:250
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:694
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1075
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.
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:202
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:2736
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:2754
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
Definition: Intrinsics.cpp:731
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
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
Definition: PatternMatch.h:664
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:982
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:826
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:885
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:990
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
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)
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
Definition: PatternMatch.h:903
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.
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:864
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
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.
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)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
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:854
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:1739
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:657
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.
Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
ConstantRange computeConstantRange(const Value *V, bool ForSigned, bool UseInstrInfo=true, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
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.
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:342
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
Definition: bit.h: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:44
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_UNKNOWN
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:1187
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1753
Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
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.
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.
@ Other
Any other memory.
bool isKnownNonEqual(const Value *V1, const Value *V2, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if the given values are known to be non-equal when defined.
@ 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()).
std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
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:217
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:1945
std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2087
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.
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:302
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:306
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:100
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:79
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:234
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:266
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition: KnownBits.h:143
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:281
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:43
bool isConstant() const
Returns true if we know the value of all bits.
Definition: KnownBits.h:53
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:240
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:137
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition: KnownBits.h:121
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition: KnownBits.h:106
bool isNegative() const
Returns true if this value is known to be negative.
Definition: KnownBits.h:97
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition: KnownBits.h:278
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition: KnownBits.h:127
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition: KnownBits.h:59
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:71
const Instruction * CxtI
Definition: SimplifyQuery.h:75
const DominatorTree * DT
Definition: SimplifyQuery.h:73
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
Definition: SimplifyQuery.h:74
SimplifyQuery getWithoutDomCondCache() const
A MapVector that performs no allocations if smaller than a certain size.
Definition: MapVector.h:254