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, /*Depth=*/0, 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, /*Depth=*/0, 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, /*Depth=*/0, 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_APIntAllowUndef(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 AllowUndef.
3739/// TODO: Move more folds which allow undef 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, /*Depth=*/0, 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 // The mask value may be a vector constant that has undefined elements. But
4326 // it may not be safe to propagate those undefs into the new compare, so
4327 // replace those elements by copying an existing, defined, and safe scalar
4328 // constant.
4329 Type *OpTy = M->getType();
4330 auto *VecC = dyn_cast<Constant>(M);
4331 auto *OpVTy = dyn_cast<FixedVectorType>(OpTy);
4332 if (OpVTy && VecC && VecC->containsUndefOrPoisonElement()) {
4333 Constant *SafeReplacementConstant = nullptr;
4334 for (unsigned i = 0, e = OpVTy->getNumElements(); i != e; ++i) {
4335 if (!isa<UndefValue>(VecC->getAggregateElement(i))) {
4336 SafeReplacementConstant = VecC->getAggregateElement(i);
4337 break;
4338 }
4339 }
4340 assert(SafeReplacementConstant && "Failed to find undef replacement");
4341 M = Constant::replaceUndefsWith(VecC, SafeReplacementConstant);
4342 }
4343
4344 return IC.Builder.CreateICmp(DstPred, X, M);
4345}
4346
4347/// Some comparisons can be simplified.
4348/// In this case, we are looking for comparisons that look like
4349/// a check for a lossy signed truncation.
4350/// Folds: (MaskedBits is a constant.)
4351/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4352/// Into:
4353/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4354/// Where KeptBits = bitwidth(%x) - MaskedBits
4355static Value *
4357 InstCombiner::BuilderTy &Builder) {
4358 ICmpInst::Predicate SrcPred;
4359 Value *X;
4360 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4361 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4362 if (!match(&I, m_c_ICmp(SrcPred,
4364 m_APInt(C1))),
4365 m_Deferred(X))))
4366 return nullptr;
4367
4368 // Potential handling of non-splats: for each element:
4369 // * if both are undef, replace with constant 0.
4370 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4371 // * if both are not undef, and are different, bailout.
4372 // * else, only one is undef, then pick the non-undef one.
4373
4374 // The shift amount must be equal.
4375 if (*C0 != *C1)
4376 return nullptr;
4377 const APInt &MaskedBits = *C0;
4378 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4379
4380 ICmpInst::Predicate DstPred;
4381 switch (SrcPred) {
4383 // ((%x << MaskedBits) a>> MaskedBits) == %x
4384 // =>
4385 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4387 break;
4389 // ((%x << MaskedBits) a>> MaskedBits) != %x
4390 // =>
4391 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4393 break;
4394 // FIXME: are more folds possible?
4395 default:
4396 return nullptr;
4397 }
4398
4399 auto *XType = X->getType();
4400 const unsigned XBitWidth = XType->getScalarSizeInBits();
4401 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4402 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4403
4404 // KeptBits = bitwidth(%x) - MaskedBits
4405 const APInt KeptBits = BitWidth - MaskedBits;
4406 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4407 // ICmpCst = (1 << KeptBits)
4408 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4409 assert(ICmpCst.isPowerOf2());
4410 // AddCst = (1 << (KeptBits-1))
4411 const APInt AddCst = ICmpCst.lshr(1);
4412 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4413
4414 // T0 = add %x, AddCst
4415 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4416 // T1 = T0 DstPred ICmpCst
4417 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4418
4419 return T1;
4420}
4421
4422// Given pattern:
4423// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4424// we should move shifts to the same hand of 'and', i.e. rewrite as
4425// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4426// We are only interested in opposite logical shifts here.
4427// One of the shifts can be truncated.
4428// If we can, we want to end up creating 'lshr' shift.
4429static Value *
4431 InstCombiner::BuilderTy &Builder) {
4432 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4433 !I.getOperand(0)->hasOneUse())
4434 return nullptr;
4435
4436 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4437
4438 // Look for an 'and' of two logical shifts, one of which may be truncated.
4439 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4440 Instruction *XShift, *MaybeTruncation, *YShift;
4441 if (!match(
4442 I.getOperand(0),
4443 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4445 m_AnyLogicalShift, m_Instruction(YShift))),
4446 m_Instruction(MaybeTruncation)))))
4447 return nullptr;
4448
4449 // We potentially looked past 'trunc', but only when matching YShift,
4450 // therefore YShift must have the widest type.
4451 Instruction *WidestShift = YShift;
4452 // Therefore XShift must have the shallowest type.
4453 // Or they both have identical types if there was no truncation.
4454 Instruction *NarrowestShift = XShift;
4455
4456 Type *WidestTy = WidestShift->getType();
4457 Type *NarrowestTy = NarrowestShift->getType();
4458 assert(NarrowestTy == I.getOperand(0)->getType() &&
4459 "We did not look past any shifts while matching XShift though.");
4460 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4461
4462 // If YShift is a 'lshr', swap the shifts around.
4463 if (match(YShift, m_LShr(m_Value(), m_Value())))
4464 std::swap(XShift, YShift);
4465
4466 // The shifts must be in opposite directions.
4467 auto XShiftOpcode = XShift->getOpcode();
4468 if (XShiftOpcode == YShift->getOpcode())
4469 return nullptr; // Do not care about same-direction shifts here.
4470
4471 Value *X, *XShAmt, *Y, *YShAmt;
4472 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4473 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4474
4475 // If one of the values being shifted is a constant, then we will end with
4476 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4477 // however, we will need to ensure that we won't increase instruction count.
4478 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4479 // At least one of the hands of the 'and' should be one-use shift.
4480 if (!match(I.getOperand(0),
4481 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4482 return nullptr;
4483 if (HadTrunc) {
4484 // Due to the 'trunc', we will need to widen X. For that either the old
4485 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4486 if (!MaybeTruncation->hasOneUse() &&
4487 !NarrowestShift->getOperand(1)->hasOneUse())
4488 return nullptr;
4489 }
4490 }
4491
4492 // We have two shift amounts from two different shifts. The types of those
4493 // shift amounts may not match. If that's the case let's bailout now.
4494 if (XShAmt->getType() != YShAmt->getType())
4495 return nullptr;
4496
4497 // As input, we have the following pattern:
4498 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4499 // We want to rewrite that as:
4500 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4501 // While we know that originally (Q+K) would not overflow
4502 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4503 // shift amounts. so it may now overflow in smaller bitwidth.
4504 // To ensure that does not happen, we need to ensure that the total maximal
4505 // shift amount is still representable in that smaller bit width.
4506 unsigned MaximalPossibleTotalShiftAmount =
4507 (WidestTy->getScalarSizeInBits() - 1) +
4508 (NarrowestTy->getScalarSizeInBits() - 1);
4509 APInt MaximalRepresentableShiftAmount =
4511 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4512 return nullptr;
4513
4514 // Can we fold (XShAmt+YShAmt) ?
4515 auto *NewShAmt = dyn_cast_or_null<Constant>(
4516 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4517 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4518 if (!NewShAmt)
4519 return nullptr;
4520 if (NewShAmt->getType() != WidestTy) {
4521 NewShAmt =
4522 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4523 if (!NewShAmt)
4524 return nullptr;
4525 }
4526 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4527
4528 // Is the new shift amount smaller than the bit width?
4529 // FIXME: could also rely on ConstantRange.
4530 if (!match(NewShAmt,
4532 APInt(WidestBitWidth, WidestBitWidth))))
4533 return nullptr;
4534
4535 // An extra legality check is needed if we had trunc-of-lshr.
4536 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4537 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4538 WidestShift]() {
4539 // It isn't obvious whether it's worth it to analyze non-constants here.
4540 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4541 // If *any* of these preconditions matches we can perform the fold.
4542 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4543 ? NewShAmt->getSplatValue()
4544 : NewShAmt;
4545 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4546 if (NewShAmtSplat &&
4547 (NewShAmtSplat->isNullValue() ||
4548 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4549 return true;
4550 // We consider *min* leading zeros so a single outlier
4551 // blocks the transform as opposed to allowing it.
4552 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4553 KnownBits Known = computeKnownBits(C, SQ.DL);
4554 unsigned MinLeadZero = Known.countMinLeadingZeros();
4555 // If the value being shifted has at most lowest bit set we can fold.
4556 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4557 if (MaxActiveBits <= 1)
4558 return true;
4559 // Precondition: NewShAmt u<= countLeadingZeros(C)
4560 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4561 return true;
4562 }
4563 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4564 KnownBits Known = computeKnownBits(C, SQ.DL);
4565 unsigned MinLeadZero = Known.countMinLeadingZeros();
4566 // If the value being shifted has at most lowest bit set we can fold.
4567 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4568 if (MaxActiveBits <= 1)
4569 return true;
4570 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4571 if (NewShAmtSplat) {
4572 APInt AdjNewShAmt =
4573 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4574 if (AdjNewShAmt.ule(MinLeadZero))
4575 return true;
4576 }
4577 }
4578 return false; // Can't tell if it's ok.
4579 };
4580 if (!CanFold())
4581 return nullptr;
4582 }
4583
4584 // All good, we can do this fold.
4585 X = Builder.CreateZExt(X, WidestTy);
4586 Y = Builder.CreateZExt(Y, WidestTy);
4587 // The shift is the same that was for X.
4588 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4589 ? Builder.CreateLShr(X, NewShAmt)
4590 : Builder.CreateShl(X, NewShAmt);
4591 Value *T1 = Builder.CreateAnd(T0, Y);
4592 return Builder.CreateICmp(I.getPredicate(), T1,
4593 Constant::getNullValue(WidestTy));
4594}
4595
4596/// Fold
4597/// (-1 u/ x) u< y
4598/// ((x * y) ?/ x) != y
4599/// to
4600/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4601/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4602/// will mean that we are looking for the opposite answer.
4605 Value *X, *Y;
4607 Instruction *Div;
4608 bool NeedNegation;
4609 // Look for: (-1 u/ x) u</u>= y
4610 if (!I.isEquality() &&
4611 match(&I, m_c_ICmp(Pred,
4613 m_Instruction(Div)),
4614 m_Value(Y)))) {
4615 Mul = nullptr;
4616
4617 // Are we checking that overflow does not happen, or does happen?
4618 switch (Pred) {
4620 NeedNegation = false;
4621 break; // OK
4623 NeedNegation = true;
4624 break; // OK
4625 default:
4626 return nullptr; // Wrong predicate.
4627 }
4628 } else // Look for: ((x * y) / x) !=/== y
4629 if (I.isEquality() &&
4630 match(&I,
4631 m_c_ICmp(Pred, m_Value(Y),
4634 m_Value(X)),
4636 m_Deferred(X))),
4637 m_Instruction(Div))))) {
4638 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4639 } else
4640 return nullptr;
4641
4643 // If the pattern included (x * y), we'll want to insert new instructions
4644 // right before that original multiplication so that we can replace it.
4645 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4646 if (MulHadOtherUses)
4648
4649 Function *F = Intrinsic::getDeclaration(I.getModule(),
4650 Div->getOpcode() == Instruction::UDiv
4651 ? Intrinsic::umul_with_overflow
4652 : Intrinsic::smul_with_overflow,
4653 X->getType());
4654 CallInst *Call = Builder.CreateCall(F, {X, Y}, "mul");
4655
4656 // If the multiplication was used elsewhere, to ensure that we don't leave
4657 // "duplicate" instructions, replace uses of that original multiplication
4658 // with the multiplication result from the with.overflow intrinsic.
4659 if (MulHadOtherUses)
4660 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4661
4662 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4663 if (NeedNegation) // This technically increases instruction count.
4664 Res = Builder.CreateNot(Res, "mul.not.ov");
4665
4666 // If we replaced the mul, erase it. Do this after all uses of Builder,
4667 // as the mul is used as insertion point.
4668 if (MulHadOtherUses)
4670
4671 return Res;
4672}
4673
4675 InstCombiner::BuilderTy &Builder) {
4676 CmpInst::Predicate Pred;
4677 Value *X;
4678 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4679
4680 if (ICmpInst::isSigned(Pred))
4681 Pred = ICmpInst::getSwappedPredicate(Pred);
4682 else if (ICmpInst::isUnsigned(Pred))
4683 Pred = ICmpInst::getSignedPredicate(Pred);
4684 // else for equality-comparisons just keep the predicate.
4685
4686 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4687 Constant::getNullValue(X->getType()), I.getName());
4688 }
4689
4690 // A value is not equal to its negation unless that value is 0 or
4691 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4692 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4693 ICmpInst::isEquality(Pred)) {
4694 Type *Ty = X->getType();
4696 Constant *MaxSignedVal =
4697 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4698 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4699 Constant *Zero = Constant::getNullValue(Ty);
4700 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4701 }
4702
4703 return nullptr;
4704}
4705
4707 InstCombinerImpl &IC) {
4708 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4709 // Normalize and operand as operand 0.
4710 CmpInst::Predicate Pred = I.getPredicate();
4711 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4712 std::swap(Op0, Op1);
4713 Pred = ICmpInst::getSwappedPredicate(Pred);
4714 }
4715
4716 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4717 return nullptr;
4718
4719 // (icmp (X & Y) u< X --> (X & Y) != X
4720 if (Pred == ICmpInst::ICMP_ULT)
4721 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4722
4723 // (icmp (X & Y) u>= X --> (X & Y) == X
4724 if (Pred == ICmpInst::ICMP_UGE)
4725 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4726
4727 return nullptr;
4728}
4729
4731 InstCombinerImpl &IC) {
4732 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4733
4734 // Normalize or operand as operand 0.
4735 CmpInst::Predicate Pred = I.getPredicate();
4736 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
4737 std::swap(Op0, Op1);
4738 Pred = ICmpInst::getSwappedPredicate(Pred);
4739 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
4740 return nullptr;
4741 }
4742
4743 // icmp (X | Y) u<= X --> (X | Y) == X
4744 if (Pred == ICmpInst::ICMP_ULE)
4745 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4746
4747 // icmp (X | Y) u> X --> (X | Y) != X
4748 if (Pred == ICmpInst::ICMP_UGT)
4749 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4750
4751 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4752 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
4753 if (Value *NotOp1 =
4754 IC.getFreelyInverted(Op1, Op1->hasOneUse(), &IC.Builder))
4755 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
4756 Constant::getNullValue(Op1->getType()));
4757 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
4758 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4759 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
4760 Constant::getAllOnesValue(Op1->getType()));
4761 }
4762 return nullptr;
4763}
4764
4766 InstCombinerImpl &IC) {
4767 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4768 // Normalize xor operand as operand 0.
4769 CmpInst::Predicate Pred = I.getPredicate();
4770 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
4771 std::swap(Op0, Op1);
4772 Pred = ICmpInst::getSwappedPredicate(Pred);
4773 }
4774 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
4775 return nullptr;
4776
4777 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
4778 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
4779 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
4780 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
4782 if (PredOut != Pred && isKnownNonZero(A, /*Depth=*/0, Q))
4783 return new ICmpInst(PredOut, Op0, Op1);
4784
4785 return nullptr;
4786}
4787
4788/// Try to fold icmp (binop), X or icmp X, (binop).
4789/// TODO: A large part of this logic is duplicated in InstSimplify's
4790/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
4791/// duplication.
4793 const SimplifyQuery &SQ) {
4795 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4796
4797 // Special logic for binary operators.
4798 BinaryOperator *BO0 = dyn_cast<BinaryOperator>(Op0);
4799 BinaryOperator *BO1 = dyn_cast<BinaryOperator>(Op1);
4800 if (!BO0 && !BO1)
4801 return nullptr;
4802
4803 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
4804 return NewICmp;
4805
4806 const CmpInst::Predicate Pred = I.getPredicate();
4807 Value *X;
4808
4809 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
4810 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
4811 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
4812 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
4813 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
4814 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
4815 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
4816 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
4817 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
4818
4819 {
4820 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
4821 Constant *C;
4822 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
4823 m_ImmConstant(C)))) &&
4824 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
4826 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
4827 }
4828 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
4829 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
4830 m_ImmConstant(C)))) &&
4831 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
4833 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
4834 }
4835 }
4836
4837 {
4838 // Similar to above: an unsigned overflow comparison may use offset + mask:
4839 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
4840 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
4841 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
4842 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
4843 BinaryOperator *BO;
4844 const APInt *C;
4845 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
4846 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4848 CmpInst::Predicate NewPred =
4850 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4851 return new ICmpInst(NewPred, Op1, Zero);
4852 }
4853
4854 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
4855 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4857 CmpInst::Predicate NewPred =
4859 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4860 return new ICmpInst(NewPred, Op0, Zero);
4861 }
4862 }
4863
4864 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
4865 bool Op0HasNUW = false, Op1HasNUW = false;
4866 bool Op0HasNSW = false, Op1HasNSW = false;
4867 // Analyze the case when either Op0 or Op1 is an add instruction.
4868 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
4869 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
4870 bool &HasNSW, bool &HasNUW) -> bool {
4871 if (isa<OverflowingBinaryOperator>(BO)) {
4872 HasNUW = BO.hasNoUnsignedWrap();
4873 HasNSW = BO.hasNoSignedWrap();
4874 return ICmpInst::isEquality(Pred) ||
4875 (CmpInst::isUnsigned(Pred) && HasNUW) ||
4876 (CmpInst::isSigned(Pred) && HasNSW);
4877 } else if (BO.getOpcode() == Instruction::Or) {
4878 HasNUW = true;
4879 HasNSW = true;
4880 return true;
4881 } else {
4882 return false;
4883 }
4884 };
4885 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
4886
4887 if (BO0) {
4888 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
4889 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
4890 }
4891 if (BO1) {
4892 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
4893 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
4894 }
4895
4896 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
4897 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
4898 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
4899 return new ICmpInst(Pred, A == Op1 ? B : A,
4900 Constant::getNullValue(Op1->getType()));
4901
4902 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
4903 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
4904 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
4905 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
4906 C == Op0 ? D : C);
4907
4908 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
4909 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
4910 NoOp1WrapProblem) {
4911 // Determine Y and Z in the form icmp (X+Y), (X+Z).
4912 Value *Y, *Z;
4913 if (A == C) {
4914 // C + B == C + D -> B == D
4915 Y = B;
4916 Z = D;
4917 } else if (A == D) {
4918 // D + B == C + D -> B == C
4919 Y = B;
4920 Z = C;
4921 } else if (B == C) {
4922 // A + C == C + D -> A == D
4923 Y = A;
4924 Z = D;
4925 } else {
4926 assert(B == D);
4927 // A + D == C + D -> A == C
4928 Y = A;
4929 Z = C;
4930 }
4931 return new ICmpInst(Pred, Y, Z);
4932 }
4933
4934 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
4935 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLT &&
4936 match(B, m_AllOnes()))
4937 return new ICmpInst(CmpInst::ICMP_SLE, A, Op1);
4938
4939 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
4940 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGE &&
4941 match(B, m_AllOnes()))
4942 return new ICmpInst(CmpInst::ICMP_SGT, A, Op1);
4943
4944 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
4945 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLE && match(B, m_One()))
4946 return new ICmpInst(CmpInst::ICMP_SLT, A, Op1);
4947
4948 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
4949 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGT && match(B, m_One()))
4950 return new ICmpInst(CmpInst::ICMP_SGE, A, Op1);
4951
4952 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
4953 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGT &&
4954 match(D, m_AllOnes()))
4955 return new ICmpInst(CmpInst::ICMP_SGE, Op0, C);
4956
4957 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
4958 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLE &&
4959 match(D, m_AllOnes()))
4960 return new ICmpInst(CmpInst::ICMP_SLT, Op0, C);
4961
4962 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
4963 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGE && match(D, m_One()))
4964 return new ICmpInst(CmpInst::ICMP_SGT, Op0, C);
4965
4966 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
4967 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLT && match(D, m_One()))
4968 return new ICmpInst(CmpInst::ICMP_SLE, Op0, C);
4969
4970 // TODO: The subtraction-related identities shown below also hold, but
4971 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
4972 // wouldn't happen even if they were implemented.
4973 //
4974 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
4975 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
4976 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
4977 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
4978
4979 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
4980 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_ULE && match(B, m_One()))
4981 return new ICmpInst(CmpInst::ICMP_ULT, A, Op1);
4982
4983 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
4984 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_UGT && match(B, m_One()))
4985 return new ICmpInst(CmpInst::ICMP_UGE, A, Op1);
4986
4987 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
4988 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_UGE && match(D, m_One()))
4989 return new ICmpInst(CmpInst::ICMP_UGT, Op0, C);
4990
4991 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
4992 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_ULT && match(D, m_One()))
4993 return new ICmpInst(CmpInst::ICMP_ULE, Op0, C);
4994
4995 // if C1 has greater magnitude than C2:
4996 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
4997 // s.t. C3 = C1 - C2
4998 //
4999 // if C2 has greater magnitude than C1:
5000 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5001 // s.t. C3 = C2 - C1
5002 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5003 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5004 const APInt *AP1, *AP2;
5005 // TODO: Support non-uniform vectors.
5006 // TODO: Allow undef passthrough if B AND D's element is undef.
5007 if (match(B, m_APIntAllowUndef(AP1)) && match(D, m_APIntAllowUndef(AP2)) &&
5008 AP1->isNegative() == AP2->isNegative()) {
5009 APInt AP1Abs = AP1->abs();
5010 APInt AP2Abs = AP2->abs();
5011 if (AP1Abs.uge(AP2Abs)) {
5012 APInt Diff = *AP1 - *AP2;
5013 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5014 Value *NewAdd = Builder.CreateAdd(
5015 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5016 return new ICmpInst(Pred, NewAdd, C);
5017 } else {
5018 APInt Diff = *AP2 - *AP1;
5019 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5020 Value *NewAdd = Builder.CreateAdd(
5021 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5022 return new ICmpInst(Pred, A, NewAdd);
5023 }
5024 }
5025 Constant *Cst1, *Cst2;
5026 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5027 ICmpInst::isEquality(Pred)) {
5028 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5029 Value *NewAdd = Builder.CreateAdd(C, Diff);
5030 return new ICmpInst(Pred, A, NewAdd);
5031 }
5032 }
5033
5034 // Analyze the case when either Op0 or Op1 is a sub instruction.
5035 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5036 A = nullptr;
5037 B = nullptr;
5038 C = nullptr;
5039 D = nullptr;
5040 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5041 A = BO0->getOperand(0);
5042 B = BO0->getOperand(1);
5043 }
5044 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5045 C = BO1->getOperand(0);
5046 D = BO1->getOperand(1);
5047 }
5048
5049 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5050 if (A == Op1 && NoOp0WrapProblem)
5051 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5052 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5053 if (C == Op0 && NoOp1WrapProblem)
5054 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5055
5056 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5057 // (A - B) u>/u<= A --> B u>/u<= A
5058 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5059 return new ICmpInst(Pred, B, A);
5060 // C u</u>= (C - D) --> C u</u>= D
5061 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5062 return new ICmpInst(Pred, C, D);
5063 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5064 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5065 isKnownNonZero(B, /*Depth=*/0, Q))
5067 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5068 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5069 isKnownNonZero(D, /*Depth=*/0, Q))
5071
5072 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5073 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5074 return new ICmpInst(Pred, A, C);
5075
5076 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5077 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5078 return new ICmpInst(Pred, D, B);
5079
5080 // icmp (0-X) < cst --> x > -cst
5081 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5082 Value *X;
5083 if (match(BO0, m_Neg(m_Value(X))))
5084 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5085 if (RHSC->isNotMinSignedValue())
5086 return new ICmpInst(I.getSwappedPredicate(), X,
5087 ConstantExpr::getNeg(RHSC));
5088 }
5089
5090 if (Instruction * R = foldICmpXorXX(I, Q, *this))
5091 return R;
5092 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5093 return R;
5094
5095 {
5096 // Try to remove shared multiplier from comparison:
5097 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z
5098 Value *X, *Y, *Z;
5099 if (Pred == ICmpInst::getUnsignedPredicate(Pred) &&
5100 ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5101 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5102 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5103 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))))) {
5104 bool NonZero;
5105 if (ICmpInst::isEquality(Pred)) {
5106 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5107 // if Z % 2 != 0
5108 // X * Z eq/ne Y * Z -> X eq/ne Y
5109 if (ZKnown.countMaxTrailingZeros() == 0)
5110 return new ICmpInst(Pred, X, Y);
5111 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, /*Depth=*/0, Q);
5112 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5113 // X * Z eq/ne Y * Z -> X eq/ne Y
5114 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5115 return new ICmpInst(Pred, X, Y);
5116 } else
5117 NonZero = isKnownNonZero(Z, /*Depth=*/0, Q);
5118
5119 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5120 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5121 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5122 return new ICmpInst(Pred, X, Y);
5123 }
5124 }
5125
5126 BinaryOperator *SRem = nullptr;
5127 // icmp (srem X, Y), Y
5128 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5129 SRem = BO0;
5130 // icmp Y, (srem X, Y)
5131 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5132 Op0 == BO1->getOperand(1))
5133 SRem = BO1;
5134 if (SRem) {
5135 // We don't check hasOneUse to avoid increasing register pressure because
5136 // the value we use is the same value this instruction was already using.
5137 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5138 default:
5139 break;
5140 case ICmpInst::ICMP_EQ:
5141 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5142 case ICmpInst::ICMP_NE:
5143 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5144 case ICmpInst::ICMP_SGT:
5145 case ICmpInst::ICMP_SGE:
5146 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5148 case ICmpInst::ICMP_SLT:
5149 case ICmpInst::ICMP_SLE:
5150 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5152 }
5153 }
5154
5155 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5156 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5157 BO0->getOperand(1) == BO1->getOperand(1)) {
5158 switch (BO0->getOpcode()) {
5159 default:
5160 break;
5161 case Instruction::Add:
5162 case Instruction::Sub:
5163 case Instruction::Xor: {
5164 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5165 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5166
5167 const APInt *C;
5168 if (match(BO0->getOperand(1), m_APInt(C))) {
5169 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5170 if (C->isSignMask()) {
5171 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5172 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5173 }
5174
5175 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5176 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5177 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5178 NewPred = I.getSwappedPredicate(NewPred);
5179 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5180 }
5181 }
5182 break;
5183 }
5184 case Instruction::Mul: {
5185 if (!I.isEquality())
5186 break;
5187
5188 const APInt *C;
5189 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5190 !C->isOne()) {
5191 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5192 // Mask = -1 >> count-trailing-zeros(C).
5193 if (unsigned TZs = C->countr_zero()) {
5194 Constant *Mask = ConstantInt::get(
5195 BO0->getType(),
5196 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5197 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5198 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5199 return new ICmpInst(Pred, And1, And2);
5200 }
5201 }
5202 break;
5203 }
5204 case Instruction::UDiv:
5205 case Instruction::LShr:
5206 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5207 break;
5208 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5209
5210 case Instruction::SDiv:
5211 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5212 !BO0->isExact() || !BO1->isExact())
5213 break;
5214 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5215
5216 case Instruction::AShr:
5217 if (!BO0->isExact() || !BO1->isExact())
5218 break;
5219 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5220
5221 case Instruction::Shl: {
5222 bool NUW = Op0HasNUW && Op1HasNUW;
5223 bool NSW = Op0HasNSW && Op1HasNSW;
5224 if (!NUW && !NSW)
5225 break;
5226 if (!NSW && I.isSigned())
5227 break;
5228 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5229 }
5230 }
5231 }
5232
5233 if (BO0) {
5234 // Transform A & (L - 1) `ult` L --> L != 0
5235 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5236 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5237
5238 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5239 auto *Zero = Constant::getNullValue(BO0->getType());
5240 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5241 }
5242 }
5243
5244 // For unsigned predicates / eq / ne:
5245 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5246 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5247 if (!ICmpInst::isSigned(Pred)) {
5248 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5249 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5250 Constant::getNullValue(Op1->getType()));
5251 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5252 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5253 Constant::getNullValue(Op0->getType()), Op0);
5254 }
5255
5257 return replaceInstUsesWith(I, V);
5258
5259 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5260 return R;
5261
5263 return replaceInstUsesWith(I, V);
5264
5266 return replaceInstUsesWith(I, V);
5267
5268 return nullptr;
5269}
5270
5271/// Fold icmp Pred min|max(X, Y), Z.
5274 Value *Z,
5275 ICmpInst::Predicate Pred) {
5276 Value *X = MinMax->getLHS();
5277 Value *Y = MinMax->getRHS();
5278 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5279 return nullptr;
5280 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5281 // Revert the transform signed pred -> unsigned pred
5282 // TODO: We can flip the signedness of predicate if both operands of icmp
5283 // are negative.
5287 } else
5288 return nullptr;
5289 }
5291 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5292 if (!Val)
5293 return std::nullopt;
5294 if (match(Val, m_One()))
5295 return true;
5296 if (match(Val, m_Zero()))
5297 return false;
5298 return std::nullopt;
5299 };
5300 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5301 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5302 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5303 return nullptr;
5304 if (!CmpXZ.has_value()) {
5305 std::swap(X, Y);
5306 std::swap(CmpXZ, CmpYZ);
5307 }
5308
5309 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5310 if (CmpYZ.has_value())
5311 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5312 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5313 };
5314
5315 switch (Pred) {
5316 case ICmpInst::ICMP_EQ:
5317 case ICmpInst::ICMP_NE: {
5318 // If X == Z:
5319 // Expr Result
5320 // min(X, Y) == Z X <= Y
5321 // max(X, Y) == Z X >= Y
5322 // min(X, Y) != Z X > Y
5323 // max(X, Y) != Z X < Y
5324 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5325 ICmpInst::Predicate NewPred =
5326 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5327 if (Pred == ICmpInst::ICMP_NE)
5328 NewPred = ICmpInst::getInversePredicate(NewPred);
5329 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5330 }
5331 // Otherwise (X != Z):
5332 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5333 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5334 if (!MinMaxCmpXZ.has_value()) {
5335 std::swap(X, Y);
5336 std::swap(CmpXZ, CmpYZ);
5337 // Re-check pre-condition X != Z
5338 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5339 break;
5340 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5341 }
5342 if (!MinMaxCmpXZ.has_value())
5343 break;
5344 if (*MinMaxCmpXZ) {
5345 // Expr Fact Result
5346 // min(X, Y) == Z X < Z false
5347 // max(X, Y) == Z X > Z false
5348 // min(X, Y) != Z X < Z true
5349 // max(X, Y) != Z X > Z true
5350 return replaceInstUsesWith(
5351 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5352 } else {
5353 // Expr Fact Result
5354 // min(X, Y) == Z X > Z Y == Z
5355 // max(X, Y) == Z X < Z Y == Z
5356 // min(X, Y) != Z X > Z Y != Z
5357 // max(X, Y) != Z X < Z Y != Z
5358 return FoldIntoCmpYZ();
5359 }
5360 break;
5361 }
5362 case ICmpInst::ICMP_SLT:
5363 case ICmpInst::ICMP_ULT:
5364 case ICmpInst::ICMP_SLE:
5365 case ICmpInst::ICMP_ULE:
5366 case ICmpInst::ICMP_SGT:
5367 case ICmpInst::ICMP_UGT:
5368 case ICmpInst::ICMP_SGE:
5369 case ICmpInst::ICMP_UGE: {
5370 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5371 if (*CmpXZ) {
5372 if (IsSame) {
5373 // Expr Fact Result
5374 // min(X, Y) < Z X < Z true
5375 // min(X, Y) <= Z X <= Z true
5376 // max(X, Y) > Z X > Z true
5377 // max(X, Y) >= Z X >= Z true
5378 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5379 } else {
5380 // Expr Fact Result
5381 // max(X, Y) < Z X < Z Y < Z
5382 // max(X, Y) <= Z X <= Z Y <= Z
5383 // min(X, Y) > Z X > Z Y > Z
5384 // min(X, Y) >= Z X >= Z Y >= Z
5385 return FoldIntoCmpYZ();
5386 }
5387 } else {
5388 if (IsSame) {
5389 // Expr Fact Result
5390 // min(X, Y) < Z X >= Z Y < Z
5391 // min(X, Y) <= Z X > Z Y <= Z
5392 // max(X, Y) > Z X <= Z Y > Z
5393 // max(X, Y) >= Z X < Z Y >= Z
5394 return FoldIntoCmpYZ();
5395 } else {
5396 // Expr Fact Result
5397 // max(X, Y) < Z X >= Z false
5398 // max(X, Y) <= Z X > Z false
5399 // min(X, Y) > Z X <= Z false
5400 // min(X, Y) >= Z X < Z false
5401 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5402 }
5403 }
5404 break;
5405 }
5406 default:
5407 break;
5408 }
5409
5410 return nullptr;
5411}
5412
5413// Canonicalize checking for a power-of-2-or-zero value:
5415 InstCombiner::BuilderTy &Builder) {
5416 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5417 const CmpInst::Predicate Pred = I.getPredicate();
5418 Value *A = nullptr;
5419 bool CheckIs;
5420 if (I.isEquality()) {
5421 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5422 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5423 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5424 m_Deferred(A)))) ||
5425 !match(Op1, m_ZeroInt()))
5426 A = nullptr;
5427
5428 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5429 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5430 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5431 A = Op1;
5432 else if (match(Op1,
5434 A = Op0;
5435
5436 CheckIs = Pred == ICmpInst::ICMP_EQ;
5437 } else if (ICmpInst::isUnsigned(Pred)) {
5438 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5439 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5440
5441 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5443 m_Specific(Op1))))) {
5444 A = Op1;
5445 CheckIs = Pred == ICmpInst::ICMP_UGE;
5446 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5448 m_Specific(Op0))))) {
5449 A = Op0;
5450 CheckIs = Pred == ICmpInst::ICMP_ULE;
5451 }
5452 }
5453
5454 if (A) {
5455 Type *Ty = A->getType();
5456 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5457 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5458 ConstantInt::get(Ty, 2))
5459 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5460 ConstantInt::get(Ty, 1));
5461 }
5462
5463 return nullptr;
5464}
5465
5467 if (!I.isEquality())
5468 return nullptr;
5469
5470 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5471 const CmpInst::Predicate Pred = I.getPredicate();
5472 Value *A, *B, *C, *D;
5473 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5474 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5475 Value *OtherVal = A == Op1 ? B : A;
5476 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5477 }
5478
5479 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5480 // A^c1 == C^c2 --> A == C^(c1^c2)
5481 ConstantInt *C1, *C2;
5482 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5483 Op1->hasOneUse()) {
5484 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5486 return new ICmpInst(Pred, A, Xor);
5487 }
5488
5489 // A^B == A^D -> B == D
5490 if (A == C)
5491 return new ICmpInst(Pred, B, D);
5492 if (A == D)
5493 return new ICmpInst(Pred, B, C);
5494 if (B == C)
5495 return new ICmpInst(Pred, A, D);
5496 if (B == D)
5497 return new ICmpInst(Pred, A, C);
5498 }
5499 }
5500
5501 // canoncalize:
5502 // (icmp eq/ne (and X, C), X)
5503 // -> (icmp eq/ne (and X, ~C), 0)
5504 {
5505 Constant *CMask;
5506 A = nullptr;
5507 if (match(Op0, m_OneUse(m_And(m_Specific(Op1), m_ImmConstant(CMask)))))
5508 A = Op1;
5509 else if (match(Op1, m_OneUse(m_And(m_Specific(Op0), m_ImmConstant(CMask)))))
5510 A = Op0;
5511 if (A)
5512 return new ICmpInst(Pred, Builder.CreateAnd(A, Builder.CreateNot(CMask)),
5513 Constant::getNullValue(A->getType()));
5514 }
5515
5516 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5517 // A == (A^B) -> B == 0
5518 Value *OtherVal = A == Op0 ? B : A;
5519 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5520 }
5521
5522 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
5523 if (match(Op0, m_OneUse(m_And(m_Value(A), m_Value(B)))) &&
5524 match(Op1, m_OneUse(m_And(m_Value(C), m_Value(D))))) {
5525 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
5526
5527 if (A == C) {
5528 X = B;
5529 Y = D;
5530 Z = A;
5531 } else if (A == D) {
5532 X = B;
5533 Y = C;
5534 Z = A;
5535 } else if (B == C) {
5536 X = A;
5537 Y = D;
5538 Z = B;
5539 } else if (B == D) {
5540 X = A;
5541 Y = C;
5542 Z = B;
5543 }
5544
5545 if (X) { // Build (X^Y) & Z
5546 Op1 = Builder.CreateXor(X, Y);
5547 Op1 = Builder.CreateAnd(Op1, Z);
5548 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
5549 }
5550 }
5551
5552 {
5553 // Similar to above, but specialized for constant because invert is needed:
5554 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
5555 Value *X, *Y;
5556 Constant *C;
5557 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
5558 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
5561 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
5562 }
5563 }
5564
5565 if (match(Op1, m_ZExt(m_Value(A))) &&
5566 (Op0->hasOneUse() || Op1->hasOneUse())) {
5567 // (B & (Pow2C-1)) == zext A --> A == trunc B
5568 // (B & (Pow2C-1)) != zext A --> A != trunc B
5569 const APInt *MaskC;
5570 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
5571 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
5572 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
5573 }
5574
5575 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
5576 // For lshr and ashr pairs.
5577 const APInt *AP1, *AP2;
5578 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowUndef(AP1)))) &&
5579 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowUndef(AP2))))) ||
5580 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowUndef(AP1)))) &&
5581 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowUndef(AP2)))))) {
5582 if (AP1 != AP2)
5583 return nullptr;
5584 unsigned TypeBits = AP1->getBitWidth();
5585 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
5586 if (ShAmt < TypeBits && ShAmt != 0) {
5587 ICmpInst::Predicate NewPred =
5589 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5590 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
5591 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
5592 }
5593 }
5594
5595 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
5596 ConstantInt *Cst1;
5597 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
5598 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
5599 unsigned TypeBits = Cst1->getBitWidth();
5600 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
5601 if (ShAmt < TypeBits && ShAmt != 0) {
5602 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5603 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
5605 I.getName() + ".mask");
5606 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
5607 }
5608 }
5609
5610 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
5611 // "icmp (and X, mask), cst"
5612 uint64_t ShAmt = 0;
5613 if (Op0->hasOneUse() &&
5614 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
5615 match(Op1, m_ConstantInt(Cst1)) &&
5616 // Only do this when A has multiple uses. This is most important to do
5617 // when it exposes other optimizations.
5618 !A->hasOneUse()) {
5619 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
5620
5621 if (ShAmt < ASize) {
5622 APInt MaskV =
5624 MaskV <<= ShAmt;
5625
5626 APInt CmpV = Cst1->getValue().zext(ASize);
5627 CmpV <<= ShAmt;
5628
5629 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
5630 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
5631 }
5632 }
5633
5635 return ICmp;
5636
5637 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks the
5638 // top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s INT_MAX",
5639 // which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a few steps
5640 // of instcombine.
5641 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
5642 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
5644 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
5645 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
5647 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
5648 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
5650 Add, ConstantInt::get(A->getType(), C.shl(1)));
5651 }
5652
5653 // Canonicalize:
5654 // Assume B_Pow2 != 0
5655 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
5656 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
5657 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
5658 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, 0, &I))
5659 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
5661
5662 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
5663 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, 0, &I))
5664 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
5665 ConstantInt::getNullValue(Op1->getType()));
5666
5667 // Canonicalize:
5668 // icmp eq/ne X, OneUse(rotate-right(X))
5669 // -> icmp eq/ne X, rotate-left(X)
5670 // We generally try to convert rotate-right -> rotate-left, this just
5671 // canonicalizes another case.
5672 CmpInst::Predicate PredUnused = Pred;
5673 if (match(&I, m_c_ICmp(PredUnused, m_Value(A),
5674 m_OneUse(m_Intrinsic<Intrinsic::fshr>(
5675 m_Deferred(A), m_Deferred(A), m_Value(B))))))
5676 return new ICmpInst(
5677 Pred, A,
5678 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
5679
5680 // Canonicalize:
5681 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
5682 Constant *Cst;
5683 if (match(&I, m_c_ICmp(PredUnused,
5686 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
5687
5688 {
5689 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5690 auto m_Matcher =
5693 m_Sub(m_Value(B), m_Deferred(A)));
5694 std::optional<bool> IsZero = std::nullopt;
5695 if (match(&I, m_c_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5696 m_Deferred(A))))
5697 IsZero = false;
5698 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5699 else if (match(&I,
5700 m_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5701 m_Zero())))
5702 IsZero = true;
5703
5704 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, /*Depth*/ 0, &I))
5705 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5706 // -> (icmp eq/ne (and X, P2), 0)
5707 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5708 // -> (icmp eq/ne (and X, P2), P2)
5709 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
5710 *IsZero ? A
5711 : ConstantInt::getNullValue(A->getType()));
5712 }
5713
5714 return nullptr;
5715}
5716
5718 ICmpInst::Predicate Pred = ICmp.getPredicate();
5719 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
5720
5721 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
5722 // The trunc masks high bits while the compare may effectively mask low bits.
5723 Value *X;
5724 const APInt *C;
5725 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
5726 return nullptr;
5727
5728 // This matches patterns corresponding to tests of the signbit as well as:
5729 // (trunc X) u< C --> (X & -C) == 0 (are all masked-high-bits clear?)
5730 // (trunc X) u> C --> (X & ~C) != 0 (are any masked-high-bits set?)
5731 APInt Mask;
5732 if (decomposeBitTestICmp(Op0, Op1, Pred, X, Mask, true /* WithTrunc */)) {
5733 Value *And = Builder.CreateAnd(X, Mask);
5734 Constant *Zero = ConstantInt::getNullValue(X->getType());
5735 return new ICmpInst(Pred, And, Zero);
5736 }
5737
5738 unsigned SrcBits = X->getType()->getScalarSizeInBits();
5739 if (Pred == ICmpInst::ICMP_ULT && C->isNegatedPowerOf2()) {
5740 // If C is a negative power-of-2 (high-bit mask):
5741 // (trunc X) u< C --> (X & C) != C (are any masked-high-bits clear?)
5742 Constant *MaskC = ConstantInt::get(X->getType(), C->zext(SrcBits));
5743 Value *And = Builder.CreateAnd(X, MaskC);
5744 return new ICmpInst(ICmpInst::ICMP_NE, And, MaskC);
5745 }
5746
5747 if (Pred == ICmpInst::ICMP_UGT && (~*C).isPowerOf2()) {
5748 // If C is not-of-power-of-2 (one clear bit):
5749 // (trunc X) u> C --> (X & (C+1)) == C+1 (are all masked-high-bits set?)
5750 Constant *MaskC = ConstantInt::get(X->getType(), (*C + 1).zext(SrcBits));
5751 Value *And = Builder.CreateAnd(X, MaskC);
5752 return new ICmpInst(ICmpInst::ICMP_EQ, And, MaskC);
5753 }
5754
5755 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
5756 if (II->getIntrinsicID() == Intrinsic::cttz ||
5757 II->getIntrinsicID() == Intrinsic::ctlz) {
5758 unsigned MaxRet = SrcBits;
5759 // If the "is_zero_poison" argument is set, then we know at least
5760 // one bit is set in the input, so the result is always at least one
5761 // less than the full bitwidth of that input.
5762 if (match(II->getArgOperand(1), m_One()))
5763 MaxRet--;
5764
5765 // Make sure the destination is wide enough to hold the largest output of
5766 // the intrinsic.
5767 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
5768 if (Instruction *I =
5769 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
5770 return I;
5771 }
5772 }
5773
5774 return nullptr;
5775}
5776
5778 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
5779 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
5780 Value *X;
5781 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
5782 return nullptr;
5783
5784 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
5785 bool IsSignedCmp = ICmp.isSigned();
5786
5787 // icmp Pred (ext X), (ext Y)
5788 Value *Y;
5789 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
5790 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
5791 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
5792
5793 if (IsZext0 != IsZext1) {
5794 // If X and Y and both i1
5795 // (icmp eq/ne (zext X) (sext Y))
5796 // eq -> (icmp eq (or X, Y), 0)
5797 // ne -> (icmp ne (or X, Y), 0)
5798 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
5799 Y->getType()->isIntOrIntVectorTy(1))
5800 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
5801 Constant::getNullValue(X->getType()));
5802
5803 // If we have mismatched casts and zext has the nneg flag, we can
5804 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
5805
5806 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
5807 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
5808
5809 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
5810 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
5811
5812 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
5813 IsSignedExt = true;
5814 else
5815 return nullptr;
5816 }
5817
5818 // Not an extension from the same type?
5819 Type *XTy = X->getType(), *YTy = Y->getType();
5820 if (XTy != YTy) {
5821 // One of the casts must have one use because we are creating a new cast.
5822 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
5823 return nullptr;
5824 // Extend the narrower operand to the type of the wider operand.
5825 CastInst::CastOps CastOpcode =
5826 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
5827 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
5828 X = Builder.CreateCast(CastOpcode, X, YTy);
5829 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
5830 Y = Builder.CreateCast(CastOpcode, Y, XTy);
5831 else
5832 return nullptr;
5833 }
5834
5835 // (zext X) == (zext Y) --> X == Y
5836 // (sext X) == (sext Y) --> X == Y
5837 if (ICmp.isEquality())
5838 return new ICmpInst(ICmp.getPredicate(), X, Y);
5839
5840 // A signed comparison of sign extended values simplifies into a
5841 // signed comparison.
5842 if (IsSignedCmp && IsSignedExt)
5843 return new ICmpInst(ICmp.getPredicate(), X, Y);
5844
5845 // The other three cases all fold into an unsigned comparison.
5846 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
5847 }
5848
5849 // Below here, we are only folding a compare with constant.
5850 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
5851 if (!C)
5852 return nullptr;
5853
5854 // If a lossless truncate is possible...
5855 Type *SrcTy = CastOp0->getSrcTy();
5856 Constant *Res = getLosslessTrunc(C, SrcTy, CastOp0->getOpcode());
5857 if (Res) {
5858 if (ICmp.isEquality())
5859 return new ICmpInst(ICmp.getPredicate(), X, Res);
5860
5861 // A signed comparison of sign extended values simplifies into a
5862 // signed comparison.
5863 if (IsSignedExt && IsSignedCmp)
5864 return new ICmpInst(ICmp.getPredicate(), X, Res);
5865
5866 // The other three cases all fold into an unsigned comparison.
5867 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
5868 }
5869
5870 // The re-extended constant changed, partly changed (in the case of a vector),
5871 // or could not be determined to be equal (in the case of a constant
5872 // expression), so the constant cannot be represented in the shorter type.
5873 // All the cases that fold to true or false will have already been handled
5874 // by simplifyICmpInst, so only deal with the tricky case.
5875 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
5876 return nullptr;
5877
5878 // Is source op positive?
5879 // icmp ult (sext X), C --> icmp sgt X, -1
5880 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
5882
5883 // Is source op negative?
5884 // icmp ugt (sext X), C --> icmp slt X, 0
5885 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
5887}
5888
5889/// Handle icmp (cast x), (cast or constant).
5891 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
5892 // icmp compares only pointer's value.
5893 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
5894 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
5895 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
5896 if (SimplifiedOp0 || SimplifiedOp1)
5897 return new ICmpInst(ICmp.getPredicate(),
5898 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
5899 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
5900
5901 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
5902 if (!CastOp0)
5903 return nullptr;
5904 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
5905 return nullptr;
5906
5907 Value *Op0Src = CastOp0->getOperand(0);
5908 Type *SrcTy = CastOp0->getSrcTy();
5909 Type *DestTy = CastOp0->getDestTy();
5910
5911 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
5912 // integer type is the same size as the pointer type.
5913 auto CompatibleSizes = [&](Type *SrcTy, Type *DestTy) {
5914 if (isa<VectorType>(SrcTy)) {
5915 SrcTy = cast<VectorType>(SrcTy)->getElementType();
5916 DestTy = cast<VectorType>(DestTy)->getElementType();
5917 }
5918 return DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth();
5919 };
5920 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
5921 CompatibleSizes(SrcTy, DestTy)) {
5922 Value *NewOp1 = nullptr;
5923 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
5924 Value *PtrSrc = PtrToIntOp1->getOperand(0);
5925 if (PtrSrc->getType() == Op0Src->getType())
5926 NewOp1 = PtrToIntOp1->getOperand(0);
5927 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
5928 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
5929 }
5930
5931 if (NewOp1)
5932 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
5933 }
5934
5935 if (Instruction *R = foldICmpWithTrunc(ICmp))
5936 return R;
5937
5938 return foldICmpWithZextOrSext(ICmp);
5939}
5940
5941static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
5942 switch (BinaryOp) {
5943 default:
5944 llvm_unreachable("Unsupported binary op");
5945 case Instruction::Add:
5946 case Instruction::Sub:
5947 return match(RHS, m_Zero());
5948 case Instruction::Mul:
5949 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
5950 match(RHS, m_One());
5951 }
5952}
5953
5956 bool IsSigned, Value *LHS, Value *RHS,
5957 Instruction *CxtI) const {
5958 switch (BinaryOp) {
5959 default:
5960 llvm_unreachable("Unsupported binary op");
5961 case Instruction::Add:
5962 if (IsSigned)
5963 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
5964 else
5965 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
5966 case Instruction::Sub:
5967 if (IsSigned)
5968 return computeOverflowForSignedSub(LHS, RHS, CxtI);
5969 else
5970 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
5971 case Instruction::Mul:
5972 if (IsSigned)
5973 return computeOverflowForSignedMul(LHS, RHS, CxtI);
5974 else
5975 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
5976 }
5977}
5978
5979bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
5980 bool IsSigned, Value *LHS,
5981 Value *RHS, Instruction &OrigI,
5982 Value *&Result,
5983 Constant *&Overflow) {
5984 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
5985 std::swap(LHS, RHS);
5986
5987 // If the overflow check was an add followed by a compare, the insertion point
5988 // may be pointing to the compare. We want to insert the new instructions
5989 // before the add in case there are uses of the add between the add and the
5990 // compare.
5991 Builder.SetInsertPoint(&OrigI);
5992
5993 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
5994 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
5995 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
5996
5997 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
5998 Result = LHS;
5999 Overflow = ConstantInt::getFalse(OverflowTy);
6000 return true;
6001 }
6002
6003 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6005 return false;
6008 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6009 Result->takeName(&OrigI);
6010 Overflow = ConstantInt::getTrue(OverflowTy);
6011 return true;
6013 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6014 Result->takeName(&OrigI);
6015 Overflow = ConstantInt::getFalse(OverflowTy);
6016 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6017 if (IsSigned)
6018 Inst->setHasNoSignedWrap();
6019 else
6020 Inst->setHasNoUnsignedWrap();
6021 }
6022 return true;
6023 }
6024
6025 llvm_unreachable("Unexpected overflow result");
6026}
6027
6028/// Recognize and process idiom involving test for multiplication
6029/// overflow.
6030///
6031/// The caller has matched a pattern of the form:
6032/// I = cmp u (mul(zext A, zext B), V
6033/// The function checks if this is a test for overflow and if so replaces
6034/// multiplication with call to 'mul.with.overflow' intrinsic.
6035///
6036/// \param I Compare instruction.
6037/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6038/// the compare instruction. Must be of integer type.
6039/// \param OtherVal The other argument of compare instruction.
6040/// \returns Instruction which must replace the compare instruction, NULL if no
6041/// replacement required.
6043 const APInt *OtherVal,
6044 InstCombinerImpl &IC) {
6045 // Don't bother doing this transformation for pointers, don't do it for
6046 // vectors.
6047 if (!isa<IntegerType>(MulVal->getType()))
6048 return nullptr;
6049
6050 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6051 if (!MulInstr)
6052 return nullptr;
6053 assert(MulInstr->getOpcode() == Instruction::Mul);
6054
6055 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6056 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6057 assert(LHS->getOpcode() == Instruction::ZExt);
6058 assert(RHS->getOpcode() == Instruction::ZExt);
6059 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6060
6061 // Calculate type and width of the result produced by mul.with.overflow.
6062 Type *TyA = A->getType(), *TyB = B->getType();
6063 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6064 WidthB = TyB->getPrimitiveSizeInBits();
6065 unsigned MulWidth;
6066 Type *MulType;
6067 if (WidthB > WidthA) {
6068 MulWidth = WidthB;
6069 MulType = TyB;
6070 } else {
6071 MulWidth = WidthA;
6072 MulType = TyA;
6073 }
6074
6075 // In order to replace the original mul with a narrower mul.with.overflow,
6076 // all uses must ignore upper bits of the product. The number of used low
6077 // bits must be not greater than the width of mul.with.overflow.
6078 if (MulVal->hasNUsesOrMore(2))
6079 for (User *U : MulVal->users()) {
6080 if (U == &I)
6081 continue;
6082 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6083 // Check if truncation ignores bits above MulWidth.
6084 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6085 if (TruncWidth > MulWidth)
6086 return nullptr;
6087 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6088 // Check if AND ignores bits above MulWidth.
6089 if (BO->getOpcode() != Instruction::And)
6090 return nullptr;
6091 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6092 const APInt &CVal = CI->getValue();
6093 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6094 return nullptr;
6095 } else {
6096 // In this case we could have the operand of the binary operation
6097 // being defined in another block, and performing the replacement
6098 // could break the dominance relation.
6099 return nullptr;
6100 }
6101 } else {
6102 // Other uses prohibit this transformation.
6103 return nullptr;
6104 }
6105 }
6106
6107 // Recognize patterns
6108 switch (I.getPredicate()) {
6109 case ICmpInst::ICMP_UGT: {
6110 // Recognize pattern:
6111 // mulval = mul(zext A, zext B)
6112 // cmp ugt mulval, max
6113 APInt MaxVal = APInt::getMaxValue(MulWidth);
6114 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6115 if (MaxVal.eq(*OtherVal))
6116 break; // Recognized
6117 return nullptr;
6118 }
6119
6120 case ICmpInst::ICMP_ULT: {
6121 // Recognize pattern:
6122 // mulval = mul(zext A, zext B)
6123 // cmp ule mulval, max + 1
6124 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6125 if (MaxVal.eq(*OtherVal))
6126 break; // Recognized
6127 return nullptr;
6128 }
6129
6130 default:
6131 return nullptr;
6132 }
6133
6134 InstCombiner::BuilderTy &Builder = IC.Builder;
6135 Builder.SetInsertPoint(MulInstr);
6136
6137 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6138 Value *MulA = A, *MulB = B;
6139 if (WidthA < MulWidth)
6140 MulA = Builder.CreateZExt(A, MulType);
6141 if (WidthB < MulWidth)
6142 MulB = Builder.CreateZExt(B, MulType);
6144 I.getModule(), Intrinsic::umul_with_overflow, MulType);
6145 CallInst *Call = Builder.CreateCall(F, {MulA, MulB}, "umul");
6146 IC.addToWorklist(MulInstr);
6147
6148 // If there are uses of mul result other than the comparison, we know that
6149 // they are truncation or binary AND. Change them to use result of
6150 // mul.with.overflow and adjust properly mask/size.
6151 if (MulVal->hasNUsesOrMore(2)) {
6152 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6153 for (User *U : make_early_inc_range(MulVal->users())) {
6154 if (U == &I)
6155 continue;
6156 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6157 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6158 IC.replaceInstUsesWith(*TI, Mul);
6159 else
6160 TI->setOperand(0, Mul);
6161 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6162 assert(BO->getOpcode() == Instruction::And);
6163 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6164 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6165 APInt ShortMask = CI->getValue().trunc(MulWidth);
6166 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6167 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6168 IC.replaceInstUsesWith(*BO, Zext);
6169 } else {
6170 llvm_unreachable("Unexpected Binary operation");
6171 }
6172 IC.addToWorklist(cast<Instruction>(U));
6173 }
6174 }
6175
6176 // The original icmp gets replaced with the overflow value, maybe inverted
6177 // depending on predicate.
6178 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6179 Value *Res = Builder.CreateExtractValue(Call, 1);
6180 return BinaryOperator::CreateNot(Res);
6181 }
6182
6183 return ExtractValueInst::Create(Call, 1);
6184}
6185
6186/// When performing a comparison against a constant, it is possible that not all
6187/// the bits in the LHS are demanded. This helper method computes the mask that
6188/// IS demanded.
6190 const APInt *RHS;
6191 if (!match(I.getOperand(1), m_APInt(RHS)))
6193
6194 // If this is a normal comparison, it demands all bits. If it is a sign bit
6195 // comparison, it only demands the sign bit.
6196 bool UnusedBit;
6197 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6199
6200 switch (I.getPredicate()) {
6201 // For a UGT comparison, we don't care about any bits that
6202 // correspond to the trailing ones of the comparand. The value of these
6203 // bits doesn't impact the outcome of the comparison, because any value
6204 // greater than the RHS must differ in a bit higher than these due to carry.
6205 case ICmpInst::ICMP_UGT:
6206 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6207
6208 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6209 // Any value less than the RHS must differ in a higher bit because of carries.
6210 case ICmpInst::ICMP_ULT:
6211 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6212
6213 default:
6215 }
6216}
6217
6218/// Check that one use is in the same block as the definition and all
6219/// other uses are in blocks dominated by a given block.
6220///
6221/// \param DI Definition
6222/// \param UI Use
6223/// \param DB Block that must dominate all uses of \p DI outside
6224/// the parent block
6225/// \return true when \p UI is the only use of \p DI in the parent block
6226/// and all other uses of \p DI are in blocks dominated by \p DB.
6227///
6229 const Instruction *UI,
6230 const BasicBlock *DB) const {
6231 assert(DI && UI && "Instruction not defined\n");
6232 // Ignore incomplete definitions.
6233 if (!DI->getParent())
6234 return false;
6235 // DI and UI must be in the same block.
6236 if (DI->getParent() != UI->getParent())
6237 return false;
6238 // Protect from self-referencing blocks.
6239 if (DI->getParent() == DB)
6240 return false;
6241 for (const User *U : DI->users()) {
6242 auto *Usr = cast<Instruction>(U);
6243 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6244 return false;
6245 }
6246 return true;
6247}
6248
6249/// Return true when the instruction sequence within a block is select-cmp-br.
6250static bool isChainSelectCmpBranch(const SelectInst *SI) {
6251 const BasicBlock *BB = SI->getParent();
6252 if (!BB)
6253 return false;
6254 auto *BI = dyn_cast_or_null<BranchInst>(BB->getTerminator());
6255 if (!BI || BI->getNumSuccessors() != 2)
6256 return false;
6257 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6258 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6259 return false;
6260 return true;
6261}
6262
6263/// True when a select result is replaced by one of its operands
6264/// in select-icmp sequence. This will eventually result in the elimination
6265/// of the select.
6266///
6267/// \param SI Select instruction
6268/// \param Icmp Compare instruction
6269/// \param SIOpd Operand that replaces the select
6270///
6271/// Notes:
6272/// - The replacement is global and requires dominator information
6273/// - The caller is responsible for the actual replacement
6274///
6275/// Example:
6276///
6277/// entry:
6278/// %4 = select i1 %3, %C* %0, %C* null
6279/// %5 = icmp eq %C* %4, null
6280/// br i1 %5, label %9, label %7
6281/// ...
6282/// ; <label>:7 ; preds = %entry
6283/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6284/// ...
6285///
6286/// can be transformed to
6287///
6288/// %5 = icmp eq %C* %0, null
6289/// %6 = select i1 %3, i1 %5, i1 true
6290/// br i1 %6, label %9, label %7
6291/// ...
6292/// ; <label>:7 ; preds = %entry
6293/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6294///
6295/// Similar when the first operand of the select is a constant or/and
6296/// the compare is for not equal rather than equal.
6297///
6298/// NOTE: The function is only called when the select and compare constants
6299/// are equal, the optimization can work only for EQ predicates. This is not a
6300/// major restriction since a NE compare should be 'normalized' to an equal
6301/// compare, which usually happens in the combiner and test case
6302/// select-cmp-br.ll checks for it.
6304 const ICmpInst *Icmp,
6305 const unsigned SIOpd) {
6306 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6308 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6309 // The check for the single predecessor is not the best that can be
6310 // done. But it protects efficiently against cases like when SI's
6311 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6312 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6313 // replaced can be reached on either path. So the uniqueness check
6314 // guarantees that the path all uses of SI (outside SI's parent) are on
6315 // is disjoint from all other paths out of SI. But that information
6316 // is more expensive to compute, and the trade-off here is in favor
6317 // of compile-time. It should also be noticed that we check for a single
6318 // predecessor and not only uniqueness. This to handle the situation when
6319 // Succ and Succ1 points to the same basic block.
6320 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6321 NumSel++;
6322 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6323 return true;
6324 }
6325 }
6326 return false;
6327}
6328
6329/// Try to fold the comparison based on range information we can get by checking
6330/// whether bits are known to be zero or one in the inputs.
6332 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6333 Type *Ty = Op0->getType();
6334 ICmpInst::Predicate Pred = I.getPredicate();
6335
6336 // Get scalar or pointer size.
6337 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6338 ? Ty->getScalarSizeInBits()
6340
6341 if (!BitWidth)
6342 return nullptr;
6343
6344 KnownBits Op0Known(BitWidth);
6345 KnownBits Op1Known(BitWidth);
6346
6347 {
6348 // Don't use dominating conditions when folding icmp using known bits. This
6349 // may convert signed into unsigned predicates in ways that other passes
6350 // (especially IndVarSimplify) may not be able to reliably undo.
6351 SQ.DC = nullptr;
6352 auto _ = make_scope_exit([&]() { SQ.DC = &DC; });
6354 Op0Known, 0))
6355 return &I;
6356
6357 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, 0))
6358 return &I;
6359 }
6360
6361 // Given the known and unknown bits, compute a range that the LHS could be
6362 // in. Compute the Min, Max and RHS values based on the known bits. For the
6363 // EQ and NE we use unsigned values.
6364 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6365 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6366 if (I.isSigned()) {
6367 Op0Min = Op0Known.getSignedMinValue();
6368 Op0Max = Op0Known.getSignedMaxValue();
6369 Op1Min = Op1Known.getSignedMinValue();
6370 Op1Max = Op1Known.getSignedMaxValue();
6371 } else {
6372 Op0Min = Op0Known.getMinValue();
6373 Op0Max = Op0Known.getMaxValue();
6374 Op1Min = Op1Known.getMinValue();
6375 Op1Max = Op1Known.getMaxValue();
6376 }
6377
6378 // If Min and Max are known to be the same, then SimplifyDemandedBits figured
6379 // out that the LHS or RHS is a constant. Constant fold this now, so that
6380 // code below can assume that Min != Max.
6381 if (!isa<Constant>(Op0) && Op0Min == Op0Max)
6382 return new ICmpInst(Pred, ConstantExpr::getIntegerValue(Ty, Op0Min), Op1);
6383 if (!isa<Constant>(Op1) && Op1Min == Op1Max)
6384 return new ICmpInst(Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Min));
6385
6386 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6387 // min/max canonical compare with some other compare. That could lead to
6388 // conflict with select canonicalization and infinite looping.
6389 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6390 auto isMinMaxCmp = [&](Instruction &Cmp) {
6391 if (!Cmp.hasOneUse())
6392 return false;
6393 Value *A, *B;
6394 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6396 return false;
6397 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6398 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6399 };
6400 if (!isMinMaxCmp(I)) {
6401 switch (Pred) {
6402 default:
6403 break;
6404 case ICmpInst::ICMP_ULT: {
6405 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6406 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6407 const APInt *CmpC;
6408 if (match(Op1, m_APInt(CmpC))) {
6409 // A <u C -> A == C-1 if min(A)+1 == C
6410 if (*CmpC == Op0Min + 1)
6411 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6412 ConstantInt::get(Op1->getType(), *CmpC - 1));
6413 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6414 // exceeds the log2 of C.
6415 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6416 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6417 Constant::getNullValue(Op1->getType()));
6418 }
6419 break;
6420 }
6421 case ICmpInst::ICMP_UGT: {
6422 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6423 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6424 const APInt *CmpC;
6425 if (match(Op1, m_APInt(CmpC))) {
6426 // A >u C -> A == C+1 if max(a)-1 == C
6427 if (*CmpC == Op0Max - 1)
6428 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6429 ConstantInt::get(Op1->getType(), *CmpC + 1));
6430 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6431 // exceeds the log2 of C.
6432 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6433 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6434 Constant::getNullValue(Op1->getType()));
6435 }
6436 break;
6437 }
6438 case ICmpInst::ICMP_SLT: {
6439 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6440 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6441 const APInt *CmpC;
6442 if (match(Op1, m_APInt(CmpC))) {
6443 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6444 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6445 ConstantInt::get(Op1->getType(), *CmpC - 1));
6446 }
6447 break;
6448 }
6449 case ICmpInst::ICMP_SGT: {
6450 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6451 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6452 const APInt *CmpC;
6453 if (match(Op1, m_APInt(CmpC))) {
6454 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6455 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6456 ConstantInt::get(Op1->getType(), *CmpC + 1));
6457 }
6458 break;
6459 }
6460 }
6461 }
6462
6463 // Based on the range information we know about the LHS, see if we can
6464 // simplify this comparison. For example, (x&4) < 8 is always true.
6465 switch (Pred) {
6466 default:
6467 llvm_unreachable("Unknown icmp opcode!");
6468 case ICmpInst::ICMP_EQ:
6469 case ICmpInst::ICMP_NE: {
6470 if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
6471 return replaceInstUsesWith(
6472 I, ConstantInt::getBool(I.getType(), Pred == CmpInst::ICMP_NE));
6473
6474 // If all bits are known zero except for one, then we know at most one bit
6475 // is set. If the comparison is against zero, then this is a check to see if
6476 // *that* bit is set.
6477 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6478 if (Op1Known.isZero()) {
6479 // If the LHS is an AND with the same constant, look through it.
6480 Value *LHS = nullptr;
6481 const APInt *LHSC;
6482 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6483 *LHSC != Op0KnownZeroInverted)
6484 LHS = Op0;
6485
6486 Value *X;
6487 const APInt *C1;
6488 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6489 Type *XTy = X->getType();
6490 unsigned Log2C1 = C1->countr_zero();
6491 APInt C2 = Op0KnownZeroInverted;
6492 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6493 if (C2Pow2.isPowerOf2()) {
6494 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6495 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6496 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6497 unsigned Log2C2 = C2Pow2.countr_zero();
6498 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6499 auto NewPred =
6501 return new ICmpInst(NewPred, X, CmpC);
6502 }
6503 }
6504 }
6505
6506 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6507 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
6508 (Op0Known & Op1Known) == Op0Known)
6509 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6510 ConstantInt::getNullValue(Op1->getType()));
6511 break;
6512 }
6513 case ICmpInst::ICMP_ULT: {
6514 if (Op0Max.ult(Op1Min)) // A <u B -> true if max(A) < min(B)
6515 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6516 if (Op0Min.uge(Op1Max)) // A <u B -> false if min(A) >= max(B)
6517 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6518 break;
6519 }
6520 case ICmpInst::ICMP_UGT: {
6521 if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B)
6522 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6523 if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B)
6524 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6525 break;
6526 }
6527 case ICmpInst::ICMP_SLT: {
6528 if (Op0Max.slt(Op1Min)) // A <s B -> true if max(A) < min(C)
6529 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6530 if (Op0Min.sge(Op1Max)) // A <s B -> false if min(A) >= max(C)
6531 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6532 break;
6533 }
6534 case ICmpInst::ICMP_SGT: {
6535 if (Op0Min.sgt(Op1Max)) // A >s B -> true if min(A) > max(B)
6536 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6537 if (Op0Max.sle(Op1Min)) // A >s B -> false if max(A) <= min(B)
6538 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6539 break;
6540 }
6541 case ICmpInst::ICMP_SGE:
6542 assert(!isa<ConstantInt>(Op1) && "ICMP_SGE with ConstantInt not folded!");
6543 if (Op0Min.sge(Op1Max)) // A >=s B -> true if min(A) >= max(B)
6544 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6545 if (Op0Max.slt(Op1Min)) // A >=s B -> false if max(A) < min(B)
6546 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6547 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
6548 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6549 break;
6550 case ICmpInst::ICMP_SLE:
6551 assert(!isa<ConstantInt>(Op1) && "ICMP_SLE with ConstantInt not folded!");
6552 if (Op0Max.sle(Op1Min)) // A <=s B -> true if max(A) <= min(B)
6553 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6554 if (Op0Min.sgt(Op1Max)) // A <=s B -> false if min(A) > max(B)
6555 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6556 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
6557 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6558 break;
6559 case ICmpInst::ICMP_UGE:
6560 assert(!isa<ConstantInt>(Op1) && "ICMP_UGE with ConstantInt not folded!");
6561 if (Op0Min.uge(Op1Max)) // A >=u B -> true if min(A) >= max(B)
6562 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6563 if (Op0Max.ult(Op1Min)) // A >=u B -> false if max(A) < min(B)
6564 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6565 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
6566 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6567 break;
6568 case ICmpInst::ICMP_ULE:
6569 assert(!isa<ConstantInt>(Op1) && "ICMP_ULE with ConstantInt not folded!");
6570 if (Op0Max.ule(Op1Min)) // A <=u B -> true if max(A) <= min(B)
6571 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6572 if (Op0Min.ugt(Op1Max)) // A <=u B -> false if min(A) > max(B)
6573 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6574 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
6575 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6576 break;
6577 }
6578
6579 // Turn a signed comparison into an unsigned one if both operands are known to
6580 // have the same sign.
6581 if (I.isSigned() &&
6582 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6583 (Op0Known.One.isNegative() && Op1Known.One.isNegative())))
6584 return new ICmpInst(I.getUnsignedPredicate(), Op0, Op1);
6585
6586 return nullptr;
6587}
6588
6589/// If one operand of an icmp is effectively a bool (value range of {0,1}),
6590/// then try to reduce patterns based on that limit.
6592 Value *X, *Y;
6594
6595 // X must be 0 and bool must be true for "ULT":
6596 // X <u (zext i1 Y) --> (X == 0) & Y
6597 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
6598 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
6599 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
6600
6601 // X must be 0 or bool must be true for "ULE":
6602 // X <=u (sext i1 Y) --> (X == 0) | Y
6603 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
6604 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
6605 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
6606
6607 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
6608 ICmpInst::Predicate Pred1, Pred2;
6609 const APInt *C;
6610 Instruction *ExtI;
6611 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
6614 m_APInt(C)))))) &&
6615 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
6616 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
6617 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
6618 auto CreateRangeCheck = [&] {
6619 Value *CmpV1 =
6620 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
6621 Value *CmpV2 = Builder.CreateICmp(
6622 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
6624 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
6625 CmpV1, CmpV2);
6626 };
6627 if (C->isZero()) {
6628 if (Pred2 == ICmpInst::ICMP_EQ) {
6629 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
6630 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
6631 return replaceInstUsesWith(
6632 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6633 } else if (!IsSExt || HasOneUse) {
6634 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
6635 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
6636 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
6637 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X == -1
6638 return CreateRangeCheck();
6639 }
6640 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
6641 if (Pred2 == ICmpInst::ICMP_NE) {
6642 // icmp eq X, (zext (icmp ne X, 1)) --> false
6643 // icmp ne X, (zext (icmp ne X, 1)) --> true
6644 // icmp eq X, (sext (icmp ne X, -1)) --> false
6645 // icmp ne X, (sext (icmp ne X, -1)) --> true
6646 return replaceInstUsesWith(
6647 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6648 } else if (!IsSExt || HasOneUse) {
6649 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
6650 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
6651 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
6652 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
6653 return CreateRangeCheck();
6654 }
6655 } else {
6656 // when C != 0 && C != 1:
6657 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
6658 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
6659 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
6660 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
6661 // when C != 0 && C != -1:
6662 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
6663 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
6664 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
6665 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
6666 return ICmpInst::Create(
6667 Instruction::ICmp, Pred1, X,
6668 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
6669 ? (IsSExt ? -1 : 1)
6670 : 0));
6671 }
6672 }
6673
6674 return nullptr;
6675}
6676
6677std::optional<std::pair<CmpInst::Predicate, Constant *>>
6679 Constant *C) {
6681 "Only for relational integer predicates.");
6682
6683 Type *Type = C->getType();
6684 bool IsSigned = ICmpInst::isSigned(Pred);
6685
6687 bool WillIncrement =
6688 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
6689
6690 // Check if the constant operand can be safely incremented/decremented
6691 // without overflowing/underflowing.
6692 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
6693 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
6694 };
6695
6696 Constant *SafeReplacementConstant = nullptr;
6697 if (auto *CI = dyn_cast<ConstantInt>(C)) {
6698 // Bail out if the constant can't be safely incremented/decremented.
6699 if (!ConstantIsOk(CI))
6700 return std::nullopt;
6701 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
6702 unsigned NumElts = FVTy->getNumElements();
6703 for (unsigned i = 0; i != NumElts; ++i) {
6704 Constant *Elt = C->getAggregateElement(i);
6705 if (!Elt)
6706 return std::nullopt;
6707
6708 if (isa<UndefValue>(Elt))
6709 continue;
6710
6711 // Bail out if we can't determine if this constant is min/max or if we
6712 // know that this constant is min/max.
6713 auto *CI = dyn_cast<ConstantInt>(Elt);
6714 if (!CI || !ConstantIsOk(CI))
6715 return std::nullopt;
6716
6717 if (!SafeReplacementConstant)
6718 SafeReplacementConstant = CI;
6719 }
6720 } else if (isa<VectorType>(C->getType())) {
6721 // Handle scalable splat
6722 Value *SplatC = C->getSplatValue();
6723 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
6724 // Bail out if the constant can't be safely incremented/decremented.
6725 if (!CI || !ConstantIsOk(CI))
6726 return std::nullopt;
6727 } else {
6728 // ConstantExpr?
6729 return std::nullopt;
6730 }
6731
6732 // It may not be safe to change a compare predicate in the presence of
6733 // undefined elements, so replace those elements with the first safe constant
6734 // that we found.
6735 // TODO: in case of poison, it is safe; let's replace undefs only.
6736 if (C->containsUndefOrPoisonElement()) {
6737 assert(SafeReplacementConstant && "Replacement constant not set");
6738 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
6739 }
6740
6742
6743 // Increment or decrement the constant.
6744 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
6745 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
6746
6747 return std::make_pair(NewPred, NewC);
6748}
6749
6750/// If we have an icmp le or icmp ge instruction with a constant operand, turn
6751/// it into the appropriate icmp lt or icmp gt instruction. This transform
6752/// allows them to be folded in visitICmpInst.
6754 ICmpInst::Predicate Pred = I.getPredicate();
6755 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
6757 return nullptr;
6758
6759 Value *Op0 = I.getOperand(0);
6760 Value *Op1 = I.getOperand(1);
6761 auto *Op1C = dyn_cast<Constant>(Op1);
6762 if (!Op1C)
6763 return nullptr;
6764
6765 auto FlippedStrictness =
6767 if (!FlippedStrictness)
6768 return nullptr;
6769
6770 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
6771}
6772
6773/// If we have a comparison with a non-canonical predicate, if we can update
6774/// all the users, invert the predicate and adjust all the users.
6776 // Is the predicate already canonical?
6777 CmpInst::Predicate Pred = I.getPredicate();
6779 return nullptr;
6780
6781 // Can all users be adjusted to predicate inversion?
6782 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
6783 return nullptr;
6784
6785 // Ok, we can canonicalize comparison!
6786 // Let's first invert the comparison's predicate.
6787 I.setPredicate(CmpInst::getInversePredicate(Pred));
6788 I.setName(I.getName() + ".not");
6789
6790 // And, adapt users.
6792
6793 return &I;
6794}
6795
6796/// Integer compare with boolean values can always be turned into bitwise ops.
6798 InstCombiner::BuilderTy &Builder) {
6799 Value *A = I.getOperand(0), *B = I.getOperand(1);
6800 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
6801
6802 // A boolean compared to true/false can be simplified to Op0/true/false in
6803 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
6804 // Cases not handled by InstSimplify are always 'not' of Op0.
6805 if (match(B, m_Zero())) {
6806 switch (I.getPredicate()) {
6807 case CmpInst::ICMP_EQ: // A == 0 -> !A
6808 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
6809 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
6811 default:
6812 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6813 }
6814 } else if (match(B, m_One())) {
6815 switch (I.getPredicate()) {
6816 case CmpInst::ICMP_NE: // A != 1 -> !A
6817 case CmpInst::ICMP_ULT: // A <u 1 -> !A
6818 case CmpInst::ICMP_SGT: // A >s -1 -> !A
6820 default:
6821 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6822 }
6823 }
6824
6825 switch (I.getPredicate()) {
6826 default:
6827 llvm_unreachable("Invalid icmp instruction!");
6828 case ICmpInst::ICMP_EQ:
6829 // icmp eq i1 A, B -> ~(A ^ B)
6830 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
6831
6832 case ICmpInst::ICMP_NE:
6833 // icmp ne i1 A, B -> A ^ B
6834 return BinaryOperator::CreateXor(A, B);
6835
6836 case ICmpInst::ICMP_UGT:
6837 // icmp ugt -> icmp ult
6838 std::swap(A, B);
6839 [[fallthrough]];
6840 case ICmpInst::ICMP_ULT:
6841 // icmp ult i1 A, B -> ~A & B
6842 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
6843
6844 case ICmpInst::ICMP_SGT:
6845 // icmp sgt -> icmp slt
6846 std::swap(A, B);
6847 [[fallthrough]];
6848 case ICmpInst::ICMP_SLT:
6849 // icmp slt i1 A, B -> A & ~B
6850 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
6851
6852 case ICmpInst::ICMP_UGE:
6853 // icmp uge -> icmp ule
6854 std::swap(A, B);
6855 [[fallthrough]];
6856 case ICmpInst::ICMP_ULE:
6857 // icmp ule i1 A, B -> ~A | B
6858 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
6859
6860 case ICmpInst::ICMP_SGE:
6861 // icmp sge -> icmp sle
6862 std::swap(A, B);
6863 [[fallthrough]];
6864 case ICmpInst::ICMP_SLE:
6865 // icmp sle i1 A, B -> A | ~B
6866 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
6867 }
6868}
6869
6870// Transform pattern like:
6871// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
6872// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
6873// Into:
6874// (X l>> Y) != 0
6875// (X l>> Y) == 0
6877 InstCombiner::BuilderTy &Builder) {
6878 ICmpInst::Predicate Pred, NewPred;
6879 Value *X, *Y;
6880 if (match(&Cmp,
6881 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
6882 switch (Pred) {
6883 case ICmpInst::ICMP_ULE:
6884 NewPred = ICmpInst::ICMP_NE;
6885 break;
6886 case ICmpInst::ICMP_UGT:
6887 NewPred = ICmpInst::ICMP_EQ;
6888 break;
6889 default:
6890 return nullptr;
6891 }
6892 } else if (match(&Cmp, m_c_ICmp(Pred,
6895 m_Add(m_Shl(m_One(), m_Value(Y)),
6896 m_AllOnes()))),
6897 m_Value(X)))) {
6898 // The variant with 'add' is not canonical, (the variant with 'not' is)
6899 // we only get it because it has extra uses, and can't be canonicalized,
6900
6901 switch (Pred) {
6902 case ICmpInst::ICMP_ULT:
6903 NewPred = ICmpInst::ICMP_NE;
6904 break;
6905 case ICmpInst::ICMP_UGE:
6906 NewPred = ICmpInst::ICMP_EQ;
6907 break;
6908 default:
6909 return nullptr;
6910 }
6911 } else
6912 return nullptr;
6913
6914 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
6915 Constant *Zero = Constant::getNullValue(NewX->getType());
6916 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
6917}
6918
6920 InstCombiner::BuilderTy &Builder) {
6921 const CmpInst::Predicate Pred = Cmp.getPredicate();
6922 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
6923 Value *V1, *V2;
6924
6925 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
6926 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
6927 if (auto *I = dyn_cast<Instruction>(V))
6928 I->copyIRFlags(&Cmp);
6929 Module *M = Cmp.getModule();
6931 M, Intrinsic::experimental_vector_reverse, V->getType());
6932 return CallInst::Create(F, V);
6933 };
6934
6935 if (match(LHS, m_VecReverse(m_Value(V1)))) {
6936 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
6937 if (match(RHS, m_VecReverse(m_Value(V2))) &&
6938 (LHS->hasOneUse() || RHS->hasOneUse()))
6939 return createCmpReverse(Pred, V1, V2);
6940
6941 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
6942 if (LHS->hasOneUse() && isSplatValue(RHS))
6943 return createCmpReverse(Pred, V1, RHS);
6944 }
6945 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
6946 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
6947 return createCmpReverse(Pred, LHS, V2);
6948
6949 ArrayRef<int> M;
6950 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
6951 return nullptr;
6952
6953 // If both arguments of the cmp are shuffles that use the same mask and
6954 // shuffle within a single vector, move the shuffle after the cmp:
6955 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
6956 Type *V1Ty = V1->getType();
6957 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
6958 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
6959 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
6960 return new ShuffleVectorInst(NewCmp, M);
6961 }
6962
6963 // Try to canonicalize compare with splatted operand and splat constant.
6964 // TODO: We could generalize this for more than splats. See/use the code in
6965 // InstCombiner::foldVectorBinop().
6966 Constant *C;
6967 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
6968 return nullptr;
6969
6970 // Length-changing splats are ok, so adjust the constants as needed:
6971 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
6972 Constant *ScalarC = C->getSplatValue(/* AllowUndefs */ true);
6973 int MaskSplatIndex;
6974 if (ScalarC && match(M, m_SplatOrUndefMask(MaskSplatIndex))) {
6975 // We allow undefs in matching, but this transform removes those for safety.
6976 // Demanded elements analysis should be able to recover some/all of that.
6977 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
6978 ScalarC);
6979 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
6980 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
6981 return new ShuffleVectorInst(NewCmp, NewM);
6982 }
6983
6984 return nullptr;
6985}
6986
6987// extract(uadd.with.overflow(A, B), 0) ult A
6988// -> extract(uadd.with.overflow(A, B), 1)
6990 CmpInst::Predicate Pred = I.getPredicate();
6991 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6992
6993 Value *UAddOv;
6994 Value *A, *B;
6995 auto UAddOvResultPat = m_ExtractValue<0>(
6996 m_Intrinsic<Intrinsic::uadd_with_overflow>(m_Value(A), m_Value(B)));
6997 if (match(Op0, UAddOvResultPat) &&
6998 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
6999 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7000 (match(A, m_One()) || match(B, m_One()))) ||
7001 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7002 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7003 // extract(uadd.with.overflow(A, B), 0) < A
7004 // extract(uadd.with.overflow(A, 1), 0) == 0
7005 // extract(uadd.with.overflow(A, -1), 0) != -1
7006 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7007 else if (match(Op1, UAddOvResultPat) &&
7008 Pred == ICmpInst::ICMP_UGT && (Op0 == A || Op0 == B))
7009 // A > extract(uadd.with.overflow(A, B), 0)
7010 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7011 else
7012 return nullptr;
7013
7014 return ExtractValueInst::Create(UAddOv, 1);
7015}
7016
7018 if (!I.getOperand(0)->getType()->isPointerTy() ||
7020 I.getParent()->getParent(),
7021 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7022 return nullptr;
7023 }
7024 Instruction *Op;
7025 if (match(I.getOperand(0), m_Instruction(Op)) &&
7026 match(I.getOperand(1), m_Zero()) &&
7027 Op->isLaunderOrStripInvariantGroup()) {
7028 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7029 Op->getOperand(0), I.getOperand(1));
7030 }
7031 return nullptr;
7032}
7033
7034/// This function folds patterns produced by lowering of reduce idioms, such as
7035/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7036/// attempts to generate fewer number of scalar comparisons instead of vector
7037/// comparisons when possible.
7039 InstCombiner::BuilderTy &Builder,
7040 const DataLayout &DL) {
7041 if (I.getType()->isVectorTy())
7042 return nullptr;
7043 ICmpInst::Predicate OuterPred, InnerPred;
7044 Value *LHS, *RHS;
7045
7046 // Match lowering of @llvm.vector.reduce.and. Turn
7047 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7048 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7049 /// %res = icmp <pred> i8 %scalar_ne, 0
7050 ///
7051 /// into
7052 ///
7053 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7054 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7055 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7056 ///
7057 /// for <pred> in {ne, eq}.
7058 if (!match(&I, m_ICmp(OuterPred,
7060 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7061 m_Zero())))
7062 return nullptr;
7063 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7064 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7065 return nullptr;
7066 unsigned NumBits =
7067 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7068 // TODO: Relax this to "not wider than max legal integer type"?
7069 if (!DL.isLegalInteger(NumBits))
7070 return nullptr;
7071
7072 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7073 auto *ScalarTy = Builder.getIntNTy(NumBits);
7074 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7075 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7076 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7077 I.getName());
7078 }
7079
7080 return nullptr;
7081}
7082
7083// This helper will be called with icmp operands in both orders.
7085 Value *Op0, Value *Op1,
7086 ICmpInst &CxtI) {
7087 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7088 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7089 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7090 return NI;
7091
7092 if (auto *SI = dyn_cast<SelectInst>(Op0))
7093 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7094 return NI;
7095
7096 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7097 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7098 return Res;
7099
7100 {
7101 Value *X;
7102 const APInt *C;
7103 // icmp X+Cst, X
7104 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7105 return foldICmpAddOpConst(X, *C, Pred);
7106 }
7107
7108 // abs(X) >= X --> true
7109 // abs(X) u<= X --> true
7110 // abs(X) < X --> false
7111 // abs(X) u> X --> false
7112 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7113 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7114 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7115 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7116 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7117 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7118 {
7119 Value *X;
7120 Constant *C;
7121 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X), m_Constant(C))) &&
7122 match(Op1, m_Specific(X))) {
7123 Value *NullValue = Constant::getNullValue(X->getType());
7124 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7125 const APInt SMin =
7126 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7127 bool IsIntMinPosion = C->isAllOnesValue();
7128 switch (Pred) {
7129 case CmpInst::ICMP_ULE:
7130 case CmpInst::ICMP_SGE:
7131 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7132 case CmpInst::ICMP_UGT:
7133 case CmpInst::ICMP_SLT:
7135 case CmpInst::ICMP_UGE:
7136 case CmpInst::ICMP_SLE:
7137 case CmpInst::ICMP_EQ: {
7138 return replaceInstUsesWith(
7139 CxtI, IsIntMinPosion
7140 ? Builder.CreateICmpSGT(X, AllOnesValue)
7142 X, ConstantInt::get(X->getType(), SMin + 1)));
7143 }
7144 case CmpInst::ICMP_ULT:
7145 case CmpInst::ICMP_SGT:
7146 case CmpInst::ICMP_NE: {
7147 return replaceInstUsesWith(
7148 CxtI, IsIntMinPosion
7149 ? Builder.CreateICmpSLT(X, NullValue)
7151 X, ConstantInt::get(X->getType(), SMin)));
7152 }
7153 default:
7154 llvm_unreachable("Invalid predicate!");
7155 }
7156 }
7157 }
7158
7159 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7160 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7161 return replaceInstUsesWith(CxtI, V);
7162
7163 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7164 {
7165 const APInt *Divisor;
7166 if (match(Op0, m_UDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7167 Divisor->ugt(1)) {
7168 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7170 }
7171
7172 if (!ICmpInst::isUnsigned(Pred) &&
7173 match(Op0, m_SDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7174 Divisor->ugt(1)) {
7175 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7177 }
7178 }
7179
7180 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7181 {
7182 const APInt *Shift;
7183 if (match(Op0, m_LShr(m_Specific(Op1), m_APInt(Shift))) &&
7184 !Shift->isZero()) {
7185 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7187 }
7188
7189 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7190 match(Op0, m_AShr(m_Specific(Op1), m_APInt(Shift))) &&
7191 !Shift->isZero()) {
7192 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7194 }
7195 }
7196
7197 return nullptr;
7198}
7199
7201 bool Changed = false;
7203 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7204 unsigned Op0Cplxity = getComplexity(Op0);
7205 unsigned Op1Cplxity = getComplexity(Op1);
7206
7207 /// Orders the operands of the compare so that they are listed from most
7208 /// complex to least complex. This puts constants before unary operators,
7209 /// before binary operators.
7210 if (Op0Cplxity < Op1Cplxity) {
7211 I.swapOperands();
7212 std::swap(Op0, Op1);
7213 Changed = true;
7214 }
7215
7216 if (Value *V = simplifyICmpInst(I.getPredicate(), Op0, Op1, Q))
7217 return replaceInstUsesWith(I, V);
7218
7219 // Comparing -val or val with non-zero is the same as just comparing val
7220 // ie, abs(val) != 0 -> val != 0
7221 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7222 Value *Cond, *SelectTrue, *SelectFalse;
7223 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7224 m_Value(SelectFalse)))) {
7225 if (Value *V = dyn_castNegVal(SelectTrue)) {
7226 if (V == SelectFalse)
7227 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7228 }
7229 else if (Value *V = dyn_castNegVal(SelectFalse)) {
7230 if (V == SelectTrue)
7231 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7232 }
7233 }
7234 }
7235
7236 if (Op0->getType()->isIntOrIntVectorTy(1))
7238 return Res;
7239
7241 return Res;
7242
7244 return Res;
7245
7247 return Res;
7248
7250 return Res;
7251
7253 return Res;
7254
7256 return Res;
7257
7259 return Res;
7260
7261 // Test if the ICmpInst instruction is used exclusively by a select as
7262 // part of a minimum or maximum operation. If so, refrain from doing
7263 // any other folding. This helps out other analyses which understand
7264 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7265 // and CodeGen. And in this case, at least one of the comparison
7266 // operands has at least one user besides the compare (the select),
7267 // which would often largely negate the benefit of folding anyway.
7268 //
7269 // Do the same for the other patterns recognized by matchSelectPattern.
7270 if (I.hasOneUse())
7271 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7272 Value *A, *B;
7274 if (SPR.Flavor != SPF_UNKNOWN)
7275 return nullptr;
7276 }
7277
7278 // Do this after checking for min/max to prevent infinite looping.
7279 if (Instruction *Res = foldICmpWithZero(I))
7280 return Res;
7281
7282 // FIXME: We only do this after checking for min/max to prevent infinite
7283 // looping caused by a reverse canonicalization of these patterns for min/max.
7284 // FIXME: The organization of folds is a mess. These would naturally go into
7285 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7286 // down here after the min/max restriction.
7287 ICmpInst::Predicate Pred = I.getPredicate();
7288 const APInt *C;
7289 if (match(Op1, m_APInt(C))) {
7290 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7291 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7292 Constant *Zero = Constant::getNullValue(Op0->getType());
7293 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7294 }
7295
7296 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7297 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7299 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7300 }
7301 }
7302
7303 // The folds in here may rely on wrapping flags and special constants, so
7304 // they can break up min/max idioms in some cases but not seemingly similar
7305 // patterns.
7306 // FIXME: It may be possible to enhance select folding to make this
7307 // unnecessary. It may also be moot if we canonicalize to min/max
7308 // intrinsics.
7309 if (Instruction *Res = foldICmpBinOp(I, Q))
7310 return Res;
7311
7313 return Res;
7314
7315 // Try to match comparison as a sign bit test. Intentionally do this after
7316 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7317 if (Instruction *New = foldSignBitTest(I))
7318 return New;
7319
7321 return Res;
7322
7323 if (Instruction *Res = foldICmpCommutative(I.getPredicate(), Op0, Op1, I))
7324 return Res;
7325 if (Instruction *Res =
7326 foldICmpCommutative(I.getSwappedPredicate(), Op1, Op0, I))
7327 return Res;
7328
7329 if (I.isCommutative()) {
7330 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7331 replaceOperand(I, 0, Pair->first);
7332 replaceOperand(I, 1, Pair->second);
7333 return &I;
7334 }
7335 }
7336
7337 // In case of a comparison with two select instructions having the same
7338 // condition, check whether one of the resulting branches can be simplified.
7339 // If so, just compare the other branch and select the appropriate result.
7340 // For example:
7341 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7342 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7343 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7344 // The icmp will result false for the false value of selects and the result
7345 // will depend upon the comparison of true values of selects if %cmp is
7346 // true. Thus, transform this into:
7347 // %cmp = icmp slt i32 %y, %z
7348 // %sel = select i1 %cond, i1 %cmp, i1 false
7349 // This handles similar cases to transform.
7350 {
7351 Value *Cond, *A, *B, *C, *D;
7352 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7354 (Op0->hasOneUse() || Op1->hasOneUse())) {
7355 // Check whether comparison of TrueValues can be simplified
7356 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7357 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7358 return SelectInst::Create(Cond, Res, NewICMP);
7359 }
7360 // Check whether comparison of FalseValues can be simplified
7361 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7362 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7363 return SelectInst::Create(Cond, NewICMP, Res);
7364 }
7365 }
7366 }
7367
7368 // Try to optimize equality comparisons against alloca-based pointers.
7369 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7370 assert(Op1->getType()->isPointerTy() && "Comparing pointer with non-pointer?");
7371 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7372 if (foldAllocaCmp(Alloca))
7373 return nullptr;
7374 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7375 if (foldAllocaCmp(Alloca))
7376 return nullptr;
7377 }
7378
7379 if (Instruction *Res = foldICmpBitCast(I))
7380 return Res;
7381
7382 // TODO: Hoist this above the min/max bailout.
7384 return R;
7385
7386 {
7387 Value *X, *Y;
7388 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7389 // and (X & ~Y) != 0 --> (X & Y) == 0
7390 // if A is a power of 2.
7391 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7392 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, 0, &I) &&
7393 I.isEquality())
7394 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7395 Op1);
7396
7397 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7398 if (Op0->getType()->isIntOrIntVectorTy()) {
7399 bool ConsumesOp0, ConsumesOp1;
7400 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7401 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7402 (ConsumesOp0 || ConsumesOp1)) {
7403 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7404 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7405 assert(InvOp0 && InvOp1 &&
7406 "Mismatch between isFreeToInvert and getFreelyInverted");
7407 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7408 }
7409 }
7410
7411 Instruction *AddI = nullptr;
7413 m_Instruction(AddI))) &&
7414 isa<IntegerType>(X->getType())) {
7415 Value *Result;
7416 Constant *Overflow;
7417 // m_UAddWithOverflow can match patterns that do not include an explicit
7418 // "add" instruction, so check the opcode of the matched op.
7419 if (AddI->getOpcode() == Instruction::Add &&
7420 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7421 Result, Overflow)) {
7422 replaceInstUsesWith(*AddI, Result);
7423 eraseInstFromFunction(*AddI);
7424 return replaceInstUsesWith(I, Overflow);
7425 }
7426 }
7427
7428 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7429 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7430 match(Op1, m_APInt(C))) {
7431 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7432 return R;
7433 }
7434
7435 // Signbit test folds
7436 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7437 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7438 Instruction *ExtI;
7439 if ((I.isUnsigned() || I.isEquality()) &&
7440 match(Op1,
7442 Y->getType()->getScalarSizeInBits() == 1 &&
7443 (Op0->hasOneUse() || Op1->hasOneUse())) {
7444 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7445 Instruction *ShiftI;
7446 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7448 OpWidth - 1))))) {
7449 unsigned ExtOpc = ExtI->getOpcode();
7450 unsigned ShiftOpc = ShiftI->getOpcode();
7451 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7452 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7453 Value *SLTZero =
7455 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7456 return replaceInstUsesWith(I, Cmp);
7457 }
7458 }
7459 }
7460 }
7461
7462 if (Instruction *Res = foldICmpEquality(I))
7463 return Res;
7464
7466 return Res;
7467
7468 if (Instruction *Res = foldICmpOfUAddOv(I))
7469 return Res;
7470
7471 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7472 // an i1 which indicates whether or not we successfully did the swap.
7473 //
7474 // Replace comparisons between the old value and the expected value with the
7475 // indicator that 'cmpxchg' returns.
7476 //
7477 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7478 // spuriously fail. In those cases, the old value may equal the expected
7479 // value but it is possible for the swap to not occur.
7480 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7481 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7482 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7483 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7484 !ACXI->isWeak())
7485 return ExtractValueInst::Create(ACXI, 1);
7486
7488 return Res;
7489
7490 if (I.getType()->isVectorTy())
7491 if (Instruction *Res = foldVectorCmp(I, Builder))
7492 return Res;
7493
7495 return Res;
7496
7498 return Res;
7499
7500 return Changed ? &I : nullptr;
7501}
7502
7503/// Fold fcmp ([us]itofp x, cst) if possible.
7505 Instruction *LHSI,
7506 Constant *RHSC) {
7507 const APFloat *RHS;
7508 if (!match(RHSC, m_APFloat(RHS)))
7509 return nullptr;
7510
7511 // Get the width of the mantissa. We don't want to hack on conversions that
7512 // might lose information from the integer, e.g. "i64 -> float"
7513 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7514 if (MantissaWidth == -1) return nullptr; // Unknown.
7515
7516 Type *IntTy = LHSI->getOperand(0)->getType();
7517 unsigned IntWidth = IntTy->getScalarSizeInBits();
7518 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7519
7520 if (I.isEquality()) {
7521 FCmpInst::Predicate P = I.getPredicate();
7522 bool IsExact = false;
7523 APSInt RHSCvt(IntWidth, LHSUnsigned);
7524 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7525
7526 // If the floating point constant isn't an integer value, we know if we will
7527 // ever compare equal / not equal to it.
7528 if (!IsExact) {
7529 // TODO: Can never be -0.0 and other non-representable values
7530 APFloat RHSRoundInt(*RHS);
7532 if (*RHS != RHSRoundInt) {
7534 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7535
7537 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7538 }
7539 }
7540
7541 // TODO: If the constant is exactly representable, is it always OK to do
7542 // equality compares as integer?
7543 }
7544
7545 // Check to see that the input is converted from an integer type that is small
7546 // enough that preserves all bits. TODO: check here for "known" sign bits.
7547 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7548
7549 // Following test does NOT adjust IntWidth downwards for signed inputs,
7550 // because the most negative value still requires all the mantissa bits
7551 // to distinguish it from one less than that value.
7552 if ((int)IntWidth > MantissaWidth) {
7553 // Conversion would lose accuracy. Check if loss can impact comparison.
7554 int Exp = ilogb(*RHS);
7555 if (Exp == APFloat::IEK_Inf) {
7556 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7557 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7558 // Conversion could create infinity.
7559 return nullptr;
7560 } else {
7561 // Note that if RHS is zero or NaN, then Exp is negative
7562 // and first condition is trivially false.
7563 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7564 // Conversion could affect comparison.
7565 return nullptr;
7566 }
7567 }
7568
7569 // Otherwise, we can potentially simplify the comparison. We know that it
7570 // will always come through as an integer value and we know the constant is
7571 // not a NAN (it would have been previously simplified).
7572 assert(!RHS->isNaN() && "NaN comparison not already folded!");
7573
7575 switch (I.getPredicate()) {
7576 default: llvm_unreachable("Unexpected predicate!");
7577 case FCmpInst::FCMP_UEQ:
7578 case FCmpInst::FCMP_OEQ:
7579 Pred = ICmpInst::ICMP_EQ;
7580 break;
7581 case FCmpInst::FCMP_UGT:
7582 case FCmpInst::FCMP_OGT:
7583 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
7584 break;
7585 case FCmpInst::FCMP_UGE:
7586 case FCmpInst::FCMP_OGE:
7587 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
7588 break;
7589 case FCmpInst::FCMP_ULT:
7590 case FCmpInst::FCMP_OLT:
7591 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
7592 break;
7593 case FCmpInst::FCMP_ULE:
7594 case FCmpInst::FCMP_OLE:
7595 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
7596 break;
7597 case FCmpInst::FCMP_UNE:
7598 case FCmpInst::FCMP_ONE:
7599 Pred = ICmpInst::ICMP_NE;
7600 break;
7601 case FCmpInst::FCMP_ORD:
7602 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7603 case FCmpInst::FCMP_UNO:
7604 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7605 }
7606
7607 // Now we know that the APFloat is a normal number, zero or inf.
7608
7609 // See if the FP constant is too large for the integer. For example,
7610 // comparing an i8 to 300.0.
7611 if (!LHSUnsigned) {
7612 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
7613 // and large values.
7614 APFloat SMax(RHS->getSemantics());
7615 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
7617 if (SMax < *RHS) { // smax < 13123.0
7618 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
7619 Pred == ICmpInst::ICMP_SLE)
7620 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7621 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7622 }
7623 } else {
7624 // If the RHS value is > UnsignedMax, fold the comparison. This handles
7625 // +INF and large values.
7626 APFloat UMax(RHS->getSemantics());
7627 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
7629 if (UMax < *RHS) { // umax < 13123.0
7630 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
7631 Pred == ICmpInst::ICMP_ULE)
7632 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7633 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7634 }
7635 }
7636
7637 if (!LHSUnsigned) {
7638 // See if the RHS value is < SignedMin.
7639 APFloat SMin(RHS->getSemantics());
7640 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
7642 if (SMin > *RHS) { // smin > 12312.0
7643 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
7644 Pred == ICmpInst::ICMP_SGE)
7645 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7646 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7647 }
7648 } else {
7649 // See if the RHS value is < UnsignedMin.
7650 APFloat UMin(RHS->getSemantics());
7651 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
7653 if (UMin > *RHS) { // umin > 12312.0
7654 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
7655 Pred == ICmpInst::ICMP_UGE)
7656 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7657 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7658 }
7659 }
7660
7661 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
7662 // [0, UMAX], but it may still be fractional. Check whether this is the case
7663 // using the IsExact flag.
7664 // Don't do this for zero, because -0.0 is not fractional.
7665 APSInt RHSInt(IntWidth, LHSUnsigned);
7666 bool IsExact;
7667 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
7668 if (!RHS->isZero()) {
7669 if (!IsExact) {
7670 // If we had a comparison against a fractional value, we have to adjust
7671 // the compare predicate and sometimes the value. RHSC is rounded towards
7672 // zero at this point.
7673 switch (Pred) {
7674 default: llvm_unreachable("Unexpected integer comparison!");
7675 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
7676 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7677 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
7678 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7679 case ICmpInst::ICMP_ULE:
7680 // (float)int <= 4.4 --> int <= 4
7681 // (float)int <= -4.4 --> false
7682 if (RHS->isNegative())
7683 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7684 break;
7685 case ICmpInst::ICMP_SLE:
7686 // (float)int <= 4.4 --> int <= 4
7687 // (float)int <= -4.4 --> int < -4
7688 if (RHS->isNegative())
7689 Pred = ICmpInst::ICMP_SLT;
7690 break;
7691 case ICmpInst::ICMP_ULT:
7692 // (float)int < -4.4 --> false
7693 // (float)int < 4.4 --> int <= 4
7694 if (RHS->isNegative())
7695 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7696 Pred = ICmpInst::ICMP_ULE;
7697 break;
7698 case ICmpInst::ICMP_SLT:
7699 // (float)int < -4.4 --> int < -4
7700 // (float)int < 4.4 --> int <= 4
7701 if (!RHS->isNegative())
7702 Pred = ICmpInst::ICMP_SLE;
7703 break;
7704 case ICmpInst::ICMP_UGT:
7705 // (float)int > 4.4 --> int > 4
7706 // (float)int > -4.4 --> true
7707 if (RHS->isNegative())
7708 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7709 break;
7710 case ICmpInst::ICMP_SGT:
7711 // (float)int > 4.4 --> int > 4
7712 // (float)int > -4.4 --> int >= -4
7713 if (RHS->isNegative())
7714 Pred = ICmpInst::ICMP_SGE;
7715 break;
7716 case ICmpInst::ICMP_UGE:
7717 // (float)int >= -4.4 --> true
7718 // (float)int >= 4.4 --> int > 4
7719 if (RHS->isNegative())
7720 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7721 Pred = ICmpInst::ICMP_UGT;
7722 break;
7723 case ICmpInst::ICMP_SGE:
7724 // (float)int >= -4.4 --> int >= -4
7725 // (float)int >= 4.4 --> int > 4
7726 if (!RHS->isNegative())
7727 Pred = ICmpInst::ICMP_SGT;
7728 break;
7729 }
7730 }
7731 }
7732
7733 // Lower this FP comparison into an appropriate integer version of the
7734 // comparison.
7735 return new ICmpInst(Pred, LHSI->getOperand(0),
7736 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
7737}
7738
7739/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
7741 Constant *RHSC) {
7742 // When C is not 0.0 and infinities are not allowed:
7743 // (C / X) < 0.0 is a sign-bit test of X
7744 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
7745 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
7746 //
7747 // Proof:
7748 // Multiply (C / X) < 0.0 by X * X / C.
7749 // - X is non zero, if it is the flag 'ninf' is violated.
7750 // - C defines the sign of X * X * C. Thus it also defines whether to swap
7751 // the predicate. C is also non zero by definition.
7752 //
7753 // Thus X * X / C is non zero and the transformation is valid. [qed]
7754
7755 FCmpInst::Predicate Pred = I.getPredicate();
7756
7757 // Check that predicates are valid.
7758 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
7759 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
7760 return nullptr;
7761
7762 // Check that RHS operand is zero.
7763 if (!match(RHSC, m_AnyZeroFP()))
7764 return nullptr;
7765
7766 // Check fastmath flags ('ninf').
7767 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
7768 return nullptr;
7769
7770 // Check the properties of the dividend. It must not be zero to avoid a
7771 // division by zero (see Proof).
7772 const APFloat *C;
7773 if (!match(LHSI->getOperand(0), m_APFloat(C)))
7774 return nullptr;
7775
7776 if (C->isZero())
7777 return nullptr;
7778
7779 // Get swapped predicate if necessary.
7780 if (C->isNegative())
7781 Pred = I.getSwappedPredicate();
7782
7783 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
7784}
7785
7786/// Optimize fabs(X) compared with zero.
7788 Value *X;
7789 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
7790 return nullptr;
7791
7792 const APFloat *C;
7793 if (!match(I.getOperand(1), m_APFloat(C)))
7794 return nullptr;
7795
7796 if (!C->isPosZero()) {
7797 if (!C->isSmallestNormalized())
7798 return nullptr;
7799
7800 const Function *F = I.getFunction();
7801 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
7802 if (Mode.Input == DenormalMode::PreserveSign ||
7803 Mode.Input == DenormalMode::PositiveZero) {
7804
7805 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7806 Constant *Zero = ConstantFP::getZero(X->getType());
7807 return new FCmpInst(P, X, Zero, "", I);
7808 };
7809
7810 switch (I.getPredicate()) {
7811 case FCmpInst::FCMP_OLT:
7812 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
7813 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
7814 case FCmpInst::FCMP_UGE:
7815 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
7816 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
7817 case FCmpInst::FCMP_OGE:
7818 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
7819 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
7820 case FCmpInst::FCMP_ULT:
7821 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
7822 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
7823 default:
7824 break;
7825 }
7826 }
7827
7828 return nullptr;
7829 }
7830
7831 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7832 I->setPredicate(P);
7833 return IC.replaceOperand(*I, 0, X);
7834 };
7835
7836 switch (I.getPredicate()) {
7837 case FCmpInst::FCMP_UGE:
7838 case FCmpInst::FCMP_OLT:
7839 // fabs(X) >= 0.0 --> true
7840 // fabs(X) < 0.0 --> false
7841 llvm_unreachable("fcmp should have simplified");
7842
7843 case FCmpInst::FCMP_OGT:
7844 // fabs(X) > 0.0 --> X != 0.0
7845 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
7846
7847 case FCmpInst::FCMP_UGT:
7848 // fabs(X) u> 0.0 --> X u!= 0.0
7849 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
7850
7851 case FCmpInst::FCMP_OLE:
7852 // fabs(X) <= 0.0 --> X == 0.0
7853 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
7854
7855 case FCmpInst::FCMP_ULE:
7856 // fabs(X) u<= 0.0 --> X u== 0.0
7857 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
7858
7859 case FCmpInst::FCMP_OGE:
7860 // fabs(X) >= 0.0 --> !isnan(X)
7861 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7862 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
7863
7864 case FCmpInst::FCMP_ULT:
7865 // fabs(X) u< 0.0 --> isnan(X)
7866 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7867 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
7868
7869 case FCmpInst::FCMP_OEQ:
7870 case FCmpInst::FCMP_UEQ:
7871 case FCmpInst::FCMP_ONE:
7872 case FCmpInst::FCMP_UNE:
7873 case FCmpInst::FCMP_ORD:
7874 case FCmpInst::FCMP_UNO:
7875 // Look through the fabs() because it doesn't change anything but the sign.
7876 // fabs(X) == 0.0 --> X == 0.0,
7877 // fabs(X) != 0.0 --> X != 0.0
7878 // isnan(fabs(X)) --> isnan(X)
7879 // !isnan(fabs(X) --> !isnan(X)
7880 return replacePredAndOp0(&I, I.getPredicate(), X);
7881
7882 default:
7883 return nullptr;
7884 }
7885}
7886
7888 CmpInst::Predicate Pred = I.getPredicate();
7889 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7890
7891 // Canonicalize fneg as Op1.
7892 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
7893 std::swap(Op0, Op1);
7894 Pred = I.getSwappedPredicate();
7895 }
7896
7897 if (!match(Op1, m_FNeg(m_Specific(Op0))))
7898 return nullptr;
7899
7900 // Replace the negated operand with 0.0:
7901 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
7902 Constant *Zero = ConstantFP::getZero(Op0->getType());
7903 return new FCmpInst(Pred, Op0, Zero, "", &I);
7904}
7905
7907 bool Changed = false;
7908
7909 /// Orders the operands of the compare so that they are listed from most
7910 /// complex to least complex. This puts constants before unary operators,
7911 /// before binary operators.
7912 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
7913 I.swapOperands();
7914 Changed = true;
7915 }
7916
7917 const CmpInst::Predicate Pred = I.getPredicate();
7918 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7919 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
7921 return replaceInstUsesWith(I, V);
7922
7923 // Simplify 'fcmp pred X, X'
7924 Type *OpType = Op0->getType();
7925 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
7926 if (Op0 == Op1) {
7927 switch (Pred) {
7928 default: break;
7929 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
7930 case FCmpInst::FCMP_ULT: // True if unordered or less than
7931 case FCmpInst::FCMP_UGT: // True if unordered or greater than
7932 case FCmpInst::FCMP_UNE: // True if unordered or not equal
7933 // Canonicalize these to be 'fcmp uno %X, 0.0'.
7934 I.setPredicate(FCmpInst::FCMP_UNO);
7935 I.setOperand(1, Constant::getNullValue(OpType));
7936 return &I;
7937
7938 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
7939 case FCmpInst::FCMP_OEQ: // True if ordered and equal
7940 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
7941 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
7942 // Canonicalize these to be 'fcmp ord %X, 0.0'.
7943 I.setPredicate(FCmpInst::FCMP_ORD);
7944 I.setOperand(1, Constant::getNullValue(OpType));
7945 return &I;
7946 }
7947 }
7948
7949 if (I.isCommutative()) {
7950 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7951 replaceOperand(I, 0, Pair->first);
7952 replaceOperand(I, 1, Pair->second);
7953 return &I;
7954 }
7955 }
7956
7957 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
7958 // then canonicalize the operand to 0.0.
7959 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
7960 if (!match(Op0, m_PosZeroFP()) &&
7961 isKnownNeverNaN(Op0, 0, getSimplifyQuery().getWithInstruction(&I)))
7962 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
7963
7964 if (!match(Op1, m_PosZeroFP()) &&
7965 isKnownNeverNaN(Op1, 0, getSimplifyQuery().getWithInstruction(&I)))
7966 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7967 }
7968
7969 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
7970 Value *X, *Y;
7971 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
7972 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
7973
7975 return R;
7976
7977 // Test if the FCmpInst instruction is used exclusively by a select as
7978 // part of a minimum or maximum operation. If so, refrain from doing
7979 // any other folding. This helps out other analyses which understand
7980 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7981 // and CodeGen. And in this case, at least one of the comparison
7982 // operands has at least one user besides the compare (the select),
7983 // which would often largely negate the benefit of folding anyway.
7984 if (I.hasOneUse())
7985 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7986 Value *A, *B;
7988 if (SPR.Flavor != SPF_UNKNOWN)
7989 return nullptr;
7990 }
7991
7992 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
7993 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
7994 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
7995 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7996
7997 // Canonicalize:
7998 // fcmp olt X, +inf -> fcmp one X, +inf
7999 // fcmp ole X, +inf -> fcmp ord X, 0
8000 // fcmp ogt X, +inf -> false
8001 // fcmp oge X, +inf -> fcmp oeq X, +inf
8002 // fcmp ult X, +inf -> fcmp une X, +inf
8003 // fcmp ule X, +inf -> true
8004 // fcmp ugt X, +inf -> fcmp uno X, 0
8005 // fcmp uge X, +inf -> fcmp ueq X, +inf
8006 // fcmp olt X, -inf -> false
8007 // fcmp ole X, -inf -> fcmp oeq X, -inf
8008 // fcmp ogt X, -inf -> fcmp one X, -inf
8009 // fcmp oge X, -inf -> fcmp ord X, 0
8010 // fcmp ult X, -inf -> fcmp uno X, 0
8011 // fcmp ule X, -inf -> fcmp ueq X, -inf
8012 // fcmp ugt X, -inf -> fcmp une X, -inf
8013 // fcmp uge X, -inf -> true
8014 const APFloat *C;
8015 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
8016 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
8017 default:
8018 break;
8019 case FCmpInst::FCMP_ORD:
8020 case FCmpInst::FCMP_UNO:
8023 case FCmpInst::FCMP_OGT:
8024 case FCmpInst::FCMP_ULE:
8025 llvm_unreachable("Should be simplified by InstSimplify");
8026 case FCmpInst::FCMP_OLT:
8027 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
8028 case FCmpInst::FCMP_OLE:
8029 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
8030 "", &I);
8031 case FCmpInst::FCMP_OGE:
8032 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
8033 case FCmpInst::FCMP_ULT:
8034 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
8035 case FCmpInst::FCMP_UGT:
8036 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
8037 "", &I);
8038 case FCmpInst::FCMP_UGE:
8039 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8040 }
8041 }
8042
8043 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8044 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8045 if (match(Op1, m_PosZeroFP()) &&
8048 if (Pred == FCmpInst::FCMP_OEQ)
8049 IntPred = ICmpInst::ICMP_EQ;
8050 else if (Pred == FCmpInst::FCMP_UNE)
8051 IntPred = ICmpInst::ICMP_NE;
8052
8053 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8054 Type *IntTy = X->getType();
8055 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8056 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8057 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8058 }
8059 }
8060
8061 // Handle fcmp with instruction LHS and constant RHS.
8062 Instruction *LHSI;
8063 Constant *RHSC;
8064 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8065 switch (LHSI->getOpcode()) {
8066 case Instruction::PHI:
8067 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8068 return NV;
8069 break;
8070 case Instruction::SIToFP:
8071 case Instruction::UIToFP:
8072 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8073 return NV;
8074 break;
8075 case Instruction::FDiv:
8076 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8077 return NV;
8078 break;
8079 case Instruction::Load:
8080 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8081 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
8083 cast<LoadInst>(LHSI), GEP, GV, I))
8084 return Res;
8085 break;
8086 }
8087 }
8088
8089 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8090 return R;
8091
8092 if (match(Op0, m_FNeg(m_Value(X)))) {
8093 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8094 Constant *C;
8095 if (match(Op1, m_Constant(C)))
8096 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8097 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8098 }
8099
8100 if (match(Op0, m_FPExt(m_Value(X)))) {
8101 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8102 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8103 return new FCmpInst(Pred, X, Y, "", &I);
8104
8105 const APFloat *C;
8106 if (match(Op1, m_APFloat(C))) {
8107 const fltSemantics &FPSem =
8108 X->getType()->getScalarType()->getFltSemantics();
8109 bool Lossy;
8110 APFloat TruncC = *C;
8111 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8112
8113 if (Lossy) {
8114 // X can't possibly equal the higher-precision constant, so reduce any
8115 // equality comparison.
8116 // TODO: Other predicates can be handled via getFCmpCode().
8117 switch (Pred) {
8118 case FCmpInst::FCMP_OEQ:
8119 // X is ordered and equal to an impossible constant --> false
8120 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8121 case FCmpInst::FCMP_ONE:
8122 // X is ordered and not equal to an impossible constant --> ordered
8123 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8124 ConstantFP::getZero(X->getType()));
8125 case FCmpInst::FCMP_UEQ:
8126 // X is unordered or equal to an impossible constant --> unordered
8127 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8128 ConstantFP::getZero(X->getType()));
8129 case FCmpInst::FCMP_UNE:
8130 // X is unordered or not equal to an impossible constant --> true
8131 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8132 default:
8133 break;
8134 }
8135 }
8136
8137 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8138 // Avoid lossy conversions and denormals.
8139 // Zero is a special case that's OK to convert.
8140 APFloat Fabs = TruncC;
8141 Fabs.clearSign();
8142 if (!Lossy &&
8143 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8144 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8145 return new FCmpInst(Pred, X, NewC, "", &I);
8146 }
8147 }
8148 }
8149
8150 // Convert a sign-bit test of an FP value into a cast and integer compare.
8151 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8152 // TODO: Handle non-zero compare constants.
8153 // TODO: Handle other predicates.
8154 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
8155 m_Value(X)))) &&
8156 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8157 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8158 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8159 IntType = VectorType::get(IntType, VecTy->getElementCount());
8160
8161 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8162 if (Pred == FCmpInst::FCMP_OLT) {
8163 Value *IntX = Builder.CreateBitCast(X, IntType);
8164 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8165 ConstantInt::getNullValue(IntType));
8166 }
8167 }
8168
8169 {
8170 Value *CanonLHS = nullptr, *CanonRHS = nullptr;
8171 match(Op0, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonLHS)));
8172 match(Op1, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonRHS)));
8173
8174 // (canonicalize(x) == x) => (x == x)
8175 if (CanonLHS == Op1)
8176 return new FCmpInst(Pred, Op1, Op1, "", &I);
8177
8178 // (x == canonicalize(x)) => (x == x)
8179 if (CanonRHS == Op0)
8180 return new FCmpInst(Pred, Op0, Op0, "", &I);
8181
8182 // (canonicalize(x) == canonicalize(y)) => (x == y)
8183 if (CanonLHS && CanonRHS)
8184 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8185 }
8186
8187 if (I.getType()->isVectorTy())
8188 if (Instruction *Res = foldVectorCmp(I, Builder))
8189 return Res;
8190
8191 return Changed ? &I : nullptr;
8192}
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:531
#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:486
static BinaryOperator * CreateNot(Value *Op, const Twine &Name, BasicBlock::iterator InsertBefore)
Conditional or Unconditional Branch instruction.
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1660
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:956
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition: InstrTypes.h:1335
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition: InstrTypes.h:1171
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition: InstrTypes.h:1228
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:966
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:969
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:983
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:995
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:996
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:972
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:981
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:970
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:971
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:990
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:989
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:993
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:980
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:974
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:977
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:991
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:978
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:973
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:975
@ ICMP_EQ
equal
Definition: InstrTypes.h:987
@ ICMP_NE
not equal
Definition: InstrTypes.h:988
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:994
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:982
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:992
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:979
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:968
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:976
bool isSigned() const
Definition: InstrTypes.h:1238
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:1140
bool isTrueWhenEqual() const
This is just a convenience.
Definition: InstrTypes.h:1287
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition: InstrTypes.h:1184
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:1102
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:1078
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition: InstrTypes.h:1206
Predicate getFlippedSignednessPredicate()
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->Failed assert.
Definition: InstrTypes.h:1281
bool isIntPredicate() const
Definition: InstrTypes.h:1096
bool isUnsigned() const
Definition: InstrTypes.h:1244
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
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
Definition: Constants.cpp:432
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 isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition: Operator.h:419
Type * getSourceElementType() const
Definition: Operator.cpp:66
Value * getPointerOperand()
Definition: Operator.h:440
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition: Operator.h:487
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:2247
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2007
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition: IRBuilder.h:2450
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:2255
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
Definition: IRBuilder.h:2029
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:2506
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:2235
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:2356
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition: IRBuilder.h:2387
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1749
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2231
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:2117
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2239
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:2011
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 * 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:2263
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2151
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:2186
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition: IRBuilder.h:2534
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:2402
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:2341
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:2656
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 * foldICmpInstWithConstantAllowUndef(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 * 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 * 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:497
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:156
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
Definition: InstCombiner.h:231
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
Definition: InstCombiner.h:138
TargetLibraryInfo & TLI
Definition: InstCombiner.h:73
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Definition: InstCombiner.h:440
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:461
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Definition: InstCombiner.h:385
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:483
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
Definition: InstCombiner.h:179
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:490
const DataLayout & DL
Definition: InstCombiner.h:75
DomConditionCache DC
Definition: InstCombiner.h:80
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:247
void addToWorklist(Instruction *I)
Definition: InstCombiner.h:335
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
Definition: InstCombiner.h:409
DominatorTree & DT
Definition: InstCombiner.h:74
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:468
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
Definition: InstCombiner.h:430
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:475
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
Definition: InstCombiner.h:212
const SimplifyQuery & getSimplifyQuery() const
Definition: InstCombiner.h:341
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
Definition: InstCombiner.h:456
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:1469
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
Definition: PatternMatch.h:477
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:622
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)
apint_match m_APIntAllowUndef(const APInt *&Res)
Match APInt while allowing undefs in splat vector constants.
Definition: PatternMatch.h:300
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
Definition: PatternMatch.h:568
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:918
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:765
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
Definition: PatternMatch.h:713
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:821
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
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:509
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:541
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::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:839
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
Definition: PatternMatch.h:548
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:800
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:588
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:632
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:722
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)
specific_intval< true > m_SpecificIntAllowUndef(const APInt &V)
Definition: PatternMatch.h:926
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:561
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:647
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 and pointer casts from the specified value,...
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:2032
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.
@ 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 isKnownNonZero(const Value *V, unsigned Depth, const SimplifyQuery &Q)
Return true if the given value is known to be non-zero when defined.
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