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 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
820 Value *L = EmitGEPOffset(GEPLHS, /*RewriteGEP=*/true);
821 Value *R = EmitGEPOffset(GEPRHS, /*RewriteGEP=*/true);
822 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), L, R);
823 }
824 }
825
826 // Try convert this to an indexed compare by looking through PHIs/casts as a
827 // last resort.
828 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
829}
830
832 // It would be tempting to fold away comparisons between allocas and any
833 // pointer not based on that alloca (e.g. an argument). However, even
834 // though such pointers cannot alias, they can still compare equal.
835 //
836 // But LLVM doesn't specify where allocas get their memory, so if the alloca
837 // doesn't escape we can argue that it's impossible to guess its value, and we
838 // can therefore act as if any such guesses are wrong.
839 //
840 // However, we need to ensure that this folding is consistent: We can't fold
841 // one comparison to false, and then leave a different comparison against the
842 // same value alone (as it might evaluate to true at runtime, leading to a
843 // contradiction). As such, this code ensures that all comparisons are folded
844 // at the same time, and there are no other escapes.
845
846 struct CmpCaptureTracker : public CaptureTracker {
847 AllocaInst *Alloca;
848 bool Captured = false;
849 /// The value of the map is a bit mask of which icmp operands the alloca is
850 /// used in.
852
853 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
854
855 void tooManyUses() override { Captured = true; }
856
857 bool captured(const Use *U) override {
858 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
859 // We need to check that U is based *only* on the alloca, and doesn't
860 // have other contributions from a select/phi operand.
861 // TODO: We could check whether getUnderlyingObjects() reduces to one
862 // object, which would allow looking through phi nodes.
863 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
864 // Collect equality icmps of the alloca, and don't treat them as
865 // captures.
866 auto Res = ICmps.insert({ICmp, 0});
867 Res.first->second |= 1u << U->getOperandNo();
868 return false;
869 }
870
871 Captured = true;
872 return true;
873 }
874 };
875
876 CmpCaptureTracker Tracker(Alloca);
877 PointerMayBeCaptured(Alloca, &Tracker);
878 if (Tracker.Captured)
879 return false;
880
881 bool Changed = false;
882 for (auto [ICmp, Operands] : Tracker.ICmps) {
883 switch (Operands) {
884 case 1:
885 case 2: {
886 // The alloca is only used in one icmp operand. Assume that the
887 // equality is false.
888 auto *Res = ConstantInt::get(
889 ICmp->getType(), ICmp->getPredicate() == ICmpInst::ICMP_NE);
890 replaceInstUsesWith(*ICmp, Res);
892 Changed = true;
893 break;
894 }
895 case 3:
896 // Both icmp operands are based on the alloca, so this is comparing
897 // pointer offsets, without leaking any information about the address
898 // of the alloca. Ignore such comparisons.
899 break;
900 default:
901 llvm_unreachable("Cannot happen");
902 }
903 }
904
905 return Changed;
906}
907
908/// Fold "icmp pred (X+C), X".
910 ICmpInst::Predicate Pred) {
911 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
912 // so the values can never be equal. Similarly for all other "or equals"
913 // operators.
914 assert(!!C && "C should not be zero!");
915
916 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
917 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
918 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
919 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
920 Constant *R = ConstantInt::get(X->getType(),
921 APInt::getMaxValue(C.getBitWidth()) - C);
922 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
923 }
924
925 // (X+1) >u X --> X <u (0-1) --> X != 255
926 // (X+2) >u X --> X <u (0-2) --> X <u 254
927 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
928 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
929 return new ICmpInst(ICmpInst::ICMP_ULT, X,
930 ConstantInt::get(X->getType(), -C));
931
932 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
933
934 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
935 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
936 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
937 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
938 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
939 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
940 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
941 return new ICmpInst(ICmpInst::ICMP_SGT, X,
942 ConstantInt::get(X->getType(), SMax - C));
943
944 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
945 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
946 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
947 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
948 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
949 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
950
951 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
952 return new ICmpInst(ICmpInst::ICMP_SLT, X,
953 ConstantInt::get(X->getType(), SMax - (C - 1)));
954}
955
956/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
957/// (icmp eq/ne A, Log2(AP2/AP1)) ->
958/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
960 const APInt &AP1,
961 const APInt &AP2) {
962 assert(I.isEquality() && "Cannot fold icmp gt/lt");
963
964 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
965 if (I.getPredicate() == I.ICMP_NE)
966 Pred = CmpInst::getInversePredicate(Pred);
967 return new ICmpInst(Pred, LHS, RHS);
968 };
969
970 // Don't bother doing any work for cases which InstSimplify handles.
971 if (AP2.isZero())
972 return nullptr;
973
974 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
975 if (IsAShr) {
976 if (AP2.isAllOnes())
977 return nullptr;
978 if (AP2.isNegative() != AP1.isNegative())
979 return nullptr;
980 if (AP2.sgt(AP1))
981 return nullptr;
982 }
983
984 if (!AP1)
985 // 'A' must be large enough to shift out the highest set bit.
986 return getICmp(I.ICMP_UGT, A,
987 ConstantInt::get(A->getType(), AP2.logBase2()));
988
989 if (AP1 == AP2)
990 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
991
992 int Shift;
993 if (IsAShr && AP1.isNegative())
994 Shift = AP1.countl_one() - AP2.countl_one();
995 else
996 Shift = AP1.countl_zero() - AP2.countl_zero();
997
998 if (Shift > 0) {
999 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1000 // There are multiple solutions if we are comparing against -1 and the LHS
1001 // of the ashr is not a power of two.
1002 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1003 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1004 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1005 } else if (AP1 == AP2.lshr(Shift)) {
1006 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1007 }
1008 }
1009
1010 // Shifting const2 will never be equal to const1.
1011 // FIXME: This should always be handled by InstSimplify?
1012 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1013 return replaceInstUsesWith(I, TorF);
1014}
1015
1016/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1017/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1019 const APInt &AP1,
1020 const APInt &AP2) {
1021 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1022
1023 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1024 if (I.getPredicate() == I.ICMP_NE)
1025 Pred = CmpInst::getInversePredicate(Pred);
1026 return new ICmpInst(Pred, LHS, RHS);
1027 };
1028
1029 // Don't bother doing any work for cases which InstSimplify handles.
1030 if (AP2.isZero())
1031 return nullptr;
1032
1033 unsigned AP2TrailingZeros = AP2.countr_zero();
1034
1035 if (!AP1 && AP2TrailingZeros != 0)
1036 return getICmp(
1037 I.ICMP_UGE, A,
1038 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1039
1040 if (AP1 == AP2)
1041 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1042
1043 // Get the distance between the lowest bits that are set.
1044 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1045
1046 if (Shift > 0 && AP2.shl(Shift) == AP1)
1047 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1048
1049 // Shifting const2 will never be equal to const1.
1050 // FIXME: This should always be handled by InstSimplify?
1051 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1052 return replaceInstUsesWith(I, TorF);
1053}
1054
1055/// The caller has matched a pattern of the form:
1056/// I = icmp ugt (add (add A, B), CI2), CI1
1057/// If this is of the form:
1058/// sum = a + b
1059/// if (sum+128 >u 255)
1060/// Then replace it with llvm.sadd.with.overflow.i8.
1061///
1063 ConstantInt *CI2, ConstantInt *CI1,
1064 InstCombinerImpl &IC) {
1065 // The transformation we're trying to do here is to transform this into an
1066 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1067 // with a narrower add, and discard the add-with-constant that is part of the
1068 // range check (if we can't eliminate it, this isn't profitable).
1069
1070 // In order to eliminate the add-with-constant, the compare can be its only
1071 // use.
1072 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1073 if (!AddWithCst->hasOneUse())
1074 return nullptr;
1075
1076 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1077 if (!CI2->getValue().isPowerOf2())
1078 return nullptr;
1079 unsigned NewWidth = CI2->getValue().countr_zero();
1080 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1081 return nullptr;
1082
1083 // The width of the new add formed is 1 more than the bias.
1084 ++NewWidth;
1085
1086 // Check to see that CI1 is an all-ones value with NewWidth bits.
1087 if (CI1->getBitWidth() == NewWidth ||
1088 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1089 return nullptr;
1090
1091 // This is only really a signed overflow check if the inputs have been
1092 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1093 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1094 if (IC.ComputeMaxSignificantBits(A, 0, &I) > NewWidth ||
1095 IC.ComputeMaxSignificantBits(B, 0, &I) > NewWidth)
1096 return nullptr;
1097
1098 // In order to replace the original add with a narrower
1099 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1100 // and truncates that discard the high bits of the add. Verify that this is
1101 // the case.
1102 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1103 for (User *U : OrigAdd->users()) {
1104 if (U == AddWithCst)
1105 continue;
1106
1107 // Only accept truncates for now. We would really like a nice recursive
1108 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1109 // chain to see which bits of a value are actually demanded. If the
1110 // original add had another add which was then immediately truncated, we
1111 // could still do the transformation.
1112 TruncInst *TI = dyn_cast<TruncInst>(U);
1113 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1114 return nullptr;
1115 }
1116
1117 // If the pattern matches, truncate the inputs to the narrower type and
1118 // use the sadd_with_overflow intrinsic to efficiently compute both the
1119 // result and the overflow bit.
1120 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1122 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1123
1124 InstCombiner::BuilderTy &Builder = IC.Builder;
1125
1126 // Put the new code above the original add, in case there are any uses of the
1127 // add between the add and the compare.
1128 Builder.SetInsertPoint(OrigAdd);
1129
1130 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1131 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1132 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1133 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1134 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1135
1136 // The inner add was the result of the narrow add, zero extended to the
1137 // wider type. Replace it with the result computed by the intrinsic.
1138 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1139 IC.eraseInstFromFunction(*OrigAdd);
1140
1141 // The original icmp gets replaced with the overflow value.
1142 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1143}
1144
1145/// If we have:
1146/// icmp eq/ne (urem/srem %x, %y), 0
1147/// iff %y is a power-of-two, we can replace this with a bit test:
1148/// icmp eq/ne (and %x, (add %y, -1)), 0
1150 // This fold is only valid for equality predicates.
1151 if (!I.isEquality())
1152 return nullptr;
1154 Value *X, *Y, *Zero;
1155 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1156 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1157 return nullptr;
1158 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, 0, &I))
1159 return nullptr;
1160 // This may increase instruction count, we don't enforce that Y is a constant.
1161 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1162 Value *Masked = Builder.CreateAnd(X, Mask);
1163 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1164}
1165
1166/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1167/// by one-less-than-bitwidth into a sign test on the original value.
1169 Instruction *Val;
1171 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1172 return nullptr;
1173
1174 Value *X;
1175 Type *XTy;
1176
1177 Constant *C;
1178 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1179 XTy = X->getType();
1180 unsigned XBitWidth = XTy->getScalarSizeInBits();
1182 APInt(XBitWidth, XBitWidth - 1))))
1183 return nullptr;
1184 } else if (isa<BinaryOperator>(Val) &&
1186 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1187 /*AnalyzeForSignBitExtraction=*/true))) {
1188 XTy = X->getType();
1189 } else
1190 return nullptr;
1191
1192 return ICmpInst::Create(Instruction::ICmp,
1196}
1197
1198// Handle icmp pred X, 0
1200 CmpInst::Predicate Pred = Cmp.getPredicate();
1201 if (!match(Cmp.getOperand(1), m_Zero()))
1202 return nullptr;
1203
1204 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1205 if (Pred == ICmpInst::ICMP_SGT) {
1206 Value *A, *B;
1207 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1209 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1211 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1212 }
1213 }
1214
1216 return New;
1217
1218 // Given:
1219 // icmp eq/ne (urem %x, %y), 0
1220 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1221 // icmp eq/ne %x, 0
1222 Value *X, *Y;
1223 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1224 ICmpInst::isEquality(Pred)) {
1225 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1226 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1227 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1228 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1229 }
1230
1231 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1232 // odd/non-zero/there is no overflow.
1233 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1234 ICmpInst::isEquality(Pred)) {
1235
1236 KnownBits XKnown = computeKnownBits(X, 0, &Cmp);
1237 // if X % 2 != 0
1238 // (icmp eq/ne Y)
1239 if (XKnown.countMaxTrailingZeros() == 0)
1240 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1241
1242 KnownBits YKnown = computeKnownBits(Y, 0, &Cmp);
1243 // if Y % 2 != 0
1244 // (icmp eq/ne X)
1245 if (YKnown.countMaxTrailingZeros() == 0)
1246 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1247
1248 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1249 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1250 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1251 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1252 // but to avoid unnecessary work, first just if this is an obvious case.
1253
1254 // if X non-zero and NoOverflow(X * Y)
1255 // (icmp eq/ne Y)
1256 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1257 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1258
1259 // if Y non-zero and NoOverflow(X * Y)
1260 // (icmp eq/ne X)
1261 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1262 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1263 }
1264 // Note, we are skipping cases:
1265 // if Y % 2 != 0 AND X % 2 != 0
1266 // (false/true)
1267 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1268 // (false/true)
1269 // Those can be simplified later as we would have already replaced the (icmp
1270 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1271 // will fold to a constant elsewhere.
1272 }
1273 return nullptr;
1274}
1275
1276/// Fold icmp Pred X, C.
1277/// TODO: This code structure does not make sense. The saturating add fold
1278/// should be moved to some other helper and extended as noted below (it is also
1279/// possible that code has been made unnecessary - do we canonicalize IR to
1280/// overflow/saturating intrinsics or not?).
1282 // Match the following pattern, which is a common idiom when writing
1283 // overflow-safe integer arithmetic functions. The source performs an addition
1284 // in wider type and explicitly checks for overflow using comparisons against
1285 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1286 //
1287 // TODO: This could probably be generalized to handle other overflow-safe
1288 // operations if we worked out the formulas to compute the appropriate magic
1289 // constants.
1290 //
1291 // sum = a + b
1292 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1293 CmpInst::Predicate Pred = Cmp.getPredicate();
1294 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1295 Value *A, *B;
1296 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1297 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1298 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1299 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1300 return Res;
1301
1302 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1303 Constant *C = dyn_cast<Constant>(Op1);
1304 if (!C)
1305 return nullptr;
1306
1307 if (auto *Phi = dyn_cast<PHINode>(Op0))
1308 if (all_of(Phi->operands(), [](Value *V) { return isa<Constant>(V); })) {
1310 for (Value *V : Phi->incoming_values()) {
1311 Constant *Res =
1312 ConstantFoldCompareInstOperands(Pred, cast<Constant>(V), C, DL);
1313 if (!Res)
1314 return nullptr;
1315 Ops.push_back(Res);
1316 }
1318 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1319 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1320 NewPhi->addIncoming(V, Pred);
1321 return replaceInstUsesWith(Cmp, NewPhi);
1322 }
1323
1325 return R;
1326
1327 return nullptr;
1328}
1329
1330/// Canonicalize icmp instructions based on dominating conditions.
1332 // We already checked simple implication in InstSimplify, only handle complex
1333 // cases here.
1334 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1335 const APInt *C;
1336 if (!match(Y, m_APInt(C)))
1337 return nullptr;
1338
1339 CmpInst::Predicate Pred = Cmp.getPredicate();
1341
1342 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1343 const APInt *DomC) -> Instruction * {
1344 // We have 2 compares of a variable with constants. Calculate the constant
1345 // ranges of those compares to see if we can transform the 2nd compare:
1346 // DomBB:
1347 // DomCond = icmp DomPred X, DomC
1348 // br DomCond, CmpBB, FalseBB
1349 // CmpBB:
1350 // Cmp = icmp Pred X, C
1351 ConstantRange DominatingCR =
1352 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1353 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1354 ConstantRange Difference = DominatingCR.difference(CR);
1355 if (Intersection.isEmptySet())
1356 return replaceInstUsesWith(Cmp, Builder.getFalse());
1357 if (Difference.isEmptySet())
1358 return replaceInstUsesWith(Cmp, Builder.getTrue());
1359
1360 // Canonicalizing a sign bit comparison that gets used in a branch,
1361 // pessimizes codegen by generating branch on zero instruction instead
1362 // of a test and branch. So we avoid canonicalizing in such situations
1363 // because test and branch instruction has better branch displacement
1364 // than compare and branch instruction.
1365 bool UnusedBit;
1366 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1367 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1368 return nullptr;
1369
1370 // Avoid an infinite loop with min/max canonicalization.
1371 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1372 if (Cmp.hasOneUse() &&
1373 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1374 return nullptr;
1375
1376 if (const APInt *EqC = Intersection.getSingleElement())
1377 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1378 if (const APInt *NeC = Difference.getSingleElement())
1379 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1380 return nullptr;
1381 };
1382
1383 for (BranchInst *BI : DC.conditionsFor(X)) {
1384 ICmpInst::Predicate DomPred;
1385 const APInt *DomC;
1386 if (!match(BI->getCondition(),
1387 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1388 continue;
1389
1390 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1391 if (DT.dominates(Edge0, Cmp.getParent())) {
1392 if (auto *V = handleDomCond(DomPred, DomC))
1393 return V;
1394 } else {
1395 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1396 if (DT.dominates(Edge1, Cmp.getParent()))
1397 if (auto *V =
1398 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1399 return V;
1400 }
1401 }
1402
1403 return nullptr;
1404}
1405
1406/// Fold icmp (trunc X), C.
1408 TruncInst *Trunc,
1409 const APInt &C) {
1410 ICmpInst::Predicate Pred = Cmp.getPredicate();
1411 Value *X = Trunc->getOperand(0);
1412 if (C.isOne() && C.getBitWidth() > 1) {
1413 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1414 Value *V = nullptr;
1415 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1416 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1417 ConstantInt::get(V->getType(), 1));
1418 }
1419
1420 Type *SrcTy = X->getType();
1421 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1422 SrcBits = SrcTy->getScalarSizeInBits();
1423
1424 // TODO: Handle any shifted constant by subtracting trailing zeros.
1425 // TODO: Handle non-equality predicates.
1426 Value *Y;
1427 if (Cmp.isEquality() && match(X, m_Shl(m_One(), m_Value(Y)))) {
1428 // (trunc (1 << Y) to iN) == 0 --> Y u>= N
1429 // (trunc (1 << Y) to iN) != 0 --> Y u< N
1430 if (C.isZero()) {
1431 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1432 return new ICmpInst(NewPred, Y, ConstantInt::get(SrcTy, DstBits));
1433 }
1434 // (trunc (1 << Y) to iN) == 2**C --> Y == C
1435 // (trunc (1 << Y) to iN) != 2**C --> Y != C
1436 if (C.isPowerOf2())
1437 return new ICmpInst(Pred, Y, ConstantInt::get(SrcTy, C.logBase2()));
1438 }
1439
1440 if (Cmp.isEquality() && Trunc->hasOneUse()) {
1441 // Canonicalize to a mask and wider compare if the wide type is suitable:
1442 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1443 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1444 Constant *Mask =
1445 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1446 Value *And = Builder.CreateAnd(X, Mask);
1447 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1448 return new ICmpInst(Pred, And, WideC);
1449 }
1450
1451 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1452 // of the high bits truncated out of x are known.
1453 KnownBits Known = computeKnownBits(X, 0, &Cmp);
1454
1455 // If all the high bits are known, we can do this xform.
1456 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1457 // Pull in the high bits from known-ones set.
1458 APInt NewRHS = C.zext(SrcBits);
1459 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1460 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1461 }
1462 }
1463
1464 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1465 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1466 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1467 Value *ShOp;
1468 const APInt *ShAmtC;
1469 bool TrueIfSigned;
1470 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1471 match(X, m_Shr(m_Value(ShOp), m_APInt(ShAmtC))) &&
1472 DstBits == SrcBits - ShAmtC->getZExtValue()) {
1473 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1475 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1477 }
1478
1479 return nullptr;
1480}
1481
1482/// Fold icmp (trunc X), (trunc Y).
1483/// Fold icmp (trunc X), (zext Y).
1486 const SimplifyQuery &Q) {
1487 if (Cmp.isSigned())
1488 return nullptr;
1489
1490 Value *X, *Y;
1492 bool YIsZext = false;
1493 // Try to match icmp (trunc X), (trunc Y)
1494 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1495 if (X->getType() != Y->getType() &&
1496 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1497 return nullptr;
1498 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1499 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1500 std::swap(X, Y);
1501 Pred = Cmp.getSwappedPredicate(Pred);
1502 }
1503 }
1504 // Try to match icmp (trunc X), (zext Y)
1505 else if (match(&Cmp, m_c_ICmp(Pred, m_Trunc(m_Value(X)),
1506 m_OneUse(m_ZExt(m_Value(Y))))))
1507
1508 YIsZext = true;
1509 else
1510 return nullptr;
1511
1512 Type *TruncTy = Cmp.getOperand(0)->getType();
1513 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1514
1515 // If this transform will end up changing from desirable types -> undesirable
1516 // types skip it.
1517 if (isDesirableIntType(TruncBits) &&
1518 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1519 return nullptr;
1520
1521 // Check if the trunc is unneeded.
1522 KnownBits KnownX = llvm::computeKnownBits(X, /*Depth*/ 0, Q);
1523 if (KnownX.countMaxActiveBits() > TruncBits)
1524 return nullptr;
1525
1526 if (!YIsZext) {
1527 // If Y is also a trunc, make sure it is unneeded.
1528 KnownBits KnownY = llvm::computeKnownBits(Y, /*Depth*/ 0, Q);
1529 if (KnownY.countMaxActiveBits() > TruncBits)
1530 return nullptr;
1531 }
1532
1533 Value *NewY = Builder.CreateZExtOrTrunc(Y, X->getType());
1534 return new ICmpInst(Pred, X, NewY);
1535}
1536
1537/// Fold icmp (xor X, Y), C.
1540 const APInt &C) {
1541 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1542 return I;
1543
1544 Value *X = Xor->getOperand(0);
1545 Value *Y = Xor->getOperand(1);
1546 const APInt *XorC;
1547 if (!match(Y, m_APInt(XorC)))
1548 return nullptr;
1549
1550 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1551 // fold the xor.
1552 ICmpInst::Predicate Pred = Cmp.getPredicate();
1553 bool TrueIfSigned = false;
1554 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1555
1556 // If the sign bit of the XorCst is not set, there is no change to
1557 // the operation, just stop using the Xor.
1558 if (!XorC->isNegative())
1559 return replaceOperand(Cmp, 0, X);
1560
1561 // Emit the opposite comparison.
1562 if (TrueIfSigned)
1563 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1564 ConstantInt::getAllOnesValue(X->getType()));
1565 else
1566 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1567 ConstantInt::getNullValue(X->getType()));
1568 }
1569
1570 if (Xor->hasOneUse()) {
1571 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1572 if (!Cmp.isEquality() && XorC->isSignMask()) {
1573 Pred = Cmp.getFlippedSignednessPredicate();
1574 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1575 }
1576
1577 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1578 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1579 Pred = Cmp.getFlippedSignednessPredicate();
1580 Pred = Cmp.getSwappedPredicate(Pred);
1581 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1582 }
1583 }
1584
1585 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1586 if (Pred == ICmpInst::ICMP_UGT) {
1587 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1588 if (*XorC == ~C && (C + 1).isPowerOf2())
1589 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1590 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1591 if (*XorC == C && (C + 1).isPowerOf2())
1592 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1593 }
1594 if (Pred == ICmpInst::ICMP_ULT) {
1595 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1596 if (*XorC == -C && C.isPowerOf2())
1597 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1598 ConstantInt::get(X->getType(), ~C));
1599 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1600 if (*XorC == C && (-C).isPowerOf2())
1601 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1602 ConstantInt::get(X->getType(), ~C));
1603 }
1604 return nullptr;
1605}
1606
1607/// For power-of-2 C:
1608/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1609/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1612 const APInt &C) {
1613 CmpInst::Predicate Pred = Cmp.getPredicate();
1614 APInt PowerOf2;
1615 if (Pred == ICmpInst::ICMP_ULT)
1616 PowerOf2 = C;
1617 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1618 PowerOf2 = C + 1;
1619 else
1620 return nullptr;
1621 if (!PowerOf2.isPowerOf2())
1622 return nullptr;
1623 Value *X;
1624 const APInt *ShiftC;
1626 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1627 return nullptr;
1628 uint64_t Shift = ShiftC->getLimitedValue();
1629 Type *XType = X->getType();
1630 if (Shift == 0 || PowerOf2.isMinSignedValue())
1631 return nullptr;
1632 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1633 APInt Bound =
1634 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1635 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1636}
1637
1638/// Fold icmp (and (sh X, Y), C2), C1.
1641 const APInt &C1,
1642 const APInt &C2) {
1643 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1644 if (!Shift || !Shift->isShift())
1645 return nullptr;
1646
1647 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1648 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1649 // code produced by the clang front-end, for bitfield access.
1650 // This seemingly simple opportunity to fold away a shift turns out to be
1651 // rather complicated. See PR17827 for details.
1652 unsigned ShiftOpcode = Shift->getOpcode();
1653 bool IsShl = ShiftOpcode == Instruction::Shl;
1654 const APInt *C3;
1655 if (match(Shift->getOperand(1), m_APInt(C3))) {
1656 APInt NewAndCst, NewCmpCst;
1657 bool AnyCmpCstBitsShiftedOut;
1658 if (ShiftOpcode == Instruction::Shl) {
1659 // For a left shift, we can fold if the comparison is not signed. We can
1660 // also fold a signed comparison if the mask value and comparison value
1661 // are not negative. These constraints may not be obvious, but we can
1662 // prove that they are correct using an SMT solver.
1663 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1664 return nullptr;
1665
1666 NewCmpCst = C1.lshr(*C3);
1667 NewAndCst = C2.lshr(*C3);
1668 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1669 } else if (ShiftOpcode == Instruction::LShr) {
1670 // For a logical right shift, we can fold if the comparison is not signed.
1671 // We can also fold a signed comparison if the shifted mask value and the
1672 // shifted comparison value are not negative. These constraints may not be
1673 // obvious, but we can prove that they are correct using an SMT solver.
1674 NewCmpCst = C1.shl(*C3);
1675 NewAndCst = C2.shl(*C3);
1676 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1677 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1678 return nullptr;
1679 } else {
1680 // For an arithmetic shift, check that both constants don't use (in a
1681 // signed sense) the top bits being shifted out.
1682 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1683 NewCmpCst = C1.shl(*C3);
1684 NewAndCst = C2.shl(*C3);
1685 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1686 if (NewAndCst.ashr(*C3) != C2)
1687 return nullptr;
1688 }
1689
1690 if (AnyCmpCstBitsShiftedOut) {
1691 // If we shifted bits out, the fold is not going to work out. As a
1692 // special case, check to see if this means that the result is always
1693 // true or false now.
1694 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1695 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1696 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1697 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1698 } else {
1699 Value *NewAnd = Builder.CreateAnd(
1700 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1701 return new ICmpInst(Cmp.getPredicate(),
1702 NewAnd, ConstantInt::get(And->getType(), NewCmpCst));
1703 }
1704 }
1705
1706 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1707 // preferable because it allows the C2 << Y expression to be hoisted out of a
1708 // loop if Y is invariant and X is not.
1709 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1710 !Shift->isArithmeticShift() && !isa<Constant>(Shift->getOperand(0))) {
1711 // Compute C2 << Y.
1712 Value *NewShift =
1713 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1714 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1715
1716 // Compute X & (C2 << Y).
1717 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1718 return replaceOperand(Cmp, 0, NewAnd);
1719 }
1720
1721 return nullptr;
1722}
1723
1724/// Fold icmp (and X, C2), C1.
1727 const APInt &C1) {
1728 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1729
1730 // For vectors: icmp ne (and X, 1), 0 --> trunc X to N x i1
1731 // TODO: We canonicalize to the longer form for scalars because we have
1732 // better analysis/folds for icmp, and codegen may be better with icmp.
1733 if (isICMP_NE && Cmp.getType()->isVectorTy() && C1.isZero() &&
1734 match(And->getOperand(1), m_One()))
1735 return new TruncInst(And->getOperand(0), Cmp.getType());
1736
1737 const APInt *C2;
1738 Value *X;
1739 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1740 return nullptr;
1741
1742 // Don't perform the following transforms if the AND has multiple uses
1743 if (!And->hasOneUse())
1744 return nullptr;
1745
1746 if (Cmp.isEquality() && C1.isZero()) {
1747 // Restrict this fold to single-use 'and' (PR10267).
1748 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1749 if (C2->isSignMask()) {
1750 Constant *Zero = Constant::getNullValue(X->getType());
1751 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1752 return new ICmpInst(NewPred, X, Zero);
1753 }
1754
1755 APInt NewC2 = *C2;
1756 KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
1757 // Set high zeros of C2 to allow matching negated power-of-2.
1758 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1759 Know.countMinLeadingZeros());
1760
1761 // Restrict this fold only for single-use 'and' (PR10267).
1762 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1763 if (NewC2.isNegatedPowerOf2()) {
1764 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1765 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1766 return new ICmpInst(NewPred, X, NegBOC);
1767 }
1768 }
1769
1770 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1771 // the input width without changing the value produced, eliminate the cast:
1772 //
1773 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1774 //
1775 // We can do this transformation if the constants do not have their sign bits
1776 // set or if it is an equality comparison. Extending a relational comparison
1777 // when we're checking the sign bit would not work.
1778 Value *W;
1779 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1780 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1781 // TODO: Is this a good transform for vectors? Wider types may reduce
1782 // throughput. Should this transform be limited (even for scalars) by using
1783 // shouldChangeType()?
1784 if (!Cmp.getType()->isVectorTy()) {
1785 Type *WideType = W->getType();
1786 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1787 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1788 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1789 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1790 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1791 }
1792 }
1793
1794 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1795 return I;
1796
1797 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1798 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1799 //
1800 // iff pred isn't signed
1801 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1802 match(And->getOperand(1), m_One())) {
1803 Constant *One = cast<Constant>(And->getOperand(1));
1804 Value *Or = And->getOperand(0);
1805 Value *A, *B, *LShr;
1806 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1807 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1808 unsigned UsesRemoved = 0;
1809 if (And->hasOneUse())
1810 ++UsesRemoved;
1811 if (Or->hasOneUse())
1812 ++UsesRemoved;
1813 if (LShr->hasOneUse())
1814 ++UsesRemoved;
1815
1816 // Compute A & ((1 << B) | 1)
1817 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1818 if (UsesRemoved >= RequireUsesRemoved) {
1819 Value *NewOr =
1820 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1821 /*HasNUW=*/true),
1822 One, Or->getName());
1823 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1824 return replaceOperand(Cmp, 0, NewAnd);
1825 }
1826 }
1827 }
1828
1829 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1830 // llvm.is.fpclass(X, fcInf|fcNan)
1831 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1832 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1833 Value *V;
1834 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1835 Attribute::NoImplicitFloat) &&
1836 Cmp.isEquality() &&
1838 Type *FPType = V->getType()->getScalarType();
1839 if (FPType->isIEEELikeFPTy() && C1 == *C2) {
1840 APInt ExponentMask =
1842 if (C1 == ExponentMask) {
1843 unsigned Mask = FPClassTest::fcNan | FPClassTest::fcInf;
1844 if (isICMP_NE)
1845 Mask = ~Mask & fcAllFlags;
1846 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1847 }
1848 }
1849 }
1850
1851 return nullptr;
1852}
1853
1854/// Fold icmp (and X, Y), C.
1857 const APInt &C) {
1858 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1859 return I;
1860
1861 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1862 bool TrueIfNeg;
1863 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1864 // ((X - 1) & ~X) < 0 --> X == 0
1865 // ((X - 1) & ~X) >= 0 --> X != 0
1866 Value *X;
1867 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1868 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1869 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1870 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1871 }
1872 // (X & -X) < 0 --> X == MinSignedC
1873 // (X & -X) > -1 --> X != MinSignedC
1874 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1875 Constant *MinSignedC = ConstantInt::get(
1876 X->getType(),
1877 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1878 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1879 return new ICmpInst(NewPred, X, MinSignedC);
1880 }
1881 }
1882
1883 // TODO: These all require that Y is constant too, so refactor with the above.
1884
1885 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1886 Value *X = And->getOperand(0);
1887 Value *Y = And->getOperand(1);
1888 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1889 if (auto *LI = dyn_cast<LoadInst>(X))
1890 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1891 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
1892 if (Instruction *Res =
1893 foldCmpLoadFromIndexedGlobal(LI, GEP, GV, Cmp, C2))
1894 return Res;
1895
1896 if (!Cmp.isEquality())
1897 return nullptr;
1898
1899 // X & -C == -C -> X > u ~C
1900 // X & -C != -C -> X <= u ~C
1901 // iff C is a power of 2
1902 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1903 auto NewPred =
1905 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1906 }
1907
1908 // If we are testing the intersection of 2 select-of-nonzero-constants with no
1909 // common bits set, it's the same as checking if exactly one select condition
1910 // is set:
1911 // ((A ? TC : FC) & (B ? TC : FC)) == 0 --> xor A, B
1912 // ((A ? TC : FC) & (B ? TC : FC)) != 0 --> not(xor A, B)
1913 // TODO: Generalize for non-constant values.
1914 // TODO: Handle signed/unsigned predicates.
1915 // TODO: Handle other bitwise logic connectors.
1916 // TODO: Extend to handle a non-zero compare constant.
1917 if (C.isZero() && (Pred == CmpInst::ICMP_EQ || And->hasOneUse())) {
1918 assert(Cmp.isEquality() && "Not expecting non-equality predicates");
1919 Value *A, *B;
1920 const APInt *TC, *FC;
1921 if (match(X, m_Select(m_Value(A), m_APInt(TC), m_APInt(FC))) &&
1922 match(Y,
1923 m_Select(m_Value(B), m_SpecificInt(*TC), m_SpecificInt(*FC))) &&
1924 !TC->isZero() && !FC->isZero() && !TC->intersects(*FC)) {
1925 Value *R = Builder.CreateXor(A, B);
1926 if (Pred == CmpInst::ICMP_NE)
1927 R = Builder.CreateNot(R);
1928 return replaceInstUsesWith(Cmp, R);
1929 }
1930 }
1931
1932 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1933 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1934 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1935 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1937 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1938 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1939 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1940 Value *And = Builder.CreateAnd(TruncY, X);
1942 }
1943 return BinaryOperator::CreateAnd(TruncY, X);
1944 }
1945
1946 // (icmp eq/ne (and (shl -1, X), Y), 0)
1947 // -> (icmp eq/ne (lshr Y, X), 0)
1948 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1949 // highly unlikely the non-zero case will ever show up in code.
1950 if (C.isZero() &&
1952 m_Value(Y))))) {
1953 Value *LShr = Builder.CreateLShr(Y, X);
1954 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
1955 }
1956
1957 return nullptr;
1958}
1959
1960/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
1962 InstCombiner::BuilderTy &Builder) {
1963 // Are we using xors or subs to bitwise check for a pair or pairs of
1964 // (in)equalities? Convert to a shorter form that has more potential to be
1965 // folded even further.
1966 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
1967 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
1968 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
1969 // (X1 == X2) && (X3 == X4) && (X5 == X6)
1970 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
1971 // (X1 != X2) || (X3 != X4) || (X5 != X6)
1973 SmallVector<Value *, 16> WorkList(1, Or);
1974
1975 while (!WorkList.empty()) {
1976 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
1977 Value *Lhs, *Rhs;
1978
1979 if (match(OrOperatorArgument,
1980 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
1981 CmpValues.emplace_back(Lhs, Rhs);
1982 return;
1983 }
1984
1985 if (match(OrOperatorArgument,
1986 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
1987 CmpValues.emplace_back(Lhs, Rhs);
1988 return;
1989 }
1990
1991 WorkList.push_back(OrOperatorArgument);
1992 };
1993
1994 Value *CurrentValue = WorkList.pop_back_val();
1995 Value *OrOperatorLhs, *OrOperatorRhs;
1996
1997 if (!match(CurrentValue,
1998 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
1999 return nullptr;
2000 }
2001
2002 MatchOrOperatorArgument(OrOperatorRhs);
2003 MatchOrOperatorArgument(OrOperatorLhs);
2004 }
2005
2006 ICmpInst::Predicate Pred = Cmp.getPredicate();
2007 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2008 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2009 CmpValues.rbegin()->second);
2010
2011 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2012 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2013 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2014 }
2015
2016 return LhsCmp;
2017}
2018
2019/// Fold icmp (or X, Y), C.
2022 const APInt &C) {
2023 ICmpInst::Predicate Pred = Cmp.getPredicate();
2024 if (C.isOne()) {
2025 // icmp slt signum(V) 1 --> icmp slt V, 1
2026 Value *V = nullptr;
2027 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2028 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2029 ConstantInt::get(V->getType(), 1));
2030 }
2031
2032 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2033
2034 // (icmp eq/ne (or disjoint x, C0), C1)
2035 // -> (icmp eq/ne x, C0^C1)
2036 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2037 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2038 Value *NewC =
2039 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2040 return new ICmpInst(Pred, OrOp0, NewC);
2041 }
2042
2043 const APInt *MaskC;
2044 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2045 if (*MaskC == C && (C + 1).isPowerOf2()) {
2046 // X | C == C --> X <=u C
2047 // X | C != C --> X >u C
2048 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2050 return new ICmpInst(Pred, OrOp0, OrOp1);
2051 }
2052
2053 // More general: canonicalize 'equality with set bits mask' to
2054 // 'equality with clear bits mask'.
2055 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2056 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2057 if (Or->hasOneUse()) {
2058 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2059 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2060 return new ICmpInst(Pred, And, NewC);
2061 }
2062 }
2063
2064 // (X | (X-1)) s< 0 --> X s< 1
2065 // (X | (X-1)) s> -1 --> X s> 0
2066 Value *X;
2067 bool TrueIfSigned;
2068 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2070 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2071 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2072 return new ICmpInst(NewPred, X, NewC);
2073 }
2074
2075 const APInt *OrC;
2076 // icmp(X | OrC, C) --> icmp(X, 0)
2077 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2078 switch (Pred) {
2079 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2080 case ICmpInst::ICMP_SLT:
2081 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2082 case ICmpInst::ICMP_SGE:
2083 if (OrC->sge(C))
2084 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2085 break;
2086 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2087 case ICmpInst::ICMP_SLE:
2088 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2089 case ICmpInst::ICMP_SGT:
2090 if (OrC->sgt(C))
2092 ConstantInt::getNullValue(X->getType()));
2093 break;
2094 default:
2095 break;
2096 }
2097 }
2098
2099 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2100 return nullptr;
2101
2102 Value *P, *Q;
2104 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2105 // -> and (icmp eq P, null), (icmp eq Q, null).
2106 Value *CmpP =
2107 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2108 Value *CmpQ =
2110 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2111 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2112 }
2113
2114 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2115 return replaceInstUsesWith(Cmp, V);
2116
2117 return nullptr;
2118}
2119
2120/// Fold icmp (mul X, Y), C.
2123 const APInt &C) {
2124 ICmpInst::Predicate Pred = Cmp.getPredicate();
2125 Type *MulTy = Mul->getType();
2126 Value *X = Mul->getOperand(0);
2127
2128 // If there's no overflow:
2129 // X * X == 0 --> X == 0
2130 // X * X != 0 --> X != 0
2131 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2132 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2133 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2134
2135 const APInt *MulC;
2136 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2137 return nullptr;
2138
2139 // If this is a test of the sign bit and the multiply is sign-preserving with
2140 // a constant operand, use the multiply LHS operand instead:
2141 // (X * +MulC) < 0 --> X < 0
2142 // (X * -MulC) < 0 --> X > 0
2143 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2144 if (MulC->isNegative())
2145 Pred = ICmpInst::getSwappedPredicate(Pred);
2146 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2147 }
2148
2149 if (MulC->isZero())
2150 return nullptr;
2151
2152 // If the multiply does not wrap or the constant is odd, try to divide the
2153 // compare constant by the multiplication factor.
2154 if (Cmp.isEquality()) {
2155 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2156 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2157 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2158 return new ICmpInst(Pred, X, NewC);
2159 }
2160
2161 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2162 // correct to transform if MulC * N == C including overflow. I.e with i8
2163 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2164 // miss that case.
2165 if (C.urem(*MulC).isZero()) {
2166 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2167 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2168 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2169 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2170 return new ICmpInst(Pred, X, NewC);
2171 }
2172 }
2173 }
2174
2175 // With a matching no-overflow guarantee, fold the constants:
2176 // (X * MulC) < C --> X < (C / MulC)
2177 // (X * MulC) > C --> X > (C / MulC)
2178 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2179 Constant *NewC = nullptr;
2180 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2181 // MININT / -1 --> overflow.
2182 if (C.isMinSignedValue() && MulC->isAllOnes())
2183 return nullptr;
2184 if (MulC->isNegative())
2185 Pred = ICmpInst::getSwappedPredicate(Pred);
2186
2187 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2188 NewC = ConstantInt::get(
2190 } else {
2191 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2192 "Unexpected predicate");
2193 NewC = ConstantInt::get(
2195 }
2196 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2197 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2198 NewC = ConstantInt::get(
2200 } else {
2201 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2202 "Unexpected predicate");
2203 NewC = ConstantInt::get(
2205 }
2206 }
2207
2208 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2209}
2210
2211/// Fold icmp (shl 1, Y), C.
2213 const APInt &C) {
2214 Value *Y;
2215 if (!match(Shl, m_Shl(m_One(), m_Value(Y))))
2216 return nullptr;
2217
2218 Type *ShiftType = Shl->getType();
2219 unsigned TypeBits = C.getBitWidth();
2220 bool CIsPowerOf2 = C.isPowerOf2();
2221 ICmpInst::Predicate Pred = Cmp.getPredicate();
2222 if (Cmp.isUnsigned()) {
2223 // (1 << Y) pred C -> Y pred Log2(C)
2224 if (!CIsPowerOf2) {
2225 // (1 << Y) < 30 -> Y <= 4
2226 // (1 << Y) <= 30 -> Y <= 4
2227 // (1 << Y) >= 30 -> Y > 4
2228 // (1 << Y) > 30 -> Y > 4
2229 if (Pred == ICmpInst::ICMP_ULT)
2230 Pred = ICmpInst::ICMP_ULE;
2231 else if (Pred == ICmpInst::ICMP_UGE)
2232 Pred = ICmpInst::ICMP_UGT;
2233 }
2234
2235 unsigned CLog2 = C.logBase2();
2236 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2237 } else if (Cmp.isSigned()) {
2238 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2239 // (1 << Y) > 0 -> Y != 31
2240 // (1 << Y) > C -> Y != 31 if C is negative.
2241 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2242 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2243
2244 // (1 << Y) < 0 -> Y == 31
2245 // (1 << Y) < 1 -> Y == 31
2246 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2247 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2248 if (Pred == ICmpInst::ICMP_SLT && (C-1).sle(0))
2249 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2250 }
2251
2252 return nullptr;
2253}
2254
2255/// Fold icmp (shl X, Y), C.
2257 BinaryOperator *Shl,
2258 const APInt &C) {
2259 const APInt *ShiftVal;
2260 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2261 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2262
2263 ICmpInst::Predicate Pred = Cmp.getPredicate();
2264 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2265 // -> (icmp pred X, Csle0)
2266 //
2267 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2268 // so X's must be what is used.
2269 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2270 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2271
2272 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2273 // -> (icmp eq/ne X, 0)
2274 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2275 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2276 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2277
2278 // (icmp slt (shl nsw X, Y), 0/1)
2279 // -> (icmp slt X, 0/1)
2280 // (icmp sgt (shl nsw X, Y), 0/-1)
2281 // -> (icmp sgt X, 0/-1)
2282 //
2283 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2284 if (Shl->hasNoSignedWrap() &&
2285 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2286 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2287 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2288
2289 const APInt *ShiftAmt;
2290 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2291 return foldICmpShlOne(Cmp, Shl, C);
2292
2293 // Check that the shift amount is in range. If not, don't perform undefined
2294 // shifts. When the shift is visited, it will be simplified.
2295 unsigned TypeBits = C.getBitWidth();
2296 if (ShiftAmt->uge(TypeBits))
2297 return nullptr;
2298
2299 Value *X = Shl->getOperand(0);
2300 Type *ShType = Shl->getType();
2301
2302 // NSW guarantees that we are only shifting out sign bits from the high bits,
2303 // so we can ASHR the compare constant without needing a mask and eliminate
2304 // the shift.
2305 if (Shl->hasNoSignedWrap()) {
2306 if (Pred == ICmpInst::ICMP_SGT) {
2307 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2308 APInt ShiftedC = C.ashr(*ShiftAmt);
2309 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2310 }
2311 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2312 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2313 APInt ShiftedC = C.ashr(*ShiftAmt);
2314 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2315 }
2316 if (Pred == ICmpInst::ICMP_SLT) {
2317 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2318 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2319 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2320 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2321 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2322 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2323 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2324 }
2325 }
2326
2327 // NUW guarantees that we are only shifting out zero bits from the high bits,
2328 // so we can LSHR the compare constant without needing a mask and eliminate
2329 // the shift.
2330 if (Shl->hasNoUnsignedWrap()) {
2331 if (Pred == ICmpInst::ICMP_UGT) {
2332 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2333 APInt ShiftedC = C.lshr(*ShiftAmt);
2334 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2335 }
2336 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2337 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2338 APInt ShiftedC = C.lshr(*ShiftAmt);
2339 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2340 }
2341 if (Pred == ICmpInst::ICMP_ULT) {
2342 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2343 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2344 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2345 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2346 assert(C.ugt(0) && "ult 0 should have been eliminated");
2347 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2348 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2349 }
2350 }
2351
2352 if (Cmp.isEquality() && Shl->hasOneUse()) {
2353 // Strength-reduce the shift into an 'and'.
2354 Constant *Mask = ConstantInt::get(
2355 ShType,
2356 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2357 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2358 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2359 return new ICmpInst(Pred, And, LShrC);
2360 }
2361
2362 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2363 bool TrueIfSigned = false;
2364 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2365 // (X << 31) <s 0 --> (X & 1) != 0
2366 Constant *Mask = ConstantInt::get(
2367 ShType,
2368 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2369 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2370 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2371 And, Constant::getNullValue(ShType));
2372 }
2373
2374 // Simplify 'shl' inequality test into 'and' equality test.
2375 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2376 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2377 if ((C + 1).isPowerOf2() &&
2378 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2379 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2380 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2382 And, Constant::getNullValue(ShType));
2383 }
2384 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2385 if (C.isPowerOf2() &&
2386 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2387 Value *And =
2388 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2389 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2391 And, Constant::getNullValue(ShType));
2392 }
2393 }
2394
2395 // Transform (icmp pred iM (shl iM %v, N), C)
2396 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2397 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2398 // This enables us to get rid of the shift in favor of a trunc that may be
2399 // free on the target. It has the additional benefit of comparing to a
2400 // smaller constant that may be more target-friendly.
2401 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2402 if (Shl->hasOneUse() && Amt != 0 && C.countr_zero() >= Amt &&
2403 DL.isLegalInteger(TypeBits - Amt)) {
2404 Type *TruncTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt);
2405 if (auto *ShVTy = dyn_cast<VectorType>(ShType))
2406 TruncTy = VectorType::get(TruncTy, ShVTy->getElementCount());
2407 Constant *NewC =
2408 ConstantInt::get(TruncTy, C.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2409 return new ICmpInst(Pred, Builder.CreateTrunc(X, TruncTy), NewC);
2410 }
2411
2412 return nullptr;
2413}
2414
2415/// Fold icmp ({al}shr X, Y), C.
2417 BinaryOperator *Shr,
2418 const APInt &C) {
2419 // An exact shr only shifts out zero bits, so:
2420 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2421 Value *X = Shr->getOperand(0);
2422 CmpInst::Predicate Pred = Cmp.getPredicate();
2423 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2424 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2425
2426 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2427 const APInt *ShiftValC;
2428 if (match(X, m_APInt(ShiftValC))) {
2429 if (Cmp.isEquality())
2430 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2431
2432 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2433 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2434 bool TrueIfSigned;
2435 if (!IsAShr && ShiftValC->isNegative() &&
2436 isSignBitCheck(Pred, C, TrueIfSigned))
2437 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2438 Shr->getOperand(1),
2439 ConstantInt::getNullValue(X->getType()));
2440
2441 // If the shifted constant is a power-of-2, test the shift amount directly:
2442 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2443 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2444 if (!IsAShr && ShiftValC->isPowerOf2() &&
2445 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2446 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2447 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2448 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2449
2450 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2451 unsigned ShiftLZ = ShiftValC->countl_zero();
2452 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2453 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2454 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2455 }
2456 }
2457
2458 const APInt *ShiftAmtC;
2459 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2460 return nullptr;
2461
2462 // Check that the shift amount is in range. If not, don't perform undefined
2463 // shifts. When the shift is visited it will be simplified.
2464 unsigned TypeBits = C.getBitWidth();
2465 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2466 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2467 return nullptr;
2468
2469 bool IsExact = Shr->isExact();
2470 Type *ShrTy = Shr->getType();
2471 // TODO: If we could guarantee that InstSimplify would handle all of the
2472 // constant-value-based preconditions in the folds below, then we could assert
2473 // those conditions rather than checking them. This is difficult because of
2474 // undef/poison (PR34838).
2475 if (IsAShr && Shr->hasOneUse()) {
2476 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2477 // When ShAmtC can be shifted losslessly:
2478 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2479 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2480 APInt ShiftedC = C.shl(ShAmtVal);
2481 if (ShiftedC.ashr(ShAmtVal) == C)
2482 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2483 }
2484 if (Pred == CmpInst::ICMP_SGT) {
2485 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2486 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2487 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2488 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2489 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2490 }
2491 if (Pred == CmpInst::ICMP_UGT) {
2492 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2493 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2494 // clause accounts for that pattern.
2495 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2496 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2497 (C + 1).shl(ShAmtVal).isMinSignedValue())
2498 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2499 }
2500
2501 // If the compare constant has significant bits above the lowest sign-bit,
2502 // then convert an unsigned cmp to a test of the sign-bit:
2503 // (ashr X, ShiftC) u> C --> X s< 0
2504 // (ashr X, ShiftC) u< C --> X s> -1
2505 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2506 if (Pred == CmpInst::ICMP_UGT) {
2507 return new ICmpInst(CmpInst::ICMP_SLT, X,
2509 }
2510 if (Pred == CmpInst::ICMP_ULT) {
2511 return new ICmpInst(CmpInst::ICMP_SGT, X,
2513 }
2514 }
2515 } else if (!IsAShr) {
2516 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2517 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2518 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2519 APInt ShiftedC = C.shl(ShAmtVal);
2520 if (ShiftedC.lshr(ShAmtVal) == C)
2521 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2522 }
2523 if (Pred == CmpInst::ICMP_UGT) {
2524 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2525 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2526 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2527 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2528 }
2529 }
2530
2531 if (!Cmp.isEquality())
2532 return nullptr;
2533
2534 // Handle equality comparisons of shift-by-constant.
2535
2536 // If the comparison constant changes with the shift, the comparison cannot
2537 // succeed (bits of the comparison constant cannot match the shifted value).
2538 // This should be known by InstSimplify and already be folded to true/false.
2539 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2540 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2541 "Expected icmp+shr simplify did not occur.");
2542
2543 // If the bits shifted out are known zero, compare the unshifted value:
2544 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2545 if (Shr->isExact())
2546 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2547
2548 if (C.isZero()) {
2549 // == 0 is u< 1.
2550 if (Pred == CmpInst::ICMP_EQ)
2551 return new ICmpInst(CmpInst::ICMP_ULT, X,
2552 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal)));
2553 else
2554 return new ICmpInst(CmpInst::ICMP_UGT, X,
2555 ConstantInt::get(ShrTy, (C + 1).shl(ShAmtVal) - 1));
2556 }
2557
2558 if (Shr->hasOneUse()) {
2559 // Canonicalize the shift into an 'and':
2560 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2561 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2562 Constant *Mask = ConstantInt::get(ShrTy, Val);
2563 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2564 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2565 }
2566
2567 return nullptr;
2568}
2569
2571 BinaryOperator *SRem,
2572 const APInt &C) {
2573 // Match an 'is positive' or 'is negative' comparison of remainder by a
2574 // constant power-of-2 value:
2575 // (X % pow2C) sgt/slt 0
2576 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2577 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2578 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2579 return nullptr;
2580
2581 // TODO: The one-use check is standard because we do not typically want to
2582 // create longer instruction sequences, but this might be a special-case
2583 // because srem is not good for analysis or codegen.
2584 if (!SRem->hasOneUse())
2585 return nullptr;
2586
2587 const APInt *DivisorC;
2588 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2589 return nullptr;
2590
2591 // For cmp_sgt/cmp_slt only zero valued C is handled.
2592 // For cmp_eq/cmp_ne only positive valued C is handled.
2593 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2594 !C.isZero()) ||
2595 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2596 !C.isStrictlyPositive()))
2597 return nullptr;
2598
2599 // Mask off the sign bit and the modulo bits (low-bits).
2600 Type *Ty = SRem->getType();
2602 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2603 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2604
2605 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2606 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2607
2608 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2609 // bit is set. Example:
2610 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2611 if (Pred == ICmpInst::ICMP_SGT)
2613
2614 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2615 // bit is set. Example:
2616 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2617 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2618}
2619
2620/// Fold icmp (udiv X, Y), C.
2622 BinaryOperator *UDiv,
2623 const APInt &C) {
2624 ICmpInst::Predicate Pred = Cmp.getPredicate();
2625 Value *X = UDiv->getOperand(0);
2626 Value *Y = UDiv->getOperand(1);
2627 Type *Ty = UDiv->getType();
2628
2629 const APInt *C2;
2630 if (!match(X, m_APInt(C2)))
2631 return nullptr;
2632
2633 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2634
2635 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2636 if (Pred == ICmpInst::ICMP_UGT) {
2637 assert(!C.isMaxValue() &&
2638 "icmp ugt X, UINT_MAX should have been simplified already.");
2639 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2640 ConstantInt::get(Ty, C2->udiv(C + 1)));
2641 }
2642
2643 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2644 if (Pred == ICmpInst::ICMP_ULT) {
2645 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2646 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2647 ConstantInt::get(Ty, C2->udiv(C)));
2648 }
2649
2650 return nullptr;
2651}
2652
2653/// Fold icmp ({su}div X, Y), C.
2655 BinaryOperator *Div,
2656 const APInt &C) {
2657 ICmpInst::Predicate Pred = Cmp.getPredicate();
2658 Value *X = Div->getOperand(0);
2659 Value *Y = Div->getOperand(1);
2660 Type *Ty = Div->getType();
2661 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2662
2663 // If unsigned division and the compare constant is bigger than
2664 // UMAX/2 (negative), there's only one pair of values that satisfies an
2665 // equality check, so eliminate the division:
2666 // (X u/ Y) == C --> (X == C) && (Y == 1)
2667 // (X u/ Y) != C --> (X != C) || (Y != 1)
2668 // Similarly, if signed division and the compare constant is exactly SMIN:
2669 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2670 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2671 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2672 (!DivIsSigned || C.isMinSignedValue())) {
2673 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2674 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2675 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2676 return BinaryOperator::Create(Logic, XBig, YOne);
2677 }
2678
2679 // Fold: icmp pred ([us]div X, C2), C -> range test
2680 // Fold this div into the comparison, producing a range check.
2681 // Determine, based on the divide type, what the range is being
2682 // checked. If there is an overflow on the low or high side, remember
2683 // it, otherwise compute the range [low, hi) bounding the new value.
2684 // See: InsertRangeTest above for the kinds of replacements possible.
2685 const APInt *C2;
2686 if (!match(Y, m_APInt(C2)))
2687 return nullptr;
2688
2689 // FIXME: If the operand types don't match the type of the divide
2690 // then don't attempt this transform. The code below doesn't have the
2691 // logic to deal with a signed divide and an unsigned compare (and
2692 // vice versa). This is because (x /s C2) <s C produces different
2693 // results than (x /s C2) <u C or (x /u C2) <s C or even
2694 // (x /u C2) <u C. Simply casting the operands and result won't
2695 // work. :( The if statement below tests that condition and bails
2696 // if it finds it.
2697 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2698 return nullptr;
2699
2700 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2701 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2702 // division-by-constant cases should be present, we can not assert that they
2703 // have happened before we reach this icmp instruction.
2704 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2705 return nullptr;
2706
2707 // Compute Prod = C * C2. We are essentially solving an equation of
2708 // form X / C2 = C. We solve for X by multiplying C2 and C.
2709 // By solving for X, we can turn this into a range check instead of computing
2710 // a divide.
2711 APInt Prod = C * *C2;
2712
2713 // Determine if the product overflows by seeing if the product is not equal to
2714 // the divide. Make sure we do the same kind of divide as in the LHS
2715 // instruction that we're folding.
2716 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2717
2718 // If the division is known to be exact, then there is no remainder from the
2719 // divide, so the covered range size is unit, otherwise it is the divisor.
2720 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2721
2722 // Figure out the interval that is being checked. For example, a comparison
2723 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2724 // Compute this interval based on the constants involved and the signedness of
2725 // the compare/divide. This computes a half-open interval, keeping track of
2726 // whether either value in the interval overflows. After analysis each
2727 // overflow variable is set to 0 if it's corresponding bound variable is valid
2728 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2729 int LoOverflow = 0, HiOverflow = 0;
2730 APInt LoBound, HiBound;
2731
2732 if (!DivIsSigned) { // udiv
2733 // e.g. X/5 op 3 --> [15, 20)
2734 LoBound = Prod;
2735 HiOverflow = LoOverflow = ProdOV;
2736 if (!HiOverflow) {
2737 // If this is not an exact divide, then many values in the range collapse
2738 // to the same result value.
2739 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2740 }
2741 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2742 if (C.isZero()) { // (X / pos) op 0
2743 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2744 LoBound = -(RangeSize - 1);
2745 HiBound = RangeSize;
2746 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2747 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2748 HiOverflow = LoOverflow = ProdOV;
2749 if (!HiOverflow)
2750 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2751 } else { // (X / pos) op neg
2752 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2753 HiBound = Prod + 1;
2754 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2755 if (!LoOverflow) {
2756 APInt DivNeg = -RangeSize;
2757 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2758 }
2759 }
2760 } else if (C2->isNegative()) { // Divisor is < 0.
2761 if (Div->isExact())
2762 RangeSize.negate();
2763 if (C.isZero()) { // (X / neg) op 0
2764 // e.g. X/-5 op 0 --> [-4, 5)
2765 LoBound = RangeSize + 1;
2766 HiBound = -RangeSize;
2767 if (HiBound == *C2) { // -INTMIN = INTMIN
2768 HiOverflow = 1; // [INTMIN+1, overflow)
2769 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2770 }
2771 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2772 // e.g. X/-5 op 3 --> [-19, -14)
2773 HiBound = Prod + 1;
2774 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2775 if (!LoOverflow)
2776 LoOverflow =
2777 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2778 } else { // (X / neg) op neg
2779 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2780 LoOverflow = HiOverflow = ProdOV;
2781 if (!HiOverflow)
2782 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2783 }
2784
2785 // Dividing by a negative swaps the condition. LT <-> GT
2786 Pred = ICmpInst::getSwappedPredicate(Pred);
2787 }
2788
2789 switch (Pred) {
2790 default:
2791 llvm_unreachable("Unhandled icmp predicate!");
2792 case ICmpInst::ICMP_EQ:
2793 if (LoOverflow && HiOverflow)
2794 return replaceInstUsesWith(Cmp, Builder.getFalse());
2795 if (HiOverflow)
2796 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2797 X, ConstantInt::get(Ty, LoBound));
2798 if (LoOverflow)
2799 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2800 X, ConstantInt::get(Ty, HiBound));
2801 return replaceInstUsesWith(
2802 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2803 case ICmpInst::ICMP_NE:
2804 if (LoOverflow && HiOverflow)
2805 return replaceInstUsesWith(Cmp, Builder.getTrue());
2806 if (HiOverflow)
2807 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2808 X, ConstantInt::get(Ty, LoBound));
2809 if (LoOverflow)
2810 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2811 X, ConstantInt::get(Ty, HiBound));
2812 return replaceInstUsesWith(
2813 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2814 case ICmpInst::ICMP_ULT:
2815 case ICmpInst::ICMP_SLT:
2816 if (LoOverflow == +1) // Low bound is greater than input range.
2817 return replaceInstUsesWith(Cmp, Builder.getTrue());
2818 if (LoOverflow == -1) // Low bound is less than input range.
2819 return replaceInstUsesWith(Cmp, Builder.getFalse());
2820 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2821 case ICmpInst::ICMP_UGT:
2822 case ICmpInst::ICMP_SGT:
2823 if (HiOverflow == +1) // High bound greater than input range.
2824 return replaceInstUsesWith(Cmp, Builder.getFalse());
2825 if (HiOverflow == -1) // High bound less than input range.
2826 return replaceInstUsesWith(Cmp, Builder.getTrue());
2827 if (Pred == ICmpInst::ICMP_UGT)
2828 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2829 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2830 }
2831
2832 return nullptr;
2833}
2834
2835/// Fold icmp (sub X, Y), C.
2837 BinaryOperator *Sub,
2838 const APInt &C) {
2839 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2840 ICmpInst::Predicate Pred = Cmp.getPredicate();
2841 Type *Ty = Sub->getType();
2842
2843 // (SubC - Y) == C) --> Y == (SubC - C)
2844 // (SubC - Y) != C) --> Y != (SubC - C)
2845 Constant *SubC;
2846 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2847 return new ICmpInst(Pred, Y,
2848 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2849 }
2850
2851 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2852 const APInt *C2;
2853 APInt SubResult;
2854 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2855 bool HasNSW = Sub->hasNoSignedWrap();
2856 bool HasNUW = Sub->hasNoUnsignedWrap();
2857 if (match(X, m_APInt(C2)) &&
2858 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2859 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2860 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2861
2862 // X - Y == 0 --> X == Y.
2863 // X - Y != 0 --> X != Y.
2864 // TODO: We allow this with multiple uses as long as the other uses are not
2865 // in phis. The phi use check is guarding against a codegen regression
2866 // for a loop test. If the backend could undo this (and possibly
2867 // subsequent transforms), we would not need this hack.
2868 if (Cmp.isEquality() && C.isZero() &&
2869 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2870 return new ICmpInst(Pred, X, Y);
2871
2872 // The following transforms are only worth it if the only user of the subtract
2873 // is the icmp.
2874 // TODO: This is an artificial restriction for all of the transforms below
2875 // that only need a single replacement icmp. Can these use the phi test
2876 // like the transform above here?
2877 if (!Sub->hasOneUse())
2878 return nullptr;
2879
2880 if (Sub->hasNoSignedWrap()) {
2881 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
2882 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
2883 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
2884
2885 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
2886 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
2887 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
2888
2889 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
2890 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
2891 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
2892
2893 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
2894 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
2895 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
2896 }
2897
2898 if (!match(X, m_APInt(C2)))
2899 return nullptr;
2900
2901 // C2 - Y <u C -> (Y | (C - 1)) == C2
2902 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
2903 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
2904 (*C2 & (C - 1)) == (C - 1))
2905 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
2906
2907 // C2 - Y >u C -> (Y | C) != C2
2908 // iff C2 & C == C and C + 1 is a power of 2
2909 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
2910 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
2911
2912 // We have handled special cases that reduce.
2913 // Canonicalize any remaining sub to add as:
2914 // (C2 - Y) > C --> (Y + ~C2) < ~C
2915 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
2916 HasNUW, HasNSW);
2917 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
2918}
2919
2920static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
2921 Value *Op1, IRBuilderBase &Builder,
2922 bool HasOneUse) {
2923 auto FoldConstant = [&](bool Val) {
2924 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
2925 if (Op0->getType()->isVectorTy())
2927 cast<VectorType>(Op0->getType())->getElementCount(), Res);
2928 return Res;
2929 };
2930
2931 switch (Table.to_ulong()) {
2932 case 0: // 0 0 0 0
2933 return FoldConstant(false);
2934 case 1: // 0 0 0 1
2935 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
2936 case 2: // 0 0 1 0
2937 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
2938 case 3: // 0 0 1 1
2939 return Builder.CreateNot(Op0);
2940 case 4: // 0 1 0 0
2941 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
2942 case 5: // 0 1 0 1
2943 return Builder.CreateNot(Op1);
2944 case 6: // 0 1 1 0
2945 return Builder.CreateXor(Op0, Op1);
2946 case 7: // 0 1 1 1
2947 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
2948 case 8: // 1 0 0 0
2949 return Builder.CreateAnd(Op0, Op1);
2950 case 9: // 1 0 0 1
2951 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
2952 case 10: // 1 0 1 0
2953 return Op1;
2954 case 11: // 1 0 1 1
2955 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
2956 case 12: // 1 1 0 0
2957 return Op0;
2958 case 13: // 1 1 0 1
2959 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
2960 case 14: // 1 1 1 0
2961 return Builder.CreateOr(Op0, Op1);
2962 case 15: // 1 1 1 1
2963 return FoldConstant(true);
2964 default:
2965 llvm_unreachable("Invalid Operation");
2966 }
2967 return nullptr;
2968}
2969
2970/// Fold icmp (add X, Y), C.
2973 const APInt &C) {
2974 Value *Y = Add->getOperand(1);
2975 Value *X = Add->getOperand(0);
2976
2977 Value *Op0, *Op1;
2978 Instruction *Ext0, *Ext1;
2979 const CmpInst::Predicate Pred = Cmp.getPredicate();
2980 if (match(Add,
2983 m_ZExtOrSExt(m_Value(Op1))))) &&
2984 Op0->getType()->isIntOrIntVectorTy(1) &&
2985 Op1->getType()->isIntOrIntVectorTy(1)) {
2986 unsigned BW = C.getBitWidth();
2987 std::bitset<4> Table;
2988 auto ComputeTable = [&](bool Op0Val, bool Op1Val) {
2989 int Res = 0;
2990 if (Op0Val)
2991 Res += isa<ZExtInst>(Ext0) ? 1 : -1;
2992 if (Op1Val)
2993 Res += isa<ZExtInst>(Ext1) ? 1 : -1;
2994 return ICmpInst::compare(APInt(BW, Res, true), C, Pred);
2995 };
2996
2997 Table[0] = ComputeTable(false, false);
2998 Table[1] = ComputeTable(false, true);
2999 Table[2] = ComputeTable(true, false);
3000 Table[3] = ComputeTable(true, true);
3001 if (auto *Cond =
3002 createLogicFromTable(Table, Op0, Op1, Builder, Add->hasOneUse()))
3003 return replaceInstUsesWith(Cmp, Cond);
3004 }
3005 const APInt *C2;
3006 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3007 return nullptr;
3008
3009 // Fold icmp pred (add X, C2), C.
3010 Type *Ty = Add->getType();
3011
3012 // If the add does not wrap, we can always adjust the compare by subtracting
3013 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3014 // are canonicalized to SGT/SLT/UGT/ULT.
3015 if ((Add->hasNoSignedWrap() &&
3016 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT)) ||
3017 (Add->hasNoUnsignedWrap() &&
3018 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT))) {
3019 bool Overflow;
3020 APInt NewC =
3021 Cmp.isSigned() ? C.ssub_ov(*C2, Overflow) : C.usub_ov(*C2, Overflow);
3022 // If there is overflow, the result must be true or false.
3023 // TODO: Can we assert there is no overflow because InstSimplify always
3024 // handles those cases?
3025 if (!Overflow)
3026 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3027 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3028 }
3029
3030 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3031 const APInt &Upper = CR.getUpper();
3032 const APInt &Lower = CR.getLower();
3033 if (Cmp.isSigned()) {
3034 if (Lower.isSignMask())
3035 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3036 if (Upper.isSignMask())
3037 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3038 } else {
3039 if (Lower.isMinValue())
3040 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3041 if (Upper.isMinValue())
3042 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3043 }
3044
3045 // This set of folds is intentionally placed after folds that use no-wrapping
3046 // flags because those folds are likely better for later analysis/codegen.
3049
3050 // Fold compare with offset to opposite sign compare if it eliminates offset:
3051 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3052 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3053 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3054
3055 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3056 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3057 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3058
3059 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3060 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3061 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3062
3063 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3064 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3065 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3066
3067 // (X + -1) <u C --> X <=u C (if X is never null)
3068 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3069 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3070 if (llvm::isKnownNonZero(X, Q))
3071 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3072 }
3073
3074 if (!Add->hasOneUse())
3075 return nullptr;
3076
3077 // X+C <u C2 -> (X & -C2) == C
3078 // iff C & (C2-1) == 0
3079 // C2 is a power of 2
3080 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3082 ConstantExpr::getNeg(cast<Constant>(Y)));
3083
3084 // X+C >u C2 -> (X & ~C2) != C
3085 // iff C & C2 == 0
3086 // C2+1 is a power of 2
3087 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3089 ConstantExpr::getNeg(cast<Constant>(Y)));
3090
3091 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3092 // to the ult form.
3093 // X+C2 >u C -> X+(C2-C-1) <u ~C
3094 if (Pred == ICmpInst::ICMP_UGT)
3095 return new ICmpInst(ICmpInst::ICMP_ULT,
3096 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3097 ConstantInt::get(Ty, ~C));
3098
3099 return nullptr;
3100}
3101
3103 Value *&RHS, ConstantInt *&Less,
3104 ConstantInt *&Equal,
3105 ConstantInt *&Greater) {
3106 // TODO: Generalize this to work with other comparison idioms or ensure
3107 // they get canonicalized into this form.
3108
3109 // select i1 (a == b),
3110 // i32 Equal,
3111 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3112 // where Equal, Less and Greater are placeholders for any three constants.
3113 ICmpInst::Predicate PredA;
3114 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3115 !ICmpInst::isEquality(PredA))
3116 return false;
3117 Value *EqualVal = SI->getTrueValue();
3118 Value *UnequalVal = SI->getFalseValue();
3119 // We still can get non-canonical predicate here, so canonicalize.
3120 if (PredA == ICmpInst::ICMP_NE)
3121 std::swap(EqualVal, UnequalVal);
3122 if (!match(EqualVal, m_ConstantInt(Equal)))
3123 return false;
3124 ICmpInst::Predicate PredB;
3125 Value *LHS2, *RHS2;
3126 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3127 m_ConstantInt(Less), m_ConstantInt(Greater))))
3128 return false;
3129 // We can get predicate mismatch here, so canonicalize if possible:
3130 // First, ensure that 'LHS' match.
3131 if (LHS2 != LHS) {
3132 // x sgt y <--> y slt x
3133 std::swap(LHS2, RHS2);
3134 PredB = ICmpInst::getSwappedPredicate(PredB);
3135 }
3136 if (LHS2 != LHS)
3137 return false;
3138 // We also need to canonicalize 'RHS'.
3139 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3140 // x sgt C-1 <--> x sge C <--> not(x slt C)
3141 auto FlippedStrictness =
3143 PredB, cast<Constant>(RHS2));
3144 if (!FlippedStrictness)
3145 return false;
3146 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3147 "basic correctness failure");
3148 RHS2 = FlippedStrictness->second;
3149 // And kind-of perform the result swap.
3150 std::swap(Less, Greater);
3151 PredB = ICmpInst::ICMP_SLT;
3152 }
3153 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3154}
3155
3158 ConstantInt *C) {
3159
3160 assert(C && "Cmp RHS should be a constant int!");
3161 // If we're testing a constant value against the result of a three way
3162 // comparison, the result can be expressed directly in terms of the
3163 // original values being compared. Note: We could possibly be more
3164 // aggressive here and remove the hasOneUse test. The original select is
3165 // really likely to simplify or sink when we remove a test of the result.
3166 Value *OrigLHS, *OrigRHS;
3167 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3168 if (Cmp.hasOneUse() &&
3169 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3170 C3GreaterThan)) {
3171 assert(C1LessThan && C2Equal && C3GreaterThan);
3172
3173 bool TrueWhenLessThan =
3174 ConstantExpr::getCompare(Cmp.getPredicate(), C1LessThan, C)
3175 ->isAllOnesValue();
3176 bool TrueWhenEqual =
3177 ConstantExpr::getCompare(Cmp.getPredicate(), C2Equal, C)
3178 ->isAllOnesValue();
3179 bool TrueWhenGreaterThan =
3180 ConstantExpr::getCompare(Cmp.getPredicate(), C3GreaterThan, C)
3181 ->isAllOnesValue();
3182
3183 // This generates the new instruction that will replace the original Cmp
3184 // Instruction. Instead of enumerating the various combinations when
3185 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3186 // false, we rely on chaining of ORs and future passes of InstCombine to
3187 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3188
3189 // When none of the three constants satisfy the predicate for the RHS (C),
3190 // the entire original Cmp can be simplified to a false.
3192 if (TrueWhenLessThan)
3194 OrigLHS, OrigRHS));
3195 if (TrueWhenEqual)
3197 OrigLHS, OrigRHS));
3198 if (TrueWhenGreaterThan)
3200 OrigLHS, OrigRHS));
3201
3202 return replaceInstUsesWith(Cmp, Cond);
3203 }
3204 return nullptr;
3205}
3206
3208 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3209 if (!Bitcast)
3210 return nullptr;
3211
3212 ICmpInst::Predicate Pred = Cmp.getPredicate();
3213 Value *Op1 = Cmp.getOperand(1);
3214 Value *BCSrcOp = Bitcast->getOperand(0);
3215 Type *SrcType = Bitcast->getSrcTy();
3216 Type *DstType = Bitcast->getType();
3217
3218 // Make sure the bitcast doesn't change between scalar and vector and
3219 // doesn't change the number of vector elements.
3220 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3221 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3222 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3223 Value *X;
3224 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3225 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3226 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3227 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3228 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3229 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3230 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3231 match(Op1, m_Zero()))
3232 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3233
3234 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3235 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3236 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3237
3238 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3239 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3240 return new ICmpInst(Pred, X,
3241 ConstantInt::getAllOnesValue(X->getType()));
3242 }
3243
3244 // Zero-equality checks are preserved through unsigned floating-point casts:
3245 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3246 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3247 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3248 if (Cmp.isEquality() && match(Op1, m_Zero()))
3249 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3250
3251 const APInt *C;
3252 bool TrueIfSigned;
3253 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3254 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3255 // the FP extend/truncate because that cast does not change the sign-bit.
3256 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3257 // The sign-bit is always the most significant bit in those types.
3258 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3259 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3260 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3261 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3262 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3263 Type *XType = X->getType();
3264
3265 // We can't currently handle Power style floating point operations here.
3266 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3267 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3268 if (auto *XVTy = dyn_cast<VectorType>(XType))
3269 NewType = VectorType::get(NewType, XVTy->getElementCount());
3270 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3271 if (TrueIfSigned)
3272 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3273 ConstantInt::getNullValue(NewType));
3274 else
3275 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3277 }
3278 }
3279
3280 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3281 Type *FPType = SrcType->getScalarType();
3282 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3283 Attribute::NoImplicitFloat) &&
3284 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3285 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3286 if (Mask & (fcInf | fcZero)) {
3287 if (Pred == ICmpInst::ICMP_NE)
3288 Mask = ~Mask;
3289 return replaceInstUsesWith(Cmp,
3290 Builder.createIsFPClass(BCSrcOp, Mask));
3291 }
3292 }
3293 }
3294 }
3295
3296 const APInt *C;
3297 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3298 !SrcType->isIntOrIntVectorTy())
3299 return nullptr;
3300
3301 // If this is checking if all elements of a vector compare are set or not,
3302 // invert the casted vector equality compare and test if all compare
3303 // elements are clear or not. Compare against zero is generally easier for
3304 // analysis and codegen.
3305 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3306 // Example: are all elements equal? --> are zero elements not equal?
3307 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3308 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3309 if (Value *NotBCSrcOp =
3310 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3311 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3312 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3313 }
3314 }
3315
3316 // If this is checking if all elements of an extended vector are clear or not,
3317 // compare in a narrow type to eliminate the extend:
3318 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3319 Value *X;
3320 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3321 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3322 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3323 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3324 Value *NewCast = Builder.CreateBitCast(X, NewType);
3325 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3326 }
3327 }
3328
3329 // Folding: icmp <pred> iN X, C
3330 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3331 // and C is a splat of a K-bit pattern
3332 // and SC is a constant vector = <C', C', C', ..., C'>
3333 // Into:
3334 // %E = extractelement <M x iK> %vec, i32 C'
3335 // icmp <pred> iK %E, trunc(C)
3336 Value *Vec;
3337 ArrayRef<int> Mask;
3338 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3339 // Check whether every element of Mask is the same constant
3340 if (all_equal(Mask)) {
3341 auto *VecTy = cast<VectorType>(SrcType);
3342 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3343 if (C->isSplat(EltTy->getBitWidth())) {
3344 // Fold the icmp based on the value of C
3345 // If C is M copies of an iK sized bit pattern,
3346 // then:
3347 // => %E = extractelement <N x iK> %vec, i32 Elem
3348 // icmp <pred> iK %SplatVal, <pattern>
3349 Value *Elem = Builder.getInt32(Mask[0]);
3350 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3351 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3352 return new ICmpInst(Pred, Extract, NewC);
3353 }
3354 }
3355 }
3356 return nullptr;
3357}
3358
3359/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3360/// where X is some kind of instruction.
3362 const APInt *C;
3363
3364 if (match(Cmp.getOperand(1), m_APInt(C))) {
3365 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3366 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3367 return I;
3368
3369 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3370 // For now, we only support constant integers while folding the
3371 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3372 // similar to the cases handled by binary ops above.
3373 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3374 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3375 return I;
3376
3377 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3378 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3379 return I;
3380
3381 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3382 if (Instruction *I = foldICmpIntrinsicWithConstant(Cmp, II, *C))
3383 return I;
3384
3385 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3386 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3387 // TODO: This checks one-use, but that is not strictly necessary.
3388 Value *Cmp0 = Cmp.getOperand(0);
3389 Value *X, *Y;
3390 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3391 (match(Cmp0,
3392 m_ExtractValue<0>(m_Intrinsic<Intrinsic::ssub_with_overflow>(
3393 m_Value(X), m_Value(Y)))) ||
3394 match(Cmp0,
3395 m_ExtractValue<0>(m_Intrinsic<Intrinsic::usub_with_overflow>(
3396 m_Value(X), m_Value(Y))))))
3397 return new ICmpInst(Cmp.getPredicate(), X, Y);
3398 }
3399
3400 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3402
3403 return nullptr;
3404}
3405
3406/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3407/// icmp eq/ne BO, C.
3409 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3410 // TODO: Some of these folds could work with arbitrary constants, but this
3411 // function is limited to scalar and vector splat constants.
3412 if (!Cmp.isEquality())
3413 return nullptr;
3414
3415 ICmpInst::Predicate Pred = Cmp.getPredicate();
3416 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3417 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3418 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3419
3420 switch (BO->getOpcode()) {
3421 case Instruction::SRem:
3422 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3423 if (C.isZero() && BO->hasOneUse()) {
3424 const APInt *BOC;
3425 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3426 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3427 return new ICmpInst(Pred, NewRem,
3429 }
3430 }
3431 break;
3432 case Instruction::Add: {
3433 // (A + C2) == C --> A == (C - C2)
3434 // (A + C2) != C --> A != (C - C2)
3435 // TODO: Remove the one-use limitation? See discussion in D58633.
3436 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3437 if (BO->hasOneUse())
3438 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3439 } else if (C.isZero()) {
3440 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3441 // efficiently invertible, or if the add has just this one use.
3442 if (Value *NegVal = dyn_castNegVal(BOp1))
3443 return new ICmpInst(Pred, BOp0, NegVal);
3444 if (Value *NegVal = dyn_castNegVal(BOp0))
3445 return new ICmpInst(Pred, NegVal, BOp1);
3446 if (BO->hasOneUse()) {
3447 // (add nuw A, B) != 0 -> (or A, B) != 0
3448 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3449 Value *Or = Builder.CreateOr(BOp0, BOp1);
3450 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3451 }
3452 Value *Neg = Builder.CreateNeg(BOp1);
3453 Neg->takeName(BO);
3454 return new ICmpInst(Pred, BOp0, Neg);
3455 }
3456 }
3457 break;
3458 }
3459 case Instruction::Xor:
3460 if (BO->hasOneUse()) {
3461 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3462 // For the xor case, we can xor two constants together, eliminating
3463 // the explicit xor.
3464 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3465 } else if (C.isZero()) {
3466 // Replace ((xor A, B) != 0) with (A != B)
3467 return new ICmpInst(Pred, BOp0, BOp1);
3468 }
3469 }
3470 break;
3471 case Instruction::Or: {
3472 const APInt *BOC;
3473 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3474 // Comparing if all bits outside of a constant mask are set?
3475 // Replace (X | C) == -1 with (X & ~C) == ~C.
3476 // This removes the -1 constant.
3477 Constant *NotBOC = ConstantExpr::getNot(cast<Constant>(BOp1));
3478 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3479 return new ICmpInst(Pred, And, NotBOC);
3480 }
3481 break;
3482 }
3483 case Instruction::UDiv:
3484 case Instruction::SDiv:
3485 if (BO->isExact()) {
3486 // div exact X, Y eq/ne 0 -> X eq/ne 0
3487 // div exact X, Y eq/ne 1 -> X eq/ne Y
3488 // div exact X, Y eq/ne C ->
3489 // if Y * C never-overflow && OneUse:
3490 // -> Y * C eq/ne X
3491 if (C.isZero())
3492 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3493 else if (C.isOne())
3494 return new ICmpInst(Pred, BOp0, BOp1);
3495 else if (BO->hasOneUse()) {
3497 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3498 Cmp.getOperand(1), BO);
3500 Value *YC =
3501 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3502 return new ICmpInst(Pred, YC, BOp0);
3503 }
3504 }
3505 }
3506 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3507 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3508 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3509 return new ICmpInst(NewPred, BOp1, BOp0);
3510 }
3511 break;
3512 default:
3513 break;
3514 }
3515 return nullptr;
3516}
3517
3519 const APInt &CRhs,
3520 InstCombiner::BuilderTy &Builder,
3521 const SimplifyQuery &Q) {
3522 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3523 "Non-ctpop intrin in ctpop fold");
3524 if (!CtpopLhs->hasOneUse())
3525 return nullptr;
3526
3527 // Power of 2 test:
3528 // isPow2OrZero : ctpop(X) u< 2
3529 // isPow2 : ctpop(X) == 1
3530 // NotPow2OrZero: ctpop(X) u> 1
3531 // NotPow2 : ctpop(X) != 1
3532 // If we know any bit of X can be folded to:
3533 // IsPow2 : X & (~Bit) == 0
3534 // NotPow2 : X & (~Bit) != 0
3535 const ICmpInst::Predicate Pred = I.getPredicate();
3536 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3537 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3538 Value *Op = CtpopLhs->getArgOperand(0);
3539 KnownBits OpKnown = computeKnownBits(Op, Q.DL,
3540 /*Depth*/ 0, Q.AC, Q.CxtI, Q.DT);
3541 // No need to check for count > 1, that should be already constant folded.
3542 if (OpKnown.countMinPopulation() == 1) {
3543 Value *And = Builder.CreateAnd(
3544 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3545 return new ICmpInst(
3546 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3549 And, Constant::getNullValue(Op->getType()));
3550 }
3551 }
3552
3553 return nullptr;
3554}
3555
3556/// Fold an equality icmp with LLVM intrinsic and constant operand.
3558 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3559 Type *Ty = II->getType();
3560 unsigned BitWidth = C.getBitWidth();
3561 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3562
3563 switch (II->getIntrinsicID()) {
3564 case Intrinsic::abs:
3565 // abs(A) == 0 -> A == 0
3566 // abs(A) == INT_MIN -> A == INT_MIN
3567 if (C.isZero() || C.isMinSignedValue())
3568 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3569 break;
3570
3571 case Intrinsic::bswap:
3572 // bswap(A) == C -> A == bswap(C)
3573 return new ICmpInst(Pred, II->getArgOperand(0),
3574 ConstantInt::get(Ty, C.byteSwap()));
3575
3576 case Intrinsic::bitreverse:
3577 // bitreverse(A) == C -> A == bitreverse(C)
3578 return new ICmpInst(Pred, II->getArgOperand(0),
3579 ConstantInt::get(Ty, C.reverseBits()));
3580
3581 case Intrinsic::ctlz:
3582 case Intrinsic::cttz: {
3583 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3584 if (C == BitWidth)
3585 return new ICmpInst(Pred, II->getArgOperand(0),
3587
3588 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3589 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3590 // Limit to one use to ensure we don't increase instruction count.
3591 unsigned Num = C.getLimitedValue(BitWidth);
3592 if (Num != BitWidth && II->hasOneUse()) {
3593 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3594 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3595 : APInt::getHighBitsSet(BitWidth, Num + 1);
3596 APInt Mask2 = IsTrailing
3599 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3600 ConstantInt::get(Ty, Mask2));
3601 }
3602 break;
3603 }
3604
3605 case Intrinsic::ctpop: {
3606 // popcount(A) == 0 -> A == 0 and likewise for !=
3607 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3608 bool IsZero = C.isZero();
3609 if (IsZero || C == BitWidth)
3610 return new ICmpInst(Pred, II->getArgOperand(0),
3611 IsZero ? Constant::getNullValue(Ty)
3613
3614 break;
3615 }
3616
3617 case Intrinsic::fshl:
3618 case Intrinsic::fshr:
3619 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3620 const APInt *RotAmtC;
3621 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3622 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3623 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3624 return new ICmpInst(Pred, II->getArgOperand(0),
3625 II->getIntrinsicID() == Intrinsic::fshl
3626 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3627 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3628 }
3629 break;
3630
3631 case Intrinsic::umax:
3632 case Intrinsic::uadd_sat: {
3633 // uadd.sat(a, b) == 0 -> (a | b) == 0
3634 // umax(a, b) == 0 -> (a | b) == 0
3635 if (C.isZero() && II->hasOneUse()) {
3637 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3638 }
3639 break;
3640 }
3641
3642 case Intrinsic::ssub_sat:
3643 // ssub.sat(a, b) == 0 -> a == b
3644 if (C.isZero())
3645 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3646 break;
3647 case Intrinsic::usub_sat: {
3648 // usub.sat(a, b) == 0 -> a <= b
3649 if (C.isZero()) {
3650 ICmpInst::Predicate NewPred =
3652 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3653 }
3654 break;
3655 }
3656 default:
3657 break;
3658 }
3659
3660 return nullptr;
3661}
3662
3663/// Fold an icmp with LLVM intrinsics
3664static Instruction *
3666 InstCombiner::BuilderTy &Builder) {
3667 assert(Cmp.isEquality());
3668
3669 ICmpInst::Predicate Pred = Cmp.getPredicate();
3670 Value *Op0 = Cmp.getOperand(0);
3671 Value *Op1 = Cmp.getOperand(1);
3672 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3673 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3674 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3675 return nullptr;
3676
3677 switch (IIOp0->getIntrinsicID()) {
3678 case Intrinsic::bswap:
3679 case Intrinsic::bitreverse:
3680 // If both operands are byte-swapped or bit-reversed, just compare the
3681 // original values.
3682 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3683 case Intrinsic::fshl:
3684 case Intrinsic::fshr: {
3685 // If both operands are rotated by same amount, just compare the
3686 // original values.
3687 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3688 break;
3689 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3690 break;
3691 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3692 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3693
3694 // rotate(X, AmtX) == rotate(Y, AmtY)
3695 // -> rotate(X, AmtX - AmtY) == Y
3696 // Do this if either both rotates have one use or if only one has one use
3697 // and AmtX/AmtY are constants.
3698 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3699 if (OneUses == 2 ||
3700 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3701 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3702 Value *SubAmt =
3703 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3704 Value *CombinedRotate = Builder.CreateIntrinsic(
3705 Op0->getType(), IIOp0->getIntrinsicID(),
3706 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3707 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3708 }
3709 } break;
3710 default:
3711 break;
3712 }
3713
3714 return nullptr;
3715}
3716
3717/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3718/// where X is some kind of instruction and C is AllowPoison.
3719/// TODO: Move more folds which allow poison to this function.
3722 const APInt &C) {
3723 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3724 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3725 switch (II->getIntrinsicID()) {
3726 default:
3727 break;
3728 case Intrinsic::fshl:
3729 case Intrinsic::fshr:
3730 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3731 // (rot X, ?) == 0/-1 --> X == 0/-1
3732 if (C.isZero() || C.isAllOnes())
3733 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3734 }
3735 break;
3736 }
3737 }
3738
3739 return nullptr;
3740}
3741
3742/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3744 BinaryOperator *BO,
3745 const APInt &C) {
3746 switch (BO->getOpcode()) {
3747 case Instruction::Xor:
3748 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3749 return I;
3750 break;
3751 case Instruction::And:
3752 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3753 return I;
3754 break;
3755 case Instruction::Or:
3756 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3757 return I;
3758 break;
3759 case Instruction::Mul:
3760 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3761 return I;
3762 break;
3763 case Instruction::Shl:
3764 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
3765 return I;
3766 break;
3767 case Instruction::LShr:
3768 case Instruction::AShr:
3769 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
3770 return I;
3771 break;
3772 case Instruction::SRem:
3773 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
3774 return I;
3775 break;
3776 case Instruction::UDiv:
3777 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
3778 return I;
3779 [[fallthrough]];
3780 case Instruction::SDiv:
3781 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
3782 return I;
3783 break;
3784 case Instruction::Sub:
3785 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
3786 return I;
3787 break;
3788 case Instruction::Add:
3789 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
3790 return I;
3791 break;
3792 default:
3793 break;
3794 }
3795
3796 // TODO: These folds could be refactored to be part of the above calls.
3797 return foldICmpBinOpEqualityWithConstant(Cmp, BO, C);
3798}
3799
3800static Instruction *
3802 SaturatingInst *II, const APInt &C,
3803 InstCombiner::BuilderTy &Builder) {
3804 // This transform may end up producing more than one instruction for the
3805 // intrinsic, so limit it to one user of the intrinsic.
3806 if (!II->hasOneUse())
3807 return nullptr;
3808
3809 // Let Y = [add/sub]_sat(X, C) pred C2
3810 // SatVal = The saturating value for the operation
3811 // WillWrap = Whether or not the operation will underflow / overflow
3812 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
3813 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
3814 //
3815 // When (SatVal pred C2) is true, then
3816 // Y = WillWrap ? true : ((X binop C) pred C2)
3817 // => Y = WillWrap || ((X binop C) pred C2)
3818 // else
3819 // Y = WillWrap ? false : ((X binop C) pred C2)
3820 // => Y = !WillWrap ? ((X binop C) pred C2) : false
3821 // => Y = !WillWrap && ((X binop C) pred C2)
3822 Value *Op0 = II->getOperand(0);
3823 Value *Op1 = II->getOperand(1);
3824
3825 const APInt *COp1;
3826 // This transform only works when the intrinsic has an integral constant or
3827 // splat vector as the second operand.
3828 if (!match(Op1, m_APInt(COp1)))
3829 return nullptr;
3830
3831 APInt SatVal;
3832 switch (II->getIntrinsicID()) {
3833 default:
3835 "This function only works with usub_sat and uadd_sat for now!");
3836 case Intrinsic::uadd_sat:
3837 SatVal = APInt::getAllOnes(C.getBitWidth());
3838 break;
3839 case Intrinsic::usub_sat:
3840 SatVal = APInt::getZero(C.getBitWidth());
3841 break;
3842 }
3843
3844 // Check (SatVal pred C2)
3845 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
3846
3847 // !WillWrap.
3849 II->getBinaryOp(), *COp1, II->getNoWrapKind());
3850
3851 // WillWrap.
3852 if (SatValCheck)
3853 C1 = C1.inverse();
3854
3856 if (II->getBinaryOp() == Instruction::Add)
3857 C2 = C2.sub(*COp1);
3858 else
3859 C2 = C2.add(*COp1);
3860
3861 Instruction::BinaryOps CombiningOp =
3862 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
3863
3864 std::optional<ConstantRange> Combination;
3865 if (CombiningOp == Instruction::BinaryOps::Or)
3866 Combination = C1.exactUnionWith(C2);
3867 else /* CombiningOp == Instruction::BinaryOps::And */
3868 Combination = C1.exactIntersectWith(C2);
3869
3870 if (!Combination)
3871 return nullptr;
3872
3873 CmpInst::Predicate EquivPred;
3874 APInt EquivInt;
3875 APInt EquivOffset;
3876
3877 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3878
3879 return new ICmpInst(
3880 EquivPred,
3881 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
3882 ConstantInt::get(Op1->getType(), EquivInt));
3883}
3884
3885/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
3887 IntrinsicInst *II,
3888 const APInt &C) {
3889 ICmpInst::Predicate Pred = Cmp.getPredicate();
3890
3891 // Handle folds that apply for any kind of icmp.
3892 switch (II->getIntrinsicID()) {
3893 default:
3894 break;
3895 case Intrinsic::uadd_sat:
3896 case Intrinsic::usub_sat:
3897 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
3898 Pred, cast<SaturatingInst>(II), C, Builder))
3899 return Folded;
3900 break;
3901 case Intrinsic::ctpop: {
3902 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3903 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
3904 return R;
3905 } break;
3906 }
3907
3908 if (Cmp.isEquality())
3909 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
3910
3911 Type *Ty = II->getType();
3912 unsigned BitWidth = C.getBitWidth();
3913 switch (II->getIntrinsicID()) {
3914 case Intrinsic::ctpop: {
3915 // (ctpop X > BitWidth - 1) --> X == -1
3916 Value *X = II->getArgOperand(0);
3917 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
3918 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
3920 // (ctpop X < BitWidth) --> X != -1
3921 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
3922 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
3924 break;
3925 }
3926 case Intrinsic::ctlz: {
3927 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
3928 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
3929 unsigned Num = C.getLimitedValue();
3930 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
3931 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
3932 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
3933 }
3934
3935 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
3936 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
3937 unsigned Num = C.getLimitedValue();
3939 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
3940 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
3941 }
3942 break;
3943 }
3944 case Intrinsic::cttz: {
3945 // Limit to one use to ensure we don't increase instruction count.
3946 if (!II->hasOneUse())
3947 return nullptr;
3948
3949 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
3950 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
3951 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
3952 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
3953 Builder.CreateAnd(II->getArgOperand(0), Mask),
3955 }
3956
3957 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
3958 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
3959 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
3960 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
3961 Builder.CreateAnd(II->getArgOperand(0), Mask),
3963 }
3964 break;
3965 }
3966 case Intrinsic::ssub_sat:
3967 // ssub.sat(a, b) spred 0 -> a spred b
3968 if (ICmpInst::isSigned(Pred)) {
3969 if (C.isZero())
3970 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3971 // X s<= 0 is cannonicalized to X s< 1
3972 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3973 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
3974 II->getArgOperand(1));
3975 // X s>= 0 is cannonicalized to X s> -1
3976 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3977 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
3978 II->getArgOperand(1));
3979 }
3980 break;
3981 default:
3982 break;
3983 }
3984
3985 return nullptr;
3986}
3987
3988/// Handle icmp with constant (but not simple integer constant) RHS.
3990 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
3991 Constant *RHSC = dyn_cast<Constant>(Op1);
3992 Instruction *LHSI = dyn_cast<Instruction>(Op0);
3993 if (!RHSC || !LHSI)
3994 return nullptr;
3995
3996 switch (LHSI->getOpcode()) {
3997 case Instruction::PHI:
3998 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
3999 return NV;
4000 break;
4001 case Instruction::IntToPtr:
4002 // icmp pred inttoptr(X), null -> icmp pred X, 0
4003 if (RHSC->isNullValue() &&
4004 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4005 return new ICmpInst(
4006 I.getPredicate(), LHSI->getOperand(0),
4008 break;
4009
4010 case Instruction::Load:
4011 // Try to optimize things like "A[i] > 4" to index computations.
4012 if (GetElementPtrInst *GEP =
4013 dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
4014 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
4015 if (Instruction *Res =
4016 foldCmpLoadFromIndexedGlobal(cast<LoadInst>(LHSI), GEP, GV, I))
4017 return Res;
4018 break;
4019 }
4020
4021 return nullptr;
4022}
4023
4025 SelectInst *SI, Value *RHS,
4026 const ICmpInst &I) {
4027 // Try to fold the comparison into the select arms, which will cause the
4028 // select to be converted into a logical and/or.
4029 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4030 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4031 return Res;
4032 if (std::optional<bool> Impl = isImpliedCondition(
4033 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4034 return ConstantInt::get(I.getType(), *Impl);
4035 return nullptr;
4036 };
4037
4038 ConstantInt *CI = nullptr;
4039 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4040 if (Op1)
4041 CI = dyn_cast<ConstantInt>(Op1);
4042
4043 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4044 if (Op2)
4045 CI = dyn_cast<ConstantInt>(Op2);
4046
4047 // We only want to perform this transformation if it will not lead to
4048 // additional code. This is true if either both sides of the select
4049 // fold to a constant (in which case the icmp is replaced with a select
4050 // which will usually simplify) or this is the only user of the
4051 // select (in which case we are trading a select+icmp for a simpler
4052 // select+icmp) or all uses of the select can be replaced based on
4053 // dominance information ("Global cases").
4054 bool Transform = false;
4055 if (Op1 && Op2)
4056 Transform = true;
4057 else if (Op1 || Op2) {
4058 // Local case
4059 if (SI->hasOneUse())
4060 Transform = true;
4061 // Global cases
4062 else if (CI && !CI->isZero())
4063 // When Op1 is constant try replacing select with second operand.
4064 // Otherwise Op2 is constant and try replacing select with first
4065 // operand.
4066 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4067 }
4068 if (Transform) {
4069 if (!Op1)
4070 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4071 if (!Op2)
4072 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4073 return SelectInst::Create(SI->getOperand(0), Op1, Op2);
4074 }
4075
4076 return nullptr;
4077}
4078
4079// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4080static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4081 unsigned Depth = 0) {
4082 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4083 return true;
4084 if (V->getType()->getScalarSizeInBits() == 1)
4085 return true;
4087 return false;
4088 Value *X;
4089 const Instruction *I = dyn_cast<Instruction>(V);
4090 if (!I)
4091 return false;
4092 switch (I->getOpcode()) {
4093 case Instruction::ZExt:
4094 // ZExt(Mask) is a Mask.
4095 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4096 case Instruction::SExt:
4097 // SExt(Mask) is a Mask.
4098 // SExt(~Mask) is a ~Mask.
4099 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4100 case Instruction::And:
4101 case Instruction::Or:
4102 // Mask0 | Mask1 is a Mask.
4103 // Mask0 & Mask1 is a Mask.
4104 // ~Mask0 | ~Mask1 is a ~Mask.
4105 // ~Mask0 & ~Mask1 is a ~Mask.
4106 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4107 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4108 case Instruction::Xor:
4109 if (match(V, m_Not(m_Value(X))))
4110 return isMaskOrZero(X, !Not, Q, Depth);
4111
4112 // (X ^ -X) is a ~Mask
4113 if (Not)
4114 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4115 // (X ^ (X - 1)) is a Mask
4116 else
4117 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4118 case Instruction::Select:
4119 // c ? Mask0 : Mask1 is a Mask.
4120 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4121 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4122 case Instruction::Shl:
4123 // (~Mask) << X is a ~Mask.
4124 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4125 case Instruction::LShr:
4126 // Mask >> X is a Mask.
4127 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4128 case Instruction::AShr:
4129 // Mask s>> X is a Mask.
4130 // ~Mask s>> X is a ~Mask.
4131 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4132 case Instruction::Add:
4133 // Pow2 - 1 is a Mask.
4134 if (!Not && match(I->getOperand(1), m_AllOnes()))
4135 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4136 Depth, Q.AC, Q.CxtI, Q.DT);
4137 break;
4138 case Instruction::Sub:
4139 // -Pow2 is a ~Mask.
4140 if (Not && match(I->getOperand(0), m_Zero()))
4141 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4142 Depth, Q.AC, Q.CxtI, Q.DT);
4143 break;
4144 case Instruction::Call: {
4145 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4146 switch (II->getIntrinsicID()) {
4147 // min/max(Mask0, Mask1) is a Mask.
4148 // min/max(~Mask0, ~Mask1) is a ~Mask.
4149 case Intrinsic::umax:
4150 case Intrinsic::smax:
4151 case Intrinsic::umin:
4152 case Intrinsic::smin:
4153 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4154 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4155
4156 // In the context of masks, bitreverse(Mask) == ~Mask
4157 case Intrinsic::bitreverse:
4158 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4159 default:
4160 break;
4161 }
4162 }
4163 break;
4164 }
4165 default:
4166 break;
4167 }
4168 return false;
4169}
4170
4171/// Some comparisons can be simplified.
4172/// In this case, we are looking for comparisons that look like
4173/// a check for a lossy truncation.
4174/// Folds:
4175/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4176/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4177/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4178/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4179/// Where Mask is some pattern that produces all-ones in low bits:
4180/// (-1 >> y)
4181/// ((-1 << y) >> y) <- non-canonical, has extra uses
4182/// ~(-1 << y)
4183/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4184/// The Mask can be a constant, too.
4185/// For some predicates, the operands are commutative.
4186/// For others, x can only be on a specific side.
4188 Value *Op1, const SimplifyQuery &Q,
4189 InstCombiner &IC) {
4190
4191 ICmpInst::Predicate DstPred;
4192 switch (Pred) {
4194 // x & Mask == x
4195 // x & ~Mask == 0
4196 // ~x | Mask == -1
4197 // -> x u<= Mask
4198 // x & ~Mask == ~Mask
4199 // -> ~Mask u<= x
4201 break;
4203 // x & Mask != x
4204 // x & ~Mask != 0
4205 // ~x | Mask != -1
4206 // -> x u> Mask
4207 // x & ~Mask != ~Mask
4208 // -> ~Mask u> x
4210 break;
4212 // x & Mask u< x
4213 // -> x u> Mask
4214 // x & ~Mask u< ~Mask
4215 // -> ~Mask u> x
4217 break;
4219 // x & Mask u>= x
4220 // -> x u<= Mask
4221 // x & ~Mask u>= ~Mask
4222 // -> ~Mask u<= x
4224 break;
4226 // x & Mask s< x [iff Mask s>= 0]
4227 // -> x s> Mask
4228 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4229 // -> ~Mask s> x
4231 break;
4233 // x & Mask s>= x [iff Mask s>= 0]
4234 // -> x s<= Mask
4235 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4236 // -> ~Mask s<= x
4238 break;
4239 default:
4240 // We don't support sgt,sle
4241 // ult/ugt are simplified to true/false respectively.
4242 return nullptr;
4243 }
4244
4245 Value *X, *M;
4246 // Put search code in lambda for early positive returns.
4247 auto IsLowBitMask = [&]() {
4248 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4249 X = Op1;
4250 // Look for: x & Mask pred x
4251 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4252 return !ICmpInst::isSigned(Pred) ||
4253 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4254 }
4255
4256 // Look for: x & ~Mask pred ~Mask
4257 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4258 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4259 }
4260 return false;
4261 }
4262 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4263 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4264
4265 auto Check = [&]() {
4266 // Look for: ~x | Mask == -1
4267 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4268 if (Value *NotX =
4269 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4270 X = NotX;
4271 return true;
4272 }
4273 }
4274 return false;
4275 };
4276 if (Check())
4277 return true;
4278 std::swap(X, M);
4279 return Check();
4280 }
4281 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4282 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4283 auto Check = [&]() {
4284 // Look for: x & ~Mask == 0
4285 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4286 if (Value *NotM =
4287 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4288 M = NotM;
4289 return true;
4290 }
4291 }
4292 return false;
4293 };
4294 if (Check())
4295 return true;
4296 std::swap(X, M);
4297 return Check();
4298 }
4299 return false;
4300 };
4301
4302 if (!IsLowBitMask())
4303 return nullptr;
4304
4305 return IC.Builder.CreateICmp(DstPred, X, M);
4306}
4307
4308/// Some comparisons can be simplified.
4309/// In this case, we are looking for comparisons that look like
4310/// a check for a lossy signed truncation.
4311/// Folds: (MaskedBits is a constant.)
4312/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4313/// Into:
4314/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4315/// Where KeptBits = bitwidth(%x) - MaskedBits
4316static Value *
4318 InstCombiner::BuilderTy &Builder) {
4319 ICmpInst::Predicate SrcPred;
4320 Value *X;
4321 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4322 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4323 if (!match(&I, m_c_ICmp(SrcPred,
4325 m_APInt(C1))),
4326 m_Deferred(X))))
4327 return nullptr;
4328
4329 // Potential handling of non-splats: for each element:
4330 // * if both are undef, replace with constant 0.
4331 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4332 // * if both are not undef, and are different, bailout.
4333 // * else, only one is undef, then pick the non-undef one.
4334
4335 // The shift amount must be equal.
4336 if (*C0 != *C1)
4337 return nullptr;
4338 const APInt &MaskedBits = *C0;
4339 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4340
4341 ICmpInst::Predicate DstPred;
4342 switch (SrcPred) {
4344 // ((%x << MaskedBits) a>> MaskedBits) == %x
4345 // =>
4346 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4348 break;
4350 // ((%x << MaskedBits) a>> MaskedBits) != %x
4351 // =>
4352 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4354 break;
4355 // FIXME: are more folds possible?
4356 default:
4357 return nullptr;
4358 }
4359
4360 auto *XType = X->getType();
4361 const unsigned XBitWidth = XType->getScalarSizeInBits();
4362 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4363 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4364
4365 // KeptBits = bitwidth(%x) - MaskedBits
4366 const APInt KeptBits = BitWidth - MaskedBits;
4367 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4368 // ICmpCst = (1 << KeptBits)
4369 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4370 assert(ICmpCst.isPowerOf2());
4371 // AddCst = (1 << (KeptBits-1))
4372 const APInt AddCst = ICmpCst.lshr(1);
4373 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4374
4375 // T0 = add %x, AddCst
4376 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4377 // T1 = T0 DstPred ICmpCst
4378 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4379
4380 return T1;
4381}
4382
4383// Given pattern:
4384// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4385// we should move shifts to the same hand of 'and', i.e. rewrite as
4386// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4387// We are only interested in opposite logical shifts here.
4388// One of the shifts can be truncated.
4389// If we can, we want to end up creating 'lshr' shift.
4390static Value *
4392 InstCombiner::BuilderTy &Builder) {
4393 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4394 !I.getOperand(0)->hasOneUse())
4395 return nullptr;
4396
4397 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4398
4399 // Look for an 'and' of two logical shifts, one of which may be truncated.
4400 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4401 Instruction *XShift, *MaybeTruncation, *YShift;
4402 if (!match(
4403 I.getOperand(0),
4404 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4406 m_AnyLogicalShift, m_Instruction(YShift))),
4407 m_Instruction(MaybeTruncation)))))
4408 return nullptr;
4409
4410 // We potentially looked past 'trunc', but only when matching YShift,
4411 // therefore YShift must have the widest type.
4412 Instruction *WidestShift = YShift;
4413 // Therefore XShift must have the shallowest type.
4414 // Or they both have identical types if there was no truncation.
4415 Instruction *NarrowestShift = XShift;
4416
4417 Type *WidestTy = WidestShift->getType();
4418 Type *NarrowestTy = NarrowestShift->getType();
4419 assert(NarrowestTy == I.getOperand(0)->getType() &&
4420 "We did not look past any shifts while matching XShift though.");
4421 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4422
4423 // If YShift is a 'lshr', swap the shifts around.
4424 if (match(YShift, m_LShr(m_Value(), m_Value())))
4425 std::swap(XShift, YShift);
4426
4427 // The shifts must be in opposite directions.
4428 auto XShiftOpcode = XShift->getOpcode();
4429 if (XShiftOpcode == YShift->getOpcode())
4430 return nullptr; // Do not care about same-direction shifts here.
4431
4432 Value *X, *XShAmt, *Y, *YShAmt;
4433 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4434 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4435
4436 // If one of the values being shifted is a constant, then we will end with
4437 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4438 // however, we will need to ensure that we won't increase instruction count.
4439 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4440 // At least one of the hands of the 'and' should be one-use shift.
4441 if (!match(I.getOperand(0),
4442 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4443 return nullptr;
4444 if (HadTrunc) {
4445 // Due to the 'trunc', we will need to widen X. For that either the old
4446 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4447 if (!MaybeTruncation->hasOneUse() &&
4448 !NarrowestShift->getOperand(1)->hasOneUse())
4449 return nullptr;
4450 }
4451 }
4452
4453 // We have two shift amounts from two different shifts. The types of those
4454 // shift amounts may not match. If that's the case let's bailout now.
4455 if (XShAmt->getType() != YShAmt->getType())
4456 return nullptr;
4457
4458 // As input, we have the following pattern:
4459 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4460 // We want to rewrite that as:
4461 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4462 // While we know that originally (Q+K) would not overflow
4463 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4464 // shift amounts. so it may now overflow in smaller bitwidth.
4465 // To ensure that does not happen, we need to ensure that the total maximal
4466 // shift amount is still representable in that smaller bit width.
4467 unsigned MaximalPossibleTotalShiftAmount =
4468 (WidestTy->getScalarSizeInBits() - 1) +
4469 (NarrowestTy->getScalarSizeInBits() - 1);
4470 APInt MaximalRepresentableShiftAmount =
4472 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4473 return nullptr;
4474
4475 // Can we fold (XShAmt+YShAmt) ?
4476 auto *NewShAmt = dyn_cast_or_null<Constant>(
4477 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4478 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4479 if (!NewShAmt)
4480 return nullptr;
4481 if (NewShAmt->getType() != WidestTy) {
4482 NewShAmt =
4483 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4484 if (!NewShAmt)
4485 return nullptr;
4486 }
4487 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4488
4489 // Is the new shift amount smaller than the bit width?
4490 // FIXME: could also rely on ConstantRange.
4491 if (!match(NewShAmt,
4493 APInt(WidestBitWidth, WidestBitWidth))))
4494 return nullptr;
4495
4496 // An extra legality check is needed if we had trunc-of-lshr.
4497 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4498 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4499 WidestShift]() {
4500 // It isn't obvious whether it's worth it to analyze non-constants here.
4501 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4502 // If *any* of these preconditions matches we can perform the fold.
4503 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4504 ? NewShAmt->getSplatValue()
4505 : NewShAmt;
4506 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4507 if (NewShAmtSplat &&
4508 (NewShAmtSplat->isNullValue() ||
4509 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4510 return true;
4511 // We consider *min* leading zeros so a single outlier
4512 // blocks the transform as opposed to allowing it.
4513 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4514 KnownBits Known = computeKnownBits(C, SQ.DL);
4515 unsigned MinLeadZero = Known.countMinLeadingZeros();
4516 // If the value being shifted has at most lowest bit set we can fold.
4517 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4518 if (MaxActiveBits <= 1)
4519 return true;
4520 // Precondition: NewShAmt u<= countLeadingZeros(C)
4521 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4522 return true;
4523 }
4524 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4525 KnownBits Known = computeKnownBits(C, SQ.DL);
4526 unsigned MinLeadZero = Known.countMinLeadingZeros();
4527 // If the value being shifted has at most lowest bit set we can fold.
4528 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4529 if (MaxActiveBits <= 1)
4530 return true;
4531 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4532 if (NewShAmtSplat) {
4533 APInt AdjNewShAmt =
4534 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4535 if (AdjNewShAmt.ule(MinLeadZero))
4536 return true;
4537 }
4538 }
4539 return false; // Can't tell if it's ok.
4540 };
4541 if (!CanFold())
4542 return nullptr;
4543 }
4544
4545 // All good, we can do this fold.
4546 X = Builder.CreateZExt(X, WidestTy);
4547 Y = Builder.CreateZExt(Y, WidestTy);
4548 // The shift is the same that was for X.
4549 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4550 ? Builder.CreateLShr(X, NewShAmt)
4551 : Builder.CreateShl(X, NewShAmt);
4552 Value *T1 = Builder.CreateAnd(T0, Y);
4553 return Builder.CreateICmp(I.getPredicate(), T1,
4554 Constant::getNullValue(WidestTy));
4555}
4556
4557/// Fold
4558/// (-1 u/ x) u< y
4559/// ((x * y) ?/ x) != y
4560/// to
4561/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4562/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4563/// will mean that we are looking for the opposite answer.
4566 Value *X, *Y;
4568 Instruction *Div;
4569 bool NeedNegation;
4570 // Look for: (-1 u/ x) u</u>= y
4571 if (!I.isEquality() &&
4572 match(&I, m_c_ICmp(Pred,
4574 m_Instruction(Div)),
4575 m_Value(Y)))) {
4576 Mul = nullptr;
4577
4578 // Are we checking that overflow does not happen, or does happen?
4579 switch (Pred) {
4581 NeedNegation = false;
4582 break; // OK
4584 NeedNegation = true;
4585 break; // OK
4586 default:
4587 return nullptr; // Wrong predicate.
4588 }
4589 } else // Look for: ((x * y) / x) !=/== y
4590 if (I.isEquality() &&
4591 match(&I,
4592 m_c_ICmp(Pred, m_Value(Y),
4595 m_Value(X)),
4597 m_Deferred(X))),
4598 m_Instruction(Div))))) {
4599 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4600 } else
4601 return nullptr;
4602
4604 // If the pattern included (x * y), we'll want to insert new instructions
4605 // right before that original multiplication so that we can replace it.
4606 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4607 if (MulHadOtherUses)
4609
4610 Function *F = Intrinsic::getDeclaration(I.getModule(),
4611 Div->getOpcode() == Instruction::UDiv
4612 ? Intrinsic::umul_with_overflow
4613 : Intrinsic::smul_with_overflow,
4614 X->getType());
4615 CallInst *Call = Builder.CreateCall(F, {X, Y}, "mul");
4616
4617 // If the multiplication was used elsewhere, to ensure that we don't leave
4618 // "duplicate" instructions, replace uses of that original multiplication
4619 // with the multiplication result from the with.overflow intrinsic.
4620 if (MulHadOtherUses)
4621 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4622
4623 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4624 if (NeedNegation) // This technically increases instruction count.
4625 Res = Builder.CreateNot(Res, "mul.not.ov");
4626
4627 // If we replaced the mul, erase it. Do this after all uses of Builder,
4628 // as the mul is used as insertion point.
4629 if (MulHadOtherUses)
4631
4632 return Res;
4633}
4634
4636 InstCombiner::BuilderTy &Builder) {
4637 CmpInst::Predicate Pred;
4638 Value *X;
4639 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4640
4641 if (ICmpInst::isSigned(Pred))
4642 Pred = ICmpInst::getSwappedPredicate(Pred);
4643 else if (ICmpInst::isUnsigned(Pred))
4644 Pred = ICmpInst::getSignedPredicate(Pred);
4645 // else for equality-comparisons just keep the predicate.
4646
4647 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4648 Constant::getNullValue(X->getType()), I.getName());
4649 }
4650
4651 // A value is not equal to its negation unless that value is 0 or
4652 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4653 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4654 ICmpInst::isEquality(Pred)) {
4655 Type *Ty = X->getType();
4657 Constant *MaxSignedVal =
4658 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4659 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4660 Constant *Zero = Constant::getNullValue(Ty);
4661 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4662 }
4663
4664 return nullptr;
4665}
4666
4668 InstCombinerImpl &IC) {
4669 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4670 // Normalize and operand as operand 0.
4671 CmpInst::Predicate Pred = I.getPredicate();
4672 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4673 std::swap(Op0, Op1);
4674 Pred = ICmpInst::getSwappedPredicate(Pred);
4675 }
4676
4677 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
4678 return nullptr;
4679
4680 // (icmp (X & Y) u< X --> (X & Y) != X
4681 if (Pred == ICmpInst::ICMP_ULT)
4682 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4683
4684 // (icmp (X & Y) u>= X --> (X & Y) == X
4685 if (Pred == ICmpInst::ICMP_UGE)
4686 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4687
4688 return nullptr;
4689}
4690
4692 InstCombinerImpl &IC) {
4693 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4694
4695 // Normalize or operand as operand 0.
4696 CmpInst::Predicate Pred = I.getPredicate();
4697 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
4698 std::swap(Op0, Op1);
4699 Pred = ICmpInst::getSwappedPredicate(Pred);
4700 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
4701 return nullptr;
4702 }
4703
4704 // icmp (X | Y) u<= X --> (X | Y) == X
4705 if (Pred == ICmpInst::ICMP_ULE)
4706 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
4707
4708 // icmp (X | Y) u> X --> (X | Y) != X
4709 if (Pred == ICmpInst::ICMP_UGT)
4710 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
4711
4712 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
4713 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
4714 if (Value *NotOp1 =
4715 IC.getFreelyInverted(Op1, Op1->hasOneUse(), &IC.Builder))
4716 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
4717 Constant::getNullValue(Op1->getType()));
4718 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
4719 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
4720 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
4721 Constant::getAllOnesValue(Op1->getType()));
4722 }
4723 return nullptr;
4724}
4725
4727 InstCombinerImpl &IC) {
4728 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4729 // Normalize xor operand as operand 0.
4730 CmpInst::Predicate Pred = I.getPredicate();
4731 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
4732 std::swap(Op0, Op1);
4733 Pred = ICmpInst::getSwappedPredicate(Pred);
4734 }
4735 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
4736 return nullptr;
4737
4738 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
4739 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
4740 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
4741 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
4743 if (PredOut != Pred && isKnownNonZero(A, Q))
4744 return new ICmpInst(PredOut, Op0, Op1);
4745
4746 return nullptr;
4747}
4748
4749/// Try to fold icmp (binop), X or icmp X, (binop).
4750/// TODO: A large part of this logic is duplicated in InstSimplify's
4751/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
4752/// duplication.
4754 const SimplifyQuery &SQ) {
4756 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4757
4758 // Special logic for binary operators.
4759 BinaryOperator *BO0 = dyn_cast<BinaryOperator>(Op0);
4760 BinaryOperator *BO1 = dyn_cast<BinaryOperator>(Op1);
4761 if (!BO0 && !BO1)
4762 return nullptr;
4763
4764 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
4765 return NewICmp;
4766
4767 const CmpInst::Predicate Pred = I.getPredicate();
4768 Value *X;
4769
4770 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
4771 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
4772 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
4773 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
4774 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
4775 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
4776 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
4777 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
4778 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
4779
4780 {
4781 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
4782 Constant *C;
4783 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
4784 m_ImmConstant(C)))) &&
4785 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
4787 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
4788 }
4789 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
4790 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
4791 m_ImmConstant(C)))) &&
4792 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
4794 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
4795 }
4796 }
4797
4798 {
4799 // Similar to above: an unsigned overflow comparison may use offset + mask:
4800 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
4801 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
4802 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
4803 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
4804 BinaryOperator *BO;
4805 const APInt *C;
4806 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
4807 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4809 CmpInst::Predicate NewPred =
4811 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4812 return new ICmpInst(NewPred, Op1, Zero);
4813 }
4814
4815 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
4816 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
4818 CmpInst::Predicate NewPred =
4820 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
4821 return new ICmpInst(NewPred, Op0, Zero);
4822 }
4823 }
4824
4825 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
4826 bool Op0HasNUW = false, Op1HasNUW = false;
4827 bool Op0HasNSW = false, Op1HasNSW = false;
4828 // Analyze the case when either Op0 or Op1 is an add instruction.
4829 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
4830 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
4831 bool &HasNSW, bool &HasNUW) -> bool {
4832 if (isa<OverflowingBinaryOperator>(BO)) {
4833 HasNUW = BO.hasNoUnsignedWrap();
4834 HasNSW = BO.hasNoSignedWrap();
4835 return ICmpInst::isEquality(Pred) ||
4836 (CmpInst::isUnsigned(Pred) && HasNUW) ||
4837 (CmpInst::isSigned(Pred) && HasNSW);
4838 } else if (BO.getOpcode() == Instruction::Or) {
4839 HasNUW = true;
4840 HasNSW = true;
4841 return true;
4842 } else {
4843 return false;
4844 }
4845 };
4846 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
4847
4848 if (BO0) {
4849 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
4850 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
4851 }
4852 if (BO1) {
4853 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
4854 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
4855 }
4856
4857 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
4858 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
4859 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
4860 return new ICmpInst(Pred, A == Op1 ? B : A,
4861 Constant::getNullValue(Op1->getType()));
4862
4863 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
4864 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
4865 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
4866 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
4867 C == Op0 ? D : C);
4868
4869 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
4870 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
4871 NoOp1WrapProblem) {
4872 // Determine Y and Z in the form icmp (X+Y), (X+Z).
4873 Value *Y, *Z;
4874 if (A == C) {
4875 // C + B == C + D -> B == D
4876 Y = B;
4877 Z = D;
4878 } else if (A == D) {
4879 // D + B == C + D -> B == C
4880 Y = B;
4881 Z = C;
4882 } else if (B == C) {
4883 // A + C == C + D -> A == D
4884 Y = A;
4885 Z = D;
4886 } else {
4887 assert(B == D);
4888 // A + D == C + D -> A == C
4889 Y = A;
4890 Z = C;
4891 }
4892 return new ICmpInst(Pred, Y, Z);
4893 }
4894
4895 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
4896 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLT &&
4897 match(B, m_AllOnes()))
4898 return new ICmpInst(CmpInst::ICMP_SLE, A, Op1);
4899
4900 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
4901 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGE &&
4902 match(B, m_AllOnes()))
4903 return new ICmpInst(CmpInst::ICMP_SGT, A, Op1);
4904
4905 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
4906 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SLE && match(B, m_One()))
4907 return new ICmpInst(CmpInst::ICMP_SLT, A, Op1);
4908
4909 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
4910 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_SGT && match(B, m_One()))
4911 return new ICmpInst(CmpInst::ICMP_SGE, A, Op1);
4912
4913 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
4914 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGT &&
4915 match(D, m_AllOnes()))
4916 return new ICmpInst(CmpInst::ICMP_SGE, Op0, C);
4917
4918 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
4919 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLE &&
4920 match(D, m_AllOnes()))
4921 return new ICmpInst(CmpInst::ICMP_SLT, Op0, C);
4922
4923 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
4924 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SGE && match(D, m_One()))
4925 return new ICmpInst(CmpInst::ICMP_SGT, Op0, C);
4926
4927 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
4928 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_SLT && match(D, m_One()))
4929 return new ICmpInst(CmpInst::ICMP_SLE, Op0, C);
4930
4931 // TODO: The subtraction-related identities shown below also hold, but
4932 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
4933 // wouldn't happen even if they were implemented.
4934 //
4935 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
4936 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
4937 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
4938 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
4939
4940 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
4941 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_ULE && match(B, m_One()))
4942 return new ICmpInst(CmpInst::ICMP_ULT, A, Op1);
4943
4944 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
4945 if (A && NoOp0WrapProblem && Pred == CmpInst::ICMP_UGT && match(B, m_One()))
4946 return new ICmpInst(CmpInst::ICMP_UGE, A, Op1);
4947
4948 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
4949 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_UGE && match(D, m_One()))
4950 return new ICmpInst(CmpInst::ICMP_UGT, Op0, C);
4951
4952 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
4953 if (C && NoOp1WrapProblem && Pred == CmpInst::ICMP_ULT && match(D, m_One()))
4954 return new ICmpInst(CmpInst::ICMP_ULE, Op0, C);
4955
4956 // if C1 has greater magnitude than C2:
4957 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
4958 // s.t. C3 = C1 - C2
4959 //
4960 // if C2 has greater magnitude than C1:
4961 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
4962 // s.t. C3 = C2 - C1
4963 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
4964 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
4965 const APInt *AP1, *AP2;
4966 // TODO: Support non-uniform vectors.
4967 // TODO: Allow poison passthrough if B or D's element is poison.
4968 if (match(B, m_APIntAllowPoison(AP1)) &&
4969 match(D, m_APIntAllowPoison(AP2)) &&
4970 AP1->isNegative() == AP2->isNegative()) {
4971 APInt AP1Abs = AP1->abs();
4972 APInt AP2Abs = AP2->abs();
4973 if (AP1Abs.uge(AP2Abs)) {
4974 APInt Diff = *AP1 - *AP2;
4975 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
4976 Value *NewAdd = Builder.CreateAdd(
4977 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
4978 return new ICmpInst(Pred, NewAdd, C);
4979 } else {
4980 APInt Diff = *AP2 - *AP1;
4981 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
4982 Value *NewAdd = Builder.CreateAdd(
4983 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
4984 return new ICmpInst(Pred, A, NewAdd);
4985 }
4986 }
4987 Constant *Cst1, *Cst2;
4988 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
4989 ICmpInst::isEquality(Pred)) {
4990 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
4991 Value *NewAdd = Builder.CreateAdd(C, Diff);
4992 return new ICmpInst(Pred, A, NewAdd);
4993 }
4994 }
4995
4996 // Analyze the case when either Op0 or Op1 is a sub instruction.
4997 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
4998 A = nullptr;
4999 B = nullptr;
5000 C = nullptr;
5001 D = nullptr;
5002 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5003 A = BO0->getOperand(0);
5004 B = BO0->getOperand(1);
5005 }
5006 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5007 C = BO1->getOperand(0);
5008 D = BO1->getOperand(1);
5009 }
5010
5011 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5012 if (A == Op1 && NoOp0WrapProblem)
5013 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5014 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5015 if (C == Op0 && NoOp1WrapProblem)
5016 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5017
5018 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5019 // (A - B) u>/u<= A --> B u>/u<= A
5020 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5021 return new ICmpInst(Pred, B, A);
5022 // C u</u>= (C - D) --> C u</u>= D
5023 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5024 return new ICmpInst(Pred, C, D);
5025 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5026 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5027 isKnownNonZero(B, Q))
5029 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5030 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5031 isKnownNonZero(D, Q))
5033
5034 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5035 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5036 return new ICmpInst(Pred, A, C);
5037
5038 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5039 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5040 return new ICmpInst(Pred, D, B);
5041
5042 // icmp (0-X) < cst --> x > -cst
5043 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5044 Value *X;
5045 if (match(BO0, m_Neg(m_Value(X))))
5046 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5047 if (RHSC->isNotMinSignedValue())
5048 return new ICmpInst(I.getSwappedPredicate(), X,
5049 ConstantExpr::getNeg(RHSC));
5050 }
5051
5052 if (Instruction * R = foldICmpXorXX(I, Q, *this))
5053 return R;
5054 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5055 return R;
5056
5057 {
5058 // Try to remove shared multiplier from comparison:
5059 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z
5060 Value *X, *Y, *Z;
5061 if (Pred == ICmpInst::getUnsignedPredicate(Pred) &&
5062 ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5063 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5064 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5065 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))))) {
5066 bool NonZero;
5067 if (ICmpInst::isEquality(Pred)) {
5068 KnownBits ZKnown = computeKnownBits(Z, 0, &I);
5069 // if Z % 2 != 0
5070 // X * Z eq/ne Y * Z -> X eq/ne Y
5071 if (ZKnown.countMaxTrailingZeros() == 0)
5072 return new ICmpInst(Pred, X, Y);
5073 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5074 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5075 // X * Z eq/ne Y * Z -> X eq/ne Y
5076 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5077 return new ICmpInst(Pred, X, Y);
5078 } else
5079 NonZero = isKnownNonZero(Z, Q);
5080
5081 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5082 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5083 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5084 return new ICmpInst(Pred, X, Y);
5085 }
5086 }
5087
5088 BinaryOperator *SRem = nullptr;
5089 // icmp (srem X, Y), Y
5090 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5091 SRem = BO0;
5092 // icmp Y, (srem X, Y)
5093 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5094 Op0 == BO1->getOperand(1))
5095 SRem = BO1;
5096 if (SRem) {
5097 // We don't check hasOneUse to avoid increasing register pressure because
5098 // the value we use is the same value this instruction was already using.
5099 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5100 default:
5101 break;
5102 case ICmpInst::ICMP_EQ:
5103 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5104 case ICmpInst::ICMP_NE:
5105 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5106 case ICmpInst::ICMP_SGT:
5107 case ICmpInst::ICMP_SGE:
5108 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5110 case ICmpInst::ICMP_SLT:
5111 case ICmpInst::ICMP_SLE:
5112 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5114 }
5115 }
5116
5117 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5118 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5119 BO0->getOperand(1) == BO1->getOperand(1)) {
5120 switch (BO0->getOpcode()) {
5121 default:
5122 break;
5123 case Instruction::Add:
5124 case Instruction::Sub:
5125 case Instruction::Xor: {
5126 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5127 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5128
5129 const APInt *C;
5130 if (match(BO0->getOperand(1), m_APInt(C))) {
5131 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5132 if (C->isSignMask()) {
5133 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5134 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5135 }
5136
5137 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5138 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5139 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5140 NewPred = I.getSwappedPredicate(NewPred);
5141 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5142 }
5143 }
5144 break;
5145 }
5146 case Instruction::Mul: {
5147 if (!I.isEquality())
5148 break;
5149
5150 const APInt *C;
5151 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5152 !C->isOne()) {
5153 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5154 // Mask = -1 >> count-trailing-zeros(C).
5155 if (unsigned TZs = C->countr_zero()) {
5156 Constant *Mask = ConstantInt::get(
5157 BO0->getType(),
5158 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5159 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5160 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5161 return new ICmpInst(Pred, And1, And2);
5162 }
5163 }
5164 break;
5165 }
5166 case Instruction::UDiv:
5167 case Instruction::LShr:
5168 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5169 break;
5170 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5171
5172 case Instruction::SDiv:
5173 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5174 !BO0->isExact() || !BO1->isExact())
5175 break;
5176 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5177
5178 case Instruction::AShr:
5179 if (!BO0->isExact() || !BO1->isExact())
5180 break;
5181 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5182
5183 case Instruction::Shl: {
5184 bool NUW = Op0HasNUW && Op1HasNUW;
5185 bool NSW = Op0HasNSW && Op1HasNSW;
5186 if (!NUW && !NSW)
5187 break;
5188 if (!NSW && I.isSigned())
5189 break;
5190 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5191 }
5192 }
5193 }
5194
5195 if (BO0) {
5196 // Transform A & (L - 1) `ult` L --> L != 0
5197 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5198 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5199
5200 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5201 auto *Zero = Constant::getNullValue(BO0->getType());
5202 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5203 }
5204 }
5205
5206 // For unsigned predicates / eq / ne:
5207 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5208 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5209 if (!ICmpInst::isSigned(Pred)) {
5210 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5211 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5212 Constant::getNullValue(Op1->getType()));
5213 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5214 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5215 Constant::getNullValue(Op0->getType()), Op0);
5216 }
5217
5219 return replaceInstUsesWith(I, V);
5220
5221 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5222 return R;
5223
5225 return replaceInstUsesWith(I, V);
5226
5228 return replaceInstUsesWith(I, V);
5229
5230 return nullptr;
5231}
5232
5233/// Fold icmp Pred min|max(X, Y), Z.
5236 Value *Z,
5237 ICmpInst::Predicate Pred) {
5238 Value *X = MinMax->getLHS();
5239 Value *Y = MinMax->getRHS();
5240 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5241 return nullptr;
5242 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5243 // Revert the transform signed pred -> unsigned pred
5244 // TODO: We can flip the signedness of predicate if both operands of icmp
5245 // are negative.
5249 } else
5250 return nullptr;
5251 }
5253 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5254 if (!Val)
5255 return std::nullopt;
5256 if (match(Val, m_One()))
5257 return true;
5258 if (match(Val, m_Zero()))
5259 return false;
5260 return std::nullopt;
5261 };
5262 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5263 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5264 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5265 return nullptr;
5266 if (!CmpXZ.has_value()) {
5267 std::swap(X, Y);
5268 std::swap(CmpXZ, CmpYZ);
5269 }
5270
5271 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5272 if (CmpYZ.has_value())
5273 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5274 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5275 };
5276
5277 switch (Pred) {
5278 case ICmpInst::ICMP_EQ:
5279 case ICmpInst::ICMP_NE: {
5280 // If X == Z:
5281 // Expr Result
5282 // min(X, Y) == Z X <= Y
5283 // max(X, Y) == Z X >= Y
5284 // min(X, Y) != Z X > Y
5285 // max(X, Y) != Z X < Y
5286 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5287 ICmpInst::Predicate NewPred =
5288 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5289 if (Pred == ICmpInst::ICMP_NE)
5290 NewPred = ICmpInst::getInversePredicate(NewPred);
5291 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5292 }
5293 // Otherwise (X != Z):
5294 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5295 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5296 if (!MinMaxCmpXZ.has_value()) {
5297 std::swap(X, Y);
5298 std::swap(CmpXZ, CmpYZ);
5299 // Re-check pre-condition X != Z
5300 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5301 break;
5302 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5303 }
5304 if (!MinMaxCmpXZ.has_value())
5305 break;
5306 if (*MinMaxCmpXZ) {
5307 // Expr Fact Result
5308 // min(X, Y) == Z X < Z false
5309 // max(X, Y) == Z X > Z false
5310 // min(X, Y) != Z X < Z true
5311 // max(X, Y) != Z X > Z true
5312 return replaceInstUsesWith(
5313 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5314 } else {
5315 // Expr Fact Result
5316 // min(X, Y) == Z X > Z Y == Z
5317 // max(X, Y) == Z X < Z Y == Z
5318 // min(X, Y) != Z X > Z Y != Z
5319 // max(X, Y) != Z X < Z Y != Z
5320 return FoldIntoCmpYZ();
5321 }
5322 break;
5323 }
5324 case ICmpInst::ICMP_SLT:
5325 case ICmpInst::ICMP_ULT:
5326 case ICmpInst::ICMP_SLE:
5327 case ICmpInst::ICMP_ULE:
5328 case ICmpInst::ICMP_SGT:
5329 case ICmpInst::ICMP_UGT:
5330 case ICmpInst::ICMP_SGE:
5331 case ICmpInst::ICMP_UGE: {
5332 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5333 if (*CmpXZ) {
5334 if (IsSame) {
5335 // Expr Fact Result
5336 // min(X, Y) < Z X < Z true
5337 // min(X, Y) <= Z X <= Z true
5338 // max(X, Y) > Z X > Z true
5339 // max(X, Y) >= Z X >= Z true
5340 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5341 } else {
5342 // Expr Fact Result
5343 // max(X, Y) < Z X < Z Y < Z
5344 // max(X, Y) <= Z X <= Z Y <= Z
5345 // min(X, Y) > Z X > Z Y > Z
5346 // min(X, Y) >= Z X >= Z Y >= Z
5347 return FoldIntoCmpYZ();
5348 }
5349 } else {
5350 if (IsSame) {
5351 // Expr Fact Result
5352 // min(X, Y) < Z X >= Z Y < Z
5353 // min(X, Y) <= Z X > Z Y <= Z
5354 // max(X, Y) > Z X <= Z Y > Z
5355 // max(X, Y) >= Z X < Z Y >= Z
5356 return FoldIntoCmpYZ();
5357 } else {
5358 // Expr Fact Result
5359 // max(X, Y) < Z X >= Z false
5360 // max(X, Y) <= Z X > Z false
5361 // min(X, Y) > Z X <= Z false
5362 // min(X, Y) >= Z X < Z false
5363 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5364 }
5365 }
5366 break;
5367 }
5368 default:
5369 break;
5370 }
5371
5372 return nullptr;
5373}
5374
5375// Canonicalize checking for a power-of-2-or-zero value:
5377 InstCombiner::BuilderTy &Builder) {
5378 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5379 const CmpInst::Predicate Pred = I.getPredicate();
5380 Value *A = nullptr;
5381 bool CheckIs;
5382 if (I.isEquality()) {
5383 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5384 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5385 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5386 m_Deferred(A)))) ||
5387 !match(Op1, m_ZeroInt()))
5388 A = nullptr;
5389
5390 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5391 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5392 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5393 A = Op1;
5394 else if (match(Op1,
5396 A = Op0;
5397
5398 CheckIs = Pred == ICmpInst::ICMP_EQ;
5399 } else if (ICmpInst::isUnsigned(Pred)) {
5400 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5401 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5402
5403 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5405 m_Specific(Op1))))) {
5406 A = Op1;
5407 CheckIs = Pred == ICmpInst::ICMP_UGE;
5408 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5410 m_Specific(Op0))))) {
5411 A = Op0;
5412 CheckIs = Pred == ICmpInst::ICMP_ULE;
5413 }
5414 }
5415
5416 if (A) {
5417 Type *Ty = A->getType();
5418 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5419 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5420 ConstantInt::get(Ty, 2))
5421 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5422 ConstantInt::get(Ty, 1));
5423 }
5424
5425 return nullptr;
5426}
5427
5429 if (!I.isEquality())
5430 return nullptr;
5431
5432 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5433 const CmpInst::Predicate Pred = I.getPredicate();
5434 Value *A, *B, *C, *D;
5435 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
5436 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
5437 Value *OtherVal = A == Op1 ? B : A;
5438 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5439 }
5440
5441 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
5442 // A^c1 == C^c2 --> A == C^(c1^c2)
5443 ConstantInt *C1, *C2;
5444 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
5445 Op1->hasOneUse()) {
5446 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
5448 return new ICmpInst(Pred, A, Xor);
5449 }
5450
5451 // A^B == A^D -> B == D
5452 if (A == C)
5453 return new ICmpInst(Pred, B, D);
5454 if (A == D)
5455 return new ICmpInst(Pred, B, C);
5456 if (B == C)
5457 return new ICmpInst(Pred, A, D);
5458 if (B == D)
5459 return new ICmpInst(Pred, A, C);
5460 }
5461 }
5462
5463 // canoncalize:
5464 // (icmp eq/ne (and X, C), X)
5465 // -> (icmp eq/ne (and X, ~C), 0)
5466 {
5467 Constant *CMask;
5468 A = nullptr;
5469 if (match(Op0, m_OneUse(m_And(m_Specific(Op1), m_ImmConstant(CMask)))))
5470 A = Op1;
5471 else if (match(Op1, m_OneUse(m_And(m_Specific(Op0), m_ImmConstant(CMask)))))
5472 A = Op0;
5473 if (A)
5474 return new ICmpInst(Pred, Builder.CreateAnd(A, Builder.CreateNot(CMask)),
5475 Constant::getNullValue(A->getType()));
5476 }
5477
5478 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
5479 // A == (A^B) -> B == 0
5480 Value *OtherVal = A == Op0 ? B : A;
5481 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
5482 }
5483
5484 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
5485 if (match(Op0, m_OneUse(m_And(m_Value(A), m_Value(B)))) &&
5486 match(Op1, m_OneUse(m_And(m_Value(C), m_Value(D))))) {
5487 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
5488
5489 if (A == C) {
5490 X = B;
5491 Y = D;
5492 Z = A;
5493 } else if (A == D) {
5494 X = B;
5495 Y = C;
5496 Z = A;
5497 } else if (B == C) {
5498 X = A;
5499 Y = D;
5500 Z = B;
5501 } else if (B == D) {
5502 X = A;
5503 Y = C;
5504 Z = B;
5505 }
5506
5507 if (X) { // Build (X^Y) & Z
5508 Op1 = Builder.CreateXor(X, Y);
5509 Op1 = Builder.CreateAnd(Op1, Z);
5510 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
5511 }
5512 }
5513
5514 {
5515 // Similar to above, but specialized for constant because invert is needed:
5516 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
5517 Value *X, *Y;
5518 Constant *C;
5519 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
5520 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
5523 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
5524 }
5525 }
5526
5527 if (match(Op1, m_ZExt(m_Value(A))) &&
5528 (Op0->hasOneUse() || Op1->hasOneUse())) {
5529 // (B & (Pow2C-1)) == zext A --> A == trunc B
5530 // (B & (Pow2C-1)) != zext A --> A != trunc B
5531 const APInt *MaskC;
5532 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
5533 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
5534 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
5535 }
5536
5537 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
5538 // For lshr and ashr pairs.
5539 const APInt *AP1, *AP2;
5540 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5541 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
5542 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
5543 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
5544 if (AP1 != AP2)
5545 return nullptr;
5546 unsigned TypeBits = AP1->getBitWidth();
5547 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
5548 if (ShAmt < TypeBits && ShAmt != 0) {
5549 ICmpInst::Predicate NewPred =
5551 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5552 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
5553 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
5554 }
5555 }
5556
5557 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
5558 ConstantInt *Cst1;
5559 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
5560 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
5561 unsigned TypeBits = Cst1->getBitWidth();
5562 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
5563 if (ShAmt < TypeBits && ShAmt != 0) {
5564 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
5565 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
5567 I.getName() + ".mask");
5568 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
5569 }
5570 }
5571
5572 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
5573 // "icmp (and X, mask), cst"
5574 uint64_t ShAmt = 0;
5575 if (Op0->hasOneUse() &&
5576 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
5577 match(Op1, m_ConstantInt(Cst1)) &&
5578 // Only do this when A has multiple uses. This is most important to do
5579 // when it exposes other optimizations.
5580 !A->hasOneUse()) {
5581 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
5582
5583 if (ShAmt < ASize) {
5584 APInt MaskV =
5586 MaskV <<= ShAmt;
5587
5588 APInt CmpV = Cst1->getValue().zext(ASize);
5589 CmpV <<= ShAmt;
5590
5591 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
5592 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
5593 }
5594 }
5595
5597 return ICmp;
5598
5599 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks the
5600 // top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s INT_MAX",
5601 // which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a few steps
5602 // of instcombine.
5603 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
5604 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
5606 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
5607 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
5609 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
5610 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
5612 Add, ConstantInt::get(A->getType(), C.shl(1)));
5613 }
5614
5615 // Canonicalize:
5616 // Assume B_Pow2 != 0
5617 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
5618 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
5619 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
5620 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, 0, &I))
5621 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
5623
5624 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
5625 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, 0, &I))
5626 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
5627 ConstantInt::getNullValue(Op1->getType()));
5628
5629 // Canonicalize:
5630 // icmp eq/ne X, OneUse(rotate-right(X))
5631 // -> icmp eq/ne X, rotate-left(X)
5632 // We generally try to convert rotate-right -> rotate-left, this just
5633 // canonicalizes another case.
5634 CmpInst::Predicate PredUnused = Pred;
5635 if (match(&I, m_c_ICmp(PredUnused, m_Value(A),
5636 m_OneUse(m_Intrinsic<Intrinsic::fshr>(
5637 m_Deferred(A), m_Deferred(A), m_Value(B))))))
5638 return new ICmpInst(
5639 Pred, A,
5640 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
5641
5642 // Canonicalize:
5643 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
5644 Constant *Cst;
5645 if (match(&I, m_c_ICmp(PredUnused,
5648 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
5649
5650 {
5651 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5652 auto m_Matcher =
5655 m_Sub(m_Value(B), m_Deferred(A)));
5656 std::optional<bool> IsZero = std::nullopt;
5657 if (match(&I, m_c_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5658 m_Deferred(A))))
5659 IsZero = false;
5660 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5661 else if (match(&I,
5662 m_ICmp(PredUnused, m_OneUse(m_c_And(m_Value(A), m_Matcher)),
5663 m_Zero())))
5664 IsZero = true;
5665
5666 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, /*Depth*/ 0, &I))
5667 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
5668 // -> (icmp eq/ne (and X, P2), 0)
5669 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
5670 // -> (icmp eq/ne (and X, P2), P2)
5671 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
5672 *IsZero ? A
5673 : ConstantInt::getNullValue(A->getType()));
5674 }
5675
5676 return nullptr;
5677}
5678
5680 ICmpInst::Predicate Pred = ICmp.getPredicate();
5681 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
5682
5683 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
5684 // The trunc masks high bits while the compare may effectively mask low bits.
5685 Value *X;
5686 const APInt *C;
5687 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
5688 return nullptr;
5689
5690 // This matches patterns corresponding to tests of the signbit as well as:
5691 // (trunc X) u< C --> (X & -C) == 0 (are all masked-high-bits clear?)
5692 // (trunc X) u> C --> (X & ~C) != 0 (are any masked-high-bits set?)
5693 APInt Mask;
5694 if (decomposeBitTestICmp(Op0, Op1, Pred, X, Mask, true /* WithTrunc */)) {
5695 Value *And = Builder.CreateAnd(X, Mask);
5696 Constant *Zero = ConstantInt::getNullValue(X->getType());
5697 return new ICmpInst(Pred, And, Zero);
5698 }
5699
5700 unsigned SrcBits = X->getType()->getScalarSizeInBits();
5701 if (Pred == ICmpInst::ICMP_ULT && C->isNegatedPowerOf2()) {
5702 // If C is a negative power-of-2 (high-bit mask):
5703 // (trunc X) u< C --> (X & C) != C (are any masked-high-bits clear?)
5704 Constant *MaskC = ConstantInt::get(X->getType(), C->zext(SrcBits));
5705 Value *And = Builder.CreateAnd(X, MaskC);
5706 return new ICmpInst(ICmpInst::ICMP_NE, And, MaskC);
5707 }
5708
5709 if (Pred == ICmpInst::ICMP_UGT && (~*C).isPowerOf2()) {
5710 // If C is not-of-power-of-2 (one clear bit):
5711 // (trunc X) u> C --> (X & (C+1)) == C+1 (are all masked-high-bits set?)
5712 Constant *MaskC = ConstantInt::get(X->getType(), (*C + 1).zext(SrcBits));
5713 Value *And = Builder.CreateAnd(X, MaskC);
5714 return new ICmpInst(ICmpInst::ICMP_EQ, And, MaskC);
5715 }
5716
5717 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
5718 if (II->getIntrinsicID() == Intrinsic::cttz ||
5719 II->getIntrinsicID() == Intrinsic::ctlz) {
5720 unsigned MaxRet = SrcBits;
5721 // If the "is_zero_poison" argument is set, then we know at least
5722 // one bit is set in the input, so the result is always at least one
5723 // less than the full bitwidth of that input.
5724 if (match(II->getArgOperand(1), m_One()))
5725 MaxRet--;
5726
5727 // Make sure the destination is wide enough to hold the largest output of
5728 // the intrinsic.
5729 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
5730 if (Instruction *I =
5731 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
5732 return I;
5733 }
5734 }
5735
5736 return nullptr;
5737}
5738
5740 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
5741 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
5742 Value *X;
5743 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
5744 return nullptr;
5745
5746 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
5747 bool IsSignedCmp = ICmp.isSigned();
5748
5749 // icmp Pred (ext X), (ext Y)
5750 Value *Y;
5751 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
5752 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
5753 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
5754
5755 if (IsZext0 != IsZext1) {
5756 // If X and Y and both i1
5757 // (icmp eq/ne (zext X) (sext Y))
5758 // eq -> (icmp eq (or X, Y), 0)
5759 // ne -> (icmp ne (or X, Y), 0)
5760 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
5761 Y->getType()->isIntOrIntVectorTy(1))
5762 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
5763 Constant::getNullValue(X->getType()));
5764
5765 // If we have mismatched casts and zext has the nneg flag, we can
5766 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
5767
5768 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
5769 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
5770
5771 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
5772 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
5773
5774 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
5775 IsSignedExt = true;
5776 else
5777 return nullptr;
5778 }
5779
5780 // Not an extension from the same type?
5781 Type *XTy = X->getType(), *YTy = Y->getType();
5782 if (XTy != YTy) {
5783 // One of the casts must have one use because we are creating a new cast.
5784 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
5785 return nullptr;
5786 // Extend the narrower operand to the type of the wider operand.
5787 CastInst::CastOps CastOpcode =
5788 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
5789 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
5790 X = Builder.CreateCast(CastOpcode, X, YTy);
5791 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
5792 Y = Builder.CreateCast(CastOpcode, Y, XTy);
5793 else
5794 return nullptr;
5795 }
5796
5797 // (zext X) == (zext Y) --> X == Y
5798 // (sext X) == (sext Y) --> X == Y
5799 if (ICmp.isEquality())
5800 return new ICmpInst(ICmp.getPredicate(), X, Y);
5801
5802 // A signed comparison of sign extended values simplifies into a
5803 // signed comparison.
5804 if (IsSignedCmp && IsSignedExt)
5805 return new ICmpInst(ICmp.getPredicate(), X, Y);
5806
5807 // The other three cases all fold into an unsigned comparison.
5808 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
5809 }
5810
5811 // Below here, we are only folding a compare with constant.
5812 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
5813 if (!C)
5814 return nullptr;
5815
5816 // If a lossless truncate is possible...
5817 Type *SrcTy = CastOp0->getSrcTy();
5818 Constant *Res = getLosslessTrunc(C, SrcTy, CastOp0->getOpcode());
5819 if (Res) {
5820 if (ICmp.isEquality())
5821 return new ICmpInst(ICmp.getPredicate(), X, Res);
5822
5823 // A signed comparison of sign extended values simplifies into a
5824 // signed comparison.
5825 if (IsSignedExt && IsSignedCmp)
5826 return new ICmpInst(ICmp.getPredicate(), X, Res);
5827
5828 // The other three cases all fold into an unsigned comparison.
5829 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
5830 }
5831
5832 // The re-extended constant changed, partly changed (in the case of a vector),
5833 // or could not be determined to be equal (in the case of a constant
5834 // expression), so the constant cannot be represented in the shorter type.
5835 // All the cases that fold to true or false will have already been handled
5836 // by simplifyICmpInst, so only deal with the tricky case.
5837 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
5838 return nullptr;
5839
5840 // Is source op positive?
5841 // icmp ult (sext X), C --> icmp sgt X, -1
5842 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
5844
5845 // Is source op negative?
5846 // icmp ugt (sext X), C --> icmp slt X, 0
5847 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
5849}
5850
5851/// Handle icmp (cast x), (cast or constant).
5853 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
5854 // icmp compares only pointer's value.
5855 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
5856 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
5857 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
5858 if (SimplifiedOp0 || SimplifiedOp1)
5859 return new ICmpInst(ICmp.getPredicate(),
5860 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
5861 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
5862
5863 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
5864 if (!CastOp0)
5865 return nullptr;
5866 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
5867 return nullptr;
5868
5869 Value *Op0Src = CastOp0->getOperand(0);
5870 Type *SrcTy = CastOp0->getSrcTy();
5871 Type *DestTy = CastOp0->getDestTy();
5872
5873 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
5874 // integer type is the same size as the pointer type.
5875 auto CompatibleSizes = [&](Type *SrcTy, Type *DestTy) {
5876 if (isa<VectorType>(SrcTy)) {
5877 SrcTy = cast<VectorType>(SrcTy)->getElementType();
5878 DestTy = cast<VectorType>(DestTy)->getElementType();
5879 }
5880 return DL.getPointerTypeSizeInBits(SrcTy) == DestTy->getIntegerBitWidth();
5881 };
5882 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
5883 CompatibleSizes(SrcTy, DestTy)) {
5884 Value *NewOp1 = nullptr;
5885 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
5886 Value *PtrSrc = PtrToIntOp1->getOperand(0);
5887 if (PtrSrc->getType() == Op0Src->getType())
5888 NewOp1 = PtrToIntOp1->getOperand(0);
5889 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
5890 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
5891 }
5892
5893 if (NewOp1)
5894 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
5895 }
5896
5897 if (Instruction *R = foldICmpWithTrunc(ICmp))
5898 return R;
5899
5900 return foldICmpWithZextOrSext(ICmp);
5901}
5902
5903static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
5904 switch (BinaryOp) {
5905 default:
5906 llvm_unreachable("Unsupported binary op");
5907 case Instruction::Add:
5908 case Instruction::Sub:
5909 return match(RHS, m_Zero());
5910 case Instruction::Mul:
5911 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
5912 match(RHS, m_One());
5913 }
5914}
5915
5918 bool IsSigned, Value *LHS, Value *RHS,
5919 Instruction *CxtI) const {
5920 switch (BinaryOp) {
5921 default:
5922 llvm_unreachable("Unsupported binary op");
5923 case Instruction::Add:
5924 if (IsSigned)
5925 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
5926 else
5927 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
5928 case Instruction::Sub:
5929 if (IsSigned)
5930 return computeOverflowForSignedSub(LHS, RHS, CxtI);
5931 else
5932 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
5933 case Instruction::Mul:
5934 if (IsSigned)
5935 return computeOverflowForSignedMul(LHS, RHS, CxtI);
5936 else
5937 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
5938 }
5939}
5940
5941bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
5942 bool IsSigned, Value *LHS,
5943 Value *RHS, Instruction &OrigI,
5944 Value *&Result,
5945 Constant *&Overflow) {
5946 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
5947 std::swap(LHS, RHS);
5948
5949 // If the overflow check was an add followed by a compare, the insertion point
5950 // may be pointing to the compare. We want to insert the new instructions
5951 // before the add in case there are uses of the add between the add and the
5952 // compare.
5953 Builder.SetInsertPoint(&OrigI);
5954
5955 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
5956 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
5957 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
5958
5959 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
5960 Result = LHS;
5961 Overflow = ConstantInt::getFalse(OverflowTy);
5962 return true;
5963 }
5964
5965 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
5967 return false;
5970 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
5971 Result->takeName(&OrigI);
5972 Overflow = ConstantInt::getTrue(OverflowTy);
5973 return true;
5975 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
5976 Result->takeName(&OrigI);
5977 Overflow = ConstantInt::getFalse(OverflowTy);
5978 if (auto *Inst = dyn_cast<Instruction>(Result)) {
5979 if (IsSigned)
5980 Inst->setHasNoSignedWrap();
5981 else
5982 Inst->setHasNoUnsignedWrap();
5983 }
5984 return true;
5985 }
5986
5987 llvm_unreachable("Unexpected overflow result");
5988}
5989
5990/// Recognize and process idiom involving test for multiplication
5991/// overflow.
5992///
5993/// The caller has matched a pattern of the form:
5994/// I = cmp u (mul(zext A, zext B), V
5995/// The function checks if this is a test for overflow and if so replaces
5996/// multiplication with call to 'mul.with.overflow' intrinsic.
5997///
5998/// \param I Compare instruction.
5999/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6000/// the compare instruction. Must be of integer type.
6001/// \param OtherVal The other argument of compare instruction.
6002/// \returns Instruction which must replace the compare instruction, NULL if no
6003/// replacement required.
6005 const APInt *OtherVal,
6006 InstCombinerImpl &IC) {
6007 // Don't bother doing this transformation for pointers, don't do it for
6008 // vectors.
6009 if (!isa<IntegerType>(MulVal->getType()))
6010 return nullptr;
6011
6012 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6013 if (!MulInstr)
6014 return nullptr;
6015 assert(MulInstr->getOpcode() == Instruction::Mul);
6016
6017 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6018 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6019 assert(LHS->getOpcode() == Instruction::ZExt);
6020 assert(RHS->getOpcode() == Instruction::ZExt);
6021 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6022
6023 // Calculate type and width of the result produced by mul.with.overflow.
6024 Type *TyA = A->getType(), *TyB = B->getType();
6025 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6026 WidthB = TyB->getPrimitiveSizeInBits();
6027 unsigned MulWidth;
6028 Type *MulType;
6029 if (WidthB > WidthA) {
6030 MulWidth = WidthB;
6031 MulType = TyB;
6032 } else {
6033 MulWidth = WidthA;
6034 MulType = TyA;
6035 }
6036
6037 // In order to replace the original mul with a narrower mul.with.overflow,
6038 // all uses must ignore upper bits of the product. The number of used low
6039 // bits must be not greater than the width of mul.with.overflow.
6040 if (MulVal->hasNUsesOrMore(2))
6041 for (User *U : MulVal->users()) {
6042 if (U == &I)
6043 continue;
6044 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6045 // Check if truncation ignores bits above MulWidth.
6046 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6047 if (TruncWidth > MulWidth)
6048 return nullptr;
6049 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6050 // Check if AND ignores bits above MulWidth.
6051 if (BO->getOpcode() != Instruction::And)
6052 return nullptr;
6053 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6054 const APInt &CVal = CI->getValue();
6055 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6056 return nullptr;
6057 } else {
6058 // In this case we could have the operand of the binary operation
6059 // being defined in another block, and performing the replacement
6060 // could break the dominance relation.
6061 return nullptr;
6062 }
6063 } else {
6064 // Other uses prohibit this transformation.
6065 return nullptr;
6066 }
6067 }
6068
6069 // Recognize patterns
6070 switch (I.getPredicate()) {
6071 case ICmpInst::ICMP_UGT: {
6072 // Recognize pattern:
6073 // mulval = mul(zext A, zext B)
6074 // cmp ugt mulval, max
6075 APInt MaxVal = APInt::getMaxValue(MulWidth);
6076 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6077 if (MaxVal.eq(*OtherVal))
6078 break; // Recognized
6079 return nullptr;
6080 }
6081
6082 case ICmpInst::ICMP_ULT: {
6083 // Recognize pattern:
6084 // mulval = mul(zext A, zext B)
6085 // cmp ule mulval, max + 1
6086 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6087 if (MaxVal.eq(*OtherVal))
6088 break; // Recognized
6089 return nullptr;
6090 }
6091
6092 default:
6093 return nullptr;
6094 }
6095
6096 InstCombiner::BuilderTy &Builder = IC.Builder;
6097 Builder.SetInsertPoint(MulInstr);
6098
6099 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6100 Value *MulA = A, *MulB = B;
6101 if (WidthA < MulWidth)
6102 MulA = Builder.CreateZExt(A, MulType);
6103 if (WidthB < MulWidth)
6104 MulB = Builder.CreateZExt(B, MulType);
6106 I.getModule(), Intrinsic::umul_with_overflow, MulType);
6107 CallInst *Call = Builder.CreateCall(F, {MulA, MulB}, "umul");
6108 IC.addToWorklist(MulInstr);
6109
6110 // If there are uses of mul result other than the comparison, we know that
6111 // they are truncation or binary AND. Change them to use result of
6112 // mul.with.overflow and adjust properly mask/size.
6113 if (MulVal->hasNUsesOrMore(2)) {
6114 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6115 for (User *U : make_early_inc_range(MulVal->users())) {
6116 if (U == &I)
6117 continue;
6118 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6119 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6120 IC.replaceInstUsesWith(*TI, Mul);
6121 else
6122 TI->setOperand(0, Mul);
6123 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6124 assert(BO->getOpcode() == Instruction::And);
6125 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6126 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6127 APInt ShortMask = CI->getValue().trunc(MulWidth);
6128 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6129 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6130 IC.replaceInstUsesWith(*BO, Zext);
6131 } else {
6132 llvm_unreachable("Unexpected Binary operation");
6133 }
6134 IC.addToWorklist(cast<Instruction>(U));
6135 }
6136 }
6137
6138 // The original icmp gets replaced with the overflow value, maybe inverted
6139 // depending on predicate.
6140 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6141 Value *Res = Builder.CreateExtractValue(Call, 1);
6142 return BinaryOperator::CreateNot(Res);
6143 }
6144
6145 return ExtractValueInst::Create(Call, 1);
6146}
6147
6148/// When performing a comparison against a constant, it is possible that not all
6149/// the bits in the LHS are demanded. This helper method computes the mask that
6150/// IS demanded.
6152 const APInt *RHS;
6153 if (!match(I.getOperand(1), m_APInt(RHS)))
6155
6156 // If this is a normal comparison, it demands all bits. If it is a sign bit
6157 // comparison, it only demands the sign bit.
6158 bool UnusedBit;
6159 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6161
6162 switch (I.getPredicate()) {
6163 // For a UGT comparison, we don't care about any bits that
6164 // correspond to the trailing ones of the comparand. The value of these
6165 // bits doesn't impact the outcome of the comparison, because any value
6166 // greater than the RHS must differ in a bit higher than these due to carry.
6167 case ICmpInst::ICMP_UGT:
6168 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6169
6170 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6171 // Any value less than the RHS must differ in a higher bit because of carries.
6172 case ICmpInst::ICMP_ULT:
6173 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6174
6175 default:
6177 }
6178}
6179
6180/// Check that one use is in the same block as the definition and all
6181/// other uses are in blocks dominated by a given block.
6182///
6183/// \param DI Definition
6184/// \param UI Use
6185/// \param DB Block that must dominate all uses of \p DI outside
6186/// the parent block
6187/// \return true when \p UI is the only use of \p DI in the parent block
6188/// and all other uses of \p DI are in blocks dominated by \p DB.
6189///
6191 const Instruction *UI,
6192 const BasicBlock *DB) const {
6193 assert(DI && UI && "Instruction not defined\n");
6194 // Ignore incomplete definitions.
6195 if (!DI->getParent())
6196 return false;
6197 // DI and UI must be in the same block.
6198 if (DI->getParent() != UI->getParent())
6199 return false;
6200 // Protect from self-referencing blocks.
6201 if (DI->getParent() == DB)
6202 return false;
6203 for (const User *U : DI->users()) {
6204 auto *Usr = cast<Instruction>(U);
6205 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6206 return false;
6207 }
6208 return true;
6209}
6210
6211/// Return true when the instruction sequence within a block is select-cmp-br.
6212static bool isChainSelectCmpBranch(const SelectInst *SI) {
6213 const BasicBlock *BB = SI->getParent();
6214 if (!BB)
6215 return false;
6216 auto *BI = dyn_cast_or_null<BranchInst>(BB->getTerminator());
6217 if (!BI || BI->getNumSuccessors() != 2)
6218 return false;
6219 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6220 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6221 return false;
6222 return true;
6223}
6224
6225/// True when a select result is replaced by one of its operands
6226/// in select-icmp sequence. This will eventually result in the elimination
6227/// of the select.
6228///
6229/// \param SI Select instruction
6230/// \param Icmp Compare instruction
6231/// \param SIOpd Operand that replaces the select
6232///
6233/// Notes:
6234/// - The replacement is global and requires dominator information
6235/// - The caller is responsible for the actual replacement
6236///
6237/// Example:
6238///
6239/// entry:
6240/// %4 = select i1 %3, %C* %0, %C* null
6241/// %5 = icmp eq %C* %4, null
6242/// br i1 %5, label %9, label %7
6243/// ...
6244/// ; <label>:7 ; preds = %entry
6245/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6246/// ...
6247///
6248/// can be transformed to
6249///
6250/// %5 = icmp eq %C* %0, null
6251/// %6 = select i1 %3, i1 %5, i1 true
6252/// br i1 %6, label %9, label %7
6253/// ...
6254/// ; <label>:7 ; preds = %entry
6255/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6256///
6257/// Similar when the first operand of the select is a constant or/and
6258/// the compare is for not equal rather than equal.
6259///
6260/// NOTE: The function is only called when the select and compare constants
6261/// are equal, the optimization can work only for EQ predicates. This is not a
6262/// major restriction since a NE compare should be 'normalized' to an equal
6263/// compare, which usually happens in the combiner and test case
6264/// select-cmp-br.ll checks for it.
6266 const ICmpInst *Icmp,
6267 const unsigned SIOpd) {
6268 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6270 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6271 // The check for the single predecessor is not the best that can be
6272 // done. But it protects efficiently against cases like when SI's
6273 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6274 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6275 // replaced can be reached on either path. So the uniqueness check
6276 // guarantees that the path all uses of SI (outside SI's parent) are on
6277 // is disjoint from all other paths out of SI. But that information
6278 // is more expensive to compute, and the trade-off here is in favor
6279 // of compile-time. It should also be noticed that we check for a single
6280 // predecessor and not only uniqueness. This to handle the situation when
6281 // Succ and Succ1 points to the same basic block.
6282 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6283 NumSel++;
6284 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6285 return true;
6286 }
6287 }
6288 return false;
6289}
6290
6291/// Try to fold the comparison based on range information we can get by checking
6292/// whether bits are known to be zero or one in the inputs.
6294 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6295 Type *Ty = Op0->getType();
6296 ICmpInst::Predicate Pred = I.getPredicate();
6297
6298 // Get scalar or pointer size.
6299 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6300 ? Ty->getScalarSizeInBits()
6302
6303 if (!BitWidth)
6304 return nullptr;
6305
6306 KnownBits Op0Known(BitWidth);
6307 KnownBits Op1Known(BitWidth);
6308
6309 {
6310 // Don't use dominating conditions when folding icmp using known bits. This
6311 // may convert signed into unsigned predicates in ways that other passes
6312 // (especially IndVarSimplify) may not be able to reliably undo.
6313 SQ.DC = nullptr;
6314 auto _ = make_scope_exit([&]() { SQ.DC = &DC; });
6316 Op0Known, 0))
6317 return &I;
6318
6319 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, 0))
6320 return &I;
6321 }
6322
6323 // Given the known and unknown bits, compute a range that the LHS could be
6324 // in. Compute the Min, Max and RHS values based on the known bits. For the
6325 // EQ and NE we use unsigned values.
6326 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6327 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6328 if (I.isSigned()) {
6329 Op0Min = Op0Known.getSignedMinValue();
6330 Op0Max = Op0Known.getSignedMaxValue();
6331 Op1Min = Op1Known.getSignedMinValue();
6332 Op1Max = Op1Known.getSignedMaxValue();
6333 } else {
6334 Op0Min = Op0Known.getMinValue();
6335 Op0Max = Op0Known.getMaxValue();
6336 Op1Min = Op1Known.getMinValue();
6337 Op1Max = Op1Known.getMaxValue();
6338 }
6339
6340 // If Min and Max are known to be the same, then SimplifyDemandedBits figured
6341 // out that the LHS or RHS is a constant. Constant fold this now, so that
6342 // code below can assume that Min != Max.
6343 if (!isa<Constant>(Op0) && Op0Min == Op0Max)
6344 return new ICmpInst(Pred, ConstantExpr::getIntegerValue(Ty, Op0Min), Op1);
6345 if (!isa<Constant>(Op1) && Op1Min == Op1Max)
6346 return new ICmpInst(Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Min));
6347
6348 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6349 // min/max canonical compare with some other compare. That could lead to
6350 // conflict with select canonicalization and infinite looping.
6351 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6352 auto isMinMaxCmp = [&](Instruction &Cmp) {
6353 if (!Cmp.hasOneUse())
6354 return false;
6355 Value *A, *B;
6356 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6358 return false;
6359 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6360 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6361 };
6362 if (!isMinMaxCmp(I)) {
6363 switch (Pred) {
6364 default:
6365 break;
6366 case ICmpInst::ICMP_ULT: {
6367 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6368 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6369 const APInt *CmpC;
6370 if (match(Op1, m_APInt(CmpC))) {
6371 // A <u C -> A == C-1 if min(A)+1 == C
6372 if (*CmpC == Op0Min + 1)
6373 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6374 ConstantInt::get(Op1->getType(), *CmpC - 1));
6375 // X <u C --> X == 0, if the number of zero bits in the bottom of X
6376 // exceeds the log2 of C.
6377 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
6378 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6379 Constant::getNullValue(Op1->getType()));
6380 }
6381 break;
6382 }
6383 case ICmpInst::ICMP_UGT: {
6384 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
6385 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6386 const APInt *CmpC;
6387 if (match(Op1, m_APInt(CmpC))) {
6388 // A >u C -> A == C+1 if max(a)-1 == C
6389 if (*CmpC == Op0Max - 1)
6390 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6391 ConstantInt::get(Op1->getType(), *CmpC + 1));
6392 // X >u C --> X != 0, if the number of zero bits in the bottom of X
6393 // exceeds the log2 of C.
6394 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
6395 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
6396 Constant::getNullValue(Op1->getType()));
6397 }
6398 break;
6399 }
6400 case ICmpInst::ICMP_SLT: {
6401 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
6402 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6403 const APInt *CmpC;
6404 if (match(Op1, m_APInt(CmpC))) {
6405 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
6406 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6407 ConstantInt::get(Op1->getType(), *CmpC - 1));
6408 }
6409 break;
6410 }
6411 case ICmpInst::ICMP_SGT: {
6412 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
6413 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6414 const APInt *CmpC;
6415 if (match(Op1, m_APInt(CmpC))) {
6416 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
6417 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
6418 ConstantInt::get(Op1->getType(), *CmpC + 1));
6419 }
6420 break;
6421 }
6422 }
6423 }
6424
6425 // Based on the range information we know about the LHS, see if we can
6426 // simplify this comparison. For example, (x&4) < 8 is always true.
6427 switch (Pred) {
6428 default:
6429 llvm_unreachable("Unknown icmp opcode!");
6430 case ICmpInst::ICMP_EQ:
6431 case ICmpInst::ICMP_NE: {
6432 if (Op0Max.ult(Op1Min) || Op0Min.ugt(Op1Max))
6433 return replaceInstUsesWith(
6434 I, ConstantInt::getBool(I.getType(), Pred == CmpInst::ICMP_NE));
6435
6436 // If all bits are known zero except for one, then we know at most one bit
6437 // is set. If the comparison is against zero, then this is a check to see if
6438 // *that* bit is set.
6439 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
6440 if (Op1Known.isZero()) {
6441 // If the LHS is an AND with the same constant, look through it.
6442 Value *LHS = nullptr;
6443 const APInt *LHSC;
6444 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
6445 *LHSC != Op0KnownZeroInverted)
6446 LHS = Op0;
6447
6448 Value *X;
6449 const APInt *C1;
6450 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
6451 Type *XTy = X->getType();
6452 unsigned Log2C1 = C1->countr_zero();
6453 APInt C2 = Op0KnownZeroInverted;
6454 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
6455 if (C2Pow2.isPowerOf2()) {
6456 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
6457 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
6458 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
6459 unsigned Log2C2 = C2Pow2.countr_zero();
6460 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
6461 auto NewPred =
6463 return new ICmpInst(NewPred, X, CmpC);
6464 }
6465 }
6466 }
6467
6468 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
6469 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
6470 (Op0Known & Op1Known) == Op0Known)
6471 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6472 ConstantInt::getNullValue(Op1->getType()));
6473 break;
6474 }
6475 case ICmpInst::ICMP_ULT: {
6476 if (Op0Max.ult(Op1Min)) // A <u B -> true if max(A) < min(B)
6477 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6478 if (Op0Min.uge(Op1Max)) // A <u B -> false if min(A) >= max(B)
6479 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6480 break;
6481 }
6482 case ICmpInst::ICMP_UGT: {
6483 if (Op0Min.ugt(Op1Max)) // A >u B -> true if min(A) > max(B)
6484 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6485 if (Op0Max.ule(Op1Min)) // A >u B -> false if max(A) <= max(B)
6486 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6487 break;
6488 }
6489 case ICmpInst::ICMP_SLT: {
6490 if (Op0Max.slt(Op1Min)) // A <s B -> true if max(A) < min(C)
6491 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6492 if (Op0Min.sge(Op1Max)) // A <s B -> false if min(A) >= max(C)
6493 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6494 break;
6495 }
6496 case ICmpInst::ICMP_SGT: {
6497 if (Op0Min.sgt(Op1Max)) // A >s B -> true if min(A) > max(B)
6498 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6499 if (Op0Max.sle(Op1Min)) // A >s B -> false if max(A) <= min(B)
6500 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6501 break;
6502 }
6503 case ICmpInst::ICMP_SGE:
6504 assert(!isa<ConstantInt>(Op1) && "ICMP_SGE with ConstantInt not folded!");
6505 if (Op0Min.sge(Op1Max)) // A >=s B -> true if min(A) >= max(B)
6506 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6507 if (Op0Max.slt(Op1Min)) // A >=s B -> false if max(A) < min(B)
6508 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6509 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
6510 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6511 break;
6512 case ICmpInst::ICMP_SLE:
6513 assert(!isa<ConstantInt>(Op1) && "ICMP_SLE with ConstantInt not folded!");
6514 if (Op0Max.sle(Op1Min)) // A <=s B -> true if max(A) <= min(B)
6515 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6516 if (Op0Min.sgt(Op1Max)) // A <=s B -> false if min(A) > max(B)
6517 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6518 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
6519 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6520 break;
6521 case ICmpInst::ICMP_UGE:
6522 assert(!isa<ConstantInt>(Op1) && "ICMP_UGE with ConstantInt not folded!");
6523 if (Op0Min.uge(Op1Max)) // A >=u B -> true if min(A) >= max(B)
6524 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6525 if (Op0Max.ult(Op1Min)) // A >=u B -> false if max(A) < min(B)
6526 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6527 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
6528 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6529 break;
6530 case ICmpInst::ICMP_ULE:
6531 assert(!isa<ConstantInt>(Op1) && "ICMP_ULE with ConstantInt not folded!");
6532 if (Op0Max.ule(Op1Min)) // A <=u B -> true if max(A) <= min(B)
6533 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
6534 if (Op0Min.ugt(Op1Max)) // A <=u B -> false if min(A) > max(B)
6535 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
6536 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
6537 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
6538 break;
6539 }
6540
6541 // Turn a signed comparison into an unsigned one if both operands are known to
6542 // have the same sign.
6543 if (I.isSigned() &&
6544 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6545 (Op0Known.One.isNegative() && Op1Known.One.isNegative())))
6546 return new ICmpInst(I.getUnsignedPredicate(), Op0, Op1);
6547
6548 return nullptr;
6549}
6550
6551/// If one operand of an icmp is effectively a bool (value range of {0,1}),
6552/// then try to reduce patterns based on that limit.
6554 Value *X, *Y;
6556
6557 // X must be 0 and bool must be true for "ULT":
6558 // X <u (zext i1 Y) --> (X == 0) & Y
6559 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
6560 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
6561 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
6562
6563 // X must be 0 or bool must be true for "ULE":
6564 // X <=u (sext i1 Y) --> (X == 0) | Y
6565 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
6566 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
6567 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
6568
6569 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
6570 ICmpInst::Predicate Pred1, Pred2;
6571 const APInt *C;
6572 Instruction *ExtI;
6573 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
6576 m_APInt(C)))))) &&
6577 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
6578 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
6579 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
6580 auto CreateRangeCheck = [&] {
6581 Value *CmpV1 =
6582 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
6583 Value *CmpV2 = Builder.CreateICmp(
6584 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
6586 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
6587 CmpV1, CmpV2);
6588 };
6589 if (C->isZero()) {
6590 if (Pred2 == ICmpInst::ICMP_EQ) {
6591 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
6592 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
6593 return replaceInstUsesWith(
6594 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6595 } else if (!IsSExt || HasOneUse) {
6596 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
6597 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
6598 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
6599 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X == -1
6600 return CreateRangeCheck();
6601 }
6602 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
6603 if (Pred2 == ICmpInst::ICMP_NE) {
6604 // icmp eq X, (zext (icmp ne X, 1)) --> false
6605 // icmp ne X, (zext (icmp ne X, 1)) --> true
6606 // icmp eq X, (sext (icmp ne X, -1)) --> false
6607 // icmp ne X, (sext (icmp ne X, -1)) --> true
6608 return replaceInstUsesWith(
6609 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
6610 } else if (!IsSExt || HasOneUse) {
6611 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
6612 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
6613 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
6614 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
6615 return CreateRangeCheck();
6616 }
6617 } else {
6618 // when C != 0 && C != 1:
6619 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
6620 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
6621 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
6622 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
6623 // when C != 0 && C != -1:
6624 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
6625 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
6626 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
6627 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
6628 return ICmpInst::Create(
6629 Instruction::ICmp, Pred1, X,
6630 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
6631 ? (IsSExt ? -1 : 1)
6632 : 0));
6633 }
6634 }
6635
6636 return nullptr;
6637}
6638
6639std::optional<std::pair<CmpInst::Predicate, Constant *>>
6641 Constant *C) {
6643 "Only for relational integer predicates.");
6644
6645 Type *Type = C->getType();
6646 bool IsSigned = ICmpInst::isSigned(Pred);
6647
6649 bool WillIncrement =
6650 UnsignedPred == ICmpInst::ICMP_ULE || UnsignedPred == ICmpInst::ICMP_UGT;
6651
6652 // Check if the constant operand can be safely incremented/decremented
6653 // without overflowing/underflowing.
6654 auto ConstantIsOk = [WillIncrement, IsSigned](ConstantInt *C) {
6655 return WillIncrement ? !C->isMaxValue(IsSigned) : !C->isMinValue(IsSigned);
6656 };
6657
6658 Constant *SafeReplacementConstant = nullptr;
6659 if (auto *CI = dyn_cast<ConstantInt>(C)) {
6660 // Bail out if the constant can't be safely incremented/decremented.
6661 if (!ConstantIsOk(CI))
6662 return std::nullopt;
6663 } else if (auto *FVTy = dyn_cast<FixedVectorType>(Type)) {
6664 unsigned NumElts = FVTy->getNumElements();
6665 for (unsigned i = 0; i != NumElts; ++i) {
6666 Constant *Elt = C->getAggregateElement(i);
6667 if (!Elt)
6668 return std::nullopt;
6669
6670 if (isa<UndefValue>(Elt))
6671 continue;
6672
6673 // Bail out if we can't determine if this constant is min/max or if we
6674 // know that this constant is min/max.
6675 auto *CI = dyn_cast<ConstantInt>(Elt);
6676 if (!CI || !ConstantIsOk(CI))
6677 return std::nullopt;
6678
6679 if (!SafeReplacementConstant)
6680 SafeReplacementConstant = CI;
6681 }
6682 } else if (isa<VectorType>(C->getType())) {
6683 // Handle scalable splat
6684 Value *SplatC = C->getSplatValue();
6685 auto *CI = dyn_cast_or_null<ConstantInt>(SplatC);
6686 // Bail out if the constant can't be safely incremented/decremented.
6687 if (!CI || !ConstantIsOk(CI))
6688 return std::nullopt;
6689 } else {
6690 // ConstantExpr?
6691 return std::nullopt;
6692 }
6693
6694 // It may not be safe to change a compare predicate in the presence of
6695 // undefined elements, so replace those elements with the first safe constant
6696 // that we found.
6697 // TODO: in case of poison, it is safe; let's replace undefs only.
6698 if (C->containsUndefOrPoisonElement()) {
6699 assert(SafeReplacementConstant && "Replacement constant not set");
6700 C = Constant::replaceUndefsWith(C, SafeReplacementConstant);
6701 }
6702
6704
6705 // Increment or decrement the constant.
6706 Constant *OneOrNegOne = ConstantInt::get(Type, WillIncrement ? 1 : -1, true);
6707 Constant *NewC = ConstantExpr::getAdd(C, OneOrNegOne);
6708
6709 return std::make_pair(NewPred, NewC);
6710}
6711
6712/// If we have an icmp le or icmp ge instruction with a constant operand, turn
6713/// it into the appropriate icmp lt or icmp gt instruction. This transform
6714/// allows them to be folded in visitICmpInst.
6716 ICmpInst::Predicate Pred = I.getPredicate();
6717 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
6719 return nullptr;
6720
6721 Value *Op0 = I.getOperand(0);
6722 Value *Op1 = I.getOperand(1);
6723 auto *Op1C = dyn_cast<Constant>(Op1);
6724 if (!Op1C)
6725 return nullptr;
6726
6727 auto FlippedStrictness =
6729 if (!FlippedStrictness)
6730 return nullptr;
6731
6732 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
6733}
6734
6735/// If we have a comparison with a non-canonical predicate, if we can update
6736/// all the users, invert the predicate and adjust all the users.
6738 // Is the predicate already canonical?
6739 CmpInst::Predicate Pred = I.getPredicate();
6741 return nullptr;
6742
6743 // Can all users be adjusted to predicate inversion?
6744 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
6745 return nullptr;
6746
6747 // Ok, we can canonicalize comparison!
6748 // Let's first invert the comparison's predicate.
6749 I.setPredicate(CmpInst::getInversePredicate(Pred));
6750 I.setName(I.getName() + ".not");
6751
6752 // And, adapt users.
6754
6755 return &I;
6756}
6757
6758/// Integer compare with boolean values can always be turned into bitwise ops.
6760 InstCombiner::BuilderTy &Builder) {
6761 Value *A = I.getOperand(0), *B = I.getOperand(1);
6762 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
6763
6764 // A boolean compared to true/false can be simplified to Op0/true/false in
6765 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
6766 // Cases not handled by InstSimplify are always 'not' of Op0.
6767 if (match(B, m_Zero())) {
6768 switch (I.getPredicate()) {
6769 case CmpInst::ICMP_EQ: // A == 0 -> !A
6770 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
6771 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
6773 default:
6774 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6775 }
6776 } else if (match(B, m_One())) {
6777 switch (I.getPredicate()) {
6778 case CmpInst::ICMP_NE: // A != 1 -> !A
6779 case CmpInst::ICMP_ULT: // A <u 1 -> !A
6780 case CmpInst::ICMP_SGT: // A >s -1 -> !A
6782 default:
6783 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
6784 }
6785 }
6786
6787 switch (I.getPredicate()) {
6788 default:
6789 llvm_unreachable("Invalid icmp instruction!");
6790 case ICmpInst::ICMP_EQ:
6791 // icmp eq i1 A, B -> ~(A ^ B)
6792 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
6793
6794 case ICmpInst::ICMP_NE:
6795 // icmp ne i1 A, B -> A ^ B
6796 return BinaryOperator::CreateXor(A, B);
6797
6798 case ICmpInst::ICMP_UGT:
6799 // icmp ugt -> icmp ult
6800 std::swap(A, B);
6801 [[fallthrough]];
6802 case ICmpInst::ICMP_ULT:
6803 // icmp ult i1 A, B -> ~A & B
6804 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
6805
6806 case ICmpInst::ICMP_SGT:
6807 // icmp sgt -> icmp slt
6808 std::swap(A, B);
6809 [[fallthrough]];
6810 case ICmpInst::ICMP_SLT:
6811 // icmp slt i1 A, B -> A & ~B
6812 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
6813
6814 case ICmpInst::ICMP_UGE:
6815 // icmp uge -> icmp ule
6816 std::swap(A, B);
6817 [[fallthrough]];
6818 case ICmpInst::ICMP_ULE:
6819 // icmp ule i1 A, B -> ~A | B
6820 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
6821
6822 case ICmpInst::ICMP_SGE:
6823 // icmp sge -> icmp sle
6824 std::swap(A, B);
6825 [[fallthrough]];
6826 case ICmpInst::ICMP_SLE:
6827 // icmp sle i1 A, B -> A | ~B
6828 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
6829 }
6830}
6831
6832// Transform pattern like:
6833// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
6834// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
6835// Into:
6836// (X l>> Y) != 0
6837// (X l>> Y) == 0
6839 InstCombiner::BuilderTy &Builder) {
6840 ICmpInst::Predicate Pred, NewPred;
6841 Value *X, *Y;
6842 if (match(&Cmp,
6843 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
6844 switch (Pred) {
6845 case ICmpInst::ICMP_ULE:
6846 NewPred = ICmpInst::ICMP_NE;
6847 break;
6848 case ICmpInst::ICMP_UGT:
6849 NewPred = ICmpInst::ICMP_EQ;
6850 break;
6851 default:
6852 return nullptr;
6853 }
6854 } else if (match(&Cmp, m_c_ICmp(Pred,
6857 m_Add(m_Shl(m_One(), m_Value(Y)),
6858 m_AllOnes()))),
6859 m_Value(X)))) {
6860 // The variant with 'add' is not canonical, (the variant with 'not' is)
6861 // we only get it because it has extra uses, and can't be canonicalized,
6862
6863 switch (Pred) {
6864 case ICmpInst::ICMP_ULT:
6865 NewPred = ICmpInst::ICMP_NE;
6866 break;
6867 case ICmpInst::ICMP_UGE:
6868 NewPred = ICmpInst::ICMP_EQ;
6869 break;
6870 default:
6871 return nullptr;
6872 }
6873 } else
6874 return nullptr;
6875
6876 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
6877 Constant *Zero = Constant::getNullValue(NewX->getType());
6878 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
6879}
6880
6882 InstCombiner::BuilderTy &Builder) {
6883 const CmpInst::Predicate Pred = Cmp.getPredicate();
6884 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
6885 Value *V1, *V2;
6886
6887 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
6888 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
6889 if (auto *I = dyn_cast<Instruction>(V))
6890 I->copyIRFlags(&Cmp);
6891 Module *M = Cmp.getModule();
6893 M, Intrinsic::experimental_vector_reverse, V->getType());
6894 return CallInst::Create(F, V);
6895 };
6896
6897 if (match(LHS, m_VecReverse(m_Value(V1)))) {
6898 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
6899 if (match(RHS, m_VecReverse(m_Value(V2))) &&
6900 (LHS->hasOneUse() || RHS->hasOneUse()))
6901 return createCmpReverse(Pred, V1, V2);
6902
6903 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
6904 if (LHS->hasOneUse() && isSplatValue(RHS))
6905 return createCmpReverse(Pred, V1, RHS);
6906 }
6907 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
6908 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
6909 return createCmpReverse(Pred, LHS, V2);
6910
6911 ArrayRef<int> M;
6912 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
6913 return nullptr;
6914
6915 // If both arguments of the cmp are shuffles that use the same mask and
6916 // shuffle within a single vector, move the shuffle after the cmp:
6917 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
6918 Type *V1Ty = V1->getType();
6919 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
6920 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
6921 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
6922 return new ShuffleVectorInst(NewCmp, M);
6923 }
6924
6925 // Try to canonicalize compare with splatted operand and splat constant.
6926 // TODO: We could generalize this for more than splats. See/use the code in
6927 // InstCombiner::foldVectorBinop().
6928 Constant *C;
6929 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
6930 return nullptr;
6931
6932 // Length-changing splats are ok, so adjust the constants as needed:
6933 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
6934 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
6935 int MaskSplatIndex;
6936 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
6937 // We allow poison in matching, but this transform removes it for safety.
6938 // Demanded elements analysis should be able to recover some/all of that.
6939 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
6940 ScalarC);
6941 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
6942 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
6943 return new ShuffleVectorInst(NewCmp, NewM);
6944 }
6945
6946 return nullptr;
6947}
6948
6949// extract(uadd.with.overflow(A, B), 0) ult A
6950// -> extract(uadd.with.overflow(A, B), 1)
6952 CmpInst::Predicate Pred = I.getPredicate();
6953 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6954
6955 Value *UAddOv;
6956 Value *A, *B;
6957 auto UAddOvResultPat = m_ExtractValue<0>(
6958 m_Intrinsic<Intrinsic::uadd_with_overflow>(m_Value(A), m_Value(B)));
6959 if (match(Op0, UAddOvResultPat) &&
6960 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
6961 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
6962 (match(A, m_One()) || match(B, m_One()))) ||
6963 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
6964 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
6965 // extract(uadd.with.overflow(A, B), 0) < A
6966 // extract(uadd.with.overflow(A, 1), 0) == 0
6967 // extract(uadd.with.overflow(A, -1), 0) != -1
6968 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
6969 else if (match(Op1, UAddOvResultPat) &&
6970 Pred == ICmpInst::ICMP_UGT && (Op0 == A || Op0 == B))
6971 // A > extract(uadd.with.overflow(A, B), 0)
6972 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
6973 else
6974 return nullptr;
6975
6976 return ExtractValueInst::Create(UAddOv, 1);
6977}
6978
6980 if (!I.getOperand(0)->getType()->isPointerTy() ||
6982 I.getParent()->getParent(),
6983 I.getOperand(0)->getType()->getPointerAddressSpace())) {
6984 return nullptr;
6985 }
6986 Instruction *Op;
6987 if (match(I.getOperand(0), m_Instruction(Op)) &&
6988 match(I.getOperand(1), m_Zero()) &&
6989 Op->isLaunderOrStripInvariantGroup()) {
6990 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
6991 Op->getOperand(0), I.getOperand(1));
6992 }
6993 return nullptr;
6994}
6995
6996/// This function folds patterns produced by lowering of reduce idioms, such as
6997/// llvm.vector.reduce.and which are lowered into instruction chains. This code
6998/// attempts to generate fewer number of scalar comparisons instead of vector
6999/// comparisons when possible.
7001 InstCombiner::BuilderTy &Builder,
7002 const DataLayout &DL) {
7003 if (I.getType()->isVectorTy())
7004 return nullptr;
7005 ICmpInst::Predicate OuterPred, InnerPred;
7006 Value *LHS, *RHS;
7007
7008 // Match lowering of @llvm.vector.reduce.and. Turn
7009 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7010 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7011 /// %res = icmp <pred> i8 %scalar_ne, 0
7012 ///
7013 /// into
7014 ///
7015 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7016 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7017 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7018 ///
7019 /// for <pred> in {ne, eq}.
7020 if (!match(&I, m_ICmp(OuterPred,
7022 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7023 m_Zero())))
7024 return nullptr;
7025 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7026 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7027 return nullptr;
7028 unsigned NumBits =
7029 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7030 // TODO: Relax this to "not wider than max legal integer type"?
7031 if (!DL.isLegalInteger(NumBits))
7032 return nullptr;
7033
7034 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7035 auto *ScalarTy = Builder.getIntNTy(NumBits);
7036 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7037 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7038 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7039 I.getName());
7040 }
7041
7042 return nullptr;
7043}
7044
7045// This helper will be called with icmp operands in both orders.
7047 Value *Op0, Value *Op1,
7048 ICmpInst &CxtI) {
7049 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7050 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7051 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7052 return NI;
7053
7054 if (auto *SI = dyn_cast<SelectInst>(Op0))
7055 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7056 return NI;
7057
7058 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0))
7059 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7060 return Res;
7061
7062 {
7063 Value *X;
7064 const APInt *C;
7065 // icmp X+Cst, X
7066 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7067 return foldICmpAddOpConst(X, *C, Pred);
7068 }
7069
7070 // abs(X) >= X --> true
7071 // abs(X) u<= X --> true
7072 // abs(X) < X --> false
7073 // abs(X) u> X --> false
7074 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7075 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7076 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7077 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7078 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7079 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7080 {
7081 Value *X;
7082 Constant *C;
7083 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(X), m_Constant(C))) &&
7084 match(Op1, m_Specific(X))) {
7085 Value *NullValue = Constant::getNullValue(X->getType());
7086 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7087 const APInt SMin =
7088 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7089 bool IsIntMinPosion = C->isAllOnesValue();
7090 switch (Pred) {
7091 case CmpInst::ICMP_ULE:
7092 case CmpInst::ICMP_SGE:
7093 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7094 case CmpInst::ICMP_UGT:
7095 case CmpInst::ICMP_SLT:
7097 case CmpInst::ICMP_UGE:
7098 case CmpInst::ICMP_SLE:
7099 case CmpInst::ICMP_EQ: {
7100 return replaceInstUsesWith(
7101 CxtI, IsIntMinPosion
7102 ? Builder.CreateICmpSGT(X, AllOnesValue)
7104 X, ConstantInt::get(X->getType(), SMin + 1)));
7105 }
7106 case CmpInst::ICMP_ULT:
7107 case CmpInst::ICMP_SGT:
7108 case CmpInst::ICMP_NE: {
7109 return replaceInstUsesWith(
7110 CxtI, IsIntMinPosion
7111 ? Builder.CreateICmpSLT(X, NullValue)
7113 X, ConstantInt::get(X->getType(), SMin)));
7114 }
7115 default:
7116 llvm_unreachable("Invalid predicate!");
7117 }
7118 }
7119 }
7120
7121 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7122 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7123 return replaceInstUsesWith(CxtI, V);
7124
7125 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7126 {
7127 const APInt *Divisor;
7128 if (match(Op0, m_UDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7129 Divisor->ugt(1)) {
7130 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7132 }
7133
7134 if (!ICmpInst::isUnsigned(Pred) &&
7135 match(Op0, m_SDiv(m_Specific(Op1), m_APInt(Divisor))) &&
7136 Divisor->ugt(1)) {
7137 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7139 }
7140 }
7141
7142 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7143 {
7144 const APInt *Shift;
7145 if (match(Op0, m_LShr(m_Specific(Op1), m_APInt(Shift))) &&
7146 !Shift->isZero()) {
7147 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7149 }
7150
7151 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7152 match(Op0, m_AShr(m_Specific(Op1), m_APInt(Shift))) &&
7153 !Shift->isZero()) {
7154 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7156 }
7157 }
7158
7159 return nullptr;
7160}
7161
7163 bool Changed = false;
7165 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7166 unsigned Op0Cplxity = getComplexity(Op0);
7167 unsigned Op1Cplxity = getComplexity(Op1);
7168
7169 /// Orders the operands of the compare so that they are listed from most
7170 /// complex to least complex. This puts constants before unary operators,
7171 /// before binary operators.
7172 if (Op0Cplxity < Op1Cplxity) {
7173 I.swapOperands();
7174 std::swap(Op0, Op1);
7175 Changed = true;
7176 }
7177
7178 if (Value *V = simplifyICmpInst(I.getPredicate(), Op0, Op1, Q))
7179 return replaceInstUsesWith(I, V);
7180
7181 // Comparing -val or val with non-zero is the same as just comparing val
7182 // ie, abs(val) != 0 -> val != 0
7183 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7184 Value *Cond, *SelectTrue, *SelectFalse;
7185 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7186 m_Value(SelectFalse)))) {
7187 if (Value *V = dyn_castNegVal(SelectTrue)) {
7188 if (V == SelectFalse)
7189 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7190 }
7191 else if (Value *V = dyn_castNegVal(SelectFalse)) {
7192 if (V == SelectTrue)
7193 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7194 }
7195 }
7196 }
7197
7198 if (Op0->getType()->isIntOrIntVectorTy(1))
7200 return Res;
7201
7203 return Res;
7204
7206 return Res;
7207
7209 return Res;
7210
7212 return Res;
7213
7215 return Res;
7216
7218 return Res;
7219
7221 return Res;
7222
7223 // Test if the ICmpInst instruction is used exclusively by a select as
7224 // part of a minimum or maximum operation. If so, refrain from doing
7225 // any other folding. This helps out other analyses which understand
7226 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7227 // and CodeGen. And in this case, at least one of the comparison
7228 // operands has at least one user besides the compare (the select),
7229 // which would often largely negate the benefit of folding anyway.
7230 //
7231 // Do the same for the other patterns recognized by matchSelectPattern.
7232 if (I.hasOneUse())
7233 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7234 Value *A, *B;
7236 if (SPR.Flavor != SPF_UNKNOWN)
7237 return nullptr;
7238 }
7239
7240 // Do this after checking for min/max to prevent infinite looping.
7241 if (Instruction *Res = foldICmpWithZero(I))
7242 return Res;
7243
7244 // FIXME: We only do this after checking for min/max to prevent infinite
7245 // looping caused by a reverse canonicalization of these patterns for min/max.
7246 // FIXME: The organization of folds is a mess. These would naturally go into
7247 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7248 // down here after the min/max restriction.
7249 ICmpInst::Predicate Pred = I.getPredicate();
7250 const APInt *C;
7251 if (match(Op1, m_APInt(C))) {
7252 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7253 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7254 Constant *Zero = Constant::getNullValue(Op0->getType());
7255 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7256 }
7257
7258 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7259 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7261 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7262 }
7263 }
7264
7265 // The folds in here may rely on wrapping flags and special constants, so
7266 // they can break up min/max idioms in some cases but not seemingly similar
7267 // patterns.
7268 // FIXME: It may be possible to enhance select folding to make this
7269 // unnecessary. It may also be moot if we canonicalize to min/max
7270 // intrinsics.
7271 if (Instruction *Res = foldICmpBinOp(I, Q))
7272 return Res;
7273
7275 return Res;
7276
7277 // Try to match comparison as a sign bit test. Intentionally do this after
7278 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7279 if (Instruction *New = foldSignBitTest(I))
7280 return New;
7281
7283 return Res;
7284
7285 if (Instruction *Res = foldICmpCommutative(I.getPredicate(), Op0, Op1, I))
7286 return Res;
7287 if (Instruction *Res =
7288 foldICmpCommutative(I.getSwappedPredicate(), Op1, Op0, I))
7289 return Res;
7290
7291 if (I.isCommutative()) {
7292 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7293 replaceOperand(I, 0, Pair->first);
7294 replaceOperand(I, 1, Pair->second);
7295 return &I;
7296 }
7297 }
7298
7299 // In case of a comparison with two select instructions having the same
7300 // condition, check whether one of the resulting branches can be simplified.
7301 // If so, just compare the other branch and select the appropriate result.
7302 // For example:
7303 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7304 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7305 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7306 // The icmp will result false for the false value of selects and the result
7307 // will depend upon the comparison of true values of selects if %cmp is
7308 // true. Thus, transform this into:
7309 // %cmp = icmp slt i32 %y, %z
7310 // %sel = select i1 %cond, i1 %cmp, i1 false
7311 // This handles similar cases to transform.
7312 {
7313 Value *Cond, *A, *B, *C, *D;
7314 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7316 (Op0->hasOneUse() || Op1->hasOneUse())) {
7317 // Check whether comparison of TrueValues can be simplified
7318 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7319 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7320 return SelectInst::Create(Cond, Res, NewICMP);
7321 }
7322 // Check whether comparison of FalseValues can be simplified
7323 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7324 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7325 return SelectInst::Create(Cond, NewICMP, Res);
7326 }
7327 }
7328 }
7329
7330 // Try to optimize equality comparisons against alloca-based pointers.
7331 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7332 assert(Op1->getType()->isPointerTy() && "Comparing pointer with non-pointer?");
7333 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7334 if (foldAllocaCmp(Alloca))
7335 return nullptr;
7336 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7337 if (foldAllocaCmp(Alloca))
7338 return nullptr;
7339 }
7340
7341 if (Instruction *Res = foldICmpBitCast(I))
7342 return Res;
7343
7344 // TODO: Hoist this above the min/max bailout.
7346 return R;
7347
7348 {
7349 Value *X, *Y;
7350 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7351 // and (X & ~Y) != 0 --> (X & Y) == 0
7352 // if A is a power of 2.
7353 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7354 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, 0, &I) &&
7355 I.isEquality())
7356 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7357 Op1);
7358
7359 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7360 if (Op0->getType()->isIntOrIntVectorTy()) {
7361 bool ConsumesOp0, ConsumesOp1;
7362 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7363 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7364 (ConsumesOp0 || ConsumesOp1)) {
7365 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7366 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7367 assert(InvOp0 && InvOp1 &&
7368 "Mismatch between isFreeToInvert and getFreelyInverted");
7369 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7370 }
7371 }
7372
7373 Instruction *AddI = nullptr;
7375 m_Instruction(AddI))) &&
7376 isa<IntegerType>(X->getType())) {
7377 Value *Result;
7378 Constant *Overflow;
7379 // m_UAddWithOverflow can match patterns that do not include an explicit
7380 // "add" instruction, so check the opcode of the matched op.
7381 if (AddI->getOpcode() == Instruction::Add &&
7382 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7383 Result, Overflow)) {
7384 replaceInstUsesWith(*AddI, Result);
7385 eraseInstFromFunction(*AddI);
7386 return replaceInstUsesWith(I, Overflow);
7387 }
7388 }
7389
7390 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
7391 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
7392 match(Op1, m_APInt(C))) {
7393 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
7394 return R;
7395 }
7396
7397 // Signbit test folds
7398 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
7399 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
7400 Instruction *ExtI;
7401 if ((I.isUnsigned() || I.isEquality()) &&
7402 match(Op1,
7404 Y->getType()->getScalarSizeInBits() == 1 &&
7405 (Op0->hasOneUse() || Op1->hasOneUse())) {
7406 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
7407 Instruction *ShiftI;
7408 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
7410 OpWidth - 1))))) {
7411 unsigned ExtOpc = ExtI->getOpcode();
7412 unsigned ShiftOpc = ShiftI->getOpcode();
7413 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
7414 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
7415 Value *SLTZero =
7417 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
7418 return replaceInstUsesWith(I, Cmp);
7419 }
7420 }
7421 }
7422 }
7423
7424 if (Instruction *Res = foldICmpEquality(I))
7425 return Res;
7426
7428 return Res;
7429
7430 if (Instruction *Res = foldICmpOfUAddOv(I))
7431 return Res;
7432
7433 // The 'cmpxchg' instruction returns an aggregate containing the old value and
7434 // an i1 which indicates whether or not we successfully did the swap.
7435 //
7436 // Replace comparisons between the old value and the expected value with the
7437 // indicator that 'cmpxchg' returns.
7438 //
7439 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
7440 // spuriously fail. In those cases, the old value may equal the expected
7441 // value but it is possible for the swap to not occur.
7442 if (I.getPredicate() == ICmpInst::ICMP_EQ)
7443 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
7444 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
7445 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
7446 !ACXI->isWeak())
7447 return ExtractValueInst::Create(ACXI, 1);
7448
7450 return Res;
7451
7452 if (I.getType()->isVectorTy())
7453 if (Instruction *Res = foldVectorCmp(I, Builder))
7454 return Res;
7455
7457 return Res;
7458
7460 return Res;
7461
7462 return Changed ? &I : nullptr;
7463}
7464
7465/// Fold fcmp ([us]itofp x, cst) if possible.
7467 Instruction *LHSI,
7468 Constant *RHSC) {
7469 const APFloat *RHS;
7470 if (!match(RHSC, m_APFloat(RHS)))
7471 return nullptr;
7472
7473 // Get the width of the mantissa. We don't want to hack on conversions that
7474 // might lose information from the integer, e.g. "i64 -> float"
7475 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
7476 if (MantissaWidth == -1) return nullptr; // Unknown.
7477
7478 Type *IntTy = LHSI->getOperand(0)->getType();
7479 unsigned IntWidth = IntTy->getScalarSizeInBits();
7480 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
7481
7482 if (I.isEquality()) {
7483 FCmpInst::Predicate P = I.getPredicate();
7484 bool IsExact = false;
7485 APSInt RHSCvt(IntWidth, LHSUnsigned);
7486 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
7487
7488 // If the floating point constant isn't an integer value, we know if we will
7489 // ever compare equal / not equal to it.
7490 if (!IsExact) {
7491 // TODO: Can never be -0.0 and other non-representable values
7492 APFloat RHSRoundInt(*RHS);
7494 if (*RHS != RHSRoundInt) {
7496 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7497
7499 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7500 }
7501 }
7502
7503 // TODO: If the constant is exactly representable, is it always OK to do
7504 // equality compares as integer?
7505 }
7506
7507 // Check to see that the input is converted from an integer type that is small
7508 // enough that preserves all bits. TODO: check here for "known" sign bits.
7509 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
7510
7511 // Following test does NOT adjust IntWidth downwards for signed inputs,
7512 // because the most negative value still requires all the mantissa bits
7513 // to distinguish it from one less than that value.
7514 if ((int)IntWidth > MantissaWidth) {
7515 // Conversion would lose accuracy. Check if loss can impact comparison.
7516 int Exp = ilogb(*RHS);
7517 if (Exp == APFloat::IEK_Inf) {
7518 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
7519 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
7520 // Conversion could create infinity.
7521 return nullptr;
7522 } else {
7523 // Note that if RHS is zero or NaN, then Exp is negative
7524 // and first condition is trivially false.
7525 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
7526 // Conversion could affect comparison.
7527 return nullptr;
7528 }
7529 }
7530
7531 // Otherwise, we can potentially simplify the comparison. We know that it
7532 // will always come through as an integer value and we know the constant is
7533 // not a NAN (it would have been previously simplified).
7534 assert(!RHS->isNaN() && "NaN comparison not already folded!");
7535
7537 switch (I.getPredicate()) {
7538 default: llvm_unreachable("Unexpected predicate!");
7539 case FCmpInst::FCMP_UEQ:
7540 case FCmpInst::FCMP_OEQ:
7541 Pred = ICmpInst::ICMP_EQ;
7542 break;
7543 case FCmpInst::FCMP_UGT:
7544 case FCmpInst::FCMP_OGT:
7545 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
7546 break;
7547 case FCmpInst::FCMP_UGE:
7548 case FCmpInst::FCMP_OGE:
7549 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
7550 break;
7551 case FCmpInst::FCMP_ULT:
7552 case FCmpInst::FCMP_OLT:
7553 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
7554 break;
7555 case FCmpInst::FCMP_ULE:
7556 case FCmpInst::FCMP_OLE:
7557 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
7558 break;
7559 case FCmpInst::FCMP_UNE:
7560 case FCmpInst::FCMP_ONE:
7561 Pred = ICmpInst::ICMP_NE;
7562 break;
7563 case FCmpInst::FCMP_ORD:
7564 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7565 case FCmpInst::FCMP_UNO:
7566 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7567 }
7568
7569 // Now we know that the APFloat is a normal number, zero or inf.
7570
7571 // See if the FP constant is too large for the integer. For example,
7572 // comparing an i8 to 300.0.
7573 if (!LHSUnsigned) {
7574 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
7575 // and large values.
7576 APFloat SMax(RHS->getSemantics());
7577 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
7579 if (SMax < *RHS) { // smax < 13123.0
7580 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
7581 Pred == ICmpInst::ICMP_SLE)
7582 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7583 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7584 }
7585 } else {
7586 // If the RHS value is > UnsignedMax, fold the comparison. This handles
7587 // +INF and large values.
7588 APFloat UMax(RHS->getSemantics());
7589 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
7591 if (UMax < *RHS) { // umax < 13123.0
7592 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
7593 Pred == ICmpInst::ICMP_ULE)
7594 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7595 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7596 }
7597 }
7598
7599 if (!LHSUnsigned) {
7600 // See if the RHS value is < SignedMin.
7601 APFloat SMin(RHS->getSemantics());
7602 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
7604 if (SMin > *RHS) { // smin > 12312.0
7605 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
7606 Pred == ICmpInst::ICMP_SGE)
7607 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7608 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7609 }
7610 } else {
7611 // See if the RHS value is < UnsignedMin.
7612 APFloat UMin(RHS->getSemantics());
7613 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
7615 if (UMin > *RHS) { // umin > 12312.0
7616 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
7617 Pred == ICmpInst::ICMP_UGE)
7618 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7619 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7620 }
7621 }
7622
7623 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
7624 // [0, UMAX], but it may still be fractional. Check whether this is the case
7625 // using the IsExact flag.
7626 // Don't do this for zero, because -0.0 is not fractional.
7627 APSInt RHSInt(IntWidth, LHSUnsigned);
7628 bool IsExact;
7629 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
7630 if (!RHS->isZero()) {
7631 if (!IsExact) {
7632 // If we had a comparison against a fractional value, we have to adjust
7633 // the compare predicate and sometimes the value. RHSC is rounded towards
7634 // zero at this point.
7635 switch (Pred) {
7636 default: llvm_unreachable("Unexpected integer comparison!");
7637 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
7638 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7639 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
7640 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7641 case ICmpInst::ICMP_ULE:
7642 // (float)int <= 4.4 --> int <= 4
7643 // (float)int <= -4.4 --> false
7644 if (RHS->isNegative())
7645 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7646 break;
7647 case ICmpInst::ICMP_SLE:
7648 // (float)int <= 4.4 --> int <= 4
7649 // (float)int <= -4.4 --> int < -4
7650 if (RHS->isNegative())
7651 Pred = ICmpInst::ICMP_SLT;
7652 break;
7653 case ICmpInst::ICMP_ULT:
7654 // (float)int < -4.4 --> false
7655 // (float)int < 4.4 --> int <= 4
7656 if (RHS->isNegative())
7657 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
7658 Pred = ICmpInst::ICMP_ULE;
7659 break;
7660 case ICmpInst::ICMP_SLT:
7661 // (float)int < -4.4 --> int < -4
7662 // (float)int < 4.4 --> int <= 4
7663 if (!RHS->isNegative())
7664 Pred = ICmpInst::ICMP_SLE;
7665 break;
7666 case ICmpInst::ICMP_UGT:
7667 // (float)int > 4.4 --> int > 4
7668 // (float)int > -4.4 --> true
7669 if (RHS->isNegative())
7670 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7671 break;
7672 case ICmpInst::ICMP_SGT:
7673 // (float)int > 4.4 --> int > 4
7674 // (float)int > -4.4 --> int >= -4
7675 if (RHS->isNegative())
7676 Pred = ICmpInst::ICMP_SGE;
7677 break;
7678 case ICmpInst::ICMP_UGE:
7679 // (float)int >= -4.4 --> true
7680 // (float)int >= 4.4 --> int > 4
7681 if (RHS->isNegative())
7682 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
7683 Pred = ICmpInst::ICMP_UGT;
7684 break;
7685 case ICmpInst::ICMP_SGE:
7686 // (float)int >= -4.4 --> int >= -4
7687 // (float)int >= 4.4 --> int > 4
7688 if (!RHS->isNegative())
7689 Pred = ICmpInst::ICMP_SGT;
7690 break;
7691 }
7692 }
7693 }
7694
7695 // Lower this FP comparison into an appropriate integer version of the
7696 // comparison.
7697 return new ICmpInst(Pred, LHSI->getOperand(0),
7698 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
7699}
7700
7701/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
7703 Constant *RHSC) {
7704 // When C is not 0.0 and infinities are not allowed:
7705 // (C / X) < 0.0 is a sign-bit test of X
7706 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
7707 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
7708 //
7709 // Proof:
7710 // Multiply (C / X) < 0.0 by X * X / C.
7711 // - X is non zero, if it is the flag 'ninf' is violated.
7712 // - C defines the sign of X * X * C. Thus it also defines whether to swap
7713 // the predicate. C is also non zero by definition.
7714 //
7715 // Thus X * X / C is non zero and the transformation is valid. [qed]
7716
7717 FCmpInst::Predicate Pred = I.getPredicate();
7718
7719 // Check that predicates are valid.
7720 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
7721 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
7722 return nullptr;
7723
7724 // Check that RHS operand is zero.
7725 if (!match(RHSC, m_AnyZeroFP()))
7726 return nullptr;
7727
7728 // Check fastmath flags ('ninf').
7729 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
7730 return nullptr;
7731
7732 // Check the properties of the dividend. It must not be zero to avoid a
7733 // division by zero (see Proof).
7734 const APFloat *C;
7735 if (!match(LHSI->getOperand(0), m_APFloat(C)))
7736 return nullptr;
7737
7738 if (C->isZero())
7739 return nullptr;
7740
7741 // Get swapped predicate if necessary.
7742 if (C->isNegative())
7743 Pred = I.getSwappedPredicate();
7744
7745 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
7746}
7747
7748/// Optimize fabs(X) compared with zero.
7750 Value *X;
7751 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
7752 return nullptr;
7753
7754 const APFloat *C;
7755 if (!match(I.getOperand(1), m_APFloat(C)))
7756 return nullptr;
7757
7758 if (!C->isPosZero()) {
7759 if (!C->isSmallestNormalized())
7760 return nullptr;
7761
7762 const Function *F = I.getFunction();
7763 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
7764 if (Mode.Input == DenormalMode::PreserveSign ||
7765 Mode.Input == DenormalMode::PositiveZero) {
7766
7767 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7768 Constant *Zero = ConstantFP::getZero(X->getType());
7769 return new FCmpInst(P, X, Zero, "", I);
7770 };
7771
7772 switch (I.getPredicate()) {
7773 case FCmpInst::FCMP_OLT:
7774 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
7775 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
7776 case FCmpInst::FCMP_UGE:
7777 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
7778 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
7779 case FCmpInst::FCMP_OGE:
7780 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
7781 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
7782 case FCmpInst::FCMP_ULT:
7783 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
7784 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
7785 default:
7786 break;
7787 }
7788 }
7789
7790 return nullptr;
7791 }
7792
7793 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
7794 I->setPredicate(P);
7795 return IC.replaceOperand(*I, 0, X);
7796 };
7797
7798 switch (I.getPredicate()) {
7799 case FCmpInst::FCMP_UGE:
7800 case FCmpInst::FCMP_OLT:
7801 // fabs(X) >= 0.0 --> true
7802 // fabs(X) < 0.0 --> false
7803 llvm_unreachable("fcmp should have simplified");
7804
7805 case FCmpInst::FCMP_OGT:
7806 // fabs(X) > 0.0 --> X != 0.0
7807 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
7808
7809 case FCmpInst::FCMP_UGT:
7810 // fabs(X) u> 0.0 --> X u!= 0.0
7811 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
7812
7813 case FCmpInst::FCMP_OLE:
7814 // fabs(X) <= 0.0 --> X == 0.0
7815 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
7816
7817 case FCmpInst::FCMP_ULE:
7818 // fabs(X) u<= 0.0 --> X u== 0.0
7819 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
7820
7821 case FCmpInst::FCMP_OGE:
7822 // fabs(X) >= 0.0 --> !isnan(X)
7823 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7824 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
7825
7826 case FCmpInst::FCMP_ULT:
7827 // fabs(X) u< 0.0 --> isnan(X)
7828 assert(!I.hasNoNaNs() && "fcmp should have simplified");
7829 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
7830
7831 case FCmpInst::FCMP_OEQ:
7832 case FCmpInst::FCMP_UEQ:
7833 case FCmpInst::FCMP_ONE:
7834 case FCmpInst::FCMP_UNE:
7835 case FCmpInst::FCMP_ORD:
7836 case FCmpInst::FCMP_UNO:
7837 // Look through the fabs() because it doesn't change anything but the sign.
7838 // fabs(X) == 0.0 --> X == 0.0,
7839 // fabs(X) != 0.0 --> X != 0.0
7840 // isnan(fabs(X)) --> isnan(X)
7841 // !isnan(fabs(X) --> !isnan(X)
7842 return replacePredAndOp0(&I, I.getPredicate(), X);
7843
7844 default:
7845 return nullptr;
7846 }
7847}
7848
7850 CmpInst::Predicate Pred = I.getPredicate();
7851 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7852
7853 // Canonicalize fneg as Op1.
7854 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
7855 std::swap(Op0, Op1);
7856 Pred = I.getSwappedPredicate();
7857 }
7858
7859 if (!match(Op1, m_FNeg(m_Specific(Op0))))
7860 return nullptr;
7861
7862 // Replace the negated operand with 0.0:
7863 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
7864 Constant *Zero = ConstantFP::getZero(Op0->getType());
7865 return new FCmpInst(Pred, Op0, Zero, "", &I);
7866}
7867
7869 bool Changed = false;
7870
7871 /// Orders the operands of the compare so that they are listed from most
7872 /// complex to least complex. This puts constants before unary operators,
7873 /// before binary operators.
7874 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
7875 I.swapOperands();
7876 Changed = true;
7877 }
7878
7879 const CmpInst::Predicate Pred = I.getPredicate();
7880 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7881 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
7883 return replaceInstUsesWith(I, V);
7884
7885 // Simplify 'fcmp pred X, X'
7886 Type *OpType = Op0->getType();
7887 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
7888 if (Op0 == Op1) {
7889 switch (Pred) {
7890 default: break;
7891 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
7892 case FCmpInst::FCMP_ULT: // True if unordered or less than
7893 case FCmpInst::FCMP_UGT: // True if unordered or greater than
7894 case FCmpInst::FCMP_UNE: // True if unordered or not equal
7895 // Canonicalize these to be 'fcmp uno %X, 0.0'.
7896 I.setPredicate(FCmpInst::FCMP_UNO);
7897 I.setOperand(1, Constant::getNullValue(OpType));
7898 return &I;
7899
7900 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
7901 case FCmpInst::FCMP_OEQ: // True if ordered and equal
7902 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
7903 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
7904 // Canonicalize these to be 'fcmp ord %X, 0.0'.
7905 I.setPredicate(FCmpInst::FCMP_ORD);
7906 I.setOperand(1, Constant::getNullValue(OpType));
7907 return &I;
7908 }
7909 }
7910
7911 if (I.isCommutative()) {
7912 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7913 replaceOperand(I, 0, Pair->first);
7914 replaceOperand(I, 1, Pair->second);
7915 return &I;
7916 }
7917 }
7918
7919 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
7920 // then canonicalize the operand to 0.0.
7921 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
7922 if (!match(Op0, m_PosZeroFP()) &&
7923 isKnownNeverNaN(Op0, 0, getSimplifyQuery().getWithInstruction(&I)))
7924 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
7925
7926 if (!match(Op1, m_PosZeroFP()) &&
7927 isKnownNeverNaN(Op1, 0, getSimplifyQuery().getWithInstruction(&I)))
7928 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7929 }
7930
7931 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
7932 Value *X, *Y;
7933 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
7934 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
7935
7937 return R;
7938
7939 // Test if the FCmpInst instruction is used exclusively by a select as
7940 // part of a minimum or maximum operation. If so, refrain from doing
7941 // any other folding. This helps out other analyses which understand
7942 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7943 // and CodeGen. And in this case, at least one of the comparison
7944 // operands has at least one user besides the compare (the select),
7945 // which would often largely negate the benefit of folding anyway.
7946 if (I.hasOneUse())
7947 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7948 Value *A, *B;
7950 if (SPR.Flavor != SPF_UNKNOWN)
7951 return nullptr;
7952 }
7953
7954 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
7955 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
7956 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
7957 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
7958
7959 // Canonicalize:
7960 // fcmp olt X, +inf -> fcmp one X, +inf
7961 // fcmp ole X, +inf -> fcmp ord X, 0
7962 // fcmp ogt X, +inf -> false
7963 // fcmp oge X, +inf -> fcmp oeq X, +inf
7964 // fcmp ult X, +inf -> fcmp une X, +inf
7965 // fcmp ule X, +inf -> true
7966 // fcmp ugt X, +inf -> fcmp uno X, 0
7967 // fcmp uge X, +inf -> fcmp ueq X, +inf
7968 // fcmp olt X, -inf -> false
7969 // fcmp ole X, -inf -> fcmp oeq X, -inf
7970 // fcmp ogt X, -inf -> fcmp one X, -inf
7971 // fcmp oge X, -inf -> fcmp ord X, 0
7972 // fcmp ult X, -inf -> fcmp uno X, 0
7973 // fcmp ule X, -inf -> fcmp ueq X, -inf
7974 // fcmp ugt X, -inf -> fcmp une X, -inf
7975 // fcmp uge X, -inf -> true
7976 const APFloat *C;
7977 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
7978 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
7979 default:
7980 break;
7981 case FCmpInst::FCMP_ORD:
7982 case FCmpInst::FCMP_UNO:
7985 case FCmpInst::FCMP_OGT:
7986 case FCmpInst::FCMP_ULE:
7987 llvm_unreachable("Should be simplified by InstSimplify");
7988 case FCmpInst::FCMP_OLT:
7989 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
7990 case FCmpInst::FCMP_OLE:
7991 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
7992 "", &I);
7993 case FCmpInst::FCMP_OGE:
7994 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
7995 case FCmpInst::FCMP_ULT:
7996 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
7997 case FCmpInst::FCMP_UGT:
7998 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
7999 "", &I);
8000 case FCmpInst::FCMP_UGE:
8001 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
8002 }
8003 }
8004
8005 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
8006 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
8007 if (match(Op1, m_PosZeroFP()) &&
8010 if (Pred == FCmpInst::FCMP_OEQ)
8011 IntPred = ICmpInst::ICMP_EQ;
8012 else if (Pred == FCmpInst::FCMP_UNE)
8013 IntPred = ICmpInst::ICMP_NE;
8014
8015 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
8016 Type *IntTy = X->getType();
8017 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
8018 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
8019 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
8020 }
8021 }
8022
8023 // Handle fcmp with instruction LHS and constant RHS.
8024 Instruction *LHSI;
8025 Constant *RHSC;
8026 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
8027 switch (LHSI->getOpcode()) {
8028 case Instruction::Select:
8029 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
8030 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
8031 (match(LHSI,
8033 match(LHSI, m_Select(m_Value(), m_FNeg(m_Value(X)), m_Deferred(X)))))
8034 return replaceOperand(I, 0, X);
8035 if (Instruction *NV = FoldOpIntoSelect(I, cast<SelectInst>(LHSI)))
8036 return NV;
8037 break;
8038 case Instruction::PHI:
8039 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
8040 return NV;
8041 break;
8042 case Instruction::SIToFP:
8043 case Instruction::UIToFP:
8044 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
8045 return NV;
8046 break;
8047 case Instruction::FDiv:
8048 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
8049 return NV;
8050 break;
8051 case Instruction::Load:
8052 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
8053 if (auto *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
8055 cast<LoadInst>(LHSI), GEP, GV, I))
8056 return Res;
8057 break;
8058 }
8059 }
8060
8061 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
8062 return R;
8063
8064 if (match(Op0, m_FNeg(m_Value(X)))) {
8065 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
8066 Constant *C;
8067 if (match(Op1, m_Constant(C)))
8068 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
8069 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
8070 }
8071
8072 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
8073 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8074 return new FCmpInst(Pred, X, Op1, "", &I);
8075
8076 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8077 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8078 return new FCmpInst(Pred, Op0, Y, "", &I);
8079
8080 if (match(Op0, m_FPExt(m_Value(X)))) {
8081 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
8082 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
8083 return new FCmpInst(Pred, X, Y, "", &I);
8084
8085 const APFloat *C;
8086 if (match(Op1, m_APFloat(C))) {
8087 const fltSemantics &FPSem =
8088 X->getType()->getScalarType()->getFltSemantics();
8089 bool Lossy;
8090 APFloat TruncC = *C;
8091 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
8092
8093 if (Lossy) {
8094 // X can't possibly equal the higher-precision constant, so reduce any
8095 // equality comparison.
8096 // TODO: Other predicates can be handled via getFCmpCode().
8097 switch (Pred) {
8098 case FCmpInst::FCMP_OEQ:
8099 // X is ordered and equal to an impossible constant --> false
8100 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8101 case FCmpInst::FCMP_ONE:
8102 // X is ordered and not equal to an impossible constant --> ordered
8103 return new FCmpInst(FCmpInst::FCMP_ORD, X,
8104 ConstantFP::getZero(X->getType()));
8105 case FCmpInst::FCMP_UEQ:
8106 // X is unordered or equal to an impossible constant --> unordered
8107 return new FCmpInst(FCmpInst::FCMP_UNO, X,
8108 ConstantFP::getZero(X->getType()));
8109 case FCmpInst::FCMP_UNE:
8110 // X is unordered or not equal to an impossible constant --> true
8111 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8112 default:
8113 break;
8114 }
8115 }
8116
8117 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
8118 // Avoid lossy conversions and denormals.
8119 // Zero is a special case that's OK to convert.
8120 APFloat Fabs = TruncC;
8121 Fabs.clearSign();
8122 if (!Lossy &&
8123 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
8124 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
8125 return new FCmpInst(Pred, X, NewC, "", &I);
8126 }
8127 }
8128 }
8129
8130 // Convert a sign-bit test of an FP value into a cast and integer compare.
8131 // TODO: Simplify if the copysign constant is 0.0 or NaN.
8132 // TODO: Handle non-zero compare constants.
8133 // TODO: Handle other predicates.
8134 if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
8135 m_Value(X)))) &&
8136 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
8137 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
8138 if (auto *VecTy = dyn_cast<VectorType>(OpType))
8139 IntType = VectorType::get(IntType, VecTy->getElementCount());
8140
8141 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
8142 if (Pred == FCmpInst::FCMP_OLT) {
8143 Value *IntX = Builder.CreateBitCast(X, IntType);
8144 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
8145 ConstantInt::getNullValue(IntType));
8146 }
8147 }
8148
8149 {
8150 Value *CanonLHS = nullptr, *CanonRHS = nullptr;
8151 match(Op0, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonLHS)));
8152 match(Op1, m_Intrinsic<Intrinsic::canonicalize>(m_Value(CanonRHS)));
8153
8154 // (canonicalize(x) == x) => (x == x)
8155 if (CanonLHS == Op1)
8156 return new FCmpInst(Pred, Op1, Op1, "", &I);
8157
8158 // (x == canonicalize(x)) => (x == x)
8159 if (CanonRHS == Op0)
8160 return new FCmpInst(Pred, Op0, Op0, "", &I);
8161
8162 // (canonicalize(x) == canonicalize(y)) => (x == y)
8163 if (CanonLHS && CanonRHS)
8164 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
8165 }
8166
8167 if (I.getType()->isVectorTy())
8168 if (Instruction *Res = foldVectorCmp(I, Builder))
8169 return Res;
8170
8171 return Changed ? &I : nullptr;
8172}
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU Register Bank Select
Rewrite undef for PHI
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
#define Check(C,...)
Hexagon Common GEP
#define _
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(ICmpInst::Predicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Value * foldICmpWithLowBitMaskedVal(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static Instruction * foldICmpShlOne(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl 1, Y), C.
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:528
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
#define T1
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:40
Value * RHS
Value * LHS
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5196
void clearSign()
Definition: APFloat.h:1159
bool isZero() const
Definition: APFloat.h:1291
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition: APFloat.h:1026
APInt bitcastToAPInt() const
Definition: APFloat.h:1210
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition: APFloat.h:1006
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:966
FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition: APFloat.cpp:5183
opStatus roundToIntegral(roundingMode RM)
Definition: APFloat.h:1109
Class for arbitrary precision integers.
Definition: APInt.h:76
APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition: APInt.cpp:1543
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:212
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition: APInt.h:427
APInt zext(unsigned width) const
Zero extend to a new width.
Definition: APInt.cpp:981
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition: APInt.h:207
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition: APInt.h:401
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1491
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition: APInt.h:1463
APInt trunc(unsigned width) const
Truncate to new width.
Definition: APInt.cpp:906
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition: APInt.h:184
APInt abs() const
Get the absolute value.
Definition: APInt.h:1737
unsigned ceilLogBase2() const
Definition: APInt.h:1706
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition: APInt.h:1179
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition: APInt.h:349
APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1918
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition: APInt.h:1160
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition: APInt.h:358
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition: APInt.h:444
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1439
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition: APInt.h:1089
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:187
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition: APInt.h:194
bool isNegative() const
Determine sign of this APInt.
Definition: APInt.h:307
APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1898
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition: APInt.h:1227
bool eq(const APInt &RHS) const
Equality comparison.
Definition: APInt.h:1057
APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition: APInt.cpp:1614
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition: APInt.h:1144
APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1905
void negate()
Negate this APInt in place.
Definition: APInt.h:1421
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition: APInt.h:1589
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition: APInt.h:1548
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:197
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition: APInt.h:334
unsigned countl_one() const
Count the number of leading one bits.
Definition: APInt.h:1565
unsigned logBase2() const
Definition: APInt.h:1703
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition: APInt.h:453
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition: APInt.h:805
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition: APInt.h:383
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition: APInt.h:1128
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition: APInt.h:851
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:418
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition: APInt.h:284
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition: APInt.h:1108
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition: APInt.h:274
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition: APInt.h:178
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1215
APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition: APInt.cpp:1911
bool isOne() const
Determine if this is a value of 1.
Definition: APInt.h:367
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition: APInt.h:264
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition: APInt.h:217
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition: APInt.h:829
unsigned countr_one() const
Count the number of trailing one bits.
Definition: APInt.h:1606
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition: APInt.h:1199
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
an instruction to allocate memory on the stack
Definition: Instructions.h:59
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Class to represent array types.
Definition: DerivedTypes.h:371
LLVM Basic Block Representation.
Definition: BasicBlock.h:60
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
Definition: BasicBlock.cpp:409
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
Definition: BasicBlock.cpp:452
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition: BasicBlock.h:221
unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name, BasicBlock::iterator InsertBefore)
Construct a binary instruction, given the opcode and the two operands.
BinaryOps getOpcode() const
Definition: InstrTypes.h:513
static BinaryOperator * CreateNot(Value *Op, const Twine &Name, BasicBlock::iterator InsertBefore)
Conditional or Unconditional Branch instruction.
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1687
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr, BasicBlock::iterator InsertBefore)
This class is the base class for the comparison instructions.
Definition: InstrTypes.h:983
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition: InstrTypes.h:1362
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition: InstrTypes.h:1198
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition: InstrTypes.h:1255
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:993
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:996
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:1010
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:1022
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:1023
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:999
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:1008
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:997
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:998
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:1017
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:1016
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:1020
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:1007
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:1001
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:1004
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:1018
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:1005
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:1000
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:1002
@ ICMP_EQ
equal
Definition: InstrTypes.h:1014
@ ICMP_NE
not equal
Definition: InstrTypes.h:1015
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:1021
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:1009
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:1019
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:1006
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:995
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:1003
bool isSigned() const
Definition: InstrTypes.h:1265
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:1167
bool isTrueWhenEqual() const
This is just a convenience.
Definition: InstrTypes.h:1314
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition: InstrTypes.h:1211
static CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name, BasicBlock::iterator InsertBefore)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition: InstrTypes.h:1129
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:1105
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition: InstrTypes.h:1233
Predicate getFlippedSignednessPredicate()
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->Failed assert.
Definition: InstrTypes.h:1308
bool isIntPredicate() const
Definition: InstrTypes.h:1123
bool isUnsigned() const
Definition: InstrTypes.h:1271
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2126
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
Definition: Constants.cpp:2087
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2542
static Constant * getNot(Constant *C)
Definition: Constants.cpp:2529
static Constant * getXor(Constant *C1, Constant *C2)
Definition: Constants.cpp:2556
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2535
static Constant * getNeg(Constant *C, bool HasNSW=false)
Definition: Constants.cpp:2523
static Constant * getCompare(unsigned short pred, Constant *C1, Constant *C2, bool OnlyIfReduced=false)
Return an ICmp or FCmp comparison operator constant expression.
Definition: Constants.cpp:2328
static Constant * getZero(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1037
This is the shared class of boolean and integer constants.
Definition: Constants.h:80
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition: Constants.h:255
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:849
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:205
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition: Constants.h:123
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:856
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:148
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:145
static ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:863
This class represents a range of values.
Definition: ConstantRange.h:47
ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
bool isEmptySet() const
Return true if this set contains no members.
static ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
ConstantRange inverse() const
Return a new range that is the logical not of the current set.
std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
static ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:1449
This is an important base class in LLVM.
Definition: Constant.h:41
static Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
Definition: Constants.cpp:400
static Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
Definition: Constants.cpp:767
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:417
bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition: Constants.cpp:107
const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
Definition: Constants.cpp:1758
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:370
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
bool isLegalInteger(uint64_t Width) const
Returns true if the specified type is known to be a native integer type supported by the CPU.
Definition: DataLayout.h:260
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
Definition: DataLayout.cpp:878
unsigned getPointerTypeSizeInBits(Type *) const
Layout pointer size, in bits, based on the type.
Definition: DataLayout.cpp:763
IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
Definition: DataLayout.cpp:905
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:504
Type * getSmallestLegalIntType(LLVMContext &C, unsigned Width=0) const
Returns the smallest integer type with size at least as big as Width bits.
Definition: DataLayout.cpp:893
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:145
ArrayRef< BranchInst * > conditionsFor(const Value *V) const
Access the list of branches which affect this value.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Definition: Dominators.cpp:122
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr, BasicBlock::iterator InsertBefore)
This instruction compares its operands according to the predicate given to the constructor.
bool isEquality() const
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition: Operator.h:420
Type * getSourceElementType() const
Definition: Operator.cpp:67
Value * getPointerOperand()
Definition: Operator.h:441
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition: Operator.h:488
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:973
Type * getValueType() const
Definition: GlobalValue.h:296
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
This instruction compares its operands according to the predicate given to the constructor.
static bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:94
CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Definition: IRBuilder.cpp:913
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2257
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Definition: IRBuilder.h:2460
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
Definition: IRBuilder.h:539
Value * CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2265
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
Definition: IRBuilder.h:2039
Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Definition: IRBuilder.cpp:1214
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition: IRBuilder.h:2516
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition: IRBuilder.h:466
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Definition: IRBuilder.cpp:932
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition: IRBuilder.h:1437
Value * CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1336
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Definition: IRBuilder.h:1876
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2245
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition: IRBuilder.h:1721
Value * createIsFPClass(Value *FPNum, unsigned Test)
Definition: IRBuilder.cpp:1309
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition: IRBuilder.h:486
Value * CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2366
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition: IRBuilder.h:2397
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1749
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2241
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1344
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2127
Value * CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2249
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1416
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition: IRBuilder.h:2021
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1475
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1327
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition: IRBuilder.h:471
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition: IRBuilder.h:2007
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1497
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:1666
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2273
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="")
Definition: IRBuilder.h:2161
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:2196
Value * CreateIsNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg == 0.
Definition: IRBuilder.h:2544
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition: IRBuilder.h:180
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args=std::nullopt, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition: IRBuilder.h:2412
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1519
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:2351
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Definition: IRBuilder.h:516
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition: IRBuilder.h:502
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1404
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1361
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2666
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc X), (trunc Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, ICmpInst::Predicate Pred)
Fold icmp Pred min|max(X, Y), Z.
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, ICmpInst::Predicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?/ x) != y to @llvm.
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS, ConstantInt *&Less, ConstantInt *&Equal, ConstantInt *&Greater)
Match a select chain which produces one of three values based on whether the LHS is less than,...
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, GlobalVariable *GV, CmpInst &ICI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Constant * getLosslessTrunc(Constant *C, Type *TruncTy, unsigned ExtOp)
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, ICmpInst::Predicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * foldICmpCommutative(ICmpInst::Predicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * visitICmpInst(ICmpInst &I)
Instruction * foldSelectICmp(ICmpInst::Predicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
The core instruction combiner logic.
Definition: InstCombiner.h:47
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:498
SimplifyQuery SQ
Definition: InstCombiner.h:76
static bool isCanonicalPredicate(CmpInst::Predicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Definition: InstCombiner.h:157
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
Definition: InstCombiner.h:232
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
Definition: InstCombiner.h:139
TargetLibraryInfo & TLI
Definition: InstCombiner.h:73
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, unsigned Depth=0, const Instruction *CxtI=nullptr)
Definition: InstCombiner.h:441
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:462
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
Definition: InstCombiner.h:386
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
Definition: InstCombiner.h:55
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:484
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
Definition: InstCombiner.h:180
static std::optional< std::pair< CmpInst::Predicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, Constant *C)
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:491
const DataLayout & DL
Definition: InstCombiner.h:75
DomConditionCache DC
Definition: InstCombiner.h:81
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ? InstCombine's freelyInvertA...
Definition: InstCombiner.h:248
void addToWorklist(Instruction *I)
Definition: InstCombiner.h:336
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
Definition: InstCombiner.h:410
DominatorTree & DT
Definition: InstCombiner.h:74
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:469
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
Definition: InstCombiner.h:431
BuilderTy & Builder
Definition: InstCombiner.h:60
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Definition: InstCombiner.h:476
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
Definition: InstCombiner.h:213
const SimplifyQuery & getSimplifyQuery() const
Definition: InstCombiner.h:342
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
Definition: InstCombiner.h:457
bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
bool isArithmeticShift() const
Return true if this is an arithmetic shift right.
Definition: Instruction.h:296
bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
const BasicBlock * getParent() const
Definition: Instruction.h:152
bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Definition: Instruction.h:252
bool isShift() const
Definition: Instruction.h:259
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:278
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:47
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:54
An instruction for reading from memory.
Definition: Instructions.h:184
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: MapVector.h:141
This class represents min/max intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr, BasicBlock::iterator InsertBefore)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr, BasicBlock::iterator InsertBefore, Instruction *MDFrom=nullptr)
A vector that has set insertion semantics.
Definition: SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:98
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition: SetVector.h:254
This instruction constructs a fixed permutation of two input vectors.
bool empty() const
Definition: SmallVector.h:94
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
Class to represent struct types.
Definition: DerivedTypes.h:216
This class represents a truncation of integer types.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
unsigned getIntegerBitWidth() const
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:265
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:234
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:255
static IntegerType * getInt1Ty(LLVMContext &C)
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:166
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:228
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
Definition: Type.h:171
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:348
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
void setOperand(unsigned i, Value *Val)
Definition: User.h:174
Value * getOperand(unsigned i) const
Definition: User.h:169
unsigned getNumOperands() const
Definition: User.h:191
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition: Value.cpp:153
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:693
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1074
iterator_range< use_iterator > uses()
Definition: Value.h:376
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
void takeName(Value *V)
Transfer the name from V to this value.
Definition: Value.cpp:383
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Definition: Type.cpp:676
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:187
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
Definition: APInt.cpp:2732
APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
Definition: APInt.cpp:2750
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1469
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
Definition: PatternMatch.h:485
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
Definition: PatternMatch.h:634
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
Definition: PatternMatch.h:100
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
Definition: PatternMatch.h:580
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:165
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
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:933
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:777
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
Definition: PatternMatch.h:725
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:836
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
Definition: PatternMatch.h:941
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:521
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
Definition: PatternMatch.h:168
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
Definition: PatternMatch.h:553
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
Definition: PatternMatch.h:245
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
CastOperator_match< OpTy, Instruction::Trunc > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
Definition: PatternMatch.h:854
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
Definition: PatternMatch.h:560
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
Definition: PatternMatch.h:305
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:815
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:600
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:644
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:299
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
Definition: PatternMatch.h:734
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
UAddWithOverflow_match< LHS_t, RHS_t, Sum_t > m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S)
Match an icmp instruction checking for unsigned overflow on addition.
m_Intrinsic_Ty< Opnd0 >::Ty m_VecReverse(const Opnd0 &Op0)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
apfloat_match m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
Definition: PatternMatch.h:316
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
Definition: PatternMatch.h:152
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
Definition: PatternMatch.h:573
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
Definition: PatternMatch.h:203
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
Definition: PatternMatch.h:239
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
Definition: PatternMatch.h:659
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:456
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition: STLExtras.h:853
OverflowResult
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1722
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:656
bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Return true if the given value is known to have exactly one bit set when defined.
Constant * ConstantFoldExtractValueInstruction(Constant *Agg, ArrayRef< unsigned > Idxs)
Attempt to constant fold an extractvalue instruction with the specified operands and indices.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition: bit.h:215
Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:324
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
Definition: bit.h:281
Value * emitGEPOffset(IRBuilderBase *Builder, const DataLayout &DL, User *GEP, bool NoAssumptions=false)
Given a getelementptr instruction/constantexpr, emit the code necessary to compute the offset from th...
Definition: Local.cpp:22
constexpr unsigned MaxAnalysisRecursionDepth
Definition: ValueTracking.h:48
Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_UNKNOWN
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
Definition: Function.cpp:2047
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1736
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
Value * simplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
DWARFExpression::Operation Op
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition: STLExtras.h:1921
bool decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate &Pred, Value *&X, APInt &Mask, bool LookThroughTrunc=true)
Decompose an icmp into the form ((X & Mask) pred 0) if possible.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2039
bool isKnownNeverNaN(const Value *V, unsigned Depth, const SimplifyQuery &SQ)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
Value * simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define NC
Definition: regutils.h:42
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:230
static constexpr roundingMode rmTowardZero
Definition: APFloat.h:234
This callback is used in conjunction with PointerMayBeCaptured.
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:77
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition: KnownBits.h:238
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition: KnownBits.h:270
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition: KnownBits.h:147
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition: KnownBits.h:285
unsigned getBitWidth() const
Get the bit width of this value.
Definition: KnownBits.h:40
bool isConstant() const
Returns true if we know the value of all bits.
Definition: KnownBits.h:50
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
Definition: KnownBits.h:292
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition: KnownBits.h:244
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition: KnownBits.h:141
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition: KnownBits.h:125
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition: KnownBits.h:282
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition: KnownBits.h:131
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition: KnownBits.h:57
SelectPatternFlavor Flavor
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DataLayout & DL
Definition: SimplifyQuery.h:61
const Instruction * CxtI
Definition: SimplifyQuery.h:65
const DominatorTree * DT
Definition: SimplifyQuery.h:63
SimplifyQuery getWithInstruction(const Instruction *I) const
Definition: SimplifyQuery.h:96
AssumptionCache * AC
Definition: SimplifyQuery.h:64
const DomConditionCache * DC
Definition: SimplifyQuery.h:66
A MapVector that performs no allocations if smaller than a certain size.
Definition: MapVector.h:254