LLVM 19.0.0git
InstCombineCompares.cpp
Go to the documentation of this file.
1//===- InstCombineCompares.cpp --------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the visitICmp and visitFCmp functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APSInt.h"
15#include "llvm/ADT/ScopeExit.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/Statistic.h"
25#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/InstrTypes.h"
31#include <bitset>
32
33using namespace llvm;
34using namespace PatternMatch;
35
36#define DEBUG_TYPE "instcombine"
37
38// How many times is a select replaced by one of its operands?
39STATISTIC(NumSel, "Number of select opts");
40
41
42/// Compute Result = In1+In2, returning true if the result overflowed for this
43/// type.
44static bool addWithOverflow(APInt &Result, const APInt &In1,
45 const APInt &In2, bool IsSigned = false) {
46 bool Overflow;
47 if (IsSigned)
48 Result = In1.sadd_ov(In2, Overflow);
49 else
50 Result = In1.uadd_ov(In2, Overflow);
51
52 return Overflow;
53}
54
55/// Compute Result = In1-In2, returning true if the result overflowed for this
56/// type.
57static bool subWithOverflow(APInt &Result, const APInt &In1,
58 const APInt &In2, bool IsSigned = false) {
59 bool Overflow;
60 if (IsSigned)
61 Result = In1.ssub_ov(In2, Overflow);
62 else
63 Result = In1.usub_ov(In2, Overflow);
64
65 return Overflow;
66}
67
68/// Given an icmp instruction, return true if any use of this comparison is a
69/// branch on sign bit comparison.
70static bool hasBranchUse(ICmpInst &I) {
71 for (auto *U : I.users())
72 if (isa<BranchInst>(U))
73 return true;
74 return false;
75}
76
77/// Returns true if the exploded icmp can be expressed as a signed comparison
78/// to zero and updates the predicate accordingly.
79/// The signedness of the comparison is preserved.
80/// TODO: Refactor with decomposeBitTestICmp()?
81static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
82 if (!ICmpInst::isSigned(Pred))
83 return false;
84
85 if (C.isZero())
86 return ICmpInst::isRelational(Pred);
87
88 if (C.isOne()) {
89 if (Pred == ICmpInst::ICMP_SLT) {
90 Pred = ICmpInst::ICMP_SLE;
91 return true;
92 }
93 } else if (C.isAllOnes()) {
94 if (Pred == ICmpInst::ICMP_SGT) {
95 Pred = ICmpInst::ICMP_SGE;
96 return true;
97 }
98 }
99
100 return false;
101}
102
103/// This is called when we see this pattern:
104/// cmp pred (load (gep GV, ...)), cmpcst
105/// where GV is a global variable with a constant initializer. Try to simplify
106/// this into some simple computation that does not need the load. For example
107/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
108///
109/// If AndCst is non-null, then the loaded value is masked with that constant
110/// before doing the comparison. This handles cases like "A[i]&4 == 0".
113 ConstantInt *AndCst) {
114 if (LI->isVolatile() || LI->getType() != GEP->getResultElementType() ||
115 GV->getValueType() != GEP->getSourceElementType() || !GV->isConstant() ||
117 return nullptr;
118
120 if (!isa<ConstantArray>(Init) && !isa<ConstantDataArray>(Init))
121 return nullptr;
122
123 uint64_t ArrayElementCount = Init->getType()->getArrayNumElements();
124 // Don't blow up on huge arrays.
125 if (ArrayElementCount > MaxArraySizeForCombine)
126 return nullptr;
127
128 // There are many forms of this optimization we can handle, for now, just do
129 // the simple index into a single-dimensional array.
130 //
131 // Require: GEP GV, 0, i {{, constant indices}}
132 if (GEP->getNumOperands() < 3 || !isa<ConstantInt>(GEP->getOperand(1)) ||
133 !cast<ConstantInt>(GEP->getOperand(1))->isZero() ||
134 isa<Constant>(GEP->getOperand(2)))
135 return nullptr;
136
137 // Check that indices after the variable are constants and in-range for the
138 // type they index. Collect the indices. This is typically for arrays of
139 // structs.
140 SmallVector<unsigned, 4> LaterIndices;
141
142 Type *EltTy = Init->getType()->getArrayElementType();
143 for (unsigned i = 3, e = GEP->getNumOperands(); i != e; ++i) {
144 ConstantInt *Idx = dyn_cast<ConstantInt>(GEP->getOperand(i));
145 if (!Idx)
146 return nullptr; // Variable index.
147
148 uint64_t IdxVal = Idx->getZExtValue();
149 if ((unsigned)IdxVal != IdxVal)
150 return nullptr; // Too large array index.
151
152 if (StructType *STy = dyn_cast<StructType>(EltTy))
153 EltTy = STy->getElementType(IdxVal);
154 else if (ArrayType *ATy = dyn_cast<ArrayType>(EltTy)) {
155 if (IdxVal >= ATy->getNumElements())
156 return nullptr;
157 EltTy = ATy->getElementType();
158 } else {
159 return nullptr; // Unknown type.
160 }
161
162 LaterIndices.push_back(IdxVal);
163 }
164
165 enum { Overdefined = -3, Undefined = -2 };
166
167 // Variables for our state machines.
168
169 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
170 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
171 // and 87 is the second (and last) index. FirstTrueElement is -2 when
172 // undefined, otherwise set to the first true element. SecondTrueElement is
173 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
174 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
175
176 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
177 // form "i != 47 & i != 87". Same state transitions as for true elements.
178 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
179
180 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
181 /// define a state machine that triggers for ranges of values that the index
182 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
183 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
184 /// index in the range (inclusive). We use -2 for undefined here because we
185 /// use relative comparisons and don't want 0-1 to match -1.
186 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
187
188 // MagicBitvector - This is a magic bitvector where we set a bit if the
189 // comparison is true for element 'i'. If there are 64 elements or less in
190 // the array, this will fully represent all the comparison results.
191 uint64_t MagicBitvector = 0;
192
193 // Scan the array and see if one of our patterns matches.
194 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
195 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i) {
196 Constant *Elt = Init->getAggregateElement(i);
197 if (!Elt)
198 return nullptr;
199
200 // If this is indexing an array of structures, get the structure element.
201 if (!LaterIndices.empty()) {
202 Elt = ConstantFoldExtractValueInstruction(Elt, LaterIndices);
203 if (!Elt)
204 return nullptr;
205 }
206
207 // If the element is masked, handle it.
208 if (AndCst) {
209 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
210 if (!Elt)
211 return nullptr;
212 }
213
214 // Find out if the comparison would be true or false for the i'th element.
216 CompareRHS, DL, &TLI);
217 // If the result is undef for this element, ignore it.
218 if (isa<UndefValue>(C)) {
219 // Extend range state machines to cover this element in case there is an
220 // undef in the middle of the range.
221 if (TrueRangeEnd == (int)i - 1)
222 TrueRangeEnd = i;
223 if (FalseRangeEnd == (int)i - 1)
224 FalseRangeEnd = i;
225 continue;
226 }
227
228 // If we can't compute the result for any of the elements, we have to give
229 // up evaluating the entire conditional.
230 if (!isa<ConstantInt>(C))
231 return nullptr;
232
233 // Otherwise, we know if the comparison is true or false for this element,
234 // update our state machines.
235 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
236
237 // State machine for single/double/range index comparison.
238 if (IsTrueForElt) {
239 // Update the TrueElement state machine.
240 if (FirstTrueElement == Undefined)
241 FirstTrueElement = TrueRangeEnd = i; // First true element.
242 else {
243 // Update double-compare state machine.
244 if (SecondTrueElement == Undefined)
245 SecondTrueElement = i;
246 else
247 SecondTrueElement = Overdefined;
248
249 // Update range state machine.
250 if (TrueRangeEnd == (int)i - 1)
251 TrueRangeEnd = i;
252 else
253 TrueRangeEnd = Overdefined;
254 }
255 } else {
256 // Update the FalseElement state machine.
257 if (FirstFalseElement == Undefined)
258 FirstFalseElement = FalseRangeEnd = i; // First false element.
259 else {
260 // Update double-compare state machine.
261 if (SecondFalseElement == Undefined)
262 SecondFalseElement = i;
263 else
264 SecondFalseElement = Overdefined;
265
266 // Update range state machine.
267 if (FalseRangeEnd == (int)i - 1)
268 FalseRangeEnd = i;
269 else
270 FalseRangeEnd = Overdefined;
271 }
272 }
273
274 // If this element is in range, update our magic bitvector.
275 if (i < 64 && IsTrueForElt)
276 MagicBitvector |= 1ULL << i;
277
278 // If all of our states become overdefined, bail out early. Since the
279 // predicate is expensive, only check it every 8 elements. This is only
280 // really useful for really huge arrays.
281 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
282 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
283 FalseRangeEnd == Overdefined)
284 return nullptr;
285 }
286
287 // Now that we've scanned the entire array, emit our new comparison(s). We
288 // order the state machines in complexity of the generated code.
289 Value *Idx = GEP->getOperand(2);
290
291 // If the index is larger than the pointer offset size of the target, truncate
292 // the index down like the GEP would do implicitly. We don't have to do this
293 // for an inbounds GEP because the index can't be out of range.
294 if (!GEP->isInBounds()) {
295 Type *PtrIdxTy = DL.getIndexType(GEP->getType());
296 unsigned OffsetSize = PtrIdxTy->getIntegerBitWidth();
297 if (Idx->getType()->getPrimitiveSizeInBits().getFixedValue() > OffsetSize)
298 Idx = Builder.CreateTrunc(Idx, PtrIdxTy);
299 }
300
301 // If inbounds keyword is not present, Idx * ElementSize can overflow.
302 // Let's assume that ElementSize is 2 and the wanted value is at offset 0.
303 // Then, there are two possible values for Idx to match offset 0:
304 // 0x00..00, 0x80..00.
305 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
306 // comparison is false if Idx was 0x80..00.
307 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
308 unsigned ElementSize =
309 DL.getTypeAllocSize(Init->getType()->getArrayElementType());
310 auto MaskIdx = [&](Value *Idx) {
311 if (!GEP->isInBounds() && llvm::countr_zero(ElementSize) != 0) {
312 Value *Mask = ConstantInt::get(Idx->getType(), -1);
313 Mask = Builder.CreateLShr(Mask, llvm::countr_zero(ElementSize));
314 Idx = Builder.CreateAnd(Idx, Mask);
315 }
316 return Idx;
317 };
318
319 // If the comparison is only true for one or two elements, emit direct
320 // comparisons.
321 if (SecondTrueElement != Overdefined) {
322 Idx = MaskIdx(Idx);
323 // None true -> false.
324 if (FirstTrueElement == Undefined)
325 return replaceInstUsesWith(ICI, Builder.getFalse());
326
327 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
328
329 // True for one element -> 'i == 47'.
330 if (SecondTrueElement == Undefined)
331 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
332
333 // True for two elements -> 'i == 47 | i == 72'.
334 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
335 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
336 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
337 return BinaryOperator::CreateOr(C1, C2);
338 }
339
340 // If the comparison is only false for one or two elements, emit direct
341 // comparisons.
342 if (SecondFalseElement != Overdefined) {
343 Idx = MaskIdx(Idx);
344 // None false -> true.
345 if (FirstFalseElement == Undefined)
346 return replaceInstUsesWith(ICI, Builder.getTrue());
347
348 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
349
350 // False for one element -> 'i != 47'.
351 if (SecondFalseElement == Undefined)
352 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
353
354 // False for two elements -> 'i != 47 & i != 72'.
355 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
356 Value *SecondFalseIdx =
357 ConstantInt::get(Idx->getType(), SecondFalseElement);
358 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
359 return BinaryOperator::CreateAnd(C1, C2);
360 }
361
362 // If the comparison can be replaced with a range comparison for the elements
363 // where it is true, emit the range check.
364 if (TrueRangeEnd != Overdefined) {
365 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
366 Idx = MaskIdx(Idx);
367
368 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
369 if (FirstTrueElement) {
370 Value *Offs = ConstantInt::get(Idx->getType(), -FirstTrueElement);
371 Idx = Builder.CreateAdd(Idx, Offs);
372 }
373
374 Value *End =
375 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
376 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
377 }
378
379 // False range check.
380 if (FalseRangeEnd != Overdefined) {
381 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
382 Idx = MaskIdx(Idx);
383 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
384 if (FirstFalseElement) {
385 Value *Offs = ConstantInt::get(Idx->getType(), -FirstFalseElement);
386 Idx = Builder.CreateAdd(Idx, Offs);
387 }
388
389 Value *End =
390 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
391 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
392 }
393
394 // If a magic bitvector captures the entire comparison state
395 // of this load, replace it with computation that does:
396 // ((magic_cst >> i) & 1) != 0
397 {
398 Type *Ty = nullptr;
399
400 // Look for an appropriate type:
401 // - The type of Idx if the magic fits
402 // - The smallest fitting legal type
403 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
404 Ty = Idx->getType();
405 else
406 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
407
408 if (Ty) {
409 Idx = MaskIdx(Idx);
410 Value *V = Builder.CreateIntCast(Idx, Ty, false);
411 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
412 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
413 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
414 }
415 }
416
417 return nullptr;
418}
419
420/// Returns true if we can rewrite Start as a GEP with pointer Base
421/// and some integer offset. The nodes that need to be re-written
422/// for this transformation will be added to Explored.
424 const DataLayout &DL,
425 SetVector<Value *> &Explored) {
426 SmallVector<Value *, 16> WorkList(1, Start);
427 Explored.insert(Base);
428
429 // The following traversal gives us an order which can be used
430 // when doing the final transformation. Since in the final
431 // transformation we create the PHI replacement instructions first,
432 // we don't have to get them in any particular order.
433 //
434 // However, for other instructions we will have to traverse the
435 // operands of an instruction first, which means that we have to
436 // do a post-order traversal.
437 while (!WorkList.empty()) {
439
440 while (!WorkList.empty()) {
441 if (Explored.size() >= 100)
442 return false;
443
444 Value *V = WorkList.back();
445
446 if (Explored.contains(V)) {
447 WorkList.pop_back();
448 continue;
449 }
450
451 if (!isa<GetElementPtrInst>(V) && !isa<PHINode>(V))
452 // We've found some value that we can't explore which is different from
453 // the base. Therefore we can't do this transformation.
454 return false;
455
456 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
457 // Only allow inbounds GEPs with at most one variable offset.
458 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
459 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
460 return false;
461
462 if (!Explored.contains(GEP->getOperand(0)))
463 WorkList.push_back(GEP->getOperand(0));
464 }
465
466 if (WorkList.back() == V) {
467 WorkList.pop_back();
468 // We've finished visiting this node, mark it as such.
469 Explored.insert(V);
470 }
471
472 if (auto *PN = dyn_cast<PHINode>(V)) {
473 // We cannot transform PHIs on unsplittable basic blocks.
474 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
475 return false;
476 Explored.insert(PN);
477 PHIs.insert(PN);
478 }
479 }
480
481 // Explore the PHI nodes further.
482 for (auto *PN : PHIs)
483 for (Value *Op : PN->incoming_values())
484 if (!Explored.contains(Op))
485 WorkList.push_back(Op);
486 }
487
488 // Make sure that we can do this. Since we can't insert GEPs in a basic
489 // block before a PHI node, we can't easily do this transformation if
490 // we have PHI node users of transformed instructions.
491 for (Value *Val : Explored) {
492 for (Value *Use : Val->uses()) {
493
494 auto *PHI = dyn_cast<PHINode>(Use);
495 auto *Inst = dyn_cast<Instruction>(Val);
496
497 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
498 !Explored.contains(PHI))
499 continue;
500
501 if (PHI->getParent() == Inst->getParent())
502 return false;
503 }
504 }
505 return true;
506}
507
508// Sets the appropriate insert point on Builder where we can add
509// a replacement Instruction for V (if that is possible).
510static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
511 bool Before = true) {
512 if (auto *PHI = dyn_cast<PHINode>(V)) {
513 BasicBlock *Parent = PHI->getParent();
514 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
515 return;
516 }
517 if (auto *I = dyn_cast<Instruction>(V)) {
518 if (!Before)
519 I = &*std::next(I->getIterator());
520 Builder.SetInsertPoint(I);
521 return;
522 }
523 if (auto *A = dyn_cast<Argument>(V)) {
524 // Set the insertion point in the entry block.
525 BasicBlock &Entry = A->getParent()->getEntryBlock();
526 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
527 return;
528 }
529 // Otherwise, this is a constant and we don't need to set a new
530 // insertion point.
531 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
532}
533
534/// Returns a re-written value of Start as an indexed GEP using Base as a
535/// pointer.
537 const DataLayout &DL,
538 SetVector<Value *> &Explored,
539 InstCombiner &IC) {
540 // Perform all the substitutions. This is a bit tricky because we can
541 // have cycles in our use-def chains.
542 // 1. Create the PHI nodes without any incoming values.
543 // 2. Create all the other values.
544 // 3. Add the edges for the PHI nodes.
545 // 4. Emit GEPs to get the original pointers.
546 // 5. Remove the original instructions.
547 Type *IndexType = IntegerType::get(
548 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
549
551 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
552
553 // Create the new PHI nodes, without adding any incoming values.
554 for (Value *Val : Explored) {
555 if (Val == Base)
556 continue;
557 // Create empty phi nodes. This avoids cyclic dependencies when creating
558 // the remaining instructions.
559 if (auto *PHI = dyn_cast<PHINode>(Val))
560 NewInsts[PHI] =
561 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
562 PHI->getName() + ".idx", PHI->getIterator());
563 }
564 IRBuilder<> Builder(Base->getContext());
565
566 // Create all the other instructions.
567 for (Value *Val : Explored) {
568 if (NewInsts.contains(Val))
569 continue;
570
571 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
572 setInsertionPoint(Builder, GEP);
573 Value *Op = NewInsts[GEP->getOperand(0)];
574 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
575 if (isa<ConstantInt>(Op) && cast<ConstantInt>(Op)->isZero())
576 NewInsts[GEP] = OffsetV;
577 else
578 NewInsts[GEP] = Builder.CreateNSWAdd(
579 Op, OffsetV, GEP->getOperand(0)->getName() + ".add");
580 continue;
581 }
582 if (isa<PHINode>(Val))
583 continue;
584
585 llvm_unreachable("Unexpected instruction type");
586 }
587
588 // Add the incoming values to the PHI nodes.
589 for (Value *Val : Explored) {
590 if (Val == Base)
591 continue;
592 // All the instructions have been created, we can now add edges to the
593 // phi nodes.
594 if (auto *PHI = dyn_cast<PHINode>(Val)) {
595 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
596 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
597 Value *NewIncoming = PHI->getIncomingValue(I);
598
599 if (NewInsts.contains(NewIncoming))
600 NewIncoming = NewInsts[NewIncoming];
601
602 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
603 }
604 }
605 }
606
607 for (Value *Val : Explored) {
608 if (Val == Base)
609 continue;
610
611 setInsertionPoint(Builder, Val, false);
612 // Create GEP for external users.
613 Value *NewVal = Builder.CreateInBoundsGEP(
614 Builder.getInt8Ty(), Base, NewInsts[Val], Val->getName() + ".ptr");
615 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
616 // Add old instruction to worklist for DCE. We don't directly remove it
617 // here because the original compare is one of the users.
618 IC.addToWorklist(cast<Instruction>(Val));
619 }
620
621 return NewInsts[Start];
622}
623
624/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
625/// We can look through PHIs, GEPs and casts in order to determine a common base
626/// between GEPLHS and RHS.
629 const DataLayout &DL,
630 InstCombiner &IC) {
631 // FIXME: Support vector of pointers.
632 if (GEPLHS->getType()->isVectorTy())
633 return nullptr;
634
635 if (!GEPLHS->hasAllConstantIndices())
636 return nullptr;
637
638 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
639 Value *PtrBase =
641 /*AllowNonInbounds*/ false);
642
643 // Bail if we looked through addrspacecast.
644 if (PtrBase->getType() != GEPLHS->getType())
645 return nullptr;
646
647 // The set of nodes that will take part in this transformation.
648 SetVector<Value *> Nodes;
649
650 if (!canRewriteGEPAsOffset(RHS, PtrBase, DL, Nodes))
651 return nullptr;
652
653 // We know we can re-write this as
654 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
655 // Since we've only looked through inbouds GEPs we know that we
656 // can't have overflow on either side. We can therefore re-write
657 // this as:
658 // OFFSET1 cmp OFFSET2
659 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, DL, Nodes, IC);
660
661 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
662 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
663 // offset. Since Index is the offset of LHS to the base pointer, we will now
664 // compare the offsets instead of comparing the pointers.
666 IC.Builder.getInt(Offset), NewRHS);
667}
668
669/// Fold comparisons between a GEP instruction and something else. At this point
670/// we know that the GEP is on the LHS of the comparison.
673 Instruction &I) {
674 // Don't transform signed compares of GEPs into index compares. Even if the
675 // GEP is inbounds, the final add of the base pointer can have signed overflow
676 // and would change the result of the icmp.
677 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
678 // the maximum signed value for the pointer type.
680 return nullptr;
681
682 // Look through bitcasts and addrspacecasts. We do not however want to remove
683 // 0 GEPs.
684 if (!isa<GetElementPtrInst>(RHS))
686
687 Value *PtrBase = GEPLHS->getOperand(0);
688 if (PtrBase == RHS && (GEPLHS->isInBounds() || ICmpInst::isEquality(Cond))) {
689 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
690 Value *Offset = EmitGEPOffset(GEPLHS);
692 Constant::getNullValue(Offset->getType()));
693 }
694
695 if (GEPLHS->isInBounds() && ICmpInst::isEquality(Cond) &&
696 isa<Constant>(RHS) && cast<Constant>(RHS)->isNullValue() &&
697 !NullPointerIsDefined(I.getFunction(),
699 // For most address spaces, an allocation can't be placed at null, but null
700 // itself is treated as a 0 size allocation in the in bounds rules. Thus,
701 // the only valid inbounds address derived from null, is null itself.
702 // Thus, we have four cases to consider:
703 // 1) Base == nullptr, Offset == 0 -> inbounds, null
704 // 2) Base == nullptr, Offset != 0 -> poison as the result is out of bounds
705 // 3) Base != nullptr, Offset == (-base) -> poison (crossing allocations)
706 // 4) Base != nullptr, Offset != (-base) -> nonnull (and possibly poison)
707 //
708 // (Note if we're indexing a type of size 0, that simply collapses into one
709 // of the buckets above.)
710 //
711 // In general, we're allowed to make values less poison (i.e. remove
712 // sources of full UB), so in this case, we just select between the two
713 // non-poison cases (1 and 4 above).
714 //
715 // For vectors, we apply the same reasoning on a per-lane basis.
716 auto *Base = GEPLHS->getPointerOperand();
717 if (GEPLHS->getType()->isVectorTy() && Base->getType()->isPointerTy()) {
718 auto EC = cast<VectorType>(GEPLHS->getType())->getElementCount();
720 }
721 return new ICmpInst(Cond, Base,
723 cast<Constant>(RHS), Base->getType()));
724 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
725 // If the base pointers are different, but the indices are the same, just
726 // compare the base pointer.
727 if (PtrBase != GEPRHS->getOperand(0)) {
728 bool IndicesTheSame =
729 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
730 GEPLHS->getPointerOperand()->getType() ==
731 GEPRHS->getPointerOperand()->getType() &&
732 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
733 if (IndicesTheSame)
734 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
735 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
736 IndicesTheSame = false;
737 break;
738 }
739
740 // If all indices are the same, just compare the base pointers.
741 Type *BaseType = GEPLHS->getOperand(0)->getType();
742 if (IndicesTheSame && CmpInst::makeCmpResultType(BaseType) == I.getType())
743 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
744
745 // If we're comparing GEPs with two base pointers that only differ in type
746 // and both GEPs have only constant indices or just one use, then fold
747 // the compare with the adjusted indices.
748 // FIXME: Support vector of pointers.
749 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
750 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
751 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
752 PtrBase->stripPointerCasts() ==
753 GEPRHS->getOperand(0)->stripPointerCasts() &&
754 !GEPLHS->getType()->isVectorTy()) {
755 Value *LOffset = EmitGEPOffset(GEPLHS);
756 Value *ROffset = EmitGEPOffset(GEPRHS);
757
758 // If we looked through an addrspacecast between different sized address
759 // spaces, the LHS and RHS pointers are different sized
760 // integers. Truncate to the smaller one.
761 Type *LHSIndexTy = LOffset->getType();
762 Type *RHSIndexTy = ROffset->getType();
763 if (LHSIndexTy != RHSIndexTy) {
764 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
765 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
766 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
767 } else
768 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
769 }
770
772 LOffset, ROffset);
773 return replaceInstUsesWith(I, Cmp);
774 }
775
776 // Otherwise, the base pointers are different and the indices are
777 // different. Try convert this to an indexed compare by looking through
778 // PHIs/casts.
779 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
780 }
781
782 bool GEPsInBounds = GEPLHS->isInBounds() && GEPRHS->isInBounds();
783 if (GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
784 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
785 // If the GEPs only differ by one index, compare it.
786 unsigned NumDifferences = 0; // Keep track of # differences.
787 unsigned DiffOperand = 0; // The operand that differs.
788 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
789 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
790 Type *LHSType = GEPLHS->getOperand(i)->getType();
791 Type *RHSType = GEPRHS->getOperand(i)->getType();
792 // FIXME: Better support for vector of pointers.
793 if (LHSType->getPrimitiveSizeInBits() !=
794 RHSType->getPrimitiveSizeInBits() ||
795 (GEPLHS->getType()->isVectorTy() &&
796 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
797 // Irreconcilable differences.
798 NumDifferences = 2;
799 break;
800 }
801
802 if (NumDifferences++) break;
803 DiffOperand = i;
804 }
805
806 if (NumDifferences == 0) // SAME GEP?
807 return replaceInstUsesWith(I, // No comparison is needed here.
808 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
809
810 else if (NumDifferences == 1 && GEPsInBounds) {
811 Value *LHSV = GEPLHS->getOperand(DiffOperand);
812 Value *RHSV = GEPRHS->getOperand(DiffOperand);
813 // Make sure we do a signed comparison here.
814 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), LHSV, RHSV);
815 }
816 }
817
818 if (GEPsInBounds || CmpInst::isEquality(Cond)) {
819 auto EmitGEPOffsetAndRewrite = [&](GEPOperator *GEP) {
821 auto *Inst = dyn_cast<Instruction>(GEP);
822 if (Inst)
824
825 Value *Offset = EmitGEPOffset(GEP);
826 // If a non-trivial GEP has other uses, rewrite it to avoid duplicating
827 // the offset arithmetic.
828 if (Inst && !GEP->hasOneUse() && !GEP->hasAllConstantIndices() &&
829 !GEP->getSourceElementType()->isIntegerTy(8)) {
832 GEP->getPointerOperand(),
833 Offset, "", GEPsInBounds));
835 }
836 return Offset;
837 };
838
839 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
840 Value *L = EmitGEPOffsetAndRewrite(GEPLHS);
841 Value *R = EmitGEPOffsetAndRewrite(GEPRHS);
842 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), L, R);
843 }
844 }
845
846 // Try convert this to an indexed compare by looking through PHIs/casts as a
847 // last resort.
848 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
849}
850
852 // It would be tempting to fold away comparisons between allocas and any
853 // pointer not based on that alloca (e.g. an argument). However, even
854 // though such pointers cannot alias, they can still compare equal.
855 //
856 // But LLVM doesn't specify where allocas get their memory, so if the alloca
857 // doesn't escape we can argue that it's impossible to guess its value, and we
858 // can therefore act as if any such guesses are wrong.
859 //
860 // However, we need to ensure that this folding is consistent: We can't fold
861 // one comparison to false, and then leave a different comparison against the
862 // same value alone (as it might evaluate to true at runtime, leading to a
863 // contradiction). As such, this code ensures that all comparisons are folded
864 // at the same time, and there are no other escapes.
865
866 struct CmpCaptureTracker : public CaptureTracker {
867 AllocaInst *Alloca;
868 bool Captured = false;
869 /// The value of the map is a bit mask of which icmp operands the alloca is
870 /// used in.
872
873 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
874
875 void tooManyUses() override { Captured = true; }
876
877 bool captured(const Use *U) override {
878 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
879 // We need to check that U is based *only* on the alloca, and doesn't
880 // have other contributions from a select/phi operand.
881 // TODO: We could check whether getUnderlyingObjects() reduces to one
882 // object, which would allow looking through phi nodes.
883 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
884 // Collect equality icmps of the alloca, and don't treat them as
885 // captures.
886 auto Res = ICmps.insert({ICmp, 0});
887 Res.first->second |= 1u << U->getOperandNo();
888 return false;
889 }
890
891 Captured = true;
892 return true;
893 }
894 };
895
896 CmpCaptureTracker Tracker(Alloca);
897 PointerMayBeCaptured(Alloca, &Tracker);
898 if (Tracker.Captured)
899 return false;
900
901 bool Changed = false;
902 for (auto [ICmp, Operands] : Tracker.ICmps) {
903 switch (Operands) {
904 case 1:
905 case 2: {
906 // The alloca is only used in one icmp operand. Assume that the
907 // equality is false.
908 auto *Res = ConstantInt::get(
909 ICmp->getType(), ICmp->getPredicate() == ICmpInst::ICMP_NE);
910 replaceInstUsesWith(*ICmp, Res);
912 Changed = true;
913 break;
914 }
915 case 3:
916 // Both icmp operands are based on the alloca, so this is comparing
917 // pointer offsets, without leaking any information about the address
918 // of the alloca. Ignore such comparisons.
919 break;
920 default:
921 llvm_unreachable("Cannot happen");
922 }
923 }
924
925 return Changed;
926}
927
928/// Fold "icmp pred (X+C), X".
930 ICmpInst::Predicate Pred) {
931 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
932 // so the values can never be equal. Similarly for all other "or equals"
933 // operators.
934 assert(!!C && "C should not be zero!");
935
936 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
937 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
938 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
939 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
940 Constant *R = ConstantInt::get(X->getType(),
941 APInt::getMaxValue(C.getBitWidth()) - C);
942 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
943 }
944
945 // (X+1) >u X --> X <u (0-1) --> X != 255
946 // (X+2) >u X --> X <u (0-2) --> X <u 254
947 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
948 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
949 return new ICmpInst(ICmpInst::ICMP_ULT, X,
950 ConstantInt::get(X->getType(), -C));
951
952 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
953
954 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
955 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
956 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
957 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
958 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
959 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
960 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
961 return new ICmpInst(ICmpInst::ICMP_SGT, X,
962 ConstantInt::get(X->getType(), SMax - C));
963
964 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
965 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
966 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
967 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
968 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
969 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
970
971 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
972 return new ICmpInst(ICmpInst::ICMP_SLT, X,
973 ConstantInt::get(X->getType(), SMax - (C - 1)));
974}
975
976/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
977/// (icmp eq/ne A, Log2(AP2/AP1)) ->
978/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
980 const APInt &AP1,
981 const APInt &AP2) {
982 assert(I.isEquality() && "Cannot fold icmp gt/lt");
983
984 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
985 if (I.getPredicate() == I.ICMP_NE)
986 Pred = CmpInst::getInversePredicate(Pred);
987 return new ICmpInst(Pred, LHS, RHS);
988 };
989
990 // Don't bother doing any work for cases which InstSimplify handles.
991 if (AP2.isZero())
992 return nullptr;
993
994 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
995 if (IsAShr) {
996 if (AP2.isAllOnes())
997 return nullptr;
998 if (AP2.isNegative() != AP1.isNegative())
999 return nullptr;
1000 if (AP2.sgt(AP1))
1001 return nullptr;
1002 }
1003
1004 if (!AP1)
1005 // 'A' must be large enough to shift out the highest set bit.
1006 return getICmp(I.ICMP_UGT, A,
1007 ConstantInt::get(A->getType(), AP2.logBase2()));
1008
1009 if (AP1 == AP2)
1010 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1011
1012 int Shift;
1013 if (IsAShr && AP1.isNegative())
1014 Shift = AP1.countl_one() - AP2.countl_one();
1015 else
1016 Shift = AP1.countl_zero() - AP2.countl_zero();
1017
1018 if (Shift > 0) {
1019 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1020 // There are multiple solutions if we are comparing against -1 and the LHS
1021 // of the ashr is not a power of two.
1022 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1023 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1024 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1025 } else if (AP1 == AP2.lshr(Shift)) {
1026 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1027 }
1028 }
1029
1030 // Shifting const2 will never be equal to const1.
1031 // FIXME: This should always be handled by InstSimplify?
1032 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1033 return replaceInstUsesWith(I, TorF);
1034}
1035
1036/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1037/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1039 const APInt &AP1,
1040 const APInt &AP2) {
1041 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1042
1043 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1044 if (I.getPredicate() == I.ICMP_NE)
1045 Pred = CmpInst::getInversePredicate(Pred);
1046 return new ICmpInst(Pred, LHS, RHS);
1047 };
1048
1049 // Don't bother doing any work for cases which InstSimplify handles.
1050 if (AP2.isZero())
1051 return nullptr;
1052
1053 unsigned AP2TrailingZeros = AP2.countr_zero();
1054
1055 if (!AP1 && AP2TrailingZeros != 0)
1056 return getICmp(
1057 I.ICMP_UGE, A,
1058 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1059
1060 if (AP1 == AP2)
1061 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1062
1063 // Get the distance between the lowest bits that are set.
1064 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1065
1066 if (Shift > 0 && AP2.shl(Shift) == AP1)
1067 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1068
1069 // Shifting const2 will never be equal to const1.
1070 // FIXME: This should always be handled by InstSimplify?
1071 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1072 return replaceInstUsesWith(I, TorF);
1073}
1074
1075/// The caller has matched a pattern of the form:
1076/// I = icmp ugt (add (add A, B), CI2), CI1
1077/// If this is of the form:
1078/// sum = a + b
1079/// if (sum+128 >u 255)
1080/// Then replace it with llvm.sadd.with.overflow.i8.
1081///
1083 ConstantInt *CI2, ConstantInt *CI1,
1084 InstCombinerImpl &IC) {
1085 // The transformation we're trying to do here is to transform this into an
1086 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1087 // with a narrower add, and discard the add-with-constant that is part of the
1088 // range check (if we can't eliminate it, this isn't profitable).
1089
1090 // In order to eliminate the add-with-constant, the compare can be its only
1091 // use.
1092 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1093 if (!AddWithCst->hasOneUse())
1094 return nullptr;
1095
1096 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1097 if (!CI2->getValue().isPowerOf2())
1098 return nullptr;
1099 unsigned NewWidth = CI2->getValue().countr_zero();
1100 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1101 return nullptr;
1102
1103 // The width of the new add formed is 1 more than the bias.
1104 ++NewWidth;
1105
1106 // Check to see that CI1 is an all-ones value with NewWidth bits.
1107 if (CI1->getBitWidth() == NewWidth ||
1108 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1109 return nullptr;
1110
1111 // This is only really a signed overflow check if the inputs have been
1112 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1113 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1114 if (IC.ComputeMaxSignificantBits(A, 0, &I) > NewWidth ||
1115 IC.ComputeMaxSignificantBits(B, 0, &I) > NewWidth)
1116 return nullptr;
1117
1118 // In order to replace the original add with a narrower
1119 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1120 // and truncates that discard the high bits of the add. Verify that this is
1121 // the case.
1122 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1123 for (User *U : OrigAdd->users()) {
1124 if (U == AddWithCst)
1125 continue;
1126
1127 // Only accept truncates for now. We would really like a nice recursive
1128 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1129 // chain to see which bits of a value are actually demanded. If the
1130 // original add had another add which was then immediately truncated, we
1131 // could still do the transformation.
1132 TruncInst *TI = dyn_cast<TruncInst>(U);
1133 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1134 return nullptr;
1135 }
1136
1137 // If the pattern matches, truncate the inputs to the narrower type and
1138 // use the sadd_with_overflow intrinsic to efficiently compute both the
1139 // result and the overflow bit.
1140 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1142 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1143
1144 InstCombiner::BuilderTy &Builder = IC.Builder;
1145
1146 // Put the new code above the original add, in case there are any uses of the
1147 // add between the add and the compare.
1148 Builder.SetInsertPoint(OrigAdd);
1149
1150 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1151 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1152 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1153 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1154 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1155
1156 // The inner add was the result of the narrow add, zero extended to the
1157 // wider type. Replace it with the result computed by the intrinsic.
1158 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1159 IC.eraseInstFromFunction(*OrigAdd);
1160
1161 // The original icmp gets replaced with the overflow value.
1162 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1163}
1164
1165/// If we have:
1166/// icmp eq/ne (urem/srem %x, %y), 0
1167/// iff %y is a power-of-two, we can replace this with a bit test:
1168/// icmp eq/ne (and %x, (add %y, -1)), 0
1170 // This fold is only valid for equality predicates.
1171 if (!I.isEquality())
1172 return nullptr;
1174 Value *X, *Y, *Zero;
1175 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1176 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1177 return nullptr;
1178 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, 0, &I))
1179 return nullptr;
1180 // This may increase instruction count, we don't enforce that Y is a constant.
1181 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1182 Value *Masked = Builder.CreateAnd(X, Mask);
1183 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1184}
1185
1186/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1187/// by one-less-than-bitwidth into a sign test on the original value.
1189 Instruction *Val;
1191 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1192 return nullptr;
1193
1194 Value *X;
1195 Type *XTy;
1196
1197 Constant *C;
1198 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1199 XTy = X->getType();
1200 unsigned XBitWidth = XTy->getScalarSizeInBits();
1202 APInt(XBitWidth, XBitWidth - 1))))
1203 return nullptr;
1204 } else if (isa<BinaryOperator>(Val) &&
1206 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1207 /*AnalyzeForSignBitExtraction=*/true))) {
1208 XTy = X->getType();
1209 } else
1210 return nullptr;
1211
1212 return ICmpInst::Create(Instruction::ICmp,
1216}
1217
1218// Handle icmp pred X, 0
1220 CmpInst::Predicate Pred = Cmp.getPredicate();
1221 if (!match(Cmp.getOperand(1), m_Zero()))
1222 return nullptr;
1223
1224 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1225 if (Pred == ICmpInst::ICMP_SGT) {
1226 Value *A, *B;
1227 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1229 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1231 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1232 }
1233 }
1234
1236 return New;
1237
1238 // Given:
1239 // icmp eq/ne (urem %x, %y), 0
1240 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1241 // icmp eq/ne %x, 0
1242 Value *X, *Y;
1243 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1244 ICmpInst::isEquality(Pred)) {
1245 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1246 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1247 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1248 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1249 }
1250
1251 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1252 // odd/non-zero/there is no overflow.
1253 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1254 ICmpInst::isEquality(Pred)) {
1255
1256 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1257 // if X % 2 != 0
1258 // (icmp eq/ne Y)
1259 if (XKnown.countMaxTrailingZeros() == 0)
1260 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1261
1262 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1263 // if Y % 2 != 0
1264 // (icmp eq/ne X)
1265 if (YKnown.countMaxTrailingZeros() == 0)
1266 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1267
1268 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1269 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1270 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1271 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1272 // but to avoid unnecessary work, first just if this is an obvious case.
1273
1274 // if X non-zero and NoOverflow(X * Y)
1275 // (icmp eq/ne Y)
1276 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1277 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1278
1279 // if Y non-zero and NoOverflow(X * Y)
1280 // (icmp eq/ne X)
1281 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1282 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1283 }
1284 // Note, we are skipping cases:
1285 // if Y % 2 != 0 AND X % 2 != 0
1286 // (false/true)
1287 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1288 // (false/true)
1289 // Those can be simplified later as we would have already replaced the (icmp
1290 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1291 // will fold to a constant elsewhere.
1292 }
1293 return nullptr;
1294}
1295
1296/// Fold icmp Pred X, C.
1297/// TODO: This code structure does not make sense. The saturating add fold
1298/// should be moved to some other helper and extended as noted below (it is also
1299/// possible that code has been made unnecessary - do we canonicalize IR to
1300/// overflow/saturating intrinsics or not?).
1302 // Match the following pattern, which is a common idiom when writing
1303 // overflow-safe integer arithmetic functions. The source performs an addition
1304 // in wider type and explicitly checks for overflow using comparisons against
1305 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1306 //
1307 // TODO: This could probably be generalized to handle other overflow-safe
1308 // operations if we worked out the formulas to compute the appropriate magic
1309 // constants.
1310 //
1311 // sum = a + b
1312 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1313 CmpInst::Predicate Pred = Cmp.getPredicate();
1314 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1315 Value *A, *B;
1316 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1317 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1318 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1319 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1320 return Res;
1321
1322 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1323 Constant *C = dyn_cast<Constant>(Op1);
1324 if (!C)
1325 return nullptr;
1326
1327 if (auto *Phi = dyn_cast<PHINode>(Op0))
1328 if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) {
1330 for (Value *V : Phi->incoming_values()) {
1331 Constant *Res =
1332 ConstantFoldCompareInstOperands(Pred, cast<Constant>(V), C, DL);
1333 if (!Res)
1334 return nullptr;
1335 Ops.push_back(Res);
1336 }
1338 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1339 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1340 NewPhi->addIncoming(V, Pred);
1341 return replaceInstUsesWith(Cmp, NewPhi);
1342 }
1343
1345 return R;
1346
1347 return nullptr;
1348}
1349
1350/// Canonicalize icmp instructions based on dominating conditions.
1352 // We already checked simple implication in InstSimplify, only handle complex
1353 // cases here.
1354 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1355 const APInt *C;
1356 if (!match(Y, m_APInt(C)))
1357 return nullptr;
1358
1359 CmpInst::Predicate Pred = Cmp.getPredicate();
1361
1362 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1363 const APInt *DomC) -> Instruction * {
1364 // We have 2 compares of a variable with constants. Calculate the constant
1365 // ranges of those compares to see if we can transform the 2nd compare:
1366 // DomBB:
1367 // DomCond = icmp DomPred X, DomC
1368 // br DomCond, CmpBB, FalseBB
1369 // CmpBB:
1370 // Cmp = icmp Pred X, C
1371 ConstantRange DominatingCR =
1372 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1373 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1374 ConstantRange Difference = DominatingCR.difference(CR);
1375 if (Intersection.isEmptySet())
1376 return replaceInstUsesWith(Cmp, Builder.getFalse());
1377 if (Difference.isEmptySet())
1378 return replaceInstUsesWith(Cmp, Builder.getTrue());
1379
1380 // Canonicalizing a sign bit comparison that gets used in a branch,
1381 // pessimizes codegen by generating branch on zero instruction instead
1382 // of a test and branch. So we avoid canonicalizing in such situations
1383 // because test and branch instruction has better branch displacement
1384 // than compare and branch instruction.
1385 bool UnusedBit;
1386 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1387 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1388 return nullptr;
1389
1390 // Avoid an infinite loop with min/max canonicalization.
1391 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1392 if (Cmp.hasOneUse() &&
1393 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1394 return nullptr;
1395
1396 if (const APInt *EqC = Intersection.getSingleElement())
1397 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1398 if (const APInt *NeC = Difference.getSingleElement())
1399 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1400 return nullptr;
1401 };
1402
1403 for (BranchInst *BI : DC.conditionsFor(X)) {
1404 ICmpInst::Predicate DomPred;
1405 const APInt *DomC;
1406 if (!match(BI->getCondition(),
1407 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1408 continue;
1409
1410 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1411 if (DT.dominates(Edge0, Cmp.getParent())) {
1412 if (auto *V = handleDomCond(DomPred, DomC))
1413 return V;
1414 } else {
1415 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1416 if (DT.dominates(Edge1, Cmp.getParent()))
1417 if (auto *V =
1418 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1419 return V;
1420 }
1421 }
1422
1423 return nullptr;
1424}
1425
1426/// Fold icmp (trunc X), C.
1428 TruncInst *Trunc,
1429 const APInt &C) {
1430 ICmpInst::Predicate Pred = Cmp.getPredicate();
1431 Value *X = Trunc->getOperand(0);
1432 if (C.isOne() && C.getBitWidth() > 1) {
1433 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1434 Value *V = nullptr;
1435 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1436 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1437 ConstantInt::get(V->getType(), 1));
1438 }
1439
1440 Type *SrcTy = X->getType();
1441 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1442 SrcBits = SrcTy->getScalarSizeInBits();
1443
1444 // TODO: Handle any shifted constant by subtracting trailing zeros.
1445 // TODO: Handle non-equality predicates.
1446 Value *Y;
1447 if (Cmp.isEquality() && match(X, m_Shl(m_One(), m_Value(Y)))) {
1448 // (trunc (1 << Y) to iN) == 0 --> Y u>= N
1449 // (trunc (1 << Y) to iN) != 0 --> Y u< N
1450 if (C.isZero()) {
1451 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1452 return new ICmpInst(NewPred, Y, ConstantInt::get(SrcTy, DstBits));
1453 }
1454 // (trunc (1 << Y) to iN) == 2**C --> Y == C
1455 // (trunc (1 << Y) to iN) != 2**C --> Y != C
1456 if (C.isPowerOf2())
1457 return new ICmpInst(Pred, Y, ConstantInt::get(SrcTy, C.logBase2()));
1458 }
1459
1460 if (Cmp.isEquality() && Trunc->hasOneUse()) {
1461 // Canonicalize to a mask and wider compare if the wide type is suitable:
1462 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1463 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1464 Constant *Mask =
1465 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1466 Value *And = Builder.CreateAnd(X, Mask);
1467 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1468 return new ICmpInst(Pred, And, WideC);
1469 }
1470
1471 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1472 // of the high bits truncated out of x are known.
1473 KnownBits Known = computeKnownBits(X, 0, &Cmp);
1474
1475 // If all the high bits are known, we can do this xform.
1476 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1477 // Pull in the high bits from known-ones set.
1478 APInt NewRHS = C.zext(SrcBits);
1479 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1480 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1481 }
1482 }
1483
1484 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1485 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1486 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1487 Value *ShOp;
1488 const APInt *ShAmtC;
1489 bool TrueIfSigned;
1490 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1491 match(X, m_Shr(m_Value(ShOp), m_APInt(ShAmtC))) &&
1492 DstBits == SrcBits - ShAmtC->getZExtValue()) {
1493 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1495 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1497 }
1498
1499 return nullptr;
1500}
1501
1502/// Fold icmp (trunc X), (trunc Y).
1503/// Fold icmp (trunc X), (zext Y).
1506 const SimplifyQuery &Q) {
1507 if (Cmp.isSigned())
1508 return nullptr;
1509
1510 Value *X, *Y;
1512 bool YIsZext = false;
1513 // Try to match icmp (trunc X), (trunc Y)
1514 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1515 if (X->getType() != Y->getType() &&
1516 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1517 return nullptr;
1518 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1519 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1520 std::swap(X, Y);
1521 Pred = Cmp.getSwappedPredicate(Pred);
1522 }
1523 }
1524 // Try to match icmp (trunc X), (zext Y)
1525 else if (match(&Cmp, m_c_ICmp(Pred, m_Trunc(m_Value(X)),
1526 m_OneUse(m_ZExt(m_Value(Y))))))
1527
1528 YIsZext = true;
1529 else
1530 return nullptr;
1531
1532 Type *TruncTy = Cmp.getOperand(0)->getType();
1533 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1534
1535 // If this transform will end up changing from desirable types -> undesirable
1536 // types skip it.
1537 if (isDesirableIntType(TruncBits) &&
1538 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1539 return nullptr;
1540
1541 // Check if the trunc is unneeded.
1542 KnownBits KnownX = llvm::computeKnownBits(X, /*Depth*/ 0, Q);
1543 if (KnownX.countMaxActiveBits() > TruncBits)
1544 return nullptr;
1545
1546 if (!YIsZext) {
1547 // If Y is also a trunc, make sure it is unneeded.
1548 KnownBits KnownY = llvm::computeKnownBits(Y, /*Depth*/ 0, Q);
1549 if (KnownY.countMaxActiveBits() > TruncBits)
1550 return nullptr;
1551 }
1552
1553 Value *NewY = Builder.CreateZExtOrTrunc(Y, X->getType());
1554 return new ICmpInst(Pred, X, NewY);
1555}
1556
1557/// Fold icmp (xor X, Y), C.
1560 const APInt &C) {
1561 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1562 return I;
1563
1564 Value *X = Xor->getOperand(0);
1565 Value *Y = Xor->getOperand(1);
1566 const APInt *XorC;
1567 if (!match(Y, m_APInt(XorC)))
1568 return nullptr;
1569
1570 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1571 // fold the xor.
1572 ICmpInst::Predicate Pred = Cmp.getPredicate();
1573 bool TrueIfSigned = false;
1574 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1575
1576 // If the sign bit of the XorCst is not set, there is no change to
1577 // the operation, just stop using the Xor.
1578 if (!XorC->isNegative())
1579 return replaceOperand(Cmp, 0, X);
1580
1581 // Emit the opposite comparison.
1582 if (TrueIfSigned)
1583 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1584 ConstantInt::getAllOnesValue(X->getType()));
1585 else
1586 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1587 ConstantInt::getNullValue(X->getType()));
1588 }
1589
1590 if (Xor->hasOneUse()) {
1591 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1592 if (!Cmp.isEquality() && XorC->isSignMask()) {
1593 Pred = Cmp.getFlippedSignednessPredicate();
1594 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1595 }
1596
1597 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1598 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1599 Pred = Cmp.getFlippedSignednessPredicate();
1600 Pred = Cmp.getSwappedPredicate(Pred);
1601 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1602 }
1603 }
1604
1605 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1606 if (Pred == ICmpInst::ICMP_UGT) {
1607 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1608 if (*XorC == ~C && (C + 1).isPowerOf2())
1609 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1610 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1611 if (*XorC == C && (C + 1).isPowerOf2())
1612 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1613 }
1614 if (Pred == ICmpInst::ICMP_ULT) {
1615 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1616 if (*XorC == -C && C.isPowerOf2())
1617 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1618 ConstantInt::get(X->getType(), ~C));
1619 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1620 if (*XorC == C && (-C).isPowerOf2())
1621 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1622 ConstantInt::get(X->getType(), ~C));
1623 }
1624 return nullptr;
1625}
1626
1627/// For power-of-2 C:
1628/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1629/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1632 const APInt &C) {
1633 CmpInst::Predicate Pred = Cmp.getPredicate();
1634 APInt PowerOf2;
1635 if (Pred == ICmpInst::ICMP_ULT)
1636 PowerOf2 = C;
1637 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1638 PowerOf2 = C + 1;
1639 else
1640 return nullptr;
1641 if (!PowerOf2.isPowerOf2())
1642 return nullptr;
1643 Value *X;
1644 const APInt *ShiftC;
1646 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1647 return nullptr;
1648 uint64_t Shift = ShiftC->getLimitedValue();
1649 Type *XType = X->getType();
1650 if (Shift == 0 || PowerOf2.isMinSignedValue())
1651 return nullptr;
1652 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1653 APInt Bound =
1654 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1655 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1656}
1657
1658/// Fold icmp (and (sh X, Y), C2), C1.
1661 const APInt &C1,
1662 const APInt &C2) {
1663 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1664 if (!Shift || !Shift->isShift())
1665 return nullptr;
1666
1667 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1668 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1669 // code produced by the clang front-end, for bitfield access.
1670 // This seemingly simple opportunity to fold away a shift turns out to be
1671 // rather complicated. See PR17827 for details.
1672 unsigned ShiftOpcode = Shift->getOpcode();
1673 bool IsShl = ShiftOpcode == Instruction::Shl;
1674 const APInt *C3;
1675 if (match(Shift->getOperand(1), m_APInt(C3))) {
1676 APInt NewAndCst, NewCmpCst;
1677 bool AnyCmpCstBitsShiftedOut;
1678 if (ShiftOpcode == Instruction::Shl) {
1679 // For a left shift, we can fold if the comparison is not signed. We can
1680 // also fold a signed comparison if the mask value and comparison value
1681 // are not negative. These constraints may not be obvious, but we can
1682 // prove that they are correct using an SMT solver.
1683 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1684 return nullptr;
1685
1686 NewCmpCst = C1.lshr(*C3);
1687 NewAndCst = C2.lshr(*C3);
1688 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1689 } else if (ShiftOpcode == Instruction::LShr) {
1690 // For a logical right shift, we can fold if the comparison is not signed.
1691 // We can also fold a signed comparison if the shifted mask value and the
1692 // shifted comparison value are not negative. These constraints may not be
1693 // obvious, but we can prove that they are correct using an SMT solver.
1694 NewCmpCst = C1.shl(*C3);
1695 NewAndCst = C2.shl(*C3);
1696 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1697 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1698 return nullptr;
1699 } else {
1700 // For an arithmetic shift, check that both constants don't use (in a
1701 // signed sense) the top bits being shifted out.
1702 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1703 NewCmpCst = C1.shl(*C3);
1704 NewAndCst = C2.shl(*C3);
1705 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1706 if (NewAndCst.ashr(*C3) != C2)
1707 return nullptr;
1708 }
1709
1710 if (AnyCmpCstBitsShiftedOut) {
1711 // If we shifted bits out, the fold is not going to work out. As a
1712 // special case, check to see if this means that the result is always
1713 // true or false now.
1714 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1715 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1716 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1717 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1718 } else {
1719 Value *NewAnd = Builder.CreateAnd(
1720 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1721 return new ICmpInst(Cmp.getPredicate(),
1722 NewAnd, ConstantInt::get(And->getType(), NewCmpCst));
1723 }
1724 }
1725
1726 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1727 // preferable because it allows the C2 << Y expression to be hoisted out of a
1728 // loop if Y is invariant and X is not.
1729 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1730 !Shift->isArithmeticShift() && !isa<Constant>(Shift->getOperand(0))) {
1731 // Compute C2 << Y.
1732 Value *NewShift =
1733 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1734 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1735
1736 // Compute X & (C2 << Y).
1737 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1738 return replaceOperand(Cmp, 0, NewAnd);
1739 }
1740
1741 return nullptr;
1742}
1743
1744/// Fold icmp (and X, C2), C1.
1747 const APInt &C1) {
1748 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1749
1750 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1751 // TODO: We canonicalize to the longer form for scalars because we have
1752 // better analysis/folds for icmp, and codegen may be better with icmp.
1753 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1754 match(And->getOperand(1), m_One()))
1755 return new TruncInst(And->getOperand(0), Cmp.getType());
1756
1757 const APInt *C2;
1758 Value *X;
1759 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1760 return nullptr;
1761
1762 // Don't perform the following transforms if the AND has multiple uses
1763 if (!And->hasOneUse())
1764 return nullptr;
1765
1766 if (Cmp.isEquality() && C1.isZero()) {
1767 // Restrict this fold to single-use 'and' (PR10267).
1768 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1769 if (C2->isSignMask()) {
1770 Constant *Zero = Constant::getNullValue(X->getType());
1771 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1772 return new ICmpInst(NewPred, X, Zero);
1773 }
1774
1775 APInt NewC2 = *C2;
1776 KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
1777 // Set high zeros of C2 to allow matching negated power-of-2.
1778 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1779 Know.countMinLeadingZeros());
1780
1781 // Restrict this fold only for single-use 'and' (PR10267).
1782 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1783 if (NewC2.isNegatedPowerOf2()) {
1784 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1785 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1786 return new ICmpInst(NewPred, X, NegBOC);
1787 }
1788 }
1789
1790 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1791 // the input width without changing the value produced, eliminate the cast:
1792 //
1793 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1794 //
1795 // We can do this transformation if the constants do not have their sign bits
1796 // set or if it is an equality comparison. Extending a relational comparison
1797 // when we're checking the sign bit would not work.
1798 Value *W;
1799 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1800 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1801 // TODO: Is this a good transform for vectors? Wider types may reduce
1802 // throughput. Should this transform be limited (even for scalars) by using
1803 // shouldChangeType()?
1804 if (!Cmp.getType()->isVectorTy()) {
1805 Type *WideType = W->getType();
1806 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1807 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1808 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1809 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1810 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1811 }
1812 }
1813
1814 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1815 return I;
1816
1817 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1818 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1819 //
1820 // iff pred isn't signed
1821 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1822 match(And->getOperand(1), m_One())) {
1823 Constant *One = cast<Constant>(And->getOperand(1));
1824 Value *Or = And->getOperand(0);
1825 Value *A, *B, *LShr;
1826 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1827 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1828 unsigned UsesRemoved = 0;
1829 if (And->hasOneUse())
1830 ++UsesRemoved;
1831 if (Or->hasOneUse())
1832 ++UsesRemoved;
1833 if (LShr->hasOneUse())
1834 ++UsesRemoved;
1835
1836 // Compute A & ((1 << B) | 1)
1837 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1838 if (UsesRemoved >= RequireUsesRemoved) {
1839 Value *NewOr =
1840 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1841 /*HasNUW=*/true),
1842 One, Or->getName());
1843 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1844 return replaceOperand(Cmp, 0, NewAnd);
1845 }
1846 }
1847 }
1848
1849 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1850 // llvm.is.fpclass(X, fcInf|fcNan)
1851 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1852 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1853 Value *V;
1854 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1855 Attribute::NoImplicitFloat) &&
1856 Cmp.isEquality() &&
1858 Type *FPType = V->getType()->getScalarType();
1859 if (FPType->isIEEELikeFPTy() && C1 == *C2) {
1860 APInt ExponentMask =
1862 if (C1 == ExponentMask) {
1863 unsigned Mask = FPClassTest::fcNan | FPClassTest::fcInf;
1864 if (isICMP_NE)
1865 Mask = ~Mask & fcAllFlags;
1866 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1867 }
1868 }
1869 }
1870
1871 return nullptr;
1872}
1873
1874/// Fold icmp (and X, Y), C.
1877 const APInt &C) {
1878 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1879 return I;
1880
1881 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1882 bool TrueIfNeg;
1883 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1884 // ((X - 1) & ~X) < 0 --> X == 0
1885 // ((X - 1) & ~X) >= 0 --> X != 0
1886 Value *X;
1887 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1888 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1889 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1890 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1891 }
1892 // (X & -X) < 0 --> X == MinSignedC
1893 // (X & -X) > -1 --> X != MinSignedC
1894 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1895 Constant *MinSignedC = ConstantInt::get(
1896 X->getType(),
1897 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1898 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1899 return new ICmpInst(NewPred, X, MinSignedC);
1900 }
1901 }
1902
1903 // TODO: These all require that Y is constant too, so refactor with the above.
1904
1905 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1906 Value *X = And->getOperand(0);
1907 Value *Y = And->getOperand(1);
1908 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1909 if (auto *LI = dyn_cast<LoadInst>(X))
1910 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1911 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
1912 if (Instruction *Res =
1913 foldCmpLoadFromIndexedGlobal(LI, GEP, GV, Cmp, C2))
1914 return Res;
1915
1916 if (!Cmp.isEquality())
1917 return nullptr;
1918
1919 // X & -C == -C -> X > u ~C
1920 // X & -C != -C -> X <= u ~C
1921 // iff C is a power of 2
1922 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1923 auto NewPred =
1925 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1926 }
1927
1928 // If we are testing the intersection of 2 select-of-nonzero-constants with no
1929 // common bits set, it's the same as checking if exactly one select condition
1930 // is set:
1931 // ((A ? TC : FC) & (B ? TC : FC)) == 0 --> xor A, B
1932 // ((A ? TC : FC) & (B ? TC : FC)) != 0 --> not(xor A, B)
1933 // TODO: Generalize for non-constant values.
1934 // TODO: Handle signed/unsigned predicates.
1935 // TODO: Handle other bitwise logic connectors.
1936 // TODO: Extend to handle a non-zero compare constant.
1937 if (C.isZero() && (Pred == CmpInst::ICMP_EQ || And->hasOneUse())) {
1938 assert(Cmp.isEquality() && "Not expecting non-equality predicates");
1939 Value *A, *B;
1940 const APInt *TC, *FC;
1941 if (match(X, m_Select(m_Value(A), m_APInt(TC), m_APInt(FC))) &&
1942 match(Y,
1943 m_Select(m_Value(B), m_SpecificInt(*TC), m_SpecificInt(*FC))) &&
1944 !TC->isZero() && !FC->isZero() && !TC->intersects(*FC)) {
1945 Value *R = Builder.CreateXor(A, B);
1946 if (Pred == CmpInst::ICMP_NE)
1947 R = Builder.CreateNot(R);
1948 return replaceInstUsesWith(Cmp, R);
1949 }
1950 }
1951
1952 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1953 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1954 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1955 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1957 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1958 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1959 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1960 Value *And = Builder.CreateAnd(TruncY, X);
1962 }
1963 return BinaryOperator::CreateAnd(TruncY, X);
1964 }
1965
1966 // (icmp eq/ne (and (shl -1, X), Y), 0)
1967 // -> (icmp eq/ne (lshr Y, X), 0)
1968 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1969 // highly unlikely the non-zero case will ever show up in code.
1970 if (C.isZero() &&
1972 m_Value(Y))))) {
1973 Value *LShr = Builder.CreateLShr(Y, X);
1974 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
1975 }
1976
1977 return nullptr;
1978}
1979
1980/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
1982 InstCombiner::BuilderTy &Builder) {
1983 // Are we using xors or subs to bitwise check for a pair or pairs of
1984 // (in)equalities? Convert to a shorter form that has more potential to be
1985 // folded even further.
1986 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
1987 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
1988 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
1989 // (X1 == X2) && (X3 == X4) && (X5 == X6)
1990 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
1991 // (X1 != X2) || (X3 != X4) || (X5 != X6)
1993 SmallVector<Value *, 16> WorkList(1, Or);
1994
1995 while (!WorkList.empty()) {
1996 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
1997 Value *Lhs, *Rhs;
1998
1999 if (match(OrOperatorArgument,
2000 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2001 CmpValues.emplace_back(Lhs, Rhs);
2002 return;
2003 }
2004
2005 if (match(OrOperatorArgument,
2006 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2007 CmpValues.emplace_back(Lhs, Rhs);
2008 return;
2009 }
2010
2011 WorkList.push_back(OrOperatorArgument);
2012 };
2013
2014 Value *CurrentValue = WorkList.pop_back_val();
2015 Value *OrOperatorLhs, *OrOperatorRhs;
2016
2017 if (!match(CurrentValue,
2018 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2019 return nullptr;
2020 }
2021
2022 MatchOrOperatorArgument(OrOperatorRhs);
2023 MatchOrOperatorArgument(OrOperatorLhs);
2024 }
2025
2026 ICmpInst::Predicate Pred = Cmp.getPredicate();
2027 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2028 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2029 CmpValues.rbegin()->second);
2030
2031 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2032 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2033 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2034 }
2035
2036 return LhsCmp;
2037}
2038
2039/// Fold icmp (or X, Y), C.
2042 const APInt &C) {
2043 ICmpInst::Predicate Pred = Cmp.getPredicate();
2044 if (C.isOne()) {
2045 // icmp slt signum(V) 1 --> icmp slt V, 1
2046 Value *V = nullptr;
2047 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2048 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2049 ConstantInt::get(V->getType(), 1));
2050 }
2051
2052 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2053
2054 // (icmp eq/ne (or disjoint x, C0), C1)
2055 // -> (icmp eq/ne x, C0^C1)
2056 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2057 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2058 Value *NewC =
2059 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2060 return new ICmpInst(Pred, OrOp0, NewC);
2061 }
2062
2063 const APInt *MaskC;
2064 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2065 if (*MaskC == C && (C + 1).isPowerOf2()) {
2066 // X | C == C --> X <=u C
2067 // X | C != C --> X >u C
2068 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2070 return new ICmpInst(Pred, OrOp0, OrOp1);
2071 }
2072
2073 // More general: canonicalize 'equality with set bits mask' to
2074 // 'equality with clear bits mask'.
2075 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2076 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2077 if (Or->hasOneUse()) {
2078 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2079 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2080 return new ICmpInst(Pred, And, NewC);
2081 }
2082 }
2083
2084 // (X | (X-1)) s< 0 --> X s< 1
2085 // (X | (X-1)) s> -1 --> X s> 0
2086 Value *X;
2087 bool TrueIfSigned;
2088 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2090 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2091 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2092 return new ICmpInst(NewPred, X, NewC);
2093 }
2094
2095 const APInt *OrC;
2096 // icmp(X | OrC, C) --> icmp(X, 0)
2097 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2098 switch (Pred) {
2099 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2100 case ICmpInst::ICMP_SLT:
2101 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2102 case ICmpInst::ICMP_SGE:
2103 if (OrC->sge(C))
2104 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2105 break;
2106 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2107 case ICmpInst::ICMP_SLE:
2108 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2109 case ICmpInst::ICMP_SGT:
2110 if (OrC->sgt(C))
2112 ConstantInt::getNullValue(X->getType()));
2113 break;
2114 default:
2115 break;
2116 }
2117 }
2118
2119 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2120 return nullptr;
2121
2122 Value *P, *Q;
2124 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2125 // -> and (icmp eq P, null), (icmp eq Q, null).
2126 Value *CmpP =
2127 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2128 Value *CmpQ =
2130 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2131 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2132 }
2133
2134 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2135 return replaceInstUsesWith(Cmp, V);
2136
2137 return nullptr;
2138}
2139
2140/// Fold icmp (mul X, Y), C.
2143 const APInt &C) {
2144 ICmpInst::Predicate Pred = Cmp.getPredicate();
2145 Type *MulTy = Mul->getType();
2146 Value *X = Mul->getOperand(0);
2147
2148 // If there's no overflow:
2149 // X * X == 0 --> X == 0
2150 // X * X != 0 --> X != 0
2151 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2152 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2153 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2154
2155 const APInt *MulC;
2156 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2157 return nullptr;
2158
2159 // If this is a test of the sign bit and the multiply is sign-preserving with
2160 // a constant operand, use the multiply LHS operand instead:
2161 // (X * +MulC) < 0 --> X < 0
2162 // (X * -MulC) < 0 --> X > 0
2163 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2164 if (MulC->isNegative())
2165 Pred = ICmpInst::getSwappedPredicate(Pred);
2166 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2167 }
2168
2169 if (MulC->isZero())
2170 return nullptr;
2171
2172 // If the multiply does not wrap or the constant is odd, try to divide the
2173 // compare constant by the multiplication factor.
2174 if (Cmp.isEquality()) {
2175 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2176 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2177 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2178 return new ICmpInst(Pred, X, NewC);
2179 }
2180
2181 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2182 // correct to transform if MulC * N == C including overflow. I.e with i8
2183 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2184 // miss that case.
2185 if (C.urem(*MulC).isZero()) {
2186 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2187 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2188 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2189 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2190 return new ICmpInst(Pred, X, NewC);
2191 }
2192 }
2193 }
2194
2195 // With a matching no-overflow guarantee, fold the constants:
2196 // (X * MulC) < C --> X < (C / MulC)
2197 // (X * MulC) > C --> X > (C / MulC)
2198 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2199 Constant *NewC = nullptr;
2200 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2201 // MININT / -1 --> overflow.
2202 if (C.isMinSignedValue() && MulC->isAllOnes())
2203 return nullptr;
2204 if (MulC->isNegative())
2205 Pred = ICmpInst::getSwappedPredicate(Pred);
2206
2207 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2208 NewC = ConstantInt::get(
2210 } else {
2211 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2212 "Unexpected predicate");
2213 NewC = ConstantInt::get(
2215 }
2216 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2217 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2218 NewC = ConstantInt::get(
2220 } else {
2221 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2222 "Unexpected predicate");
2223 NewC = ConstantInt::get(
2225 }
2226 }
2227
2228 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2229}
2230
2231/// Fold icmp (shl 1, Y), C.
2233 const APInt &C) {
2234 Value *Y;
2235 if (!match(Shl, m_Shl(m_One(), m_Value(Y))))
2236 return nullptr;
2237
2238 Type *ShiftType = Shl->getType();
2239 unsigned TypeBits = C.getBitWidth();
2240 bool CIsPowerOf2 = C.isPowerOf2();
2241 ICmpInst::Predicate Pred = Cmp.getPredicate();
2242 if (Cmp.isUnsigned()) {
2243 // (1 << Y) pred C -> Y pred Log2(C)
2244 if (!CIsPowerOf2) {
2245 // (1 << Y) < 30 -> Y <= 4
2246 // (1 << Y) <= 30 -> Y <= 4
2247 // (1 << Y) >= 30 -> Y > 4
2248 // (1 << Y) > 30 -> Y > 4
2249 if (Pred == ICmpInst::ICMP_ULT)
2250 Pred = ICmpInst::ICMP_ULE;
2251 else if (Pred == ICmpInst::ICMP_UGE)
2252 Pred = ICmpInst::ICMP_UGT;
2253 }
2254
2255 unsigned CLog2 = C.logBase2();
2256 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2257 } else if (Cmp.isSigned()) {
2258 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2259 // (1 << Y) > 0 -> Y != 31
2260 // (1 << Y) > C -> Y != 31 if C is negative.
2261 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2262 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2263
2264 // (1 << Y) < 0 -> Y == 31
2265 // (1 << Y) < 1 -> Y == 31
2266 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2267 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2268 if (Pred == ICmpInst::ICMP_SLT && (C-1).sle(0))
2269 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2270 }
2271
2272 return nullptr;
2273}
2274
2275/// Fold icmp (shl X, Y), C.
2277 BinaryOperator *Shl,
2278 const APInt &C) {
2279 const APInt *ShiftVal;
2280 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2281 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2282
2283 ICmpInst::Predicate Pred = Cmp.getPredicate();
2284 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2285 // -> (icmp pred X, Csle0)
2286 //
2287 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2288 // so X's must be what is used.
2289 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2290 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2291
2292 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2293 // -> (icmp eq/ne X, 0)
2294 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2295 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2296 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2297
2298 // (icmp slt (shl nsw X, Y), 0/1)
2299 // -> (icmp slt X, 0/1)
2300 // (icmp sgt (shl nsw X, Y), 0/-1)
2301 // -> (icmp sgt X, 0/-1)
2302 //
2303 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2304 if (Shl->hasNoSignedWrap() &&
2305 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2306 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2307 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2308
2309 const APInt *ShiftAmt;
2310 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2311 return foldICmpShlOne(Cmp, Shl, C);
2312
2313 // Check that the shift amount is in range. If not, don't perform undefined
2314 // shifts. When the shift is visited, it will be simplified.
2315 unsigned TypeBits = C.getBitWidth();
2316 if (ShiftAmt->uge(TypeBits))
2317 return nullptr;
2318
2319 Value *X = Shl->getOperand(0);
2320 Type *ShType = Shl->getType();
2321
2322 // NSW guarantees that we are only shifting out sign bits from the high bits,
2323 // so we can ASHR the compare constant without needing a mask and eliminate
2324 // the shift.
2325 if (Shl->hasNoSignedWrap()) {
2326 if (Pred == ICmpInst::ICMP_SGT) {
2327 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2328 APInt ShiftedC = C.ashr(*ShiftAmt);
2329 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2330 }
2331 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2332 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2333 APInt ShiftedC = C.ashr(*ShiftAmt);
2334 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2335 }
2336 if (Pred == ICmpInst::ICMP_SLT) {
2337 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2338 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2339 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2340 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2341 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2342 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2343 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2344 }
2345 }
2346
2347 // NUW guarantees that we are only shifting out zero bits from the high bits,
2348 // so we can LSHR the compare constant without needing a mask and eliminate
2349 // the shift.
2350 if (Shl->hasNoUnsignedWrap()) {
2351 if (Pred == ICmpInst::ICMP_UGT) {
2352 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2353 APInt ShiftedC = C.lshr(*ShiftAmt);
2354 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2355 }
2356 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2357 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2358 APInt ShiftedC = C.lshr(*ShiftAmt);
2359 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2360 }
2361 if (Pred == ICmpInst::ICMP_ULT) {
2362 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2363 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2364 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2365 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2366 assert(C.ugt(0) && "ult 0 should have been eliminated");
2367 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2368 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2369 }
2370 }
2371
2372 if (Cmp.isEquality() && Shl->hasOneUse()) {
2373 // Strength-reduce the shift into an 'and'.
2374 Constant *Mask = ConstantInt::get(
2375 ShType,
2376 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2377 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2378 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2379 return new ICmpInst(Pred, And, LShrC);
2380 }
2381
2382 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2383 bool TrueIfSigned = false;
2384 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2385 // (X << 31) <s 0 --> (X & 1) != 0
2386 Constant *Mask = ConstantInt::get(
2387 ShType,
2388 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2389 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2390 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2391 And, Constant::getNullValue(ShType));
2392 }
2393
2394 // Simplify 'shl' inequality test into 'and' equality test.
2395 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2396 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2397 if ((C + 1).isPowerOf2() &&
2398 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2399 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2400 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2402 And, Constant::getNullValue(ShType));
2403 }
2404 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2405 if (C.isPowerOf2() &&
2406 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2407 Value *And =
2408 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2409 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2411 And, Constant::getNullValue(ShType));
2412 }
2413 }
2414
2415 // Transform (icmp pred iM (shl iM %v, N), C)
2416 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2417 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2418 // This enables us to get rid of the shift in favor of a trunc that may be
2419 // free on the target. It has the additional benefit of comparing to a
2420 // smaller constant that may be more target-friendly.
2421 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2422 if (Shl->hasOneUse() && Amt != 0 && C.countr_zero() >= Amt &&
2423 DL.isLegalInteger(TypeBits - Amt)) {
2424 Type *TruncTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt);
2425 if (auto *ShVTy = dyn_cast<VectorType>(ShType))
2426 TruncTy = VectorType::get(TruncTy, ShVTy->getElementCount());
2427 Constant *NewC =
2428 ConstantInt::get(TruncTy, C.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2429 return new ICmpInst(Pred, Builder.CreateTrunc(X, TruncTy), NewC);
2430 }
2431
2432 return nullptr;
2433}
2434
2435/// Fold icmp ({al}shr X, Y), C.
2437 BinaryOperator *Shr,
2438 const APInt &C) {
2439 // An exact shr only shifts out zero bits, so:
2440 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2441 Value *X = Shr->getOperand(0);
2442 CmpInst::Predicate Pred = Cmp.getPredicate();
2443 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2444 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2445
2446 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2447 const APInt *ShiftValC;
2448 if (match(X, m_APInt(ShiftValC))) {
2449 if (Cmp.isEquality())
2450 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2451
2452 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2453 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2454 bool TrueIfSigned;
2455 if (!IsAShr && ShiftValC->isNegative() &&
2456 isSignBitCheck(Pred, C, TrueIfSigned))
2457 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2458 Shr->getOperand(1),
2459 ConstantInt::getNullValue(X->getType()));
2460
2461 // If the shifted constant is a power-of-2, test the shift amount directly:
2462 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2463 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2464 if (!IsAShr && ShiftValC->isPowerOf2() &&
2465 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2466 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2467 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2468 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2469
2470 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2471 unsigned ShiftLZ = ShiftValC->countl_zero();
2472 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2473 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2474 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2475 }
2476 }
2477
2478 const APInt *ShiftAmtC;
2479 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2480 return nullptr;
2481
2482 // Check that the shift amount is in range. If not, don't perform undefined
2483 // shifts. When the shift is visited it will be simplified.
2484 unsigned TypeBits = C.getBitWidth();
2485 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2486 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2487 return nullptr;
2488
2489 bool IsExact = Shr->isExact();
2490 Type *ShrTy = Shr->getType();
2491 // TODO: If we could guarantee that InstSimplify would handle all of the
2492 // constant-value-based preconditions in the folds below, then we could assert
2493 // those conditions rather than checking them. This is difficult because of
2494 // undef/poison (PR34838).
2495 if (IsAShr && Shr->hasOneUse()) {
2496 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2497 // When ShAmtC can be shifted losslessly:
2498 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2499 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2500 APInt ShiftedC = C.shl(ShAmtVal);
2501 if (ShiftedC.ashr(ShAmtVal) == C)
2502 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2503 }
2504 if (Pred == CmpInst::ICMP_SGT) {
2505 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2506 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2507 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2508 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2509 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2510 }
2511 if (Pred == CmpInst::ICMP_UGT) {
2512 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2513 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2514 // clause accounts for that pattern.
2515 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2516 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2517 (C + 1).shl(ShAmtVal).isMinSignedValue())
2518 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2519 }
2520
2521 // If the compare constant has significant bits above the lowest sign-bit,
2522 // then convert an unsigned cmp to a test of the sign-bit:
2523 // (ashr X, ShiftC) u> C --> X s< 0
2524 // (ashr X, ShiftC) u< C --> X s> -1
2525 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2526 if (Pred == CmpInst::ICMP_UGT) {
2527 return new ICmpInst(CmpInst::ICMP_SLT, X,
2529 }
2530 if (Pred == CmpInst::ICMP_ULT) {
2531 return new ICmpInst(CmpInst::ICMP_SGT, X,
2533 }
2534 }
2535 } else if (!IsAShr) {
2536 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2537 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2538 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2539 APInt ShiftedC = C.shl(ShAmtVal);
2540 if (ShiftedC.lshr(ShAmtVal) == C)
2541 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2542 }
2543 if (Pred == CmpInst::ICMP_UGT) {
2544 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2545 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2546 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2547 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2548 }
2549 }
2550
2551 if (!Cmp.isEquality())
2552 return nullptr;
2553
2554 // Handle equality comparisons of shift-by-constant.
2555
2556 // If the comparison constant changes with the shift, the comparison cannot
2557 // succeed (bits of the comparison constant cannot match the shifted value).
2558 // This should be known by InstSimplify and already be folded to true/false.
2559 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2560 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2561 "Expected icmp+shr simplify did not occur.");
2562
2563 // If the bits shifted out are known zero, compare the unshifted value:
2564 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2565 if (Shr->isExact())
2566 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2567
2568 if (C.isZero()) {
2569 // == 0 is u< 1.
2570 if (Pred == CmpInst::ICMP_EQ)
2571 return new ICmpInst(CmpInst::ICMP_ULT, X,
2572 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal)));
2573 else
2574 return new ICmpInst(CmpInst::ICMP_UGT, X,
2575 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal) - 1));
2576 }
2577
2578 if (Shr->hasOneUse()) {
2579 // Canonicalize the shift into an 'and':
2580 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2581 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2582 Constant *Mask = ConstantInt::get(ShrTy, Val);
2583 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2584 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2585 }
2586
2587 return nullptr;
2588}
2589
2591 BinaryOperator *SRem,
2592 const APInt &C) {
2593 // Match an 'is positive' or 'is negative' comparison of remainder by a
2594 // constant power-of-2 value:
2595 // (X % pow2C) sgt/slt 0
2596 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2597 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2598 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2599 return nullptr;
2600
2601 // TODO: The one-use check is standard because we do not typically want to
2602 // create longer instruction sequences, but this might be a special-case
2603 // because srem is not good for analysis or codegen.
2604 if (!SRem->hasOneUse())
2605 return nullptr;
2606
2607 const APInt *DivisorC;
2608 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2609 return nullptr;
2610
2611 // For cmp_sgt/cmp_slt only zero valued C is handled.
2612 // For cmp_eq/cmp_ne only positive valued C is handled.
2613 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2614 !C.isZero()) ||
2615 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2616 !C.isStrictlyPositive()))
2617 return nullptr;
2618
2619 // Mask off the sign bit and the modulo bits (low-bits).
2620 Type *Ty = SRem->getType();
2622 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2623 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2624
2625 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2626 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2627
2628 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2629 // bit is set. Example:
2630 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2631 if (Pred == ICmpInst::ICMP_SGT)
2633
2634 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2635 // bit is set. Example:
2636 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2637 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2638}
2639
2640/// Fold icmp (udiv X, Y), C.
2642 BinaryOperator *UDiv,
2643 const APInt &C) {
2644 ICmpInst::Predicate Pred = Cmp.getPredicate();
2645 Value *X = UDiv->getOperand(0);
2646 Value *Y = UDiv->getOperand(1);
2647 Type *Ty = UDiv->getType();
2648
2649 const APInt *C2;
2650 if (!match(X, m_APInt(C2)))
2651 return nullptr;
2652
2653 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2654
2655 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2656 if (Pred == ICmpInst::ICMP_UGT) {
2657 assert(!C.isMaxValue() &&
2658 "icmp ugt X, UINT_MAX should have been simplified already.");
2659 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2660 ConstantInt::get(Ty, C2->udiv(C + 1)));
2661 }
2662
2663 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2664 if (Pred == ICmpInst::ICMP_ULT) {
2665 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2666 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2667 ConstantInt::get(Ty, C2->udiv(C)));
2668 }
2669
2670 return nullptr;
2671}
2672
2673/// Fold icmp ({su}div X, Y), C.
2675 BinaryOperator *Div,
2676 const APInt &C) {
2677 ICmpInst::Predicate Pred = Cmp.getPredicate();
2678 Value *X = Div->getOperand(0);
2679 Value *Y = Div->getOperand(1);
2680 Type *Ty = Div->getType();
2681 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2682
2683 // If unsigned division and the compare constant is bigger than
2684 // UMAX/2 (negative), there's only one pair of values that satisfies an
2685 // equality check, so eliminate the division:
2686 // (X u/ Y) == C --> (X == C) && (Y == 1)
2687 // (X u/ Y) != C --> (X != C) || (Y != 1)
2688 // Similarly, if signed division and the compare constant is exactly SMIN:
2689 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2690 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2691 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2692 (!DivIsSigned || C.isMinSignedValue())) {
2693 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2694 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2695 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2696 return BinaryOperator::Create(Logic, XBig, YOne);
2697 }
2698
2699 // Fold: icmp pred ([us]div X, C2), C -> range test
2700 // Fold this div into the comparison, producing a range check.
2701 // Determine, based on the divide type, what the range is being
2702 // checked. If there is an overflow on the low or high side, remember
2703 // it, otherwise compute the range [low, hi) bounding the new value.
2704 // See: InsertRangeTest above for the kinds of replacements possible.
2705 const APInt *C2;
2706 if (!match(Y, m_APInt(C2)))
2707 return nullptr;
2708
2709 // FIXME: If the operand types don't match the type of the divide
2710 // then don't attempt this transform. The code below doesn't have the
2711 // logic to deal with a signed divide and an unsigned compare (and
2712 // vice versa). This is because (x /s C2) <s C produces different
2713 // results than (x /s C2) <u C or (x /u C2) <s C or even
2714 // (x /u C2) <u C. Simply casting the operands and result won't
2715 // work. :( The if statement below tests that condition and bails
2716 // if it finds it.
2717 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2718 return nullptr;
2719
2720 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2721 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2722 // division-by-constant cases should be present, we can not assert that they
2723 // have happened before we reach this icmp instruction.
2724 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2725 return nullptr;
2726
2727 // Compute Prod = C * C2. We are essentially solving an equation of
2728 // form X / C2 = C. We solve for X by multiplying C2 and C.
2729 // By solving for X, we can turn this into a range check instead of computing
2730 // a divide.
2731 APInt Prod = C * *C2;
2732
2733 // Determine if the product overflows by seeing if the product is not equal to
2734 // the divide. Make sure we do the same kind of divide as in the LHS
2735 // instruction that we're folding.
2736 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2737
2738 // If the division is known to be exact, then there is no remainder from the
2739 // divide, so the covered range size is unit, otherwise it is the divisor.
2740 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2741
2742 // Figure out the interval that is being checked. For example, a comparison
2743 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2744 // Compute this interval based on the constants involved and the signedness of
2745 // the compare/divide. This computes a half-open interval, keeping track of
2746 // whether either value in the interval overflows. After analysis each
2747 // overflow variable is set to 0 if it's corresponding bound variable is valid
2748 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2749 int LoOverflow = 0, HiOverflow = 0;
2750 APInt LoBound, HiBound;
2751
2752 if (!DivIsSigned) { // udiv
2753 // e.g. X/5 op 3 --> [15, 20)
2754 LoBound = Prod;
2755 HiOverflow = LoOverflow = ProdOV;
2756 if (!HiOverflow) {
2757 // If this is not an exact divide, then many values in the range collapse
2758 // to the same result value.
2759 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2760 }
2761 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2762 if (C.isZero()) { // (X / pos) op 0
2763 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2764 LoBound = -(RangeSize - 1);
2765 HiBound = RangeSize;
2766 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2767 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2768 HiOverflow = LoOverflow = ProdOV;
2769 if (!HiOverflow)
2770 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2771 } else { // (X / pos) op neg
2772 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2773 HiBound = Prod + 1;
2774 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2775 if (!LoOverflow) {
2776 APInt DivNeg = -RangeSize;
2777 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2778 }
2779 }
2780 } else if (C2->isNegative()) { // Divisor is < 0.
2781 if (Div->isExact())
2782 RangeSize.negate();
2783 if (C.isZero()) { // (X / neg) op 0
2784 // e.g. X/-5 op 0 --> [-4, 5)
2785 LoBound = RangeSize + 1;
2786 HiBound = -RangeSize;
2787 if (HiBound == *C2) { // -INTMIN = INTMIN
2788 HiOverflow = 1; // [INTMIN+1, overflow)
2789 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2790 }
2791 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2792 // e.g. X/-5 op 3 --> [-19, -14)
2793 HiBound = Prod + 1;
2794 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2795 if (!LoOverflow)
2796 LoOverflow =
2797 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2798 } else { // (X / neg) op neg
2799 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2800 LoOverflow = HiOverflow = ProdOV;
2801 if (!HiOverflow)
2802 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2803 }
2804
2805 // Dividing by a negative swaps the condition. LT <-> GT
2806 Pred = ICmpInst::getSwappedPredicate(Pred);
2807 }
2808
2809 switch (Pred) {
2810 default:
2811 llvm_unreachable("Unhandled icmp predicate!");
2812 case ICmpInst::ICMP_EQ:
2813 if (LoOverflow && HiOverflow)
2814 return replaceInstUsesWith(Cmp, Builder.getFalse());
2815 if (HiOverflow)
2816 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2817 X, ConstantInt::get(Ty, LoBound));
2818 if (LoOverflow)
2819 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2820 X, ConstantInt::get(Ty, HiBound));
2821 return replaceInstUsesWith(
2822 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2823 case ICmpInst::ICMP_NE:
2824 if (LoOverflow && HiOverflow)
2825 return replaceInstUsesWith(Cmp, Builder.getTrue());
2826 if (HiOverflow)
2827 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2828 X, ConstantInt::get(Ty, LoBound));
2829 if (LoOverflow)
2830 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2831 X, ConstantInt::get(Ty, HiBound));
2832 return replaceInstUsesWith(
2833 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2834 case ICmpInst::ICMP_ULT:
2835 case ICmpInst::ICMP_SLT:
2836 if (LoOverflow == +1) // Low bound is greater than input range.
2837 return replaceInstUsesWith(Cmp, Builder.getTrue());
2838 if (LoOverflow == -1) // Low bound is less than input range.
2839 return replaceInstUsesWith(Cmp, Builder.getFalse());
2840 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2841 case ICmpInst::ICMP_UGT:
2842 case ICmpInst::ICMP_SGT:
2843 if (HiOverflow == +1) // High bound greater than input range.
2844 return replaceInstUsesWith(Cmp, Builder.getFalse());
2845 if (HiOverflow == -1) // High bound less than input range.
2846 return replaceInstUsesWith(Cmp, Builder.getTrue());
2847 if (Pred == ICmpInst::ICMP_UGT)
2848 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2849 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2850 }
2851
2852 return nullptr;
2853}
2854
2855/// Fold icmp (sub X, Y), C.
2857 BinaryOperator *Sub,
2858 const APInt &C) {
2859 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2860 ICmpInst::Predicate Pred = Cmp.getPredicate();
2861 Type *Ty = Sub->getType();
2862
2863 // (SubC - Y) == C) --> Y == (SubC - C)
2864 // (SubC - Y) != C) --> Y != (SubC - C)
2865 Constant *SubC;
2866 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2867 return new ICmpInst(Pred, Y,
2868 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2869 }
2870
2871 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2872 const APInt *C2;
2873 APInt SubResult;
2874 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2875 bool HasNSW = Sub->hasNoSignedWrap();
2876 bool HasNUW = Sub->hasNoUnsignedWrap();
2877 if (match(X, m_APInt(C2)) &&
2878 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2879 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2880 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2881
2882 // X - Y == 0 --> X == Y.
2883 // X - Y != 0 --> X != Y.
2884 // TODO: We allow this with multiple uses as long as the other uses are not
2885 // in phis. The phi use check is guarding against a codegen regression
2886 // for a loop test. If the backend could undo this (and possibly
2887 // subsequent transforms), we would not need this hack.
2888 if (Cmp.isEquality() && C.isZero() &&
2889 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2890 return new ICmpInst(Pred, X, Y);
2891
2892 // The following transforms are only worth it if the only user of the subtract
2893 // is the icmp.
2894 // TODO: This is an artificial restriction for all of the transforms below
2895 // that only need a single replacement icmp. Can these use the phi test
2896 // like the transform above here?
2897 if (!Sub->hasOneUse())
2898 return nullptr;
2899
2900 if (Sub->hasNoSignedWrap()) {
2901 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
2902 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
2903 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
2904
2905 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
2906 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
2907 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
2908
2909 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
2910 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
2911 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
2912
2913 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
2914 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
2915 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
2916 }
2917
2918 if (!match(X, m_APInt(C2)))
2919 return nullptr;
2920
2921 // C2 - Y <u C -> (Y | (C - 1)) == C2
2922 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
2923 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
2924 (*C2 & (C - 1)) == (C - 1))
2925 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
2926
2927 // C2 - Y >u C -> (Y | C) != C2
2928 // iff C2 & C == C and C + 1 is a power of 2
2929 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
2930 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
2931
2932 // We have handled special cases that reduce.
2933 // Canonicalize any remaining sub to add as:
2934 // (C2 - Y) > C --> (Y + ~C2) < ~C
2935 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
2936 HasNUW, HasNSW);
2937 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
2938}
2939
2940static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
2941 Value *Op1, IRBuilderBase &Builder,
2942 bool HasOneUse) {
2943 auto FoldConstant = [&](bool Val) {
2944 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
2945 if (Op0->getType()->isVectorTy())
2947 cast<VectorType>(Op0->getType())->getElementCount(), Res);
2948 return Res;
2949 };
2950
2951 switch (Table.to_ulong()) {
2952 case 0: // 0 0 0 0
2953 return FoldConstant(false);
2954 case 1: // 0 0 0 1
2955 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
2956 case 2: // 0 0 1 0
2957 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
2958 case 3: // 0 0 1 1
2959 return Builder.CreateNot(Op0);
2960 case 4: // 0 1 0 0
2961 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
2962 case 5: // 0 1 0 1
2963 return Builder.CreateNot(Op1);
2964 case 6: // 0 1 1 0
2965 return Builder.CreateXor(Op0, Op1);
2966 case 7: // 0 1 1 1
2967 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
2968 case 8: // 1 0 0 0
2969 return Builder.CreateAnd(Op0, Op1);
2970 case 9: // 1 0 0 1
2971 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
2972 case 10: // 1 0 1 0
2973 return Op1;
2974 case 11: // 1 0 1 1
2975 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
2976 case 12: // 1 1 0 0
2977 return Op0;
2978 case 13: // 1 1 0 1
2979 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
2980 case 14: // 1 1 1 0
2981 return Builder.CreateOr(Op0, Op1);
2982 case 15: // 1 1 1 1
2983 return FoldConstant(true);
2984 default:
2985 llvm_unreachable("Invalid Operation");
2986 }
2987 return nullptr;
2988}
2989
2990/// Fold icmp (add X, Y), C.
2993 const APInt &C) {
2994 Value *Y = Add->getOperand(1);
2995 Value *X = Add->getOperand(0);
2996
2997 Value *Op0, *Op1;
2998 Instruction *Ext0, *Ext1;
2999 const CmpInst::Predicate Pred = Cmp.getPredicate();
3000 if (match(Add,
3003 m_ZExtOrSExt(m_Value(Op1))))) &&
3004 Op0->getType()->isIntOrIntVectorTy(1) &&
3005 Op1->getType()->isIntOrIntVectorTy(1)) {
3006 unsigned BW = C.getBitWidth();
3007 std::bitset<4> Table;
3008 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
3009 int Res = 0;
3010 if (Op0Val)
3011 Res += isa<ZExtInst>(Ext0) ? 1 : -1;
3012 if (Op1Val)
3013 Res += isa<ZExtInst>(Ext1) ? 1 : -1;
3014 return ICmpInst::compare(APInt(BW, Res, true), C, Pred);
3015 };
3016
3017 Table[0] = ComputeTable(false, false);
3018 Table[1] = ComputeTable(false, true);
3019 Table[2] = ComputeTable(true, false);
3020 Table[3] = ComputeTable(true, true);
3021 if (auto *Cond =
3022 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3023 return replaceInstUsesWith(Cmp, Cond);
3024 }
3025 const APInt *C2;
3026 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3027 return nullptr;
3028
3029 // Fold icmp pred (add X, C2), C.
3030 Type *Ty = Add->getType();
3031
3032 // If the add does not wrap, we can always adjust the compare by subtracting
3033 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3034 // are canonicalized to SGT/SLT/UGT/ULT.
3035 if ((Add->hasNoSignedWrap() &&
3036 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT)) ||
3037 (Add->hasNoUnsignedWrap() &&
3038 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT))) {
3039 bool Overflow;
3040 APInt NewC =
3041 Cmp.isSigned() ? C.ssub_ov(*C2, Overflow) : C.usub_ov(*C2, Overflow);
3042 // If there is overflow, the result must be true or false.
3043 // TODO: Can we assert there is no overflow because InstSimplify always
3044 // handles those cases?
3045 if (!Overflow)
3046 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3047 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3048 }
3049
3050 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3051 const APInt &Upper = CR.getUpper();
3052 const APInt &Lower = CR.getLower();
3053 if (Cmp.isSigned()) {
3054 if (Lower.isSignMask())
3055 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3056 if (Upper.isSignMask())
3057 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3058 } else {
3059 if (Lower.isMinValue())
3060 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3061 if (Upper.isMinValue())
3062 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3063 }
3064
3065 // This set of folds is intentionally placed after folds that use no-wrapping
3066 // flags because those folds are likely better for later analysis/codegen.
3069
3070 // Fold compare with offset to opposite sign compare if it eliminates offset:
3071 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3072 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3073 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3074
3075 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3076 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3077 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3078
3079 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3080 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3081 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3082
3083 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3084 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3085 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3086
3087 // (X + -1) <u C --> X <=u C (if X is never null)
3088 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3089 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3090 if (llvm::isKnownNonZero(X, Q))
3091 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3092 }
3093
3094 if (!Add->hasOneUse())
3095 return nullptr;
3096
3097 // X+C <u C2 -> (X & -C2) == C
3098 // iff C & (C2-1) == 0
3099 // C2 is a power of 2
3100 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3102 ConstantExpr::getNeg(cast<Constant>(Y)));
3103
3104 // X+C >u C2 -> (X & ~C2) != C
3105 // iff C & C2 == 0
3106 // C2+1 is a power of 2
3107 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3109 ConstantExpr::getNeg(cast<Constant>(Y)));
3110
3111 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3112 // to the ult form.
3113 // X+C2 >u C -> X+(C2-C-1) <u ~C
3114 if (Pred == ICmpInst::ICMP_UGT)
3115 return new ICmpInst(ICmpInst::ICMP_ULT,
3116 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3117 ConstantInt::get(Ty, ~C));
3118
3119 return nullptr;
3120}
3121
3123 Value *&RHS, ConstantInt *&Less,
3124 ConstantInt *&Equal,
3125 ConstantInt *&Greater) {
3126 // TODO: Generalize this to work with other comparison idioms or ensure
3127 // they get canonicalized into this form.
3128
3129 // select i1 (a == b),
3130 // i32 Equal,
3131 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3132 // where Equal, Less and Greater are placeholders for any three constants.
3133 ICmpInst::Predicate PredA;
3134 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3135 !ICmpInst::isEquality(PredA))
3136 return false;
3137 Value *EqualVal = SI->getTrueValue();
3138 Value *UnequalVal = SI->getFalseValue();
3139 // We still can get non-canonical predicate here, so canonicalize.
3140 if (PredA == ICmpInst::ICMP_NE)
3141 std::swap(EqualVal, UnequalVal);
3142 if (!match(EqualVal, m_ConstantInt(Equal)))
3143 return false;
3144 ICmpInst::Predicate PredB;
3145 Value *LHS2, *RHS2;
3146 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3147 m_ConstantInt(Less), m_ConstantInt(Greater))))
3148 return false;
3149 // We can get predicate mismatch here, so canonicalize if possible:
3150 // First, ensure that 'LHS' match.
3151 if (LHS2 != LHS) {
3152 // x sgt y <--> y slt x
3153 std::swap(LHS2, RHS2);
3154 PredB = ICmpInst::getSwappedPredicate(PredB);
3155 }
3156 if (LHS2 != LHS)
3157 return false;
3158 // We also need to canonicalize 'RHS'.
3159 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3160 // x sgt C-1 <--> x sge C <--> not(x slt C)
3161 auto FlippedStrictness =
3163 PredB, cast<Constant>(RHS2));
3164 if (!FlippedStrictness)
3165 return false;
3166 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3167 "basic correctness failure");
3168 RHS2 = FlippedStrictness->second;
3169 // And kind-of perform the result swap.
3170 std::swap(Less, Greater);
3171 PredB = ICmpInst::ICMP_SLT;
3172 }
3173 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3174}
3175
3178 ConstantInt *C) {
3179
3180 assert(C && "Cmp RHS should be a constant int!");
3181 // If we're testing a constant value against the result of a three way
3182 // comparison, the result can be expressed directly in terms of the
3183 // original values being compared. Note: We could possibly be more
3184 // aggressive here and remove the hasOneUse test. The original select is
3185 // really likely to simplify or sink when we remove a test of the result.
3186 Value *OrigLHS, *OrigRHS;
3187 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3188 if (Cmp.hasOneUse() &&
3189 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3190 C3GreaterThan)) {
3191 assert(C1LessThan && C2Equal && C3GreaterThan);
3192
3193 bool TrueWhenLessThan =
3194 ConstantExpr::getCompare(Cmp.getPredicate(), C1LessThan, C)
3195 ->isAllOnesValue();
3196 bool TrueWhenEqual =
3197 ConstantExpr::getCompare(Cmp.getPredicate(), C2Equal, C)
3198 ->isAllOnesValue();
3199 bool TrueWhenGreaterThan =
3200 ConstantExpr::getCompare(Cmp.getPredicate(), C3GreaterThan, C)
3201 ->isAllOnesValue();
3202
3203 // This generates the new instruction that will replace the original Cmp
3204 // Instruction. Instead of enumerating the various combinations when
3205 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3206 // false, we rely on chaining of ORs and future passes of InstCombine to
3207 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3208
3209 // When none of the three constants satisfy the predicate for the RHS (C),
3210 // the entire original Cmp can be simplified to a false.
3212 if (TrueWhenLessThan)
3214 OrigLHS, OrigRHS));
3215 if (TrueWhenEqual)
3217 OrigLHS, OrigRHS));
3218 if (TrueWhenGreaterThan)
3220 OrigLHS, OrigRHS));
3221
3222 return replaceInstUsesWith(Cmp, Cond);
3223 }
3224 return nullptr;
3225}
3226
3228 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3229 if (!Bitcast)
3230 return nullptr;
3231
3232 ICmpInst::Predicate Pred = Cmp.getPredicate();
3233 Value *Op1 = Cmp.getOperand(1);
3234 Value *BCSrcOp = Bitcast->getOperand(0);
3235 Type *SrcType = Bitcast->getSrcTy();
3236 Type *DstType = Bitcast->getType();
3237
3238 // Make sure the bitcast doesn't change between scalar and vector and
3239 // doesn't change the number of vector elements.
3240 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3241 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3242 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3243 Value *X;
3244 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3245 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3246 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3247 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3248 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3249 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3250 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3251 match(Op1, m_Zero()))
3252 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3253
3254 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3255 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3256 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3257
3258 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3259 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3260 return new ICmpInst(Pred, X,
3261 ConstantInt::getAllOnesValue(X->getType()));
3262 }
3263
3264 // Zero-equality checks are preserved through unsigned floating-point casts:
3265 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3266 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3267 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3268 if (Cmp.isEquality() && match(Op1, m_Zero()))
3269 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3270
3271 const APInt *C;
3272 bool TrueIfSigned;
3273 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3274 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3275 // the FP extend/truncate because that cast does not change the sign-bit.
3276 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3277 // The sign-bit is always the most significant bit in those types.
3278 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3279 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3280 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3281 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3282 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3283 Type *XType = X->getType();
3284
3285 // We can't currently handle Power style floating point operations here.
3286 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3287 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3288 if (auto *XVTy = dyn_cast<VectorType>(XType))
3289 NewType = VectorType::get(NewType, XVTy->getElementCount());
3290 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3291 if (TrueIfSigned)
3292 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3293 ConstantInt::getNullValue(NewType));
3294 else
3295 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3297 }
3298 }
3299
3300 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3301 Type *FPType = SrcType->getScalarType();
3302 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3303 Attribute::NoImplicitFloat) &&
3304 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3305 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3306 if (Mask & (fcInf | fcZero)) {
3307 if (Pred == ICmpInst::ICMP_NE)
3308 Mask = ~Mask;
3309 return replaceInstUsesWith(Cmp,
3310 Builder.createIsFPClass(BCSrcOp, Mask));
3311 }
3312 }
3313 }
3314 }
3315
3316 const APInt *C;
3317 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3318 !SrcType->isIntOrIntVectorTy())
3319 return nullptr;
3320
3321 // If this is checking if all elements of a vector compare are set or not,
3322 // invert the casted vector equality compare and test if all compare
3323 // elements are clear or not. Compare against zero is generally easier for
3324 // analysis and codegen.
3325 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3326 // Example: are all elements equal? --> are zero elements not equal?
3327 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3328 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3329 if (Value *NotBCSrcOp =
3330 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3331 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3332 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3333 }
3334 }
3335
3336 // If this is checking if all elements of an extended vector are clear or not,
3337 // compare in a narrow type to eliminate the extend:
3338 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3339 Value *X;
3340 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3341 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3342 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3343 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3344 Value *NewCast = Builder.CreateBitCast(X, NewType);
3345 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3346 }
3347 }
3348
3349 // Folding: icmp <pred> iN X, C
3350 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3351 // and C is a splat of a K-bit pattern
3352 // and SC is a constant vector = <C', C', C', ..., C'>
3353 // Into:
3354 // %E = extractelement <M x iK> %vec, i32 C'
3355 // icmp <pred> iK %E, trunc(C)
3356 Value *Vec;
3357 ArrayRef<int> Mask;
3358 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3359 // Check whether every element of Mask is the same constant
3360 if (all_equal(Mask)) {
3361 auto *VecTy = cast<VectorType>(SrcType);
3362 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3363 if (C->isSplat(EltTy->getBitWidth())) {
3364 // Fold the icmp based on the value of C
3365 // If C is M copies of an iK sized bit pattern,
3366 // then:
3367 // => %E = extractelement <N x iK> %vec, i32 Elem
3368 // icmp <pred> iK %SplatVal, <pattern>
3369 Value *Elem = Builder.getInt32(Mask[0]);
3370 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3371 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3372 return new ICmpInst(Pred, Extract, NewC);
3373 }
3374 }
3375 }
3376 return nullptr;
3377}
3378
3379/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3380/// where X is some kind of instruction.
3382 const APInt *C;
3383
3384 if (match(Cmp.getOperand(1), m_APInt(C))) {
3385 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3386 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3387 return I;
3388
3389 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3390 // For now, we only support constant integers while folding the
3391 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3392 // similar to the cases handled by binary ops above.
3393 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3394 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3395 return I;
3396
3397 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3398 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3399 return I;
3400
3401 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3402 if (Instruction *I = foldICmpIntrinsicWithConstant(Cmp, II, *C))
3403 return I;
3404
3405 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3406 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3407 // TODO: This checks one-use, but that is not strictly necessary.
3408 Value *Cmp0 = Cmp.getOperand(0);
3409 Value *X, *Y;
3410 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3411 (match(Cmp0,
3412 m_ExtractValue<0>(m_Intrinsic<Intrinsic::ssub_with_overflow>(
3413 m_Value(X), m_Value(Y)))) ||
3414 match(Cmp0,
3415 m_ExtractValue<0>(m_Intrinsic<Intrinsic::usub_with_overflow>(
3416 m_Value(X), m_Value(Y))))))
3417 return new ICmpInst(Cmp.getPredicate(), X, Y);
3418 }
3419
3420 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3422
3423 return nullptr;
3424}
3425
3426/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3427/// icmp eq/ne BO, C.
3429 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3430 // TODO: Some of these folds could work with arbitrary constants, but this
3431 // function is limited to scalar and vector splat constants.
3432 if (!Cmp.isEquality())
3433 return nullptr;
3434
3435 ICmpInst::Predicate Pred = Cmp.getPredicate();
3436 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3437 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3438 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3439
3440 switch (BO->getOpcode()) {
3441 case Instruction::SRem:
3442 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3443 if (C.isZero() && BO->hasOneUse()) {
3444 const APInt *BOC;
3445 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3446 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3447 return new ICmpInst(Pred, NewRem,
3449 }
3450 }
3451 break;
3452 case Instruction::Add: {
3453 // (A + C2) == C --> A == (C - C2)
3454 // (A + C2) != C --> A != (C - C2)
3455 // TODO: Remove the one-use limitation? See discussion in D58633.
3456 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3457 if (BO->hasOneUse())
3458 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3459 } else if (C.isZero()) {
3460 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3461 // efficiently invertible, or if the add has just this one use.
3462 if (Value *NegVal = dyn_castNegVal(BOp1))
3463 return new ICmpInst(Pred, BOp0, NegVal);
3464 if (Value *NegVal = dyn_castNegVal(BOp0))
3465 return new ICmpInst(Pred, NegVal, BOp1);
3466 if (BO->hasOneUse()) {
3467 // (add nuw A, B) != 0 -> (or A, B) != 0
3468 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3469 Value *Or = Builder.CreateOr(BOp0, BOp1);
3470 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3471 }
3472 Value *Neg = Builder.CreateNeg(BOp1);
3473 Neg->takeName(BO);
3474 return new ICmpInst(Pred, BOp0, Neg);
3475 }
3476 }
3477 break;
3478 }
3479 case Instruction::Xor:
3480 if (BO->hasOneUse()) {
3481 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3482 // For the xor case, we can xor two constants together, eliminating
3483 // the explicit xor.
3484 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3485 } else if (C.isZero()) {
3486 // Replace ((xor A, B) != 0) with (A != B)
3487 return new ICmpInst(Pred, BOp0, BOp1);
3488 }
3489 }
3490 break;
3491 case Instruction::Or: {
3492 const APInt *BOC;
3493 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3494 // Comparing if all bits outside of a constant mask are set?
3495 // Replace (X | C) == -1 with (X & ~C) == ~C.
3496 // This removes the -1 constant.
3497 Constant *NotBOC = ConstantExpr::getNot(cast<Constant>(BOp1));
3498 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3499 return new ICmpInst(Pred, And, NotBOC);
3500 }
3501 break;
3502 }
3503 case Instruction::UDiv:
3504 case Instruction::SDiv:
3505 if (BO->isExact()) {
3506 // div exact X, Y eq/ne 0 -> X eq/ne 0
3507 // div exact X, Y eq/ne 1 -> X eq/ne Y
3508 // div exact X, Y eq/ne C ->
3509 // if Y * C never-overflow && OneUse:
3510 // -> Y * C eq/ne X
3511 if (C.isZero())
3512 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3513 else if (C.isOne())
3514 return new ICmpInst(Pred, BOp0, BOp1);
3515 else if (BO->hasOneUse()) {
3517 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3518 Cmp.getOperand(1), BO);
3520 Value *YC =
3521 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3522 return new ICmpInst(Pred, YC, BOp0);
3523 }
3524 }
3525 }
3526 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3527 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3528 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3529 return new ICmpInst(NewPred, BOp1, BOp0);
3530 }
3531 break;
3532 default:
3533 break;
3534 }
3535 return nullptr;
3536}
3537
3539 const APInt &CRhs,
3540 InstCombiner::BuilderTy &Builder,
3541 const SimplifyQuery &Q) {
3542 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3543 "Non-ctpop intrin in ctpop fold");
3544 if (!CtpopLhs->hasOneUse())
3545 return nullptr;
3546
3547 // Power of 2 test:
3548 // isPow2OrZero : ctpop(X) u< 2
3549 // isPow2 : ctpop(X) == 1
3550 // NotPow2OrZero: ctpop(X) u> 1
3551 // NotPow2 : ctpop(X) != 1
3552 // If we know any bit of X can be folded to:
3553 // IsPow2 : X & (~Bit) == 0
3554 // NotPow2 : X & (~Bit) != 0
3555 const ICmpInst::Predicate Pred = I.getPredicate();
3556 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3557 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3558 Value *Op = CtpopLhs->getArgOperand(0);
3559 KnownBits OpKnown = computeKnownBits(Op, Q.DL,
3560 /*Depth*/ 0, Q.AC, Q.CxtI, Q.DT);
3561 // No need to check for count > 1, that should be already constant folded.
3562 if (OpKnown.countMinPopulation() == 1) {
3563 Value *And = Builder.CreateAnd(
3564 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3565 return new ICmpInst(
3566 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3569 And, Constant::getNullValue(Op->getType()));
3570 }
3571 }
3572
3573 return nullptr;
3574}
3575
3576/// Fold an equality icmp with LLVM intrinsic and constant operand.
3578 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3579 Type *Ty = II->getType();
3580 unsigned BitWidth = C.getBitWidth();
3581 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3582
3583 switch (II->getIntrinsicID()) {
3584 case Intrinsic::abs:
3585 // abs(A) == 0 -> A == 0
3586 // abs(A) == INT_MIN -> A == INT_MIN
3587 if (C.isZero() || C.isMinSignedValue())
3588 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3589 break;
3590
3591 case Intrinsic::bswap:
3592 // bswap(A) == C -> A == bswap(C)
3593 return new ICmpInst(Pred, II->getArgOperand(0),
3594 ConstantInt::get(Ty, C.byteSwap()));
3595
3596 case Intrinsic::bitreverse:
3597 // bitreverse(A) == C -> A == bitreverse(C)
3598 return new ICmpInst(Pred, II->getArgOperand(0),
3599 ConstantInt::get(Ty, C.reverseBits()));
3600
3601 case Intrinsic::ctlz:
3602 case Intrinsic::cttz: {
3603 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3604 if (C == BitWidth)
3605 return new ICmpInst(Pred, II->getArgOperand(0),
3607
3608 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3609 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3610 // Limit to one use to ensure we don't increase instruction count.
3611 unsigned Num = C.getLimitedValue(BitWidth);
3612 if (Num != BitWidth && II->hasOneUse()) {
3613 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3614 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3615 : APInt::getHighBitsSet(BitWidth, Num + 1);
3616 APInt Mask2 = IsTrailing
3619 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3620 ConstantInt::get(Ty, Mask2));
3621 }
3622 break;
3623 }
3624
3625 case Intrinsic::ctpop: {
3626 // popcount(A) == 0 -> A == 0 and likewise for !=
3627 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3628 bool IsZero = C.isZero();
3629 if (IsZero || C == BitWidth)
3630 return new ICmpInst(Pred, II->getArgOperand(0),
3631 IsZero ? Constant::getNullValue(Ty)
3633
3634 break;
3635 }
3636
3637 case Intrinsic::fshl:
3638 case Intrinsic::fshr:
3639 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3640 const APInt *RotAmtC;
3641 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3642 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3643 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3644 return new ICmpInst(Pred, II->getArgOperand(0),
3645 II->getIntrinsicID() == Intrinsic::fshl
3646 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3647 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3648 }
3649 break;
3650
3651 case Intrinsic::umax:
3652 case Intrinsic::uadd_sat: {
3653 // uadd.sat(a, b) == 0 -> (a | b) == 0
3654 // umax(a, b) == 0 -> (a | b) == 0
3655 if (C.isZero() && II->hasOneUse()) {
3657 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3658 }
3659 break;
3660 }
3661
3662 case Intrinsic::ssub_sat:
3663 // ssub.sat(a, b) == 0 -> a == b
3664 if (C.isZero())
3665 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3666 break;
3667 case Intrinsic::usub_sat: {
3668 // usub.sat(a, b) == 0 -> a <= b
3669 if (C.isZero()) {
3670 ICmpInst::Predicate NewPred =
3672 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3673 }
3674 break;
3675 }
3676 default:
3677 break;
3678 }
3679
3680 return nullptr;
3681}
3682
3683/// Fold an icmp with LLVM intrinsics
3684static Instruction *
3686 InstCombiner::BuilderTy &Builder) {
3687 assert(Cmp.isEquality());
3688
3689 ICmpInst::Predicate Pred = Cmp.getPredicate();
3690 Value *Op0 = Cmp.getOperand(0);
3691 Value *Op1 = Cmp.getOperand(1);
3692 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3693 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3694 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3695 return nullptr;
3696
3697 switch (IIOp0->getIntrinsicID()) {
3698 case Intrinsic::bswap:
3699 case Intrinsic::bitreverse:
3700 // If both operands are byte-swapped or bit-reversed, just compare the
3701 // original values.
3702 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3703 case Intrinsic::fshl:
3704 case Intrinsic::fshr: {
3705 // If both operands are rotated by same amount, just compare the
3706 // original values.
3707 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3708 break;
3709 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3710 break;
3711 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3712 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3713
3714 // rotate(X, AmtX) == rotate(Y, AmtY)
3715 // -> rotate(X, AmtX - AmtY) == Y
3716 // Do this if either both rotates have one use or if only one has one use
3717 // and AmtX/AmtY are constants.
3718 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3719 if (OneUses == 2 ||
3720 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3721 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3722 Value *SubAmt =
3723 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3724 Value *CombinedRotate = Builder.CreateIntrinsic(
3725 Op0->getType(), IIOp0->getIntrinsicID(),
3726 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3727 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3728 }
3729 } break;
3730 default:
3731 break;
3732 }
3733
3734 return nullptr;
3735}
3736
3737/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3738/// where X is some kind of instruction and C is AllowPoison.
3739/// TODO: Move more folds which allow poison to this function.
3742 const APInt &C) {
3743 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3744 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3745 switch (II->getIntrinsicID()) {
3746 default:
3747 break;
3748 case Intrinsic::fshl:
3749 case Intrinsic::fshr:
3750 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3751 // (rot X, ?) == 0/-1 --> X == 0/-1
3752 if (C.isZero() || C.isAllOnes())
3753 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3754 }
3755 break;
3756 }
3757 }
3758
3759 return nullptr;
3760}
3761
3762/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3764 BinaryOperator *BO,
3765 const APInt &C) {
3766 switch (BO->getOpcode()) {
3767 case Instruction::Xor:
3768 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3769 return I;
3770 break;
3771 case Instruction::And:
3772 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3773 return I;
3774 break;
3775 case Instruction::Or:
3776 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3777 return I;
3778 break;
3779 case Instruction::Mul:
3780 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3781 return I;
3782 break;
3783 case Instruction::Shl:
3784 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
3785 return I;
3786 break;
3787 case Instruction::LShr:
3788 case Instruction::AShr:
3789 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
3790 return I;
3791 break;
3792 case Instruction::SRem:
3793 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
3794 return I;
3795 break;
3796 case Instruction::UDiv:
3797 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
3798 return I;
3799 [[fallthrough]];
3800 case Instruction::SDiv:
3801 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
3802 return I;
3803 break;
3804 case Instruction::Sub:
3805 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
3806 return I;
3807 break;
3808 case Instruction::Add:
3809 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
3810 return I;
3811 break;
3812 default:
3813 break;
3814 }
3815
3816 // TODO: These folds could be refactored to be part of the above calls.
3817 return foldICmpBinOpEqualityWithConstant(Cmp, BO, C);
3818}
3819
3820static Instruction *
3822 SaturatingInst *II, const APInt &C,
3823 InstCombiner::BuilderTy &Builder) {
3824 // This transform may end up producing more than one instruction for the
3825 // intrinsic, so limit it to one user of the intrinsic.
3826 if (!II->hasOneUse())
3827 return nullptr;
3828
3829 // Let Y = [add/sub]_sat(X, C) pred C2
3830 // SatVal = The saturating value for the operation
3831 // WillWrap = Whether or not the operation will underflow / overflow
3832 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
3833 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
3834 //
3835 // When (SatVal pred C2) is true, then
3836 // Y = WillWrap ? true : ((X binop C) pred C2)
3837 // => Y = WillWrap || ((X binop C) pred C2)
3838 // else
3839 // Y = WillWrap ? false : ((X binop C) pred C2)
3840 // => Y = !WillWrap ? ((X binop C) pred C2) : false
3841 // => Y = !WillWrap && ((X binop C) pred C2)
3842 Value *Op0 = II->getOperand(0);
3843 Value *Op1 = II->getOperand(1);
3844
3845 const APInt *COp1;
3846 // This transform only works when the intrinsic has an integral constant or
3847 // splat vector as the second operand.
3848 if (!match(Op1, m_APInt(COp1)))
3849 return nullptr;
3850
3851 APInt SatVal;
3852 switch (II->getIntrinsicID()) {
3853 default:
3855 "This function only works with usub_sat and uadd_sat for now!");
3856 case Intrinsic::uadd_sat:
3857 SatVal = APInt::getAllOnes(C.getBitWidth());
3858 break;
3859 case Intrinsic::usub_sat:
3860 SatVal = APInt::getZero(C.getBitWidth());
3861 break;
3862 }
3863
3864 // Check (SatVal pred C2)
3865 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
3866
3867 // !WillWrap.
3869 II->getBinaryOp(), *COp1, II->getNoWrapKind());
3870
3871 // WillWrap.
3872 if (SatValCheck)
3873 C1 = C1.inverse();
3874
3876 if (II->getBinaryOp() == Instruction::Add)
3877 C2 = C2.sub(*COp1);
3878 else
3879 C2 = C2.add(*COp1);
3880
3881 Instruction::BinaryOps CombiningOp =
3882 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
3883
3884 std::optional<ConstantRange> Combination;
3885 if (CombiningOp == Instruction::BinaryOps::Or)
3886 Combination = C1.exactUnionWith(C2);
3887 else /* CombiningOp == Instruction::BinaryOps::And */
3888 Combination = C1.exactIntersectWith(C2);
3889
3890 if (!Combination)
3891 return nullptr;
3892
3893 CmpInst::Predicate EquivPred;
3894 APInt EquivInt;
3895 APInt EquivOffset;
3896
3897 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3898
3899 return new ICmpInst(
3900 EquivPred,
3901 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
3902 ConstantInt::get(Op1->getType(), EquivInt));
3903}
3904
3905/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
3907 IntrinsicInst *II,
3908 const APInt &C) {
3909 ICmpInst::Predicate Pred = Cmp.getPredicate();
3910
3911 // Handle folds that apply for any kind of icmp.
3912 switch (II->getIntrinsicID()) {
3913 default:
3914 break;
3915 case Intrinsic::uadd_sat:
3916 case Intrinsic::usub_sat:
3917 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
3918 Pred, cast<SaturatingInst>(II), C, Builder))
3919 return Folded;
3920 break;
3921 case Intrinsic::ctpop: {
3922 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3923 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
3924 return R;
3925 } break;
3926 }
3927
3928 if (Cmp.isEquality())
3929 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
3930
3931 Type *Ty = II->getType();
3932 unsigned BitWidth = C.getBitWidth();
3933 switch (II->getIntrinsicID()) {
3934 case Intrinsic::ctpop: {
3935 // (ctpop X > BitWidth - 1) --> X == -1
3936 Value *X = II->getArgOperand(0);
3937 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
3938 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
3940 // (ctpop X < BitWidth) --> X != -1
3941 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
3942 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
3944 break;
3945 }
3946 case Intrinsic::ctlz: {
3947 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
3948 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
3949 unsigned Num = C.getLimitedValue();
3950 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
3951 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
3952 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
3953 }
3954
3955 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
3956 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
3957 unsigned Num = C.getLimitedValue();
3959 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
3960 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
3961 }
3962 break;
3963 }
3964 case Intrinsic::cttz: {
3965 // Limit to one use to ensure we don't increase instruction count.
3966 if (!II->hasOneUse())
3967 return nullptr;
3968
3969 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
3970 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
3971 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
3972 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
3973 Builder.CreateAnd(II->getArgOperand(0), Mask),
3975 }
3976
3977 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
3978 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
3979 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
3980 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
3981 Builder.CreateAnd(II->getArgOperand(0), Mask),
3983 }
3984 break;
3985 }
3986 case Intrinsic::ssub_sat:
3987 // ssub.sat(a, b) spred 0 -> a spred b
3988 if (ICmpInst::isSigned(Pred)) {
3989 if (C.isZero())
3990 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3991 // X s<= 0 is cannonicalized to X s< 1
3992 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3993 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
3994 II->getArgOperand(1));
3995 // X s>= 0 is cannonicalized to X s> -1
3996 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3997 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
3998 II->getArgOperand(1));
3999 }
4000 break;
4001 default:
4002 break;
4003 }
4004
4005 return nullptr;
4006}
4007
4008/// Handle icmp with constant (but not simple integer constant) RHS.
4010 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4011 Constant *RHSC = dyn_cast<Constant>(Op1);
4012 Instruction *LHSI = dyn_cast<Instruction>(Op0);
4013 if (!RHSC || !LHSI)
4014 return nullptr;
4015
4016 switch (LHSI->getOpcode()) {
4017 case Instruction::PHI:
4018 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
4019 return NV;
4020 break;
4021 case Instruction::IntToPtr:
4022 // icmp pred inttoptr(X), null -> icmp pred X, 0
4023 if (RHSC->isNullValue() &&
4024 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4025 return new ICmpInst(
4026 I.getPredicate(), LHSI->getOperand(0),
4028 break;
4029
4030 case Instruction::Load:
4031 // Try to optimize things like "A[i] > 4" to index computations.
4032 if (GetElementPtrInst *GEP =
4033 dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
4034 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
4035 if (Instruction *Res =
4036 foldCmpLoadFromIndexedGlobal(cast<LoadInst>(LHSI), GEP, GV, I))
4037 return Res;
4038 break;
4039 }
4040
4041 return nullptr;
4042}
4043
4045 SelectInst *SI, Value *RHS,
4046 const ICmpInst &I) {
4047 // Try to fold the comparison into the select arms, which will cause the
4048 // select to be converted into a logical and/or.
4049 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4050 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4051 return Res;
4052 if (std::optional<bool> Impl = isImpliedCondition(
4053 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4054 return ConstantInt::get(I.getType(), *Impl);
4055 return nullptr;
4056 };
4057
4058 ConstantInt *CI = nullptr;
4059 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4060 if (Op1)
4061 CI = dyn_cast<ConstantInt>(Op1);
4062
4063 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4064 if (Op2)
4065 CI = dyn_cast<ConstantInt>(Op2);
4066
4067 // We only want to perform this transformation if it will not lead to
4068 // additional code. This is true if either both sides of the select
4069 // fold to a constant (in which case the icmp is replaced with a select
4070 // which will usually simplify) or this is the only user of the
4071 // select (in which case we are trading a select+icmp for a simpler
4072 // select+icmp) or all uses of the select can be replaced based on
4073 // dominance information ("Global cases").
4074 bool Transform = false;
4075 if (Op1 && Op2)
4076 Transform = true;
4077 else if (Op1 || Op2) {
4078 // Local case
4079 if (SI->hasOneUse())
4080 Transform = true;
4081 // Global cases
4082 else if (CI && !CI->isZero())
4083 // When Op1 is constant try replacing select with second operand.
4084 // Otherwise Op2 is constant and try replacing select with first
4085 // operand.
4086 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4087 }
4088 if (Transform) {
4089 if (!Op1)
4090 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4091 if (!Op2)
4092 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4093 return SelectInst::Create(SI->getOperand(0), Op1, Op2);
4094 }
4095
4096 return nullptr;
4097}
4098
4099// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4100static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4101 unsigned Depth = 0) {
4102 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4103 return true;
4104 if (V->getType()->getScalarSizeInBits() == 1)
4105 return true;
4107 return false;
4108 Value *X;
4109 const Instruction *I = dyn_cast<Instruction>(V);
4110 if (!I)
4111 return false;
4112 switch (I->getOpcode()) {
4113 case Instruction::ZExt:
4114 // ZExt(Mask) is a Mask.
4115 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4116 case Instruction::SExt:
4117 // SExt(Mask) is a Mask.
4118 // SExt(~Mask) is a ~Mask.
4119 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4120 case Instruction::And:
4121 case Instruction::Or:
4122 // Mask0 | Mask1 is a Mask.
4123 // Mask0 & Mask1 is a Mask.
4124 // ~Mask0 | ~Mask1 is a ~Mask.
4125 // ~Mask0 & ~Mask1 is a ~Mask.
4126 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4127 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4128 case Instruction::Xor:
4129 if (match(V, m_Not(m_Value(X))))
4130 return isMaskOrZero(X, !Not, Q, Depth);
4131
4132 // (X ^ -X) is a ~Mask
4133 if (Not)
4134 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4135 // (X ^ (X - 1)) is a Mask
4136 else
4137 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4138 case Instruction::Select:
4139 // c ? Mask0 : Mask1 is a Mask.
4140 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4141 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4142 case Instruction::Shl:
4143 // (~Mask) << X is a ~Mask.
4144 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4145 case Instruction::LShr:
4146 // Mask >> X is a Mask.
4147 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4148 case Instruction::AShr:
4149 // Mask s>> X is a Mask.
4150 // ~Mask s>> X is a ~Mask.
4151 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4152 case Instruction::Add:
4153 // Pow2 - 1 is a Mask.
4154 if (!Not && match(I->getOperand(1), m_AllOnes()))
4155 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4156 Depth, Q.AC, Q.CxtI, Q.DT);
4157 break;
4158 case Instruction::Sub:
4159 // -Pow2 is a ~Mask.
4160 if (Not && match(I->getOperand(0), m_Zero()))
4161 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4162 Depth, Q.AC, Q.CxtI, Q.DT);
4163 break;
4164 case Instruction::Call: {
4165 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4166 switch (II->getIntrinsicID()) {
4167 // min/max(Mask0, Mask1) is a Mask.
4168 // min/max(~Mask0, ~Mask1) is a ~Mask.
4169 case Intrinsic::umax:
4170 case Intrinsic::smax:
4171 case Intrinsic::umin:
4172 case Intrinsic::smin:
4173 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4174 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4175
4176 // In the context of masks, bitreverse(Mask) == ~Mask
4177 case Intrinsic::bitreverse:
4178 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4179 default:
4180 break;
4181 }
4182 }
4183 break;
4184 }
4185 default:
4186 break;
4187 }
4188 return false;
4189}
4190
4191/// Some comparisons can be simplified.
4192/// In this case, we are looking for comparisons that look like
4193/// a check for a lossy truncation.
4194/// Folds:
4195/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4196/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4197/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4198/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4199/// Where Mask is some pattern that produces all-ones in low bits:
4200/// (-1 >> y)
4201/// ((-1 << y) >> y) <- non-canonical, has extra uses
4202/// ~(-1 << y)
4203/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4204/// The Mask can be a constant, too.
4205/// For some predicates, the operands are commutative.
4206/// For others, x can only be on a specific side.
4208 Value *Op1, const SimplifyQuery &Q,
4209 InstCombiner &IC) {
4210
4211 ICmpInst::Predicate DstPred;
4212 switch (Pred) {
4214 // x & Mask == x
4215 // x & ~Mask == 0
4216 // ~x | Mask == -1
4217 // -> x u<= Mask
4218 // x & ~Mask == ~Mask
4219 // -> ~Mask u<= x
4221 break;
4223 // x & Mask != x
4224 // x & ~Mask != 0
4225 // ~x | Mask != -1
4226 // -> x u> Mask
4227 // x & ~Mask != ~Mask
4228 // -> ~Mask u> x
4230 break;
4232 // x & Mask u< x
4233 // -> x u> Mask
4234 // x & ~Mask u< ~Mask
4235 // -> ~Mask u> x
4237 break;
4239 // x & Mask u>= x
4240 // -> x u<= Mask
4241 // x & ~Mask u>= ~Mask
4242 // -> ~Mask u<= x
4244 break;
4246 // x & Mask s< x [iff Mask s>= 0]
4247 // -> x s> Mask
4248 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4249 // -> ~Mask s> x
4251 break;
4253 // x & Mask s>= x [iff Mask s>= 0]
4254 // -> x s<= Mask
4255 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4256 // -> ~Mask s<= x
4258 break;
4259 default:
4260 // We don't support sgt,sle
4261 // ult/ugt are simplified to true/false respectively.
4262 return nullptr;
4263 }
4264
4265 Value *X, *M;
4266 // Put search code in lambda for early positive returns.
4267 auto IsLowBitMask = [&]() {
4268 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4269 X = Op1;
4270 // Look for: x & Mask pred x
4271 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4272 return !ICmpInst::isSigned(Pred) ||
4273 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4274 }
4275
4276 // Look for: x & ~Mask pred ~Mask
4277 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4278 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4279 }
4280 return false;
4281 }
4282 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4283 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4284
4285 auto Check = [&]() {
4286 // Look for: ~x | Mask == -1
4287 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4288 if (Value *NotX =
4289 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4290 X = NotX;
4291 return true;
4292 }
4293 }
4294 return false;
4295 };
4296 if (Check())
4297 return true;
4298 std::swap(X, M);
4299 return Check();
4300 }
4301 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4302 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4303 auto Check = [&]() {
4304 // Look for: x & ~Mask == 0
4305 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4306 if (Value *NotM =
4307 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4308 M = NotM;
4309 return true;
4310 }
4311 }
4312 return false;
4313 };
4314 if (Check())
4315 return true;
4316 std::swap(X, M);
4317 return Check();
4318 }
4319 return false;
4320 };
4321
4322 if (!IsLowBitMask())
4323 return nullptr;
4324
4325 return IC.Builder.CreateICmp(DstPred, X, M);
4326}
4327
4328/// Some comparisons can be simplified.
4329/// In this case, we are looking for comparisons that look like
4330/// a check for a lossy signed truncation.
4331/// Folds: (MaskedBits is a constant.)
4332/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4333/// Into:
4334/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4335/// Where KeptBits = bitwidth(%x) - MaskedBits
4336static Value *
4338 InstCombiner::BuilderTy &Builder) {
4339 ICmpInst::Predicate SrcPred;
4340 Value *X;
4341 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4342 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4343 if (!match(&I, m_c_ICmp(SrcPred,
4345 m_APInt(C1))),
4346 m_Deferred(X))))
4347 return nullptr;
4348
4349 // Potential handling of non-splats: for each element:
4350 // * if both are undef, replace with constant 0.
4351 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4352 // * if both are not undef, and are different, bailout.
4353 // * else, only one is undef, then pick the non-undef one.
4354
4355 // The shift amount must be equal.
4356 if (*C0 != *C1)
4357 return nullptr;
4358 const APInt &MaskedBits = *C0;
4359 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4360
4361 ICmpInst::Predicate DstPred;
4362 switch (SrcPred) {
4364 // ((%x << MaskedBits) a>> MaskedBits) == %x
4365 // =>
4366 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4368 break;
4370 // ((%x << MaskedBits) a>> MaskedBits) != %x
4371 // =>
4372 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4374 break;
4375 // FIXME: are more folds possible?
4376 default:
4377 return nullptr;
4378 }
4379
4380 auto *XType = X->getType();
4381 const unsigned XBitWidth = XType->getScalarSizeInBits();
4382 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4383 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4384
4385 // KeptBits = bitwidth(%x) - MaskedBits
4386 const APInt KeptBits = BitWidth - MaskedBits;
4387 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4388 // ICmpCst = (1 << KeptBits)
4389 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4390 assert(ICmpCst.isPowerOf2());
4391 // AddCst = (1 << (KeptBits-1))
4392 const APInt AddCst = ICmpCst.lshr(1);
4393 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4394
4395 // T0 = add %x, AddCst
4396 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4397 // T1 = T0 DstPred ICmpCst
4398 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4399
4400 return T1;
4401}
4402
4403// Given pattern:
4404// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4405// we should move shifts to the same hand of 'and', i.e. rewrite as
4406// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4407// We are only interested in opposite logical shifts here.
4408// One of the shifts can be truncated.
4409// If we can, we want to end up creating 'lshr' shift.
4410static Value *
4412 InstCombiner::BuilderTy &Builder) {
4413 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4414 !I.getOperand(0)->hasOneUse())
4415 return nullptr;
4416
4417 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4418
4419 // Look for an 'and' of two logical shifts, one of which may be truncated.
4420 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4421 Instruction *XShift, *MaybeTruncation, *YShift;
4422 if (!match(
4423 I.getOperand(0),
4424 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4426 m_AnyLogicalShift, m_Instruction(YShift))),
4427 m_Instruction(MaybeTruncation)))))
4428 return nullptr;
4429
4430 // We potentially looked past 'trunc', but only when matching YShift,
4431 // therefore YShift must have the widest type.
4432 Instruction *WidestShift = YShift;
4433 // Therefore XShift must have the shallowest type.
4434 // Or they both have identical types if there was no truncation.
4435 Instruction *NarrowestShift = XShift;
4436
4437 Type *WidestTy = WidestShift->getType();
4438 Type *NarrowestTy = NarrowestShift->getType();
4439 assert(NarrowestTy == I.getOperand(0)->getType() &&
4440 "We did not look past any shifts while matching XShift though.");
4441 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4442
4443 // If YShift is a 'lshr', swap the shifts around.
4444 if (match(YShift, m_LShr(m_Value(), m_Value())))
4445 std::swap(XShift, YShift);
4446
4447 // The shifts must be in opposite directions.
4448 auto XShiftOpcode = XShift->getOpcode();
4449 if (XShiftOpcode == YShift->getOpcode())
4450 return nullptr; // Do not care about same-direction shifts here.
4451
4452 Value *X, *XShAmt, *Y, *YShAmt;
4453 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4454 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4455
4456 // If one of the values being shifted is a constant, then we will end with
4457 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4458 // however, we will need to ensure that we won't increase instruction count.
4459 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4460 // At least one of the hands of the 'and' should be one-use shift.
4461 if (!match(I.getOperand(0),
4462 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4463 return nullptr;
4464 if (HadTrunc) {
4465 // Due to the 'trunc', we will need to widen X. For that either the old
4466 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4467 if (!MaybeTruncation->hasOneUse() &&
4468 !NarrowestShift->getOperand(1)->hasOneUse())
4469 return nullptr;
4470 }
4471 }
4472
4473 // We have two shift amounts from two different shifts. The types of those
4474 // shift amounts may not match. If that's the case let's bailout now.
4475 if (XShAmt->getType() != YShAmt->getType())
4476 return nullptr;
4477
4478 // As input, we have the following pattern:
4479 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4480 // We want to rewrite that as:
4481 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4482 // While we know that originally (Q+K) would not overflow
4483 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4484 // shift amounts. so it may now overflow in smaller bitwidth.
4485 // To ensure that does not happen, we need to ensure that the total maximal
4486 // shift amount is still representable in that smaller bit width.
4487 unsigned MaximalPossibleTotalShiftAmount =
4488 (WidestTy->getScalarSizeInBits() - 1) +
4489 (NarrowestTy->getScalarSizeInBits() - 1);
4490 APInt MaximalRepresentableShiftAmount =
4492 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4493 return nullptr;
4494
4495 // Can we fold (XShAmt+YShAmt) ?
4496 auto *NewShAmt = dyn_cast_or_null<Constant>(
4497 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4498 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4499 if (!NewShAmt)
4500 return nullptr;
4501 if (NewShAmt->getType() != WidestTy) {
4502 NewShAmt =
4503 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4504 if (!NewShAmt)
4505 return nullptr;
4506 }
4507 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4508
4509 // Is the new shift amount smaller than the bit width?
4510 // FIXME: could also rely on ConstantRange.
4511 if (!match(NewShAmt,
4513 APInt(WidestBitWidth, WidestBitWidth))))
4514 return nullptr;
4515
4516 // An extra legality check is needed if we had trunc-of-lshr.
4517 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4518 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4519 WidestShift]() {
4520 // It isn't obvious whether it's worth it to analyze non-constants here.
4521 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4522 // If *any* of these preconditions matches we can perform the fold.
4523 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4524 ? NewShAmt->getSplatValue()
4525 : NewShAmt;
4526 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4527 if (NewShAmtSplat &&
4528 (NewShAmtSplat->isNullValue() ||
4529 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4530 return true;
4531 // We consider *min* leading zeros so a single outlier
4532 // blocks the transform as opposed to allowing it.
4533 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4534 KnownBits Known = computeKnownBits(C, SQ.DL);
4535 unsigned MinLeadZero = Known.countMinLeadingZeros();
4536 // If the value being shifted has at most lowest bit set we can fold.
4537 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4538 if (MaxActiveBits <= 1)
4539 return true;
4540 // Precondition: NewShAmt u<= countLeadingZeros(C)
4541 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4542 return true;
4543 }
4544 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4545 KnownBits Known = computeKnownBits(C, SQ.DL);
4546 unsigned MinLeadZero = Known.countMinLeadingZeros();
4547 // If the value being shifted has at most lowest bit set we can fold.
4548 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4549 if (MaxActiveBits <= 1)
4550 return true;
4551 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4552 if (NewShAmtSplat) {
4553 APInt AdjNewShAmt =
4554 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4555 if (AdjNewShAmt.ule(MinLeadZero))
4556 return true;
4557 }
4558 }
4559 return false; // Can't tell if it's ok.
4560 };
4561 if (!CanFold())
4562 return nullptr;
4563 }
4564
4565 // All good, we can do this fold.
4566 X = Builder.CreateZExt(X, WidestTy);
4567 Y = Builder.CreateZExt(Y, WidestTy);
4568 // The shift is the same that was for X.
4569 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4570 ? Builder.CreateLShr(X, NewShAmt)
4571 : Builder.CreateShl(X, NewShAmt);
4572 Value *T1 = Builder.CreateAnd(T0, Y);
4573 return Builder.CreateICmp(I.getPredicate(), T1,
4574 Constant::getNullValue(WidestTy));
4575}
4576
4577/// Fold
4578/// (-1 u/ x) u< y
4579/// ((x * y) ?/ x) != y
4580/// to
4581/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4582/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4583/// will mean that we are looking for the opposite answer.
4586 Value *X, *Y;
4588 Instruction *Div;
4589 bool NeedNegation;
4590 // Look for: (-1 u/ x) u</u>= y
4591 if (!I.isEquality() &&
4592 match(&I, m_c_ICmp(Pred,
4594 m_Instruction(Div)),
4595 m_Value(Y)))) {
4596 Mul = nullptr;
4597
4598 // Are we checking that overflow does not happen, or does happen?
4599 switch (Pred) {
4601 NeedNegation = false;
4602 break; // OK
4604 NeedNegation = true;
4605 break; // OK
4606 default:
4607 return nullptr; // Wrong predicate.
4608 }
4609 } else // Look for: ((x * y) / x) !=/== y
4610 if (I.isEquality() &&
4611 match(&I,
4612 m_c_ICmp(Pred, m_Value(Y),
4615 m_Value(X)),
4617 m_Deferred(X))),
4618 m_Instruction(Div))))) {
4619 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4620 } else
4621 return nullptr;
4622
4624 // If the pattern included (x * y), we'll want to insert new instructions
4625 // right before that original multiplication so that we can replace it.
4626 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4627 if (MulHadOtherUses)
4629
4630 Function *F = Intrinsic::getDeclaration(I.getModule(),
4631 Div->getOpcode() == Instruction::UDiv
4632 ? Intrinsic::umul_with_overflow
4633 : Intrinsic::smul_with_overflow,
4634 X->getType());
4635 CallInst *Call = Builder.CreateCall(F, {X, Y}, "mul");
4636
4637 // If the multiplication was used elsewhere, to ensure that we don't leave
4638 // "duplicate" instructions, replace uses of that original multiplication
4639 // with the multiplication result from the with.overflow intrinsic.
4640 if (MulHadOtherUses)
4641 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4642
4643 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4644 if (NeedNegation) // This technically increases instruction count.
4645 Res = Builder.CreateNot(Res, "mul.not.ov");
4646
4647 // If we replaced the mul, erase it. Do this after all uses of Builder,
4648 // as the mul is used as insertion point.
4649 if (MulHadOtherUses)
4651
4652 return Res;
4653}
4654
4656 InstCombiner::BuilderTy &Builder) {
4657 CmpInst::Predicate Pred;
4658 Value *X;
4659 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4660
4661 if (ICmpInst::isSigned(Pred))
4662 Pred = ICmpInst::getSwappedPredicate(Pred);
4663 else if (ICmpInst::isUnsigned(Pred))
4664 Pred = ICmpInst::getSignedPredicate(Pred);
4665 // else for equality-comparisons just keep the predicate.
4666
4667 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4668 Constant::getNullValue(X->getType()), I.getName());
4669 }
4670
4671 // A value is not equal to its negation unless that value is 0 or
4672 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4673 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4674 ICmpInst::isEquality(Pred)) {
4675 Type *Ty = X->getType();
4677 Constant *MaxSignedVal =
4678 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4679 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4680 Constant *Zero = Constant::getNullValue(Ty);
4681 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4682 }
4683
4684 return nullptr;
4685}
4686
4688 InstCombinerImpl &IC) {
4689 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4690 // Normalize and operand as operand 0.
4691 CmpInst::Predicate Pred = I.getPredicate();
4692 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4693 std::swap(Op0, Op1);
4694 Pred = ICmpInst::getSwappedPredicate(Pred);
4695 }
4696
4697 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4698 return nullptr;
4699
4700 // (icmp (X & Y) u< X --> (X & Y) != X
4701 if (Pred == ICmpInst::ICMP_ULT)
4702 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4703
4704 // (icmp (X & Y) u>= X --> (X & Y) == X
4705 if (Pred == ICmpInst::ICMP_UGE)
4706 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4707
4708 return nullptr;
4709}
4710
4712 InstCombinerImpl &IC) {
4713 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4714
4715 // Normalize or operand as operand 0.
4716 CmpInst::Predicate Pred = I.getPredicate();
4717 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
4718 std::swap(Op0, Op1);
4719 Pred = ICmpInst::getSwappedPredicate(Pred);
4720 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
4721 return nullptr;
4722 }
4723
4724 // icmp (X | Y) u<= X --> (X | Y) == X
4725 if (Pred == ICmpInst::ICMP_ULE)
4726 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4727
4728 // icmp (X | Y) u> X --> (X | Y) != X
4729 if (Pred == ICmpInst::ICMP_UGT)
4730 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4731
4732 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4733 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
4734 if (Value *NotOp1 =
4735 IC.getFreelyInverted(Op1, Op1->hasOneUse(), &IC.Builder))
4736 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
4737 Constant::getNullValue(Op1->getType()));
4738 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
4739 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4740 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
4741 Constant::getAllOnesValue(Op1->getType()));
4742 }
4743 return nullptr;
4744}
4745
4747 InstCombinerImpl &IC) {
4748 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4749 // Normalize xor operand as operand 0.
4750 CmpInst::Predicate Pred = I.getPredicate();
4751 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
4752 std::swap(Op0, Op1);
4753 Pred = ICmpInst::getSwappedPredicate(Pred);
4754 }
4755 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
4756 return nullptr;
4757
4758 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
4759 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
4760 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
4761 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
4763 if (PredOut != Pred && isKnownNonZero(A, Q))
4764 return new ICmpInst(PredOut, Op0, Op1);
4765
4766 return nullptr;
4767}
4768
4769/// Try to fold icmp (binop), X or icmp X, (binop).
4770/// TODO: A large part of this logic is duplicated in InstSimplify's
4771/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
4772/// duplication.
4774 const SimplifyQuery &SQ) {
4776 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4777
4778 // Special logic for binary operators.
4779 BinaryOperator *BO0 = dyn_cast<BinaryOperator>(Op0);
4780 BinaryOperator *BO1 = dyn_cast<BinaryOperator>(Op1);
4781 if (!BO0 && !BO1)
4782 return nullptr;
4783
4784 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
4785 return NewICmp;
4786
4787 const CmpInst::Predicate Pred = I.getPredicate();
4788 Value *X;
4789
4790 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
4791 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
4792 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
4793 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
4794 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
4795 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
4796 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
4797 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
4798 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
4799
4800 {
4801 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
4802 Constant *C;
4803 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
4804 m_ImmConstant(C)))) &&
4805 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
4807 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
4808 }
4809 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
4810 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
4811 m_ImmConstant(C)))) &&
4812 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
4814 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
4815 }
4816 }
4817
4818 {
4819 // Similar to above: an unsigned overflow comparison may use offset + mask:
4820 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
4821 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
4822 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
4823 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
4824 BinaryOperator *BO;
4825 const APInt *C;
4826 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
4827 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4829 CmpInst::Predicate NewPred =
4831 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4832 return new ICmpInst(NewPred, Op1, Zero);
4833 }
4834
4835 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
4836 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4838 CmpInst::Predicate NewPred =
4840 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4841 return new ICmpInst(NewPred, Op0, Zero);
4842 }
4843 }
4844
4845 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
4846 bool Op0HasNUW = false, Op1HasNUW = false;
4847 bool Op0HasNSW = false, Op1HasNSW = false;
4848 // Analyze the case when either Op0 or Op1 is an add instruction.
4849 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
4850 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
4851 bool &HasNSW, bool &HasNUW) -> bool {
4852 if (isa<OverflowingBinaryOperator>(BO)) {
4853 HasNUW = BO.hasNoUnsignedWrap();
4854 HasNSW = BO.hasNoSignedWrap();
4855 return ICmpInst::isEquality(Pred) ||
4856 (CmpInst::isUnsigned(Pred) && HasNUW) ||
4857 (CmpInst::isSigned(Pred) && HasNSW);
4858 } else if (BO.getOpcode() == Instruction::Or) {
4859 HasNUW = true;
4860 HasNSW = true;
4861 return true;
4862 } else {
4863 return false;
4864 }
4865 };
4866 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
4867
4868 if (BO0) {
4869 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
4870 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
4871 }
4872 if (BO1) {
4873 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
4874 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
4875 }
4876
4877 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
4878 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
4879 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
4880 return new ICmpInst(Pred, A == Op1 ? B : A,
4881 Constant::getNullValue(Op1->getType()));
4882
4883 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
4884 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
4885 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
4886 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
4887 C == Op0 ? D : C);
4888
4889 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
4890 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
4891 NoOp1WrapProblem) {
4892 // Determine Y and Z in the form icmp (X+Y), (X+Z).
4893 Value *Y, *Z;
4894 if (A == C) {
4895 // C + B == C + D -> B == D
4896 Y = B;
4897 Z = D;
4898 } else if (A == D) {
4899 // D + B == C + D -> B == C
4900 Y = B;
4901 Z = C;
4902 } else if (B == C) {
4903 // A + C == C + D -> A == D
4904 Y = A;
4905 Z = D;
4906 } else {
4907 assert(B == D);
4908 // A + D == C + D -> A == C
4909 Y = A;
4910 Z = C;
4911 }
4912 return new ICmpInst(Pred, Y, Z);
4913 }
4914
4915 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
4916 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLT &&
4917 match(B, m_AllOnes()))
4918 return new ICmpInst(CmpInst::ICMP_SLE, A, Op1);
4919
4920 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
4921 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGE &&
4922 match(B, m_AllOnes()))
4923 return new ICmpInst(CmpInst::ICMP_SGT, A, Op1);
4924
4925 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
4926 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLE && match(B, m_One()))
4927 return new ICmpInst(CmpInst::ICMP_SLT, A, Op1);
4928
4929 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
4930 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGT && match(B, m_One()))
4931 return new ICmpInst(CmpInst::ICMP_SGE, A, Op1);
4932
4933 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
4934 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGT &&
4935 match(D, m_AllOnes()))
4936 return new ICmpInst(CmpInst::ICMP_SGE, Op0, C);
4937
4938 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
4939 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLE &&
4940 match(D, m_AllOnes()))
4941 return new ICmpInst(CmpInst::ICMP_SLT, Op0, C);
4942
4943 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
4944 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGE && match(D, m_One()))
4945 return new ICmpInst(CmpInst::ICMP_SGT, Op0, C);
4946
4947 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
4948 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLT && match(D, m_One()))
4949 return new ICmpInst(CmpInst::ICMP_SLE, Op0, C);
4950
4951 // TODO: The subtraction-related identities shown below also hold, but
4952 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
4953 // wouldn't happen even if they were implemented.
4954 //
4955 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
4956 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
4957 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
4958 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
4959
4960 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
4961 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_ULE && match(B, m_One()))
4962 return new ICmpInst(CmpInst::ICMP_ULT, A, Op1);
4963
4964 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
4965 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_UGT && match(B, m_One()))
4966 return new ICmpInst(CmpInst::ICMP_UGE, A, Op1);
4967
4968 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
4969 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_UGE && match(D, m_One()))
4970 return new ICmpInst(CmpInst::ICMP_UGT, Op0, C);
4971
4972 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
4973 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_ULT && match(D, m_One()))
4974 return new ICmpInst(CmpInst::ICMP_ULE, Op0, C);
4975
4976 // if C1 has greater magnitude than C2:
4977 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
4978 // s.t. C3 = C1 - C2
4979 //
4980 // if C2 has greater magnitude than C1:
4981 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
4982 // s.t. C3 = C2 - C1
4983 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
4984 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
4985 const APInt *AP1, *AP2;
4986 // TODO: Support non-uniform vectors.
4987 // TODO: Allow poison passthrough if B or D's element is poison.
4988 if (match(B, m_APIntAllowPoison(AP1)) &&
4989 match(D, m_APIntAllowPoison(AP2)) &&
4990 AP1->isNegative() == AP2->isNegative()) {
4991 APInt AP1Abs = AP1->abs();
4992 APInt AP2Abs = AP2->abs();
4993 if (AP1Abs.uge(AP2Abs)) {
4994 APInt Diff = *AP1 - *AP2;
4995 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
4996 Value *NewAdd = Builder.CreateAdd(
4997 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
4998 return new ICmpInst(Pred, NewAdd, C);
4999 } else {
5000 APInt Diff = *AP2 - *AP1;
5001 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5002 Value *NewAdd = Builder.CreateAdd(
5003 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5004 return new ICmpInst(Pred, A, NewAdd);
5005 }
5006 }
5007 Constant *Cst1, *Cst2;
5008 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5009 ICmpInst::isEquality(Pred)) {
5010 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5011 Value *NewAdd = Builder.CreateAdd(C, Diff);
5012 return new ICmpInst(Pred, A, NewAdd);
5013 }
5014 }
5015
5016 // Analyze the case when either Op0 or Op1 is a sub instruction.
5017 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5018 A = nullptr;
5019 B = nullptr;
5020 C = nullptr;
5021 D = nullptr;
5022 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5023 A = BO0->getOperand(0);
5024 B = BO0->getOperand(1);
5025 }
5026 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5027 C = BO1->getOperand(0);
5028 D = BO1->getOperand(1);
5029 }
5030
5031 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5032 if (A == Op1 && NoOp0WrapProblem)
5033 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5034 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5035 if (C == Op0 && NoOp1WrapProblem)
5036 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5037
5038 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5039 // (A - B) u>/u<= A --> B u>/u<= A
5040 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5041 return new ICmpInst(Pred, B, A);
5042 // C u</u>= (C - D) --> C u</u>= D
5043 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5044 return new ICmpInst(Pred, C, D);
5045 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5046 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5047 isKnownNonZero(B, Q))
5049 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5050 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5051 isKnownNonZero(D, Q))
5053
5054 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5055 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5056 return new ICmpInst(Pred, A, C);
5057
5058 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5059 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5060 return new ICmpInst(Pred, D, B);
5061
5062 // icmp (0-X) < cst --> x > -cst
5063 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5064 Value *X;
5065 if (match(BO0, m_Neg(m_Value(X))))
5066 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5067 if (RHSC->isNotMinSignedValue())
5068 return new ICmpInst(I.getSwappedPredicate(), X,
5069 ConstantExpr::getNeg(RHSC));
5070 }
5071
5072 if (Instruction * R = foldICmpXorXX(I, Q, *this))
5073 return R;
5074 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5075 return R;
5076
5077 {
5078 // Try to remove shared multiplier from comparison:
5079 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z
5080 Value *X, *Y, *Z;
5081 if (Pred == ICmpInst::getUnsignedPredicate(Pred) &&
5082 ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5083 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5084 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5085 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))))) {
5086 bool NonZero;
5087 if (ICmpInst::isEquality(Pred)) {
5088 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5089 // if Z % 2 != 0
5090 // X * Z eq/ne Y * Z -> X eq/ne Y
5091 if (ZKnown.countMaxTrailingZeros() == 0)
5092 return new ICmpInst(Pred, X, Y);
5093 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5094 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5095 // X * Z eq/ne Y * Z -> X eq/ne Y
5096 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5097 return new ICmpInst(Pred, X, Y);
5098 } else
5099 NonZero = isKnownNonZero(Z, Q);
5100
5101 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5102 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5103 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5104 return new ICmpInst(Pred, X, Y);
5105 }
5106 }
5107
5108 BinaryOperator *SRem = nullptr;
5109 // icmp (srem X, Y), Y
5110 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5111 SRem = BO0;
5112 // icmp Y, (srem X, Y)
5113 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5114 Op0 == BO1->getOperand(1))
5115 SRem = BO1;
5116 if (SRem) {
5117 // We don't check hasOneUse to avoid increasing register pressure because
5118 // the value we use is the same value this instruction was already using.
5119 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5120 default:
5121 break;
5122 case ICmpInst::ICMP_EQ:
5123 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5124 case ICmpInst::ICMP_NE:
5125 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5126 case ICmpInst::ICMP_SGT:
5127 case ICmpInst::ICMP_SGE:
5128 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5130 case ICmpInst::ICMP_SLT:
5131 case ICmpInst::ICMP_SLE:
5132 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5134 }
5135 }
5136
5137 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5138 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5139 BO0->getOperand(1) == BO1->getOperand(1)) {
5140 switch (BO0->getOpcode()) {
5141 default:
5142 break;
5143 case Instruction::Add:
5144 case Instruction::Sub:
5145 case Instruction::Xor: {
5146 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5147 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5148
5149 const APInt *C;
5150 if (match(BO0->getOperand(1), m_APInt(C))) {
5151 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5152 if (C->isSignMask()) {
5153 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5154 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5155 }
5156
5157 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5158 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5159 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5160 NewPred = I.getSwappedPredicate(NewPred);
5161 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5162 }
5163 }
5164 break;
5165 }
5166 case Instruction::Mul: {
5167 if (!I.isEquality())
5168 break;
5169
5170 const APInt *C;
5171 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5172 !C->isOne()) {
5173 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5174 // Mask = -1 >> count-trailing-zeros(C).
5175 if (unsigned TZs = C->countr_zero()) {
5176 Constant *Mask = ConstantInt::get(
5177 BO0->getType(),
5178 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5179 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5180 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5181 return new ICmpInst(Pred, And1, And2);
5182 }
5183 }
5184 break;
5185 }
5186 case Instruction::UDiv:
5187 case Instruction::LShr:
5188 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5189 break;
5190 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5191
5192 case Instruction::SDiv:
5193 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5194 !BO0->isExact() || !BO1->isExact())
5195 break;
5196 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5197
5198 case Instruction::AShr:
5199 if (!BO0->isExact() || !BO1->isExact())
5200 break;
5201 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5202
5203 case Instruction::Shl: {
5204 bool NUW = Op0HasNUW && Op1HasNUW;
5205 bool NSW = Op0HasNSW && Op1HasNSW;
5206 if (!NUW && !NSW)
5207 break;
5208 if (!NSW && I.isSigned())
5209 break;
5210 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5211 }
5212 }
5213 }
5214
5215 if (BO0) {
5216 // Transform A & (L - 1) `ult` L --> L != 0
5217 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5218 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5219
5220 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5221 auto *Zero = Constant::getNullValue(BO0->getType());
5222 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5223 }
5224 }
5225
5226 // For unsigned predicates / eq / ne:
5227 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5228 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5229 if (!ICmpInst::isSigned(Pred)) {
5230 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5231 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5232 Constant::getNullValue(Op1->getType()));
5233 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5234 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5235 Constant::getNullValue(Op0->getType()), Op0);
5236 }
5237
5239 return replaceInstUsesWith(I, V);
5240
5241 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5242 return R;
5243
5245 return replaceInstUsesWith(I, V);
5246
5248 return replaceInstUsesWith(I, V);
5249
5250 return nullptr;
5251}
5252
5253/// Fold icmp Pred min|max(X, Y), Z.
5256 Value *Z,
5257 ICmpInst::Predicate Pred) {
5258 Value *X = MinMax->getLHS();
5259 Value *Y = MinMax->getRHS();
5260 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5261 return nullptr;
5262 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5263 // Revert the transform signed pred -> unsigned pred
5264 // TODO: We can flip the signedness of predicate if both operands of icmp
5265 // are negative.
5269 } else
5270 return nullptr;
5271 }
5273 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5274 if (!Val)
5275 return std::nullopt;
5276 if (match(Val, m_One()))
5277 return true;
5278 if (match(Val, m_Zero()))
5279 return false;
5280 return std::nullopt;
5281 };
5282 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5283 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5284 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5285 return nullptr;
5286 if (!CmpXZ.has_value()) {
5287 std::swap(X, Y);
5288 std::swap(CmpXZ, CmpYZ);
5289 }
5290
5291 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5292 if (CmpYZ.has_value())
5293 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5294 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5295 };
5296
5297 switch (Pred) {
5298 case ICmpInst::ICMP_EQ:
5299 case ICmpInst::ICMP_NE: {
5300 // If X == Z:
5301 // Expr Result
5302 // min(X, Y) == Z X <= Y
5303 // max(X, Y) == Z X >= Y
5304 // min(X, Y) != Z X > Y
5305 // max(X, Y) != Z X < Y
5306 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5307 ICmpInst::Predicate NewPred =
5308 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5309 if (Pred == ICmpInst::ICMP_NE)
5310 NewPred = ICmpInst::getInversePredicate(NewPred);
5311 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5312 }
5313 // Otherwise (X != Z):
5314 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5315 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5316 if (!MinMaxCmpXZ.has_value()) {
5317 std::swap(X, Y);
5318 std::swap(CmpXZ, CmpYZ);
5319 // Re-check pre-condition X != Z
5320 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5321 break;
5322 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5323 }
5324 if (!MinMaxCmpXZ.has_value())
5325 break;
5326 if (*MinMaxCmpXZ) {
5327 // Expr Fact Result
5328 // min(X, Y) == Z X < Z false
5329 // max(X, Y) == Z X > Z false
5330 // min(X, Y) != Z X < Z true
5331 // max(X, Y) != Z X > Z true
5332 return replaceInstUsesWith(
5333 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5334 } else {
5335 // Expr Fact Result
5336 // min(X, Y) == Z X > Z Y == Z
5337 // max(X, Y) == Z X < Z Y == Z
5338 // min(X, Y) != Z X > Z Y != Z
5339 // max(X, Y) != Z X < Z Y != Z
5340 return FoldIntoCmpYZ();
5341 }
5342 break;
5343 }
5344 case ICmpInst::ICMP_SLT:
5345 case ICmpInst::ICMP_ULT:
5346 case ICmpInst::ICMP_SLE:
5347 case ICmpInst::ICMP_ULE:
5348 case ICmpInst::ICMP_SGT:
5349 case ICmpInst::ICMP_UGT:
5350 case ICmpInst::ICMP_SGE:
5351 case ICmpInst::ICMP_UGE: {
5352 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5353 if (*CmpXZ) {
5354 if (IsSame) {
5355 // Expr Fact Result
5356 // min(X, Y) < Z X < Z true
5357 // min(X, Y) <= Z X <= Z true
5358 // max(X, Y) > Z X > Z true
5359 // max(X, Y) >= Z X >= Z true
5360 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5361 } else {
5362 // Expr Fact Result
5363 // max(X, Y) < Z X < Z Y < Z
5364 // max(X, Y) <= Z X <= Z Y <= Z
5365 // min(X, Y) > Z X > Z Y > Z
5366 // min(X, Y) >= Z X >= Z Y >= Z
5367 return FoldIntoCmpYZ();
5368 }
5369 } else {
5370 if (IsSame) {
5371 // Expr Fact Result
5372 // min(X, Y) < Z X >= Z Y < Z
5373 // min(X, Y) <= Z X > Z Y <= Z
5374 // max(X, Y) > Z X <= Z Y > Z
5375 // max(X, Y) >= Z X < Z Y >= Z
5376 return FoldIntoCmpYZ();
5377 } else {
5378 // Expr Fact Result
5379 // max(X, Y) < Z X >= Z false
5380 // max(X, Y) <= Z X > Z false
5381 // min(X, Y) > Z X <= Z false
5382 // min(X, Y) >= Z X < Z false
5383 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5384 }
5385 }
5386 break;
5387 }
5388 default:
5389 break;
5390 }
5391
5392 return nullptr;
5393}
5394
5395// Canonicalize checking for a power-of-2-or-zero value:
5397 InstCombiner::BuilderTy &Builder) {
5398 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5399 const CmpInst::Predicate Pred = I.getPredicate();
5400 Value *A = nullptr;
5401 bool CheckIs;
5402 if (I.isEquality()) {
5403 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5404 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5405 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5406 m_Deferred(A)))) ||
5407 !match(Op1, m_ZeroInt()))
5408 A = nullptr;
5409
5410 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5411 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5412 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5413 A = Op1;
5414 else if (match(Op1,
5416 A = Op0;
5417
5418 CheckIs = Pred == ICmpInst::ICMP_EQ;
5419 } else if (ICmpInst::isUnsigned(Pred)) {
5420 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5421 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5422
5423 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5425 m_Specific(Op1))))) {
5426 A = Op1;
5427 CheckIs = Pred == ICmpInst::ICMP_UGE;
5428 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5430 m_Specific(Op0))))) {
5431 A = Op0;
5432 CheckIs = Pred == ICmpInst::ICMP_ULE;
5433 }
5434 }
5435
5436 if (A) {
5437 Type *Ty = A->getType();
5438 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5439 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5440 ConstantInt::get(Ty, 2))
5441 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5442 ConstantInt::get(Ty, 1));
5443 }
5444
5445 return nullptr;
5446}
5447
5449 if (!I.isEquality())
5450 return nullptr;
5451
5452 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5453 const CmpInst::Predicate Pred = I.getPredicate();
5454 Value *A, *B, *C, *D;
5455 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5456 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5457 Value *OtherVal = A == Op1 ? B : A;
5458 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5459 }
5460
5461 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5462 // A^c1 == C^c2 --> A == C^(c1^c2)
5463 ConstantInt *C1, *C2;
5464 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5465 Op1->hasOneUse()) {
5466 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5468 return new ICmpInst(Pred, A, Xor);
5469 }
5470
5471 // A^B == A^D -> B == D
5472 if (A == C)
5473 return new ICmpInst(Pred, B, D);
5474 if (A == D)
5475 return new ICmpInst(Pred, B, C);
5476 if (B == C)
5477 return new ICmpInst(Pred, A, D);
5478 if (B == D)
5479 return new ICmpInst(Pred, A, C);
5480 }
5481 }
5482
5483 // canoncalize:
5484 // (icmp eq/ne (and X, C), X)
5485 // -> (icmp eq/ne (and X, ~C), 0)
5486 {
5487 Constant *CMask;
5488 A = nullptr;
5489 if (match(Op0, m_OneUse(m_And(m_Specific(Op1), m_ImmConstant(CMask)))))
5490 A = Op1;
5491 else if (match(Op1, m_OneUse(m_And(m_Specific(Op0), m_ImmConstant(CMask)))))
5492 A = Op0;
5493 if (A)
5494 return new ICmpInst(Pred, Builder.CreateAnd(A, Builder.CreateNot(CMask)),
5495 Constant::getNullValue(A->getType()));
5496 }
5497
5498 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5499 // A == (A^B) -> B == 0
5500 Value *OtherVal = A == Op0 ? B : A;
5501 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5502 }
5503
5504 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
5505 if (match(Op0, m_OneUse(m_And(m_Value(A), m_Value(B)))) &&
5506 match(Op1, m_OneUse(m_And(m_Value(C), m_Value(D))))) {
5507 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
5508
5509 if (A == C) {
5510 X = B;
5511 Y = D;
5512 Z = A;
5513 } else if (A == D) {
5514 X = B;
5515 Y = C;
5516 Z = A;
5517 } else if (B == C) {
5518 X = A;
5519 Y = D;
5520 Z = B;
5521 } else if (B == D) {
5522 X = A;
5523 Y = C;
5524 Z = B;
5525 }
5526
5527 if (X) { // Build (X^Y) & Z
5528 Op1 = Builder.CreateXor(X, Y);
5529 Op1 = Builder.CreateAnd(Op1, Z);
5530 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
5531 }
5532 }
5533
5534 {
5535 // Similar to above, but specialized for constant because invert is needed:
5536 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
5537 Value *X, *Y;
5538 Constant *C;
5539 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
5540 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
5543 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
5544 }
5545 }
5546
5547 if (match(Op1, m_ZExt(m_Value(A))) &&
5548 (Op0->hasOneUse() || Op1->hasOneUse())) {
5549 // (B & (Pow2C-1)) == zext A --> A == trunc B
5550 // (B & (Pow2C-1)) != zext A --> A != trunc B
5551 const APInt *MaskC;
5552 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
5553 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
5554 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
5555 }
5556
5557 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
5558 // For lshr and ashr pairs.
5559 const APInt *AP1, *AP2;
5560 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5561 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
5562 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5563 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
5564 if (AP1 != AP2)
5565 return nullptr;
5566 unsigned TypeBits = AP1->getBitWidth();
5567 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
5568 if (ShAmt < TypeBits && ShAmt != 0) {
5569 ICmpInst::Predicate NewPred =
5571 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5572 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
5573 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
5574 }
5575 }
5576
5577 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
5578 ConstantInt *Cst1;
5579 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
5580 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
5581 unsigned TypeBits = Cst1->getBitWidth();
5582 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
5583 if (ShAmt < TypeBits && ShAmt != 0) {
5584 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5585 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
5587 I.getName() + ".mask");
5588 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
5589 }
5590 }
5591
5592 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
5593 // "icmp (and X, mask), cst"
5594 uint64_t ShAmt = 0;
5595 if (Op0->hasOneUse() &&
5596 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
5597 match(Op1, m_ConstantInt(Cst1)) &&
5598 // Only do this when A has multiple uses. This is most important to do
5599 // when it exposes other optimizations.
5600 !A->hasOneUse()) {
5601 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
5602
5603 if (ShAmt < ASize) {
5604 APInt MaskV =
5606 MaskV <<= ShAmt;
5607
5608 APInt CmpV = Cst1->getValue().zext(ASize);
5609 CmpV <<= ShAmt;
5610
5611 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
5612 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
5613 }
5614 }
5615
5617 return ICmp;
5618
5619 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks the
5620 // top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s INT_MAX",
5621 // which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a few steps
5622 // of instcombine.
5623 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
5624 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
5626 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
5627 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
5629 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
5630 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
5632 Add, ConstantInt::get(A->getType(), C.shl(1)));
5633 }
5634
5635 // Canonicalize:
5636 // Assume B_Pow2 != 0
5637 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
5638 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
5639 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
5640 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, 0, &I))
5641 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
5643
5644 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
5645 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, 0, &I))
5646 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
5647 ConstantInt::getNullValue(Op1->getType()));
5648
5649 // Canonicalize:
5650 // icmp eq/ne X, OneUse(rotate-right(X))
5651 // -> icmp eq/ne X, rotate-left(X)
5652 // We generally try to convert rotate-right -> rotate-left, this just
5653 // canonicalizes another case.
5654 CmpInst::Predicate PredUnused = Pred;
5655 if (match(&I, m_c_ICmp(PredUnused, m_Value(A),
5656 m_OneUse(m_Intrinsic<Intrinsic::fshr>(
5657 m_Deferred(A), m_Deferred(A), m_Value(B))))))
5658 return new ICmpInst(
5659 Pred, A,
5660 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
5661
5662 // Canonicalize:
5663 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
5664 Constant *Cst;
5665 if (match(&I, m_c_ICmp(PredUnused,
5668 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
5669
5670 {
5671 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5672 auto m_Matcher =
5675 m_Sub(m_Value(B), m_Deferred(A)));
5676 std::optional<bool> IsZero = std::nullopt;
5677 if (match(&I, m_c_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5678 m_Deferred(A))))
5679 IsZero = false;
5680 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5681 else if (match(&I,
5682 m_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5683 m_Zero())))
5684 IsZero = true;
5685
5686 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, /*Depth*/ 0, &I))
5687 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5688 // -> (icmp eq/ne (and X, P2), 0)
5689 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5690 // -> (icmp eq/ne (and X, P2), P2)
5691 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
5692 *IsZero ? A
5693 : ConstantInt::getNullValue(A->getType()));
5694 }
5695
5696 return nullptr;
5697}
5698
5700 ICmpInst::Predicate Pred = ICmp.getPredicate();
5701 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
5702
5703 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
5704 // The trunc masks high bits while the compare may effectively mask low bits.
5705 Value *X;
5706 const APInt *C;
5707 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
5708 return nullptr;
5709
5710 // This matches patterns corresponding to tests of the signbit as well as:
5711 // (trunc X) u< C --> (X & -C) == 0 (are all masked-high-bits clear?)
5712 // (trunc X) u> C --> (X & ~C) != 0 (are any masked-high-bits set?)
5713 APInt Mask;
5714 if (decomposeBitTestICmp(Op0, Op1, Pred, X, Mask, true /* WithTrunc */)) {
5715 Value *And = Builder.CreateAnd(X, Mask);
5716 Constant *Zero = ConstantInt::getNullValue(X->getType());
5717 return new ICmpInst(Pred, And, Zero);
5718 }
5719
5720 unsigned SrcBits = X->getType()->getScalarSizeInBits();
5721 if (Pred == ICmpInst::ICMP_ULT && C->isNegatedPowerOf2()) {
5722 // If C is a negative power-of-2 (high-bit mask):
5723 // (trunc X) u< C --> (X & C) != C (are any masked-high-bits clear?)
5724 Constant *MaskC = ConstantInt::get(X->getType(), C->zext(SrcBits));
5725 Value *And = Builder.CreateAnd(X, MaskC);
5726 return new ICmpInst(ICmpInst::ICMP_NE, And, MaskC);
5727 }
5728
5729 if (Pred == ICmpInst::ICMP_UGT && (~*C).isPowerOf2()) {
5730 // If C is not-of-power-of-2 (one clear bit):
5731 // (trunc X) u> C --> (X & (C+1)) == C+1 (are all masked-high-bits set?)
5732 Constant *MaskC = ConstantInt::get(X->getType(), (*C + 1).zext(SrcBits));
5733 Value *And = Builder.CreateAnd(X, MaskC);
5734 return new ICmpInst(ICmpInst::ICMP_EQ, And, MaskC);
5735 }
5736
5737 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
5738 if (II->getIntrinsicID() == Intrinsic::cttz ||
5739 II->getIntrinsicID() == Intrinsic::ctlz) {
5740 unsigned MaxRet = SrcBits;
5741 // If the "is_zero_poison" argument is set, then we know at least
5742 // one bit is set in the input, so the result is always at least one
5743 // less than the full bitwidth of that input.
5744 if (match(II->getArgOperand(1), m_One()))
5745 MaxRet--;
5746
5747 // Make sure the destination is wide enough to hold the largest output of
5748 // the intrinsic.
5749 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
5750 if (Instruction *I =
5751 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
5752 return I;
5753 }
5754 }
5755
5756 return nullptr;
5757}
5758
5760 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
5761 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
5762 Value *X;
5763 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
5764 return nullptr;
5765
5766 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
5767 bool IsSignedCmp = ICmp.isSigned();
5768
5769 // icmp Pred (ext X), (ext Y)
5770 Value *Y;
5771 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
5772 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
5773 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
5774
5775 if (IsZext0 != IsZext1) {
5776 // If X and Y and both i1
5777 // (icmp eq/ne (zext X) (sext Y))
5778 // eq -> (icmp eq (or X, Y), 0)
5779 // ne -> (icmp ne (or X, Y), 0)
5780 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
5781 Y->getType()->isIntOrIntVectorTy(1))
5782 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
5783 Constant::getNullValue(X->getType()));
5784
5785 // If we have mismatched casts and zext has the nneg flag, we can
5786 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
5787
5788 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
5789 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
5790
5791 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
5792 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
5793
5794 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
5795 IsSignedExt = true;
5796 else
5797 return nullptr;
5798 }
5799
5800 // Not an extension from the same type?
5801 Type *XTy = X->getType(), *YTy = Y->getType();
5802 if (XTy != YTy) {
5803 // One of the casts must have one use because we are creating a new cast.
5804 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
5805 return nullptr;
5806 // Extend the narrower operand to the type of the wider operand.
5807 CastInst::CastOps CastOpcode =
5808 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
5809 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
5810 X = Builder.CreateCast(CastOpcode, X, YTy);
5811 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
5812 Y = Builder.CreateCast(CastOpcode, Y, XTy);
5813 else
5814 return nullptr;
5815 }
5816
5817 // (zext X) == (zext Y) --> X == Y
5818 // (sext X) == (sext Y) --> X == Y
5819 if (ICmp.isEquality())
5820 return new ICmpInst(ICmp.getPredicate(), X, Y);
5821
5822 // A signed comparison of sign extended values simplifies into a
5823 // signed comparison.
5824 if (IsSignedCmp && IsSignedExt)
5825 return new ICmpInst(ICmp.getPredicate(), X, Y);
5826
5827 // The other three cases all fold into an unsigned comparison.
5828 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
5829 }
5830
5831 // Below here, we are only folding a compare with constant.
5832 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
5833 if (!C)
5834 return nullptr;
5835
5836 // If a lossless truncate is possible...
5837 Type *SrcTy = CastOp0->getSrcTy();
5838 Constant *Res = getLosslessTrunc(C, SrcTy, CastOp0->getOpcode());
5839 if (Res) {
5840 if (ICmp.isEquality())
5841 return new ICmpInst(ICmp.getPredicate(), X, Res);
5842
5843 // A signed comparison of sign extended values simplifies into a
5844 // signed comparison.
5845 if (IsSignedExt && IsSignedCmp)
5846 return new ICmpInst(ICmp.getPredicate(), X, Res);
5847
5848 // The other three cases all fold into an unsigned comparison.
5849 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
5850 }
5851
5852 // The re-extended constant changed, partly changed (in the case of a vector),
5853 // or could not be determined to be equal (in the case of a constant
5854 // expression), so the constant cannot be represented in the shorter type.
5855 // All the cases that fold to true or false will have already been handled
5856 // by simplifyICmpInst, so only deal with the tricky case.
5857 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
5858 return nullptr;
5859
5860 // Is source op positive?
5861 // icmp ult (sext X), C --> icmp sgt X, -1
5862 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
5864
5865 // Is source op negative?
5866 // icmp ugt (sext X), C --> icmp slt X, 0
5867 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
5869}
5870
5871/// Handle icmp (cast x), (cast or constant).
5873 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
5874 // icmp compares only pointer's value.
5875 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
5876 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
5877 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
5878 if (SimplifiedOp0 || SimplifiedOp1)
5879 return new ICmpInst(ICmp.getPredicate(),
5880 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
5881 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
5882
5883 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
5884 if (!CastOp0)
5885 return nullptr;
5886 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
5887 return nullptr;
5888
5889 Value *Op0Src = CastOp0->getOperand(0);
5890 Type *SrcTy = CastOp0->getSrcTy();
5891 Type *DestTy = CastOp0->getDestTy();
5892
5893 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
5894 // integer type is the same size as the pointer type.
5895 auto CompatibleSizes = [&](Type *SrcTy, Type *DestTy) {
5896 if (isa<VectorType>(SrcTy)) {
5897 SrcTy = cast<VectorType>(SrcTy)->getElementType();
5898 DestTy = cast<VectorType>(DestTy)->getElementType();
5899 }
5900 return DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth();
5901 };
5902 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
5903 CompatibleSizes(SrcTy, DestTy)) {
5904 Value *NewOp1 = nullptr;
5905 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
5906 Value *PtrSrc = PtrToIntOp1->getOperand(0);
5907 if (PtrSrc->getType() == Op0Src->getType())
5908 NewOp1 = PtrToIntOp1->getOperand(0);
5909 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
5910 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
5911 }
5912
5913 if (NewOp1)
5914 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
5915 }
5916
5917 if (Instruction *R = foldICmpWithTrunc(ICmp))
5918 return R;
5919
5920 return foldICmpWithZextOrSext(ICmp);
5921}
5922
5923static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
5924 switch (BinaryOp) {
5925 default:
5926 llvm_unreachable("Unsupported binary op");
5927 case Instruction::Add:
5928 case Instruction::Sub:
5929 return match(RHS, m_Zero());
5930 case Instruction::Mul:
5931 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
5932 match(RHS, m_One());
5933 }
5934}
5935
5938 bool IsSigned, Value *LHS, Value *RHS,
5939 Instruction *CxtI) const {
5940 switch (BinaryOp) {
5941 default:
5942 llvm_unreachable("Unsupported binary op");
5943 case Instruction::Add:
5944 if (IsSigned)
5945 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
5946 else
5947 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
5948 case Instruction::Sub:
5949 if (IsSigned)
5950 return computeOverflowForSignedSub(LHS, RHS, CxtI);
5951 else
5952 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
5953 case Instruction::Mul:
5954 if (IsSigned)
5955 return computeOverflowForSignedMul(LHS, RHS, CxtI);
5956 else
5957 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
5958 }
5959}
5960
5961bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
5962 bool IsSigned, Value *LHS,
5963 Value *RHS, Instruction &OrigI,
5964 Value *&Result,
5965 Constant *&Overflow) {
5966 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
5967 std::swap(LHS, RHS);
5968
5969 // If the overflow check was an add followed by a compare, the insertion point
5970 // may be pointing to the compare. We want to insert the new instructions
5971 // before the add in case there are uses of the add between the add and the
5972 // compare.
5973 Builder.SetInsertPoint(&OrigI);
5974
5975 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
5976 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
5977 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
5978
5979 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
5980 Result = LHS;
5981 Overflow = ConstantInt::getFalse(OverflowTy);
5982 return true;
5983 }
5984
5985 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
5987 return false;
5990 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
5991 Result->takeName(&OrigI);
5992 Overflow = ConstantInt::getTrue(OverflowTy);
5993 return true;
5995 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
5996 Result->takeName(&OrigI);
5997 Overflow = ConstantInt::getFalse(OverflowTy);
5998 if (auto *Inst = dyn_cast<Instruction>(Result)) {
5999 if (IsSigned)
6000 Inst->setHasNoSignedWrap();
6001 else
6002 Inst->setHasNoUnsignedWrap();
6003 }
6004 return true;
6005 }
6006
6007 llvm_unreachable("Unexpected overflow result");
6008}
6009
6010/// Recognize and process idiom involving test for multiplication
6011/// overflow.
6012///
6013/// The caller has matched a pattern of the form:
6014/// I = cmp u (mul(zext A, zext B), V
6015/// The function checks if this is a test for overflow and if so replaces
6016/// multiplication with call to 'mul.with.overflow' intrinsic.
6017///
6018/// \param I Compare instruction.
6019/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6020/// the compare instruction. Must be of integer type.
6021/// \param OtherVal The other argument of compare instruction.
6022/// \returns Instruction which must replace the compare instruction, NULL if no
6023/// replacement required.
6025 const APInt *OtherVal,
6026 InstCombinerImpl &IC) {
6027 // Don't bother doing this transformation for pointers, don't do it for
6028 // vectors.
6029 if (!isa<IntegerType>(MulVal->getType()))
6030 return nullptr;
6031
6032 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6033 if (!MulInstr)
6034 return nullptr;
6035 assert(MulInstr->getOpcode() == Instruction::Mul);
6036
6037 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6038 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6039 assert(LHS->getOpcode() == Instruction::ZExt);
6040 assert(RHS->getOpcode() == Instruction::ZExt);
6041 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6042
6043 // Calculate type and width of the result produced by mul.with.overflow.
6044 Type *TyA = A->getType(), *TyB = B->getType();
6045 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6046 WidthB = TyB->getPrimitiveSizeInBits();
6047 unsigned MulWidth;
6048 Type *MulType;
6049 if (WidthB > WidthA) {
6050 MulWidth = WidthB;
6051 MulType = TyB;
6052 } else {
6053 MulWidth = WidthA;
6054 MulType = TyA;
6055 }
6056
6057 // In order to replace the original mul with a narrower mul.with.overflow,
6058 // all uses must ignore upper bits of the product. The number of used low
6059 // bits must be not greater than the width of mul.with.overflow.
6060 if (MulVal->hasNUsesOrMore(2))
6061 for (User *U : MulVal->users()) {
6062 if (U == &I)
6063 continue;
6064 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6065 // Check if truncation ignores bits above MulWidth.
6066 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6067 if (TruncWidth > MulWidth)
6068 return nullptr;
6069 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6070 // Check if AND ignores bits above MulWidth.
6071 if (BO->getOpcode() != Instruction::And)
6072 return nullptr;
6073 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6074 const APInt &CVal = CI->getValue();
6075 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6076 return nullptr;
6077 } else {
6078 // In this case we could have the operand of the binary operation
6079 // being defined in another block, and performing the replacement
6080 // could break the dominance relation.
6081 return nullptr;
6082 }
6083 } else {
6084 // Other uses prohibit this transformation.
6085 return nullptr;
6086 }
6087 }
6088
6089 // Recognize patterns
6090 switch (I.getPredicate()) {
6091 case ICmpInst::ICMP_UGT: {
6092 // Recognize pattern:
6093 // mulval = mul(zext A, zext B)
6094 // cmp ugt mulval, max
6095 APInt MaxVal = APInt::getMaxValue(MulWidth);
6096 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6097 if (MaxVal.eq(*OtherVal))
6098 break; // Recognized
6099 return nullptr;
6100 }
6101
6102 case ICmpInst::ICMP_ULT: {
6103 // Recognize pattern:
6104 // mulval = mul(zext A, zext B)
6105 // cmp ule mulval, max + 1
6106 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6107 if (MaxVal.eq(*OtherVal))
6108 break; // Recognized
6109 return nullptr;
6110 }
6111
6112 default:
6113 return nullptr;
6114 }
6115
6116 InstCombiner::BuilderTy &Builder = IC.Builder;
6117 Builder.SetInsertPoint(MulInstr);
6118
6119 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6120 Value *MulA = A, *MulB = B;
6121 if (WidthA < MulWidth)
6122 MulA = Builder.CreateZExt(A, MulType);
6123 if (WidthB < MulWidth)
6124 MulB = Builder.CreateZExt(B, MulType);
6126 I.getModule(), Intrinsic::umul_with_overflow, MulType);
6127 CallInst *Call = Builder.CreateCall(F, {MulA, MulB}, "umul");
6128 IC.addToWorklist(MulInstr);
6129
6130 // If there are uses of mul result other than the comparison, we know that
6131 // they are truncation or binary AND. Change them to use result of
6132 // mul.with.overflow and adjust properly mask/size.
6133 if (MulVal->hasNUsesOrMore(2)) {
6134 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6135 for (User *U : make_early_inc_range(MulVal->users())) {
6136 if (U == &I)
6137 continue;
6138 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6139 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6140 IC.replaceInstUsesWith(*TI, Mul);
6141 else
6142 TI->setOperand(0, Mul);
6143 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6144 assert(BO->getOpcode() == Instruction::And);
6145 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6146 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6147 APInt ShortMask = CI->getValue().trunc(MulWidth);
6148 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6149 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6150 IC.replaceInstUsesWith(*BO, Zext);
6151 } else {
6152 llvm_unreachable("Unexpected Binary operation");
6153 }
6154 IC.addToWorklist(cast<Instruction>(U));
6155 }
6156 }
6157
6158 // The original icmp gets replaced with the overflow value, maybe inverted
6159 // depending on predicate.
6160 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6161 Value *Res = Builder.CreateExtractValue(Call, 1);
6162 return BinaryOperator::CreateNot(Res);
6163 }
6164
6165 return ExtractValueInst::Create(Call, 1);
6166}
6167
6168/// When performing a comparison against a constant, it is possible that not all
6169/// the bits in the LHS are demanded. This helper method computes the mask that
6170/// IS demanded.
6172 const APInt *RHS;
6173 if (!match(I.getOperand(1), m_APInt(RHS)))
6175
6176 // If this is a normal comparison, it demands all bits. If it is a sign bit
6177 // comparison, it only demands the sign bit.
6178 bool UnusedBit;
6179 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6181
6182 switch (I.getPredicate()) {
6183 // For a UGT comparison, we don't care about any bits that
6184 // correspond to the trailing ones of the comparand. The value of these
6185 // bits doesn't impact the outcome of the comparison, because any value
6186 // greater than the RHS must differ in a bit higher than these due to carry.
6187 case ICmpInst::ICMP_UGT:
6188 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6189
6190 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6191 // Any value less than the RHS must differ in a higher bit because of carries.
6192 case ICmpInst::ICMP_ULT:
6193 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6194
6195 default:
6197 }
6198}
6199
6200/// Check that one use is in the same block as the definition and all
6201/// other uses are in blocks dominated by a given block.
6202///
6203/// \param DI Definition
6204/// \param UI Use
6205/// \param DB Block that must dominate all uses of \p DI outside
6206/// the parent block
6207/// \return true when \p UI is the only use of \p DI in the parent block
6208/// and all other uses of \p DI are in blocks dominated by \p DB.
6209///
6211 const Instruction *UI,
6212 const BasicBlock *DB) const {
6213 assert(DI && UI && "Instruction not defined\n");
6214 // Ignore incomplete definitions.
6215 if (!DI->getParent())
6216 return false;
6217 // DI and UI must be in the same block.
6218 if (DI->getParent() != UI->getParent())
6219 return false;
6220 // Protect from self-referencing blocks.
6221 if (DI->getParent() == DB)
6222 return false;
6223 for (const User *U : DI->users()) {
6224 auto *Usr = cast<Instruction>(U);
6225 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6226 return false;
6227 }
6228 return true;
6229}
6230
6231/// Return true when the instruction sequence within a block is select-cmp-br.
6232static bool isChainSelectCmpBranch(const SelectInst *SI) {
6233 const BasicBlock *BB = SI->getParent();
6234 if (!BB)
6235 return false;
6236 auto *BI = dyn_cast_or_null<BranchInst>(BB->getTerminator());
6237 if (!BI || BI->getNumSuccessors() != 2)
6238 return false;
6239 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6240 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6241 return false;
6242 return true;
6243}
6244
6245/// True when a select result is replaced by one of its operands
6246/// in select-icmp sequence. This will eventually result in the elimination
6247/// of the select.
6248///
6249/// \param SI Select instruction
6250/// \param Icmp Compare instruction
6251/// \param SIOpd Operand that replaces the select
6252///
6253/// Notes:
6254/// - The replacement is global and requires dominator information
6255/// - The caller is responsible for the actual replacement
6256///
6257/// Example:
6258///
6259/// entry:
6260/// %4 = select i1 %3, %C* %0, %C* null
6261/// %5 = icmp eq %C* %4, null
6262/// br i1 %5, label %9, label %7
6263/// ...
6264/// ; <label>:7 ; preds = %entry
6265/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6266/// ...
6267///
6268/// can be transformed to
6269///
6270/// %5 = icmp eq %C* %0, null
6271/// %6 = select i1 %3, i1 %5, i1 true
6272/// br i1 %6, label %9, label %7
6273/// ...
6274/// ; <label>:7 ; preds = %entry
6275/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6276///
6277/// Similar when the first operand of the select is a constant or/and
6278/// the compare is for not equal rather than equal.
6279///
6280/// NOTE: The function is only called when the select and compare constants
6281/// are equal, the optimization can work only for EQ predicates. This is not a
6282/// major restriction since a NE compare should be 'normalized' to an equal
6283/// compare, which usually happens in the combiner and test case
6284/// select-cmp-br.ll checks for it.
6286 const ICmpInst *Icmp,
6287 const unsigned SIOpd) {
6288 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6290 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6291 // The check for the single predecessor is not the best that can be
6292 // done. But it protects efficiently against cases like when SI's
6293 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6294 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6295 // replaced can be reached on either path. So the uniqueness check
6296 // guarantees that the path all uses of SI (outside SI's parent) are on
6297 // is disjoint from all other paths out of SI. But that information
6298 // is more expensive to compute, and the trade-off here is in favor
6299 // of compile-time. It should also be noticed that we check for a single
6300 // predecessor and not only uniqueness. This to handle the situation when
6301 // Succ and Succ1 points to the same basic block.
6302 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6303 NumSel++;
6304 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6305 return true;
6306 }
6307 }
6308 return false;
6309}
6310
6311/// Try to fold the comparison based on range information we can get by checking
6312/// whether bits are known to be zero or one in the inputs.
6314 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6315 Type *Ty = Op0->getType();
6316 ICmpInst::Predicate Pred = I.getPredicate();
6317
6318 // Get scalar or pointer size.
6319 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6320 ? Ty->getScalarSizeInBits()
6322
6323 if (!BitWidth)
6324 return nullptr;
6325
6326 KnownBits Op0Known(BitWidth);
6327 KnownBits Op1Known(BitWidth);
6328
6329 {
6330 // Don't use dominating conditions when folding icmp using known bits. This
6331 // may convert signed into unsigned predicates in ways that other passes
6332 // (especially IndVarSimplify) may not be able to reliably undo.
6333 SQ.DC = nullptr;
6334 auto _ = make_scope_exit([&]() { SQ.DC = &DC; });
6336 Op0Known, 0))
6337 return &I;
6338
6339 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, 0))
6340 return &I;
6341 }
6342
6343 // Given the known and unknown bits, compute a range that the LHS could be
6344 // in. Compute the Min, Max and RHS values based on the known bits. For the
6345 // EQ and NE we use unsigned values.
6346 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6347 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6348 if (I.isSigned()) {
6349 Op0Min = Op0Known.getSignedMinValue();
6350 Op0Max = Op0Known.getSignedMaxValue();
6351 Op1Min = Op1Known.getSignedMinValue();
6352 Op1Max = Op1Known.getSignedMaxValue();
6353 } else {
6354 Op0Min = Op0Known.getMinValue();
6355 Op0Max = Op0Known.getMaxValue();
6356 Op1Min = Op1Known.getMinValue();
6357 Op1Max = Op1Known.getMaxValue();
6358 }
6359
6360 // If Min and Max are known to be the same, then SimplifyDemandedBits figured
6361 // out that the LHS or RHS is a constant. Constant fold this now, so that
6362 // code below can assume that Min != Max.
6363 if (!isa<Constant>(Op0) && Op0Min == Op0Max)
6364 return new ICmpInst(Pred, ConstantExpr::getIntegerValue(Ty, Op0Min), Op1);
6365 if (!isa<Constant>(Op1) && Op1Min == Op1Max)
6366 return new ICmpInst(Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Min));
6367
6368 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6369 // min/max canonical compare with some other compare. That could lead to
6370 // conflict with select canonicalization and infinite looping.
6371 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6372 auto isMinMaxCmp = [&](Instruction &Cmp) {
6373 if (!Cmp.hasOneUse())
6374 return false;
6375 Value *A, *B;
6376 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6378 return false;
6379 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6380 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6381 };
6382 if (!isMinMaxCmp(I)) {
6383 switch (Pred) {
6384 default:
6385 break;
6386 case ICmpInst::ICMP_ULT: {
6387 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6388 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6389 const APInt *CmpC;
6390 if (match(Op1, m_APInt(CmpC))) {
6391 // A <u C -> A == C-1 if min(A)+1 == C
6392 if (*CmpC == Op0Min + 1)
6393 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6394 ConstantInt::get(Op1->getType(), *CmpC - 1));
6395 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6396 // exceeds the log2 of C.
6397 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6398 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6399 Constant::getNullValue(Op1->getType()));
6400 }
6401 break;
6402 }
6403 case ICmpInst::ICMP_UGT: {
6404 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6405 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6406 const APInt *CmpC;
6407 if (match(Op1, m_APInt(CmpC))) {
6408 // A >u C -> A == C+1 if max(a)-1 == C
6409 if (*CmpC == Op0Max - 1)
6410 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6411 ConstantInt::get(Op1->getType(), *CmpC + 1));
6412 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6413 // exceeds the log2 of C.
6414 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6415 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6416 Constant::getNullValue(Op1->getType()));
6417 }
6418 break;
6419 }
6420 case ICmpInst::ICMP_SLT: {
6421 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6422 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6423 const APInt *CmpC;
6424 if (match(Op1, m_APInt(CmpC))) {
6425 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6426 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6427 ConstantInt::get(Op1->getType(), *CmpC - 1));
6428 }
6429 break;
6430 }
6431 case ICmpInst::ICMP_SGT: {
6432 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6433 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6434 const APInt *CmpC;
6435 if (match(Op1, m_APInt(CmpC))) {
6436 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6437 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6438 ConstantInt::get(Op1->getType(), *CmpC + 1));
6439 }
6440 break;
6441 }
6442 }
6443 }
6444
6445 // Based on the range information we know about the LHS, see if we can
6446 // simplify this comparison. For example, (x&4) < 8 is always true.
6447 switch (Pred) {
6448 default:
6449 llvm_unreachable("Unknown icmp opcode!");
6450 case ICmpInst::ICMP_EQ:
6451 case ICmpInst::ICMP_NE: {
6452 if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
6453 return replaceInstUsesWith(
6454 I, ConstantInt::getBool(I.getType(), Pred == CmpInst::ICMP_NE));
6455
6456 // If all bits are known zero except for one, then we know at most one bit
6457 // is set. If the comparison is against zero, then this is a check to see if
6458 // *that* bit is set.
6459 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6460 if (Op1Known.isZero()) {
6461 // If the LHS is an AND with the same constant, look through it.
6462 Value *LHS = nullptr;
6463 const APInt *LHSC;
6464 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6465 *LHSC != Op0KnownZeroInverted)
6466 LHS = Op0;
6467
6468 Value *X;
6469 const APInt *C1;
6470 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6471 Type *XTy = X->getType();
6472 unsigned Log2C1 = C1->countr_zero();
6473 APInt C2 = Op0KnownZeroInverted;
6474 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6475 if (C2Pow2.isPowerOf2()) {
6476 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6477 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6478 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6479 unsigned Log2C2 = C2Pow2.countr_zero();
6480 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6481 auto NewPred =
6483 return new ICmpInst(NewPred, X, CmpC);
6484 }
6485 }
6486 }
6487
6488 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6489 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
6490 (Op0Known & Op1Known) == Op0Known)
6491 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6492 ConstantInt::getNullValue(Op1->getType()));
6493 break;
6494 }
6495 case ICmpInst::ICMP_ULT: {
6496 if (Op0Max.ult(Op1Min)) // A <u B -> true if max(A) < min(B)
6497 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6498 if (Op0Min.uge(Op1Max)) // A <u B -> false if min(A) >= max(B)
6499 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6500 break;
6501 }
6502 case ICmpInst::ICMP_UGT: {
6503 if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B)
6504 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6505 if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B)
6506 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6507 break;
6508 }
6509 case ICmpInst::ICMP_SLT: {
6510 if (Op0Max.slt(Op1Min)) // A <s B -> true if max(A) < min(C)
6511 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6512 if (Op0Min.sge(Op1Max)) // A <s B -> false if min(A) >= max(C)
6513 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6514 break;
6515 }
6516 case ICmpInst::ICMP_SGT: {
6517 if (Op0Min.sgt(Op1Max)) // A >s B -> true if min(A) > max(B)
6518 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6519 if (Op0Max.sle(Op1Min)) // A >s B -> false if max(A) <= min(B)
6520 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6521 break;
6522 }
6523 case ICmpInst::ICMP_SGE:
6524 assert(!isa<ConstantInt>(Op1) && "ICMP_SGE with ConstantInt not folded!");
6525 if (Op0Min.sge(Op1Max)) // A >=s B -> true if min(A) >= max(B)
6526 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6527 if (Op0Max.slt(Op1Min)) // A >=s B -> false if max(A) < min(B)
6528 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6529 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
6530 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6531 break;
6532 case ICmpInst::ICMP_SLE:
6533 assert(!isa<ConstantInt>(Op1) && "ICMP_SLE with ConstantInt not folded!");
6534 if (Op0Max.sle(Op1Min)) // A <=s B -> true if max(A) <= min(B)
6535 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6536 if (Op0Min.sgt(Op1Max)) // A <=s B -> false if min(A) > max(B)
6537 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6538 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
6539 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6540 break;
6541 case ICmpInst::ICMP_UGE:
6542 assert(!isa<ConstantInt>(Op1) && "ICMP_UGE with ConstantInt not folded!");
6543 if (Op0Min.uge(Op1Max)) // A >=u B -> true if min(A) >= max(B)
6544 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6545 if (Op0Max.ult(Op1Min)) // A >=u B -> false if max(A) < min(B)
6546 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6547 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
6548 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6549 break;
6550 case ICmpInst::ICMP_ULE:
6551 assert(!isa<ConstantInt>(Op1) && "ICMP_ULE with ConstantInt not folded!");
6552 if (Op0Max.ule(Op1Min)) // A <=u B -> true if max(A) <= min(B)
6553 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6554 if (Op0Min.ugt(Op1Max)) // A <=u B -> false if min(A) > max(B)
6555 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6556 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
6557 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6558 break;
6559 }
6560
6561 // Turn a signed comparison into an unsigned one if both operands are known to
6562 // have the same sign.
6563 if (I.isSigned() &&
6564 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6565 (Op0Known.One.isNegative() && Op1Known.One.isNegative())))
6566 return new ICmpInst(I.getUnsignedPredicate(), Op0, Op1);
6567
6568 return nullptr;
6569}
6570
6571/// If one operand of an icmp is effectively a bool (value range of {0,1}),
6572/// then try to reduce patterns based on that limit.
6574 Value *X, *Y;
6576
6577 // X must be 0 and bool must be true for "ULT":
6578 // X <u (zext i1 Y) --> (X == 0) & Y
6579 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
6580 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
6581 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
6582
6583 // X must be 0 or bool must be true for "ULE":
6584 // X <=u (sext i1 Y) --> (X == 0) | Y
6585 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
6586 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
6587 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
6588
6589 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
6590 ICmpInst::Predicate Pred1, Pred2;
6591 const APInt *C;
6592 Instruction *ExtI;
6593 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
6596 m_APInt(C)))))) &&
6597 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
6598 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
6599 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
6600 auto CreateRangeCheck = [&] {
6601 Value *CmpV1 =
6602 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
6603 Value *CmpV2 = Builder.CreateICmp(
6604 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
6606 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
6607 CmpV1, CmpV2);
6608 };
6609 if (C->isZero()) {
6610 if (Pred2 == ICmpInst::ICMP_EQ) {
6611 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
6612 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
6613 return replaceInstUsesWith(
6614 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6615 } else if (!IsSExt || HasOneUse) {
6616 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
6617 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
6618 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
6619 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X == -1
6620 return CreateRangeCheck();
6621 }
6622 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
6623 if (Pred2 == ICmpInst::ICMP_NE) {
6624 // icmp eq X, (zext (icmp ne X, 1)) --> false
6625 // icmp ne X, (zext (icmp ne X, 1)) --> true
6626 // icmp eq X, (sext (icmp ne X, -1)) --> false
6627 // icmp ne X, (sext (icmp ne X, -1)) --> true
6628 return replaceInstUsesWith(
6629 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6630 } else if (!IsSExt || HasOneUse) {
6631 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
6632 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
6633 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
6634 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
6635 return CreateRangeCheck();
6636 }
6637 } else {
6638 // when C != 0 && C != 1:
6639 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
6640 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
6641 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
6642 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
6643 // when C != 0 && C != -1:
6644 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
6645 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
6646 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
6647 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
6648 return ICmpInst::Create(
6649 Instruction::ICmp, Pred1, X,
6650 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
6651 ? (IsSExt ? -1 : 1)
6652 : 0));
6653 }
6654 }
6655
6656 return nullptr;
6657}
6658
6659std::optional<std::pair<CmpInst::Predicate, Constant *>>
6661 Constant *C) {
6663 "Only for relational integer predicates.");
6664
6665 Type *Type = C->getType();
6666 bool IsSigned = ICmpInst::isSigned(Pred);
6667
6669 bool WillIncrement =
6670 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
6671
6672 // Check if the constant operand can be safely incremented/decremented
6673 // without overflowing/underflowing.
6674 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
6675 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
6676 };
6677
6678 Constant *SafeReplacementConstant = nullptr;
6679 if (auto *CI = dyn_cast<ConstantInt>(C)) {
6680 // Bail out if the constant can't be safely incremented/decremented.
6681 if (!ConstantIsOk(CI))
6682 return std::nullopt;
6683 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
6684 unsigned NumElts = FVTy->getNumElements();
6685 for (unsigned i = 0; i != NumElts; ++i) {
6686 Constant *Elt = C->getAggregateElement(i);
6687 if (!Elt)
6688 return std::nullopt;
6689
6690 if (isa<UndefValue>(Elt))
6691 continue;
6692
6693 // Bail out if we can't determine if this constant is min/max or if we
6694 // know that this constant is min/max.
6695 auto *CI = dyn_cast<ConstantInt>(Elt);
6696 if (!CI || !ConstantIsOk(CI))
6697 return std::nullopt;
6698
6699 if (!SafeReplacementConstant)
6700 SafeReplacementConstant = CI;
6701 }
6702 } else if (isa<VectorType>(C->getType())) {
6703 // Handle scalable splat
6704 Value *SplatC = C->getSplatValue();
6705 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
6706 // Bail out if the constant can't be safely incremented/decremented.
6707 if (!CI || !ConstantIsOk(CI))
6708 return std::nullopt;
6709 } else {
6710 // ConstantExpr?
6711 return std::nullopt;
6712 }
6713
6714 // It may not be safe to change a compare predicate in the presence of
6715 // undefined elements, so replace those elements with the first safe constant
6716 // that we found.
6717 // TODO: in case of poison, it is safe; let's replace undefs only.
6718 if (C->containsUndefOrPoisonElement()) {
6719 assert(SafeReplacementConstant && "Replacement constant not set");
6720 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
6721 }
6722
6724
6725 // Increment or decrement the constant.
6726 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
6727 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
6728
6729 return std::make_pair(NewPred, NewC);
6730}
6731
6732/// If we have an icmp le or icmp ge instruction with a constant operand, turn
6733/// it into the appropriate icmp lt or icmp gt instruction. This transform
6734/// allows them to be folded in visitICmpInst.
6736 ICmpInst::Predicate Pred = I.getPredicate();
6737 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
6739 return nullptr;
6740
6741 Value *Op0 = I.getOperand(0);
6742 Value *Op1 = I.getOperand(1);
6743 auto *Op1C = dyn_cast<Constant>(Op1);
6744 if (!Op1C)
6745 return nullptr;
6746
6747 auto FlippedStrictness =
6749 if (!FlippedStrictness)
6750 return nullptr;
6751
6752 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
6753}
6754
6755/// If we have a comparison with a non-canonical predicate, if we can update
6756/// all the users, invert the predicate and adjust all the users.
6758 // Is the predicate already canonical?
6759 CmpInst::Predicate Pred = I.getPredicate();
6761 return nullptr;
6762
6763 // Can all users be adjusted to predicate inversion?
6764 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
6765 return nullptr;
6766
6767 // Ok, we can canonicalize comparison!
6768 // Let's first invert the comparison's predicate.
6769 I.setPredicate(CmpInst::getInversePredicate(Pred));
6770 I.setName(I.getName() + ".not");
6771
6772 // And, adapt users.
6774
6775 return &I;
6776}
6777
6778/// Integer compare with boolean values can always be turned into bitwise ops.
6780 InstCombiner::BuilderTy &Builder) {
6781 Value *A = I.getOperand(0), *B = I.getOperand(1);
6782 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
6783
6784 // A boolean compared to true/false can be simplified to Op0/true/false in
6785 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
6786 // Cases not handled by InstSimplify are always 'not' of Op0.
6787 if (match(B, m_Zero())) {
6788 switch (I.getPredicate()) {
6789 case CmpInst::ICMP_EQ: // A == 0 -> !A
6790 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
6791 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
6793 default:
6794 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6795 }
6796 } else if (match(B, m_One())) {
6797 switch (I.getPredicate()) {
6798 case CmpInst::ICMP_NE: // A != 1 -> !A
6799 case CmpInst::ICMP_ULT: // A <u 1 -> !A
6800 case CmpInst::ICMP_SGT: // A >s -1 -> !A
6802 default:
6803 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6804 }
6805 }
6806
6807 switch (I.getPredicate()) {
6808 default:
6809 llvm_unreachable("Invalid icmp instruction!");
6810 case ICmpInst::ICMP_EQ:
6811 // icmp eq i1 A, B -> ~(A ^ B)
6812 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
6813
6814 case ICmpInst::ICMP_NE:
6815 // icmp ne i1 A, B -> A ^ B
6816 return BinaryOperator::CreateXor(A, B);
6817
6818 case ICmpInst::ICMP_UGT:
6819 // icmp ugt -> icmp ult
6820 std::swap(A, B);
6821 [[fallthrough]];
6822 case ICmpInst::ICMP_ULT:
6823 // icmp ult i1 A, B -> ~A & B
6824 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
6825
6826 case ICmpInst::ICMP_SGT:
6827 // icmp sgt -> icmp slt
6828 std::swap(A, B);
6829 [[fallthrough]];
6830 case ICmpInst::ICMP_SLT:
6831 // icmp slt i1 A, B -> A & ~B
6832 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
6833
6834 case ICmpInst::ICMP_UGE:
6835 // icmp uge -> icmp ule
6836 std::swap(A, B);
6837 [[fallthrough]];
6838 case ICmpInst::ICMP_ULE:
6839 // icmp ule i1 A, B -> ~A | B
6840 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
6841
6842 case ICmpInst::ICMP_SGE:
6843 // icmp sge -> icmp sle
6844 std::swap(A, B);
6845 [[fallthrough]];
6846 case ICmpInst::ICMP_SLE:
6847 // icmp sle i1 A, B -> A | ~B
6848 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
6849 }
6850}
6851
6852// Transform pattern like:
6853// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
6854// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
6855// Into:
6856// (X l>> Y) != 0
6857// (X l>> Y) == 0
6859 InstCombiner::BuilderTy &Builder) {
6860 ICmpInst::Predicate Pred, NewPred;
6861 Value *X, *Y;
6862 if (match(&Cmp,
6863 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
6864 switch (Pred) {
6865 case ICmpInst::ICMP_ULE:
6866 NewPred = ICmpInst::ICMP_NE;
6867 break;
6868 case ICmpInst::ICMP_UGT:
6869 NewPred = ICmpInst::ICMP_EQ;
6870 break;
6871 default:
6872 return nullptr;
6873 }
6874 } else if (match(&Cmp, m_c_ICmp(Pred,
6877 m_Add(m_Shl(m_One(), m_Value(Y)),
6878 m_AllOnes()))),
6879 m_Value(X)))) {
6880 // The variant with 'add' is not canonical, (the variant with 'not' is)
6881 // we only get it because it has extra uses, and can't be canonicalized,
6882
6883 switch (Pred) {
6884 case ICmpInst::ICMP_ULT:
6885 NewPred = ICmpInst::ICMP_NE;
6886 break;
6887 case ICmpInst::ICMP_UGE:
6888 NewPred = ICmpInst::ICMP_EQ;
6889 break;
6890 default:
6891 return nullptr;
6892 }
6893 } else
6894 return nullptr;
6895
6896 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
6897 Constant *Zero = Constant::getNullValue(NewX->getType());
6898 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
6899}
6900
6902 InstCombiner::BuilderTy &Builder) {
6903 const CmpInst::Predicate Pred = Cmp.getPredicate();
6904 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
6905 Value *V1, *V2;
6906
6907 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
6908 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
6909 if (auto *I = dyn_cast<Instruction>(V))
6910 I->copyIRFlags(&Cmp);
6911 Module *M = Cmp.getModule();
6913 M, Intrinsic::experimental_vector_reverse, V->getType());
6914 return CallInst::Create(F, V);
6915 };
6916
6917 if (match(LHS, m_VecReverse(m_Value(V1)))) {
6918 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
6919 if (match(RHS, m_VecReverse(m_Value(V2))) &&
6920 (LHS->hasOneUse() || RHS->hasOneUse()))
6921 return createCmpReverse(Pred, V1, V2);
6922
6923 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
6924 if (LHS->hasOneUse() && isSplatValue(RHS))
6925 return createCmpReverse(Pred, V1, RHS);
6926 }
6927 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
6928 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
6929 return createCmpReverse(Pred, LHS, V2);
6930
6931 ArrayRef<int> M;
6932 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
6933 return nullptr;
6934
6935 // If both arguments of the cmp are shuffles that use the same mask and
6936 // shuffle within a single vector, move the shuffle after the cmp:
6937 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
6938 Type *V1Ty = V1->getType();
6939 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
6940 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
6941 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
6942 return new ShuffleVectorInst(NewCmp, M);
6943 }
6944
6945 // Try to canonicalize compare with splatted operand and splat constant.
6946 // TODO: We could generalize this for more than splats. See/use the code in
6947 // InstCombiner::foldVectorBinop().
6948 Constant *C;
6949 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
6950 return nullptr;
6951
6952 // Length-changing splats are ok, so adjust the constants as needed:
6953 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
6954 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
6955 int MaskSplatIndex;
6956 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
6957 // We allow poison in matching, but this transform removes it for safety.
6958 // Demanded elements analysis should be able to recover some/all of that.
6959 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
6960 ScalarC);
6961 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
6962 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
6963 return new ShuffleVectorInst(NewCmp, NewM);
6964 }
6965
6966 return nullptr;
6967}
6968
6969// extract(uadd.with.overflow(A, B), 0) ult A
6970// -> extract(uadd.with.overflow(A, B), 1)
6972 CmpInst::Predicate Pred = I.getPredicate();
6973 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6974
6975 Value *UAddOv;
6976 Value *A, *B;
6977 auto UAddOvResultPat = m_ExtractValue<0>(
6978 m_Intrinsic<Intrinsic::uadd_with_overflow>(m_Value(A), m_Value(B)));
6979 if (match(Op0, UAddOvResultPat) &&
6980 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
6981 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
6982 (match(A, m_One()) || match(B, m_One()))) ||
6983 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
6984 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
6985 // extract(uadd.with.overflow(A, B), 0) < A
6986 // extract(uadd.with.overflow(A, 1), 0) == 0
6987 // extract(uadd.with.overflow(A, -1), 0) != -1
6988 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
6989 else if (match(Op1, UAddOvResultPat) &&
6990 Pred == ICmpInst::ICMP_UGT && (Op0 == A || Op0 == B))
6991 // A > extract(uadd.with.overflow(A, B), 0)
6992 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
6993 else
6994 return nullptr;
6995
6996 return ExtractValueInst::Create(UAddOv, 1);
6997}
6998
7000 if (!I.getOperand(0)->getType()->isPointerTy() ||
7002 I.getParent()->getParent(),
7003 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7004 return nullptr;
7005 }
7006 Instruction *Op;
7007 if (match(I.getOperand(0), m_Instruction(Op)) &&
7008 match(I.getOperand(1), m_Zero()) &&
7009 Op->isLaunderOrStripInvariantGroup()) {
7010 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7011 Op->getOperand(0), I.getOperand(1));
7012 }
7013 return nullptr;
7014}
7015
7016/// This function folds patterns produced by lowering of reduce idioms, such as
7017/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7018/// attempts to generate fewer number of scalar comparisons instead of vector
7019/// comparisons when possible.
7021 InstCombiner::BuilderTy &Builder,
7022 const DataLayout &DL) {
7023 if (I.getType()->isVectorTy())
7024 return nullptr;
7025 ICmpInst::Predicate OuterPred, InnerPred;
7026 Value *LHS, *RHS;
7027
7028 // Match lowering of @llvm.vector.reduce.and. Turn
7029 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7030 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7031 /// %res = icmp <pred> i8 %scalar_ne, 0
7032 ///
7033 /// into
7034 ///
7035 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7036 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7037 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7038 ///
7039 /// for <pred> in {ne, eq}.
7040 if (!match(&I, m_ICmp(OuterPred,
7042 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7043 m_Zero())))
7044 return nullptr;
7045 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7046 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7047 return nullptr;
7048 unsigned NumBits =
7049 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7050 // TODO: Relax this to "not wider than max legal integer type"?
7051 if (!DL.isLegalInteger(NumBits))
7052 return nullptr;
7053
7054 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7055 auto *ScalarTy = Builder.getIntNTy(NumBits);
7056 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7057 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7058 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7059 I.getName());
7060 }
7061
7062 return nullptr;
7063}
7064
7065// This helper will be called with icmp operands in both orders.
7067 Value *Op0, Value *Op1,
7068 ICmpInst &CxtI) {
7069 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7070 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7071 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7072 return NI;
7073
7074 if (auto *SI = dyn_cast<SelectInst>(Op0))
7075 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7076 return NI;
7077
7078 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7079 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7080 return Res;
7081
7082 {
7083 Value *X;
7084 const APInt *C;
7085 // icmp X+Cst, X
7086 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7087 return foldICmpAddOpConst(X, *C, Pred);
7088 }
7089
7090 // abs(X) >= X --> true
7091 // abs(X) u<= X --> true
7092 // abs(X) < X --> false
7093 // abs(X) u> X --> false
7094 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7095 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7096 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7097 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7098 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7099 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7100 {
7101 Value *X;
7102 Constant *C;
7103 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X), m_Constant(C))) &&
7104 match(Op1, m_Specific(X))) {
7105 Value *NullValue = Constant::getNullValue(X->getType());
7106 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7107 const APInt SMin =
7108 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7109 bool IsIntMinPosion = C->isAllOnesValue();
7110 switch (Pred) {
7111 case CmpInst::ICMP_ULE:
7112 case CmpInst::ICMP_SGE:
7113 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7114 case CmpInst::ICMP_UGT:
7115 case CmpInst::ICMP_SLT:
7117 case CmpInst::ICMP_UGE:
7118 case CmpInst::ICMP_SLE:
7119 case CmpInst::ICMP_EQ: {
7120 return replaceInstUsesWith(
7121 CxtI, IsIntMinPosion
7122 ? Builder.CreateICmpSGT(X, AllOnesValue)
7124 X, ConstantInt::get(X->getType(), SMin + 1)));
7125 }
7126 case CmpInst::ICMP_ULT:
7127 case CmpInst::ICMP_SGT:
7128 case CmpInst::ICMP_NE: {
7129 return replaceInstUsesWith(
7130 CxtI, IsIntMinPosion
7131 ? Builder.CreateICmpSLT(X, NullValue)
7133 X, ConstantInt::get(X->getType(), SMin)));
7134 }
7135 default:
7136 llvm_unreachable("Invalid predicate!");
7137 }
7138 }
7139 }
7140
7141 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7142 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7143 return replaceInstUsesWith(CxtI, V);
7144
7145 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7146 {
7147 const APInt *Divisor;
7148 if (match(Op0, m_UDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7149 Divisor->ugt(1)) {
7150 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7152 }
7153
7154 if (!ICmpInst::isUnsigned(Pred) &&
7155 match(Op0, m_SDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7156 Divisor->ugt(1)) {
7157 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7159 }
7160 }
7161
7162 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7163 {
7164 const APInt *Shift;
7165 if (match(Op0, m_LShr(m_Specific(Op1), m_APInt(Shift))) &&
7166 !Shift->isZero()) {
7167 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7169 }
7170
7171 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7172 match(Op0, m_AShr(m_Specific(Op1), m_APInt(Shift))) &&
7173 !Shift->isZero()) {
7174 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7176 }
7177 }
7178
7179 return nullptr;
7180}
7181
7183 bool Changed = false;
7185 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7186 unsigned Op0Cplxity = getComplexity(Op0);
7187 unsigned Op1Cplxity = getComplexity(Op1);
7188
7189 /// Orders the operands of the compare so that they are listed from most
7190 /// complex to least complex. This puts constants before unary operators,
7191 /// before binary operators.
7192 if (Op0Cplxity < Op1Cplxity) {
7193 I.swapOperands();
7194 std::swap(Op0, Op1);
7195 Changed = true;
7196 }
7197
7198 if (Value *V = simplifyICmpInst(I.getPredicate(), Op0, Op1, Q))
7199 return replaceInstUsesWith(I, V);
7200
7201 // Comparing -val or val with non-zero is the same as just comparing val
7202 // ie, abs(val) != 0 -> val != 0
7203 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7204 Value *Cond, *SelectTrue, *SelectFalse;
7205 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7206 m_Value(SelectFalse)))) {
7207 if (Value *V = dyn_castNegVal(SelectTrue)) {
7208 if (V == SelectFalse)
7209 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7210 }
7211 else if (Value *V = dyn_castNegVal(SelectFalse)) {
7212 if (V == SelectTrue)
7213 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7214 }
7215 }
7216 }
7217
7218 if (Op0->getType()->isIntOrIntVectorTy(1))
7220 return Res;
7221
7223 return Res;
7224
7226 return Res;
7227
7229 return Res;
7230
7232 return Res;
7233
7235 return Res;
7236
7238 return Res;
7239
7241 return Res;
7242
7243 // Test if the ICmpInst instruction is used exclusively by a select as
7244 // part of a minimum or maximum operation. If so, refrain from doing
7245 // any other folding. This helps out other analyses which understand
7246 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7247 // and CodeGen. And in this case, at least one of the comparison
7248 // operands has at least one user besides the compare (the select),
7249 // which would often largely negate the benefit of folding anyway.
7250 //
7251 // Do the same for the other patterns recognized by matchSelectPattern.
7252 if (I.hasOneUse())
7253 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7254 Value *A, *B;
7256 if (SPR.Flavor != SPF_UNKNOWN)
7257 return nullptr;
7258 }
7259
7260 // Do this after checking for min/max to prevent infinite looping.
7261 if (Instruction *Res = foldICmpWithZero(I))
7262 return Res;
7263
7264 // FIXME: We only do this after checking for min/max to prevent infinite
7265 // looping caused by a reverse canonicalization of these patterns for min/max.
7266 // FIXME: The organization of folds is a mess. These would naturally go into
7267 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7268 // down here after the min/max restriction.
7269 ICmpInst::Predicate Pred = I.getPredicate();
7270 const APInt *C;
7271 if (match(Op1, m_APInt(C))) {
7272 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7273 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7274 Constant *Zero = Constant::getNullValue(Op0->getType());
7275 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7276 }
7277
7278 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7279 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7281 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7282 }
7283 }
7284
7285 // The folds in here may rely on wrapping flags and special constants, so
7286 // they can break up min/max idioms in some cases but not seemingly similar
7287 // patterns.
7288 // FIXME: It may be possible to enhance select folding to make this
7289 // unnecessary. It may also be moot if we canonicalize to min/max
7290 // intrinsics.
7291 if (Instruction *Res = foldICmpBinOp(I, Q))
7292 return Res;
7293
7295 return Res;
7296
7297 // Try to match comparison as a sign bit test. Intentionally do this after
7298 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7299 if (Instruction *New = foldSignBitTest(I))
7300 return New;
7301
7303 return Res;
7304
7305 if (Instruction *Res = foldICmpCommutative(I.getPredicate(), Op0, Op1, I))
7306 return Res;
7307 if (Instruction *Res =
7308 foldICmpCommutative(I.getSwappedPredicate(), Op1, Op0, I))
7309 return Res;
7310
7311 if (I.isCommutative()) {
7312 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7313 replaceOperand(I, 0, Pair->first);
7314 replaceOperand(I, 1, Pair->second);
7315 return &I;
7316 }
7317 }
7318
7319 // In case of a comparison with two select instructions having the same
7320 // condition, check whether one of the resulting branches can be simplified.
7321 // If so, just compare the other branch and select the appropriate result.
7322 // For example:
7323 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7324 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7325 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7326 // The icmp will result false for the false value of selects and the result
7327 // will depend upon the comparison of true values of selects if %cmp is
7328 // true. Thus, transform this into:
7329 // %cmp = icmp slt i32 %y, %z
7330 // %sel = select i1 %cond, i1 %cmp, i1 false
7331 // This handles similar cases to transform.
7332 {
7333 Value *Cond, *A, *B, *C, *D;
7334 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7336 (Op0->hasOneUse() || Op1->hasOneUse())) {
7337 // Check whether comparison of TrueValues can be simplified
7338 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7339 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7340 return SelectInst::Create(Cond, Res, NewICMP);
7341 }
7342 // Check whether comparison of FalseValues can be simplified
7343 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7344 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7345 return SelectInst::Create(Cond, NewICMP, Res);
7346 }
7347 }
7348 }
7349
7350 // Try to optimize equality comparisons against alloca-based pointers.
7351 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7352 assert(Op1->getType()->isPointerTy() && "Comparing pointer with non-pointer?");
7353 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7354 if (foldAllocaCmp(Alloca))
7355 return nullptr;
7356 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7357 if (foldAllocaCmp(Alloca))
7358 return nullptr;
7359 }
7360
7361 if (Instruction *Res = foldICmpBitCast(I))
7362 return Res;
7363
7364 // TODO: Hoist this above the min/max bailout.
7366 return R;
7367
7368 {
7369 Value *X, *Y;
7370 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7371 // and (X & ~Y) != 0 --> (X & Y) == 0
7372 // if A is a power of 2.
7373 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7374 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, 0, &I) &&
7375 I.isEquality())
7376 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7377 Op1);
7378
7379 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7380 if (Op0->getType()->isIntOrIntVectorTy()) {
7381 bool ConsumesOp0, ConsumesOp1;
7382 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7383 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7384 (ConsumesOp0 || ConsumesOp1)) {
7385 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7386 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7387 assert(InvOp0 && InvOp1 &&
7388 "Mismatch between isFreeToInvert and getFreelyInverted");
7389 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7390 }
7391 }
7392
7393 Instruction *AddI = nullptr;
7395 m_Instruction(AddI))) &&
7396 isa<IntegerType>(X->getType())) {
7397 Value *Result;
7398 Constant *Overflow;
7399 // m_UAddWithOverflow can match patterns that do not include an explicit
7400 // "add" instruction, so check the opcode of the matched op.
7401 if (AddI->getOpcode() == Instruction::Add &&
7402 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7403 Result, Overflow)) {
7404 replaceInstUsesWith(*AddI, Result);
7405 eraseInstFromFunction(*AddI);
7406 return replaceInstUsesWith(I, Overflow);
7407 }
7408 }
7409
7410 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7411 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7412 match(Op1, m_APInt(C))) {
7413 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7414 return R;
7415 }
7416
7417 // Signbit test folds
7418 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7419 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7420 Instruction *ExtI;
7421 if ((I.isUnsigned() || I.isEquality()) &&
7422 match(Op1,
7424 Y->getType()->getScalarSizeInBits() == 1 &&
7425 (Op0->hasOneUse() || Op1->hasOneUse())) {
7426 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7427 Instruction *ShiftI;
7428 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7430 OpWidth - 1))))) {
7431 unsigned ExtOpc = ExtI->getOpcode();
7432 unsigned ShiftOpc = ShiftI->getOpcode();
7433 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7434 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7435 Value *SLTZero =
7437 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7438 return replaceInstUsesWith(I, Cmp);
7439 }
7440 }
7441 }
7442 }
7443
7444 if (Instruction *Res = foldICmpEquality(I))
7445 return Res;
7446
7448 return Res;
7449
7450 if (Instruction *Res = foldICmpOfUAddOv(I))
7451 return Res;
7452
7453 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7454 // an i1 which indicates whether or not we successfully did the swap.
7455 //
7456 // Replace comparisons between the old value and the expected value with the
7457 // indicator that 'cmpxchg' returns.
7458 //
7459 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7460 // spuriously fail. In those cases, the old value may equal the expected
7461 // value but it is possible for the swap to not occur.
7462 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7463 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7464 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7465 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7466 !ACXI->isWeak())
7467 return ExtractValueInst::Create(ACXI, 1);
7468
7470 return Res;
7471
7472 if (I.getType()->isVectorTy())
7473 if (Instruction *Res = foldVectorCmp(I, Builder))
7474 return Res;
7475
7477 return Res;
7478
7480 return Res;
7481
7482 return Changed ? &I : nullptr;
7483}
7484
7485/// Fold fcmp ([us]itofp x, cst) if possible.
7487 Instruction *LHSI,
7488 Constant *RHSC) {
7489 const APFloat *RHS;
7490 if (!match(RHSC, m_APFloat(RHS)))
7491 return nullptr;
7492
7493 // Get the width of the mantissa. We don't want to hack on conversions that
7494 // might lose information from the integer, e.g. "i64 -> float"
7495 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7496 if (MantissaWidth == -1) return nullptr; // Unknown.
7497
7498 Type *IntTy = LHSI->getOperand(0)->getType();
7499 unsigned IntWidth = IntTy->getScalarSizeInBits();
7500 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7501
7502 if (I.isEquality()) {
7503 FCmpInst::Predicate P = I.getPredicate();
7504 bool IsExact = false;
7505 APSInt RHSCvt(IntWidth, LHSUnsigned);
7506 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7507
7508 // If the floating point constant isn't an integer value, we know if we will
7509 // ever compare equal / not equal to it.
7510 if (!IsExact) {
7511 // TODO: Can never be -0.0 and other non-representable values
7512 APFloat RHSRoundInt(*RHS);
7514 if (*RHS != RHSRoundInt) {
7516 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7517
7519 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7520 }
7521 }
7522
7523 // TODO: If the constant is exactly representable, is it always OK to do
7524 // equality compares as integer?
7525 }
7526
7527 // Check to see that the input is converted from an integer type that is small
7528 // enough that preserves all bits. TODO: check here for "known" sign bits.
7529 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7530
7531 // Following test does NOT adjust IntWidth downwards for signed inputs,
7532 // because the most negative value still requires all the mantissa bits
7533 // to distinguish it from one less than that value.
7534 if ((int)IntWidth > MantissaWidth) {
7535 // Conversion would lose accuracy. Check if loss can impact comparison.
7536 int Exp = ilogb(*RHS);
7537 if (Exp == APFloat::IEK_Inf) {
7538 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7539 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7540 // Conversion could create infinity.
7541 return nullptr;
7542 } else {
7543 // Note that if RHS is zero or NaN, then Exp is negative
7544 // and first condition is trivially false.
7545 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7546 // Conversion could affect comparison.
7547 return nullptr;
7548 }
7549 }
7550
7551 // Otherwise, we can potentially simplify the comparison. We know that it
7552 // will always come through as an integer value and we know the constant is
7553 // not a NAN (it would have been previously simplified).
7554 assert(!RHS->isNaN() && "NaN comparison not already folded!");
7555
7557 switch (I.getPredicate()) {
7558 default: llvm_unreachable("Unexpected predicate!");
7559 case FCmpInst::FCMP_UEQ:
7560 case FCmpInst::FCMP_OEQ:
7561 Pred = ICmpInst::ICMP_EQ;
7562 break;
7563 case FCmpInst::FCMP_UGT:
7564 case FCmpInst::FCMP_OGT:
7565 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
7566 break;
7567 case FCmpInst::FCMP_UGE:
7568 case FCmpInst::FCMP_OGE:
7569 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
7570 break;
7571 case FCmpInst::FCMP_ULT:
7572 case FCmpInst::FCMP_OLT:
7573 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
7574 break;
7575 case FCmpInst::FCMP_ULE:
7576 case FCmpInst::FCMP_OLE:
7577 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
7578 break;
7579 case FCmpInst::FCMP_UNE:
7580 case FCmpInst::FCMP_ONE:
7581 Pred = ICmpInst::ICMP_NE;
7582 break;
7583 case FCmpInst::FCMP_ORD:
7584 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7585 case FCmpInst::FCMP_UNO:
7586 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7587 }
7588
7589 // Now we know that the APFloat is a normal number, zero or inf.
7590
7591 // See if the FP constant is too large for the integer. For example,
7592 // comparing an i8 to 300.0.
7593 if (!LHSUnsigned) {
7594 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
7595 // and large values.
7596 APFloat SMax(RHS->getSemantics());
7597 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
7599 if (SMax < *RHS) { // smax < 13123.0
7600 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
7601 Pred == ICmpInst::ICMP_SLE)
7602 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7603 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7604 }
7605 } else {
7606 // If the RHS value is > UnsignedMax, fold the comparison. This handles
7607 // +INF and large values.
7608 APFloat UMax(RHS->getSemantics());
7609 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
7611 if (UMax < *RHS) { // umax < 13123.0
7612 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
7613 Pred == ICmpInst::ICMP_ULE)
7614 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7615 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7616 }
7617 }
7618
7619 if (!LHSUnsigned) {
7620 // See if the RHS value is < SignedMin.
7621 APFloat SMin(RHS->getSemantics());
7622 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
7624 if (SMin > *RHS) { // smin > 12312.0
7625 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
7626 Pred == ICmpInst::ICMP_SGE)
7627 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7628 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7629 }
7630 } else {
7631 // See if the RHS value is < UnsignedMin.
7632 APFloat UMin(RHS->getSemantics());
7633 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
7635 if (UMin > *RHS) { // umin > 12312.0
7636 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
7637 Pred == ICmpInst::ICMP_UGE)
7638 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7639 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7640 }
7641 }
7642
7643 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
7644 // [0, UMAX], but it may still be fractional. Check whether this is the case
7645 // using the IsExact flag.
7646 // Don't do this for zero, because -0.0 is not fractional.
7647 APSInt RHSInt(IntWidth, LHSUnsigned);
7648 bool IsExact;
7649 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
7650 if (!RHS->isZero()) {
7651 if (!IsExact) {
7652 // If we had a comparison against a fractional value, we have to adjust
7653 // the compare predicate and sometimes the value. RHSC is rounded towards
7654 // zero at this point.
7655 switch (Pred) {
7656 default: llvm_unreachable("Unexpected integer comparison!");
7657 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
7658 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7659 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
7660 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7661 case ICmpInst::ICMP_ULE:
7662 // (float)int <= 4.4 --> int <= 4
7663 // (float)int <= -4.4 --> false
7664 if (RHS->isNegative())
7665 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7666 break;
7667 case ICmpInst::ICMP_SLE:
7668 // (float)int <= 4.4 --> int <= 4
7669 // (float)int <= -4.4 --> int < -4
7670 if (RHS->isNegative())
7671 Pred = ICmpInst::ICMP_SLT;
7672 break;
7673 case ICmpInst::ICMP_ULT:
7674 // (float)int < -4.4 --> false
7675 // (float)int < 4.4 --> int <= 4
7676 if (RHS->isNegative())
7677 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7678 Pred = ICmpInst::ICMP_ULE;
7679 break;
7680 case ICmpInst::ICMP_SLT:
7681 // (float)int < -4.4 --> int < -4
7682 // (float)int < 4.4 --> int <= 4
7683 if (!RHS->isNegative())
7684 Pred = ICmpInst::ICMP_SLE;
7685 break;
7686 case ICmpInst::ICMP_UGT:
7687 // (float)int > 4.4 --> int > 4
7688 // (float)int > -4.4 --> true
7689 if (RHS->isNegative())
7690 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7691 break;
7692 case ICmpInst::ICMP_SGT:
7693 // (float)int > 4.4 --> int > 4
7694 // (float)int > -4.4 --> int >= -4
7695 if (RHS->isNegative())
7696 Pred = ICmpInst::ICMP_SGE;
7697 break;
7698 case ICmpInst::ICMP_UGE:
7699 // (float)int >= -4.4 --> true
7700 // (float)int >= 4.4 --> int > 4
7701 if (RHS->isNegative())
7702 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7703 Pred = ICmpInst::ICMP_UGT;
7704 break;
7705 case ICmpInst::ICMP_SGE:
7706 // (float)int >= -4.4 --> int >= -4
7707 // (float)int >= 4.4 --> int > 4
7708 if (!RHS->isNegative())
7709 Pred = ICmpInst::ICMP_SGT;
7710 break;
7711 }
7712 }
7713 }
7714
7715 // Lower this FP comparison into an appropriate integer version of the
7716 // comparison.
7717 return new ICmpInst(Pred, LHSI->getOperand(0),
7718 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
7719}
7720
7721/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
7723 Constant *RHSC) {
7724 // When C is not 0.0 and infinities are not allowed:
7725 // (C / X) < 0.0 is a sign-bit test of X
7726 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
7727 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
7728 //
7729 // Proof:
7730 // Multiply (C / X) < 0.0 by X * X / C.
7731 // - X is non zero, if it is the flag 'ninf' is violated.
7732 // - C defines the sign of X * X * C. Thus it also defines whether to swap
7733 // the predicate. C is also non zero by definition.
7734 //
7735 // Thus X * X / C is non zero and the transformation is valid. [qed]
7736
7737 FCmpInst::Predicate Pred = I.getPredicate();
7738
7739 // Check that predicates are valid.
7740 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
7741 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
7742 return nullptr;
7743
7744 // Check that RHS operand is zero.
7745 if (!match(RHSC, m_AnyZeroFP()))
7746 return nullptr;
7747
7748 // Check fastmath flags ('ninf').
7749 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
7750 return nullptr;
7751
7752 // Check the properties of the dividend. It must not be zero to avoid a
7753 // division by zero (see Proof).
7754 const APFloat *C;
7755 if (!match(LHSI->getOperand(0), m_APFloat(C)))
7756 return nullptr;
7757
7758 if (C->isZero())
7759 return nullptr;
7760
7761 // Get swapped predicate if necessary.
7762 if (C->isNegative())
7763 Pred = I.getSwappedPredicate();
7764
7765 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
7766}
7767
7768/// Optimize fabs(X) compared with zero.
7770 Value *X;
7771 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
7772 return nullptr;
7773
7774 const APFloat *C;
7775 if (!match(I.getOperand(1), m_APFloat(C)))
7776 return nullptr;
7777
7778 if (!C->isPosZero()) {
7779 if (!C->isSmallestNormalized())
7780 return nullptr;
7781
7782 const Function *F = I.getFunction();
7783 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
7784 if (Mode.Input == DenormalMode::PreserveSign ||
7785 Mode.Input == DenormalMode::PositiveZero) {
7786
7787 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7788 Constant *Zero = ConstantFP::getZero(X->getType());
7789 return new FCmpInst(P, X, Zero, "", I);
7790 };
7791
7792 switch (I.getPredicate()) {
7793 case FCmpInst::FCMP_OLT:
7794 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
7795 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
7796 case FCmpInst::FCMP_UGE:
7797 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
7798 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
7799 case FCmpInst::FCMP_OGE:
7800 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
7801 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
7802 case FCmpInst::FCMP_ULT:
7803 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
7804 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
7805 default:
7806 break;
7807 }
7808 }
7809
7810 return nullptr;
7811 }
7812
7813 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7814 I->setPredicate(P);
7815 return IC.replaceOperand(*I, 0, X);
7816 };
7817
7818 switch (I.getPredicate()) {
7819 case FCmpInst::FCMP_UGE:
7820 case FCmpInst::FCMP_OLT:
7821 // fabs(X) >= 0.0 --> true
7822 // fabs(X) < 0.0 --> false
7823 llvm_unreachable("fcmp should have simplified");
7824
7825 case FCmpInst::FCMP_OGT:
7826 // fabs(X) > 0.0 --> X != 0.0
7827 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
7828
7829 case FCmpInst::FCMP_UGT:
7830 // fabs(X) u> 0.0 --> X u!= 0.0
7831 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
7832
7833 case FCmpInst::FCMP_OLE:
7834 // fabs(X) <= 0.0 --> X == 0.0
7835 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
7836
7837 case FCmpInst::FCMP_ULE:
7838 // fabs(X) u<= 0.0 --> X u== 0.0
7839 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
7840
7841 case FCmpInst::FCMP_OGE:
7842 // fabs(X) >= 0.0 --> !isnan(X)
7843 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7844 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
7845
7846 case FCmpInst::FCMP_ULT:
7847 // fabs(X) u< 0.0 --> isnan(X)
7848 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7849 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
7850
7851 case FCmpInst::FCMP_OEQ:
7852 case FCmpInst::FCMP_UEQ:
7853 case FCmpInst::FCMP_ONE:
7854 case FCmpInst::FCMP_UNE:
7855 case FCmpInst::FCMP_ORD:
7856 case FCmpInst::FCMP_UNO:
7857 // Look through the fabs() because it doesn't change anything but the sign.
7858 // fabs(X) == 0.0 --> X == 0.0,
7859 // fabs(X) != 0.0 --> X != 0.0
7860 // isnan(fabs(X)) --> isnan(X)
7861 // !isnan(fabs(X) --> !isnan(X)
7862 return replacePredAndOp0(&I, I.getPredicate(), X);
7863
7864 default:
7865 return nullptr;
7866 }
7867}
7868
7870 CmpInst::Predicate Pred = I.getPredicate();
7871 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7872
7873 // Canonicalize fneg as Op1.
7874 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
7875 std::swap(Op0, Op1);
7876 Pred = I.getSwappedPredicate();
7877 }
7878
7879 if (!match(Op1, m_FNeg(m_Specific(Op0))))
7880 return nullptr;
7881
7882 // Replace the negated operand with 0.0:
7883 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
7884 Constant *Zero = ConstantFP::getZero(Op0->getType());
7885 return new FCmpInst(Pred, Op0, Zero, "", &I);
7886}
7887
7889 bool Changed = false;
7890
7891 /// Orders the operands of the compare so that they are listed from most
7892 /// complex to least complex. This puts constants before unary operators,
7893 /// before binary operators.
7894 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
7895 I.swapOperands();
7896 Changed = true;
7897 }
7898
7899 const CmpInst::Predicate Pred = I.getPredicate();
7900 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7901 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
7903 return replaceInstUsesWith(I, V);
7904
7905 // Simplify 'fcmp pred X, X'
7906 Type *OpType = Op0->getType();
7907 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
7908 if (Op0 == Op1) {
7909 switch (Pred) {
7910 default: break;
7911 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
7912 case FCmpInst::FCMP_ULT: // True if unordered or less than
7913 case FCmpInst::FCMP_UGT: // True if unordered or greater than
7914 case FCmpInst::FCMP_UNE: // True if unordered or not equal
7915 // Canonicalize these to be 'fcmp uno %X, 0.0'.
7916 I.setPredicate(FCmpInst::FCMP_UNO);
7917 I.setOperand(1, Constant::getNullValue(OpType));
7918 return &I;
7919
7920 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
7921 case FCmpInst::FCMP_OEQ: // True if ordered and equal
7922 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
7923 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
7924 // Canonicalize these to be 'fcmp ord %X, 0.0'.
7925 I.setPredicate(FCmpInst::FCMP_ORD);
7926 I.setOperand(1, Constant::getNullValue(OpType));
7927 return &I;
7928 }
7929 }
7930
7931 if (I.isCommutative()) {
7932 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7933 replaceOperand(I, 0, Pair->first);
7934 replaceOperand(I, 1, Pair->second);
7935 return &I;
7936 }
7937 }
7938
7939 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
7940 // then canonicalize the operand to 0.0.
7941 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
7942 if (!match(Op0, m_PosZeroFP()) &&
7943 isKnownNeverNaN(Op0, 0, getSimplifyQuery().getWithInstruction(&I)))
7944 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
7945
7946 if (!match(Op1, m_PosZeroFP()) &&
7947 isKnownNeverNaN(Op1, 0, getSimplifyQuery().getWithInstruction(&I)))
7948 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7949 }
7950
7951 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
7952 Value *X, *Y;
7953 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
7954 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
7955
7957 return R;
7958
7959 // Test if the FCmpInst instruction is used exclusively by a select as
7960 // part of a minimum or maximum operation. If so, refrain from doing
7961 // any other folding. This helps out other analyses which understand
7962 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7963 // and CodeGen. And in this case, at least one of the comparison
7964 // operands has at least one user besides the compare (the select),
7965 // which would often largely negate the benefit of folding anyway.
7966 if (I.hasOneUse())
7967 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7968 Value *A, *B;
7970 if (SPR.Flavor != SPF_UNKNOWN)
7971 return nullptr;
7972 }
7973
7974 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
7975 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
7976 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
7977 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7978
7979 // Canonicalize:
7980 // fcmp olt X, +inf -> fcmp one X, +inf
7981 // fcmp ole X, +inf -> fcmp ord X, 0
7982 // fcmp ogt X, +inf -> false
7983 // fcmp oge X, +inf -> fcmp oeq X, +inf
7984 // fcmp ult X, +inf -> fcmp une X, +inf
7985 // fcmp ule X, +inf -> true
7986 // fcmp ugt X, +inf -> fcmp uno X, 0
7987 // fcmp uge X, +inf -> fcmp ueq X, +inf
7988 // fcmp olt X, -inf -> false
7989 // fcmp ole X, -inf -> fcmp oeq X, -inf
7990 // fcmp ogt X, -inf -> fcmp one X, -inf
7991 // fcmp oge X, -inf -> fcmp ord X, 0
7992 // fcmp ult X, -inf -> fcmp uno X, 0
7993 // fcmp ule X, -inf -> fcmp ueq X, -inf
7994 // fcmp ugt X, -inf -> fcmp une X, -inf
7995 // fcmp uge X, -inf -> true
7996 const APFloat *C;
7997 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
7998 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
7999 default:
8000 break;
8001 case FCmpInst::FCMP_ORD:
8002 case FCmpInst::FCMP_UNO:
8005 case FCmpInst::FCMP_OGT:
8006 case FCmpInst::FCMP_ULE:
8007 llvm_unreachable("Should be simplified by InstSimplify");
8008 case FCmpInst::FCMP_OLT:
8009 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8010 case FCmpInst::FCMP_OLE:
8011 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8012 "", &I);
8013 case FCmpInst::FCMP_OGE:
8014 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8015 case FCmpInst::FCMP_ULT:
8016 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8017 case FCmpInst::FCMP_UGT:
8018 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8019 "", &I);
8020 case FCmpInst::FCMP_UGE:
8021 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8022 }
8023 }
8024
8025 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8026 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8027 if (match(Op1, m_PosZeroFP()) &&
8030 if (Pred == FCmpInst::FCMP_OEQ)
8031 IntPred = ICmpInst::ICMP_EQ;
8032 else if (Pred == FCmpInst::FCMP_UNE)
8033 IntPred = ICmpInst::ICMP_NE;
8034
8035 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8036 Type *IntTy = X->getType();
8037 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8038 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8039 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8040 }
8041 }
8042
8043 // Handle fcmp with instruction LHS and constant RHS.
8044 Instruction *LHSI;
8045 Constant *RHSC;
8046 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8047 switch (LHSI->getOpcode()) {
8048 case Instruction::Select:
8049 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8050 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8051 (match(LHSI,
8053 match(LHSI, m_Select(m_Value(), m_FNeg(m_Value(X)), m_Deferred(X)))))
8054 return replaceOperand(I, 0, X);
8055 break;
8056 case Instruction::PHI:
8057 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8058 return NV;
8059 break;
8060 case Instruction::SIToFP:
8061 case Instruction::UIToFP:
8062 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8063 return NV;
8064 break;
8065 case Instruction::FDiv:
8066 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8067 return NV;
8068 break;
8069 case Instruction::Load:
8070 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8071 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
8073 cast<LoadInst>(LHSI), GEP, GV, I))
8074 return Res;
8075 break;
8076 }
8077 }
8078
8079 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8080 return R;
8081
8082 if (match(Op0, m_FNeg(m_Value(X)))) {
8083 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8084 Constant *C;
8085 if (match(Op1, m_Constant(C)))
8086 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8087 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8088 }
8089
8090 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8091 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8092 return new FCmpInst(Pred, X, Op1, "", &I);
8093
8094 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8095 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8096 return new FCmpInst(Pred, Op0, Y, "", &I);
8097
8098 if (match(Op0, m_FPExt(m_Value(X)))) {
8099 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8100 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8101 return new FCmpInst(Pred, X, Y, "", &I);
8102
8103 const APFloat *C;
8104 if (match(Op1, m_APFloat(C))) {
8105 const fltSemantics &FPSem =
8106 X->getType()->getScalarType()->getFltSemantics();
8107 bool Lossy;
8108 APFloat TruncC = *C;
8109 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8110
8111 if (Lossy) {
8112 // X can't possibly equal the higher-precision constant, so reduce any
8113 // equality comparison.
8114 // TODO: Other predicates can be handled via getFCmpCode().
8115 switch (Pred) {
8116 case FCmpInst::FCMP_OEQ:
8117 // X is ordered and equal to an impossible constant --> false
8118 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8119 case FCmpInst::FCMP_ONE:
8120 // X is ordered and not equal to an impossible constant --> ordered
8121 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8122 ConstantFP::getZero(X->getType()));
8123 case FCmpInst::FCMP_UEQ:
8124 // X is unordered or equal to an impossible constant --> unordered
8125 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8126 ConstantFP::getZero(X->getType()));
8127 case FCmpInst::FCMP_UNE:
8128 // X is unordered or not equal to an impossible constant --> true
8129 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8130 default:
8131 break;
8132 }
8133 }
8134
8135 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8136 // Avoid lossy conversions and denormals.
8137 // Zero is a special case that's OK to convert.
8138 APFloat Fabs = TruncC;
8139 Fabs.clearSign();
8140 if (!Lossy &&
8141 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8142 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8143 return new FCmpInst(Pred, X, NewC, "", &I);
8144 }
8145 }
8146 }
8147
8148 // Convert a sign-bit test of an FP value into a cast and integer compare.
8149 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8150 // TODO: Handle non-zero compare constants.
8151 // TODO: Handle other predicates.
8152 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
8153 m_Value(X)))) &&
8154 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8155 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8156 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8157 IntType = VectorType::get(IntType, VecTy->getElementCount());
8158
8159 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8160 if (Pred == FCmpInst::FCMP_OLT) {
8161 Value *IntX = Builder.CreateBitCast(X, IntType);
8162 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8163 ConstantInt::getNullValue(IntType));
8164 }
8165 }
8166
8167 {
8168 Value *CanonLHS = nullptr, *CanonRHS = nullptr;
8169 match(Op0, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonLHS)));
8170 match(Op1, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonRHS)));
8171
8172 // (canonicalize(x) == x) => (x == x)
8173 if (CanonLHS == Op1)
8174 return new FCmpInst(Pred, Op1, Op1, "", &I);
8175
8176 // (x == canonicalize(x)) => (x == x)
8177 if (CanonRHS == Op0)
8178 return new FCmpInst(Pred, Op0, Op0, "", &I);
8179
8180 // (canonicalize(x) == canonicalize(y)) => (x == y)
8181 if (CanonLHS && CanonRHS)
8182 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8183 }
8184
8185 if (I.getType()->isVectorTy())
8186 if (Instruction *Res = foldVectorCmp(I, Builder))
8187 return Res;
8188
8189 return Changed ? &I : nullptr;
8190}
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU Register Bank Select
Rewrite undef for PHI
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
#define Check(C,...)
Hexagon Common GEP
#define _
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(ICmpInst::Predicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Value * foldICmpWithLowBitMaskedVal(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static Instruction * foldICmpShlOne(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl 1, Y), C.
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:528
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
#define T1
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:40
Value * RHS
Value * LHS
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5196
void clearSign()
Definition: APFloat.h:1159
bool isZero() const
Definition: APFloat.h:1291
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.h:1026
APInt bitcastToAPInt() const
Definition: APFloat.h:1210
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1006
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:966
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition: APFloat.cpp:5183
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.h:1109
Class for arbitrary precision integers.
Definition: APInt.h:76
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1543
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:212
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition: APInt.h:427
APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:981
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition: APInt.h:207
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition: APInt.h:401
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1491
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition: APInt.h:1463
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:906
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:184
APInt abs() const
Get the absolute value.
Definition: APInt.h:1737
unsigned ceilLogBase2() const
Definition: APInt.h:1706
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition: APInt.h:1179
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:349
APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1918
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition: APInt.h:1160
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:358
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition: APInt.h:444
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1439
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition: APInt.h:1089
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:187
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition: APInt.h:194
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:307
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1898
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition: APInt.h:1227
bool eq(const APInt &RHS) const
Equality comparison.
Definition: APInt.h:1057
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1614
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition: APInt.h:1144
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1905
void negate()
Negate this APInt in place.
Definition: APInt.h:1421
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1589
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1548
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:197
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition: APInt.h:334
unsigned countl_one() const
Count the number of leading one bits.
Definition: APInt.h:1565
unsigned logBase2() const
Definition: APInt.h:1703
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:453
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition: APInt.h:805
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition: APInt.h:383
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition: APInt.h:1128
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition: APInt.h:851
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:418
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:284
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition: APInt.h:1108
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition: APInt.h:274
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:178
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1215
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1911
bool isOne() const
Determine if this is a value of 1.
Definition: APInt.h:367
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition: APInt.h:264
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:217
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition: APInt.h:829
unsigned countr_one() const
Count the number of trailing one bits.
Definition: APInt.h:1606
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1199
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
an instruction to allocate memory on the stack
Definition: Instructions.h:59
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Class to represent array types.
Definition: DerivedTypes.h:371
LLVM Basic Block Representation.
Definition: BasicBlock.h:60
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:409
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
Definition: BasicBlock.cpp:452
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:221
unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name, BasicBlock::iterator InsertBefore)
Construct a binary instruction, given the opcode and the two operands.
BinaryOps getOpcode() const
Definition: InstrTypes.h:513
static BinaryOperator * CreateNot(Value *Op, const Twine &Name, BasicBlock::iterator InsertBefore)
Conditional or Unconditional Branch instruction.
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1687
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr, BasicBlock::iterator InsertBefore)
This class is the base class for the comparison instructions.
Definition: InstrTypes.h:983
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition: InstrTypes.h:1362
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition: InstrTypes.h:1198
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition: InstrTypes.h:1255
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:993
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:996
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:1010
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:1022
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:1023
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:999
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:1008
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:997
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:998
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:1017
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:1016
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:1020
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:1007
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:1001
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:1004
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:1018
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:1005
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:1000
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:1002
@ ICMP_EQ
equal
Definition: InstrTypes.h:1014
@ ICMP_NE
not equal
Definition: InstrTypes.h:1015
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:1021
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:1009
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:1019
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:1006
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:995
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:1003
bool isSigned() const
Definition: InstrTypes.h:1265
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:1167
bool isTrueWhenEqual() const
This is just a convenience.
Definition: InstrTypes.h:1314
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition: InstrTypes.h:1211
static CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name, BasicBlock::iterator InsertBefore)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition: InstrTypes.h:1129
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:1105
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition: InstrTypes.h:1233
Predicate getFlippedSignednessPredicate()
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->Failed assert.
Definition: InstrTypes.h:1308
bool isIntPredicate() const
Definition: InstrTypes.h:1123
bool isUnsigned() const
Definition: InstrTypes.h:1271
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2126
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
Definition: Constants.cpp:2087
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2542
static Constant * getNot(Constant *C)
Definition: Constants.cpp:2529
static Constant * getXor(Constant *C1, Constant *C2)
Definition: Constants.cpp:2556
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2535
static Constant * getNeg(Constant *C, bool HasNSW=false)
Definition: Constants.cpp:2523
static Constant * getCompare(unsigned short pred, Constant *C1, Constant *C2, bool OnlyIfReduced=false)
Return an ICmp or FCmp comparison operator constant expression.
Definition: Constants.cpp:2328
static Constant * getZero(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1037
This is the shared class of boolean and integer constants.
Definition: Constants.h:80
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:255
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:849
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:205
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition: Constants.h:123
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:856
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:148
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:145
static ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:863
This class represents a range of values.
Definition: ConstantRange.h:47
ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
bool isEmptySet() const
Return true if this set contains no members.
static ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
ConstantRange inverse() const
Return a new range that is the logical not of the current set.
std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:1449
This is an important base class in LLVM.
Definition: Constant.h:41
static Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
Definition: Constants.cpp:400
static Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
Definition: Constants.cpp:767
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:417
bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition: Constants.cpp:107
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:1758
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:370
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
bool isLegalInteger(uint64_t Width) const
Returns true if the specified type is known to be a native integer type supported by the CPU.
Definition: DataLayout.h:260
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
Definition: DataLayout.cpp:878
unsigned getPointerTypeSizeInBits(Type *) const
Layout pointer size, in bits, based on the type.
Definition: DataLayout.cpp:763
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
Definition: DataLayout.cpp:905
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:504
Type * getSmallestLegalIntType(LLVMContext &C, unsigned Width=0) const
Returns the smallest integer type with size at least as big as Width bits.
Definition: DataLayout.cpp:893
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:145
ArrayRef< BranchInst * > conditionsFor(const Value *V) const
Access the list of branches which affect this value.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Definition: Dominators.cpp:122
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr, BasicBlock::iterator InsertBefore)
This instruction compares its operands according to the predicate given to the constructor.
bool isEquality() const
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition: Operator.h:420
Type * getSourceElementType() const
Definition: Operator.cpp:67
Value * getPointerOperand()
Definition: Operator.h:441
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition: Operator.h:488
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:973
Type * getValueType() const
Definition: GlobalValue.h:296
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
This instruction compares its operands according to the predicate given to the constructor.
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:94
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Definition: IRBuilder.cpp:913
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2257
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition: IRBuilder.h:2460
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
Definition: IRBuilder.h:539
Value * CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2265
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
Definition: IRBuilder.h:2039
Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Definition: IRBuilder.cpp:1214
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition: IRBuilder.h:2516
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition: IRBuilder.h:466
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Definition: IRBuilder.cpp:932
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition: IRBuilder.h:1437
Value * CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1336
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Definition: IRBuilder.h:1876
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2245
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition: IRBuilder.h:1721
Value * createIsFPClass(Value *FPNum, unsigned Test)
Definition: IRBuilder.cpp:1309
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition: IRBuilder.h:486
Value * CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2366
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition: IRBuilder.h:2397
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1749
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2241
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1344
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2127
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2249
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1416
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition: IRBuilder.h:2021
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1475
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1327
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition: IRBuilder.h:471
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition: IRBuilder.h:2007
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1497
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:1666
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2273
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2161
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:2196
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition: IRBuilder.h:2544
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition: IRBuilder.h:180
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args=std::nullopt, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2412
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1519
Value * CreateGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="", bool IsInBounds=false)
Definition: IRBuilder.h:1866
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2351
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Definition: IRBuilder.h:516
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition: IRBuilder.h:502
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1404
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1361
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2666
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc X), (trunc Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, ICmpInst::Predicate Pred)
Fold icmp Pred min|max(X, Y), Z.
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?/ x) != y to @llvm.
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, GlobalVariable *GV, CmpInst &ICI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Constant * getLosslessTrunc(Constant *C, Type *TruncTy, unsigned ExtOp)
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, ICmpInst::Predicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * foldICmpCommutative(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * visitICmpInst(ICmpInst &I)
Instruction * foldSelectICmp(ICmpInst::Predicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
The core instruction combiner logic.
Definition: InstCombiner.h:47
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:498
SimplifyQuery SQ
Definition: InstCombiner.h:76
static bool isCanonicalPredicate(CmpInst::Predicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Definition: InstCombiner.h:157
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
Definition: InstCombiner.h:232
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
Definition: InstCombiner.h:139
TargetLibraryInfo & TLI
Definition: InstCombiner.h:73
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Definition: InstCombiner.h:441
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:462
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Definition: InstCombiner.h:386
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
Definition: InstCombiner.h:55
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:484
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
Definition: InstCombiner.h:180
static std::optional< std::pair< CmpInst::Predicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, Constant *C)
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:491
const DataLayout & DL
Definition: InstCombiner.h:75
DomConditionCache DC
Definition: InstCombiner.h:81
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ? InstCombine's freelyInvertA...
Definition: InstCombiner.h:248
void addToWorklist(Instruction *I)
Definition: InstCombiner.h:336
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
Definition: InstCombiner.h:410
DominatorTree & DT
Definition: InstCombiner.h:74
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:469
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
Definition: InstCombiner.h:431
BuilderTy & Builder
Definition: InstCombiner.h:60
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:476
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
Definition: InstCombiner.h:213
const SimplifyQuery & getSimplifyQuery() const
Definition: InstCombiner.h:342
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
Definition: InstCombiner.h:457
bool 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:296
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:
const BasicBlock * getParent() const
Definition: Instruction.h:152
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:252
bool isShift() const
Definition: Instruction.h:259
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:278
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:47
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:54
An instruction for reading from memory.
Definition: Instructions.h:184
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: MapVector.h:141
This class represents min/max intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr, BasicBlock::iterator InsertBefore)
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, BasicBlock::iterator InsertBefore, Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
Definition: SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:98
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition: SetVector.h:254
This instruction constructs a fixed permutation of two input vectors.
bool empty() const
Definition: SmallVector.h:94
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
Class to represent struct types.
Definition: DerivedTypes.h:216
This class represents a truncation of integer types.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
unsigned getIntegerBitWidth() const
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:265
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:234
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:255
static IntegerType * getInt1Ty(LLVMContext &C)
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:166
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:228
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
Definition: Type.h:171
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:348
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
void setOperand(unsigned i, Value *Val)
Definition: User.h:174
Value * getOperand(unsigned i) const
Definition: User.h:169
unsigned getNumOperands() const
Definition: User.h:191
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition: Value.cpp:153
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:693
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1074
iterator_range< use_iterator > uses()
Definition: Value.h:376
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
void takeName(Value *V)
Transfer the name from V to this value.
Definition: Value.cpp:383
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Definition: Type.cpp:676
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:187
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
Definition: APInt.cpp:2732
APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
Definition: APInt.cpp:2750
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1465
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
Definition: PatternMatch.h:478
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:623
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
Definition: PatternMatch.h:100
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
Definition: PatternMatch.h:569
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
Definition: PatternMatch.h:160
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.
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:919
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:766
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
Definition: PatternMatch.h:714
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:822
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:927
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:510
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
Definition: PatternMatch.h:163
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
Definition: PatternMatch.h:542
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:240
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
CastOperator_match< OpTy, Instruction::Trunc > m_Trunc(const OpTy &Op)
Matches Trunc.
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:840
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
Definition: PatternMatch.h:549
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
Definition: PatternMatch.h:300
CmpClass_match< LHS, RHS, ICmpInst, ICmpInst::Predicate > m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R)
OneUse_match< T > m_OneUse(const T &SubPattern)
Definition: PatternMatch.h:67
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
match_combine_and< class_match< Constant >, match_unless< constantexpr_match > > m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
Definition: PatternMatch.h:801
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
Definition: PatternMatch.h:589
CmpClass_match< LHS, RHS, ICmpInst, ICmpInst::Predicate, true > m_c_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:633
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.
match_combine_or< CastOperator_match< OpTy, Instruction::Trunc >, OpTy > m_TruncOrSelf(const OpTy &Op)
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:294
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
Definition: PatternMatch.h:723
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:311
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:562
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:198
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
Definition: PatternMatch.h:234
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:648
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:456
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition: STLExtras.h:853
OverflowResult
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1722
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:656
bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if the given value is known to have exactly one bit set when defined.
Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition: bit.h:215
Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:313
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:47
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_UNKNOWN
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Definition: Function.cpp:2043
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1736
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
Value * simplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition: STLExtras.h:1921
bool decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate &Pred, Value *&X, APInt &Mask, bool LookThroughTrunc=true)
Decompose an icmp into the form ((X & Mask) pred 0) if possible.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2039
bool isKnownNeverNaN(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
Value * simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define NC
Definition: regutils.h:42
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:230
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:234
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.
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:77
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:238
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:270
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition: KnownBits.h:147
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:285
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:40
bool isConstant() const
Returns true if we know the value of all bits.
Definition: KnownBits.h:50
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
Definition: KnownBits.h:292
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:244
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:141
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition: KnownBits.h:125
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition: KnownBits.h:282
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition: KnownBits.h:131
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition: KnownBits.h:57
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DataLayout & DL
Definition: SimplifyQuery.h:61
const Instruction * CxtI
Definition: SimplifyQuery.h:65
const DominatorTree * DT
Definition: SimplifyQuery.h:63
SimplifyQuery getWithInstruction(const Instruction *I) const
Definition: SimplifyQuery.h:96
AssumptionCache * AC
Definition: SimplifyQuery.h:64
const DomConditionCache * DC
Definition: SimplifyQuery.h:66
A MapVector that performs no allocations if smaller than a certain size.
Definition: MapVector.h:254