LLVM 23.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/APFloat.h"
15#include "llvm/ADT/APSInt.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/Statistic.h"
22#include "llvm/Analysis/Loads.h"
26#include "llvm/IR/Constants.h"
27#include "llvm/IR/DataLayout.h"
28#include "llvm/IR/InstrTypes.h"
29#include "llvm/IR/Instruction.h"
35#include <bitset>
36
37using namespace llvm;
38using namespace PatternMatch;
39
40#define DEBUG_TYPE "instcombine"
41
42// How many times is a select replaced by one of its operands?
43STATISTIC(NumSel, "Number of select opts");
44
45namespace llvm {
47}
48
49/// Compute Result = In1+In2, returning true if the result overflowed for this
50/// type.
51static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
52 bool IsSigned = false) {
53 bool Overflow;
54 if (IsSigned)
55 Result = In1.sadd_ov(In2, Overflow);
56 else
57 Result = In1.uadd_ov(In2, Overflow);
58
59 return Overflow;
60}
61
62/// Compute Result = In1-In2, returning true if the result overflowed for this
63/// type.
64static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2,
65 bool IsSigned = false) {
66 bool Overflow;
67 if (IsSigned)
68 Result = In1.ssub_ov(In2, Overflow);
69 else
70 Result = In1.usub_ov(In2, Overflow);
71
72 return Overflow;
73}
74
75/// Given an icmp instruction, return true if any use of this comparison is a
76/// branch on sign bit comparison.
77static bool hasBranchUse(ICmpInst &I) {
78 for (auto *U : I.users())
79 if (isa<CondBrInst>(U))
80 return true;
81 return false;
82}
83
84/// Returns true if the exploded icmp can be expressed as a signed comparison
85/// to zero and updates the predicate accordingly.
86/// The signedness of the comparison is preserved.
87/// TODO: Refactor with decomposeBitTestICmp()?
88static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C) {
89 if (!ICmpInst::isSigned(Pred))
90 return false;
91
92 if (C.isZero())
93 return ICmpInst::isRelational(Pred);
94
95 if (C.isOne()) {
96 if (Pred == ICmpInst::ICMP_SLT) {
97 Pred = ICmpInst::ICMP_SLE;
98 return true;
99 }
100 } else if (C.isAllOnes()) {
101 if (Pred == ICmpInst::ICMP_SGT) {
102 Pred = ICmpInst::ICMP_SGE;
103 return true;
104 }
105 }
106
107 return false;
108}
109
110/// This is called when we see this pattern:
111/// cmp pred (load (gep GV, ...)), cmpcst
112/// where GV is a global variable with a constant initializer. Try to simplify
113/// this into some simple computation that does not need the load. For example
114/// we can optimize "icmp eq (load (gep "foo", 0, i)), 0" into "icmp eq i, 3".
115///
116/// If AndCst is non-null, then the loaded value is masked with that constant
117/// before doing the comparison. This handles cases like "A[i]&4 == 0".
119 LoadInst *LI, GetElementPtrInst *GEP, CmpInst &ICI, ConstantInt *AndCst) {
121 if (LI->isVolatile() || !GV || !GV->isConstant() ||
122 !GV->hasDefinitiveInitializer())
123 return nullptr;
124
125 Type *EltTy = LI->getType();
126 TypeSize EltSize = DL.getTypeStoreSize(EltTy);
127 if (EltSize.isScalable())
128 return nullptr;
129
131 if (!Expr.Index || Expr.BasePtr != GV || Expr.Offset.getBitWidth() > 64)
132 return nullptr;
133
134 Constant *Init = GV->getInitializer();
135 TypeSize GlobalSize = DL.getTypeAllocSize(Init->getType());
136
137 Value *Idx = Expr.Index;
138 const APInt &Stride = Expr.Scale;
139 const APInt &ConstOffset = Expr.Offset;
140
141 // Allow an additional context offset, but only within the stride.
142 if (!ConstOffset.ult(Stride))
143 return nullptr;
144
145 // Don't handle overlapping loads for now.
146 if (!Stride.uge(EltSize.getFixedValue()))
147 return nullptr;
148
149 // Don't blow up on huge arrays.
150 uint64_t ArrayElementCount =
151 divideCeil((GlobalSize.getFixedValue() - ConstOffset.getZExtValue()),
152 Stride.getZExtValue());
153 if (ArrayElementCount > MaxArraySizeForCombine)
154 return nullptr;
155
156 enum { Overdefined = -3, Undefined = -2 };
157
158 // Variables for our state machines.
159
160 // FirstTrueElement/SecondTrueElement - Used to emit a comparison of the form
161 // "i == 47 | i == 87", where 47 is the first index the condition is true for,
162 // and 87 is the second (and last) index. FirstTrueElement is -2 when
163 // undefined, otherwise set to the first true element. SecondTrueElement is
164 // -2 when undefined, -3 when overdefined and >= 0 when that index is true.
165 int FirstTrueElement = Undefined, SecondTrueElement = Undefined;
166
167 // FirstFalseElement/SecondFalseElement - Used to emit a comparison of the
168 // form "i != 47 & i != 87". Same state transitions as for true elements.
169 int FirstFalseElement = Undefined, SecondFalseElement = Undefined;
170
171 /// TrueRangeEnd/FalseRangeEnd - In conjunction with First*Element, these
172 /// define a state machine that triggers for ranges of values that the index
173 /// is true or false for. This triggers on things like "abbbbc"[i] == 'b'.
174 /// This is -2 when undefined, -3 when overdefined, and otherwise the last
175 /// index in the range (inclusive). We use -2 for undefined here because we
176 /// use relative comparisons and don't want 0-1 to match -1.
177 int TrueRangeEnd = Undefined, FalseRangeEnd = Undefined;
178
179 // MagicBitvector - This is a magic bitvector where we set a bit if the
180 // comparison is true for element 'i'. If there are 64 elements or less in
181 // the array, this will fully represent all the comparison results.
182 uint64_t MagicBitvector = 0;
183
184 // Scan the array and see if one of our patterns matches.
185 Constant *CompareRHS = cast<Constant>(ICI.getOperand(1));
186 APInt Offset = ConstOffset;
187 for (unsigned i = 0, e = ArrayElementCount; i != e; ++i, Offset += Stride) {
189 if (!Elt)
190 return nullptr;
191
192 // If the element is masked, handle it.
193 if (AndCst) {
194 Elt = ConstantFoldBinaryOpOperands(Instruction::And, Elt, AndCst, DL);
195 if (!Elt)
196 return nullptr;
197 }
198
199 // Find out if the comparison would be true or false for the i'th element.
201 CompareRHS, DL, &TLI);
202 if (!C)
203 return nullptr;
204
205 // If the result is undef for this element, ignore it.
206 if (isa<UndefValue>(C)) {
207 // Extend range state machines to cover this element in case there is an
208 // undef in the middle of the range.
209 if (TrueRangeEnd == (int)i - 1)
210 TrueRangeEnd = i;
211 if (FalseRangeEnd == (int)i - 1)
212 FalseRangeEnd = i;
213 continue;
214 }
215
216 // If we can't compute the result for any of the elements, we have to give
217 // up evaluating the entire conditional.
218 if (!isa<ConstantInt>(C))
219 return nullptr;
220
221 // Otherwise, we know if the comparison is true or false for this element,
222 // update our state machines.
223 bool IsTrueForElt = !cast<ConstantInt>(C)->isZero();
224
225 // State machine for single/double/range index comparison.
226 if (IsTrueForElt) {
227 // Update the TrueElement state machine.
228 if (FirstTrueElement == Undefined)
229 FirstTrueElement = TrueRangeEnd = i; // First true element.
230 else {
231 // Update double-compare state machine.
232 if (SecondTrueElement == Undefined)
233 SecondTrueElement = i;
234 else
235 SecondTrueElement = Overdefined;
236
237 // Update range state machine.
238 if (TrueRangeEnd == (int)i - 1)
239 TrueRangeEnd = i;
240 else
241 TrueRangeEnd = Overdefined;
242 }
243 } else {
244 // Update the FalseElement state machine.
245 if (FirstFalseElement == Undefined)
246 FirstFalseElement = FalseRangeEnd = i; // First false element.
247 else {
248 // Update double-compare state machine.
249 if (SecondFalseElement == Undefined)
250 SecondFalseElement = i;
251 else
252 SecondFalseElement = Overdefined;
253
254 // Update range state machine.
255 if (FalseRangeEnd == (int)i - 1)
256 FalseRangeEnd = i;
257 else
258 FalseRangeEnd = Overdefined;
259 }
260 }
261
262 // If this element is in range, update our magic bitvector.
263 if (i < 64 && IsTrueForElt)
264 MagicBitvector |= 1ULL << i;
265
266 // If all of our states become overdefined, bail out early. Since the
267 // predicate is expensive, only check it every 8 elements. This is only
268 // really useful for really huge arrays.
269 if ((i & 8) == 0 && i >= 64 && SecondTrueElement == Overdefined &&
270 SecondFalseElement == Overdefined && TrueRangeEnd == Overdefined &&
271 FalseRangeEnd == Overdefined)
272 return nullptr;
273 }
274
275 // Now that we've scanned the entire array, emit our new comparison(s). We
276 // order the state machines in complexity of the generated code.
277
278 // If inbounds keyword is not present, Idx * Stride can overflow.
279 // Let's assume that Stride is 2 and the wanted value is at offset 0.
280 // Then, there are two possible values for Idx to match offset 0:
281 // 0x00..00, 0x80..00.
282 // Emitting 'icmp eq Idx, 0' isn't correct in this case because the
283 // comparison is false if Idx was 0x80..00.
284 // We need to erase the highest countTrailingZeros(ElementSize) bits of Idx.
285 auto MaskIdx = [&](Value *Idx) {
286 if (!Expr.Flags.isInBounds() && Stride.countr_zero() != 0) {
288 Mask = Builder.CreateLShr(Mask, Stride.countr_zero());
289 Idx = Builder.CreateAnd(Idx, Mask);
290 }
291 return Idx;
292 };
293
294 // If the comparison is only true for one or two elements, emit direct
295 // comparisons.
296 if (SecondTrueElement != Overdefined) {
297 Idx = MaskIdx(Idx);
298 // None true -> false.
299 if (FirstTrueElement == Undefined)
300 return replaceInstUsesWith(ICI, Builder.getFalse());
301
302 Value *FirstTrueIdx = ConstantInt::get(Idx->getType(), FirstTrueElement);
303
304 // True for one element -> 'i == 47'.
305 if (SecondTrueElement == Undefined)
306 return new ICmpInst(ICmpInst::ICMP_EQ, Idx, FirstTrueIdx);
307
308 // True for two elements -> 'i == 47 | i == 72'.
309 Value *C1 = Builder.CreateICmpEQ(Idx, FirstTrueIdx);
310 Value *SecondTrueIdx = ConstantInt::get(Idx->getType(), SecondTrueElement);
311 Value *C2 = Builder.CreateICmpEQ(Idx, SecondTrueIdx);
312 return BinaryOperator::CreateOr(C1, C2);
313 }
314
315 // If the comparison is only false for one or two elements, emit direct
316 // comparisons.
317 if (SecondFalseElement != Overdefined) {
318 Idx = MaskIdx(Idx);
319 // None false -> true.
320 if (FirstFalseElement == Undefined)
321 return replaceInstUsesWith(ICI, Builder.getTrue());
322
323 Value *FirstFalseIdx = ConstantInt::get(Idx->getType(), FirstFalseElement);
324
325 // False for one element -> 'i != 47'.
326 if (SecondFalseElement == Undefined)
327 return new ICmpInst(ICmpInst::ICMP_NE, Idx, FirstFalseIdx);
328
329 // False for two elements -> 'i != 47 & i != 72'.
330 Value *C1 = Builder.CreateICmpNE(Idx, FirstFalseIdx);
331 Value *SecondFalseIdx =
332 ConstantInt::get(Idx->getType(), SecondFalseElement);
333 Value *C2 = Builder.CreateICmpNE(Idx, SecondFalseIdx);
334 return BinaryOperator::CreateAnd(C1, C2);
335 }
336
337 // If the comparison can be replaced with a range comparison for the elements
338 // where it is true, emit the range check.
339 if (TrueRangeEnd != Overdefined) {
340 assert(TrueRangeEnd != FirstTrueElement && "Should emit single compare");
341 Idx = MaskIdx(Idx);
342
343 // Generate (i-FirstTrue) <u (TrueRangeEnd-FirstTrue+1).
344 if (FirstTrueElement) {
345 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstTrueElement);
346 Idx = Builder.CreateAdd(Idx, Offs);
347 }
348
349 Value *End =
350 ConstantInt::get(Idx->getType(), TrueRangeEnd - FirstTrueElement + 1);
351 return new ICmpInst(ICmpInst::ICMP_ULT, Idx, End);
352 }
353
354 // False range check.
355 if (FalseRangeEnd != Overdefined) {
356 assert(FalseRangeEnd != FirstFalseElement && "Should emit single compare");
357 Idx = MaskIdx(Idx);
358 // Generate (i-FirstFalse) >u (FalseRangeEnd-FirstFalse).
359 if (FirstFalseElement) {
360 Value *Offs = ConstantInt::getSigned(Idx->getType(), -FirstFalseElement);
361 Idx = Builder.CreateAdd(Idx, Offs);
362 }
363
364 Value *End =
365 ConstantInt::get(Idx->getType(), FalseRangeEnd - FirstFalseElement);
366 return new ICmpInst(ICmpInst::ICMP_UGT, Idx, End);
367 }
368
369 // If a magic bitvector captures the entire comparison state
370 // of this load, replace it with computation that does:
371 // ((magic_cst >> i) & 1) != 0
372 {
373 Type *Ty = nullptr;
374
375 // Look for an appropriate type:
376 // - The type of Idx if the magic fits
377 // - The smallest fitting legal type
378 if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
379 Ty = Idx->getType();
380 else
381 Ty = DL.getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
382
383 if (Ty) {
384 Idx = MaskIdx(Idx);
385 Value *V = Builder.CreateIntCast(Idx, Ty, false);
386 V = Builder.CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
387 V = Builder.CreateAnd(ConstantInt::get(Ty, 1), V);
388 return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
389 }
390 }
391
392 return nullptr;
393}
394
395/// Returns true if we can rewrite Start as a GEP with pointer Base
396/// and some integer offset. The nodes that need to be re-written
397/// for this transformation will be added to Explored.
399 const DataLayout &DL,
400 SetVector<Value *> &Explored) {
401 SmallVector<Value *, 16> WorkList(1, Start);
402 Explored.insert(Base);
403
404 // The following traversal gives us an order which can be used
405 // when doing the final transformation. Since in the final
406 // transformation we create the PHI replacement instructions first,
407 // we don't have to get them in any particular order.
408 //
409 // However, for other instructions we will have to traverse the
410 // operands of an instruction first, which means that we have to
411 // do a post-order traversal.
412 while (!WorkList.empty()) {
414
415 while (!WorkList.empty()) {
416 if (Explored.size() >= 100)
417 return false;
418
419 Value *V = WorkList.back();
420
421 if (Explored.contains(V)) {
422 WorkList.pop_back();
423 continue;
424 }
425
427 // We've found some value that we can't explore which is different from
428 // the base. Therefore we can't do this transformation.
429 return false;
430
431 if (auto *GEP = dyn_cast<GEPOperator>(V)) {
432 // Only allow inbounds GEPs with at most one variable offset.
433 auto IsNonConst = [](Value *V) { return !isa<ConstantInt>(V); };
434 if (!GEP->isInBounds() || count_if(GEP->indices(), IsNonConst) > 1)
435 return false;
436
437 NW = NW.intersectForOffsetAdd(GEP->getNoWrapFlags());
438 if (!Explored.contains(GEP->getOperand(0)))
439 WorkList.push_back(GEP->getOperand(0));
440 }
441
442 if (WorkList.back() == V) {
443 WorkList.pop_back();
444 // We've finished visiting this node, mark it as such.
445 Explored.insert(V);
446 }
447
448 if (auto *PN = dyn_cast<PHINode>(V)) {
449 // We cannot transform PHIs on unsplittable basic blocks.
450 if (isa<CatchSwitchInst>(PN->getParent()->getTerminator()))
451 return false;
452 Explored.insert(PN);
453 PHIs.insert(PN);
454 }
455 }
456
457 // Explore the PHI nodes further.
458 for (auto *PN : PHIs)
459 for (Value *Op : PN->incoming_values())
460 if (!Explored.contains(Op))
461 WorkList.push_back(Op);
462 }
463
464 // Make sure that we can do this. Since we can't insert GEPs in a basic
465 // block before a PHI node, we can't easily do this transformation if
466 // we have PHI node users of transformed instructions.
467 for (Value *Val : Explored) {
468 for (Value *Use : Val->uses()) {
469
470 auto *PHI = dyn_cast<PHINode>(Use);
471 auto *Inst = dyn_cast<Instruction>(Val);
472
473 if (Inst == Base || Inst == PHI || !Inst || !PHI ||
474 !Explored.contains(PHI))
475 continue;
476
477 if (PHI->getParent() == Inst->getParent())
478 return false;
479 }
480 }
481 return true;
482}
483
484// Sets the appropriate insert point on Builder where we can add
485// a replacement Instruction for V (if that is possible).
486static void setInsertionPoint(IRBuilder<> &Builder, Value *V,
487 bool Before = true) {
488 if (auto *PHI = dyn_cast<PHINode>(V)) {
489 BasicBlock *Parent = PHI->getParent();
490 Builder.SetInsertPoint(Parent, Parent->getFirstInsertionPt());
491 return;
492 }
493 if (auto *I = dyn_cast<Instruction>(V)) {
494 if (!Before)
495 I = &*std::next(I->getIterator());
496 Builder.SetInsertPoint(I);
497 return;
498 }
499 if (auto *A = dyn_cast<Argument>(V)) {
500 // Set the insertion point in the entry block.
501 BasicBlock &Entry = A->getParent()->getEntryBlock();
502 Builder.SetInsertPoint(&Entry, Entry.getFirstInsertionPt());
503 return;
504 }
505 // Otherwise, this is a constant and we don't need to set a new
506 // insertion point.
507 assert(isa<Constant>(V) && "Setting insertion point for unknown value!");
508}
509
510/// Returns a re-written value of Start as an indexed GEP using Base as a
511/// pointer.
513 const DataLayout &DL,
514 SetVector<Value *> &Explored,
515 InstCombiner &IC) {
516 // Perform all the substitutions. This is a bit tricky because we can
517 // have cycles in our use-def chains.
518 // 1. Create the PHI nodes without any incoming values.
519 // 2. Create all the other values.
520 // 3. Add the edges for the PHI nodes.
521 // 4. Emit GEPs to get the original pointers.
522 // 5. Remove the original instructions.
523 Type *IndexType = IntegerType::get(
524 Base->getContext(), DL.getIndexTypeSizeInBits(Start->getType()));
525
527 NewInsts[Base] = ConstantInt::getNullValue(IndexType);
528
529 // Create the new PHI nodes, without adding any incoming values.
530 for (Value *Val : Explored) {
531 if (Val == Base)
532 continue;
533 // Create empty phi nodes. This avoids cyclic dependencies when creating
534 // the remaining instructions.
535 if (auto *PHI = dyn_cast<PHINode>(Val))
536 NewInsts[PHI] =
537 PHINode::Create(IndexType, PHI->getNumIncomingValues(),
538 PHI->getName() + ".idx", PHI->getIterator());
539 }
540 IRBuilder<> Builder(Base->getContext());
541
542 // Create all the other instructions.
543 for (Value *Val : Explored) {
544 if (NewInsts.contains(Val))
545 continue;
546
547 if (auto *GEP = dyn_cast<GEPOperator>(Val)) {
548 setInsertionPoint(Builder, GEP);
549 Value *Op = NewInsts[GEP->getOperand(0)];
550 Value *OffsetV = emitGEPOffset(&Builder, DL, GEP);
552 NewInsts[GEP] = OffsetV;
553 else
554 NewInsts[GEP] = Builder.CreateAdd(
555 Op, OffsetV, GEP->getOperand(0)->getName() + ".add",
556 /*NUW=*/NW.hasNoUnsignedWrap(),
557 /*NSW=*/NW.hasNoUnsignedSignedWrap());
558 continue;
559 }
560 if (isa<PHINode>(Val))
561 continue;
562
563 llvm_unreachable("Unexpected instruction type");
564 }
565
566 // Add the incoming values to the PHI nodes.
567 for (Value *Val : Explored) {
568 if (Val == Base)
569 continue;
570 // All the instructions have been created, we can now add edges to the
571 // phi nodes.
572 if (auto *PHI = dyn_cast<PHINode>(Val)) {
573 PHINode *NewPhi = static_cast<PHINode *>(NewInsts[PHI]);
574 for (unsigned I = 0, E = PHI->getNumIncomingValues(); I < E; ++I) {
575 Value *NewIncoming = PHI->getIncomingValue(I);
576
577 auto It = NewInsts.find(NewIncoming);
578 if (It != NewInsts.end())
579 NewIncoming = It->second;
580
581 NewPhi->addIncoming(NewIncoming, PHI->getIncomingBlock(I));
582 }
583 }
584 }
585
586 for (Value *Val : Explored) {
587 if (Val == Base)
588 continue;
589
590 setInsertionPoint(Builder, Val, false);
591 // Create GEP for external users.
592 Value *NewVal = Builder.CreateGEP(Builder.getInt8Ty(), Base, NewInsts[Val],
593 Val->getName() + ".ptr", NW);
594 IC.replaceInstUsesWith(*cast<Instruction>(Val), NewVal);
595 // Add old instruction to worklist for DCE. We don't directly remove it
596 // here because the original compare is one of the users.
598 }
599
600 return NewInsts[Start];
601}
602
603/// Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
604/// We can look through PHIs, GEPs and casts in order to determine a common base
605/// between GEPLHS and RHS.
608 const DataLayout &DL,
609 InstCombiner &IC) {
610 // FIXME: Support vector of pointers.
611 if (GEPLHS->getType()->isVectorTy())
612 return nullptr;
613
614 if (!GEPLHS->hasAllConstantIndices())
615 return nullptr;
616
617 APInt Offset(DL.getIndexTypeSizeInBits(GEPLHS->getType()), 0);
618 Value *PtrBase =
620 /*AllowNonInbounds*/ false);
621
622 // Bail if we looked through addrspacecast.
623 if (PtrBase->getType() != GEPLHS->getType())
624 return nullptr;
625
626 // The set of nodes that will take part in this transformation.
627 SetVector<Value *> Nodes;
628 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags();
629 if (!canRewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes))
630 return nullptr;
631
632 // We know we can re-write this as
633 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2)
634 // Since we've only looked through inbouds GEPs we know that we
635 // can't have overflow on either side. We can therefore re-write
636 // this as:
637 // OFFSET1 cmp OFFSET2
638 Value *NewRHS = rewriteGEPAsOffset(RHS, PtrBase, NW, DL, Nodes, IC);
639
640 // RewriteGEPAsOffset has replaced RHS and all of its uses with a re-written
641 // GEP having PtrBase as the pointer base, and has returned in NewRHS the
642 // offset. Since Index is the offset of LHS to the base pointer, we will now
643 // compare the offsets instead of comparing the pointers.
645 IC.Builder.getInt(Offset), NewRHS);
646}
647
648/// Fold comparisons between a GEP instruction and something else. At this point
649/// we know that the GEP is on the LHS of the comparison.
652 // Don't transform signed compares of GEPs into index compares. Even if the
653 // GEP is inbounds, the final add of the base pointer can have signed overflow
654 // and would change the result of the icmp.
655 // e.g. "&foo[0] <s &foo[1]" can't be folded to "true" because "foo" could be
656 // the maximum signed value for the pointer type.
658 return nullptr;
659
660 // Look through bitcasts and addrspacecasts. We do not however want to remove
661 // 0 GEPs.
662 if (!isa<GetElementPtrInst>(RHS))
663 RHS = RHS->stripPointerCasts();
664
665 auto CanFold = [Cond](GEPNoWrapFlags NW) {
667 return true;
668
669 // Unsigned predicates can be folded if the GEPs have *any* nowrap flags.
671 return NW != GEPNoWrapFlags::none();
672 };
673
674 auto NewICmp = [Cond](GEPNoWrapFlags NW, Value *Op1, Value *Op2) {
675 if (!NW.hasNoUnsignedWrap()) {
676 // Convert signed to unsigned comparison.
677 return new ICmpInst(ICmpInst::getSignedPredicate(Cond), Op1, Op2);
678 }
679
680 auto *I = new ICmpInst(Cond, Op1, Op2);
681 I->setSameSign(NW.hasNoUnsignedSignedWrap());
682 return I;
683 };
684
686 if (Base.Ptr == RHS && CanFold(Base.LHSNW) && !Base.isExpensive()) {
687 // ((gep Ptr, OFFSET) cmp Ptr) ---> (OFFSET cmp 0).
688 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
689 Value *Offset =
690 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEPs=*/true);
691 return NewICmp(Base.LHSNW, Offset,
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(),
698 RHS->getType()->getPointerAddressSpace())) {
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();
719 Base = Builder.CreateVectorSplat(EC, Base);
720 }
721 return new ICmpInst(Cond, Base,
723 cast<Constant>(RHS), Base->getType()));
724 } else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
725 GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
726
727 // If the base pointers are different, but the indices are the same, just
728 // compare the base pointer.
729 if (GEPLHS->getOperand(0) != GEPRHS->getOperand(0)) {
730 bool IndicesTheSame =
731 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
732 GEPLHS->getPointerOperand()->getType() ==
733 GEPRHS->getPointerOperand()->getType() &&
734 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType();
735 if (IndicesTheSame)
736 for (unsigned i = 1, e = GEPLHS->getNumOperands(); i != e; ++i)
737 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
738 IndicesTheSame = false;
739 break;
740 }
741
742 // If all indices are the same, just compare the base pointers.
743 Type *BaseType = GEPLHS->getOperand(0)->getType();
744 if (IndicesTheSame &&
745 CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
746 return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
747
748 // If we're comparing GEPs with two base pointers that only differ in type
749 // and both GEPs have only constant indices or just one use, then fold
750 // the compare with the adjusted indices.
751 // FIXME: Support vector of pointers.
752 if (GEPLHS->isInBounds() && GEPRHS->isInBounds() &&
753 (GEPLHS->hasAllConstantIndices() || GEPLHS->hasOneUse()) &&
754 (GEPRHS->hasAllConstantIndices() || GEPRHS->hasOneUse()) &&
755 GEPLHS->getOperand(0)->stripPointerCasts() ==
756 GEPRHS->getOperand(0)->stripPointerCasts() &&
757 !GEPLHS->getType()->isVectorTy()) {
758 Value *LOffset = EmitGEPOffset(GEPLHS);
759 Value *ROffset = EmitGEPOffset(GEPRHS);
760
761 // If we looked through an addrspacecast between different sized address
762 // spaces, the LHS and RHS pointers are different sized
763 // integers. Truncate to the smaller one.
764 Type *LHSIndexTy = LOffset->getType();
765 Type *RHSIndexTy = ROffset->getType();
766 if (LHSIndexTy != RHSIndexTy) {
767 if (LHSIndexTy->getPrimitiveSizeInBits().getFixedValue() <
768 RHSIndexTy->getPrimitiveSizeInBits().getFixedValue()) {
769 ROffset = Builder.CreateTrunc(ROffset, LHSIndexTy);
770 } else
771 LOffset = Builder.CreateTrunc(LOffset, RHSIndexTy);
772 }
773
775 LOffset, ROffset);
776 return replaceInstUsesWith(I, Cmp);
777 }
778 }
779
780 if (GEPLHS->getOperand(0) == GEPRHS->getOperand(0) &&
781 GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
782 GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
783 // If the GEPs only differ by one index, compare it.
784 unsigned NumDifferences = 0; // Keep track of # differences.
785 unsigned DiffOperand = 0; // The operand that differs.
786 for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
787 if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
788 Type *LHSType = GEPLHS->getOperand(i)->getType();
789 Type *RHSType = GEPRHS->getOperand(i)->getType();
790 // FIXME: Better support for vector of pointers.
791 if (LHSType->getPrimitiveSizeInBits() !=
792 RHSType->getPrimitiveSizeInBits() ||
793 (GEPLHS->getType()->isVectorTy() &&
794 (!LHSType->isVectorTy() || !RHSType->isVectorTy()))) {
795 // Irreconcilable differences.
796 NumDifferences = 2;
797 break;
798 }
799
800 if (NumDifferences++)
801 break;
802 DiffOperand = i;
803 }
804
805 if (NumDifferences == 0) // SAME GEP?
806 return replaceInstUsesWith(
807 I, // No comparison is needed here.
808 ConstantInt::get(I.getType(), ICmpInst::isTrueWhenEqual(Cond)));
809 // If two GEPs only differ by an index, compare them.
810 // Note that nowrap flags are always needed when comparing two indices.
811 else if (NumDifferences == 1 && NW != GEPNoWrapFlags::none()) {
812 Value *LHSV = GEPLHS->getOperand(DiffOperand);
813 Value *RHSV = GEPRHS->getOperand(DiffOperand);
814 return NewICmp(NW, LHSV, RHSV);
815 }
816 }
817
818 if (Base.Ptr && CanFold(Base.LHSNW & Base.RHSNW) && !Base.isExpensive()) {
819 // ((gep Ptr, OFFSET1) cmp (gep Ptr, OFFSET2) ---> (OFFSET1 cmp OFFSET2)
820 Type *IdxTy = DL.getIndexType(GEPLHS->getType());
821 Value *L =
822 EmitGEPOffsets(Base.LHSGEPs, Base.LHSNW, IdxTy, /*RewriteGEP=*/true);
823 Value *R =
824 EmitGEPOffsets(Base.RHSGEPs, Base.RHSNW, IdxTy, /*RewriteGEP=*/true);
825 return NewICmp(Base.LHSNW & Base.RHSNW, L, R);
826 }
827 }
828
829 // Try convert this to an indexed compare by looking through PHIs/casts as a
830 // last resort.
831 return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
832}
833
835 // It would be tempting to fold away comparisons between allocas and any
836 // pointer not based on that alloca (e.g. an argument). However, even
837 // though such pointers cannot alias, they can still compare equal.
838 //
839 // But LLVM doesn't specify where allocas get their memory, so if the alloca
840 // doesn't escape we can argue that it's impossible to guess its value, and we
841 // can therefore act as if any such guesses are wrong.
842 //
843 // However, we need to ensure that this folding is consistent: We can't fold
844 // one comparison to false, and then leave a different comparison against the
845 // same value alone (as it might evaluate to true at runtime, leading to a
846 // contradiction). As such, this code ensures that all comparisons are folded
847 // at the same time, and there are no other escapes.
848
849 struct CmpCaptureTracker : public CaptureTracker {
850 AllocaInst *Alloca;
851 bool Captured = false;
852 /// The value of the map is a bit mask of which icmp operands the alloca is
853 /// used in.
855
856 CmpCaptureTracker(AllocaInst *Alloca) : Alloca(Alloca) {}
857
858 void tooManyUses() override { Captured = true; }
859
860 Action captured(const Use *U, UseCaptureInfo CI) override {
861 // TODO(captures): Use UseCaptureInfo.
862 auto *ICmp = dyn_cast<ICmpInst>(U->getUser());
863 // We need to check that U is based *only* on the alloca, and doesn't
864 // have other contributions from a select/phi operand.
865 // TODO: We could check whether getUnderlyingObjects() reduces to one
866 // object, which would allow looking through phi nodes.
867 if (ICmp && ICmp->isEquality() && getUnderlyingObject(*U) == Alloca) {
868 // Collect equality icmps of the alloca, and don't treat them as
869 // captures.
870 ICmps[ICmp] |= 1u << U->getOperandNo();
871 return Continue;
872 }
873
874 Captured = true;
875 return Stop;
876 }
877 };
878
879 CmpCaptureTracker Tracker(Alloca);
880 PointerMayBeCaptured(Alloca, &Tracker);
881 if (Tracker.Captured)
882 return false;
883
884 bool Changed = false;
885 for (auto [ICmp, Operands] : Tracker.ICmps) {
886 switch (Operands) {
887 case 1:
888 case 2: {
889 // The alloca is only used in one icmp operand. Assume that the
890 // equality is false.
891 auto *Res = ConstantInt::get(ICmp->getType(),
892 ICmp->getPredicate() == ICmpInst::ICMP_NE);
893 replaceInstUsesWith(*ICmp, Res);
895 Changed = true;
896 break;
897 }
898 case 3:
899 // Both icmp operands are based on the alloca, so this is comparing
900 // pointer offsets, without leaking any information about the address
901 // of the alloca. Ignore such comparisons.
902 break;
903 default:
904 llvm_unreachable("Cannot happen");
905 }
906 }
907
908 return Changed;
909}
910
911/// Fold "icmp pred (X+C), X".
913 CmpPredicate Pred) {
914 // From this point on, we know that (X+C <= X) --> (X+C < X) because C != 0,
915 // so the values can never be equal. Similarly for all other "or equals"
916 // operators.
917 assert(!!C && "C should not be zero!");
918
919 // (X+1) <u X --> X >u (MAXUINT-1) --> X == 255
920 // (X+2) <u X --> X >u (MAXUINT-2) --> X > 253
921 // (X+MAXUINT) <u X --> X >u (MAXUINT-MAXUINT) --> X != 0
922 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_ULE) {
923 Constant *R =
924 ConstantInt::get(X->getType(), APInt::getMaxValue(C.getBitWidth()) - C);
925 return new ICmpInst(ICmpInst::ICMP_UGT, X, R);
926 }
927
928 // (X+1) >u X --> X <u (0-1) --> X != 255
929 // (X+2) >u X --> X <u (0-2) --> X <u 254
930 // (X+MAXUINT) >u X --> X <u (0-MAXUINT) --> X <u 1 --> X == 0
931 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE)
932 return new ICmpInst(ICmpInst::ICMP_ULT, X,
933 ConstantInt::get(X->getType(), -C));
934
935 APInt SMax = APInt::getSignedMaxValue(C.getBitWidth());
936
937 // (X+ 1) <s X --> X >s (MAXSINT-1) --> X == 127
938 // (X+ 2) <s X --> X >s (MAXSINT-2) --> X >s 125
939 // (X+MAXSINT) <s X --> X >s (MAXSINT-MAXSINT) --> X >s 0
940 // (X+MINSINT) <s X --> X >s (MAXSINT-MINSINT) --> X >s -1
941 // (X+ -2) <s X --> X >s (MAXSINT- -2) --> X >s 126
942 // (X+ -1) <s X --> X >s (MAXSINT- -1) --> X != 127
943 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE)
944 return new ICmpInst(ICmpInst::ICMP_SGT, X,
945 ConstantInt::get(X->getType(), SMax - C));
946
947 // (X+ 1) >s X --> X <s (MAXSINT-(1-1)) --> X != 127
948 // (X+ 2) >s X --> X <s (MAXSINT-(2-1)) --> X <s 126
949 // (X+MAXSINT) >s X --> X <s (MAXSINT-(MAXSINT-1)) --> X <s 1
950 // (X+MINSINT) >s X --> X <s (MAXSINT-(MINSINT-1)) --> X <s -2
951 // (X+ -2) >s X --> X <s (MAXSINT-(-2-1)) --> X <s -126
952 // (X+ -1) >s X --> X <s (MAXSINT-(-1-1)) --> X == -128
953
954 assert(Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE);
955 return new ICmpInst(ICmpInst::ICMP_SLT, X,
956 ConstantInt::get(X->getType(), SMax - (C - 1)));
957}
958
959/// Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" ->
960/// (icmp eq/ne A, Log2(AP2/AP1)) ->
961/// (icmp eq/ne A, Log2(AP2) - Log2(AP1)).
963 const APInt &AP1,
964 const APInt &AP2) {
965 assert(I.isEquality() && "Cannot fold icmp gt/lt");
966
967 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
968 if (I.getPredicate() == I.ICMP_NE)
969 Pred = CmpInst::getInversePredicate(Pred);
970 return new ICmpInst(Pred, LHS, RHS);
971 };
972
973 // Don't bother doing any work for cases which InstSimplify handles.
974 if (AP2.isZero())
975 return nullptr;
976
977 bool IsAShr = isa<AShrOperator>(I.getOperand(0));
978 if (IsAShr) {
979 if (AP2.isAllOnes())
980 return nullptr;
981 if (AP2.isNegative() != AP1.isNegative())
982 return nullptr;
983 if (AP2.sgt(AP1))
984 return nullptr;
985 }
986
987 if (!AP1)
988 // 'A' must be large enough to shift out the highest set bit.
989 return getICmp(I.ICMP_UGT, A,
990 ConstantInt::get(A->getType(), AP2.logBase2()));
991
992 if (AP1 == AP2)
993 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
994
995 int Shift;
996 if (IsAShr && AP1.isNegative())
997 Shift = AP1.countl_one() - AP2.countl_one();
998 else
999 Shift = AP1.countl_zero() - AP2.countl_zero();
1000
1001 if (Shift > 0) {
1002 if (IsAShr && AP1 == AP2.ashr(Shift)) {
1003 // There are multiple solutions if we are comparing against -1 and the LHS
1004 // of the ashr is not a power of two.
1005 if (AP1.isAllOnes() && !AP2.isPowerOf2())
1006 return getICmp(I.ICMP_UGE, A, ConstantInt::get(A->getType(), Shift));
1007 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1008 } else if (AP1 == AP2.lshr(Shift)) {
1009 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1010 }
1011 }
1012
1013 // Shifting const2 will never be equal to const1.
1014 // FIXME: This should always be handled by InstSimplify?
1015 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1016 return replaceInstUsesWith(I, TorF);
1017}
1018
1019/// Handle "(icmp eq/ne (shl AP2, A), AP1)" ->
1020/// (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
1022 const APInt &AP1,
1023 const APInt &AP2) {
1024 assert(I.isEquality() && "Cannot fold icmp gt/lt");
1025
1026 auto getICmp = [&I](CmpInst::Predicate Pred, Value *LHS, Value *RHS) {
1027 if (I.getPredicate() == I.ICMP_NE)
1028 Pred = CmpInst::getInversePredicate(Pred);
1029 return new ICmpInst(Pred, LHS, RHS);
1030 };
1031
1032 // Don't bother doing any work for cases which InstSimplify handles.
1033 if (AP2.isZero())
1034 return nullptr;
1035
1036 unsigned AP2TrailingZeros = AP2.countr_zero();
1037
1038 if (!AP1 && AP2TrailingZeros != 0)
1039 return getICmp(
1040 I.ICMP_UGE, A,
1041 ConstantInt::get(A->getType(), AP2.getBitWidth() - AP2TrailingZeros));
1042
1043 if (AP1 == AP2)
1044 return getICmp(I.ICMP_EQ, A, ConstantInt::getNullValue(A->getType()));
1045
1046 // Get the distance between the lowest bits that are set.
1047 int Shift = AP1.countr_zero() - AP2TrailingZeros;
1048
1049 if (Shift > 0 && AP2.shl(Shift) == AP1)
1050 return getICmp(I.ICMP_EQ, A, ConstantInt::get(A->getType(), Shift));
1051
1052 // Shifting const2 will never be equal to const1.
1053 // FIXME: This should always be handled by InstSimplify?
1054 auto *TorF = ConstantInt::get(I.getType(), I.getPredicate() == I.ICMP_NE);
1055 return replaceInstUsesWith(I, TorF);
1056}
1057
1058/// The caller has matched a pattern of the form:
1059/// I = icmp ugt (add (add A, B), CI2), CI1
1060/// If this is of the form:
1061/// sum = a + b
1062/// if (sum+128 >u 255)
1063/// Then replace it with llvm.sadd.with.overflow.i8.
1064///
1066 ConstantInt *CI2, ConstantInt *CI1,
1067 InstCombinerImpl &IC) {
1068 // The transformation we're trying to do here is to transform this into an
1069 // llvm.sadd.with.overflow. To do this, we have to replace the original add
1070 // with a narrower add, and discard the add-with-constant that is part of the
1071 // range check (if we can't eliminate it, this isn't profitable).
1072
1073 // In order to eliminate the add-with-constant, the compare can be its only
1074 // use.
1075 Instruction *AddWithCst = cast<Instruction>(I.getOperand(0));
1076 if (!AddWithCst->hasOneUse())
1077 return nullptr;
1078
1079 // If CI2 is 2^7, 2^15, 2^31, then it might be an sadd.with.overflow.
1080 if (!CI2->getValue().isPowerOf2())
1081 return nullptr;
1082 unsigned NewWidth = CI2->getValue().countr_zero();
1083 if (NewWidth != 7 && NewWidth != 15 && NewWidth != 31)
1084 return nullptr;
1085
1086 // The width of the new add formed is 1 more than the bias.
1087 ++NewWidth;
1088
1089 // Check to see that CI1 is an all-ones value with NewWidth bits.
1090 if (CI1->getBitWidth() == NewWidth ||
1091 CI1->getValue() != APInt::getLowBitsSet(CI1->getBitWidth(), NewWidth))
1092 return nullptr;
1093
1094 // This is only really a signed overflow check if the inputs have been
1095 // sign-extended; check for that condition. For example, if CI2 is 2^31 and
1096 // the operands of the add are 64 bits wide, we need at least 33 sign bits.
1097 if (IC.ComputeMaxSignificantBits(A, &I) > NewWidth ||
1098 IC.ComputeMaxSignificantBits(B, &I) > NewWidth)
1099 return nullptr;
1100
1101 // In order to replace the original add with a narrower
1102 // llvm.sadd.with.overflow, the only uses allowed are the add-with-constant
1103 // and truncates that discard the high bits of the add. Verify that this is
1104 // the case.
1105 Instruction *OrigAdd = cast<Instruction>(AddWithCst->getOperand(0));
1106 for (User *U : OrigAdd->users()) {
1107 if (U == AddWithCst)
1108 continue;
1109
1110 // Only accept truncates for now. We would really like a nice recursive
1111 // predicate like SimplifyDemandedBits, but which goes downwards the use-def
1112 // chain to see which bits of a value are actually demanded. If the
1113 // original add had another add which was then immediately truncated, we
1114 // could still do the transformation.
1116 if (!TI || TI->getType()->getPrimitiveSizeInBits() > NewWidth)
1117 return nullptr;
1118 }
1119
1120 // If the pattern matches, truncate the inputs to the narrower type and
1121 // use the sadd_with_overflow intrinsic to efficiently compute both the
1122 // result and the overflow bit.
1123 Type *NewType = IntegerType::get(OrigAdd->getContext(), NewWidth);
1125 I.getModule(), Intrinsic::sadd_with_overflow, NewType);
1126
1127 InstCombiner::BuilderTy &Builder = IC.Builder;
1128
1129 // Put the new code above the original add, in case there are any uses of the
1130 // add between the add and the compare.
1131 Builder.SetInsertPoint(OrigAdd);
1132
1133 Value *TruncA = Builder.CreateTrunc(A, NewType, A->getName() + ".trunc");
1134 Value *TruncB = Builder.CreateTrunc(B, NewType, B->getName() + ".trunc");
1135 CallInst *Call = Builder.CreateCall(F, {TruncA, TruncB}, "sadd");
1136 Value *Add = Builder.CreateExtractValue(Call, 0, "sadd.result");
1137 Value *ZExt = Builder.CreateZExt(Add, OrigAdd->getType());
1138
1139 // The inner add was the result of the narrow add, zero extended to the
1140 // wider type. Replace it with the result computed by the intrinsic.
1141 IC.replaceInstUsesWith(*OrigAdd, ZExt);
1142 IC.eraseInstFromFunction(*OrigAdd);
1143
1144 // The original icmp gets replaced with the overflow value.
1145 return ExtractValueInst::Create(Call, 1, "sadd.overflow");
1146}
1147
1148/// If we have:
1149/// icmp eq/ne (urem/srem %x, %y), 0
1150/// iff %y is a power-of-two, we can replace this with a bit test:
1151/// icmp eq/ne (and %x, (add %y, -1)), 0
1153 // This fold is only valid for equality predicates.
1154 if (!I.isEquality())
1155 return nullptr;
1156 CmpPredicate Pred;
1157 Value *X, *Y, *Zero;
1158 if (!match(&I, m_ICmp(Pred, m_OneUse(m_IRem(m_Value(X), m_Value(Y))),
1159 m_CombineAnd(m_Zero(), m_Value(Zero)))))
1160 return nullptr;
1161 if (!isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
1162 return nullptr;
1163 // This may increase instruction count, we don't enforce that Y is a constant.
1164 Value *Mask = Builder.CreateAdd(Y, Constant::getAllOnesValue(Y->getType()));
1165 Value *Masked = Builder.CreateAnd(X, Mask);
1166 return ICmpInst::Create(Instruction::ICmp, Pred, Masked, Zero);
1167}
1168
1169/// Fold equality-comparison between zero and any (maybe truncated) right-shift
1170/// by one-less-than-bitwidth into a sign test on the original value.
1172 Instruction *Val;
1173 CmpPredicate Pred;
1174 if (!I.isEquality() || !match(&I, m_ICmp(Pred, m_Instruction(Val), m_Zero())))
1175 return nullptr;
1176
1177 Value *X;
1178 Type *XTy;
1179
1180 Constant *C;
1181 if (match(Val, m_TruncOrSelf(m_Shr(m_Value(X), m_Constant(C))))) {
1182 XTy = X->getType();
1183 unsigned XBitWidth = XTy->getScalarSizeInBits();
1185 APInt(XBitWidth, XBitWidth - 1))))
1186 return nullptr;
1187 } else if (isa<BinaryOperator>(Val) &&
1189 cast<BinaryOperator>(Val), SQ.getWithInstruction(Val),
1190 /*AnalyzeForSignBitExtraction=*/true))) {
1191 XTy = X->getType();
1192 } else
1193 return nullptr;
1194
1195 return ICmpInst::Create(Instruction::ICmp,
1199}
1200
1201// Handle icmp pred X, 0
1203 CmpInst::Predicate Pred = Cmp.getPredicate();
1204 if (!match(Cmp.getOperand(1), m_Zero()))
1205 return nullptr;
1206
1207 // (icmp sgt smin(PosA, B) 0) -> (icmp sgt B 0)
1208 if (Pred == ICmpInst::ICMP_SGT) {
1209 Value *A, *B;
1210 if (match(Cmp.getOperand(0), m_SMin(m_Value(A), m_Value(B)))) {
1211 if (isKnownPositive(A, SQ.getWithInstruction(&Cmp)))
1212 return new ICmpInst(Pred, B, Cmp.getOperand(1));
1213 if (isKnownPositive(B, SQ.getWithInstruction(&Cmp)))
1214 return new ICmpInst(Pred, A, Cmp.getOperand(1));
1215 }
1216 }
1217
1219 return New;
1220
1221 // Given:
1222 // icmp eq/ne (urem %x, %y), 0
1223 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
1224 // icmp eq/ne %x, 0
1225 Value *X, *Y;
1226 if (match(Cmp.getOperand(0), m_URem(m_Value(X), m_Value(Y))) &&
1227 ICmpInst::isEquality(Pred)) {
1228 KnownBits XKnown = computeKnownBits(X, &Cmp);
1229 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1230 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
1231 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1232 }
1233
1234 // (icmp eq/ne (mul X Y)) -> (icmp eq/ne X/Y) if we know about whether X/Y are
1235 // odd/non-zero/there is no overflow.
1236 if (match(Cmp.getOperand(0), m_Mul(m_Value(X), m_Value(Y))) &&
1237 ICmpInst::isEquality(Pred)) {
1238
1239 KnownBits XKnown = computeKnownBits(X, &Cmp);
1240 // if X % 2 != 0
1241 // (icmp eq/ne Y)
1242 if (XKnown.countMaxTrailingZeros() == 0)
1243 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1244
1245 KnownBits YKnown = computeKnownBits(Y, &Cmp);
1246 // if Y % 2 != 0
1247 // (icmp eq/ne X)
1248 if (YKnown.countMaxTrailingZeros() == 0)
1249 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1250
1251 auto *BO0 = cast<OverflowingBinaryOperator>(Cmp.getOperand(0));
1252 if (BO0->hasNoUnsignedWrap() || BO0->hasNoSignedWrap()) {
1253 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
1254 // `isKnownNonZero` does more analysis than just `!KnownBits.One.isZero()`
1255 // but to avoid unnecessary work, first just if this is an obvious case.
1256
1257 // if X non-zero and NoOverflow(X * Y)
1258 // (icmp eq/ne Y)
1259 if (!XKnown.One.isZero() || isKnownNonZero(X, Q))
1260 return new ICmpInst(Pred, Y, Cmp.getOperand(1));
1261
1262 // if Y non-zero and NoOverflow(X * Y)
1263 // (icmp eq/ne X)
1264 if (!YKnown.One.isZero() || isKnownNonZero(Y, Q))
1265 return new ICmpInst(Pred, X, Cmp.getOperand(1));
1266 }
1267 // Note, we are skipping cases:
1268 // if Y % 2 != 0 AND X % 2 != 0
1269 // (false/true)
1270 // if X non-zero and Y non-zero and NoOverflow(X * Y)
1271 // (false/true)
1272 // Those can be simplified later as we would have already replaced the (icmp
1273 // eq/ne (mul X, Y)) with (icmp eq/ne X/Y) and if X/Y is known non-zero that
1274 // will fold to a constant elsewhere.
1275 }
1276
1277 // (icmp eq/ne f(X), 0) -> (icmp eq/ne X, 0)
1278 // where f(X) == 0 if and only if X == 0
1279 if (ICmpInst::isEquality(Pred))
1280 if (Value *Stripped = stripNullTest(Cmp.getOperand(0)))
1281 return new ICmpInst(Pred, Stripped,
1282 Constant::getNullValue(Stripped->getType()));
1283
1284 return nullptr;
1285}
1286
1287/// Fold icmp eq (num + mask) & ~mask, num
1288/// to
1289/// icmp eq (and num, mask), 0
1290/// Where mask is a low bit mask.
1292 Value *Num;
1293 CmpPredicate Pred;
1294 const APInt *Mask, *Neg;
1295
1296 if (!match(&Cmp,
1297 m_c_ICmp(Pred, m_Value(Num),
1299 m_LowBitMask(Mask))),
1300 m_APInt(Neg))))))
1301 return nullptr;
1302
1303 if (*Neg != ~*Mask)
1304 return nullptr;
1305
1306 if (!ICmpInst::isEquality(Pred))
1307 return nullptr;
1308
1309 // Create new icmp eq (num & mask), 0
1310 auto *NewAnd = Builder.CreateAnd(Num, *Mask);
1311 auto *Zero = Constant::getNullValue(Num->getType());
1312
1313 return new ICmpInst(Pred, NewAnd, Zero);
1314}
1315
1316/// Fold icmp Pred X, C.
1317/// TODO: This code structure does not make sense. The saturating add fold
1318/// should be moved to some other helper and extended as noted below (it is also
1319/// possible that code has been made unnecessary - do we canonicalize IR to
1320/// overflow/saturating intrinsics or not?).
1322 // Match the following pattern, which is a common idiom when writing
1323 // overflow-safe integer arithmetic functions. The source performs an addition
1324 // in wider type and explicitly checks for overflow using comparisons against
1325 // INT_MIN and INT_MAX. Simplify by using the sadd_with_overflow intrinsic.
1326 //
1327 // TODO: This could probably be generalized to handle other overflow-safe
1328 // operations if we worked out the formulas to compute the appropriate magic
1329 // constants.
1330 //
1331 // sum = a + b
1332 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1333 CmpInst::Predicate Pred = Cmp.getPredicate();
1334 Value *Op0 = Cmp.getOperand(0), *Op1 = Cmp.getOperand(1);
1335 Value *A, *B;
1336 ConstantInt *CI, *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1337 if (Pred == ICmpInst::ICMP_UGT && match(Op1, m_ConstantInt(CI)) &&
1338 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1339 if (Instruction *Res = processUGT_ADDCST_ADD(Cmp, A, B, CI2, CI, *this))
1340 return Res;
1341
1342 // icmp(phi(C1, C2, ...), C) -> phi(icmp(C1, C), icmp(C2, C), ...).
1344 if (!C)
1345 return nullptr;
1346
1347 if (auto *Phi = dyn_cast<PHINode>(Op0))
1348 if (all_of(Phi->operands(), IsaPred<Constant>)) {
1350 for (Value *V : Phi->incoming_values()) {
1351 Constant *Res =
1353 if (!Res)
1354 return nullptr;
1355 Ops.push_back(Res);
1356 }
1357 Builder.SetInsertPoint(Phi);
1358 PHINode *NewPhi = Builder.CreatePHI(Cmp.getType(), Phi->getNumOperands());
1359 for (auto [V, Pred] : zip(Ops, Phi->blocks()))
1360 NewPhi->addIncoming(V, Pred);
1361 return replaceInstUsesWith(Cmp, NewPhi);
1362 }
1363
1365 return R;
1366
1367 return nullptr;
1368}
1369
1370/// Canonicalize icmp instructions based on dominating conditions.
1372 // We already checked simple implication in InstSimplify, only handle complex
1373 // cases here.
1374 Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
1375 const APInt *C;
1376 if (!match(Y, m_APInt(C)))
1377 return nullptr;
1378
1379 CmpInst::Predicate Pred = Cmp.getPredicate();
1381
1382 auto handleDomCond = [&](ICmpInst::Predicate DomPred,
1383 const APInt *DomC) -> Instruction * {
1384 // We have 2 compares of a variable with constants. Calculate the constant
1385 // ranges of those compares to see if we can transform the 2nd compare:
1386 // DomBB:
1387 // DomCond = icmp DomPred X, DomC
1388 // br DomCond, CmpBB, FalseBB
1389 // CmpBB:
1390 // Cmp = icmp Pred X, C
1391 ConstantRange DominatingCR =
1392 ConstantRange::makeExactICmpRegion(DomPred, *DomC);
1393 ConstantRange Intersection = DominatingCR.intersectWith(CR);
1394 ConstantRange Difference = DominatingCR.difference(CR);
1395 if (Intersection.isEmptySet())
1396 return replaceInstUsesWith(Cmp, Builder.getFalse());
1397 if (Difference.isEmptySet())
1398 return replaceInstUsesWith(Cmp, Builder.getTrue());
1399
1400 // Canonicalizing a sign bit comparison that gets used in a branch,
1401 // pessimizes codegen by generating branch on zero instruction instead
1402 // of a test and branch. So we avoid canonicalizing in such situations
1403 // because test and branch instruction has better branch displacement
1404 // than compare and branch instruction.
1405 bool UnusedBit;
1406 bool IsSignBit = isSignBitCheck(Pred, *C, UnusedBit);
1407 if (Cmp.isEquality() || (IsSignBit && hasBranchUse(Cmp)))
1408 return nullptr;
1409
1410 // Avoid an infinite loop with min/max canonicalization.
1411 // TODO: This will be unnecessary if we canonicalize to min/max intrinsics.
1412 if (Cmp.hasOneUse() &&
1413 match(Cmp.user_back(), m_MaxOrMin(m_Value(), m_Value())))
1414 return nullptr;
1415
1416 if (const APInt *EqC = Intersection.getSingleElement())
1417 return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
1418 if (const APInt *NeC = Difference.getSingleElement())
1419 return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1420 return nullptr;
1421 };
1422
1423 for (CondBrInst *BI : DC.conditionsFor(X)) {
1424 CmpPredicate DomPred;
1425 const APInt *DomC;
1426 if (!match(BI->getCondition(),
1427 m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1428 continue;
1429
1430 BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1431 if (DT.dominates(Edge0, Cmp.getParent())) {
1432 if (auto *V = handleDomCond(DomPred, DomC))
1433 return V;
1434 } else {
1435 BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1436 if (DT.dominates(Edge1, Cmp.getParent()))
1437 if (auto *V =
1438 handleDomCond(CmpInst::getInversePredicate(DomPred), DomC))
1439 return V;
1440 }
1441 }
1442
1443 return nullptr;
1444}
1445
1446/// Fold icmp (trunc X), C.
1448 TruncInst *Trunc,
1449 const APInt &C) {
1450 ICmpInst::Predicate Pred = Cmp.getPredicate();
1451 Value *X = Trunc->getOperand(0);
1452 Type *SrcTy = X->getType();
1453 unsigned DstBits = Trunc->getType()->getScalarSizeInBits(),
1454 SrcBits = SrcTy->getScalarSizeInBits();
1455
1456 // Match (icmp pred (trunc nuw/nsw X), C)
1457 // Which we can convert to (icmp pred X, (sext/zext C))
1458 if (shouldChangeType(Trunc->getType(), SrcTy)) {
1459 if (Trunc->hasNoSignedWrap())
1460 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.sext(SrcBits)));
1461 if (!Cmp.isSigned() && Trunc->hasNoUnsignedWrap())
1462 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, C.zext(SrcBits)));
1463 }
1464
1465 if (C.isOne() && C.getBitWidth() > 1) {
1466 // icmp slt trunc(signum(V)) 1 --> icmp slt V, 1
1467 Value *V = nullptr;
1468 if (Pred == ICmpInst::ICMP_SLT && match(X, m_Signum(m_Value(V))))
1469 return new ICmpInst(ICmpInst::ICMP_SLT, V,
1470 ConstantInt::get(V->getType(), 1));
1471 }
1472
1473 // TODO: Handle non-equality predicates.
1474 Value *Y;
1475 const APInt *Pow2;
1476 if (Cmp.isEquality() && match(X, m_Shl(m_Power2(Pow2), m_Value(Y))) &&
1477 DstBits > Pow2->logBase2()) {
1478 // (trunc (Pow2 << Y) to iN) == 0 --> Y u>= N - log2(Pow2)
1479 // (trunc (Pow2 << Y) to iN) != 0 --> Y u< N - log2(Pow2)
1480 // iff N > log2(Pow2)
1481 if (C.isZero()) {
1482 auto NewPred = (Pred == Cmp.ICMP_EQ) ? Cmp.ICMP_UGE : Cmp.ICMP_ULT;
1483 return new ICmpInst(NewPred, Y,
1484 ConstantInt::get(SrcTy, DstBits - Pow2->logBase2()));
1485 }
1486 // (trunc (Pow2 << Y) to iN) == 2**C --> Y == C - log2(Pow2)
1487 // (trunc (Pow2 << Y) to iN) != 2**C --> Y != C - log2(Pow2)
1488 if (C.isPowerOf2())
1489 return new ICmpInst(
1490 Pred, Y, ConstantInt::get(SrcTy, C.logBase2() - Pow2->logBase2()));
1491 }
1492
1493 if (Cmp.isEquality() && (Trunc->hasOneUse() || Trunc->hasNoUnsignedWrap())) {
1494 // Canonicalize to a mask and wider compare if the wide type is suitable:
1495 // (trunc X to i8) == C --> (X & 0xff) == (zext C)
1496 if (!SrcTy->isVectorTy() && shouldChangeType(DstBits, SrcBits)) {
1497 Constant *Mask =
1498 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcBits, DstBits));
1499 Value *And = Trunc->hasNoUnsignedWrap() ? X : Builder.CreateAnd(X, Mask);
1500 Constant *WideC = ConstantInt::get(SrcTy, C.zext(SrcBits));
1501 return new ICmpInst(Pred, And, WideC);
1502 }
1503
1504 // Simplify icmp eq (trunc x to i8), 42 -> icmp eq x, 42|highbits if all
1505 // of the high bits truncated out of x are known.
1506 KnownBits Known = computeKnownBits(X, &Cmp);
1507
1508 // If all the high bits are known, we can do this xform.
1509 if ((Known.Zero | Known.One).countl_one() >= SrcBits - DstBits) {
1510 // Pull in the high bits from known-ones set.
1511 APInt NewRHS = C.zext(SrcBits);
1512 NewRHS |= Known.One & APInt::getHighBitsSet(SrcBits, SrcBits - DstBits);
1513 return new ICmpInst(Pred, X, ConstantInt::get(SrcTy, NewRHS));
1514 }
1515 }
1516
1517 // Look through truncated right-shift of the sign-bit for a sign-bit check:
1518 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] < 0 --> ShOp < 0
1519 // trunc iN (ShOp >> ShAmtC) to i[N - ShAmtC] > -1 --> ShOp > -1
1520 Value *ShOp;
1521 uint64_t ShAmt;
1522 bool TrueIfSigned;
1523 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
1524 match(X, m_Shr(m_Value(ShOp), m_ConstantInt(ShAmt))) &&
1525 DstBits == SrcBits - ShAmt) {
1526 return TrueIfSigned ? new ICmpInst(ICmpInst::ICMP_SLT, ShOp,
1528 : new ICmpInst(ICmpInst::ICMP_SGT, ShOp,
1530 }
1531
1532 return nullptr;
1533}
1534
1535/// Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
1536/// Fold icmp (trunc nuw/nsw X), (zext/sext Y).
1539 const SimplifyQuery &Q) {
1540 Value *X, *Y;
1541 CmpPredicate Pred;
1542 bool YIsSExt = false;
1543 // Try to match icmp (trunc X), (trunc Y)
1544 if (match(&Cmp, m_ICmp(Pred, m_Trunc(m_Value(X)), m_Trunc(m_Value(Y))))) {
1545 unsigned NoWrapFlags = cast<TruncInst>(Cmp.getOperand(0))->getNoWrapKind() &
1546 cast<TruncInst>(Cmp.getOperand(1))->getNoWrapKind();
1547 if (Cmp.isSigned()) {
1548 // For signed comparisons, both truncs must be nsw.
1549 if (!(NoWrapFlags & TruncInst::NoSignedWrap))
1550 return nullptr;
1551 } else {
1552 // For unsigned and equality comparisons, either both must be nuw or
1553 // both must be nsw, we don't care which.
1554 if (!NoWrapFlags)
1555 return nullptr;
1556 }
1557
1558 if (X->getType() != Y->getType() &&
1559 (!Cmp.getOperand(0)->hasOneUse() || !Cmp.getOperand(1)->hasOneUse()))
1560 return nullptr;
1561 if (!isDesirableIntType(X->getType()->getScalarSizeInBits()) &&
1562 isDesirableIntType(Y->getType()->getScalarSizeInBits())) {
1563 std::swap(X, Y);
1564 Pred = Cmp.getSwappedPredicate(Pred);
1565 }
1566 YIsSExt = !(NoWrapFlags & TruncInst::NoUnsignedWrap);
1567 }
1568 // Try to match icmp (trunc nuw X), (zext Y)
1569 else if (!Cmp.isSigned() &&
1570 match(&Cmp, m_c_ICmp(Pred, m_NUWTrunc(m_Value(X)),
1571 m_OneUse(m_ZExt(m_Value(Y)))))) {
1572 // Can fold trunc nuw + zext for unsigned and equality predicates.
1573 }
1574 // Try to match icmp (trunc nsw X), (sext Y)
1575 else if (match(&Cmp, m_c_ICmp(Pred, m_NSWTrunc(m_Value(X)),
1577 // Can fold trunc nsw + zext/sext for all predicates.
1578 YIsSExt =
1579 isa<SExtInst>(Cmp.getOperand(0)) || isa<SExtInst>(Cmp.getOperand(1));
1580 } else
1581 return nullptr;
1582
1583 Type *TruncTy = Cmp.getOperand(0)->getType();
1584 unsigned TruncBits = TruncTy->getScalarSizeInBits();
1585
1586 // If this transform will end up changing from desirable types -> undesirable
1587 // types skip it.
1588 if (isDesirableIntType(TruncBits) &&
1589 !isDesirableIntType(X->getType()->getScalarSizeInBits()))
1590 return nullptr;
1591
1592 Value *NewY = Builder.CreateIntCast(Y, X->getType(), YIsSExt);
1593 return new ICmpInst(Pred, X, NewY);
1594}
1595
1596/// Fold icmp (xor X, Y), C.
1599 const APInt &C) {
1600 if (Instruction *I = foldICmpXorShiftConst(Cmp, Xor, C))
1601 return I;
1602
1603 Value *X = Xor->getOperand(0);
1604 Value *Y = Xor->getOperand(1);
1605 const APInt *XorC;
1606 if (!match(Y, m_APInt(XorC)))
1607 return nullptr;
1608
1609 // If this is a comparison that tests the signbit (X < 0) or (x > -1),
1610 // fold the xor.
1611 ICmpInst::Predicate Pred = Cmp.getPredicate();
1612 bool TrueIfSigned = false;
1613 if (isSignBitCheck(Cmp.getPredicate(), C, TrueIfSigned)) {
1614
1615 // If the sign bit of the XorCst is not set, there is no change to
1616 // the operation, just stop using the Xor.
1617 if (!XorC->isNegative())
1618 return replaceOperand(Cmp, 0, X);
1619
1620 // Emit the opposite comparison.
1621 if (TrueIfSigned)
1622 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1623 ConstantInt::getAllOnesValue(X->getType()));
1624 else
1625 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1626 ConstantInt::getNullValue(X->getType()));
1627 }
1628
1629 if (Xor->hasOneUse()) {
1630 // (icmp u/s (xor X SignMask), C) -> (icmp s/u X, (xor C SignMask))
1631 if (!Cmp.isEquality() && XorC->isSignMask()) {
1632 Pred = Cmp.getFlippedSignednessPredicate();
1633 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1634 }
1635
1636 // (icmp u/s (xor X ~SignMask), C) -> (icmp s/u X, (xor C ~SignMask))
1637 if (!Cmp.isEquality() && XorC->isMaxSignedValue()) {
1638 Pred = Cmp.getFlippedSignednessPredicate();
1639 Pred = Cmp.getSwappedPredicate(Pred);
1640 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), C ^ *XorC));
1641 }
1642 }
1643
1644 // Mask constant magic can eliminate an 'xor' with unsigned compares.
1645 if (Pred == ICmpInst::ICMP_UGT) {
1646 // (xor X, ~C) >u C --> X <u ~C (when C+1 is a power of 2)
1647 if (*XorC == ~C && (C + 1).isPowerOf2())
1648 return new ICmpInst(ICmpInst::ICMP_ULT, X, Y);
1649 // (xor X, C) >u C --> X >u C (when C+1 is a power of 2)
1650 if (*XorC == C && (C + 1).isPowerOf2())
1651 return new ICmpInst(ICmpInst::ICMP_UGT, X, Y);
1652 }
1653 if (Pred == ICmpInst::ICMP_ULT) {
1654 // (xor X, -C) <u C --> X >u ~C (when C is a power of 2)
1655 if (*XorC == -C && C.isPowerOf2())
1656 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1657 ConstantInt::get(X->getType(), ~C));
1658 // (xor X, C) <u C --> X >u ~C (when -C is a power of 2)
1659 if (*XorC == C && (-C).isPowerOf2())
1660 return new ICmpInst(ICmpInst::ICMP_UGT, X,
1661 ConstantInt::get(X->getType(), ~C));
1662 }
1663 return nullptr;
1664}
1665
1666/// For power-of-2 C:
1667/// ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1)
1668/// ((X s>> ShiftC) ^ X) u> (C - 1) --> (X + C) u> ((C << 1) - 1)
1671 const APInt &C) {
1672 CmpInst::Predicate Pred = Cmp.getPredicate();
1673 APInt PowerOf2;
1674 if (Pred == ICmpInst::ICMP_ULT)
1675 PowerOf2 = C;
1676 else if (Pred == ICmpInst::ICMP_UGT && !C.isMaxValue())
1677 PowerOf2 = C + 1;
1678 else
1679 return nullptr;
1680 if (!PowerOf2.isPowerOf2())
1681 return nullptr;
1682 Value *X;
1683 const APInt *ShiftC;
1685 m_AShr(m_Deferred(X), m_APInt(ShiftC))))))
1686 return nullptr;
1687 uint64_t Shift = ShiftC->getLimitedValue();
1688 Type *XType = X->getType();
1689 if (Shift == 0 || PowerOf2.isMinSignedValue())
1690 return nullptr;
1691 Value *Add = Builder.CreateAdd(X, ConstantInt::get(XType, PowerOf2));
1692 APInt Bound =
1693 Pred == ICmpInst::ICMP_ULT ? PowerOf2 << 1 : ((PowerOf2 << 1) - 1);
1694 return new ICmpInst(Pred, Add, ConstantInt::get(XType, Bound));
1695}
1696
1697/// Fold icmp (and (sh X, Y), C2), C1.
1700 const APInt &C1,
1701 const APInt &C2) {
1702 BinaryOperator *Shift = dyn_cast<BinaryOperator>(And->getOperand(0));
1703 if (!Shift || !Shift->isShift())
1704 return nullptr;
1705
1706 // If this is: (X >> C3) & C2 != C1 (where any shift and any compare could
1707 // exist), turn it into (X & (C2 << C3)) != (C1 << C3). This happens a LOT in
1708 // code produced by the clang front-end, for bitfield access.
1709 // This seemingly simple opportunity to fold away a shift turns out to be
1710 // rather complicated. See PR17827 for details.
1711 unsigned ShiftOpcode = Shift->getOpcode();
1712 bool IsShl = ShiftOpcode == Instruction::Shl;
1713 const APInt *C3;
1714 if (match(Shift->getOperand(1), m_APInt(C3))) {
1715 APInt NewAndCst, NewCmpCst;
1716 bool AnyCmpCstBitsShiftedOut;
1717 if (ShiftOpcode == Instruction::Shl) {
1718 // For a left shift, we can fold if the comparison is not signed. We can
1719 // also fold a signed comparison if the mask value and comparison value
1720 // are not negative. These constraints may not be obvious, but we can
1721 // prove that they are correct using an SMT solver.
1722 if (Cmp.isSigned() && (C2.isNegative() || C1.isNegative()))
1723 return nullptr;
1724
1725 NewCmpCst = C1.lshr(*C3);
1726 NewAndCst = C2.lshr(*C3);
1727 AnyCmpCstBitsShiftedOut = NewCmpCst.shl(*C3) != C1;
1728 } else if (ShiftOpcode == Instruction::LShr) {
1729 // For a logical right shift, we can fold if the comparison is not signed.
1730 // We can also fold a signed comparison if the shifted mask value and the
1731 // shifted comparison value are not negative. These constraints may not be
1732 // obvious, but we can prove that they are correct using an SMT solver.
1733 NewCmpCst = C1.shl(*C3);
1734 NewAndCst = C2.shl(*C3);
1735 AnyCmpCstBitsShiftedOut = NewCmpCst.lshr(*C3) != C1;
1736 if (Cmp.isSigned() && (NewAndCst.isNegative() || NewCmpCst.isNegative()))
1737 return nullptr;
1738 } else {
1739 // For an arithmetic shift, check that both constants don't use (in a
1740 // signed sense) the top bits being shifted out.
1741 assert(ShiftOpcode == Instruction::AShr && "Unknown shift opcode");
1742 NewCmpCst = C1.shl(*C3);
1743 NewAndCst = C2.shl(*C3);
1744 AnyCmpCstBitsShiftedOut = NewCmpCst.ashr(*C3) != C1;
1745 if (NewAndCst.ashr(*C3) != C2)
1746 return nullptr;
1747 }
1748
1749 if (AnyCmpCstBitsShiftedOut) {
1750 // If we shifted bits out, the fold is not going to work out. As a
1751 // special case, check to see if this means that the result is always
1752 // true or false now.
1753 if (Cmp.getPredicate() == ICmpInst::ICMP_EQ)
1754 return replaceInstUsesWith(Cmp, ConstantInt::getFalse(Cmp.getType()));
1755 if (Cmp.getPredicate() == ICmpInst::ICMP_NE)
1756 return replaceInstUsesWith(Cmp, ConstantInt::getTrue(Cmp.getType()));
1757 } else {
1758 Value *NewAnd = Builder.CreateAnd(
1759 Shift->getOperand(0), ConstantInt::get(And->getType(), NewAndCst));
1760 return new ICmpInst(Cmp.getPredicate(), NewAnd,
1761 ConstantInt::get(And->getType(), NewCmpCst));
1762 }
1763 }
1764
1765 // Turn ((X >> Y) & C2) == 0 into (X & (C2 << Y)) == 0. The latter is
1766 // preferable because it allows the C2 << Y expression to be hoisted out of a
1767 // loop if Y is invariant and X is not.
1768 if (Shift->hasOneUse() && C1.isZero() && Cmp.isEquality() &&
1769 !Shift->isArithmeticShift() &&
1770 ((!IsShl && C2.isOne()) || !isa<Constant>(Shift->getOperand(0)))) {
1771 // Compute C2 << Y.
1772 Value *NewShift =
1773 IsShl ? Builder.CreateLShr(And->getOperand(1), Shift->getOperand(1))
1774 : Builder.CreateShl(And->getOperand(1), Shift->getOperand(1));
1775
1776 // Compute X & (C2 << Y).
1777 Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
1778 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1779 }
1780
1781 return nullptr;
1782}
1783
1784/// Fold icmp (and X, C2), C1.
1787 const APInt &C1) {
1788 bool isICMP_NE = Cmp.getPredicate() == ICmpInst::ICMP_NE;
1789
1790 // icmp ne (and X, 1), 0 --> trunc X to i1
1791 if (isICMP_NE && C1.isZero() && match(And->getOperand(1), m_One()))
1792 return new TruncInst(And->getOperand(0), Cmp.getType());
1793
1794 const APInt *C2;
1795 Value *X;
1796 if (!match(And, m_And(m_Value(X), m_APInt(C2))))
1797 return nullptr;
1798
1799 // (and X, highmask) s> [0, ~highmask] --> X s> ~highmask
1800 if (Cmp.getPredicate() == ICmpInst::ICMP_SGT && C1.ule(~*C2) &&
1801 C2->isNegatedPowerOf2())
1802 return new ICmpInst(ICmpInst::ICMP_SGT, X,
1803 ConstantInt::get(X->getType(), ~*C2));
1804 // (and X, highmask) s< [1, -highmask] --> X s< -highmask
1805 if (Cmp.getPredicate() == ICmpInst::ICMP_SLT && !C1.isSignMask() &&
1806 (C1 - 1).ule(~*C2) && C2->isNegatedPowerOf2() && !C2->isSignMask())
1807 return new ICmpInst(ICmpInst::ICMP_SLT, X,
1808 ConstantInt::get(X->getType(), -*C2));
1809
1810 // Don't perform the following transforms if the AND has multiple uses
1811 if (!And->hasOneUse())
1812 return nullptr;
1813
1814 if (Cmp.isEquality() && C1.isZero()) {
1815 // Restrict this fold to single-use 'and' (PR10267).
1816 // Replace (and X, (1 << size(X)-1) != 0) with X s< 0
1817 if (C2->isSignMask()) {
1818 Constant *Zero = Constant::getNullValue(X->getType());
1819 auto NewPred = isICMP_NE ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGE;
1820 return new ICmpInst(NewPred, X, Zero);
1821 }
1822
1823 APInt NewC2 = *C2;
1824 KnownBits Know = computeKnownBits(And->getOperand(0), And);
1825 // Set high zeros of C2 to allow matching negated power-of-2.
1826 NewC2 = *C2 | APInt::getHighBitsSet(C2->getBitWidth(),
1827 Know.countMinLeadingZeros());
1828
1829 // Restrict this fold only for single-use 'and' (PR10267).
1830 // ((%x & C) == 0) --> %x u< (-C) iff (-C) is power of two.
1831 if (NewC2.isNegatedPowerOf2()) {
1832 Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
1833 auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
1834 return new ICmpInst(NewPred, X, NegBOC);
1835 }
1836 }
1837
1838 // If the LHS is an 'and' of a truncate and we can widen the and/compare to
1839 // the input width without changing the value produced, eliminate the cast:
1840 //
1841 // icmp (and (trunc W), C2), C1 -> icmp (and W, C2'), C1'
1842 //
1843 // We can do this transformation if the constants do not have their sign bits
1844 // set or if it is an equality comparison. Extending a relational comparison
1845 // when we're checking the sign bit would not work.
1846 Value *W;
1847 if (match(And->getOperand(0), m_OneUse(m_Trunc(m_Value(W)))) &&
1848 (Cmp.isEquality() || (!C1.isNegative() && !C2->isNegative()))) {
1849 // TODO: Is this a good transform for vectors? Wider types may reduce
1850 // throughput. Should this transform be limited (even for scalars) by using
1851 // shouldChangeType()?
1852 if (!Cmp.getType()->isVectorTy()) {
1853 Type *WideType = W->getType();
1854 unsigned WideScalarBits = WideType->getScalarSizeInBits();
1855 Constant *ZextC1 = ConstantInt::get(WideType, C1.zext(WideScalarBits));
1856 Constant *ZextC2 = ConstantInt::get(WideType, C2->zext(WideScalarBits));
1857 Value *NewAnd = Builder.CreateAnd(W, ZextC2, And->getName());
1858 return new ICmpInst(Cmp.getPredicate(), NewAnd, ZextC1);
1859 }
1860 }
1861
1862 if (Instruction *I = foldICmpAndShift(Cmp, And, C1, *C2))
1863 return I;
1864
1865 // (icmp pred (and (or (lshr A, B), A), 1), 0) -->
1866 // (icmp pred (and A, (or (shl 1, B), 1), 0))
1867 //
1868 // iff pred isn't signed
1869 if (!Cmp.isSigned() && C1.isZero() && And->getOperand(0)->hasOneUse() &&
1870 match(And->getOperand(1), m_One())) {
1871 Constant *One = cast<Constant>(And->getOperand(1));
1872 Value *Or = And->getOperand(0);
1873 Value *A, *B, *LShr;
1874 if (match(Or, m_Or(m_Value(LShr), m_Value(A))) &&
1875 match(LShr, m_LShr(m_Specific(A), m_Value(B)))) {
1876 unsigned UsesRemoved = 0;
1877 if (And->hasOneUse())
1878 ++UsesRemoved;
1879 if (Or->hasOneUse())
1880 ++UsesRemoved;
1881 if (LShr->hasOneUse())
1882 ++UsesRemoved;
1883
1884 // Compute A & ((1 << B) | 1)
1885 unsigned RequireUsesRemoved = match(B, m_ImmConstant()) ? 1 : 3;
1886 if (UsesRemoved >= RequireUsesRemoved) {
1887 Value *NewOr =
1888 Builder.CreateOr(Builder.CreateShl(One, B, LShr->getName(),
1889 /*HasNUW=*/true),
1890 One, Or->getName());
1891 Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
1892 return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
1893 }
1894 }
1895 }
1896
1897 // (icmp eq (and (bitcast X to int), ExponentMask), ExponentMask) -->
1898 // llvm.is.fpclass(X, fcInf|fcNan)
1899 // (icmp ne (and (bitcast X to int), ExponentMask), ExponentMask) -->
1900 // llvm.is.fpclass(X, ~(fcInf|fcNan))
1901 // (icmp eq (and (bitcast X to int), ExponentMask), 0) -->
1902 // llvm.is.fpclass(X, fcSubnormal|fcZero)
1903 // (icmp ne (and (bitcast X to int), ExponentMask), 0) -->
1904 // llvm.is.fpclass(X, ~(fcSubnormal|fcZero))
1905 Value *V;
1906 if (!Cmp.getParent()->getParent()->hasFnAttribute(
1907 Attribute::NoImplicitFloat) &&
1908 Cmp.isEquality() &&
1910 Type *FPType = V->getType()->getScalarType();
1911 if (FPType->isIEEELikeFPTy() && (C1.isZero() || C1 == *C2)) {
1912 APInt ExponentMask =
1913 APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt();
1914 if (*C2 == ExponentMask) {
1915 unsigned Mask = C1.isZero()
1918 if (isICMP_NE)
1919 Mask = ~Mask & fcAllFlags;
1920 return replaceInstUsesWith(Cmp, Builder.createIsFPClass(V, Mask));
1921 }
1922 }
1923 }
1924
1925 return nullptr;
1926}
1927
1928/// Fold icmp (and X, Y), C.
1931 const APInt &C) {
1932 if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
1933 return I;
1934
1935 const ICmpInst::Predicate Pred = Cmp.getPredicate();
1936 bool TrueIfNeg;
1937 if (isSignBitCheck(Pred, C, TrueIfNeg)) {
1938 // ((X - 1) & ~X) < 0 --> X == 0
1939 // ((X - 1) & ~X) >= 0 --> X != 0
1940 Value *X;
1941 if (match(And->getOperand(0), m_Add(m_Value(X), m_AllOnes())) &&
1942 match(And->getOperand(1), m_Not(m_Specific(X)))) {
1943 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1944 return new ICmpInst(NewPred, X, ConstantInt::getNullValue(X->getType()));
1945 }
1946 // (X & -X) < 0 --> X == MinSignedC
1947 // (X & -X) > -1 --> X != MinSignedC
1948 if (match(And, m_c_And(m_Neg(m_Value(X)), m_Deferred(X)))) {
1949 Constant *MinSignedC = ConstantInt::get(
1950 X->getType(),
1951 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits()));
1952 auto NewPred = TrueIfNeg ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE;
1953 return new ICmpInst(NewPred, X, MinSignedC);
1954 }
1955 }
1956
1957 // TODO: These all require that Y is constant too, so refactor with the above.
1958
1959 // Try to optimize things like "A[i] & 42 == 0" to index computations.
1960 Value *X = And->getOperand(0);
1961 Value *Y = And->getOperand(1);
1962 if (auto *C2 = dyn_cast<ConstantInt>(Y))
1963 if (auto *LI = dyn_cast<LoadInst>(X))
1964 if (auto *GEP = dyn_cast<GetElementPtrInst>(LI->getOperand(0)))
1965 if (Instruction *Res = foldCmpLoadFromIndexedGlobal(LI, GEP, Cmp, C2))
1966 return Res;
1967
1968 if (!Cmp.isEquality())
1969 return nullptr;
1970
1971 // X & -C == -C -> X > u ~C
1972 // X & -C != -C -> X <= u ~C
1973 // iff C is a power of 2
1974 if (Cmp.getOperand(1) == Y && C.isNegatedPowerOf2()) {
1975 auto NewPred =
1977 return new ICmpInst(NewPred, X, SubOne(cast<Constant>(Cmp.getOperand(1))));
1978 }
1979
1980 // ((zext i1 X) & Y) == 0 --> !((trunc Y) & X)
1981 // ((zext i1 X) & Y) != 0 --> ((trunc Y) & X)
1982 // ((zext i1 X) & Y) == 1 --> ((trunc Y) & X)
1983 // ((zext i1 X) & Y) != 1 --> !((trunc Y) & X)
1985 X->getType()->isIntOrIntVectorTy(1) && (C.isZero() || C.isOne())) {
1986 Value *TruncY = Builder.CreateTrunc(Y, X->getType());
1987 if (C.isZero() ^ (Pred == CmpInst::ICMP_NE)) {
1988 Value *And = Builder.CreateAnd(TruncY, X);
1990 }
1991 return BinaryOperator::CreateAnd(TruncY, X);
1992 }
1993
1994 // (icmp eq/ne (and (shl -1, X), Y), 0)
1995 // -> (icmp eq/ne (lshr Y, X), 0)
1996 // We could technically handle any C == 0 or (C < 0 && isOdd(C)) but it seems
1997 // highly unlikely the non-zero case will ever show up in code.
1998 if (C.isZero() &&
2000 m_Value(Y))))) {
2001 Value *LShr = Builder.CreateLShr(Y, X);
2002 return new ICmpInst(Pred, LShr, Constant::getNullValue(LShr->getType()));
2003 }
2004
2005 // (icmp eq/ne (and (add A, Addend), Msk), C)
2006 // -> (icmp eq/ne (and A, Msk), (and (sub C, Addend), Msk))
2007 {
2008 Value *A;
2009 const APInt *Addend, *Msk;
2011 m_LowBitMask(Msk)))) &&
2012 C.ule(*Msk)) {
2013 APInt NewComperand = (C - *Addend) & *Msk;
2014 Value *MaskA = Builder.CreateAnd(A, ConstantInt::get(A->getType(), *Msk));
2015 return new ICmpInst(Pred, MaskA,
2016 ConstantInt::get(MaskA->getType(), NewComperand));
2017 }
2018 }
2019
2020 return nullptr;
2021}
2022
2023/// Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
2025 InstCombiner::BuilderTy &Builder) {
2026 // Are we using xors or subs to bitwise check for a pair or pairs of
2027 // (in)equalities? Convert to a shorter form that has more potential to be
2028 // folded even further.
2029 // ((X1 ^/- X2) || (X3 ^/- X4)) == 0 --> (X1 == X2) && (X3 == X4)
2030 // ((X1 ^/- X2) || (X3 ^/- X4)) != 0 --> (X1 != X2) || (X3 != X4)
2031 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) == 0 -->
2032 // (X1 == X2) && (X3 == X4) && (X5 == X6)
2033 // ((X1 ^/- X2) || (X3 ^/- X4) || (X5 ^/- X6)) != 0 -->
2034 // (X1 != X2) || (X3 != X4) || (X5 != X6)
2036 SmallVector<Value *, 16> WorkList(1, Or);
2037
2038 while (!WorkList.empty()) {
2039 auto MatchOrOperatorArgument = [&](Value *OrOperatorArgument) {
2040 Value *Lhs, *Rhs;
2041
2042 if (match(OrOperatorArgument,
2043 m_OneUse(m_Xor(m_Value(Lhs), m_Value(Rhs))))) {
2044 CmpValues.emplace_back(Lhs, Rhs);
2045 return;
2046 }
2047
2048 if (match(OrOperatorArgument,
2049 m_OneUse(m_Sub(m_Value(Lhs), m_Value(Rhs))))) {
2050 CmpValues.emplace_back(Lhs, Rhs);
2051 return;
2052 }
2053
2054 WorkList.push_back(OrOperatorArgument);
2055 };
2056
2057 Value *CurrentValue = WorkList.pop_back_val();
2058 Value *OrOperatorLhs, *OrOperatorRhs;
2059
2060 if (!match(CurrentValue,
2061 m_Or(m_Value(OrOperatorLhs), m_Value(OrOperatorRhs)))) {
2062 return nullptr;
2063 }
2064
2065 MatchOrOperatorArgument(OrOperatorRhs);
2066 MatchOrOperatorArgument(OrOperatorLhs);
2067 }
2068
2069 ICmpInst::Predicate Pred = Cmp.getPredicate();
2070 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2071 Value *LhsCmp = Builder.CreateICmp(Pred, CmpValues.rbegin()->first,
2072 CmpValues.rbegin()->second);
2073
2074 for (auto It = CmpValues.rbegin() + 1; It != CmpValues.rend(); ++It) {
2075 Value *RhsCmp = Builder.CreateICmp(Pred, It->first, It->second);
2076 LhsCmp = Builder.CreateBinOp(BOpc, LhsCmp, RhsCmp);
2077 }
2078
2079 return LhsCmp;
2080}
2081
2082/// Fold icmp (or X, Y), C.
2085 const APInt &C) {
2086 ICmpInst::Predicate Pred = Cmp.getPredicate();
2087 if (C.isOne()) {
2088 // icmp slt signum(V) 1 --> icmp slt V, 1
2089 Value *V = nullptr;
2090 if (Pred == ICmpInst::ICMP_SLT && match(Or, m_Signum(m_Value(V))))
2091 return new ICmpInst(ICmpInst::ICMP_SLT, V,
2092 ConstantInt::get(V->getType(), 1));
2093 }
2094
2095 Value *OrOp0 = Or->getOperand(0), *OrOp1 = Or->getOperand(1);
2096
2097 // (icmp eq/ne (or disjoint x, C0), C1)
2098 // -> (icmp eq/ne x, C0^C1)
2099 if (Cmp.isEquality() && match(OrOp1, m_ImmConstant()) &&
2100 cast<PossiblyDisjointInst>(Or)->isDisjoint()) {
2101 Value *NewC =
2102 Builder.CreateXor(OrOp1, ConstantInt::get(OrOp1->getType(), C));
2103 return new ICmpInst(Pred, OrOp0, NewC);
2104 }
2105
2106 const APInt *MaskC;
2107 if (match(OrOp1, m_APInt(MaskC)) && Cmp.isEquality()) {
2108 if (*MaskC == C && (C + 1).isPowerOf2()) {
2109 // X | C == C --> X <=u C
2110 // X | C != C --> X >u C
2111 // iff C+1 is a power of 2 (C is a bitmask of the low bits)
2113 return new ICmpInst(Pred, OrOp0, OrOp1);
2114 }
2115
2116 // More general: canonicalize 'equality with set bits mask' to
2117 // 'equality with clear bits mask'.
2118 // (X | MaskC) == C --> (X & ~MaskC) == C ^ MaskC
2119 // (X | MaskC) != C --> (X & ~MaskC) != C ^ MaskC
2120 if (Or->hasOneUse()) {
2121 Value *And = Builder.CreateAnd(OrOp0, ~(*MaskC));
2122 Constant *NewC = ConstantInt::get(Or->getType(), C ^ (*MaskC));
2123 return new ICmpInst(Pred, And, NewC);
2124 }
2125 }
2126
2127 // (X | (X-1)) s< 0 --> X s< 1
2128 // (X | (X-1)) s> -1 --> X s> 0
2129 Value *X;
2130 bool TrueIfSigned;
2131 if (isSignBitCheck(Pred, C, TrueIfSigned) &&
2133 auto NewPred = TrueIfSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_SGT;
2134 Constant *NewC = ConstantInt::get(X->getType(), TrueIfSigned ? 1 : 0);
2135 return new ICmpInst(NewPred, X, NewC);
2136 }
2137
2138 const APInt *OrC;
2139 // icmp(X | OrC, C) --> icmp(X, 0)
2140 if (C.isNonNegative() && match(Or, m_Or(m_Value(X), m_APInt(OrC)))) {
2141 switch (Pred) {
2142 // X | OrC s< C --> X s< 0 iff OrC s>= C s>= 0
2143 case ICmpInst::ICMP_SLT:
2144 // X | OrC s>= C --> X s>= 0 iff OrC s>= C s>= 0
2145 case ICmpInst::ICMP_SGE:
2146 if (OrC->sge(C))
2147 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
2148 break;
2149 // X | OrC s<= C --> X s< 0 iff OrC s> C s>= 0
2150 case ICmpInst::ICMP_SLE:
2151 // X | OrC s> C --> X s>= 0 iff OrC s> C s>= 0
2152 case ICmpInst::ICMP_SGT:
2153 if (OrC->sgt(C))
2155 ConstantInt::getNullValue(X->getType()));
2156 break;
2157 default:
2158 break;
2159 }
2160 }
2161
2162 if (!Cmp.isEquality() || !C.isZero() || !Or->hasOneUse())
2163 return nullptr;
2164
2165 Value *P, *Q;
2167 // Simplify icmp eq (or (ptrtoint P), (ptrtoint Q)), 0
2168 // -> and (icmp eq P, null), (icmp eq Q, null).
2169 Value *CmpP =
2170 Builder.CreateICmp(Pred, P, ConstantInt::getNullValue(P->getType()));
2171 Value *CmpQ =
2172 Builder.CreateICmp(Pred, Q, ConstantInt::getNullValue(Q->getType()));
2173 auto BOpc = Pred == CmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2174 return BinaryOperator::Create(BOpc, CmpP, CmpQ);
2175 }
2176
2177 if (Value *V = foldICmpOrXorSubChain(Cmp, Or, Builder))
2178 return replaceInstUsesWith(Cmp, V);
2179
2180 return nullptr;
2181}
2182
2183/// Fold icmp (mul X, Y), C.
2186 const APInt &C) {
2187 ICmpInst::Predicate Pred = Cmp.getPredicate();
2188 Type *MulTy = Mul->getType();
2189 Value *X = Mul->getOperand(0);
2190
2191 // If there's no overflow:
2192 // X * X == 0 --> X == 0
2193 // X * X != 0 --> X != 0
2194 if (Cmp.isEquality() && C.isZero() && X == Mul->getOperand(1) &&
2195 (Mul->hasNoUnsignedWrap() || Mul->hasNoSignedWrap()))
2196 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2197
2198 const APInt *MulC;
2199 if (!match(Mul->getOperand(1), m_APInt(MulC)))
2200 return nullptr;
2201
2202 // If this is a test of the sign bit and the multiply is sign-preserving with
2203 // a constant operand, use the multiply LHS operand instead:
2204 // (X * +MulC) < 0 --> X < 0
2205 // (X * -MulC) < 0 --> X > 0
2206 if (isSignTest(Pred, C) && Mul->hasNoSignedWrap()) {
2207 if (MulC->isNegative())
2208 Pred = ICmpInst::getSwappedPredicate(Pred);
2209 return new ICmpInst(Pred, X, ConstantInt::getNullValue(MulTy));
2210 }
2211
2212 if (MulC->isZero())
2213 return nullptr;
2214
2215 // If the multiply does not wrap or the constant is odd, try to divide the
2216 // compare constant by the multiplication factor.
2217 if (Cmp.isEquality()) {
2218 // (mul nsw X, MulC) eq/ne C --> X eq/ne C /s MulC
2219 if (Mul->hasNoSignedWrap() && C.srem(*MulC).isZero()) {
2220 Constant *NewC = ConstantInt::get(MulTy, C.sdiv(*MulC));
2221 return new ICmpInst(Pred, X, NewC);
2222 }
2223
2224 // C % MulC == 0 is weaker than we could use if MulC is odd because it
2225 // correct to transform if MulC * N == C including overflow. I.e with i8
2226 // (icmp eq (mul X, 5), 101) -> (icmp eq X, 225) but since 101 % 5 != 0, we
2227 // miss that case.
2228 if (C.urem(*MulC).isZero()) {
2229 // (mul nuw X, MulC) eq/ne C --> X eq/ne C /u MulC
2230 // (mul X, OddC) eq/ne N * C --> X eq/ne N
2231 if ((*MulC & 1).isOne() || Mul->hasNoUnsignedWrap()) {
2232 Constant *NewC = ConstantInt::get(MulTy, C.udiv(*MulC));
2233 return new ICmpInst(Pred, X, NewC);
2234 }
2235 }
2236 }
2237
2238 // With a matching no-overflow guarantee, fold the constants:
2239 // (X * MulC) < C --> X < (C / MulC)
2240 // (X * MulC) > C --> X > (C / MulC)
2241 // TODO: Assert that Pred is not equal to SGE, SLE, UGE, ULE?
2242 Constant *NewC = nullptr;
2243 if (Mul->hasNoSignedWrap() && ICmpInst::isSigned(Pred)) {
2244 // MININT / -1 --> overflow.
2245 if (C.isMinSignedValue() && MulC->isAllOnes())
2246 return nullptr;
2247 if (MulC->isNegative())
2248 Pred = ICmpInst::getSwappedPredicate(Pred);
2249
2250 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGE) {
2251 NewC = ConstantInt::get(
2253 } else {
2254 assert((Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_SGT) &&
2255 "Unexpected predicate");
2256 NewC = ConstantInt::get(
2258 }
2259 } else if (Mul->hasNoUnsignedWrap() && ICmpInst::isUnsigned(Pred)) {
2260 if (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) {
2261 NewC = ConstantInt::get(
2263 } else {
2264 assert((Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
2265 "Unexpected predicate");
2266 NewC = ConstantInt::get(
2268 }
2269 }
2270
2271 return NewC ? new ICmpInst(Pred, X, NewC) : nullptr;
2272}
2273
2274/// Fold icmp (shl nuw C2, Y), C.
2276 const APInt &C) {
2277 Value *Y;
2278 const APInt *C2;
2279 if (!match(Shl, m_NUWShl(m_APInt(C2), m_Value(Y))))
2280 return nullptr;
2281
2282 Type *ShiftType = Shl->getType();
2283 unsigned TypeBits = C.getBitWidth();
2284 ICmpInst::Predicate Pred = Cmp.getPredicate();
2285 if (Cmp.isUnsigned()) {
2286 if (C2->isZero() || C2->ugt(C))
2287 return nullptr;
2288 APInt Div, Rem;
2289 APInt::udivrem(C, *C2, Div, Rem);
2290 bool CIsPowerOf2 = Rem.isZero() && Div.isPowerOf2();
2291
2292 // (1 << Y) pred C -> Y pred Log2(C)
2293 if (!CIsPowerOf2) {
2294 // (1 << Y) < 30 -> Y <= 4
2295 // (1 << Y) <= 30 -> Y <= 4
2296 // (1 << Y) >= 30 -> Y > 4
2297 // (1 << Y) > 30 -> Y > 4
2298 if (Pred == ICmpInst::ICMP_ULT)
2299 Pred = ICmpInst::ICMP_ULE;
2300 else if (Pred == ICmpInst::ICMP_UGE)
2301 Pred = ICmpInst::ICMP_UGT;
2302 }
2303
2304 unsigned CLog2 = Div.logBase2();
2305 return new ICmpInst(Pred, Y, ConstantInt::get(ShiftType, CLog2));
2306 } else if (Cmp.isSigned() && C2->isOne()) {
2307 Constant *BitWidthMinusOne = ConstantInt::get(ShiftType, TypeBits - 1);
2308 // (1 << Y) > 0 -> Y != 31
2309 // (1 << Y) > C -> Y != 31 if C is negative.
2310 if (Pred == ICmpInst::ICMP_SGT && C.sle(0))
2311 return new ICmpInst(ICmpInst::ICMP_NE, Y, BitWidthMinusOne);
2312
2313 // (1 << Y) < 0 -> Y == 31
2314 // (1 << Y) < 1 -> Y == 31
2315 // (1 << Y) < C -> Y == 31 if C is negative and not signed min.
2316 // Exclude signed min by subtracting 1 and lower the upper bound to 0.
2317 if (Pred == ICmpInst::ICMP_SLT && (C - 1).sle(0))
2318 return new ICmpInst(ICmpInst::ICMP_EQ, Y, BitWidthMinusOne);
2319 }
2320
2321 return nullptr;
2322}
2323
2324/// Fold icmp (shl X, Y), C.
2326 BinaryOperator *Shl,
2327 const APInt &C) {
2328 const APInt *ShiftVal;
2329 if (Cmp.isEquality() && match(Shl->getOperand(0), m_APInt(ShiftVal)))
2330 return foldICmpShlConstConst(Cmp, Shl->getOperand(1), C, *ShiftVal);
2331
2332 ICmpInst::Predicate Pred = Cmp.getPredicate();
2333 // (icmp pred (shl nuw&nsw X, Y), Csle0)
2334 // -> (icmp pred X, Csle0)
2335 //
2336 // The idea is the nuw/nsw essentially freeze the sign bit for the shift op
2337 // so X's must be what is used.
2338 if (C.sle(0) && Shl->hasNoUnsignedWrap() && Shl->hasNoSignedWrap())
2339 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2340
2341 // (icmp eq/ne (shl nuw|nsw X, Y), 0)
2342 // -> (icmp eq/ne X, 0)
2343 if (ICmpInst::isEquality(Pred) && C.isZero() &&
2344 (Shl->hasNoUnsignedWrap() || Shl->hasNoSignedWrap()))
2345 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2346
2347 // (icmp slt (shl nsw X, Y), 0/1)
2348 // -> (icmp slt X, 0/1)
2349 // (icmp sgt (shl nsw X, Y), 0/-1)
2350 // -> (icmp sgt X, 0/-1)
2351 //
2352 // NB: sge/sle with a constant will canonicalize to sgt/slt.
2353 if (Shl->hasNoSignedWrap() &&
2354 (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT))
2355 if (C.isZero() || (Pred == ICmpInst::ICMP_SGT ? C.isAllOnes() : C.isOne()))
2356 return new ICmpInst(Pred, Shl->getOperand(0), Cmp.getOperand(1));
2357
2358 const APInt *ShiftAmt;
2359 if (!match(Shl->getOperand(1), m_APInt(ShiftAmt)))
2360 return foldICmpShlLHSC(Cmp, Shl, C);
2361
2362 // Check that the shift amount is in range. If not, don't perform undefined
2363 // shifts. When the shift is visited, it will be simplified.
2364 unsigned TypeBits = C.getBitWidth();
2365 if (ShiftAmt->uge(TypeBits))
2366 return nullptr;
2367
2368 Value *X = Shl->getOperand(0);
2369 Type *ShType = Shl->getType();
2370
2371 // NSW guarantees that we are only shifting out sign bits from the high bits,
2372 // so we can ASHR the compare constant without needing a mask and eliminate
2373 // the shift.
2374 if (Shl->hasNoSignedWrap()) {
2375 if (Pred == ICmpInst::ICMP_SGT) {
2376 // icmp Pred (shl nsw X, ShiftAmt), C --> icmp Pred X, (C >>s ShiftAmt)
2377 APInt ShiftedC = C.ashr(*ShiftAmt);
2378 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2379 }
2380 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2381 C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) {
2382 APInt ShiftedC = C.ashr(*ShiftAmt);
2383 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2384 }
2385 if (Pred == ICmpInst::ICMP_SLT) {
2386 // SLE is the same as above, but SLE is canonicalized to SLT, so convert:
2387 // (X << S) <=s C is equiv to X <=s (C >> S) for all C
2388 // (X << S) <s (C + 1) is equiv to X <s (C >> S) + 1 if C <s SMAX
2389 // (X << S) <s C is equiv to X <s ((C - 1) >> S) + 1 if C >s SMIN
2390 assert(!C.isMinSignedValue() && "Unexpected icmp slt");
2391 APInt ShiftedC = (C - 1).ashr(*ShiftAmt) + 1;
2392 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2393 }
2394 }
2395
2396 // NUW guarantees that we are only shifting out zero bits from the high bits,
2397 // so we can LSHR the compare constant without needing a mask and eliminate
2398 // the shift.
2399 if (Shl->hasNoUnsignedWrap()) {
2400 if (Pred == ICmpInst::ICMP_UGT) {
2401 // icmp Pred (shl nuw X, ShiftAmt), C --> icmp Pred X, (C >>u ShiftAmt)
2402 APInt ShiftedC = C.lshr(*ShiftAmt);
2403 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2404 }
2405 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2406 C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) {
2407 APInt ShiftedC = C.lshr(*ShiftAmt);
2408 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2409 }
2410 if (Pred == ICmpInst::ICMP_ULT) {
2411 // ULE is the same as above, but ULE is canonicalized to ULT, so convert:
2412 // (X << S) <=u C is equiv to X <=u (C >> S) for all C
2413 // (X << S) <u (C + 1) is equiv to X <u (C >> S) + 1 if C <u ~0u
2414 // (X << S) <u C is equiv to X <u ((C - 1) >> S) + 1 if C >u 0
2415 assert(C.ugt(0) && "ult 0 should have been eliminated");
2416 APInt ShiftedC = (C - 1).lshr(*ShiftAmt) + 1;
2417 return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC));
2418 }
2419 }
2420
2421 if (Cmp.isEquality() && Shl->hasOneUse()) {
2422 // Strength-reduce the shift into an 'and'.
2423 Constant *Mask = ConstantInt::get(
2424 ShType,
2425 APInt::getLowBitsSet(TypeBits, TypeBits - ShiftAmt->getZExtValue()));
2426 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2427 Constant *LShrC = ConstantInt::get(ShType, C.lshr(*ShiftAmt));
2428 return new ICmpInst(Pred, And, LShrC);
2429 }
2430
2431 // Otherwise, if this is a comparison of the sign bit, simplify to and/test.
2432 bool TrueIfSigned = false;
2433 if (Shl->hasOneUse() && isSignBitCheck(Pred, C, TrueIfSigned)) {
2434 // (X << 31) <s 0 --> (X & 1) != 0
2435 Constant *Mask = ConstantInt::get(
2436 ShType,
2437 APInt::getOneBitSet(TypeBits, TypeBits - ShiftAmt->getZExtValue() - 1));
2438 Value *And = Builder.CreateAnd(X, Mask, Shl->getName() + ".mask");
2439 return new ICmpInst(TrueIfSigned ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ,
2440 And, Constant::getNullValue(ShType));
2441 }
2442
2443 // Simplify 'shl' inequality test into 'and' equality test.
2444 if (Cmp.isUnsigned() && Shl->hasOneUse()) {
2445 // (X l<< C2) u<=/u> C1 iff C1+1 is power of two -> X & (~C1 l>> C2) ==/!= 0
2446 if ((C + 1).isPowerOf2() &&
2447 (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT)) {
2448 Value *And = Builder.CreateAnd(X, (~C).lshr(ShiftAmt->getZExtValue()));
2449 return new ICmpInst(Pred == ICmpInst::ICMP_ULE ? ICmpInst::ICMP_EQ
2451 And, Constant::getNullValue(ShType));
2452 }
2453 // (X l<< C2) u</u>= C1 iff C1 is power of two -> X & (-C1 l>> C2) ==/!= 0
2454 if (C.isPowerOf2() &&
2455 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
2456 Value *And =
2457 Builder.CreateAnd(X, (~(C - 1)).lshr(ShiftAmt->getZExtValue()));
2458 return new ICmpInst(Pred == ICmpInst::ICMP_ULT ? ICmpInst::ICMP_EQ
2460 And, Constant::getNullValue(ShType));
2461 }
2462 }
2463
2464 // Transform (icmp pred iM (shl iM %v, N), C)
2465 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (C>>N))
2466 // Transform the shl to a trunc if (trunc (C>>N)) has no loss and M-N.
2467 // This enables us to get rid of the shift in favor of a trunc that may be
2468 // free on the target. It has the additional benefit of comparing to a
2469 // smaller constant that may be more target-friendly.
2470 unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
2471 if (Shl->hasOneUse() && Amt != 0 &&
2472 shouldChangeType(ShType->getScalarSizeInBits(), TypeBits - Amt)) {
2473 ICmpInst::Predicate CmpPred = Pred;
2474 APInt RHSC = C;
2475
2476 if (RHSC.countr_zero() < Amt && ICmpInst::isStrictPredicate(CmpPred)) {
2477 // Try the flipped strictness predicate.
2478 // e.g.:
2479 // icmp ult i64 (shl X, 32), 8589934593 ->
2480 // icmp ule i64 (shl X, 32), 8589934592 ->
2481 // icmp ule i32 (trunc X, i32), 2 ->
2482 // icmp ult i32 (trunc X, i32), 3
2483 if (auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(
2484 Pred, ConstantInt::get(ShType->getContext(), C))) {
2485 CmpPred = FlippedStrictness->first;
2486 RHSC = cast<ConstantInt>(FlippedStrictness->second)->getValue();
2487 }
2488 }
2489
2490 if (RHSC.countr_zero() >= Amt) {
2491 Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
2492 Constant *NewC =
2493 ConstantInt::get(TruncTy, RHSC.ashr(*ShiftAmt).trunc(TypeBits - Amt));
2494 return new ICmpInst(CmpPred,
2495 Builder.CreateTrunc(X, TruncTy, "", /*IsNUW=*/false,
2496 Shl->hasNoSignedWrap()),
2497 NewC);
2498 }
2499 }
2500
2501 return nullptr;
2502}
2503
2504/// Fold icmp ({al}shr X, Y), C.
2506 BinaryOperator *Shr,
2507 const APInt &C) {
2508 // An exact shr only shifts out zero bits, so:
2509 // icmp eq/ne (shr X, Y), 0 --> icmp eq/ne X, 0
2510 Value *X = Shr->getOperand(0);
2511 CmpInst::Predicate Pred = Cmp.getPredicate();
2512 if (Cmp.isEquality() && Shr->isExact() && C.isZero())
2513 return new ICmpInst(Pred, X, Cmp.getOperand(1));
2514
2515 bool IsAShr = Shr->getOpcode() == Instruction::AShr;
2516 const APInt *ShiftValC;
2517 if (match(X, m_APInt(ShiftValC))) {
2518 if (Cmp.isEquality())
2519 return foldICmpShrConstConst(Cmp, Shr->getOperand(1), C, *ShiftValC);
2520
2521 // (ShiftValC >> Y) >s -1 --> Y != 0 with ShiftValC < 0
2522 // (ShiftValC >> Y) <s 0 --> Y == 0 with ShiftValC < 0
2523 bool TrueIfSigned;
2524 if (!IsAShr && ShiftValC->isNegative() &&
2525 isSignBitCheck(Pred, C, TrueIfSigned))
2526 return new ICmpInst(TrueIfSigned ? CmpInst::ICMP_EQ : CmpInst::ICMP_NE,
2527 Shr->getOperand(1),
2528 ConstantInt::getNullValue(X->getType()));
2529
2530 // If the shifted constant is a power-of-2, test the shift amount directly:
2531 // (ShiftValC >> Y) >u C --> X <u (LZ(C) - LZ(ShiftValC))
2532 // (ShiftValC >> Y) <u C --> X >=u (LZ(C-1) - LZ(ShiftValC))
2533 if (!IsAShr && ShiftValC->isPowerOf2() &&
2534 (Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_ULT)) {
2535 bool IsUGT = Pred == CmpInst::ICMP_UGT;
2536 assert(ShiftValC->uge(C) && "Expected simplify of compare");
2537 assert((IsUGT || !C.isZero()) && "Expected X u< 0 to simplify");
2538
2539 unsigned CmpLZ = IsUGT ? C.countl_zero() : (C - 1).countl_zero();
2540 unsigned ShiftLZ = ShiftValC->countl_zero();
2541 Constant *NewC = ConstantInt::get(Shr->getType(), CmpLZ - ShiftLZ);
2542 auto NewPred = IsUGT ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
2543 return new ICmpInst(NewPred, Shr->getOperand(1), NewC);
2544 }
2545 }
2546
2547 const APInt *ShiftAmtC;
2548 if (!match(Shr->getOperand(1), m_APInt(ShiftAmtC)))
2549 return nullptr;
2550
2551 // Check that the shift amount is in range. If not, don't perform undefined
2552 // shifts. When the shift is visited it will be simplified.
2553 unsigned TypeBits = C.getBitWidth();
2554 unsigned ShAmtVal = ShiftAmtC->getLimitedValue(TypeBits);
2555 if (ShAmtVal >= TypeBits || ShAmtVal == 0)
2556 return nullptr;
2557
2558 bool IsExact = Shr->isExact();
2559 Type *ShrTy = Shr->getType();
2560 // TODO: If we could guarantee that InstSimplify would handle all of the
2561 // constant-value-based preconditions in the folds below, then we could assert
2562 // those conditions rather than checking them. This is difficult because of
2563 // undef/poison (PR34838).
2564 if (IsAShr && Shr->hasOneUse()) {
2565 if (IsExact && (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) &&
2566 (C - 1).isPowerOf2() && C.countLeadingZeros() > ShAmtVal) {
2567 // When C - 1 is a power of two and the transform can be legally
2568 // performed, prefer this form so the produced constant is close to a
2569 // power of two.
2570 // icmp slt/ult (ashr exact X, ShAmtC), C
2571 // --> icmp slt/ult X, (C - 1) << ShAmtC) + 1
2572 APInt ShiftedC = (C - 1).shl(ShAmtVal) + 1;
2573 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2574 }
2575 if (IsExact || Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT) {
2576 // When ShAmtC can be shifted losslessly:
2577 // icmp PRED (ashr exact X, ShAmtC), C --> icmp PRED X, (C << ShAmtC)
2578 // icmp slt/ult (ashr X, ShAmtC), C --> icmp slt/ult X, (C << ShAmtC)
2579 APInt ShiftedC = C.shl(ShAmtVal);
2580 if (ShiftedC.ashr(ShAmtVal) == C)
2581 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2582 }
2583 if (Pred == CmpInst::ICMP_SGT) {
2584 // icmp sgt (ashr X, ShAmtC), C --> icmp sgt X, ((C + 1) << ShAmtC) - 1
2585 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2586 if (!C.isMaxSignedValue() && !(C + 1).shl(ShAmtVal).isMinSignedValue() &&
2587 (ShiftedC + 1).ashr(ShAmtVal) == (C + 1))
2588 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2589 }
2590 if (Pred == CmpInst::ICMP_UGT) {
2591 // icmp ugt (ashr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2592 // 'C + 1 << ShAmtC' can overflow as a signed number, so the 2nd
2593 // clause accounts for that pattern.
2594 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2595 if ((ShiftedC + 1).ashr(ShAmtVal) == (C + 1) ||
2596 (C + 1).shl(ShAmtVal).isMinSignedValue())
2597 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2598 }
2599
2600 // If the compare constant has significant bits above the lowest sign-bit,
2601 // then convert an unsigned cmp to a test of the sign-bit:
2602 // (ashr X, ShiftC) u> C --> X s< 0
2603 // (ashr X, ShiftC) u< C --> X s> -1
2604 if (C.getBitWidth() > 2 && C.getNumSignBits() <= ShAmtVal) {
2605 if (Pred == CmpInst::ICMP_UGT) {
2606 return new ICmpInst(CmpInst::ICMP_SLT, X,
2608 }
2609 if (Pred == CmpInst::ICMP_ULT) {
2610 return new ICmpInst(CmpInst::ICMP_SGT, X,
2612 }
2613 }
2614 } else if (!IsAShr) {
2615 if (Pred == CmpInst::ICMP_ULT || (Pred == CmpInst::ICMP_UGT && IsExact)) {
2616 // icmp ult (lshr X, ShAmtC), C --> icmp ult X, (C << ShAmtC)
2617 // icmp ugt (lshr exact X, ShAmtC), C --> icmp ugt X, (C << ShAmtC)
2618 APInt ShiftedC = C.shl(ShAmtVal);
2619 if (ShiftedC.lshr(ShAmtVal) == C)
2620 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2621 }
2622 if (Pred == CmpInst::ICMP_UGT) {
2623 // icmp ugt (lshr X, ShAmtC), C --> icmp ugt X, ((C + 1) << ShAmtC) - 1
2624 APInt ShiftedC = (C + 1).shl(ShAmtVal) - 1;
2625 if ((ShiftedC + 1).lshr(ShAmtVal) == (C + 1))
2626 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, ShiftedC));
2627 }
2628 }
2629
2630 if (!Cmp.isEquality())
2631 return nullptr;
2632
2633 // Handle equality comparisons of shift-by-constant.
2634
2635 // If the comparison constant changes with the shift, the comparison cannot
2636 // succeed (bits of the comparison constant cannot match the shifted value).
2637 // This should be known by InstSimplify and already be folded to true/false.
2638 assert(((IsAShr && C.shl(ShAmtVal).ashr(ShAmtVal) == C) ||
2639 (!IsAShr && C.shl(ShAmtVal).lshr(ShAmtVal) == C)) &&
2640 "Expected icmp+shr simplify did not occur.");
2641
2642 // If the bits shifted out are known zero, compare the unshifted value:
2643 // (X & 4) >> 1 == 2 --> (X & 4) == 4.
2644 if (Shr->isExact())
2645 return new ICmpInst(Pred, X, ConstantInt::get(ShrTy, C << ShAmtVal));
2646
2647 if (Shr->hasOneUse()) {
2648 // Canonicalize the shift into an 'and':
2649 // icmp eq/ne (shr X, ShAmt), C --> icmp eq/ne (and X, HiMask), (C << ShAmt)
2650 APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
2651 Constant *Mask = ConstantInt::get(ShrTy, Val);
2652 Value *And = Builder.CreateAnd(X, Mask, Shr->getName() + ".mask");
2653 return new ICmpInst(Pred, And, ConstantInt::get(ShrTy, C << ShAmtVal));
2654 }
2655
2656 return nullptr;
2657}
2658
2660 BinaryOperator *SRem,
2661 const APInt &C) {
2662 const ICmpInst::Predicate Pred = Cmp.getPredicate();
2663 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT) {
2664 // Canonicalize unsigned predicates to signed:
2665 // (X s% DivisorC) u> C -> (X s% DivisorC) s< 0
2666 // iff (C s< 0 ? ~C : C) u>= abs(DivisorC)-1
2667 // (X s% DivisorC) u< C+1 -> (X s% DivisorC) s> -1
2668 // iff (C+1 s< 0 ? ~C : C) u>= abs(DivisorC)-1
2669
2670 const APInt *DivisorC;
2671 if (!match(SRem->getOperand(1), m_APInt(DivisorC)))
2672 return nullptr;
2673 if (DivisorC->isZero())
2674 return nullptr;
2675
2676 APInt NormalizedC = C;
2677 if (Pred == ICmpInst::ICMP_ULT) {
2678 assert(!NormalizedC.isZero() &&
2679 "ult X, 0 should have been simplified already.");
2680 --NormalizedC;
2681 }
2682 if (C.isNegative())
2683 NormalizedC.flipAllBits();
2684 if (!NormalizedC.uge(DivisorC->abs() - 1))
2685 return nullptr;
2686
2687 Type *Ty = SRem->getType();
2688 if (Pred == ICmpInst::ICMP_UGT)
2689 return new ICmpInst(ICmpInst::ICMP_SLT, SRem,
2691 return new ICmpInst(ICmpInst::ICMP_SGT, SRem,
2693 }
2694 // Match an 'is positive' or 'is negative' comparison of remainder by a
2695 // constant power-of-2 value:
2696 // (X % pow2C) sgt/slt 0
2697 if (Pred != ICmpInst::ICMP_SGT && Pred != ICmpInst::ICMP_SLT &&
2698 Pred != ICmpInst::ICMP_EQ && Pred != ICmpInst::ICMP_NE)
2699 return nullptr;
2700
2701 // TODO: The one-use check is standard because we do not typically want to
2702 // create longer instruction sequences, but this might be a special-case
2703 // because srem is not good for analysis or codegen.
2704 if (!SRem->hasOneUse())
2705 return nullptr;
2706
2707 const APInt *DivisorC;
2708 if (!match(SRem->getOperand(1), m_Power2(DivisorC)))
2709 return nullptr;
2710
2711 // For cmp_sgt/cmp_slt only zero valued C is handled.
2712 // For cmp_eq/cmp_ne only positive valued C is handled.
2713 if (((Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLT) &&
2714 !C.isZero()) ||
2715 ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) &&
2716 !C.isStrictlyPositive()))
2717 return nullptr;
2718
2719 // Mask off the sign bit and the modulo bits (low-bits).
2720 Type *Ty = SRem->getType();
2721 APInt SignMask = APInt::getSignMask(Ty->getScalarSizeInBits());
2722 Constant *MaskC = ConstantInt::get(Ty, SignMask | (*DivisorC - 1));
2723 Value *And = Builder.CreateAnd(SRem->getOperand(0), MaskC);
2724
2725 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
2726 return new ICmpInst(Pred, And, ConstantInt::get(Ty, C));
2727
2728 // For 'is positive?' check that the sign-bit is clear and at least 1 masked
2729 // bit is set. Example:
2730 // (i8 X % 32) s> 0 --> (X & 159) s> 0
2731 if (Pred == ICmpInst::ICMP_SGT)
2733
2734 // For 'is negative?' check that the sign-bit is set and at least 1 masked
2735 // bit is set. Example:
2736 // (i16 X % 4) s< 0 --> (X & 32771) u> 32768
2737 return new ICmpInst(ICmpInst::ICMP_UGT, And, ConstantInt::get(Ty, SignMask));
2738}
2739
2740/// Fold icmp (udiv X, Y), C.
2742 BinaryOperator *UDiv,
2743 const APInt &C) {
2744 ICmpInst::Predicate Pred = Cmp.getPredicate();
2745 Value *X = UDiv->getOperand(0);
2746 Value *Y = UDiv->getOperand(1);
2747 Type *Ty = UDiv->getType();
2748
2749 const APInt *C2;
2750 if (!match(X, m_APInt(C2)))
2751 return nullptr;
2752
2753 assert(*C2 != 0 && "udiv 0, X should have been simplified already.");
2754
2755 // (icmp ugt (udiv C2, Y), C) -> (icmp ule Y, C2/(C+1))
2756 if (Pred == ICmpInst::ICMP_UGT) {
2757 assert(!C.isMaxValue() &&
2758 "icmp ugt X, UINT_MAX should have been simplified already.");
2759 return new ICmpInst(ICmpInst::ICMP_ULE, Y,
2760 ConstantInt::get(Ty, C2->udiv(C + 1)));
2761 }
2762
2763 // (icmp ult (udiv C2, Y), C) -> (icmp ugt Y, C2/C)
2764 if (Pred == ICmpInst::ICMP_ULT) {
2765 assert(C != 0 && "icmp ult X, 0 should have been simplified already.");
2766 return new ICmpInst(ICmpInst::ICMP_UGT, Y,
2767 ConstantInt::get(Ty, C2->udiv(C)));
2768 }
2769
2770 return nullptr;
2771}
2772
2773/// Fold icmp ({su}div X, Y), C.
2775 BinaryOperator *Div,
2776 const APInt &C) {
2777 ICmpInst::Predicate Pred = Cmp.getPredicate();
2778 Value *X = Div->getOperand(0);
2779 Value *Y = Div->getOperand(1);
2780 Type *Ty = Div->getType();
2781 bool DivIsSigned = Div->getOpcode() == Instruction::SDiv;
2782
2783 // If unsigned division and the compare constant is bigger than
2784 // UMAX/2 (negative), there's only one pair of values that satisfies an
2785 // equality check, so eliminate the division:
2786 // (X u/ Y) == C --> (X == C) && (Y == 1)
2787 // (X u/ Y) != C --> (X != C) || (Y != 1)
2788 // Similarly, if signed division and the compare constant is exactly SMIN:
2789 // (X s/ Y) == SMIN --> (X == SMIN) && (Y == 1)
2790 // (X s/ Y) != SMIN --> (X != SMIN) || (Y != 1)
2791 if (Cmp.isEquality() && Div->hasOneUse() && C.isSignBitSet() &&
2792 (!DivIsSigned || C.isMinSignedValue())) {
2793 Value *XBig = Builder.CreateICmp(Pred, X, ConstantInt::get(Ty, C));
2794 Value *YOne = Builder.CreateICmp(Pred, Y, ConstantInt::get(Ty, 1));
2795 auto Logic = Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
2796 return BinaryOperator::Create(Logic, XBig, YOne);
2797 }
2798
2799 // Fold: icmp pred ([us]div X, C2), C -> range test
2800 // Fold this div into the comparison, producing a range check.
2801 // Determine, based on the divide type, what the range is being
2802 // checked. If there is an overflow on the low or high side, remember
2803 // it, otherwise compute the range [low, hi) bounding the new value.
2804 // See: InsertRangeTest above for the kinds of replacements possible.
2805 const APInt *C2;
2806 if (!match(Y, m_APInt(C2)))
2807 return nullptr;
2808
2809 // FIXME: If the operand types don't match the type of the divide
2810 // then don't attempt this transform. The code below doesn't have the
2811 // logic to deal with a signed divide and an unsigned compare (and
2812 // vice versa). This is because (x /s C2) <s C produces different
2813 // results than (x /s C2) <u C or (x /u C2) <s C or even
2814 // (x /u C2) <u C. Simply casting the operands and result won't
2815 // work. :( The if statement below tests that condition and bails
2816 // if it finds it.
2817 if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
2818 return nullptr;
2819
2820 // The ProdOV computation fails on divide by 0 and divide by -1. Cases with
2821 // INT_MIN will also fail if the divisor is 1. Although folds of all these
2822 // division-by-constant cases should be present, we can not assert that they
2823 // have happened before we reach this icmp instruction.
2824 if (C2->isZero() || C2->isOne() || (DivIsSigned && C2->isAllOnes()))
2825 return nullptr;
2826
2827 // Compute Prod = C * C2. We are essentially solving an equation of
2828 // form X / C2 = C. We solve for X by multiplying C2 and C.
2829 // By solving for X, we can turn this into a range check instead of computing
2830 // a divide.
2831 APInt Prod = C * *C2;
2832
2833 // Determine if the product overflows by seeing if the product is not equal to
2834 // the divide. Make sure we do the same kind of divide as in the LHS
2835 // instruction that we're folding.
2836 bool ProdOV = (DivIsSigned ? Prod.sdiv(*C2) : Prod.udiv(*C2)) != C;
2837
2838 // If the division is known to be exact, then there is no remainder from the
2839 // divide, so the covered range size is unit, otherwise it is the divisor.
2840 APInt RangeSize = Div->isExact() ? APInt(C2->getBitWidth(), 1) : *C2;
2841
2842 // Figure out the interval that is being checked. For example, a comparison
2843 // like "X /u 5 == 0" is really checking that X is in the interval [0, 5).
2844 // Compute this interval based on the constants involved and the signedness of
2845 // the compare/divide. This computes a half-open interval, keeping track of
2846 // whether either value in the interval overflows. After analysis each
2847 // overflow variable is set to 0 if it's corresponding bound variable is valid
2848 // -1 if overflowed off the bottom end, or +1 if overflowed off the top end.
2849 int LoOverflow = 0, HiOverflow = 0;
2850 APInt LoBound, HiBound;
2851
2852 if (!DivIsSigned) { // udiv
2853 // e.g. X/5 op 3 --> [15, 20)
2854 LoBound = Prod;
2855 HiOverflow = LoOverflow = ProdOV;
2856 if (!HiOverflow) {
2857 // If this is not an exact divide, then many values in the range collapse
2858 // to the same result value.
2859 HiOverflow = addWithOverflow(HiBound, LoBound, RangeSize, false);
2860 }
2861 } else if (C2->isStrictlyPositive()) { // Divisor is > 0.
2862 if (C.isZero()) { // (X / pos) op 0
2863 // Can't overflow. e.g. X/2 op 0 --> [-1, 2)
2864 LoBound = -(RangeSize - 1);
2865 HiBound = RangeSize;
2866 } else if (C.isStrictlyPositive()) { // (X / pos) op pos
2867 LoBound = Prod; // e.g. X/5 op 3 --> [15, 20)
2868 HiOverflow = LoOverflow = ProdOV;
2869 if (!HiOverflow)
2870 HiOverflow = addWithOverflow(HiBound, Prod, RangeSize, true);
2871 } else { // (X / pos) op neg
2872 // e.g. X/5 op -3 --> [-15-4, -15+1) --> [-19, -14)
2873 HiBound = Prod + 1;
2874 LoOverflow = HiOverflow = ProdOV ? -1 : 0;
2875 if (!LoOverflow) {
2876 APInt DivNeg = -RangeSize;
2877 LoOverflow = addWithOverflow(LoBound, HiBound, DivNeg, true) ? -1 : 0;
2878 }
2879 }
2880 } else if (C2->isNegative()) { // Divisor is < 0.
2881 if (Div->isExact())
2882 RangeSize.negate();
2883 if (C.isZero()) { // (X / neg) op 0
2884 // e.g. X/-5 op 0 --> [-4, 5)
2885 LoBound = RangeSize + 1;
2886 HiBound = -RangeSize;
2887 if (HiBound == *C2) { // -INTMIN = INTMIN
2888 HiOverflow = 1; // [INTMIN+1, overflow)
2889 HiBound = APInt(); // e.g. X/INTMIN = 0 --> X > INTMIN
2890 }
2891 } else if (C.isStrictlyPositive()) { // (X / neg) op pos
2892 // e.g. X/-5 op 3 --> [-19, -14)
2893 HiBound = Prod + 1;
2894 HiOverflow = LoOverflow = ProdOV ? -1 : 0;
2895 if (!LoOverflow)
2896 LoOverflow =
2897 addWithOverflow(LoBound, HiBound, RangeSize, true) ? -1 : 0;
2898 } else { // (X / neg) op neg
2899 LoBound = Prod; // e.g. X/-5 op -3 --> [15, 20)
2900 LoOverflow = HiOverflow = ProdOV;
2901 if (!HiOverflow)
2902 HiOverflow = subWithOverflow(HiBound, Prod, RangeSize, true);
2903 }
2904
2905 // Dividing by a negative swaps the condition. LT <-> GT
2906 Pred = ICmpInst::getSwappedPredicate(Pred);
2907 }
2908
2909 switch (Pred) {
2910 default:
2911 llvm_unreachable("Unhandled icmp predicate!");
2912 case ICmpInst::ICMP_EQ:
2913 if (LoOverflow && HiOverflow)
2914 return replaceInstUsesWith(Cmp, Builder.getFalse());
2915 if (HiOverflow)
2916 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2917 X, ConstantInt::get(Ty, LoBound));
2918 if (LoOverflow)
2919 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2920 X, ConstantInt::get(Ty, HiBound));
2921 return replaceInstUsesWith(
2922 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, true));
2923 case ICmpInst::ICMP_NE:
2924 if (LoOverflow && HiOverflow)
2925 return replaceInstUsesWith(Cmp, Builder.getTrue());
2926 if (HiOverflow)
2927 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT,
2928 X, ConstantInt::get(Ty, LoBound));
2929 if (LoOverflow)
2930 return new ICmpInst(DivIsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE,
2931 X, ConstantInt::get(Ty, HiBound));
2932 return replaceInstUsesWith(
2933 Cmp, insertRangeTest(X, LoBound, HiBound, DivIsSigned, false));
2934 case ICmpInst::ICMP_ULT:
2935 case ICmpInst::ICMP_SLT:
2936 if (LoOverflow == +1) // Low bound is greater than input range.
2937 return replaceInstUsesWith(Cmp, Builder.getTrue());
2938 if (LoOverflow == -1) // Low bound is less than input range.
2939 return replaceInstUsesWith(Cmp, Builder.getFalse());
2940 return new ICmpInst(Pred, X, ConstantInt::get(Ty, LoBound));
2941 case ICmpInst::ICMP_UGT:
2942 case ICmpInst::ICMP_SGT:
2943 if (HiOverflow == +1) // High bound greater than input range.
2944 return replaceInstUsesWith(Cmp, Builder.getFalse());
2945 if (HiOverflow == -1) // High bound less than input range.
2946 return replaceInstUsesWith(Cmp, Builder.getTrue());
2947 if (Pred == ICmpInst::ICMP_UGT)
2948 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, HiBound));
2949 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, HiBound));
2950 }
2951
2952 return nullptr;
2953}
2954
2955/// Fold icmp (sub X, Y), C.
2958 const APInt &C) {
2959 Value *X = Sub->getOperand(0), *Y = Sub->getOperand(1);
2960 ICmpInst::Predicate Pred = Cmp.getPredicate();
2961 Type *Ty = Sub->getType();
2962
2963 // (SubC - Y) == C) --> Y == (SubC - C)
2964 // (SubC - Y) != C) --> Y != (SubC - C)
2965 Constant *SubC;
2966 if (Cmp.isEquality() && match(X, m_ImmConstant(SubC))) {
2967 return new ICmpInst(Pred, Y,
2968 ConstantExpr::getSub(SubC, ConstantInt::get(Ty, C)));
2969 }
2970
2971 // (icmp P (sub nuw|nsw C2, Y), C) -> (icmp swap(P) Y, C2-C)
2972 const APInt *C2;
2973 APInt SubResult;
2974 ICmpInst::Predicate SwappedPred = Cmp.getSwappedPredicate();
2975 bool HasNSW = Sub->hasNoSignedWrap();
2976 bool HasNUW = Sub->hasNoUnsignedWrap();
2977 if (match(X, m_APInt(C2)) &&
2978 ((Cmp.isUnsigned() && HasNUW) || (Cmp.isSigned() && HasNSW)) &&
2979 !subWithOverflow(SubResult, *C2, C, Cmp.isSigned()))
2980 return new ICmpInst(SwappedPred, Y, ConstantInt::get(Ty, SubResult));
2981
2982 // X - Y == 0 --> X == Y.
2983 // X - Y != 0 --> X != Y.
2984 // TODO: We allow this with multiple uses as long as the other uses are not
2985 // in phis. The phi use check is guarding against a codegen regression
2986 // for a loop test. If the backend could undo this (and possibly
2987 // subsequent transforms), we would not need this hack.
2988 if (Cmp.isEquality() && C.isZero() &&
2989 none_of((Sub->users()), [](const User *U) { return isa<PHINode>(U); }))
2990 return new ICmpInst(Pred, X, Y);
2991
2992 // The following transforms are only worth it if the only user of the subtract
2993 // is the icmp.
2994 // TODO: This is an artificial restriction for all of the transforms below
2995 // that only need a single replacement icmp. Can these use the phi test
2996 // like the transform above here?
2997 if (!Sub->hasOneUse())
2998 return nullptr;
2999
3000 if (Sub->hasNoSignedWrap()) {
3001 // (icmp sgt (sub nsw X, Y), -1) -> (icmp sge X, Y)
3002 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
3003 return new ICmpInst(ICmpInst::ICMP_SGE, X, Y);
3004
3005 // (icmp sgt (sub nsw X, Y), 0) -> (icmp sgt X, Y)
3006 if (Pred == ICmpInst::ICMP_SGT && C.isZero())
3007 return new ICmpInst(ICmpInst::ICMP_SGT, X, Y);
3008
3009 // (icmp slt (sub nsw X, Y), 0) -> (icmp slt X, Y)
3010 if (Pred == ICmpInst::ICMP_SLT && C.isZero())
3011 return new ICmpInst(ICmpInst::ICMP_SLT, X, Y);
3012
3013 // (icmp slt (sub nsw X, Y), 1) -> (icmp sle X, Y)
3014 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
3015 return new ICmpInst(ICmpInst::ICMP_SLE, X, Y);
3016 }
3017
3018 if (!match(X, m_APInt(C2)))
3019 return nullptr;
3020
3021 // C2 - Y <u C -> (Y | (C - 1)) == C2
3022 // iff (C2 & (C - 1)) == C - 1 and C is a power of 2
3023 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() &&
3024 (*C2 & (C - 1)) == (C - 1))
3025 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateOr(Y, C - 1), X);
3026
3027 // C2 - Y >u C -> (Y | C) != C2
3028 // iff C2 & C == C and C + 1 is a power of 2
3029 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == C)
3030 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateOr(Y, C), X);
3031
3032 // We have handled special cases that reduce.
3033 // Canonicalize any remaining sub to add as:
3034 // (C2 - Y) > C --> (Y + ~C2) < ~C
3035 Value *Add = Builder.CreateAdd(Y, ConstantInt::get(Ty, ~(*C2)), "notsub",
3036 HasNUW, HasNSW);
3037 return new ICmpInst(SwappedPred, Add, ConstantInt::get(Ty, ~C));
3038}
3039
3040static Value *createLogicFromTable(const std::bitset<4> &Table, Value *Op0,
3041 Value *Op1, IRBuilderBase &Builder,
3042 bool HasOneUse) {
3043 auto FoldConstant = [&](bool Val) {
3044 Constant *Res = Val ? Builder.getTrue() : Builder.getFalse();
3045 if (Op0->getType()->isVectorTy())
3047 cast<VectorType>(Op0->getType())->getElementCount(), Res);
3048 return Res;
3049 };
3050
3051 switch (Table.to_ulong()) {
3052 case 0: // 0 0 0 0
3053 return FoldConstant(false);
3054 case 1: // 0 0 0 1
3055 return HasOneUse ? Builder.CreateNot(Builder.CreateOr(Op0, Op1)) : nullptr;
3056 case 2: // 0 0 1 0
3057 return HasOneUse ? Builder.CreateAnd(Builder.CreateNot(Op0), Op1) : nullptr;
3058 case 3: // 0 0 1 1
3059 return Builder.CreateNot(Op0);
3060 case 4: // 0 1 0 0
3061 return HasOneUse ? Builder.CreateAnd(Op0, Builder.CreateNot(Op1)) : nullptr;
3062 case 5: // 0 1 0 1
3063 return Builder.CreateNot(Op1);
3064 case 6: // 0 1 1 0
3065 return Builder.CreateXor(Op0, Op1);
3066 case 7: // 0 1 1 1
3067 return HasOneUse ? Builder.CreateNot(Builder.CreateAnd(Op0, Op1)) : nullptr;
3068 case 8: // 1 0 0 0
3069 return Builder.CreateAnd(Op0, Op1);
3070 case 9: // 1 0 0 1
3071 return HasOneUse ? Builder.CreateNot(Builder.CreateXor(Op0, Op1)) : nullptr;
3072 case 10: // 1 0 1 0
3073 return Op1;
3074 case 11: // 1 0 1 1
3075 return HasOneUse ? Builder.CreateOr(Builder.CreateNot(Op0), Op1) : nullptr;
3076 case 12: // 1 1 0 0
3077 return Op0;
3078 case 13: // 1 1 0 1
3079 return HasOneUse ? Builder.CreateOr(Op0, Builder.CreateNot(Op1)) : nullptr;
3080 case 14: // 1 1 1 0
3081 return Builder.CreateOr(Op0, Op1);
3082 case 15: // 1 1 1 1
3083 return FoldConstant(true);
3084 default:
3085 llvm_unreachable("Invalid Operation");
3086 }
3087 return nullptr;
3088}
3089
3091 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3092 Value *A, *B;
3093 Constant *C1, *C2, *C3, *C4;
3094 if (!match(BO->getOperand(0),
3096 !match(BO->getOperand(1),
3098 Cmp.getType() != A->getType() || Cmp.getType() != B->getType())
3099 return nullptr;
3100
3101 std::bitset<4> Table;
3102 auto ComputeTable = [&](bool First, bool Second) -> std::optional<bool> {
3103 Constant *L = First ? C1 : C2;
3104 Constant *R = Second ? C3 : C4;
3105 if (auto *Res = ConstantFoldBinaryOpOperands(BO->getOpcode(), L, R, DL)) {
3106 auto *Val = Res->getType()->isVectorTy() ? Res->getSplatValue() : Res;
3107 if (auto *CI = dyn_cast_or_null<ConstantInt>(Val))
3108 return ICmpInst::compare(CI->getValue(), C, Cmp.getPredicate());
3109 }
3110 return std::nullopt;
3111 };
3112
3113 for (unsigned I = 0; I < 4; ++I) {
3114 bool First = (I >> 1) & 1;
3115 bool Second = I & 1;
3116 if (auto Res = ComputeTable(First, Second))
3117 Table[I] = *Res;
3118 else
3119 return nullptr;
3120 }
3121
3122 // Synthesize optimal logic.
3123 if (auto *Cond = createLogicFromTable(Table, A, B, Builder, BO->hasOneUse()))
3124 return replaceInstUsesWith(Cmp, Cond);
3125 return nullptr;
3126}
3127
3128/// Fold icmp (add X, Y), C.
3131 const APInt &C) {
3132 Value *Y = Add->getOperand(1);
3133 Value *X = Add->getOperand(0);
3134 const CmpPredicate Pred = Cmp.getCmpPredicate();
3135
3136 // icmp ult (add nuw A, (lshr A, ShAmtC)), C --> icmp ult A, C
3137 // when C <= (1 << ShAmtC).
3138 const APInt *ShAmtC;
3139 Value *A;
3140 unsigned BitWidth = C.getBitWidth();
3141 if (Pred == ICmpInst::ICMP_ULT &&
3142 match(Add,
3143 m_c_NUWAdd(m_Value(A), m_LShr(m_Deferred(A), m_APInt(ShAmtC)))) &&
3144 ShAmtC->ult(BitWidth) &&
3145 C.ule(APInt::getOneBitSet(BitWidth, ShAmtC->getZExtValue())))
3146 return new ICmpInst(Pred, A, ConstantInt::get(A->getType(), C));
3147
3148 const APInt *C2;
3149 if (Cmp.isEquality() || !match(Y, m_APInt(C2)))
3150 return nullptr;
3151
3152 // Fold icmp pred (add X, C2), C.
3153 Type *Ty = Add->getType();
3154
3155 // If the add does not wrap, we can always adjust the compare by subtracting
3156 // the constants. Equality comparisons are handled elsewhere. SGE/SLE/UGE/ULE
3157 // have been canonicalized to SGT/SLT/UGT/ULT.
3158 if (Add->hasNoUnsignedWrap() &&
3159 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULT)) {
3160 bool Overflow;
3161 APInt NewC = C.usub_ov(*C2, Overflow);
3162 // If there is overflow, the result must be true or false.
3163 if (!Overflow)
3164 // icmp Pred (add nsw X, C2), C --> icmp Pred X, (C - C2)
3165 return new ICmpInst(Pred, X, ConstantInt::get(Ty, NewC));
3166 }
3167
3168 CmpInst::Predicate ChosenPred = Pred.getPreferredSignedPredicate();
3169
3170 if (Add->hasNoSignedWrap() &&
3171 (ChosenPred == ICmpInst::ICMP_SGT || ChosenPred == ICmpInst::ICMP_SLT)) {
3172 bool Overflow;
3173 APInt NewC = C.ssub_ov(*C2, Overflow);
3174 if (!Overflow)
3175 // icmp samesign ugt/ult (add nsw X, C2), C
3176 // -> icmp sgt/slt X, (C - C2)
3177 return new ICmpInst(ChosenPred, X, ConstantInt::get(Ty, NewC));
3178 }
3179
3180 if (ICmpInst::isUnsigned(Pred) && Add->hasNoSignedWrap() &&
3181 C.isNonNegative() && (C - *C2).isNonNegative() &&
3182 computeConstantRange(X, /*ForSigned=*/true, SQ.getWithInstruction(&Cmp))
3183 .add(*C2)
3184 .isAllNonNegative())
3185 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
3186 ConstantInt::get(Ty, C - *C2));
3187
3188 auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
3189 const APInt &Upper = CR.getUpper();
3190 const APInt &Lower = CR.getLower();
3191 if (Cmp.isSigned()) {
3192 if (Lower.isSignMask())
3193 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, Upper));
3194 if (Upper.isSignMask())
3195 return new ICmpInst(ICmpInst::ICMP_SGE, X, ConstantInt::get(Ty, Lower));
3196 } else {
3197 if (Lower.isMinValue())
3198 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, Upper));
3199 if (Upper.isMinValue())
3200 return new ICmpInst(ICmpInst::ICMP_UGE, X, ConstantInt::get(Ty, Lower));
3201 }
3202
3203 // This set of folds is intentionally placed after folds that use no-wrapping
3204 // flags because those folds are likely better for later analysis/codegen.
3205 const APInt SMax = APInt::getSignedMaxValue(Ty->getScalarSizeInBits());
3206 const APInt SMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
3207
3208 // Fold compare with offset to opposite sign compare if it eliminates offset:
3209 // (X + C2) >u C --> X <s -C2 (if C == C2 + SMAX)
3210 if (Pred == CmpInst::ICMP_UGT && C == *C2 + SMax)
3211 return new ICmpInst(ICmpInst::ICMP_SLT, X, ConstantInt::get(Ty, -(*C2)));
3212
3213 // (X + C2) <u C --> X >s ~C2 (if C == C2 + SMIN)
3214 if (Pred == CmpInst::ICMP_ULT && C == *C2 + SMin)
3215 return new ICmpInst(ICmpInst::ICMP_SGT, X, ConstantInt::get(Ty, ~(*C2)));
3216
3217 // (X + C2) >s C --> X <u (SMAX - C) (if C == C2 - 1)
3218 if (Pred == CmpInst::ICMP_SGT && C == *C2 - 1)
3219 return new ICmpInst(ICmpInst::ICMP_ULT, X, ConstantInt::get(Ty, SMax - C));
3220
3221 // (X + C2) <s C --> X >u (C ^ SMAX) (if C == C2)
3222 if (Pred == CmpInst::ICMP_SLT && C == *C2)
3223 return new ICmpInst(ICmpInst::ICMP_UGT, X, ConstantInt::get(Ty, C ^ SMax));
3224
3225 // (X + -1) <u C --> X <=u C (if X is never null)
3226 if (Pred == CmpInst::ICMP_ULT && C2->isAllOnes()) {
3227 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3228 if (llvm::isKnownNonZero(X, Q))
3229 return new ICmpInst(ICmpInst::ICMP_ULE, X, ConstantInt::get(Ty, C));
3230 }
3231
3232 if (!Add->hasOneUse())
3233 return nullptr;
3234
3235 // X+C <u C2 -> (X & -C2) == C
3236 // iff C & (C2-1) == 0
3237 // C2 is a power of 2
3238 if (Pred == ICmpInst::ICMP_ULT && C.isPowerOf2() && (*C2 & (C - 1)) == 0)
3239 return new ICmpInst(ICmpInst::ICMP_EQ, Builder.CreateAnd(X, -C),
3241
3242 // X+C2 <u C -> (X & C) == 2C
3243 // iff C == -(C2)
3244 // C2 is a power of 2
3245 if (Pred == ICmpInst::ICMP_ULT && C2->isPowerOf2() && C == -*C2)
3246 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, C),
3247 ConstantInt::get(Ty, C * 2));
3248
3249 // X+C >u C2 -> (X & ~C2) != C
3250 // iff C & C2 == 0
3251 // C2+1 is a power of 2
3252 if (Pred == ICmpInst::ICMP_UGT && (C + 1).isPowerOf2() && (*C2 & C) == 0)
3253 return new ICmpInst(ICmpInst::ICMP_NE, Builder.CreateAnd(X, ~C),
3255
3256 // The range test idiom can use either ult or ugt. Arbitrarily canonicalize
3257 // to the ult form.
3258 // X+C2 >u C -> X+(C2-C-1) <u ~C
3259 if (Pred == ICmpInst::ICMP_UGT)
3260 return new ICmpInst(ICmpInst::ICMP_ULT,
3261 Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
3262 ConstantInt::get(Ty, ~C));
3263
3264 // zext(V) + C2 pred C -> V + C3 pred' C4
3265 Value *V;
3266 if (match(X, m_ZExt(m_Value(V)))) {
3267 Type *NewCmpTy = V->getType();
3268 unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3269 if (shouldChangeType(Ty, NewCmpTy)) {
3270 ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3271 CmpInst::Predicate EquivPred;
3272 APInt EquivInt;
3273 APInt EquivOffset;
3274
3275 SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3276 return new ICmpInst(
3277 EquivPred,
3278 EquivOffset.isZero()
3279 ? V
3280 : Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3281 ConstantInt::get(NewCmpTy, EquivInt));
3282 }
3283 }
3284
3285 return nullptr;
3286}
3287
3289 Value *&RHS, ConstantInt *&Less,
3290 ConstantInt *&Equal,
3291 ConstantInt *&Greater) {
3292 // TODO: Generalize this to work with other comparison idioms or ensure
3293 // they get canonicalized into this form.
3294
3295 // select i1 (a == b),
3296 // i32 Equal,
3297 // i32 (select i1 (a < b), i32 Less, i32 Greater)
3298 // where Equal, Less and Greater are placeholders for any three constants.
3299 CmpPredicate PredA;
3300 if (!match(SI->getCondition(), m_ICmp(PredA, m_Value(LHS), m_Value(RHS))) ||
3301 !ICmpInst::isEquality(PredA))
3302 return false;
3303 Value *EqualVal = SI->getTrueValue();
3304 Value *UnequalVal = SI->getFalseValue();
3305 // We still can get non-canonical predicate here, so canonicalize.
3306 if (PredA == ICmpInst::ICMP_NE)
3307 std::swap(EqualVal, UnequalVal);
3308 if (!match(EqualVal, m_ConstantInt(Equal)))
3309 return false;
3310 CmpPredicate PredB;
3311 Value *LHS2, *RHS2;
3312 if (!match(UnequalVal, m_Select(m_ICmp(PredB, m_Value(LHS2), m_Value(RHS2)),
3313 m_ConstantInt(Less), m_ConstantInt(Greater))))
3314 return false;
3315 // We can get predicate mismatch here, so canonicalize if possible:
3316 // First, ensure that 'LHS' match.
3317 if (LHS2 != LHS) {
3318 // x sgt y <--> y slt x
3319 std::swap(LHS2, RHS2);
3320 PredB = ICmpInst::getSwappedPredicate(PredB);
3321 }
3322 if (LHS2 != LHS)
3323 return false;
3324 // We also need to canonicalize 'RHS'.
3325 if (PredB == ICmpInst::ICMP_SGT && isa<Constant>(RHS2)) {
3326 // x sgt C-1 <--> x sge C <--> not(x slt C)
3327 auto FlippedStrictness =
3329 if (!FlippedStrictness)
3330 return false;
3331 assert(FlippedStrictness->first == ICmpInst::ICMP_SGE &&
3332 "basic correctness failure");
3333 RHS2 = FlippedStrictness->second;
3334 // And kind-of perform the result swap.
3335 std::swap(Less, Greater);
3336 PredB = ICmpInst::ICMP_SLT;
3337 }
3338 return PredB == ICmpInst::ICMP_SLT && RHS == RHS2;
3339}
3340
3343 ConstantInt *C) {
3344
3345 assert(C && "Cmp RHS should be a constant int!");
3346 // If we're testing a constant value against the result of a three way
3347 // comparison, the result can be expressed directly in terms of the
3348 // original values being compared. Note: We could possibly be more
3349 // aggressive here and remove the hasOneUse test. The original select is
3350 // really likely to simplify or sink when we remove a test of the result.
3351 Value *OrigLHS, *OrigRHS;
3352 ConstantInt *C1LessThan, *C2Equal, *C3GreaterThan;
3353 if (Cmp.hasOneUse() &&
3354 matchThreeWayIntCompare(Select, OrigLHS, OrigRHS, C1LessThan, C2Equal,
3355 C3GreaterThan)) {
3356 assert(C1LessThan && C2Equal && C3GreaterThan);
3357
3358 bool TrueWhenLessThan = ICmpInst::compare(
3359 C1LessThan->getValue(), C->getValue(), Cmp.getPredicate());
3360 bool TrueWhenEqual = ICmpInst::compare(C2Equal->getValue(), C->getValue(),
3361 Cmp.getPredicate());
3362 bool TrueWhenGreaterThan = ICmpInst::compare(
3363 C3GreaterThan->getValue(), C->getValue(), Cmp.getPredicate());
3364
3365 // This generates the new instruction that will replace the original Cmp
3366 // Instruction. Instead of enumerating the various combinations when
3367 // TrueWhenLessThan, TrueWhenEqual and TrueWhenGreaterThan are true versus
3368 // false, we rely on chaining of ORs and future passes of InstCombine to
3369 // simplify the OR further (i.e. a s< b || a == b becomes a s<= b).
3370
3371 // When none of the three constants satisfy the predicate for the RHS (C),
3372 // the entire original Cmp can be simplified to a false.
3373 Value *Cond = Builder.getFalse();
3374 if (TrueWhenLessThan)
3375 Cond = Builder.CreateOr(
3376 Cond, Builder.CreateICmp(ICmpInst::ICMP_SLT, OrigLHS, OrigRHS));
3377 if (TrueWhenEqual)
3378 Cond = Builder.CreateOr(
3379 Cond, Builder.CreateICmp(ICmpInst::ICMP_EQ, OrigLHS, OrigRHS));
3380 if (TrueWhenGreaterThan)
3381 Cond = Builder.CreateOr(
3382 Cond, Builder.CreateICmp(ICmpInst::ICMP_SGT, OrigLHS, OrigRHS));
3383
3384 return replaceInstUsesWith(Cmp, Cond);
3385 }
3386 return nullptr;
3387}
3388
3390 auto *Bitcast = dyn_cast<BitCastInst>(Cmp.getOperand(0));
3391 if (!Bitcast)
3392 return nullptr;
3393
3394 ICmpInst::Predicate Pred = Cmp.getPredicate();
3395 Value *Op1 = Cmp.getOperand(1);
3396 Value *BCSrcOp = Bitcast->getOperand(0);
3397 Type *SrcType = Bitcast->getSrcTy();
3398 Type *DstType = Bitcast->getType();
3399
3400 // Make sure the bitcast doesn't change between scalar and vector and
3401 // doesn't change the number of vector elements.
3402 if (SrcType->isVectorTy() == DstType->isVectorTy() &&
3403 SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
3404 // Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
3405 Value *X;
3406 if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
3407 // icmp eq (bitcast (sitofp X)), 0 --> icmp eq X, 0
3408 // icmp ne (bitcast (sitofp X)), 0 --> icmp ne X, 0
3409 // icmp slt (bitcast (sitofp X)), 0 --> icmp slt X, 0
3410 // icmp sgt (bitcast (sitofp X)), 0 --> icmp sgt X, 0
3411 if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_SLT ||
3412 Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT) &&
3413 match(Op1, m_Zero()))
3414 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3415
3416 // icmp slt (bitcast (sitofp X)), 1 --> icmp slt X, 1
3417 if (Pred == ICmpInst::ICMP_SLT && match(Op1, m_One()))
3418 return new ICmpInst(Pred, X, ConstantInt::get(X->getType(), 1));
3419
3420 // icmp sgt (bitcast (sitofp X)), -1 --> icmp sgt X, -1
3421 if (Pred == ICmpInst::ICMP_SGT && match(Op1, m_AllOnes()))
3422 return new ICmpInst(Pred, X,
3423 ConstantInt::getAllOnesValue(X->getType()));
3424 }
3425
3426 // Zero-equality checks are preserved through unsigned floating-point casts:
3427 // icmp eq (bitcast (uitofp X)), 0 --> icmp eq X, 0
3428 // icmp ne (bitcast (uitofp X)), 0 --> icmp ne X, 0
3429 if (match(BCSrcOp, m_UIToFP(m_Value(X))))
3430 if (Cmp.isEquality() && match(Op1, m_Zero()))
3431 return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
3432
3433 const APInt *C;
3434 bool TrueIfSigned;
3435 if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse()) {
3436 // If this is a sign-bit test of a bitcast of a casted FP value, eliminate
3437 // the FP extend/truncate because that cast does not change the sign-bit.
3438 // This is true for all standard IEEE-754 types and the X86 80-bit type.
3439 // The sign-bit is always the most significant bit in those types.
3440 if (isSignBitCheck(Pred, *C, TrueIfSigned) &&
3441 (match(BCSrcOp, m_FPExt(m_Value(X))) ||
3442 match(BCSrcOp, m_FPTrunc(m_Value(X))))) {
3443 // (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
3444 // (bitcast (fpext/fptrunc X)) to iX) > -1 --> (bitcast X to iY) > -1
3445 Type *XType = X->getType();
3446
3447 // We can't currently handle Power style floating point operations here.
3448 if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
3449 Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
3450 if (auto *XVTy = dyn_cast<VectorType>(XType))
3451 NewType = VectorType::get(NewType, XVTy->getElementCount());
3452 Value *NewBitcast = Builder.CreateBitCast(X, NewType);
3453 if (TrueIfSigned)
3454 return new ICmpInst(ICmpInst::ICMP_SLT, NewBitcast,
3455 ConstantInt::getNullValue(NewType));
3456 else
3457 return new ICmpInst(ICmpInst::ICMP_SGT, NewBitcast,
3459 }
3460 }
3461
3462 // icmp eq/ne (bitcast X to int), special fp -> llvm.is.fpclass(X, class)
3463 Type *FPType = SrcType->getScalarType();
3464 if (!Cmp.getParent()->getParent()->hasFnAttribute(
3465 Attribute::NoImplicitFloat) &&
3466 Cmp.isEquality() && FPType->isIEEELikeFPTy()) {
3467 FPClassTest Mask = APFloat(FPType->getFltSemantics(), *C).classify();
3468 if (Mask & (fcInf | fcZero)) {
3469 if (Pred == ICmpInst::ICMP_NE)
3470 Mask = ~Mask;
3471 return replaceInstUsesWith(Cmp,
3472 Builder.createIsFPClass(BCSrcOp, Mask));
3473 }
3474 }
3475 }
3476 }
3477
3478 const APInt *C;
3479 if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
3480 !SrcType->isIntOrIntVectorTy())
3481 return nullptr;
3482
3483 // If this is checking if all elements of a vector compare are set or not,
3484 // invert the casted vector equality compare and test if all compare
3485 // elements are clear or not. Compare against zero is generally easier for
3486 // analysis and codegen.
3487 // icmp eq/ne (bitcast (not X) to iN), -1 --> icmp eq/ne (bitcast X to iN), 0
3488 // Example: are all elements equal? --> are zero elements not equal?
3489 // TODO: Try harder to reduce compare of 2 freely invertible operands?
3490 if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse()) {
3491 if (Value *NotBCSrcOp =
3492 getFreelyInverted(BCSrcOp, BCSrcOp->hasOneUse(), &Builder)) {
3493 Value *Cast = Builder.CreateBitCast(NotBCSrcOp, DstType);
3494 return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
3495 }
3496 }
3497
3498 // If this is checking if all elements of an extended vector are clear or not,
3499 // compare in a narrow type to eliminate the extend:
3500 // icmp eq/ne (bitcast (ext X) to iN), 0 --> icmp eq/ne (bitcast X to iM), 0
3501 Value *X;
3502 if (Cmp.isEquality() && C->isZero() && Bitcast->hasOneUse() &&
3503 match(BCSrcOp, m_ZExtOrSExt(m_Value(X)))) {
3504 if (auto *VecTy = dyn_cast<FixedVectorType>(X->getType())) {
3505 Type *NewType = Builder.getIntNTy(VecTy->getPrimitiveSizeInBits());
3506 Value *NewCast = Builder.CreateBitCast(X, NewType);
3507 return new ICmpInst(Pred, NewCast, ConstantInt::getNullValue(NewType));
3508 }
3509 }
3510
3511 // Folding: icmp <pred> iN X, C
3512 // where X = bitcast <M x iK> (shufflevector <M x iK> %vec, undef, SC)) to iN
3513 // and C is a splat of a K-bit pattern
3514 // and SC is a constant vector = <C', C', C', ..., C'>
3515 // Into:
3516 // %E = extractelement <M x iK> %vec, i32 C'
3517 // icmp <pred> iK %E, trunc(C)
3518 Value *Vec;
3519 ArrayRef<int> Mask;
3520 if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
3521 // Check whether every element of Mask is the same constant
3522 if (all_equal(Mask)) {
3523 auto *VecTy = cast<VectorType>(SrcType);
3524 auto *EltTy = cast<IntegerType>(VecTy->getElementType());
3525 if (C->isSplat(EltTy->getBitWidth())) {
3526 // Fold the icmp based on the value of C
3527 // If C is M copies of an iK sized bit pattern,
3528 // then:
3529 // => %E = extractelement <N x iK> %vec, i32 Elem
3530 // icmp <pred> iK %SplatVal, <pattern>
3531 Value *Elem = Builder.getInt32(Mask[0]);
3532 Value *Extract = Builder.CreateExtractElement(Vec, Elem);
3533 Value *NewC = ConstantInt::get(EltTy, C->trunc(EltTy->getBitWidth()));
3534 return new ICmpInst(Pred, Extract, NewC);
3535 }
3536 }
3537 }
3538 return nullptr;
3539}
3540
3541/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3542/// where X is some kind of instruction.
3544 const APInt *C;
3545
3546 if (match(Cmp.getOperand(1), m_APInt(C))) {
3547 if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0)))
3548 if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
3549 return I;
3550
3551 if (auto *SI = dyn_cast<SelectInst>(Cmp.getOperand(0)))
3552 // For now, we only support constant integers while folding the
3553 // ICMP(SELECT)) pattern. We can extend this to support vector of integers
3554 // similar to the cases handled by binary ops above.
3555 if (auto *ConstRHS = dyn_cast<ConstantInt>(Cmp.getOperand(1)))
3556 if (Instruction *I = foldICmpSelectConstant(Cmp, SI, ConstRHS))
3557 return I;
3558
3559 if (auto *TI = dyn_cast<TruncInst>(Cmp.getOperand(0)))
3560 if (Instruction *I = foldICmpTruncConstant(Cmp, TI, *C))
3561 return I;
3562
3563 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0)))
3565 return I;
3566
3567 // (extractval ([s/u]subo X, Y), 0) == 0 --> X == Y
3568 // (extractval ([s/u]subo X, Y), 0) != 0 --> X != Y
3569 // TODO: This checks one-use, but that is not strictly necessary.
3570 Value *Cmp0 = Cmp.getOperand(0);
3571 Value *X, *Y;
3572 if (C->isZero() && Cmp.isEquality() && Cmp0->hasOneUse() &&
3573 (match(Cmp0,
3575 m_Value(X), m_Value(Y)))) ||
3576 match(Cmp0,
3578 m_Value(X), m_Value(Y))))))
3579 return new ICmpInst(Cmp.getPredicate(), X, Y);
3580 }
3581
3582 if (match(Cmp.getOperand(1), m_APIntAllowPoison(C)))
3584
3585 return nullptr;
3586}
3587
3588/// Fold an icmp equality instruction with binary operator LHS and constant RHS:
3589/// icmp eq/ne BO, C.
3591 ICmpInst &Cmp, BinaryOperator *BO, const APInt &C) {
3592 // TODO: Some of these folds could work with arbitrary constants, but this
3593 // function is limited to scalar and vector splat constants.
3594 if (!Cmp.isEquality())
3595 return nullptr;
3596
3597 ICmpInst::Predicate Pred = Cmp.getPredicate();
3598 bool isICMP_NE = Pred == ICmpInst::ICMP_NE;
3599 Constant *RHS = cast<Constant>(Cmp.getOperand(1));
3600 Value *BOp0 = BO->getOperand(0), *BOp1 = BO->getOperand(1);
3601
3602 switch (BO->getOpcode()) {
3603 case Instruction::SRem:
3604 // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
3605 if (C.isZero() && BO->hasOneUse()) {
3606 const APInt *BOC;
3607 if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
3608 Value *NewRem = Builder.CreateURem(BOp0, BOp1, BO->getName());
3609 return new ICmpInst(Pred, NewRem,
3611 }
3612 }
3613 break;
3614 case Instruction::Add: {
3615 // (A + C2) == C --> A == (C - C2)
3616 // (A + C2) != C --> A != (C - C2)
3617 // TODO: Remove the one-use limitation? See discussion in D58633.
3618 if (Constant *C2 = dyn_cast<Constant>(BOp1)) {
3619 if (BO->hasOneUse())
3620 return new ICmpInst(Pred, BOp0, ConstantExpr::getSub(RHS, C2));
3621 } else if (C.isZero()) {
3622 // Replace ((add A, B) != 0) with (A != -B) if A or B is
3623 // efficiently invertible, or if the add has just this one use.
3624 if (Value *NegVal = dyn_castNegVal(BOp1))
3625 return new ICmpInst(Pred, BOp0, NegVal);
3626 if (Value *NegVal = dyn_castNegVal(BOp0))
3627 return new ICmpInst(Pred, NegVal, BOp1);
3628 if (BO->hasOneUse()) {
3629 // (add nuw A, B) != 0 -> (or A, B) != 0
3630 if (match(BO, m_NUWAdd(m_Value(), m_Value()))) {
3631 Value *Or = Builder.CreateOr(BOp0, BOp1);
3632 return new ICmpInst(Pred, Or, Constant::getNullValue(BO->getType()));
3633 }
3634 Value *Neg = Builder.CreateNeg(BOp1);
3635 Neg->takeName(BO);
3636 return new ICmpInst(Pred, BOp0, Neg);
3637 }
3638 }
3639 break;
3640 }
3641 case Instruction::Xor:
3642 if (Constant *BOC = dyn_cast<Constant>(BOp1)) {
3643 // For the xor case, we can xor two constants together, eliminating
3644 // the explicit xor.
3645 return new ICmpInst(Pred, BOp0, ConstantExpr::getXor(RHS, BOC));
3646 } else if (C.isZero()) {
3647 // Replace ((xor A, B) != 0) with (A != B)
3648 return new ICmpInst(Pred, BOp0, BOp1);
3649 }
3650 break;
3651 case Instruction::Or: {
3652 const APInt *BOC;
3653 if (match(BOp1, m_APInt(BOC)) && BO->hasOneUse() && RHS->isAllOnesValue()) {
3654 // Comparing if all bits outside of a constant mask are set?
3655 // Replace (X | C) == -1 with (X & ~C) == ~C.
3656 // This removes the -1 constant.
3658 Value *And = Builder.CreateAnd(BOp0, NotBOC);
3659 return new ICmpInst(Pred, And, NotBOC);
3660 }
3661 // (icmp eq (or (select cond, 0, NonZero), Other), 0)
3662 // -> (and cond, (icmp eq Other, 0))
3663 // (icmp ne (or (select cond, NonZero, 0), Other), 0)
3664 // -> (or cond, (icmp ne Other, 0))
3665 Value *Cond, *TV, *FV, *Other, *Sel;
3666 if (C.isZero() &&
3667 match(BO,
3670 m_Value(FV))),
3671 m_Value(Other)))) &&
3672 Cond->getType() == Cmp.getType()) {
3673 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
3674 // Easy case is if eq/ne matches whether 0 is trueval/falseval.
3675 if (Pred == ICmpInst::ICMP_EQ
3676 ? (match(TV, m_Zero()) && isKnownNonZero(FV, Q))
3677 : (match(FV, m_Zero()) && isKnownNonZero(TV, Q))) {
3678 Value *Cmp = Builder.CreateICmp(
3679 Pred, Other, Constant::getNullValue(Other->getType()));
3681 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3682 Cond);
3683 }
3684 // Harder case is if eq/ne matches whether 0 is falseval/trueval. In this
3685 // case we need to invert the select condition so we need to be careful to
3686 // avoid creating extra instructions.
3687 // (icmp ne (or (select cond, 0, NonZero), Other), 0)
3688 // -> (or (not cond), (icmp ne Other, 0))
3689 // (icmp eq (or (select cond, NonZero, 0), Other), 0)
3690 // -> (and (not cond), (icmp eq Other, 0))
3691 //
3692 // Only do this if the inner select has one use, in which case we are
3693 // replacing `select` with `(not cond)`. Otherwise, we will create more
3694 // uses. NB: Trying to freely invert cond doesn't make sense here, as if
3695 // cond was freely invertable, the select arms would have been inverted.
3696 if (Sel->hasOneUse() &&
3697 (Pred == ICmpInst::ICMP_EQ
3698 ? (match(FV, m_Zero()) && isKnownNonZero(TV, Q))
3699 : (match(TV, m_Zero()) && isKnownNonZero(FV, Q)))) {
3700 Value *NotCond = Builder.CreateNot(Cond);
3701 Value *Cmp = Builder.CreateICmp(
3702 Pred, Other, Constant::getNullValue(Other->getType()));
3704 Pred == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or, Cmp,
3705 NotCond);
3706 }
3707 }
3708 break;
3709 }
3710 case Instruction::UDiv:
3711 case Instruction::SDiv:
3712 if (BO->isExact()) {
3713 // div exact X, Y eq/ne 0 -> X eq/ne 0
3714 // div exact X, Y eq/ne 1 -> X eq/ne Y
3715 // div exact X, Y eq/ne C ->
3716 // if Y * C never-overflow && OneUse:
3717 // -> Y * C eq/ne X
3718 if (C.isZero())
3719 return new ICmpInst(Pred, BOp0, Constant::getNullValue(BO->getType()));
3720 else if (C.isOne())
3721 return new ICmpInst(Pred, BOp0, BOp1);
3722 else if (BO->hasOneUse()) {
3724 Instruction::Mul, BO->getOpcode() == Instruction::SDiv, BOp1,
3725 Cmp.getOperand(1), BO);
3727 Value *YC =
3728 Builder.CreateMul(BOp1, ConstantInt::get(BO->getType(), C));
3729 return new ICmpInst(Pred, YC, BOp0);
3730 }
3731 }
3732 }
3733 if (BO->getOpcode() == Instruction::UDiv && C.isZero()) {
3734 // (icmp eq/ne (udiv A, B), 0) -> (icmp ugt/ule i32 B, A)
3735 auto NewPred = isICMP_NE ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_UGT;
3736 return new ICmpInst(NewPred, BOp1, BOp0);
3737 }
3738 break;
3739 default:
3740 break;
3741 }
3742 return nullptr;
3743}
3744
3746 const APInt &CRhs,
3747 InstCombiner::BuilderTy &Builder,
3748 const SimplifyQuery &Q) {
3749 assert(CtpopLhs->getIntrinsicID() == Intrinsic::ctpop &&
3750 "Non-ctpop intrin in ctpop fold");
3751 if (!CtpopLhs->hasOneUse())
3752 return nullptr;
3753
3754 // Power of 2 test:
3755 // isPow2OrZero : ctpop(X) u< 2
3756 // isPow2 : ctpop(X) == 1
3757 // NotPow2OrZero: ctpop(X) u> 1
3758 // NotPow2 : ctpop(X) != 1
3759 // If we know any bit of X can be folded to:
3760 // IsPow2 : X & (~Bit) == 0
3761 // NotPow2 : X & (~Bit) != 0
3762 const ICmpInst::Predicate Pred = I.getPredicate();
3763 if (((I.isEquality() || Pred == ICmpInst::ICMP_UGT) && CRhs == 1) ||
3764 (Pred == ICmpInst::ICMP_ULT && CRhs == 2)) {
3765 Value *Op = CtpopLhs->getArgOperand(0);
3766 KnownBits OpKnown = computeKnownBits(Op, Q.DL, Q.AC, Q.CxtI, Q.DT);
3767 // No need to check for count > 1, that should be already constant folded.
3768 if (OpKnown.countMinPopulation() == 1) {
3769 Value *And = Builder.CreateAnd(
3770 Op, Constant::getIntegerValue(Op->getType(), ~(OpKnown.One)));
3771 return new ICmpInst(
3772 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_ULT)
3775 And, Constant::getNullValue(Op->getType()));
3776 }
3777 }
3778
3779 return nullptr;
3780}
3781
3782/// Fold an equality icmp with LLVM intrinsic and constant operand.
3784 ICmpInst &Cmp, IntrinsicInst *II, const APInt &C) {
3785 Type *Ty = II->getType();
3786 unsigned BitWidth = C.getBitWidth();
3787 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3788
3789 switch (II->getIntrinsicID()) {
3790 case Intrinsic::abs:
3791 // abs(A) == 0 -> A == 0
3792 // abs(A) == INT_MIN -> A == INT_MIN
3793 if (C.isZero() || C.isMinSignedValue())
3794 return new ICmpInst(Pred, II->getArgOperand(0), ConstantInt::get(Ty, C));
3795 break;
3796
3797 case Intrinsic::bswap:
3798 // bswap(A) == C -> A == bswap(C)
3799 return new ICmpInst(Pred, II->getArgOperand(0),
3800 ConstantInt::get(Ty, C.byteSwap()));
3801
3802 case Intrinsic::bitreverse:
3803 // bitreverse(A) == C -> A == bitreverse(C)
3804 return new ICmpInst(Pred, II->getArgOperand(0),
3805 ConstantInt::get(Ty, C.reverseBits()));
3806
3807 case Intrinsic::ctlz:
3808 case Intrinsic::cttz: {
3809 // ctz(A) == bitwidth(A) -> A == 0 and likewise for !=
3810 if (C == BitWidth)
3811 return new ICmpInst(Pred, II->getArgOperand(0),
3813
3814 // ctz(A) == C -> A & Mask1 == Mask2, where Mask2 only has bit C set
3815 // and Mask1 has bits 0..C+1 set. Similar for ctl, but for high bits.
3816 // Limit to one use to ensure we don't increase instruction count.
3817 unsigned Num = C.getLimitedValue(BitWidth);
3818 if (Num != BitWidth && II->hasOneUse()) {
3819 bool IsTrailing = II->getIntrinsicID() == Intrinsic::cttz;
3820 APInt Mask1 = IsTrailing ? APInt::getLowBitsSet(BitWidth, Num + 1)
3821 : APInt::getHighBitsSet(BitWidth, Num + 1);
3822 APInt Mask2 = IsTrailing
3825 return new ICmpInst(Pred, Builder.CreateAnd(II->getArgOperand(0), Mask1),
3826 ConstantInt::get(Ty, Mask2));
3827 }
3828 break;
3829 }
3830
3831 case Intrinsic::ctpop: {
3832 // popcount(A) == 0 -> A == 0 and likewise for !=
3833 // popcount(A) == bitwidth(A) -> A == -1 and likewise for !=
3834 bool IsZero = C.isZero();
3835 if (IsZero || C == BitWidth)
3836 return new ICmpInst(Pred, II->getArgOperand(0),
3837 IsZero ? Constant::getNullValue(Ty)
3839
3840 break;
3841 }
3842
3843 case Intrinsic::fshl:
3844 case Intrinsic::fshr:
3845 if (II->getArgOperand(0) == II->getArgOperand(1)) {
3846 const APInt *RotAmtC;
3847 // ror(X, RotAmtC) == C --> X == rol(C, RotAmtC)
3848 // rol(X, RotAmtC) == C --> X == ror(C, RotAmtC)
3849 if (match(II->getArgOperand(2), m_APInt(RotAmtC)))
3850 return new ICmpInst(Pred, II->getArgOperand(0),
3851 II->getIntrinsicID() == Intrinsic::fshl
3852 ? ConstantInt::get(Ty, C.rotr(*RotAmtC))
3853 : ConstantInt::get(Ty, C.rotl(*RotAmtC)));
3854 }
3855 break;
3856
3857 case Intrinsic::umax:
3858 case Intrinsic::uadd_sat: {
3859 // uadd.sat(a, b) == 0 -> (a | b) == 0
3860 // umax(a, b) == 0 -> (a | b) == 0
3861 if (C.isZero() && II->hasOneUse()) {
3862 Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1));
3863 return new ICmpInst(Pred, Or, Constant::getNullValue(Ty));
3864 }
3865 break;
3866 }
3867
3868 case Intrinsic::ssub_sat:
3869 // ssub.sat(a, b) == 0 -> a == b
3870 //
3871 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
3872 // (because 1 saturates to 0). Just skip the optimization for i1.
3873 if (C.isZero() && II->getType()->getScalarSizeInBits() > 1)
3874 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
3875 break;
3876 case Intrinsic::usub_sat: {
3877 // usub.sat(a, b) == 0 -> a <= b
3878 if (C.isZero()) {
3879 ICmpInst::Predicate NewPred =
3881 return new ICmpInst(NewPred, II->getArgOperand(0), II->getArgOperand(1));
3882 }
3883 break;
3884 }
3885 default:
3886 break;
3887 }
3888
3889 return nullptr;
3890}
3891
3892/// Fold an icmp with LLVM intrinsics
3893static Instruction *
3895 InstCombiner::BuilderTy &Builder) {
3896 assert(Cmp.isEquality());
3897
3898 ICmpInst::Predicate Pred = Cmp.getPredicate();
3899 Value *Op0 = Cmp.getOperand(0);
3900 Value *Op1 = Cmp.getOperand(1);
3901 const auto *IIOp0 = dyn_cast<IntrinsicInst>(Op0);
3902 const auto *IIOp1 = dyn_cast<IntrinsicInst>(Op1);
3903 if (!IIOp0 || !IIOp1 || IIOp0->getIntrinsicID() != IIOp1->getIntrinsicID())
3904 return nullptr;
3905
3906 switch (IIOp0->getIntrinsicID()) {
3907 case Intrinsic::bswap:
3908 case Intrinsic::bitreverse:
3909 // If both operands are byte-swapped or bit-reversed, just compare the
3910 // original values.
3911 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3912 case Intrinsic::fshl:
3913 case Intrinsic::fshr: {
3914 // If both operands are rotated by same amount, just compare the
3915 // original values.
3916 if (IIOp0->getOperand(0) != IIOp0->getOperand(1))
3917 break;
3918 if (IIOp1->getOperand(0) != IIOp1->getOperand(1))
3919 break;
3920 if (IIOp0->getOperand(2) == IIOp1->getOperand(2))
3921 return new ICmpInst(Pred, IIOp0->getOperand(0), IIOp1->getOperand(0));
3922
3923 // rotate(X, AmtX) == rotate(Y, AmtY)
3924 // -> rotate(X, AmtX - AmtY) == Y
3925 // Do this if either both rotates have one use or if only one has one use
3926 // and AmtX/AmtY are constants.
3927 unsigned OneUses = IIOp0->hasOneUse() + IIOp1->hasOneUse();
3928 if (OneUses == 2 ||
3929 (OneUses == 1 && match(IIOp0->getOperand(2), m_ImmConstant()) &&
3930 match(IIOp1->getOperand(2), m_ImmConstant()))) {
3931 Value *SubAmt =
3932 Builder.CreateSub(IIOp0->getOperand(2), IIOp1->getOperand(2));
3933 Value *CombinedRotate = Builder.CreateIntrinsic(
3934 Op0->getType(), IIOp0->getIntrinsicID(),
3935 {IIOp0->getOperand(0), IIOp0->getOperand(0), SubAmt});
3936 return new ICmpInst(Pred, IIOp1->getOperand(0), CombinedRotate);
3937 }
3938 } break;
3939 default:
3940 break;
3941 }
3942
3943 return nullptr;
3944}
3945
3946/// Try to fold integer comparisons with a constant operand: icmp Pred X, C
3947/// where X is some kind of instruction and C is AllowPoison.
3948/// TODO: Move more folds which allow poison to this function.
3951 const APInt &C) {
3952 const ICmpInst::Predicate Pred = Cmp.getPredicate();
3953 if (auto *II = dyn_cast<IntrinsicInst>(Cmp.getOperand(0))) {
3954 switch (II->getIntrinsicID()) {
3955 default:
3956 break;
3957 case Intrinsic::fshl:
3958 case Intrinsic::fshr:
3959 if (Cmp.isEquality() && II->getArgOperand(0) == II->getArgOperand(1)) {
3960 // (rot X, ?) == 0/-1 --> X == 0/-1
3961 if (C.isZero() || C.isAllOnes())
3962 return new ICmpInst(Pred, II->getArgOperand(0), Cmp.getOperand(1));
3963 }
3964 break;
3965 }
3966 }
3967
3968 return nullptr;
3969}
3970
3971/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
3973 BinaryOperator *BO,
3974 const APInt &C) {
3975 switch (BO->getOpcode()) {
3976 case Instruction::Xor:
3977 if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
3978 return I;
3979 break;
3980 case Instruction::And:
3981 if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
3982 return I;
3983 break;
3984 case Instruction::Or:
3985 if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
3986 return I;
3987 break;
3988 case Instruction::Mul:
3989 if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
3990 return I;
3991 break;
3992 case Instruction::Shl:
3993 if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
3994 return I;
3995 break;
3996 case Instruction::LShr:
3997 case Instruction::AShr:
3998 if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
3999 return I;
4000 break;
4001 case Instruction::SRem:
4002 if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
4003 return I;
4004 break;
4005 case Instruction::UDiv:
4006 if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
4007 return I;
4008 [[fallthrough]];
4009 case Instruction::SDiv:
4010 if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
4011 return I;
4012 break;
4013 case Instruction::Sub:
4014 if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
4015 return I;
4016 break;
4017 case Instruction::Add:
4018 if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
4019 return I;
4020 break;
4021 default:
4022 break;
4023 }
4024
4025 // TODO: These folds could be refactored to be part of the above calls.
4027 return I;
4028
4029 // Fall back to handling `icmp pred (select A ? C1 : C2) binop (select B ? C3
4030 // : C4), C5` pattern, by computing a truth table of the four constant
4031 // variants.
4033}
4034
4035static Instruction *
4037 const APInt &C,
4038 InstCombiner::BuilderTy &Builder) {
4039 // This transform may end up producing more than one instruction for the
4040 // intrinsic, so limit it to one user of the intrinsic.
4041 if (!II->hasOneUse())
4042 return nullptr;
4043
4044 // Let Y = [add/sub]_sat(X, C) pred C2
4045 // SatVal = The saturating value for the operation
4046 // WillWrap = Whether or not the operation will underflow / overflow
4047 // => Y = (WillWrap ? SatVal : (X binop C)) pred C2
4048 // => Y = WillWrap ? (SatVal pred C2) : ((X binop C) pred C2)
4049 //
4050 // When (SatVal pred C2) is true, then
4051 // Y = WillWrap ? true : ((X binop C) pred C2)
4052 // => Y = WillWrap || ((X binop C) pred C2)
4053 // else
4054 // Y = WillWrap ? false : ((X binop C) pred C2)
4055 // => Y = !WillWrap ? ((X binop C) pred C2) : false
4056 // => Y = !WillWrap && ((X binop C) pred C2)
4057 Value *Op0 = II->getOperand(0);
4058 Value *Op1 = II->getOperand(1);
4059
4060 const APInt *COp1;
4061 // This transform only works when the intrinsic has an integral constant or
4062 // splat vector as the second operand.
4063 if (!match(Op1, m_APInt(COp1)))
4064 return nullptr;
4065
4066 APInt SatVal;
4067 switch (II->getIntrinsicID()) {
4068 default:
4070 "This function only works with usub_sat and uadd_sat for now!");
4071 case Intrinsic::uadd_sat:
4072 SatVal = APInt::getAllOnes(C.getBitWidth());
4073 break;
4074 case Intrinsic::usub_sat:
4075 SatVal = APInt::getZero(C.getBitWidth());
4076 break;
4077 }
4078
4079 // Check (SatVal pred C2)
4080 bool SatValCheck = ICmpInst::compare(SatVal, C, Pred);
4081
4082 // !WillWrap.
4084 II->getBinaryOp(), *COp1, II->getNoWrapKind());
4085
4086 // WillWrap.
4087 if (SatValCheck)
4088 C1 = C1.inverse();
4089
4091 if (II->getBinaryOp() == Instruction::Add)
4092 C2 = C2.sub(*COp1);
4093 else
4094 C2 = C2.add(*COp1);
4095
4096 Instruction::BinaryOps CombiningOp =
4097 SatValCheck ? Instruction::BinaryOps::Or : Instruction::BinaryOps::And;
4098
4099 std::optional<ConstantRange> Combination;
4100 if (CombiningOp == Instruction::BinaryOps::Or)
4101 Combination = C1.exactUnionWith(C2);
4102 else /* CombiningOp == Instruction::BinaryOps::And */
4103 Combination = C1.exactIntersectWith(C2);
4104
4105 if (!Combination)
4106 return nullptr;
4107
4108 CmpInst::Predicate EquivPred;
4109 APInt EquivInt;
4110 APInt EquivOffset;
4111
4112 Combination->getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
4113
4114 return new ICmpInst(
4115 EquivPred,
4116 Builder.CreateAdd(Op0, ConstantInt::get(Op1->getType(), EquivOffset)),
4117 ConstantInt::get(Op1->getType(), EquivInt));
4118}
4119
4120static Instruction *
4122 const APInt &C,
4123 InstCombiner::BuilderTy &Builder) {
4124 std::optional<ICmpInst::Predicate> NewPredicate = std::nullopt;
4125 switch (Pred) {
4126 case ICmpInst::ICMP_EQ:
4127 case ICmpInst::ICMP_NE:
4128 if (C.isZero())
4129 NewPredicate = Pred;
4130 else if (C.isOne())
4131 NewPredicate =
4133 else if (C.isAllOnes())
4134 NewPredicate =
4136 break;
4137
4138 case ICmpInst::ICMP_SGT:
4139 if (C.isAllOnes())
4140 NewPredicate = ICmpInst::ICMP_UGE;
4141 else if (C.isZero())
4142 NewPredicate = ICmpInst::ICMP_UGT;
4143 break;
4144
4145 case ICmpInst::ICMP_SLT:
4146 if (C.isZero())
4147 NewPredicate = ICmpInst::ICMP_ULT;
4148 else if (C.isOne())
4149 NewPredicate = ICmpInst::ICMP_ULE;
4150 break;
4151
4152 case ICmpInst::ICMP_ULT:
4153 if (C.ugt(1))
4154 NewPredicate = ICmpInst::ICMP_UGE;
4155 break;
4156
4157 case ICmpInst::ICMP_UGT:
4158 if (!C.isZero() && !C.isAllOnes())
4159 NewPredicate = ICmpInst::ICMP_ULT;
4160 break;
4161
4162 default:
4163 break;
4164 }
4165
4166 if (!NewPredicate)
4167 return nullptr;
4168
4169 if (I->getIntrinsicID() == Intrinsic::scmp)
4170 NewPredicate = ICmpInst::getSignedPredicate(*NewPredicate);
4171 Value *LHS = I->getOperand(0);
4172 Value *RHS = I->getOperand(1);
4173 return new ICmpInst(*NewPredicate, LHS, RHS);
4174}
4175
4176/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
4179 const APInt &C) {
4180 ICmpInst::Predicate Pred = Cmp.getPredicate();
4181
4182 // Handle folds that apply for any kind of icmp.
4183 switch (II->getIntrinsicID()) {
4184 default:
4185 break;
4186 case Intrinsic::uadd_sat:
4187 case Intrinsic::usub_sat:
4188 if (auto *Folded = foldICmpUSubSatOrUAddSatWithConstant(
4189 Pred, cast<SaturatingInst>(II), C, Builder))
4190 return Folded;
4191 break;
4192 case Intrinsic::ctpop: {
4193 const SimplifyQuery Q = SQ.getWithInstruction(&Cmp);
4194 if (Instruction *R = foldCtpopPow2Test(Cmp, II, C, Builder, Q))
4195 return R;
4196 } break;
4197 case Intrinsic::scmp:
4198 case Intrinsic::ucmp:
4199 if (auto *Folded = foldICmpOfCmpIntrinsicWithConstant(Pred, II, C, Builder))
4200 return Folded;
4201 break;
4202 }
4203
4204 if (Cmp.isEquality())
4205 return foldICmpEqIntrinsicWithConstant(Cmp, II, C);
4206
4207 Type *Ty = II->getType();
4208 unsigned BitWidth = C.getBitWidth();
4209 switch (II->getIntrinsicID()) {
4210 case Intrinsic::ctpop: {
4211 // (ctpop X > BitWidth - 1) --> X == -1
4212 Value *X = II->getArgOperand(0);
4213 if (C == BitWidth - 1 && Pred == ICmpInst::ICMP_UGT)
4214 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, X,
4216 // (ctpop X < BitWidth) --> X != -1
4217 if (C == BitWidth && Pred == ICmpInst::ICMP_ULT)
4218 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE, X,
4220 break;
4221 }
4222 case Intrinsic::ctlz: {
4223 // ctlz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX < 0b00010000
4224 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4225 unsigned Num = C.getLimitedValue();
4226 APInt Limit = APInt::getOneBitSet(BitWidth, BitWidth - Num - 1);
4227 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_ULT,
4228 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4229 }
4230
4231 // ctlz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX > 0b00011111
4232 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4233 unsigned Num = C.getLimitedValue();
4235 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_UGT,
4236 II->getArgOperand(0), ConstantInt::get(Ty, Limit));
4237 }
4238 break;
4239 }
4240 case Intrinsic::cttz: {
4241 // Limit to one use to ensure we don't increase instruction count.
4242 if (!II->hasOneUse())
4243 return nullptr;
4244
4245 // cttz(0bXXXXXXXX) > 3 -> 0bXXXXXXXX & 0b00001111 == 0
4246 if (Pred == ICmpInst::ICMP_UGT && C.ult(BitWidth)) {
4247 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue() + 1);
4248 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ,
4249 Builder.CreateAnd(II->getArgOperand(0), Mask),
4251 }
4252
4253 // cttz(0bXXXXXXXX) < 3 -> 0bXXXXXXXX & 0b00000111 != 0
4254 if (Pred == ICmpInst::ICMP_ULT && C.uge(1) && C.ule(BitWidth)) {
4255 APInt Mask = APInt::getLowBitsSet(BitWidth, C.getLimitedValue());
4256 return CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_NE,
4257 Builder.CreateAnd(II->getArgOperand(0), Mask),
4259 }
4260 break;
4261 }
4262 case Intrinsic::ssub_sat:
4263 // ssub.sat(a, b) spred 0 -> a spred b
4264 //
4265 // Note this doesn't work for ssub.sat.i1 because ssub.sat.i1 0, -1 = 0
4266 // (because 1 saturates to 0). Just skip the optimization for i1.
4267 if (ICmpInst::isSigned(Pred) && C.getBitWidth() > 1) {
4268 if (C.isZero())
4269 return new ICmpInst(Pred, II->getArgOperand(0), II->getArgOperand(1));
4270 // X s<= 0 is cannonicalized to X s< 1
4271 if (Pred == ICmpInst::ICMP_SLT && C.isOne())
4272 return new ICmpInst(ICmpInst::ICMP_SLE, II->getArgOperand(0),
4273 II->getArgOperand(1));
4274 // X s>= 0 is cannonicalized to X s> -1
4275 if (Pred == ICmpInst::ICMP_SGT && C.isAllOnes())
4276 return new ICmpInst(ICmpInst::ICMP_SGE, II->getArgOperand(0),
4277 II->getArgOperand(1));
4278 }
4279 break;
4280 case Intrinsic::abs: {
4281 if (!II->hasOneUse())
4282 return nullptr;
4283
4284 Value *X = II->getArgOperand(0);
4285 bool IsIntMinPoison =
4286 cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
4287
4288 // If C >= 0:
4289 // abs(X) u> C --> X + C u> 2 * C
4290 if (Pred == CmpInst::ICMP_UGT && C.isNonNegative()) {
4291 return new ICmpInst(ICmpInst::ICMP_UGT,
4292 Builder.CreateAdd(X, ConstantInt::get(Ty, C)),
4293 ConstantInt::get(Ty, 2 * C));
4294 }
4295
4296 // If abs(INT_MIN) is poison and C >= 1:
4297 // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
4298 if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
4299 return new ICmpInst(ICmpInst::ICMP_ULE,
4300 Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
4301 ConstantInt::get(Ty, 2 * (C - 1)));
4302 }
4303
4304 break;
4305 }
4306 default:
4307 break;
4308 }
4309
4310 return nullptr;
4311}
4312
4313/// Handle icmp with constant (but not simple integer constant) RHS.
4315 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4316 Constant *RHSC = dyn_cast<Constant>(Op1);
4318 if (!RHSC || !LHSI)
4319 return nullptr;
4320
4321 switch (LHSI->getOpcode()) {
4322 case Instruction::IntToPtr:
4323 // icmp pred inttoptr(X), null -> icmp pred X, 0
4324 if (RHSC->isNullValue() &&
4325 DL.getIntPtrType(RHSC->getType()) == LHSI->getOperand(0)->getType())
4326 return new ICmpInst(
4327 I.getPredicate(), LHSI->getOperand(0),
4329 break;
4330
4331 case Instruction::Load:
4332 // Try to optimize things like "A[i] > 4" to index computations.
4333 if (GetElementPtrInst *GEP =
4335 if (Instruction *Res =
4337 return Res;
4338 break;
4339 }
4340
4341 return nullptr;
4342}
4343
4345 Value *RHS, const ICmpInst &I) {
4346 // Try to fold the comparison into the select arms, which will cause the
4347 // select to be converted into a logical and/or.
4348 auto SimplifyOp = [&](Value *Op, bool SelectCondIsTrue) -> Value * {
4349 if (Value *Res = simplifyICmpInst(Pred, Op, RHS, SQ))
4350 return Res;
4351 if (std::optional<bool> Impl = isImpliedCondition(
4352 SI->getCondition(), Pred, Op, RHS, DL, SelectCondIsTrue))
4353 return ConstantInt::get(I.getType(), *Impl);
4354 return nullptr;
4355 };
4356
4357 ConstantInt *CI = nullptr;
4358 Value *Op1 = SimplifyOp(SI->getOperand(1), true);
4359 if (Op1)
4360 CI = dyn_cast<ConstantInt>(Op1);
4361
4362 Value *Op2 = SimplifyOp(SI->getOperand(2), false);
4363 if (Op2)
4364 CI = dyn_cast<ConstantInt>(Op2);
4365
4366 auto Simplifies = [&](Value *Op, unsigned Idx) {
4367 // A comparison of ucmp/scmp with a constant will fold into an icmp.
4368 const APInt *Dummy;
4369 return Op ||
4370 (isa<CmpIntrinsic>(SI->getOperand(Idx)) &&
4371 SI->getOperand(Idx)->hasOneUse() && match(RHS, m_APInt(Dummy)));
4372 };
4373
4374 // We only want to perform this transformation if it will not lead to
4375 // additional code. This is true if either both sides of the select
4376 // fold to a constant (in which case the icmp is replaced with a select
4377 // which will usually simplify) or this is the only user of the
4378 // select (in which case we are trading a select+icmp for a simpler
4379 // select+icmp) or all uses of the select can be replaced based on
4380 // dominance information ("Global cases").
4381 bool Transform = false;
4382 if (Op1 && Op2)
4383 Transform = true;
4384 else if (Simplifies(Op1, 1) || Simplifies(Op2, 2)) {
4385 // Local case
4386 if (SI->hasOneUse())
4387 Transform = true;
4388 // Global cases
4389 else if (CI && !CI->isZero())
4390 // When Op1 is constant try replacing select with second operand.
4391 // Otherwise Op2 is constant and try replacing select with first
4392 // operand.
4393 Transform = replacedSelectWithOperand(SI, &I, Op1 ? 2 : 1);
4394 }
4395 if (Transform) {
4396 if (!Op1)
4397 Op1 = Builder.CreateICmp(Pred, SI->getOperand(1), RHS, I.getName());
4398 if (!Op2)
4399 Op2 = Builder.CreateICmp(Pred, SI->getOperand(2), RHS, I.getName());
4400 return SelectInst::Create(SI->getOperand(0), Op1, Op2, "", nullptr,
4401 ProfcheckDisableMetadataFixes ? nullptr : SI);
4402 }
4403
4404 return nullptr;
4405}
4406
4407// Returns whether V is a Mask ((X + 1) & X == 0) or ~Mask (-Pow2OrZero)
4408static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q,
4409 unsigned Depth = 0) {
4410 if (Not ? match(V, m_NegatedPower2OrZero()) : match(V, m_LowBitMaskOrZero()))
4411 return true;
4412 if (V->getType()->getScalarSizeInBits() == 1)
4413 return true;
4415 return false;
4416 Value *X;
4418 if (!I)
4419 return false;
4420 switch (I->getOpcode()) {
4421 case Instruction::ZExt:
4422 // ZExt(Mask) is a Mask.
4423 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4424 case Instruction::SExt:
4425 // SExt(Mask) is a Mask.
4426 // SExt(~Mask) is a ~Mask.
4427 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4428 case Instruction::And:
4429 case Instruction::Or:
4430 // Mask0 | Mask1 is a Mask.
4431 // Mask0 & Mask1 is a Mask.
4432 // ~Mask0 | ~Mask1 is a ~Mask.
4433 // ~Mask0 & ~Mask1 is a ~Mask.
4434 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4435 isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4436 case Instruction::Xor:
4437 if (match(V, m_Not(m_Value(X))))
4438 return isMaskOrZero(X, !Not, Q, Depth);
4439
4440 // (X ^ -X) is a ~Mask
4441 if (Not)
4442 return match(V, m_c_Xor(m_Value(X), m_Neg(m_Deferred(X))));
4443 // (X ^ (X - 1)) is a Mask
4444 else
4445 return match(V, m_c_Xor(m_Value(X), m_Add(m_Deferred(X), m_AllOnes())));
4446 case Instruction::Select:
4447 // c ? Mask0 : Mask1 is a Mask.
4448 return isMaskOrZero(I->getOperand(1), Not, Q, Depth) &&
4449 isMaskOrZero(I->getOperand(2), Not, Q, Depth);
4450 case Instruction::Shl:
4451 // (~Mask) << X is a ~Mask.
4452 return Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4453 case Instruction::LShr:
4454 // Mask >> X is a Mask.
4455 return !Not && isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4456 case Instruction::AShr:
4457 // Mask s>> X is a Mask.
4458 // ~Mask s>> X is a ~Mask.
4459 return isMaskOrZero(I->getOperand(0), Not, Q, Depth);
4460 case Instruction::Add:
4461 // Pow2 - 1 is a Mask.
4462 if (!Not && match(I->getOperand(1), m_AllOnes()))
4463 return isKnownToBeAPowerOfTwo(I->getOperand(0), Q.DL, /*OrZero*/ true,
4464 Q.AC, Q.CxtI, Q.DT, Depth);
4465 break;
4466 case Instruction::Sub:
4467 // -Pow2 is a ~Mask.
4468 if (Not && match(I->getOperand(0), m_Zero()))
4469 return isKnownToBeAPowerOfTwo(I->getOperand(1), Q.DL, /*OrZero*/ true,
4470 Q.AC, Q.CxtI, Q.DT, Depth);
4471 break;
4472 case Instruction::Call: {
4473 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
4474 switch (II->getIntrinsicID()) {
4475 // min/max(Mask0, Mask1) is a Mask.
4476 // min/max(~Mask0, ~Mask1) is a ~Mask.
4477 case Intrinsic::umax:
4478 case Intrinsic::smax:
4479 case Intrinsic::umin:
4480 case Intrinsic::smin:
4481 return isMaskOrZero(II->getArgOperand(1), Not, Q, Depth) &&
4482 isMaskOrZero(II->getArgOperand(0), Not, Q, Depth);
4483
4484 // In the context of masks, bitreverse(Mask) == ~Mask
4485 case Intrinsic::bitreverse:
4486 return isMaskOrZero(II->getArgOperand(0), !Not, Q, Depth);
4487 default:
4488 break;
4489 }
4490 }
4491 break;
4492 }
4493 default:
4494 break;
4495 }
4496 return false;
4497}
4498
4499/// Some comparisons can be simplified.
4500/// In this case, we are looking for comparisons that look like
4501/// a check for a lossy truncation.
4502/// Folds:
4503/// icmp SrcPred (x & Mask), x to icmp DstPred x, Mask
4504/// icmp SrcPred (x & ~Mask), ~Mask to icmp DstPred x, ~Mask
4505/// icmp eq/ne (x & ~Mask), 0 to icmp DstPred x, Mask
4506/// icmp eq/ne (~x | Mask), -1 to icmp DstPred x, Mask
4507/// Where Mask is some pattern that produces all-ones in low bits:
4508/// (-1 >> y)
4509/// ((-1 << y) >> y) <- non-canonical, has extra uses
4510/// ~(-1 << y)
4511/// ((1 << y) + (-1)) <- non-canonical, has extra uses
4512/// The Mask can be a constant, too.
4513/// For some predicates, the operands are commutative.
4514/// For others, x can only be on a specific side.
4516 Value *Op1, const SimplifyQuery &Q,
4517 InstCombiner &IC) {
4518
4519 ICmpInst::Predicate DstPred;
4520 switch (Pred) {
4522 // x & Mask == x
4523 // x & ~Mask == 0
4524 // ~x | Mask == -1
4525 // -> x u<= Mask
4526 // x & ~Mask == ~Mask
4527 // -> ~Mask u<= x
4529 break;
4531 // x & Mask != x
4532 // x & ~Mask != 0
4533 // ~x | Mask != -1
4534 // -> x u> Mask
4535 // x & ~Mask != ~Mask
4536 // -> ~Mask u> x
4538 break;
4540 // x & Mask u< x
4541 // -> x u> Mask
4542 // x & ~Mask u< ~Mask
4543 // -> ~Mask u> x
4545 break;
4547 // x & Mask u>= x
4548 // -> x u<= Mask
4549 // x & ~Mask u>= ~Mask
4550 // -> ~Mask u<= x
4552 break;
4554 // x & Mask s< x [iff Mask s>= 0]
4555 // -> x s> Mask
4556 // x & ~Mask s< ~Mask [iff ~Mask != 0]
4557 // -> ~Mask s> x
4559 break;
4561 // x & Mask s>= x [iff Mask s>= 0]
4562 // -> x s<= Mask
4563 // x & ~Mask s>= ~Mask [iff ~Mask != 0]
4564 // -> ~Mask s<= x
4566 break;
4567 default:
4568 // We don't support sgt,sle
4569 // ult/ugt are simplified to true/false respectively.
4570 return nullptr;
4571 }
4572
4573 Value *X, *M;
4574 // Put search code in lambda for early positive returns.
4575 auto IsLowBitMask = [&]() {
4576 if (match(Op0, m_c_And(m_Specific(Op1), m_Value(M)))) {
4577 X = Op1;
4578 // Look for: x & Mask pred x
4579 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4580 return !ICmpInst::isSigned(Pred) ||
4581 (match(M, m_NonNegative()) || isKnownNonNegative(M, Q));
4582 }
4583
4584 // Look for: x & ~Mask pred ~Mask
4585 if (isMaskOrZero(X, /*Not=*/true, Q)) {
4586 return !ICmpInst::isSigned(Pred) || isKnownNonZero(X, Q);
4587 }
4588 return false;
4589 }
4590 if (ICmpInst::isEquality(Pred) && match(Op1, m_AllOnes()) &&
4591 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(M))))) {
4592
4593 auto Check = [&]() {
4594 // Look for: ~x | Mask == -1
4595 if (isMaskOrZero(M, /*Not=*/false, Q)) {
4596 if (Value *NotX =
4597 IC.getFreelyInverted(X, X->hasOneUse(), &IC.Builder)) {
4598 X = NotX;
4599 return true;
4600 }
4601 }
4602 return false;
4603 };
4604 if (Check())
4605 return true;
4606 std::swap(X, M);
4607 return Check();
4608 }
4609 if (ICmpInst::isEquality(Pred) && match(Op1, m_Zero()) &&
4610 match(Op0, m_OneUse(m_And(m_Value(X), m_Value(M))))) {
4611 auto Check = [&]() {
4612 // Look for: x & ~Mask == 0
4613 if (isMaskOrZero(M, /*Not=*/true, Q)) {
4614 if (Value *NotM =
4615 IC.getFreelyInverted(M, M->hasOneUse(), &IC.Builder)) {
4616 M = NotM;
4617 return true;
4618 }
4619 }
4620 return false;
4621 };
4622 if (Check())
4623 return true;
4624 std::swap(X, M);
4625 return Check();
4626 }
4627 return false;
4628 };
4629
4630 if (!IsLowBitMask())
4631 return nullptr;
4632
4633 return IC.Builder.CreateICmp(DstPred, X, M);
4634}
4635
4636/// Some comparisons can be simplified.
4637/// In this case, we are looking for comparisons that look like
4638/// a check for a lossy signed truncation.
4639/// Folds: (MaskedBits is a constant.)
4640/// ((%x << MaskedBits) a>> MaskedBits) SrcPred %x
4641/// Into:
4642/// (add %x, (1 << (KeptBits-1))) DstPred (1 << KeptBits)
4643/// Where KeptBits = bitwidth(%x) - MaskedBits
4644static Value *
4646 InstCombiner::BuilderTy &Builder) {
4647 CmpPredicate SrcPred;
4648 Value *X;
4649 const APInt *C0, *C1; // FIXME: non-splats, potentially with undef.
4650 // We are ok with 'shl' having multiple uses, but 'ashr' must be one-use.
4651 if (!match(&I, m_c_ICmp(SrcPred,
4653 m_APInt(C1))),
4654 m_Deferred(X))))
4655 return nullptr;
4656
4657 // Potential handling of non-splats: for each element:
4658 // * if both are undef, replace with constant 0.
4659 // Because (1<<0) is OK and is 1, and ((1<<0)>>1) is also OK and is 0.
4660 // * if both are not undef, and are different, bailout.
4661 // * else, only one is undef, then pick the non-undef one.
4662
4663 // The shift amount must be equal.
4664 if (*C0 != *C1)
4665 return nullptr;
4666 const APInt &MaskedBits = *C0;
4667 assert(MaskedBits != 0 && "shift by zero should be folded away already.");
4668
4669 ICmpInst::Predicate DstPred;
4670 switch (SrcPred) {
4672 // ((%x << MaskedBits) a>> MaskedBits) == %x
4673 // =>
4674 // (add %x, (1 << (KeptBits-1))) u< (1 << KeptBits)
4676 break;
4678 // ((%x << MaskedBits) a>> MaskedBits) != %x
4679 // =>
4680 // (add %x, (1 << (KeptBits-1))) u>= (1 << KeptBits)
4682 break;
4683 // FIXME: are more folds possible?
4684 default:
4685 return nullptr;
4686 }
4687
4688 auto *XType = X->getType();
4689 const unsigned XBitWidth = XType->getScalarSizeInBits();
4690 const APInt BitWidth = APInt(XBitWidth, XBitWidth);
4691 assert(BitWidth.ugt(MaskedBits) && "shifts should leave some bits untouched");
4692
4693 // KeptBits = bitwidth(%x) - MaskedBits
4694 const APInt KeptBits = BitWidth - MaskedBits;
4695 assert(KeptBits.ugt(0) && KeptBits.ult(BitWidth) && "unreachable");
4696 // ICmpCst = (1 << KeptBits)
4697 const APInt ICmpCst = APInt(XBitWidth, 1).shl(KeptBits);
4698 assert(ICmpCst.isPowerOf2());
4699 // AddCst = (1 << (KeptBits-1))
4700 const APInt AddCst = ICmpCst.lshr(1);
4701 assert(AddCst.ult(ICmpCst) && AddCst.isPowerOf2());
4702
4703 // T0 = add %x, AddCst
4704 Value *T0 = Builder.CreateAdd(X, ConstantInt::get(XType, AddCst));
4705 // T1 = T0 DstPred ICmpCst
4706 Value *T1 = Builder.CreateICmp(DstPred, T0, ConstantInt::get(XType, ICmpCst));
4707
4708 return T1;
4709}
4710
4711// Given pattern:
4712// icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4713// we should move shifts to the same hand of 'and', i.e. rewrite as
4714// icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4715// We are only interested in opposite logical shifts here.
4716// One of the shifts can be truncated.
4717// If we can, we want to end up creating 'lshr' shift.
4718static Value *
4720 InstCombiner::BuilderTy &Builder) {
4721 if (!I.isEquality() || !match(I.getOperand(1), m_Zero()) ||
4722 !I.getOperand(0)->hasOneUse())
4723 return nullptr;
4724
4725 auto m_AnyLogicalShift = m_LogicalShift(m_Value(), m_Value());
4726
4727 // Look for an 'and' of two logical shifts, one of which may be truncated.
4728 // We use m_TruncOrSelf() on the RHS to correctly handle commutative case.
4729 Instruction *XShift, *MaybeTruncation, *YShift;
4730 if (!match(
4731 I.getOperand(0),
4732 m_c_And(m_CombineAnd(m_AnyLogicalShift, m_Instruction(XShift)),
4734 m_AnyLogicalShift, m_Instruction(YShift))),
4735 m_Instruction(MaybeTruncation)))))
4736 return nullptr;
4737
4738 // We potentially looked past 'trunc', but only when matching YShift,
4739 // therefore YShift must have the widest type.
4740 Instruction *WidestShift = YShift;
4741 // Therefore XShift must have the shallowest type.
4742 // Or they both have identical types if there was no truncation.
4743 Instruction *NarrowestShift = XShift;
4744
4745 Type *WidestTy = WidestShift->getType();
4746 Type *NarrowestTy = NarrowestShift->getType();
4747 assert(NarrowestTy == I.getOperand(0)->getType() &&
4748 "We did not look past any shifts while matching XShift though.");
4749 bool HadTrunc = WidestTy != I.getOperand(0)->getType();
4750
4751 // If YShift is a 'lshr', swap the shifts around.
4752 if (match(YShift, m_LShr(m_Value(), m_Value())))
4753 std::swap(XShift, YShift);
4754
4755 // The shifts must be in opposite directions.
4756 auto XShiftOpcode = XShift->getOpcode();
4757 if (XShiftOpcode == YShift->getOpcode())
4758 return nullptr; // Do not care about same-direction shifts here.
4759
4760 Value *X, *XShAmt, *Y, *YShAmt;
4761 match(XShift, m_BinOp(m_Value(X), m_ZExtOrSelf(m_Value(XShAmt))));
4762 match(YShift, m_BinOp(m_Value(Y), m_ZExtOrSelf(m_Value(YShAmt))));
4763
4764 // If one of the values being shifted is a constant, then we will end with
4765 // and+icmp, and [zext+]shift instrs will be constant-folded. If they are not,
4766 // however, we will need to ensure that we won't increase instruction count.
4767 if (!isa<Constant>(X) && !isa<Constant>(Y)) {
4768 // At least one of the hands of the 'and' should be one-use shift.
4769 if (!match(I.getOperand(0),
4770 m_c_And(m_OneUse(m_AnyLogicalShift), m_Value())))
4771 return nullptr;
4772 if (HadTrunc) {
4773 // Due to the 'trunc', we will need to widen X. For that either the old
4774 // 'trunc' or the shift amt in the non-truncated shift should be one-use.
4775 if (!MaybeTruncation->hasOneUse() &&
4776 !NarrowestShift->getOperand(1)->hasOneUse())
4777 return nullptr;
4778 }
4779 }
4780
4781 // We have two shift amounts from two different shifts. The types of those
4782 // shift amounts may not match. If that's the case let's bailout now.
4783 if (XShAmt->getType() != YShAmt->getType())
4784 return nullptr;
4785
4786 // As input, we have the following pattern:
4787 // icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0
4788 // We want to rewrite that as:
4789 // icmp eq/ne (and (x shift (Q+K)), y), 0 iff (Q+K) u< bitwidth(x)
4790 // While we know that originally (Q+K) would not overflow
4791 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
4792 // shift amounts. so it may now overflow in smaller bitwidth.
4793 // To ensure that does not happen, we need to ensure that the total maximal
4794 // shift amount is still representable in that smaller bit width.
4795 unsigned MaximalPossibleTotalShiftAmount =
4796 (WidestTy->getScalarSizeInBits() - 1) +
4797 (NarrowestTy->getScalarSizeInBits() - 1);
4798 APInt MaximalRepresentableShiftAmount =
4800 if (MaximalRepresentableShiftAmount.ult(MaximalPossibleTotalShiftAmount))
4801 return nullptr;
4802
4803 // Can we fold (XShAmt+YShAmt) ?
4804 auto *NewShAmt = dyn_cast_or_null<Constant>(
4805 simplifyAddInst(XShAmt, YShAmt, /*isNSW=*/false,
4806 /*isNUW=*/false, SQ.getWithInstruction(&I)));
4807 if (!NewShAmt)
4808 return nullptr;
4809 if (NewShAmt->getType() != WidestTy) {
4810 NewShAmt =
4811 ConstantFoldCastOperand(Instruction::ZExt, NewShAmt, WidestTy, SQ.DL);
4812 if (!NewShAmt)
4813 return nullptr;
4814 }
4815 unsigned WidestBitWidth = WidestTy->getScalarSizeInBits();
4816
4817 // Is the new shift amount smaller than the bit width?
4818 // FIXME: could also rely on ConstantRange.
4819 if (!match(NewShAmt,
4821 APInt(WidestBitWidth, WidestBitWidth))))
4822 return nullptr;
4823
4824 // An extra legality check is needed if we had trunc-of-lshr.
4825 if (HadTrunc && match(WidestShift, m_LShr(m_Value(), m_Value()))) {
4826 auto CanFold = [NewShAmt, WidestBitWidth, NarrowestShift, SQ,
4827 WidestShift]() {
4828 // It isn't obvious whether it's worth it to analyze non-constants here.
4829 // Also, let's basically give up on non-splat cases, pessimizing vectors.
4830 // If *any* of these preconditions matches we can perform the fold.
4831 Constant *NewShAmtSplat = NewShAmt->getType()->isVectorTy()
4832 ? NewShAmt->getSplatValue()
4833 : NewShAmt;
4834 // If it's edge-case shift (by 0 or by WidestBitWidth-1) we can fold.
4835 if (NewShAmtSplat &&
4836 (NewShAmtSplat->isNullValue() ||
4837 NewShAmtSplat->getUniqueInteger() == WidestBitWidth - 1))
4838 return true;
4839 // We consider *min* leading zeros so a single outlier
4840 // blocks the transform as opposed to allowing it.
4841 if (auto *C = dyn_cast<Constant>(NarrowestShift->getOperand(0))) {
4842 KnownBits Known = computeKnownBits(C, SQ.DL);
4843 unsigned MinLeadZero = Known.countMinLeadingZeros();
4844 // If the value being shifted has at most lowest bit set we can fold.
4845 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4846 if (MaxActiveBits <= 1)
4847 return true;
4848 // Precondition: NewShAmt u<= countLeadingZeros(C)
4849 if (NewShAmtSplat && NewShAmtSplat->getUniqueInteger().ule(MinLeadZero))
4850 return true;
4851 }
4852 if (auto *C = dyn_cast<Constant>(WidestShift->getOperand(0))) {
4853 KnownBits Known = computeKnownBits(C, SQ.DL);
4854 unsigned MinLeadZero = Known.countMinLeadingZeros();
4855 // If the value being shifted has at most lowest bit set we can fold.
4856 unsigned MaxActiveBits = Known.getBitWidth() - MinLeadZero;
4857 if (MaxActiveBits <= 1)
4858 return true;
4859 // Precondition: ((WidestBitWidth-1)-NewShAmt) u<= countLeadingZeros(C)
4860 if (NewShAmtSplat) {
4861 APInt AdjNewShAmt =
4862 (WidestBitWidth - 1) - NewShAmtSplat->getUniqueInteger();
4863 if (AdjNewShAmt.ule(MinLeadZero))
4864 return true;
4865 }
4866 }
4867 return false; // Can't tell if it's ok.
4868 };
4869 if (!CanFold())
4870 return nullptr;
4871 }
4872
4873 // All good, we can do this fold.
4874 X = Builder.CreateZExt(X, WidestTy);
4875 Y = Builder.CreateZExt(Y, WidestTy);
4876 // The shift is the same that was for X.
4877 Value *T0 = XShiftOpcode == Instruction::BinaryOps::LShr
4878 ? Builder.CreateLShr(X, NewShAmt)
4879 : Builder.CreateShl(X, NewShAmt);
4880 Value *T1 = Builder.CreateAnd(T0, Y);
4881 return Builder.CreateICmp(I.getPredicate(), T1,
4882 Constant::getNullValue(WidestTy));
4883}
4884
4885/// Fold
4886/// (-1 u/ x) u< y
4887/// ((x * y) ?/ x) != y
4888/// to
4889/// @llvm.?mul.with.overflow(x, y) plus extraction of overflow bit
4890/// Note that the comparison is commutative, while inverted (u>=, ==) predicate
4891/// will mean that we are looking for the opposite answer.
4893 CmpPredicate Pred;
4894 Value *X, *Y;
4896 Instruction *Div;
4897 bool NeedNegation;
4898 // Look for: (-1 u/ x) u</u>= y
4899 if (!I.isEquality() &&
4900 match(&I, m_c_ICmp(Pred,
4902 m_Instruction(Div)),
4903 m_Value(Y)))) {
4904 Mul = nullptr;
4905
4906 // Are we checking that overflow does not happen, or does happen?
4907 switch (Pred) {
4909 NeedNegation = false;
4910 break; // OK
4912 NeedNegation = true;
4913 break; // OK
4914 default:
4915 return nullptr; // Wrong predicate.
4916 }
4917 } else // Look for: ((x * y) / x) !=/== y
4918 if (I.isEquality() &&
4919 match(&I, m_c_ICmp(Pred, m_Value(Y),
4922 m_Value(X)),
4924 m_Deferred(X))),
4925 m_Instruction(Div))))) {
4926 NeedNegation = Pred == ICmpInst::Predicate::ICMP_EQ;
4927 } else
4928 return nullptr;
4929
4931 // If the pattern included (x * y), we'll want to insert new instructions
4932 // right before that original multiplication so that we can replace it.
4933 bool MulHadOtherUses = Mul && !Mul->hasOneUse();
4934 if (MulHadOtherUses)
4935 Builder.SetInsertPoint(Mul);
4936
4937 CallInst *Call = Builder.CreateIntrinsic(
4938 Div->getOpcode() == Instruction::UDiv ? Intrinsic::umul_with_overflow
4939 : Intrinsic::smul_with_overflow,
4940 X->getType(), {X, Y}, /*FMFSource=*/nullptr, "mul");
4941
4942 // If the multiplication was used elsewhere, to ensure that we don't leave
4943 // "duplicate" instructions, replace uses of that original multiplication
4944 // with the multiplication result from the with.overflow intrinsic.
4945 if (MulHadOtherUses)
4946 replaceInstUsesWith(*Mul, Builder.CreateExtractValue(Call, 0, "mul.val"));
4947
4948 Value *Res = Builder.CreateExtractValue(Call, 1, "mul.ov");
4949 if (NeedNegation) // This technically increases instruction count.
4950 Res = Builder.CreateNot(Res, "mul.not.ov");
4951
4952 // If we replaced the mul, erase it. Do this after all uses of Builder,
4953 // as the mul is used as insertion point.
4954 if (MulHadOtherUses)
4956
4957 return Res;
4958}
4959
4961 InstCombiner::BuilderTy &Builder) {
4962 CmpPredicate Pred;
4963 Value *X;
4964 if (match(&I, m_c_ICmp(Pred, m_NSWNeg(m_Value(X)), m_Deferred(X)))) {
4965
4966 if (ICmpInst::isSigned(Pred))
4967 Pred = ICmpInst::getSwappedPredicate(Pred);
4968 else if (ICmpInst::isUnsigned(Pred))
4969 Pred = ICmpInst::getSignedPredicate(Pred);
4970 // else for equality-comparisons just keep the predicate.
4971
4972 return ICmpInst::Create(Instruction::ICmp, Pred, X,
4973 Constant::getNullValue(X->getType()), I.getName());
4974 }
4975
4976 // A value is not equal to its negation unless that value is 0 or
4977 // MinSignedValue, ie: a != -a --> (a & MaxSignedVal) != 0
4978 if (match(&I, m_c_ICmp(Pred, m_OneUse(m_Neg(m_Value(X))), m_Deferred(X))) &&
4979 ICmpInst::isEquality(Pred)) {
4980 Type *Ty = X->getType();
4981 uint32_t BitWidth = Ty->getScalarSizeInBits();
4982 Constant *MaxSignedVal =
4983 ConstantInt::get(Ty, APInt::getSignedMaxValue(BitWidth));
4984 Value *And = Builder.CreateAnd(X, MaxSignedVal);
4985 Constant *Zero = Constant::getNullValue(Ty);
4986 return CmpInst::Create(Instruction::ICmp, Pred, And, Zero);
4987 }
4988
4989 return nullptr;
4990}
4991
4993 InstCombinerImpl &IC) {
4994 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
4995 // Normalize and operand as operand 0.
4996 CmpInst::Predicate Pred = I.getPredicate();
4997 if (match(Op1, m_c_And(m_Specific(Op0), m_Value()))) {
4998 std::swap(Op0, Op1);
4999 Pred = ICmpInst::getSwappedPredicate(Pred);
5000 }
5001
5002 if (!match(Op0, m_c_And(m_Specific(Op1), m_Value(A))))
5003 return nullptr;
5004
5005 // (icmp (X & Y) u< X --> (X & Y) != X
5006 if (Pred == ICmpInst::ICMP_ULT)
5007 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5008
5009 // (icmp (X & Y) u>= X --> (X & Y) == X
5010 if (Pred == ICmpInst::ICMP_UGE)
5011 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5012
5013 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5014 // icmp (X & Y) eq/ne Y --> (X | ~Y) eq/ne -1 if Y is freely invertible and
5015 // Y is non-constant. If Y is constant the `X & C == C` form is preferable
5016 // so don't do this fold.
5017 if (!match(Op1, m_ImmConstant()))
5018 if (auto *NotOp1 =
5019 IC.getFreelyInverted(Op1, !Op1->hasNUsesOrMore(3), &IC.Builder))
5020 return new ICmpInst(Pred, IC.Builder.CreateOr(A, NotOp1),
5021 Constant::getAllOnesValue(Op1->getType()));
5022 // icmp (X & Y) eq/ne Y --> (~X & Y) eq/ne 0 if X is freely invertible.
5023 if (auto *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5024 return new ICmpInst(Pred, IC.Builder.CreateAnd(Op1, NotA),
5025 Constant::getNullValue(Op1->getType()));
5026 }
5027
5028 if (!ICmpInst::isSigned(Pred))
5029 return nullptr;
5030
5031 KnownBits KnownY = IC.computeKnownBits(A, &I);
5032 // (X & NegY) spred X --> (X & NegY) upred X
5033 if (KnownY.isNegative())
5034 return new ICmpInst(ICmpInst::getUnsignedPredicate(Pred), Op0, Op1);
5035
5036 if (Pred != ICmpInst::ICMP_SLE && Pred != ICmpInst::ICMP_SGT)
5037 return nullptr;
5038
5039 if (KnownY.isNonNegative())
5040 // (X & PosY) s<= X --> X s>= 0
5041 // (X & PosY) s> X --> X s< 0
5042 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
5043 Constant::getNullValue(Op1->getType()));
5044
5046 // (NegX & Y) s<= NegX --> Y s< 0
5047 // (NegX & Y) s> NegX --> Y s>= 0
5049 Constant::getNullValue(A->getType()));
5050
5051 return nullptr;
5052}
5053
5055 InstCombinerImpl &IC) {
5056 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5057
5058 // Normalize or operand as operand 0.
5059 CmpInst::Predicate Pred = I.getPredicate();
5060 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value(A)))) {
5061 std::swap(Op0, Op1);
5062 Pred = ICmpInst::getSwappedPredicate(Pred);
5063 } else if (!match(Op0, m_c_Or(m_Specific(Op1), m_Value(A)))) {
5064 return nullptr;
5065 }
5066
5067 // icmp (X | Y) u<= X --> (X | Y) == X
5068 if (Pred == ICmpInst::ICMP_ULE)
5069 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
5070
5071 // icmp (X | Y) u> X --> (X | Y) != X
5072 if (Pred == ICmpInst::ICMP_UGT)
5073 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
5074
5075 if (ICmpInst::isEquality(Pred) && Op0->hasOneUse()) {
5076 // icmp (X | Y) eq/ne Y --> (X & ~Y) eq/ne 0 if Y is freely invertible
5077 if (Value *NotOp1 = IC.getFreelyInverted(
5078 Op1, !isa<Constant>(Op1) && !Op1->hasNUsesOrMore(3), &IC.Builder))
5079 return new ICmpInst(Pred, IC.Builder.CreateAnd(A, NotOp1),
5080 Constant::getNullValue(Op1->getType()));
5081 // icmp (X | Y) eq/ne Y --> (~X | Y) eq/ne -1 if X is freely invertible.
5082 if (Value *NotA = IC.getFreelyInverted(A, A->hasOneUse(), &IC.Builder))
5083 return new ICmpInst(Pred, IC.Builder.CreateOr(Op1, NotA),
5084 Constant::getAllOnesValue(Op1->getType()));
5085 }
5086 return nullptr;
5087}
5088
5090 InstCombinerImpl &IC) {
5091 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1), *A;
5092 // Normalize xor operand as operand 0.
5093 CmpInst::Predicate Pred = I.getPredicate();
5094 if (match(Op1, m_c_Xor(m_Specific(Op0), m_Value()))) {
5095 std::swap(Op0, Op1);
5096 Pred = ICmpInst::getSwappedPredicate(Pred);
5097 }
5098 if (!match(Op0, m_c_Xor(m_Specific(Op1), m_Value(A))))
5099 return nullptr;
5100
5101 // icmp (X ^ Y_NonZero) u>= X --> icmp (X ^ Y_NonZero) u> X
5102 // icmp (X ^ Y_NonZero) u<= X --> icmp (X ^ Y_NonZero) u< X
5103 // icmp (X ^ Y_NonZero) s>= X --> icmp (X ^ Y_NonZero) s> X
5104 // icmp (X ^ Y_NonZero) s<= X --> icmp (X ^ Y_NonZero) s< X
5106 if (PredOut != Pred && isKnownNonZero(A, Q))
5107 return new ICmpInst(PredOut, Op0, Op1);
5108
5109 // These transform work when A is negative.
5110 // X s< X^A, X s<= X^A, X u> X^A, X u>= X^A --> X s< 0
5111 // X s> X^A, X s>= X^A, X u< X^A, X u<= X^A --> X s>= 0
5112 if (match(A, m_Negative())) {
5113 CmpInst::Predicate NewPred;
5114 switch (ICmpInst::getStrictPredicate(Pred)) {
5115 default:
5116 return nullptr;
5117 case ICmpInst::ICMP_SLT:
5118 case ICmpInst::ICMP_UGT:
5119 NewPred = ICmpInst::ICMP_SLT;
5120 break;
5121 case ICmpInst::ICMP_SGT:
5122 case ICmpInst::ICMP_ULT:
5123 NewPred = ICmpInst::ICMP_SGE;
5124 break;
5125 }
5126 Constant *Const = Constant::getNullValue(Op0->getType());
5127 return new ICmpInst(NewPred, Op0, Const);
5128 }
5129
5130 return nullptr;
5131}
5132
5133/// Return true if X is a multiple of C.
5134/// TODO: Handle non-power-of-2 factors.
5135static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q) {
5136 if (C.isOne())
5137 return true;
5138
5139 if (!C.isPowerOf2())
5140 return false;
5141
5142 return MaskedValueIsZero(X, C - 1, Q);
5143}
5144
5145/// Try to fold icmp (binop), X or icmp X, (binop).
5146/// TODO: A large part of this logic is duplicated in InstSimplify's
5147/// simplifyICmpWithBinOp(). We should be able to share that and avoid the code
5148/// duplication.
5150 const SimplifyQuery &SQ) {
5151 const SimplifyQuery Q = SQ.getWithInstruction(&I);
5152 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5153
5154 // Special logic for binary operators.
5157 if (!BO0 && !BO1)
5158 return nullptr;
5159
5160 if (Instruction *NewICmp = foldICmpXNegX(I, Builder))
5161 return NewICmp;
5162
5163 const CmpInst::Predicate Pred = I.getPredicate();
5164 Value *X;
5165
5166 // Convert add-with-unsigned-overflow comparisons into a 'not' with compare.
5167 // (Op1 + X) u</u>= Op1 --> ~Op1 u</u>= X
5168 if (match(Op0, m_OneUse(m_c_Add(m_Specific(Op1), m_Value(X)))) &&
5169 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5170 return new ICmpInst(Pred, Builder.CreateNot(Op1), X);
5171 // Op0 u>/u<= (Op0 + X) --> X u>/u<= ~Op0
5172 if (match(Op1, m_OneUse(m_c_Add(m_Specific(Op0), m_Value(X)))) &&
5173 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5174 return new ICmpInst(Pred, X, Builder.CreateNot(Op0));
5175
5176 {
5177 // (Op1 + X) + C u</u>= Op1 --> ~C - X u</u>= Op1
5178 Constant *C;
5179 if (match(Op0, m_OneUse(m_Add(m_c_Add(m_Specific(Op1), m_Value(X)),
5180 m_ImmConstant(C)))) &&
5181 (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE)) {
5183 return new ICmpInst(Pred, Builder.CreateSub(C2, X), Op1);
5184 }
5185 // Op0 u>/u<= (Op0 + X) + C --> Op0 u>/u<= ~C - X
5186 if (match(Op1, m_OneUse(m_Add(m_c_Add(m_Specific(Op0), m_Value(X)),
5187 m_ImmConstant(C)))) &&
5188 (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE)) {
5190 return new ICmpInst(Pred, Op0, Builder.CreateSub(C2, X));
5191 }
5192 }
5193
5194 // (icmp eq/ne (X, -P2), INT_MIN)
5195 // -> (icmp slt/sge X, INT_MIN + P2)
5196 if (ICmpInst::isEquality(Pred) && BO0 &&
5197 match(I.getOperand(1), m_SignMask()) &&
5199 // Will Constant fold.
5200 Value *NewC = Builder.CreateSub(I.getOperand(1), BO0->getOperand(1));
5201 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_SLT
5203 BO0->getOperand(0), NewC);
5204 }
5205
5206 {
5207 // Similar to above: an unsigned overflow comparison may use offset + mask:
5208 // ((Op1 + C) & C) u< Op1 --> Op1 != 0
5209 // ((Op1 + C) & C) u>= Op1 --> Op1 == 0
5210 // Op0 u> ((Op0 + C) & C) --> Op0 != 0
5211 // Op0 u<= ((Op0 + C) & C) --> Op0 == 0
5212 BinaryOperator *BO;
5213 const APInt *C;
5214 if ((Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE) &&
5215 match(Op0, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5217 CmpInst::Predicate NewPred =
5219 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5220 return new ICmpInst(NewPred, Op1, Zero);
5221 }
5222
5223 if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5224 match(Op1, m_And(m_BinOp(BO), m_LowBitMask(C))) &&
5226 CmpInst::Predicate NewPred =
5228 Constant *Zero = ConstantInt::getNullValue(Op1->getType());
5229 return new ICmpInst(NewPred, Op0, Zero);
5230 }
5231 }
5232
5233 bool NoOp0WrapProblem = false, NoOp1WrapProblem = false;
5234 bool Op0HasNUW = false, Op1HasNUW = false;
5235 bool Op0HasNSW = false, Op1HasNSW = false;
5236 // Analyze the case when either Op0 or Op1 is an add instruction.
5237 // Op0 = A + B (or A and B are null); Op1 = C + D (or C and D are null).
5238 auto hasNoWrapProblem = [](const BinaryOperator &BO, CmpInst::Predicate Pred,
5239 bool &HasNSW, bool &HasNUW) -> bool {
5241 HasNUW = BO.hasNoUnsignedWrap();
5242 HasNSW = BO.hasNoSignedWrap();
5243 return ICmpInst::isEquality(Pred) ||
5244 (CmpInst::isUnsigned(Pred) && HasNUW) ||
5245 (CmpInst::isSigned(Pred) && HasNSW);
5246 } else if (BO.getOpcode() == Instruction::Or) {
5247 HasNUW = true;
5248 HasNSW = true;
5249 return true;
5250 } else {
5251 return false;
5252 }
5253 };
5254 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr;
5255
5256 if (BO0) {
5257 match(BO0, m_AddLike(m_Value(A), m_Value(B)));
5258 NoOp0WrapProblem = hasNoWrapProblem(*BO0, Pred, Op0HasNSW, Op0HasNUW);
5259 }
5260 if (BO1) {
5261 match(BO1, m_AddLike(m_Value(C), m_Value(D)));
5262 NoOp1WrapProblem = hasNoWrapProblem(*BO1, Pred, Op1HasNSW, Op1HasNUW);
5263 }
5264
5265 // icmp (A+B), A -> icmp B, 0 for equalities or if there is no overflow.
5266 // icmp (A+B), B -> icmp A, 0 for equalities or if there is no overflow.
5267 if ((A == Op1 || B == Op1) && NoOp0WrapProblem)
5268 return new ICmpInst(Pred, A == Op1 ? B : A,
5269 Constant::getNullValue(Op1->getType()));
5270
5271 // icmp C, (C+D) -> icmp 0, D for equalities or if there is no overflow.
5272 // icmp D, (C+D) -> icmp 0, C for equalities or if there is no overflow.
5273 if ((C == Op0 || D == Op0) && NoOp1WrapProblem)
5274 return new ICmpInst(Pred, Constant::getNullValue(Op0->getType()),
5275 C == Op0 ? D : C);
5276
5277 // icmp (A+B), (A+D) -> icmp B, D for equalities or if there is no overflow.
5278 if (A && C && (A == C || A == D || B == C || B == D) && NoOp0WrapProblem &&
5279 NoOp1WrapProblem) {
5280 // Determine Y and Z in the form icmp (X+Y), (X+Z).
5281 Value *Y, *Z;
5282 if (A == C) {
5283 // C + B == C + D -> B == D
5284 Y = B;
5285 Z = D;
5286 } else if (A == D) {
5287 // D + B == C + D -> B == C
5288 Y = B;
5289 Z = C;
5290 } else if (B == C) {
5291 // A + C == C + D -> A == D
5292 Y = A;
5293 Z = D;
5294 } else {
5295 assert(B == D);
5296 // A + D == C + D -> A == C
5297 Y = A;
5298 Z = C;
5299 }
5300 return new ICmpInst(Pred, Y, Z);
5301 }
5302
5303 if (ICmpInst::isRelational(Pred)) {
5304 // Return if both X and Y is divisible by Z/-Z.
5305 // TODO: Generalize to check if (X - Y) is divisible by Z/-Z.
5306 auto ShareCommonDivisor = [&Q](Value *X, Value *Y, Value *Z,
5307 bool IsNegative) -> bool {
5308 const APInt *OffsetC;
5309 if (!match(Z, m_APInt(OffsetC)))
5310 return false;
5311
5312 // Fast path for Z == 1/-1.
5313 if (IsNegative ? OffsetC->isAllOnes() : OffsetC->isOne())
5314 return true;
5315
5316 APInt C = *OffsetC;
5317 if (IsNegative)
5318 C.negate();
5319 // Note: -INT_MIN is also negative.
5320 if (!C.isStrictlyPositive())
5321 return false;
5322
5323 return isMultipleOf(X, C, Q) && isMultipleOf(Y, C, Q);
5324 };
5325
5326 // TODO: The subtraction-related identities shown below also hold, but
5327 // canonicalization from (X -nuw 1) to (X + -1) means that the combinations
5328 // wouldn't happen even if they were implemented.
5329 //
5330 // icmp ult (A - 1), Op1 -> icmp ule A, Op1
5331 // icmp uge (A - 1), Op1 -> icmp ugt A, Op1
5332 // icmp ugt Op0, (C - 1) -> icmp uge Op0, C
5333 // icmp ule Op0, (C - 1) -> icmp ult Op0, C
5334
5335 // icmp slt (A + -1), Op1 -> icmp sle A, Op1
5336 // icmp sge (A + -1), Op1 -> icmp sgt A, Op1
5337 // icmp sle (A + 1), Op1 -> icmp slt A, Op1
5338 // icmp sgt (A + 1), Op1 -> icmp sge A, Op1
5339 // icmp ule (A + 1), Op0 -> icmp ult A, Op1
5340 // icmp ugt (A + 1), Op0 -> icmp uge A, Op1
5341 if (A && NoOp0WrapProblem &&
5342 ShareCommonDivisor(A, Op1, B,
5343 ICmpInst::isLT(Pred) || ICmpInst::isGE(Pred)))
5345 Op1);
5346
5347 // icmp sgt Op0, (C + -1) -> icmp sge Op0, C
5348 // icmp sle Op0, (C + -1) -> icmp slt Op0, C
5349 // icmp sge Op0, (C + 1) -> icmp sgt Op0, C
5350 // icmp slt Op0, (C + 1) -> icmp sle Op0, C
5351 // icmp uge Op0, (C + 1) -> icmp ugt Op0, C
5352 // icmp ult Op0, (C + 1) -> icmp ule Op0, C
5353 if (C && NoOp1WrapProblem &&
5354 ShareCommonDivisor(Op0, C, D,
5355 ICmpInst::isGT(Pred) || ICmpInst::isLE(Pred)))
5357 C);
5358 }
5359
5360 // if C1 has greater magnitude than C2:
5361 // icmp (A + C1), (C + C2) -> icmp (A + C3), C
5362 // s.t. C3 = C1 - C2
5363 //
5364 // if C2 has greater magnitude than C1:
5365 // icmp (A + C1), (C + C2) -> icmp A, (C + C3)
5366 // s.t. C3 = C2 - C1
5367 if (A && C && NoOp0WrapProblem && NoOp1WrapProblem &&
5368 (BO0->hasOneUse() || BO1->hasOneUse()) && !I.isUnsigned()) {
5369 const APInt *AP1, *AP2;
5370 // TODO: Support non-uniform vectors.
5371 // TODO: Allow poison passthrough if B or D's element is poison.
5372 if (match(B, m_APIntAllowPoison(AP1)) &&
5373 match(D, m_APIntAllowPoison(AP2)) &&
5374 AP1->isNegative() == AP2->isNegative()) {
5375 APInt AP1Abs = AP1->abs();
5376 APInt AP2Abs = AP2->abs();
5377 if (AP1Abs.uge(AP2Abs)) {
5378 APInt Diff = *AP1 - *AP2;
5379 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5380 Value *NewAdd = Builder.CreateAdd(
5381 A, C3, "", Op0HasNUW && Diff.ule(*AP1), Op0HasNSW);
5382 return new ICmpInst(Pred, NewAdd, C);
5383 } else {
5384 APInt Diff = *AP2 - *AP1;
5385 Constant *C3 = Constant::getIntegerValue(BO0->getType(), Diff);
5386 Value *NewAdd = Builder.CreateAdd(
5387 C, C3, "", Op1HasNUW && Diff.ule(*AP2), Op1HasNSW);
5388 return new ICmpInst(Pred, A, NewAdd);
5389 }
5390 }
5391 Constant *Cst1, *Cst2;
5392 if (match(B, m_ImmConstant(Cst1)) && match(D, m_ImmConstant(Cst2)) &&
5393 ICmpInst::isEquality(Pred)) {
5394 Constant *Diff = ConstantExpr::getSub(Cst2, Cst1);
5395 Value *NewAdd = Builder.CreateAdd(C, Diff);
5396 return new ICmpInst(Pred, A, NewAdd);
5397 }
5398 }
5399
5400 // Analyze the case when either Op0 or Op1 is a sub instruction.
5401 // Op0 = A - B (or A and B are null); Op1 = C - D (or C and D are null).
5402 A = nullptr;
5403 B = nullptr;
5404 C = nullptr;
5405 D = nullptr;
5406 if (BO0 && BO0->getOpcode() == Instruction::Sub) {
5407 A = BO0->getOperand(0);
5408 B = BO0->getOperand(1);
5409 }
5410 if (BO1 && BO1->getOpcode() == Instruction::Sub) {
5411 C = BO1->getOperand(0);
5412 D = BO1->getOperand(1);
5413 }
5414
5415 // icmp (A-B), A -> icmp 0, B for equalities or if there is no overflow.
5416 if (A == Op1 && NoOp0WrapProblem)
5417 return new ICmpInst(Pred, Constant::getNullValue(Op1->getType()), B);
5418 // icmp C, (C-D) -> icmp D, 0 for equalities or if there is no overflow.
5419 if (C == Op0 && NoOp1WrapProblem)
5420 return new ICmpInst(Pred, D, Constant::getNullValue(Op0->getType()));
5421
5422 // Convert sub-with-unsigned-overflow comparisons into a comparison of args.
5423 // (A - B) u>/u<= A --> B u>/u<= A
5424 if (A == Op1 && (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE))
5425 return new ICmpInst(Pred, B, A);
5426 // C u</u>= (C - D) --> C u</u>= D
5427 if (C == Op0 && (Pred == ICmpInst::ICMP_ULT || Pred == ICmpInst::ICMP_UGE))
5428 return new ICmpInst(Pred, C, D);
5429 // (A - B) u>=/u< A --> B u>/u<= A iff B != 0
5430 if (A == Op1 && (Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5431 isKnownNonZero(B, Q))
5433 // C u<=/u> (C - D) --> C u</u>= D iff B != 0
5434 if (C == Op0 && (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_UGT) &&
5435 isKnownNonZero(D, Q))
5437
5438 // icmp (A-B), (C-B) -> icmp A, C for equalities or if there is no overflow.
5439 if (B && D && B == D && NoOp0WrapProblem && NoOp1WrapProblem)
5440 return new ICmpInst(Pred, A, C);
5441
5442 // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow.
5443 if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem)
5444 return new ICmpInst(Pred, D, B);
5445
5446 // icmp (0-X) < cst --> x > -cst
5447 if (NoOp0WrapProblem && ICmpInst::isSigned(Pred)) {
5448 Value *X;
5449 if (match(BO0, m_Neg(m_Value(X))))
5450 if (Constant *RHSC = dyn_cast<Constant>(Op1))
5451 if (RHSC->isNotMinSignedValue())
5452 return new ICmpInst(I.getSwappedPredicate(), X,
5453 ConstantExpr::getNeg(RHSC));
5454 }
5455
5456 if (Instruction *R = foldICmpXorXX(I, Q, *this))
5457 return R;
5458 if (Instruction *R = foldICmpOrXX(I, Q, *this))
5459 return R;
5460
5461 {
5462 // Try to remove shared multiplier from comparison:
5463 // X * Z pred Y * Z
5464 Value *X, *Y, *Z;
5465 if ((match(Op0, m_Mul(m_Value(X), m_Value(Z))) &&
5466 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y)))) ||
5467 (match(Op0, m_Mul(m_Value(Z), m_Value(X))) &&
5468 match(Op1, m_c_Mul(m_Specific(Z), m_Value(Y))))) {
5469 if (ICmpInst::isSigned(Pred)) {
5470 if (Op0HasNSW && Op1HasNSW) {
5471 KnownBits ZKnown = computeKnownBits(Z, &I);
5472 if (ZKnown.isStrictlyPositive())
5473 return new ICmpInst(Pred, X, Y);
5474 if (ZKnown.isNegative())
5475 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), X, Y);
5477 SQ.getWithInstruction(&I));
5478 if (LessThan && match(LessThan, m_One()))
5479 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Z,
5480 Constant::getNullValue(Z->getType()));
5481 Value *GreaterThan = simplifyICmpInst(ICmpInst::ICMP_SGT, X, Y,
5482 SQ.getWithInstruction(&I));
5483 if (GreaterThan && match(GreaterThan, m_One()))
5484 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5485 }
5486 } else {
5487 bool NonZero;
5488 if (ICmpInst::isEquality(Pred)) {
5489 // If X != Y, fold (X *nw Z) eq/ne (Y *nw Z) -> Z eq/ne 0
5490 if (((Op0HasNSW && Op1HasNSW) || (Op0HasNUW && Op1HasNUW)) &&
5491 isKnownNonEqual(X, Y, SQ))
5492 return new ICmpInst(Pred, Z, Constant::getNullValue(Z->getType()));
5493
5494 KnownBits ZKnown = computeKnownBits(Z, &I);
5495 // if Z % 2 != 0
5496 // X * Z eq/ne Y * Z -> X eq/ne Y
5497 if (ZKnown.countMaxTrailingZeros() == 0)
5498 return new ICmpInst(Pred, X, Y);
5499 NonZero = !ZKnown.One.isZero() || isKnownNonZero(Z, Q);
5500 // if Z != 0 and nsw(X * Z) and nsw(Y * Z)
5501 // X * Z eq/ne Y * Z -> X eq/ne Y
5502 if (NonZero && BO0 && BO1 && Op0HasNSW && Op1HasNSW)
5503 return new ICmpInst(Pred, X, Y);
5504 } else
5505 NonZero = isKnownNonZero(Z, Q);
5506
5507 // If Z != 0 and nuw(X * Z) and nuw(Y * Z)
5508 // X * Z u{lt/le/gt/ge}/eq/ne Y * Z -> X u{lt/le/gt/ge}/eq/ne Y
5509 if (NonZero && BO0 && BO1 && Op0HasNUW && Op1HasNUW)
5510 return new ICmpInst(Pred, X, Y);
5511 }
5512 }
5513 }
5514
5515 BinaryOperator *SRem = nullptr;
5516 // icmp (srem X, Y), Y
5517 if (BO0 && BO0->getOpcode() == Instruction::SRem && Op1 == BO0->getOperand(1))
5518 SRem = BO0;
5519 // icmp Y, (srem X, Y)
5520 else if (BO1 && BO1->getOpcode() == Instruction::SRem &&
5521 Op0 == BO1->getOperand(1))
5522 SRem = BO1;
5523 if (SRem) {
5524 // We don't check hasOneUse to avoid increasing register pressure because
5525 // the value we use is the same value this instruction was already using.
5526 switch (SRem == BO0 ? ICmpInst::getSwappedPredicate(Pred) : Pred) {
5527 default:
5528 break;
5529 case ICmpInst::ICMP_EQ:
5530 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5531 case ICmpInst::ICMP_NE:
5532 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5533 case ICmpInst::ICMP_SGT:
5534 case ICmpInst::ICMP_SGE:
5535 return new ICmpInst(ICmpInst::ICMP_SGT, SRem->getOperand(1),
5537 case ICmpInst::ICMP_SLT:
5538 case ICmpInst::ICMP_SLE:
5539 return new ICmpInst(ICmpInst::ICMP_SLT, SRem->getOperand(1),
5541 }
5542 }
5543
5544 if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() &&
5545 (BO0->hasOneUse() || BO1->hasOneUse()) &&
5546 BO0->getOperand(1) == BO1->getOperand(1)) {
5547 switch (BO0->getOpcode()) {
5548 default:
5549 break;
5550 case Instruction::Add:
5551 case Instruction::Sub:
5552 case Instruction::Xor: {
5553 if (I.isEquality()) // a+x icmp eq/ne b+x --> a icmp b
5554 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5555
5556 const APInt *C;
5557 if (match(BO0->getOperand(1), m_APInt(C))) {
5558 // icmp u/s (a ^ signmask), (b ^ signmask) --> icmp s/u a, b
5559 if (C->isSignMask()) {
5560 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5561 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5562 }
5563
5564 // icmp u/s (a ^ maxsignval), (b ^ maxsignval) --> icmp s/u' a, b
5565 if (BO0->getOpcode() == Instruction::Xor && C->isMaxSignedValue()) {
5566 ICmpInst::Predicate NewPred = I.getFlippedSignednessPredicate();
5567 NewPred = I.getSwappedPredicate(NewPred);
5568 return new ICmpInst(NewPred, BO0->getOperand(0), BO1->getOperand(0));
5569 }
5570 }
5571 break;
5572 }
5573 case Instruction::Mul: {
5574 if (!I.isEquality())
5575 break;
5576
5577 const APInt *C;
5578 if (match(BO0->getOperand(1), m_APInt(C)) && !C->isZero() &&
5579 !C->isOne()) {
5580 // icmp eq/ne (X * C), (Y * C) --> icmp (X & Mask), (Y & Mask)
5581 // Mask = -1 >> count-trailing-zeros(C).
5582 if (unsigned TZs = C->countr_zero()) {
5583 Constant *Mask = ConstantInt::get(
5584 BO0->getType(),
5585 APInt::getLowBitsSet(C->getBitWidth(), C->getBitWidth() - TZs));
5586 Value *And1 = Builder.CreateAnd(BO0->getOperand(0), Mask);
5587 Value *And2 = Builder.CreateAnd(BO1->getOperand(0), Mask);
5588 return new ICmpInst(Pred, And1, And2);
5589 }
5590 }
5591 break;
5592 }
5593 case Instruction::UDiv:
5594 case Instruction::LShr:
5595 if (I.isSigned() || !BO0->isExact() || !BO1->isExact())
5596 break;
5597 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5598
5599 case Instruction::SDiv:
5600 if (!(I.isEquality() || match(BO0->getOperand(1), m_NonNegative())) ||
5601 !BO0->isExact() || !BO1->isExact())
5602 break;
5603 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5604
5605 case Instruction::AShr:
5606 if (!BO0->isExact() || !BO1->isExact())
5607 break;
5608 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5609
5610 case Instruction::Shl: {
5611 bool NUW = Op0HasNUW && Op1HasNUW;
5612 bool NSW = Op0HasNSW && Op1HasNSW;
5613 if (!NUW && !NSW)
5614 break;
5615 if (!NSW && I.isSigned())
5616 break;
5617 return new ICmpInst(Pred, BO0->getOperand(0), BO1->getOperand(0));
5618 }
5619 }
5620 }
5621
5622 if (BO0) {
5623 // Transform A & (L - 1) `ult` L --> L != 0
5624 auto LSubOne = m_Add(m_Specific(Op1), m_AllOnes());
5625 auto BitwiseAnd = m_c_And(m_Value(), LSubOne);
5626
5627 if (match(BO0, BitwiseAnd) && Pred == ICmpInst::ICMP_ULT) {
5628 auto *Zero = Constant::getNullValue(BO0->getType());
5629 return new ICmpInst(ICmpInst::ICMP_NE, Op1, Zero);
5630 }
5631 }
5632
5633 // For unsigned predicates / eq / ne:
5634 // icmp pred (x << 1), x --> icmp getSignedPredicate(pred) x, 0
5635 // icmp pred x, (x << 1) --> icmp getSignedPredicate(pred) 0, x
5636 if (!ICmpInst::isSigned(Pred)) {
5637 if (match(Op0, m_Shl(m_Specific(Op1), m_One())))
5638 return new ICmpInst(ICmpInst::getSignedPredicate(Pred), Op1,
5639 Constant::getNullValue(Op1->getType()));
5640 else if (match(Op1, m_Shl(m_Specific(Op0), m_One())))
5641 return new ICmpInst(ICmpInst::getSignedPredicate(Pred),
5642 Constant::getNullValue(Op0->getType()), Op0);
5643 }
5644
5646 return replaceInstUsesWith(I, V);
5647
5648 if (Instruction *R = foldICmpAndXX(I, Q, *this))
5649 return R;
5650
5652 return replaceInstUsesWith(I, V);
5653
5655 return replaceInstUsesWith(I, V);
5656
5657 return nullptr;
5658}
5659
5660/// Fold icmp Pred min|max(X, Y), Z.
5663 Value *Z, CmpPredicate Pred) {
5664 Value *X = MinMax->getLHS();
5665 Value *Y = MinMax->getRHS();
5666 if (ICmpInst::isSigned(Pred) && !MinMax->isSigned())
5667 return nullptr;
5668 if (ICmpInst::isUnsigned(Pred) && MinMax->isSigned()) {
5669 // Revert the transform signed pred -> unsigned pred
5670 // TODO: We can flip the signedness of predicate if both operands of icmp
5671 // are negative.
5672 if (isKnownNonNegative(Z, SQ.getWithInstruction(&I)) &&
5673 isKnownNonNegative(MinMax, SQ.getWithInstruction(&I))) {
5675 } else
5676 return nullptr;
5677 }
5678 SimplifyQuery Q = SQ.getWithInstruction(&I);
5679 auto IsCondKnownTrue = [](Value *Val) -> std::optional<bool> {
5680 if (!Val)
5681 return std::nullopt;
5682 if (match(Val, m_One()))
5683 return true;
5684 if (match(Val, m_Zero()))
5685 return false;
5686 return std::nullopt;
5687 };
5688 // Remove samesign here since it is illegal to keep it when we speculatively
5689 // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
5690 // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
5691 // -46, -32)`. `X` is allowed to be non-negative here.
5692 Pred = Pred.dropSameSign();
5693 auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
5694 auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
5695 if (!CmpXZ.has_value() && !CmpYZ.has_value())
5696 return nullptr;
5697 if (!CmpXZ.has_value()) {
5698 std::swap(X, Y);
5699 std::swap(CmpXZ, CmpYZ);
5700 }
5701
5702 auto FoldIntoCmpYZ = [&]() -> Instruction * {
5703 if (CmpYZ.has_value())
5704 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5705 return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5706 };
5707
5708 switch (Pred) {
5709 case ICmpInst::ICMP_EQ:
5710 case ICmpInst::ICMP_NE: {
5711 // If X == Z:
5712 // Expr Result
5713 // min(X, Y) == Z X <= Y
5714 // max(X, Y) == Z X >= Y
5715 // min(X, Y) != Z X > Y
5716 // max(X, Y) != Z X < Y
5717 if ((Pred == ICmpInst::ICMP_EQ) == *CmpXZ) {
5718 ICmpInst::Predicate NewPred =
5719 ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
5720 if (Pred == ICmpInst::ICMP_NE)
5721 NewPred = ICmpInst::getInversePredicate(NewPred);
5722 return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
5723 }
5724 // Otherwise (X != Z):
5725 ICmpInst::Predicate NewPred = MinMax->getPredicate();
5726 auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5727 if (!MinMaxCmpXZ.has_value()) {
5728 std::swap(X, Y);
5729 std::swap(CmpXZ, CmpYZ);
5730 // Re-check pre-condition X != Z
5731 if (!CmpXZ.has_value() || (Pred == ICmpInst::ICMP_EQ) == *CmpXZ)
5732 break;
5733 MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5734 }
5735 if (!MinMaxCmpXZ.has_value())
5736 break;
5737 if (*MinMaxCmpXZ) {
5738 // Expr Fact Result
5739 // min(X, Y) == Z X < Z false
5740 // max(X, Y) == Z X > Z false
5741 // min(X, Y) != Z X < Z true
5742 // max(X, Y) != Z X > Z true
5743 return replaceInstUsesWith(
5744 I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5745 } else {
5746 // Expr Fact Result
5747 // min(X, Y) == Z X > Z Y == Z
5748 // max(X, Y) == Z X < Z Y == Z
5749 // min(X, Y) != Z X > Z Y != Z
5750 // max(X, Y) != Z X < Z Y != Z
5751 return FoldIntoCmpYZ();
5752 }
5753 break;
5754 }
5755 case ICmpInst::ICMP_SLT:
5756 case ICmpInst::ICMP_ULT:
5757 case ICmpInst::ICMP_SLE:
5758 case ICmpInst::ICMP_ULE:
5759 case ICmpInst::ICMP_SGT:
5760 case ICmpInst::ICMP_UGT:
5761 case ICmpInst::ICMP_SGE:
5762 case ICmpInst::ICMP_UGE: {
5763 bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
5764 if (*CmpXZ) {
5765 if (IsSame) {
5766 // Expr Fact Result
5767 // min(X, Y) < Z X < Z true
5768 // min(X, Y) <= Z X <= Z true
5769 // max(X, Y) > Z X > Z true
5770 // max(X, Y) >= Z X >= Z true
5771 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
5772 } else {
5773 // Expr Fact Result
5774 // max(X, Y) < Z X < Z Y < Z
5775 // max(X, Y) <= Z X <= Z Y <= Z
5776 // min(X, Y) > Z X > Z Y > Z
5777 // min(X, Y) >= Z X >= Z Y >= Z
5778 return FoldIntoCmpYZ();
5779 }
5780 } else {
5781 if (IsSame) {
5782 // Expr Fact Result
5783 // min(X, Y) < Z X >= Z Y < Z
5784 // min(X, Y) <= Z X > Z Y <= Z
5785 // max(X, Y) > Z X <= Z Y > Z
5786 // max(X, Y) >= Z X < Z Y >= Z
5787 return FoldIntoCmpYZ();
5788 } else {
5789 // Expr Fact Result
5790 // max(X, Y) < Z X >= Z false
5791 // max(X, Y) <= Z X > Z false
5792 // min(X, Y) > Z X <= Z false
5793 // min(X, Y) >= Z X < Z false
5794 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
5795 }
5796 }
5797 break;
5798 }
5799 default:
5800 break;
5801 }
5802
5803 return nullptr;
5804}
5805
5806/// Match and fold patterns like:
5807/// icmp eq/ne X, min(max(X, Lo), Hi)
5808/// which represents a range check and can be represented as a ConstantRange.
5809///
5810/// For icmp eq, build ConstantRange [Lo, Hi + 1) and convert to:
5811/// (X - Lo) u< (Hi + 1 - Lo)
5812/// For icmp ne, build ConstantRange [Hi + 1, Lo) and convert to:
5813/// (X - (Hi + 1)) u< (Lo - (Hi + 1))
5815 MinMaxIntrinsic *Min) {
5816 if (!I.isEquality() || !Min->hasOneUse() || !Min->isMin())
5817 return nullptr;
5818
5819 const APInt *Lo = nullptr, *Hi = nullptr;
5820 if (Min->isSigned()) {
5821 if (!match(Min->getLHS(), m_OneUse(m_SMax(m_Specific(X), m_APInt(Lo)))) ||
5822 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->slt(*Hi))
5823 return nullptr;
5824 } else {
5825 if (!match(Min->getLHS(), m_OneUse(m_UMax(m_Specific(X), m_APInt(Lo)))) ||
5826 !match(Min->getRHS(), m_APInt(Hi)) || !Lo->ult(*Hi))
5827 return nullptr;
5828 }
5829
5832 APInt C, Offset;
5833 if (I.getPredicate() == ICmpInst::ICMP_EQ)
5834 CR.getEquivalentICmp(Pred, C, Offset);
5835 else
5836 CR.inverse().getEquivalentICmp(Pred, C, Offset);
5837
5838 if (!Offset.isZero())
5839 X = Builder.CreateAdd(X, ConstantInt::get(X->getType(), Offset));
5840
5841 return replaceInstUsesWith(
5842 I, Builder.CreateICmp(Pred, X, ConstantInt::get(X->getType(), C)));
5843}
5844
5845// Canonicalize checking for a power-of-2-or-zero value:
5847 InstCombiner::BuilderTy &Builder) {
5848 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5849 const CmpInst::Predicate Pred = I.getPredicate();
5850 Value *A = nullptr;
5851 bool CheckIs;
5852 if (I.isEquality()) {
5853 // (A & (A-1)) == 0 --> ctpop(A) < 2 (two commuted variants)
5854 // ((A-1) & A) != 0 --> ctpop(A) > 1 (two commuted variants)
5855 if (!match(Op0, m_OneUse(m_c_And(m_Add(m_Value(A), m_AllOnes()),
5856 m_Deferred(A)))) ||
5857 !match(Op1, m_ZeroInt()))
5858 A = nullptr;
5859
5860 // (A & -A) == A --> ctpop(A) < 2 (four commuted variants)
5861 // (-A & A) != A --> ctpop(A) > 1 (four commuted variants)
5862 if (match(Op0, m_OneUse(m_c_And(m_Neg(m_Specific(Op1)), m_Specific(Op1)))))
5863 A = Op1;
5864 else if (match(Op1,
5866 A = Op0;
5867
5868 CheckIs = Pred == ICmpInst::ICMP_EQ;
5869 } else if (ICmpInst::isUnsigned(Pred)) {
5870 // (A ^ (A-1)) u>= A --> ctpop(A) < 2 (two commuted variants)
5871 // ((A-1) ^ A) u< A --> ctpop(A) > 1 (two commuted variants)
5872
5873 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_ULT) &&
5875 m_Specific(Op1))))) {
5876 A = Op1;
5877 CheckIs = Pred == ICmpInst::ICMP_UGE;
5878 } else if ((Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_ULE) &&
5880 m_Specific(Op0))))) {
5881 A = Op0;
5882 CheckIs = Pred == ICmpInst::ICMP_ULE;
5883 }
5884 }
5885
5886 if (A) {
5887 Type *Ty = A->getType();
5888 CallInst *CtPop = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, A);
5889 return CheckIs ? new ICmpInst(ICmpInst::ICMP_ULT, CtPop,
5890 ConstantInt::get(Ty, 2))
5891 : new ICmpInst(ICmpInst::ICMP_UGT, CtPop,
5892 ConstantInt::get(Ty, 1));
5893 }
5894
5895 return nullptr;
5896}
5897
5898/// Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
5899using OffsetOp = std::pair<Instruction::BinaryOps, Value *>;
5901 bool AllowRecursion) {
5903 if (!Inst || !Inst->hasOneUse())
5904 return;
5905
5906 switch (Inst->getOpcode()) {
5907 case Instruction::Add:
5908 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(1));
5909 Offsets.emplace_back(Instruction::Sub, Inst->getOperand(0));
5910 break;
5911 case Instruction::Sub:
5912 Offsets.emplace_back(Instruction::Add, Inst->getOperand(1));
5913 break;
5914 case Instruction::Xor:
5915 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(1));
5916 Offsets.emplace_back(Instruction::Xor, Inst->getOperand(0));
5917 break;
5918 case Instruction::Shl:
5919 if (Inst->hasNoSignedWrap())
5920 Offsets.emplace_back(Instruction::AShr, Inst->getOperand(1));
5921 if (Inst->hasNoUnsignedWrap())
5922 Offsets.emplace_back(Instruction::LShr, Inst->getOperand(1));
5923 break;
5924 case Instruction::Select:
5925 if (AllowRecursion) {
5926 collectOffsetOp(Inst->getOperand(1), Offsets, /*AllowRecursion=*/false);
5927 collectOffsetOp(Inst->getOperand(2), Offsets, /*AllowRecursion=*/false);
5928 }
5929 break;
5930 default:
5931 break;
5932 }
5933}
5934
5936
5941
5943 return {OffsetKind::Invalid, nullptr, nullptr, nullptr, nullptr};
5944 }
5946 return {OffsetKind::Value, V, nullptr, nullptr, nullptr};
5947 }
5948 static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV,
5950 return {OffsetKind::Select, Cond, TrueV, FalseV, MDFrom};
5951 }
5952 bool isValid() const { return Kind != OffsetKind::Invalid; }
5954 switch (Kind) {
5956 llvm_unreachable("Invalid offset result");
5957 case OffsetKind::Value:
5958 return V0;
5959 case OffsetKind::Select:
5960 return Builder.CreateSelect(
5961 V0, V1, V2, "", ProfcheckDisableMetadataFixes ? nullptr : MDFrom);
5962 }
5963 llvm_unreachable("Unknown OffsetKind enum");
5964 }
5965};
5966
5967/// Offset both sides of an equality icmp to see if we can save some
5968/// instructions: icmp eq/ne X, Y -> icmp eq/ne X op Z, Y op Z.
5969/// Note: This operation should not introduce poison.
5971 InstCombiner::BuilderTy &Builder,
5972 const SimplifyQuery &SQ) {
5973 assert(I.isEquality() && "Expected an equality icmp");
5974 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5975 if (!Op0->getType()->isIntOrIntVectorTy())
5976 return nullptr;
5977
5978 SmallVector<OffsetOp, 4> OffsetOps;
5979 collectOffsetOp(Op0, OffsetOps, /*AllowRecursion=*/true);
5980 collectOffsetOp(Op1, OffsetOps, /*AllowRecursion=*/true);
5981
5982 auto ApplyOffsetImpl = [&](Value *V, unsigned BinOpc, Value *RHS) -> Value * {
5983 switch (BinOpc) {
5984 // V = shl nsw X, RHS => X = ashr V, RHS
5985 case Instruction::AShr: {
5986 const APInt *CV, *CRHS;
5987 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
5988 CV->ashr(*CRHS).shl(*CRHS) == *CV) &&
5990 return nullptr;
5991 break;
5992 }
5993 // V = shl nuw X, RHS => X = lshr V, RHS
5994 case Instruction::LShr: {
5995 const APInt *CV, *CRHS;
5996 if (!(match(V, m_APInt(CV)) && match(RHS, m_APInt(CRHS)) &&
5997 CV->lshr(*CRHS).shl(*CRHS) == *CV) &&
5999 return nullptr;
6000 break;
6001 }
6002 default:
6003 break;
6004 }
6005
6006 Value *Simplified = simplifyBinOp(BinOpc, V, RHS, SQ);
6007 if (!Simplified)
6008 return nullptr;
6009 // Reject constant expressions as they don't simplify things.
6010 if (isa<Constant>(Simplified) && !match(Simplified, m_ImmConstant()))
6011 return nullptr;
6012 // Check if the transformation introduces poison.
6013 return impliesPoison(RHS, V) ? Simplified : nullptr;
6014 };
6015
6016 auto ApplyOffset = [&](Value *V, unsigned BinOpc,
6017 Value *RHS) -> OffsetResult {
6018 if (auto *Sel = dyn_cast<SelectInst>(V)) {
6019 if (!Sel->hasOneUse())
6020 return OffsetResult::invalid();
6021 Value *TrueVal = ApplyOffsetImpl(Sel->getTrueValue(), BinOpc, RHS);
6022 if (!TrueVal)
6023 return OffsetResult::invalid();
6024 Value *FalseVal = ApplyOffsetImpl(Sel->getFalseValue(), BinOpc, RHS);
6025 if (!FalseVal)
6026 return OffsetResult::invalid();
6027 return OffsetResult::select(Sel->getCondition(), TrueVal, FalseVal, Sel);
6028 }
6029 if (Value *Simplified = ApplyOffsetImpl(V, BinOpc, RHS))
6030 return OffsetResult::value(Simplified);
6031 return OffsetResult::invalid();
6032 };
6033
6034 for (auto [BinOp, RHS] : OffsetOps) {
6035 auto BinOpc = static_cast<unsigned>(BinOp);
6036
6037 auto Op0Result = ApplyOffset(Op0, BinOpc, RHS);
6038 if (!Op0Result.isValid())
6039 continue;
6040 auto Op1Result = ApplyOffset(Op1, BinOpc, RHS);
6041 if (!Op1Result.isValid())
6042 continue;
6043
6044 Value *NewLHS = Op0Result.materialize(Builder);
6045 Value *NewRHS = Op1Result.materialize(Builder);
6046 return new ICmpInst(I.getPredicate(), NewLHS, NewRHS);
6047 }
6048
6049 return nullptr;
6050}
6051
6053 if (!I.isEquality())
6054 return nullptr;
6055
6056 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6057 const CmpInst::Predicate Pred = I.getPredicate();
6058 Value *A, *B, *C, *D;
6059 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
6060 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
6061 Value *OtherVal = A == Op1 ? B : A;
6062 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6063 }
6064
6065 if (match(Op1, m_Xor(m_Value(C), m_Value(D)))) {
6066 // A^c1 == C^c2 --> A == C^(c1^c2)
6067 ConstantInt *C1, *C2;
6068 if (match(B, m_ConstantInt(C1)) && match(D, m_ConstantInt(C2)) &&
6069 Op1->hasOneUse()) {
6070 Constant *NC = Builder.getInt(C1->getValue() ^ C2->getValue());
6071 Value *Xor = Builder.CreateXor(C, NC);
6072 return new ICmpInst(Pred, A, Xor);
6073 }
6074
6075 // A^B == A^D -> B == D
6076 if (A == C)
6077 return new ICmpInst(Pred, B, D);
6078 if (A == D)
6079 return new ICmpInst(Pred, B, C);
6080 if (B == C)
6081 return new ICmpInst(Pred, A, D);
6082 if (B == D)
6083 return new ICmpInst(Pred, A, C);
6084 }
6085 }
6086
6087 if (match(Op1, m_Xor(m_Value(A), m_Value(B))) && (A == Op0 || B == Op0)) {
6088 // A == (A^B) -> B == 0
6089 Value *OtherVal = A == Op0 ? B : A;
6090 return new ICmpInst(Pred, OtherVal, Constant::getNullValue(A->getType()));
6091 }
6092
6093 // (X&Z) == (Y&Z) -> (X^Y) & Z == 0
6094 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
6095 match(Op1, m_And(m_Value(C), m_Value(D)))) {
6096 Value *X = nullptr, *Y = nullptr, *Z = nullptr;
6097
6098 if (A == C) {
6099 X = B;
6100 Y = D;
6101 Z = A;
6102 } else if (A == D) {
6103 X = B;
6104 Y = C;
6105 Z = A;
6106 } else if (B == C) {
6107 X = A;
6108 Y = D;
6109 Z = B;
6110 } else if (B == D) {
6111 X = A;
6112 Y = C;
6113 Z = B;
6114 }
6115
6116 if (X) {
6117 // If X^Y is a negative power of two, then `icmp eq/ne (Z & NegP2), 0`
6118 // will fold to `icmp ult/uge Z, -NegP2` incurringb no additional
6119 // instructions.
6120 const APInt *C0, *C1;
6121 bool XorIsNegP2 = match(X, m_APInt(C0)) && match(Y, m_APInt(C1)) &&
6122 (*C0 ^ *C1).isNegatedPowerOf2();
6123
6124 // If either Op0/Op1 are both one use or X^Y will constant fold and one of
6125 // Op0/Op1 are one use, proceed. In those cases we are instruction neutral
6126 // but `icmp eq/ne A, 0` is easier to analyze than `icmp eq/ne A, B`.
6127 int UseCnt =
6128 int(Op0->hasOneUse()) + int(Op1->hasOneUse()) +
6129 (int(match(X, m_ImmConstant()) && match(Y, m_ImmConstant())));
6130 if (XorIsNegP2 || UseCnt >= 2) {
6131 // Build (X^Y) & Z
6132 Op1 = Builder.CreateXor(X, Y);
6133 Op1 = Builder.CreateAnd(Op1, Z);
6134 return new ICmpInst(Pred, Op1, Constant::getNullValue(Op1->getType()));
6135 }
6136 }
6137 }
6138
6139 {
6140 // Similar to above, but specialized for constant because invert is needed:
6141 // (X | C) == (Y | C) --> (X ^ Y) & ~C == 0
6142 Value *X, *Y;
6143 Constant *C;
6144 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_Constant(C)))) &&
6145 match(Op1, m_OneUse(m_Or(m_Value(Y), m_Specific(C))))) {
6146 Value *Xor = Builder.CreateXor(X, Y);
6147 Value *And = Builder.CreateAnd(Xor, ConstantExpr::getNot(C));
6148 return new ICmpInst(Pred, And, Constant::getNullValue(And->getType()));
6149 }
6150 }
6151
6152 if (match(Op1, m_ZExt(m_Value(A))) &&
6153 (Op0->hasOneUse() || Op1->hasOneUse())) {
6154 // (B & (Pow2C-1)) == zext A --> A == trunc B
6155 // (B & (Pow2C-1)) != zext A --> A != trunc B
6156 const APInt *MaskC;
6157 if (match(Op0, m_And(m_Value(B), m_LowBitMask(MaskC))) &&
6158 MaskC->countr_one() == A->getType()->getScalarSizeInBits())
6159 return new ICmpInst(Pred, A, Builder.CreateTrunc(B, A->getType()));
6160 }
6161
6162 // (A >> C) == (B >> C) --> (A^B) u< (1 << C)
6163 // For lshr and ashr pairs.
6164 const APInt *AP1, *AP2;
6165 if ((match(Op0, m_OneUse(m_LShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6166 match(Op1, m_OneUse(m_LShr(m_Value(B), m_APIntAllowPoison(AP2))))) ||
6167 (match(Op0, m_OneUse(m_AShr(m_Value(A), m_APIntAllowPoison(AP1)))) &&
6168 match(Op1, m_OneUse(m_AShr(m_Value(B), m_APIntAllowPoison(AP2)))))) {
6169 if (*AP1 != *AP2)
6170 return nullptr;
6171 unsigned TypeBits = AP1->getBitWidth();
6172 unsigned ShAmt = AP1->getLimitedValue(TypeBits);
6173 if (ShAmt < TypeBits && ShAmt != 0) {
6174 ICmpInst::Predicate NewPred =
6176 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6177 APInt CmpVal = APInt::getOneBitSet(TypeBits, ShAmt);
6178 return new ICmpInst(NewPred, Xor, ConstantInt::get(A->getType(), CmpVal));
6179 }
6180 }
6181
6182 // (A << C) == (B << C) --> ((A^B) & (~0U >> C)) == 0
6183 ConstantInt *Cst1;
6184 if (match(Op0, m_OneUse(m_Shl(m_Value(A), m_ConstantInt(Cst1)))) &&
6185 match(Op1, m_OneUse(m_Shl(m_Value(B), m_Specific(Cst1))))) {
6186 unsigned TypeBits = Cst1->getBitWidth();
6187 unsigned ShAmt = (unsigned)Cst1->getLimitedValue(TypeBits);
6188 if (ShAmt < TypeBits && ShAmt != 0) {
6189 Value *Xor = Builder.CreateXor(A, B, I.getName() + ".unshifted");
6190 APInt AndVal = APInt::getLowBitsSet(TypeBits, TypeBits - ShAmt);
6191 Value *And =
6192 Builder.CreateAnd(Xor, Builder.getInt(AndVal), I.getName() + ".mask");
6193 return new ICmpInst(Pred, And, Constant::getNullValue(Cst1->getType()));
6194 }
6195 }
6196
6197 // Transform "icmp eq (trunc (lshr(X, cst1)), cst" to
6198 // "icmp (and X, mask), cst"
6199 uint64_t ShAmt = 0;
6200 if (Op0->hasOneUse() &&
6201 match(Op0, m_Trunc(m_OneUse(m_LShr(m_Value(A), m_ConstantInt(ShAmt))))) &&
6202 match(Op1, m_ConstantInt(Cst1)) &&
6203 // Only do this when A has multiple uses. This is most important to do
6204 // when it exposes other optimizations.
6205 !A->hasOneUse()) {
6206 unsigned ASize = cast<IntegerType>(A->getType())->getPrimitiveSizeInBits();
6207
6208 if (ShAmt < ASize) {
6209 APInt MaskV =
6211 MaskV <<= ShAmt;
6212
6213 APInt CmpV = Cst1->getValue().zext(ASize);
6214 CmpV <<= ShAmt;
6215
6216 Value *Mask = Builder.CreateAnd(A, Builder.getInt(MaskV));
6217 return new ICmpInst(Pred, Mask, Builder.getInt(CmpV));
6218 }
6219 }
6220
6222 return ICmp;
6223
6224 // Match icmp eq (trunc (lshr A, BW), (ashr (trunc A), BW-1)), which checks
6225 // the top BW/2 + 1 bits are all the same. Create "A >=s INT_MIN && A <=s
6226 // INT_MAX", which we generate as "icmp ult (add A, 2^(BW-1)), 2^BW" to skip a
6227 // few steps of instcombine.
6228 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
6229 if (match(Op0, m_AShr(m_Trunc(m_Value(A)), m_SpecificInt(BitWidth - 1))) &&
6231 A->getType()->getScalarSizeInBits() == BitWidth * 2 &&
6232 (I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse())) {
6234 Value *Add = Builder.CreateAdd(A, ConstantInt::get(A->getType(), C));
6235 return new ICmpInst(Pred == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_ULT
6237 Add, ConstantInt::get(A->getType(), C.shl(1)));
6238 }
6239
6240 // Canonicalize:
6241 // Assume B_Pow2 != 0
6242 // 1. A & B_Pow2 != B_Pow2 -> A & B_Pow2 == 0
6243 // 2. A & B_Pow2 == B_Pow2 -> A & B_Pow2 != 0
6244 if (match(Op0, m_c_And(m_Specific(Op1), m_Value())) &&
6245 isKnownToBeAPowerOfTwo(Op1, /* OrZero */ false, &I))
6246 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
6248
6249 if (match(Op1, m_c_And(m_Specific(Op0), m_Value())) &&
6250 isKnownToBeAPowerOfTwo(Op0, /* OrZero */ false, &I))
6251 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op1,
6252 ConstantInt::getNullValue(Op1->getType()));
6253
6254 // Canonicalize:
6255 // icmp eq/ne X, OneUse(rotate-right(X))
6256 // -> icmp eq/ne X, rotate-left(X)
6257 // We generally try to convert rotate-right -> rotate-left, this just
6258 // canonicalizes another case.
6259 if (match(&I, m_c_ICmp(m_Value(A),
6261 m_Deferred(A), m_Deferred(A), m_Value(B))))))
6262 return new ICmpInst(
6263 Pred, A,
6264 Builder.CreateIntrinsic(Op0->getType(), Intrinsic::fshl, {A, A, B}));
6265
6266 // Canonicalize:
6267 // icmp eq/ne OneUse(A ^ Cst), B --> icmp eq/ne (A ^ B), Cst
6268 Constant *Cst;
6271 return new ICmpInst(Pred, Builder.CreateXor(A, B), Cst);
6272
6273 {
6274 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6275 auto m_Matcher =
6278 m_Sub(m_Value(B), m_Deferred(A)));
6279 std::optional<bool> IsZero = std::nullopt;
6280 if (match(&I, m_c_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)),
6281 m_Deferred(A))))
6282 IsZero = false;
6283 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6284 else if (match(&I,
6285 m_ICmp(m_OneUse(m_c_And(m_Value(A), m_Matcher)), m_Zero())))
6286 IsZero = true;
6287
6288 if (IsZero && isKnownToBeAPowerOfTwo(A, /* OrZero */ true, &I))
6289 // (icmp eq/ne (and (add/sub/xor X, P2), P2), P2)
6290 // -> (icmp eq/ne (and X, P2), 0)
6291 // (icmp eq/ne (and (add/sub/xor X, P2), P2), 0)
6292 // -> (icmp eq/ne (and X, P2), P2)
6293 return new ICmpInst(Pred, Builder.CreateAnd(B, A),
6294 *IsZero ? A
6295 : ConstantInt::getNullValue(A->getType()));
6296 }
6297
6298 if (auto *Res = foldICmpEqualityWithOffset(
6299 I, Builder, getSimplifyQuery().getWithInstruction(&I)))
6300 return Res;
6301
6302 return nullptr;
6303}
6304
6306 ICmpInst::Predicate Pred = ICmp.getPredicate();
6307 Value *Op0 = ICmp.getOperand(0), *Op1 = ICmp.getOperand(1);
6308
6309 // Try to canonicalize trunc + compare-to-constant into a mask + cmp.
6310 // The trunc masks high bits while the compare may effectively mask low bits.
6311 Value *X;
6312 const APInt *C;
6313 if (!match(Op0, m_OneUse(m_Trunc(m_Value(X)))) || !match(Op1, m_APInt(C)))
6314 return nullptr;
6315
6316 // This matches patterns corresponding to tests of the signbit as well as:
6317 // (trunc X) pred C2 --> (X & Mask) == C
6318 if (auto Res = decomposeBitTestICmp(Op0, Op1, Pred, /*LookThroughTrunc=*/true,
6319 /*AllowNonZeroC=*/true)) {
6320 Value *And = Builder.CreateAnd(Res->X, Res->Mask);
6321 Constant *C = ConstantInt::get(Res->X->getType(), Res->C);
6322 return new ICmpInst(Res->Pred, And, C);
6323 }
6324
6325 unsigned SrcBits = X->getType()->getScalarSizeInBits();
6326 if (auto *II = dyn_cast<IntrinsicInst>(X)) {
6327 if (II->getIntrinsicID() == Intrinsic::cttz ||
6328 II->getIntrinsicID() == Intrinsic::ctlz) {
6329 unsigned MaxRet = SrcBits;
6330 // If the "is_zero_poison" argument is set, then we know at least
6331 // one bit is set in the input, so the result is always at least one
6332 // less than the full bitwidth of that input.
6333 if (match(II->getArgOperand(1), m_One()))
6334 MaxRet--;
6335
6336 // Make sure the destination is wide enough to hold the largest output of
6337 // the intrinsic.
6338 if (llvm::Log2_32(MaxRet) + 1 <= Op0->getType()->getScalarSizeInBits())
6339 if (Instruction *I =
6340 foldICmpIntrinsicWithConstant(ICmp, II, C->zext(SrcBits)))
6341 return I;
6342 }
6343 }
6344
6345 return nullptr;
6346}
6347
6349 assert(isa<CastInst>(ICmp.getOperand(0)) && "Expected cast for operand 0");
6350 auto *CastOp0 = cast<CastInst>(ICmp.getOperand(0));
6351 Value *X;
6352 if (!match(CastOp0, m_ZExtOrSExt(m_Value(X))))
6353 return nullptr;
6354
6355 bool IsSignedExt = CastOp0->getOpcode() == Instruction::SExt;
6356 bool IsSignedCmp = ICmp.isSigned();
6357
6358 // icmp Pred (ext X), (ext Y)
6359 Value *Y;
6360 if (match(ICmp.getOperand(1), m_ZExtOrSExt(m_Value(Y)))) {
6361 bool IsZext0 = isa<ZExtInst>(ICmp.getOperand(0));
6362 bool IsZext1 = isa<ZExtInst>(ICmp.getOperand(1));
6363
6364 if (IsZext0 != IsZext1) {
6365 // If X and Y and both i1
6366 // (icmp eq/ne (zext X) (sext Y))
6367 // eq -> (icmp eq (or X, Y), 0)
6368 // ne -> (icmp ne (or X, Y), 0)
6369 if (ICmp.isEquality() && X->getType()->isIntOrIntVectorTy(1) &&
6370 Y->getType()->isIntOrIntVectorTy(1))
6371 return new ICmpInst(ICmp.getPredicate(), Builder.CreateOr(X, Y),
6372 Constant::getNullValue(X->getType()));
6373
6374 // If we have mismatched casts and zext has the nneg flag, we can
6375 // treat the "zext nneg" as "sext". Otherwise, we cannot fold and quit.
6376
6377 auto *NonNegInst0 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(0));
6378 auto *NonNegInst1 = dyn_cast<PossiblyNonNegInst>(ICmp.getOperand(1));
6379
6380 bool IsNonNeg0 = NonNegInst0 && NonNegInst0->hasNonNeg();
6381 bool IsNonNeg1 = NonNegInst1 && NonNegInst1->hasNonNeg();
6382
6383 if ((IsZext0 && IsNonNeg0) || (IsZext1 && IsNonNeg1))
6384 IsSignedExt = true;
6385 else
6386 return nullptr;
6387 }
6388
6389 // Not an extension from the same type?
6390 Type *XTy = X->getType(), *YTy = Y->getType();
6391 if (XTy != YTy) {
6392 // One of the casts must have one use because we are creating a new cast.
6393 if (!ICmp.getOperand(0)->hasOneUse() && !ICmp.getOperand(1)->hasOneUse())
6394 return nullptr;
6395 // Extend the narrower operand to the type of the wider operand.
6396 CastInst::CastOps CastOpcode =
6397 IsSignedExt ? Instruction::SExt : Instruction::ZExt;
6398 if (XTy->getScalarSizeInBits() < YTy->getScalarSizeInBits())
6399 X = Builder.CreateCast(CastOpcode, X, YTy);
6400 else if (YTy->getScalarSizeInBits() < XTy->getScalarSizeInBits())
6401 Y = Builder.CreateCast(CastOpcode, Y, XTy);
6402 else
6403 return nullptr;
6404 }
6405
6406 // (zext X) == (zext Y) --> X == Y
6407 // (sext X) == (sext Y) --> X == Y
6408 if (ICmp.isEquality())
6409 return new ICmpInst(ICmp.getPredicate(), X, Y);
6410
6411 // A signed comparison of sign extended values simplifies into a
6412 // signed comparison.
6413 if (IsSignedCmp && IsSignedExt)
6414 return new ICmpInst(ICmp.getPredicate(), X, Y);
6415
6416 // The other three cases all fold into an unsigned comparison.
6417 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Y);
6418 }
6419
6420 // Below here, we are only folding a compare with constant.
6421 auto *C = dyn_cast<Constant>(ICmp.getOperand(1));
6422 if (!C)
6423 return nullptr;
6424
6425 // If a lossless truncate is possible...
6426 Type *SrcTy = CastOp0->getSrcTy();
6427 Constant *Res = getLosslessInvCast(C, SrcTy, CastOp0->getOpcode(), DL);
6428 if (Res) {
6429 if (ICmp.isEquality())
6430 return new ICmpInst(ICmp.getPredicate(), X, Res);
6431
6432 // A signed comparison of sign extended values simplifies into a
6433 // signed comparison.
6434 if (IsSignedExt && IsSignedCmp)
6435 return new ICmpInst(ICmp.getPredicate(), X, Res);
6436
6437 // The other three cases all fold into an unsigned comparison.
6438 return new ICmpInst(ICmp.getUnsignedPredicate(), X, Res);
6439 }
6440
6441 // The re-extended constant changed, partly changed (in the case of a vector),
6442 // or could not be determined to be equal (in the case of a constant
6443 // expression), so the constant cannot be represented in the shorter type.
6444 // All the cases that fold to true or false will have already been handled
6445 // by simplifyICmpInst, so only deal with the tricky case.
6446 if (IsSignedCmp || !IsSignedExt || !isa<ConstantInt>(C))
6447 return nullptr;
6448
6449 // Is source op positive?
6450 // icmp ult (sext X), C --> icmp sgt X, -1
6451 if (ICmp.getPredicate() == ICmpInst::ICMP_ULT)
6453
6454 // Is source op negative?
6455 // icmp ugt (sext X), C --> icmp slt X, 0
6456 assert(ICmp.getPredicate() == ICmpInst::ICMP_UGT && "ICmp should be folded!");
6458}
6459
6460/// Handle icmp (cast x), (cast or constant).
6462 // If any operand of ICmp is a inttoptr roundtrip cast then remove it as
6463 // icmp compares only pointer's value.
6464 // icmp (inttoptr (ptrtoint p1)), p2 --> icmp p1, p2.
6465 Value *SimplifiedOp0 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(0));
6466 Value *SimplifiedOp1 = simplifyIntToPtrRoundTripCast(ICmp.getOperand(1));
6467 if (SimplifiedOp0 || SimplifiedOp1)
6468 return new ICmpInst(ICmp.getPredicate(),
6469 SimplifiedOp0 ? SimplifiedOp0 : ICmp.getOperand(0),
6470 SimplifiedOp1 ? SimplifiedOp1 : ICmp.getOperand(1));
6471
6472 auto *CastOp0 = dyn_cast<CastInst>(ICmp.getOperand(0));
6473 if (!CastOp0)
6474 return nullptr;
6475 if (!isa<Constant>(ICmp.getOperand(1)) && !isa<CastInst>(ICmp.getOperand(1)))
6476 return nullptr;
6477
6478 Value *Op0Src = CastOp0->getOperand(0);
6479 Type *SrcTy = CastOp0->getSrcTy();
6480 Type *DestTy = CastOp0->getDestTy();
6481
6482 // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
6483 // integer type is the same size as the pointer type.
6484 auto CompatibleSizes = [&](Type *PtrTy, Type *IntTy) {
6485 if (isa<VectorType>(PtrTy)) {
6486 PtrTy = cast<VectorType>(PtrTy)->getElementType();
6487 IntTy = cast<VectorType>(IntTy)->getElementType();
6488 }
6489 return DL.getPointerTypeSizeInBits(PtrTy) == IntTy->getIntegerBitWidth();
6490 };
6491 if (CastOp0->getOpcode() == Instruction::PtrToInt &&
6492 CompatibleSizes(SrcTy, DestTy)) {
6493 Value *NewOp1 = nullptr;
6494 if (auto *PtrToIntOp1 = dyn_cast<PtrToIntOperator>(ICmp.getOperand(1))) {
6495 Value *PtrSrc = PtrToIntOp1->getOperand(0);
6496 if (PtrSrc->getType() == Op0Src->getType())
6497 NewOp1 = PtrToIntOp1->getOperand(0);
6498 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6499 NewOp1 = ConstantExpr::getIntToPtr(RHSC, SrcTy);
6500 }
6501
6502 if (NewOp1)
6503 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6504 }
6505
6506 // Do the same in the other direction for icmp (inttoptr x), (inttoptr/c).
6507 if (CastOp0->getOpcode() == Instruction::IntToPtr &&
6508 CompatibleSizes(DestTy, SrcTy)) {
6509 Value *NewOp1 = nullptr;
6510 if (auto *IntToPtrOp1 = dyn_cast<IntToPtrInst>(ICmp.getOperand(1))) {
6511 Value *IntSrc = IntToPtrOp1->getOperand(0);
6512 if (IntSrc->getType() == Op0Src->getType())
6513 NewOp1 = IntToPtrOp1->getOperand(0);
6514 } else if (auto *RHSC = dyn_cast<Constant>(ICmp.getOperand(1))) {
6515 NewOp1 = ConstantFoldConstant(ConstantExpr::getPtrToInt(RHSC, SrcTy), DL);
6516 }
6517
6518 if (NewOp1)
6519 return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
6520 }
6521
6522 if (Instruction *R = foldICmpWithTrunc(ICmp))
6523 return R;
6524
6525 return foldICmpWithZextOrSext(ICmp);
6526}
6527
6529 bool IsSigned) {
6530 switch (BinaryOp) {
6531 default:
6532 llvm_unreachable("Unsupported binary op");
6533 case Instruction::Add:
6534 case Instruction::Sub:
6535 return match(RHS, m_Zero());
6536 case Instruction::Mul:
6537 return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
6538 match(RHS, m_One());
6539 }
6540}
6541
6544 bool IsSigned, Value *LHS, Value *RHS,
6545 Instruction *CxtI) const {
6546 switch (BinaryOp) {
6547 default:
6548 llvm_unreachable("Unsupported binary op");
6549 case Instruction::Add:
6550 if (IsSigned)
6551 return computeOverflowForSignedAdd(LHS, RHS, CxtI);
6552 else
6553 return computeOverflowForUnsignedAdd(LHS, RHS, CxtI);
6554 case Instruction::Sub:
6555 if (IsSigned)
6556 return computeOverflowForSignedSub(LHS, RHS, CxtI);
6557 else
6558 return computeOverflowForUnsignedSub(LHS, RHS, CxtI);
6559 case Instruction::Mul:
6560 if (IsSigned)
6561 return computeOverflowForSignedMul(LHS, RHS, CxtI);
6562 else
6563 return computeOverflowForUnsignedMul(LHS, RHS, CxtI);
6564 }
6565}
6566
6567bool InstCombinerImpl::OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp,
6568 bool IsSigned, Value *LHS,
6569 Value *RHS, Instruction &OrigI,
6570 Value *&Result,
6571 Constant *&Overflow) {
6572 if (OrigI.isCommutative() && isa<Constant>(LHS) && !isa<Constant>(RHS))
6573 std::swap(LHS, RHS);
6574
6575 // If the overflow check was an add followed by a compare, the insertion point
6576 // may be pointing to the compare. We want to insert the new instructions
6577 // before the add in case there are uses of the add between the add and the
6578 // compare.
6579 Builder.SetInsertPoint(&OrigI);
6580
6581 Type *OverflowTy = Type::getInt1Ty(LHS->getContext());
6582 if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
6583 OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
6584
6585 if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
6586 Result = LHS;
6587 Overflow = ConstantInt::getFalse(OverflowTy);
6588 return true;
6589 }
6590
6591 switch (computeOverflow(BinaryOp, IsSigned, LHS, RHS, &OrigI)) {
6593 return false;
6596 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6597 Result->takeName(&OrigI);
6598 Overflow = ConstantInt::getTrue(OverflowTy);
6599 return true;
6601 Result = Builder.CreateBinOp(BinaryOp, LHS, RHS);
6602 Result->takeName(&OrigI);
6603 Overflow = ConstantInt::getFalse(OverflowTy);
6604 if (auto *Inst = dyn_cast<Instruction>(Result)) {
6605 if (IsSigned)
6606 Inst->setHasNoSignedWrap();
6607 else
6608 Inst->setHasNoUnsignedWrap();
6609 }
6610 return true;
6611 }
6612
6613 llvm_unreachable("Unexpected overflow result");
6614}
6615
6616/// Recognize and process idiom involving test for multiplication
6617/// overflow.
6618///
6619/// The caller has matched a pattern of the form:
6620/// I = cmp u (mul(zext A, zext B), V
6621/// The function checks if this is a test for overflow and if so replaces
6622/// multiplication with call to 'mul.with.overflow' intrinsic.
6623///
6624/// \param I Compare instruction.
6625/// \param MulVal Result of 'mult' instruction. It is one of the arguments of
6626/// the compare instruction. Must be of integer type.
6627/// \param OtherVal The other argument of compare instruction.
6628/// \returns Instruction which must replace the compare instruction, NULL if no
6629/// replacement required.
6631 const APInt *OtherVal,
6632 InstCombinerImpl &IC) {
6633 // Don't bother doing this transformation for pointers, don't do it for
6634 // vectors.
6635 if (!isa<IntegerType>(MulVal->getType()))
6636 return nullptr;
6637
6638 auto *MulInstr = dyn_cast<Instruction>(MulVal);
6639 if (!MulInstr)
6640 return nullptr;
6641 assert(MulInstr->getOpcode() == Instruction::Mul);
6642
6643 auto *LHS = cast<ZExtInst>(MulInstr->getOperand(0)),
6644 *RHS = cast<ZExtInst>(MulInstr->getOperand(1));
6645 assert(LHS->getOpcode() == Instruction::ZExt);
6646 assert(RHS->getOpcode() == Instruction::ZExt);
6647 Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
6648
6649 // Calculate type and width of the result produced by mul.with.overflow.
6650 Type *TyA = A->getType(), *TyB = B->getType();
6651 unsigned WidthA = TyA->getPrimitiveSizeInBits(),
6652 WidthB = TyB->getPrimitiveSizeInBits();
6653 unsigned MulWidth;
6654 Type *MulType;
6655 if (WidthB > WidthA) {
6656 MulWidth = WidthB;
6657 MulType = TyB;
6658 } else {
6659 MulWidth = WidthA;
6660 MulType = TyA;
6661 }
6662
6663 // In order to replace the original mul with a narrower mul.with.overflow,
6664 // all uses must ignore upper bits of the product. The number of used low
6665 // bits must be not greater than the width of mul.with.overflow.
6666 if (MulVal->hasNUsesOrMore(2))
6667 for (User *U : MulVal->users()) {
6668 if (U == &I)
6669 continue;
6670 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6671 // Check if truncation ignores bits above MulWidth.
6672 unsigned TruncWidth = TI->getType()->getPrimitiveSizeInBits();
6673 if (TruncWidth > MulWidth)
6674 return nullptr;
6675 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6676 // Check if AND ignores bits above MulWidth.
6677 if (BO->getOpcode() != Instruction::And)
6678 return nullptr;
6679 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1))) {
6680 const APInt &CVal = CI->getValue();
6681 if (CVal.getBitWidth() - CVal.countl_zero() > MulWidth)
6682 return nullptr;
6683 } else {
6684 // In this case we could have the operand of the binary operation
6685 // being defined in another block, and performing the replacement
6686 // could break the dominance relation.
6687 return nullptr;
6688 }
6689 } else {
6690 // Other uses prohibit this transformation.
6691 return nullptr;
6692 }
6693 }
6694
6695 // Recognize patterns
6696 switch (I.getPredicate()) {
6697 case ICmpInst::ICMP_UGT: {
6698 // Recognize pattern:
6699 // mulval = mul(zext A, zext B)
6700 // cmp ugt mulval, max
6701 APInt MaxVal = APInt::getMaxValue(MulWidth);
6702 MaxVal = MaxVal.zext(OtherVal->getBitWidth());
6703 if (MaxVal.eq(*OtherVal))
6704 break; // Recognized
6705 return nullptr;
6706 }
6707
6708 case ICmpInst::ICMP_ULT: {
6709 // Recognize pattern:
6710 // mulval = mul(zext A, zext B)
6711 // cmp ule mulval, max + 1
6712 APInt MaxVal = APInt::getOneBitSet(OtherVal->getBitWidth(), MulWidth);
6713 if (MaxVal.eq(*OtherVal))
6714 break; // Recognized
6715 return nullptr;
6716 }
6717
6718 default:
6719 return nullptr;
6720 }
6721
6722 InstCombiner::BuilderTy &Builder = IC.Builder;
6723 Builder.SetInsertPoint(MulInstr);
6724
6725 // Replace: mul(zext A, zext B) --> mul.with.overflow(A, B)
6726 Value *MulA = A, *MulB = B;
6727 if (WidthA < MulWidth)
6728 MulA = Builder.CreateZExt(A, MulType);
6729 if (WidthB < MulWidth)
6730 MulB = Builder.CreateZExt(B, MulType);
6731 CallInst *Call =
6732 Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, MulType,
6733 {MulA, MulB}, /*FMFSource=*/nullptr, "umul");
6734 IC.addToWorklist(MulInstr);
6735
6736 // If there are uses of mul result other than the comparison, we know that
6737 // they are truncation or binary AND. Change them to use result of
6738 // mul.with.overflow and adjust properly mask/size.
6739 if (MulVal->hasNUsesOrMore(2)) {
6740 Value *Mul = Builder.CreateExtractValue(Call, 0, "umul.value");
6741 for (User *U : make_early_inc_range(MulVal->users())) {
6742 if (U == &I)
6743 continue;
6744 if (TruncInst *TI = dyn_cast<TruncInst>(U)) {
6745 if (TI->getType()->getPrimitiveSizeInBits() == MulWidth)
6746 IC.replaceInstUsesWith(*TI, Mul);
6747 else
6748 TI->setOperand(0, Mul);
6749 } else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
6750 assert(BO->getOpcode() == Instruction::And);
6751 // Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
6752 ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
6753 APInt ShortMask = CI->getValue().trunc(MulWidth);
6754 Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
6755 Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
6756 IC.replaceInstUsesWith(*BO, Zext);
6757 } else {
6758 llvm_unreachable("Unexpected Binary operation");
6759 }
6761 }
6762 }
6763
6764 // The original icmp gets replaced with the overflow value, maybe inverted
6765 // depending on predicate.
6766 if (I.getPredicate() == ICmpInst::ICMP_ULT) {
6767 Value *Res = Builder.CreateExtractValue(Call, 1);
6768 return BinaryOperator::CreateNot(Res);
6769 }
6770
6771 return ExtractValueInst::Create(Call, 1);
6772}
6773
6774/// When performing a comparison against a constant, it is possible that not all
6775/// the bits in the LHS are demanded. This helper method computes the mask that
6776/// IS demanded.
6778 const APInt *RHS;
6779 if (!match(I.getOperand(1), m_APInt(RHS)))
6781
6782 // If this is a normal comparison, it demands all bits. If it is a sign bit
6783 // comparison, it only demands the sign bit.
6784 bool UnusedBit;
6785 if (isSignBitCheck(I.getPredicate(), *RHS, UnusedBit))
6787
6788 switch (I.getPredicate()) {
6789 // For a UGT comparison, we don't care about any bits that
6790 // correspond to the trailing ones of the comparand. The value of these
6791 // bits doesn't impact the outcome of the comparison, because any value
6792 // greater than the RHS must differ in a bit higher than these due to carry.
6793 case ICmpInst::ICMP_UGT:
6794 return APInt::getBitsSetFrom(BitWidth, RHS->countr_one());
6795
6796 // Similarly, for a ULT comparison, we don't care about the trailing zeros.
6797 // Any value less than the RHS must differ in a higher bit because of carries.
6798 case ICmpInst::ICMP_ULT:
6799 return APInt::getBitsSetFrom(BitWidth, RHS->countr_zero());
6800
6801 default:
6803 }
6804}
6805
6806/// Check that one use is in the same block as the definition and all
6807/// other uses are in blocks dominated by a given block.
6808///
6809/// \param DI Definition
6810/// \param UI Use
6811/// \param DB Block that must dominate all uses of \p DI outside
6812/// the parent block
6813/// \return true when \p UI is the only use of \p DI in the parent block
6814/// and all other uses of \p DI are in blocks dominated by \p DB.
6815///
6817 const Instruction *UI,
6818 const BasicBlock *DB) const {
6819 assert(DI && UI && "Instruction not defined\n");
6820 // Ignore incomplete definitions.
6821 if (!DI->getParent())
6822 return false;
6823 // DI and UI must be in the same block.
6824 if (DI->getParent() != UI->getParent())
6825 return false;
6826 // Protect from self-referencing blocks.
6827 if (DI->getParent() == DB)
6828 return false;
6829 for (const User *U : DI->users()) {
6830 auto *Usr = cast<Instruction>(U);
6831 if (Usr != UI && !DT.dominates(DB, Usr->getParent()))
6832 return false;
6833 }
6834 return true;
6835}
6836
6837/// Return true when the instruction sequence within a block is select-cmp-br.
6839 const BasicBlock *BB = SI->getParent();
6840 if (!BB)
6841 return false;
6843 if (!BI)
6844 return false;
6845 auto *IC = dyn_cast<ICmpInst>(BI->getCondition());
6846 if (!IC || (IC->getOperand(0) != SI && IC->getOperand(1) != SI))
6847 return false;
6848 return true;
6849}
6850
6851/// True when a select result is replaced by one of its operands
6852/// in select-icmp sequence. This will eventually result in the elimination
6853/// of the select.
6854///
6855/// \param SI Select instruction
6856/// \param Icmp Compare instruction
6857/// \param SIOpd Operand that replaces the select
6858///
6859/// Notes:
6860/// - The replacement is global and requires dominator information
6861/// - The caller is responsible for the actual replacement
6862///
6863/// Example:
6864///
6865/// entry:
6866/// %4 = select i1 %3, %C* %0, %C* null
6867/// %5 = icmp eq %C* %4, null
6868/// br i1 %5, label %9, label %7
6869/// ...
6870/// ; <label>:7 ; preds = %entry
6871/// %8 = getelementptr inbounds %C* %4, i64 0, i32 0
6872/// ...
6873///
6874/// can be transformed to
6875///
6876/// %5 = icmp eq %C* %0, null
6877/// %6 = select i1 %3, i1 %5, i1 true
6878/// br i1 %6, label %9, label %7
6879/// ...
6880/// ; <label>:7 ; preds = %entry
6881/// %8 = getelementptr inbounds %C* %0, i64 0, i32 0 // replace by %0!
6882///
6883/// Similar when the first operand of the select is a constant or/and
6884/// the compare is for not equal rather than equal.
6885///
6886/// NOTE: The function is only called when the select and compare constants
6887/// are equal, the optimization can work only for EQ predicates. This is not a
6888/// major restriction since a NE compare should be 'normalized' to an equal
6889/// compare, which usually happens in the combiner and test case
6890/// select-cmp-br.ll checks for it.
6892 const ICmpInst *Icmp,
6893 const unsigned SIOpd) {
6894 assert((SIOpd == 1 || SIOpd == 2) && "Invalid select operand!");
6896 BasicBlock *Succ = SI->getParent()->getTerminator()->getSuccessor(1);
6897 // The check for the single predecessor is not the best that can be
6898 // done. But it protects efficiently against cases like when SI's
6899 // home block has two successors, Succ and Succ1, and Succ1 predecessor
6900 // of Succ. Then SI can't be replaced by SIOpd because the use that gets
6901 // replaced can be reached on either path. So the uniqueness check
6902 // guarantees that the path all uses of SI (outside SI's parent) are on
6903 // is disjoint from all other paths out of SI. But that information
6904 // is more expensive to compute, and the trade-off here is in favor
6905 // of compile-time. It should also be noticed that we check for a single
6906 // predecessor and not only uniqueness. This to handle the situation when
6907 // Succ and Succ1 points to the same basic block.
6908 if (Succ->getSinglePredecessor() && dominatesAllUses(SI, Icmp, Succ)) {
6909 NumSel++;
6910 SI->replaceUsesOutsideBlock(SI->getOperand(SIOpd), SI->getParent());
6911 return true;
6912 }
6913 }
6914 return false;
6915}
6916
6917/// Try to fold the comparison based on range information we can get by checking
6918/// whether bits are known to be zero or one in the inputs.
6920 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
6921 Type *Ty = Op0->getType();
6922 ICmpInst::Predicate Pred = I.getPredicate();
6923
6924 // Get scalar or pointer size.
6925 unsigned BitWidth = Ty->isIntOrIntVectorTy()
6926 ? Ty->getScalarSizeInBits()
6927 : DL.getPointerTypeSizeInBits(Ty->getScalarType());
6928
6929 if (!BitWidth)
6930 return nullptr;
6931
6932 KnownBits Op0Known(BitWidth);
6933 KnownBits Op1Known(BitWidth);
6934
6935 {
6936 // Don't use dominating conditions when folding icmp using known bits. This
6937 // may convert signed into unsigned predicates in ways that other passes
6938 // (especially IndVarSimplify) may not be able to reliably undo.
6939 SimplifyQuery Q = SQ.getWithoutDomCondCache().getWithInstruction(&I);
6941 Op0Known, Q))
6942 return &I;
6943
6944 if (SimplifyDemandedBits(&I, 1, APInt::getAllOnes(BitWidth), Op1Known, Q))
6945 return &I;
6946 }
6947
6948 if (!isa<Constant>(Op0) && Op0Known.isConstant())
6949 return new ICmpInst(
6950 Pred, ConstantExpr::getIntegerValue(Ty, Op0Known.getConstant()), Op1);
6951 if (!isa<Constant>(Op1) && Op1Known.isConstant())
6952 return new ICmpInst(
6953 Pred, Op0, ConstantExpr::getIntegerValue(Ty, Op1Known.getConstant()));
6954
6955 if (std::optional<bool> Res = ICmpInst::compare(Op0Known, Op1Known, Pred))
6956 return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *Res));
6957
6958 // Given the known and unknown bits, compute a range that the LHS could be
6959 // in. Compute the Min, Max and RHS values based on the known bits. For the
6960 // EQ and NE we use unsigned values.
6961 APInt Op0Min(BitWidth, 0), Op0Max(BitWidth, 0);
6962 APInt Op1Min(BitWidth, 0), Op1Max(BitWidth, 0);
6963 if (I.isSigned()) {
6964 Op0Min = Op0Known.getSignedMinValue();
6965 Op0Max = Op0Known.getSignedMaxValue();
6966 Op1Min = Op1Known.getSignedMinValue();
6967 Op1Max = Op1Known.getSignedMaxValue();
6968 } else {
6969 Op0Min = Op0Known.getMinValue();
6970 Op0Max = Op0Known.getMaxValue();
6971 Op1Min = Op1Known.getMinValue();
6972 Op1Max = Op1Known.getMaxValue();
6973 }
6974
6975 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
6976 // min/max canonical compare with some other compare. That could lead to
6977 // conflict with select canonicalization and infinite looping.
6978 // FIXME: This constraint may go away if min/max intrinsics are canonical.
6979 auto isMinMaxCmp = [&](Instruction &Cmp) {
6980 if (!Cmp.hasOneUse())
6981 return false;
6982 Value *A, *B;
6983 SelectPatternFlavor SPF = matchSelectPattern(Cmp.user_back(), A, B).Flavor;
6985 return false;
6986 return match(Op0, m_MaxOrMin(m_Value(), m_Value())) ||
6987 match(Op1, m_MaxOrMin(m_Value(), m_Value()));
6988 };
6989 if (!isMinMaxCmp(I)) {
6990 switch (Pred) {
6991 default:
6992 break;
6993 case ICmpInst::ICMP_ULT: {
6994 if (Op1Min == Op0Max) // A <u B -> A != B if max(A) == min(B)
6995 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
6996 const APInt *CmpC;
6997 if (match(Op1, m_APInt(CmpC))) {
6998 // A <u C -> A == C-1 if min(A)+1 == C
6999 if (*CmpC == Op0Min + 1)
7000 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7001 ConstantInt::get(Op1->getType(), *CmpC - 1));
7002 // X <u C --> X == 0, if the number of zero bits in the bottom of X
7003 // exceeds the log2 of C.
7004 if (Op0Known.countMinTrailingZeros() >= CmpC->ceilLogBase2())
7005 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7006 Constant::getNullValue(Op1->getType()));
7007 }
7008 break;
7009 }
7010 case ICmpInst::ICMP_UGT: {
7011 if (Op1Max == Op0Min) // A >u B -> A != B if min(A) == max(B)
7012 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7013 const APInt *CmpC;
7014 if (match(Op1, m_APInt(CmpC))) {
7015 // A >u C -> A == C+1 if max(a)-1 == C
7016 if (*CmpC == Op0Max - 1)
7017 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7018 ConstantInt::get(Op1->getType(), *CmpC + 1));
7019 // X >u C --> X != 0, if the number of zero bits in the bottom of X
7020 // exceeds the log2 of C.
7021 if (Op0Known.countMinTrailingZeros() >= CmpC->getActiveBits())
7022 return new ICmpInst(ICmpInst::ICMP_NE, Op0,
7023 Constant::getNullValue(Op1->getType()));
7024 }
7025 break;
7026 }
7027 case ICmpInst::ICMP_SLT: {
7028 if (Op1Min == Op0Max) // A <s B -> A != B if max(A) == min(B)
7029 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7030 const APInt *CmpC;
7031 if (match(Op1, m_APInt(CmpC))) {
7032 if (*CmpC == Op0Min + 1) // A <s C -> A == C-1 if min(A)+1 == C
7033 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7034 ConstantInt::get(Op1->getType(), *CmpC - 1));
7035 }
7036 break;
7037 }
7038 case ICmpInst::ICMP_SGT: {
7039 if (Op1Max == Op0Min) // A >s B -> A != B if min(A) == max(B)
7040 return new ICmpInst(ICmpInst::ICMP_NE, Op0, Op1);
7041 const APInt *CmpC;
7042 if (match(Op1, m_APInt(CmpC))) {
7043 if (*CmpC == Op0Max - 1) // A >s C -> A == C+1 if max(A)-1 == C
7044 return new ICmpInst(ICmpInst::ICMP_EQ, Op0,
7045 ConstantInt::get(Op1->getType(), *CmpC + 1));
7046 }
7047 break;
7048 }
7049 }
7050 }
7051
7052 // Based on the range information we know about the LHS, see if we can
7053 // simplify this comparison. For example, (x&4) < 8 is always true.
7054 switch (Pred) {
7055 default:
7056 break;
7057 case ICmpInst::ICMP_EQ:
7058 case ICmpInst::ICMP_NE: {
7059 // If all bits are known zero except for one, then we know at most one bit
7060 // is set. If the comparison is against zero, then this is a check to see if
7061 // *that* bit is set.
7062 APInt Op0KnownZeroInverted = ~Op0Known.Zero;
7063 if (Op1Known.isZero()) {
7064 // If the LHS is an AND with the same constant, look through it.
7065 Value *LHS = nullptr;
7066 const APInt *LHSC;
7067 if (!match(Op0, m_And(m_Value(LHS), m_APInt(LHSC))) ||
7068 *LHSC != Op0KnownZeroInverted)
7069 LHS = Op0;
7070
7071 Value *X;
7072 const APInt *C1;
7073 if (match(LHS, m_Shl(m_Power2(C1), m_Value(X)))) {
7074 Type *XTy = X->getType();
7075 unsigned Log2C1 = C1->countr_zero();
7076 APInt C2 = Op0KnownZeroInverted;
7077 APInt C2Pow2 = (C2 & ~(*C1 - 1)) + *C1;
7078 if (C2Pow2.isPowerOf2()) {
7079 // iff (C1 is pow2) & ((C2 & ~(C1-1)) + C1) is pow2):
7080 // ((C1 << X) & C2) == 0 -> X >= (Log2(C2+C1) - Log2(C1))
7081 // ((C1 << X) & C2) != 0 -> X < (Log2(C2+C1) - Log2(C1))
7082 unsigned Log2C2 = C2Pow2.countr_zero();
7083 auto *CmpC = ConstantInt::get(XTy, Log2C2 - Log2C1);
7084 auto NewPred =
7086 return new ICmpInst(NewPred, X, CmpC);
7087 }
7088 }
7089 }
7090
7091 // Op0 eq C_Pow2 -> Op0 ne 0 if Op0 is known to be C_Pow2 or zero.
7092 if (Op1Known.isConstant() && Op1Known.getConstant().isPowerOf2() &&
7093 (Op0Known & Op1Known) == Op0Known)
7094 return new ICmpInst(CmpInst::getInversePredicate(Pred), Op0,
7095 ConstantInt::getNullValue(Op1->getType()));
7096 break;
7097 }
7098 case ICmpInst::ICMP_SGE:
7099 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
7100 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7101 break;
7102 case ICmpInst::ICMP_SLE:
7103 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
7104 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7105 break;
7106 case ICmpInst::ICMP_UGE:
7107 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
7108 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7109 break;
7110 case ICmpInst::ICMP_ULE:
7111 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
7112 return new ICmpInst(ICmpInst::ICMP_EQ, Op0, Op1);
7113 break;
7114 }
7115
7116 // Turn a signed comparison into an unsigned one if both operands are known to
7117 // have the same sign. Set samesign if possible (except for equality
7118 // predicates).
7119 if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
7120 ((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
7121 (Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
7122 I.setPredicate(I.getUnsignedPredicate());
7123 I.setSameSign();
7124 return &I;
7125 }
7126
7127 return nullptr;
7128}
7129
7130/// If one operand of an icmp is effectively a bool (value range of {0,1}),
7131/// then try to reduce patterns based on that limit.
7133 Value *X, *Y;
7134 CmpPredicate Pred;
7135
7136 // X must be 0 and bool must be true for "ULT":
7137 // X <u (zext i1 Y) --> (X == 0) & Y
7138 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_ZExt(m_Value(Y))))) &&
7139 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULT)
7140 return BinaryOperator::CreateAnd(Builder.CreateIsNull(X), Y);
7141
7142 // X must be 0 or bool must be true for "ULE":
7143 // X <=u (sext i1 Y) --> (X == 0) | Y
7144 if (match(&I, m_c_ICmp(Pred, m_Value(X), m_OneUse(m_SExt(m_Value(Y))))) &&
7145 Y->getType()->isIntOrIntVectorTy(1) && Pred == ICmpInst::ICMP_ULE)
7146 return BinaryOperator::CreateOr(Builder.CreateIsNull(X), Y);
7147
7148 // icmp eq/ne X, (zext/sext (icmp eq/ne X, C))
7149 CmpPredicate Pred1, Pred2;
7150 const APInt *C;
7151 Instruction *ExtI;
7152 if (match(&I, m_c_ICmp(Pred1, m_Value(X),
7155 m_APInt(C)))))) &&
7156 ICmpInst::isEquality(Pred1) && ICmpInst::isEquality(Pred2)) {
7157 bool IsSExt = ExtI->getOpcode() == Instruction::SExt;
7158 bool HasOneUse = ExtI->hasOneUse() && ExtI->getOperand(0)->hasOneUse();
7159 auto CreateRangeCheck = [&] {
7160 Value *CmpV1 =
7161 Builder.CreateICmp(Pred1, X, Constant::getNullValue(X->getType()));
7162 Value *CmpV2 = Builder.CreateICmp(
7163 Pred1, X, ConstantInt::getSigned(X->getType(), IsSExt ? -1 : 1));
7165 Pred1 == ICmpInst::ICMP_EQ ? Instruction::Or : Instruction::And,
7166 CmpV1, CmpV2);
7167 };
7168 if (C->isZero()) {
7169 if (Pred2 == ICmpInst::ICMP_EQ) {
7170 // icmp eq X, (zext/sext (icmp eq X, 0)) --> false
7171 // icmp ne X, (zext/sext (icmp eq X, 0)) --> true
7172 return replaceInstUsesWith(
7173 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7174 } else if (!IsSExt || HasOneUse) {
7175 // icmp eq X, (zext (icmp ne X, 0)) --> X == 0 || X == 1
7176 // icmp ne X, (zext (icmp ne X, 0)) --> X != 0 && X != 1
7177 // icmp eq X, (sext (icmp ne X, 0)) --> X == 0 || X == -1
7178 // icmp ne X, (sext (icmp ne X, 0)) --> X != 0 && X != -1
7179 return CreateRangeCheck();
7180 }
7181 } else if (IsSExt ? C->isAllOnes() : C->isOne()) {
7182 if (Pred2 == ICmpInst::ICMP_NE) {
7183 // icmp eq X, (zext (icmp ne X, 1)) --> false
7184 // icmp ne X, (zext (icmp ne X, 1)) --> true
7185 // icmp eq X, (sext (icmp ne X, -1)) --> false
7186 // icmp ne X, (sext (icmp ne X, -1)) --> true
7187 return replaceInstUsesWith(
7188 I, ConstantInt::getBool(I.getType(), Pred1 == ICmpInst::ICMP_NE));
7189 } else if (!IsSExt || HasOneUse) {
7190 // icmp eq X, (zext (icmp eq X, 1)) --> X == 0 || X == 1
7191 // icmp ne X, (zext (icmp eq X, 1)) --> X != 0 && X != 1
7192 // icmp eq X, (sext (icmp eq X, -1)) --> X == 0 || X == -1
7193 // icmp ne X, (sext (icmp eq X, -1)) --> X != 0 && X == -1
7194 return CreateRangeCheck();
7195 }
7196 } else {
7197 // when C != 0 && C != 1:
7198 // icmp eq X, (zext (icmp eq X, C)) --> icmp eq X, 0
7199 // icmp eq X, (zext (icmp ne X, C)) --> icmp eq X, 1
7200 // icmp ne X, (zext (icmp eq X, C)) --> icmp ne X, 0
7201 // icmp ne X, (zext (icmp ne X, C)) --> icmp ne X, 1
7202 // when C != 0 && C != -1:
7203 // icmp eq X, (sext (icmp eq X, C)) --> icmp eq X, 0
7204 // icmp eq X, (sext (icmp ne X, C)) --> icmp eq X, -1
7205 // icmp ne X, (sext (icmp eq X, C)) --> icmp ne X, 0
7206 // icmp ne X, (sext (icmp ne X, C)) --> icmp ne X, -1
7207 return ICmpInst::Create(
7208 Instruction::ICmp, Pred1, X,
7209 ConstantInt::getSigned(X->getType(), Pred2 == ICmpInst::ICMP_NE
7210 ? (IsSExt ? -1 : 1)
7211 : 0));
7212 }
7213 }
7214
7215 return nullptr;
7216}
7217
7218/// If we have an icmp le or icmp ge instruction with a constant operand, turn
7219/// it into the appropriate icmp lt or icmp gt instruction. This transform
7220/// allows them to be folded in visitICmpInst.
7222 ICmpInst::Predicate Pred = I.getPredicate();
7223 if (ICmpInst::isEquality(Pred) || !ICmpInst::isIntPredicate(Pred) ||
7225 return nullptr;
7226
7227 Value *Op0 = I.getOperand(0);
7228 Value *Op1 = I.getOperand(1);
7229 auto *Op1C = dyn_cast<Constant>(Op1);
7230 if (!Op1C)
7231 return nullptr;
7232
7233 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, Op1C);
7234 if (!FlippedStrictness)
7235 return nullptr;
7236
7237 return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
7238}
7239
7240/// If we have a comparison with a non-canonical predicate, if we can update
7241/// all the users, invert the predicate and adjust all the users.
7243 // Is the predicate already canonical?
7244 CmpInst::Predicate Pred = I.getPredicate();
7246 return nullptr;
7247
7248 // Can all users be adjusted to predicate inversion?
7249 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
7250 return nullptr;
7251
7252 // Ok, we can canonicalize comparison!
7253 // Let's first invert the comparison's predicate.
7254 I.setPredicate(CmpInst::getInversePredicate(Pred));
7255 I.setName(I.getName() + ".not");
7256
7257 // And, adapt users.
7259
7260 return &I;
7261}
7262
7263/// Integer compare with boolean values can always be turned into bitwise ops.
7265 InstCombiner::BuilderTy &Builder) {
7266 Value *A = I.getOperand(0), *B = I.getOperand(1);
7267 assert(A->getType()->isIntOrIntVectorTy(1) && "Bools only");
7268
7269 // A boolean compared to true/false can be simplified to Op0/true/false in
7270 // 14 out of the 20 (10 predicates * 2 constants) possible combinations.
7271 // Cases not handled by InstSimplify are always 'not' of Op0.
7272 if (match(B, m_Zero())) {
7273 switch (I.getPredicate()) {
7274 case CmpInst::ICMP_EQ: // A == 0 -> !A
7275 case CmpInst::ICMP_ULE: // A <=u 0 -> !A
7276 case CmpInst::ICMP_SGE: // A >=s 0 -> !A
7278 default:
7279 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7280 }
7281 } else if (match(B, m_One())) {
7282 switch (I.getPredicate()) {
7283 case CmpInst::ICMP_NE: // A != 1 -> !A
7284 case CmpInst::ICMP_ULT: // A <u 1 -> !A
7285 case CmpInst::ICMP_SGT: // A >s -1 -> !A
7287 default:
7288 llvm_unreachable("ICmp i1 X, C not simplified as expected.");
7289 }
7290 }
7291
7292 switch (I.getPredicate()) {
7293 default:
7294 llvm_unreachable("Invalid icmp instruction!");
7295 case ICmpInst::ICMP_EQ:
7296 // icmp eq i1 A, B -> ~(A ^ B)
7297 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
7298
7299 case ICmpInst::ICMP_NE:
7300 // icmp ne i1 A, B -> A ^ B
7301 return BinaryOperator::CreateXor(A, B);
7302
7303 case ICmpInst::ICMP_UGT:
7304 // icmp ugt -> icmp ult
7305 std::swap(A, B);
7306 [[fallthrough]];
7307 case ICmpInst::ICMP_ULT:
7308 // icmp ult i1 A, B -> ~A & B
7309 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
7310
7311 case ICmpInst::ICMP_SGT:
7312 // icmp sgt -> icmp slt
7313 std::swap(A, B);
7314 [[fallthrough]];
7315 case ICmpInst::ICMP_SLT:
7316 // icmp slt i1 A, B -> A & ~B
7317 return BinaryOperator::CreateAnd(Builder.CreateNot(B), A);
7318
7319 case ICmpInst::ICMP_UGE:
7320 // icmp uge -> icmp ule
7321 std::swap(A, B);
7322 [[fallthrough]];
7323 case ICmpInst::ICMP_ULE:
7324 // icmp ule i1 A, B -> ~A | B
7325 return BinaryOperator::CreateOr(Builder.CreateNot(A), B);
7326
7327 case ICmpInst::ICMP_SGE:
7328 // icmp sge -> icmp sle
7329 std::swap(A, B);
7330 [[fallthrough]];
7331 case ICmpInst::ICMP_SLE:
7332 // icmp sle i1 A, B -> A | ~B
7333 return BinaryOperator::CreateOr(Builder.CreateNot(B), A);
7334 }
7335}
7336
7337// Transform pattern like:
7338// (1 << Y) u<= X or ~(-1 << Y) u< X or ((1 << Y)+(-1)) u< X
7339// (1 << Y) u> X or ~(-1 << Y) u>= X or ((1 << Y)+(-1)) u>= X
7340// Into:
7341// (X l>> Y) != 0
7342// (X l>> Y) == 0
7344 InstCombiner::BuilderTy &Builder) {
7345 CmpPredicate Pred, NewPred;
7346 Value *X, *Y;
7347 if (match(&Cmp,
7348 m_c_ICmp(Pred, m_OneUse(m_Shl(m_One(), m_Value(Y))), m_Value(X)))) {
7349 switch (Pred) {
7350 case ICmpInst::ICMP_ULE:
7351 NewPred = ICmpInst::ICMP_NE;
7352 break;
7353 case ICmpInst::ICMP_UGT:
7354 NewPred = ICmpInst::ICMP_EQ;
7355 break;
7356 default:
7357 return nullptr;
7358 }
7359 } else if (match(&Cmp, m_c_ICmp(Pred,
7362 m_Add(m_Shl(m_One(), m_Value(Y)),
7363 m_AllOnes()))),
7364 m_Value(X)))) {
7365 // The variant with 'add' is not canonical, (the variant with 'not' is)
7366 // we only get it because it has extra uses, and can't be canonicalized,
7367
7368 switch (Pred) {
7369 case ICmpInst::ICMP_ULT:
7370 NewPred = ICmpInst::ICMP_NE;
7371 break;
7372 case ICmpInst::ICMP_UGE:
7373 NewPred = ICmpInst::ICMP_EQ;
7374 break;
7375 default:
7376 return nullptr;
7377 }
7378 } else
7379 return nullptr;
7380
7381 Value *NewX = Builder.CreateLShr(X, Y, X->getName() + ".highbits");
7382 Constant *Zero = Constant::getNullValue(NewX->getType());
7383 return CmpInst::Create(Instruction::ICmp, NewPred, NewX, Zero);
7384}
7385
7387 InstCombiner::BuilderTy &Builder) {
7388 const CmpInst::Predicate Pred = Cmp.getPredicate();
7389 Value *LHS = Cmp.getOperand(0), *RHS = Cmp.getOperand(1);
7390 Value *V1, *V2;
7391
7392 auto createCmpReverse = [&](CmpInst::Predicate Pred, Value *X, Value *Y) {
7393 Value *V = Builder.CreateCmp(Pred, X, Y, Cmp.getName());
7394 if (auto *I = dyn_cast<Instruction>(V))
7395 I->copyIRFlags(&Cmp);
7396 Module *M = Cmp.getModule();
7398 M, Intrinsic::vector_reverse, V->getType());
7399 return CallInst::Create(F, V);
7400 };
7401
7402 if (match(LHS, m_VecReverse(m_Value(V1)))) {
7403 // cmp Pred, rev(V1), rev(V2) --> rev(cmp Pred, V1, V2)
7404 if (match(RHS, m_VecReverse(m_Value(V2))) &&
7405 (LHS->hasOneUse() || RHS->hasOneUse()))
7406 return createCmpReverse(Pred, V1, V2);
7407
7408 // cmp Pred, rev(V1), RHSSplat --> rev(cmp Pred, V1, RHSSplat)
7409 if (LHS->hasOneUse() && isSplatValue(RHS))
7410 return createCmpReverse(Pred, V1, RHS);
7411 }
7412 // cmp Pred, LHSSplat, rev(V2) --> rev(cmp Pred, LHSSplat, V2)
7413 else if (isSplatValue(LHS) && match(RHS, m_OneUse(m_VecReverse(m_Value(V2)))))
7414 return createCmpReverse(Pred, LHS, V2);
7415
7416 ArrayRef<int> M;
7417 if (!match(LHS, m_Shuffle(m_Value(V1), m_Undef(), m_Mask(M))))
7418 return nullptr;
7419
7420 // If both arguments of the cmp are shuffles that use the same mask and
7421 // shuffle within a single vector, move the shuffle after the cmp:
7422 // cmp (shuffle V1, M), (shuffle V2, M) --> shuffle (cmp V1, V2), M
7423 Type *V1Ty = V1->getType();
7424 if (match(RHS, m_Shuffle(m_Value(V2), m_Undef(), m_SpecificMask(M))) &&
7425 V1Ty == V2->getType() && (LHS->hasOneUse() || RHS->hasOneUse())) {
7426 Value *NewCmp = Builder.CreateCmp(Pred, V1, V2);
7427 return new ShuffleVectorInst(NewCmp, M);
7428 }
7429
7430 // Try to canonicalize compare with splatted operand and splat constant.
7431 // TODO: We could generalize this for more than splats. See/use the code in
7432 // InstCombiner::foldVectorBinop().
7433 Constant *C;
7434 if (!LHS->hasOneUse() || !match(RHS, m_Constant(C)))
7435 return nullptr;
7436
7437 // Length-changing splats are ok, so adjust the constants as needed:
7438 // cmp (shuffle V1, M), C --> shuffle (cmp V1, C'), M
7439 Constant *ScalarC = C->getSplatValue(/* AllowPoison */ true);
7440 int MaskSplatIndex;
7441 if (ScalarC && match(M, m_SplatOrPoisonMask(MaskSplatIndex))) {
7442 // We allow poison in matching, but this transform removes it for safety.
7443 // Demanded elements analysis should be able to recover some/all of that.
7444 C = ConstantVector::getSplat(cast<VectorType>(V1Ty)->getElementCount(),
7445 ScalarC);
7446 SmallVector<int, 8> NewM(M.size(), MaskSplatIndex);
7447 Value *NewCmp = Builder.CreateCmp(Pred, V1, C);
7448 return new ShuffleVectorInst(NewCmp, NewM);
7449 }
7450
7451 return nullptr;
7452}
7453
7454// extract(uadd.with.overflow(A, B), 0) ult A
7455// -> extract(uadd.with.overflow(A, B), 1)
7457 CmpInst::Predicate Pred = I.getPredicate();
7458 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7459
7460 Value *UAddOv;
7461 Value *A, *B;
7462 auto UAddOvResultPat = m_ExtractValue<0>(
7464 if (match(Op0, UAddOvResultPat) &&
7465 ((Pred == ICmpInst::ICMP_ULT && (Op1 == A || Op1 == B)) ||
7466 (Pred == ICmpInst::ICMP_EQ && match(Op1, m_ZeroInt()) &&
7467 (match(A, m_One()) || match(B, m_One()))) ||
7468 (Pred == ICmpInst::ICMP_NE && match(Op1, m_AllOnes()) &&
7469 (match(A, m_AllOnes()) || match(B, m_AllOnes())))))
7470 // extract(uadd.with.overflow(A, B), 0) < A
7471 // extract(uadd.with.overflow(A, 1), 0) == 0
7472 // extract(uadd.with.overflow(A, -1), 0) != -1
7473 UAddOv = cast<ExtractValueInst>(Op0)->getAggregateOperand();
7474 else if (match(Op1, UAddOvResultPat) && Pred == ICmpInst::ICMP_UGT &&
7475 (Op0 == A || Op0 == B))
7476 // A > extract(uadd.with.overflow(A, B), 0)
7477 UAddOv = cast<ExtractValueInst>(Op1)->getAggregateOperand();
7478 else
7479 return nullptr;
7480
7481 return ExtractValueInst::Create(UAddOv, 1);
7482}
7483
7485 if (!I.getOperand(0)->getType()->isPointerTy() ||
7487 I.getParent()->getParent(),
7488 I.getOperand(0)->getType()->getPointerAddressSpace())) {
7489 return nullptr;
7490 }
7491 Instruction *Op;
7492 if (match(I.getOperand(0), m_Instruction(Op)) &&
7493 match(I.getOperand(1), m_Zero()) &&
7494 Op->isLaunderOrStripInvariantGroup()) {
7495 return ICmpInst::Create(Instruction::ICmp, I.getPredicate(),
7496 Op->getOperand(0), I.getOperand(1));
7497 }
7498 return nullptr;
7499}
7500
7502 IRBuilderBase &Builder) {
7503 if (!ICmpInst::isEquality(I.getPredicate()))
7504 return nullptr;
7505
7506 // The caller puts constants after non-constants.
7507 Value *Op = I.getOperand(0);
7508 Value *Const = I.getOperand(1);
7509
7510 // For Cond an equality condition, fold
7511 //
7512 // icmp (eq|ne) (vreduce_(or|and) Op), (Zero|AllOnes) ->
7513 // icmp (eq|ne) Op, (Zero|AllOnes)
7514 //
7515 // with a bitcast.
7516 Value *Vec;
7517 if ((match(Const, m_ZeroInt()) &&
7519 m_Value(Vec))))) ||
7520 (match(Const, m_AllOnes()) &&
7522 m_Value(Vec)))))) {
7523 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
7524 if (!VecTy)
7525 return nullptr;
7526 Type *VecEltTy = VecTy->getElementType();
7527 unsigned ScalarBW =
7528 DL.getTypeSizeInBits(VecEltTy) * VecTy->getNumElements();
7529 if (!DL.fitsInLegalInteger(ScalarBW))
7530 return nullptr;
7531 Type *ScalarTy = IntegerType::get(I.getContext(), ScalarBW);
7532 Value *NewConst = match(Const, m_ZeroInt())
7533 ? ConstantInt::get(ScalarTy, 0)
7534 : ConstantInt::getAllOnesValue(ScalarTy);
7535 return CmpInst::Create(Instruction::ICmp, I.getPredicate(),
7536 Builder.CreateBitCast(Vec, ScalarTy), NewConst);
7537 }
7538 return nullptr;
7539}
7540
7541/// This function folds patterns produced by lowering of reduce idioms, such as
7542/// llvm.vector.reduce.and which are lowered into instruction chains. This code
7543/// attempts to generate fewer number of scalar comparisons instead of vector
7544/// comparisons when possible.
7546 InstCombiner::BuilderTy &Builder,
7547 const DataLayout &DL) {
7548 if (I.getType()->isVectorTy())
7549 return nullptr;
7550 CmpPredicate OuterPred, InnerPred;
7551 Value *LHS, *RHS;
7552
7553 // Match lowering of @llvm.vector.reduce.and. Turn
7554 /// %vec_ne = icmp ne <8 x i8> %lhs, %rhs
7555 /// %scalar_ne = bitcast <8 x i1> %vec_ne to i8
7556 /// %res = icmp <pred> i8 %scalar_ne, 0
7557 ///
7558 /// into
7559 ///
7560 /// %lhs.scalar = bitcast <8 x i8> %lhs to i64
7561 /// %rhs.scalar = bitcast <8 x i8> %rhs to i64
7562 /// %res = icmp <pred> i64 %lhs.scalar, %rhs.scalar
7563 ///
7564 /// for <pred> in {ne, eq}.
7565 if (!match(&I, m_ICmp(OuterPred,
7567 m_ICmp(InnerPred, m_Value(LHS), m_Value(RHS))))),
7568 m_Zero())))
7569 return nullptr;
7570 auto *LHSTy = dyn_cast<FixedVectorType>(LHS->getType());
7571 if (!LHSTy || !LHSTy->getElementType()->isIntegerTy())
7572 return nullptr;
7573 unsigned NumBits =
7574 LHSTy->getNumElements() * LHSTy->getElementType()->getIntegerBitWidth();
7575 // TODO: Relax this to "not wider than max legal integer type"?
7576 if (!DL.isLegalInteger(NumBits))
7577 return nullptr;
7578
7579 if (ICmpInst::isEquality(OuterPred) && InnerPred == ICmpInst::ICMP_NE) {
7580 auto *ScalarTy = Builder.getIntNTy(NumBits);
7581 LHS = Builder.CreateBitCast(LHS, ScalarTy, LHS->getName() + ".scalar");
7582 RHS = Builder.CreateBitCast(RHS, ScalarTy, RHS->getName() + ".scalar");
7583 return ICmpInst::Create(Instruction::ICmp, OuterPred, LHS, RHS,
7584 I.getName());
7585 }
7586
7587 return nullptr;
7588}
7589
7590// This helper will be called with icmp operands in both orders.
7592 Value *Op0, Value *Op1,
7593 ICmpInst &CxtI) {
7594 // Try to optimize 'icmp GEP, P' or 'icmp P, GEP'.
7595 if (auto *GEP = dyn_cast<GEPOperator>(Op0))
7596 if (Instruction *NI = foldGEPICmp(GEP, Op1, Pred, CxtI))
7597 return NI;
7598
7599 if (auto *SI = dyn_cast<SelectInst>(Op0))
7600 if (Instruction *NI = foldSelectICmp(Pred, SI, Op1, CxtI))
7601 return NI;
7602
7603 if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Op0)) {
7604 if (Instruction *Res = foldICmpWithMinMax(CxtI, MinMax, Op1, Pred))
7605 return Res;
7606
7607 if (Instruction *Res = foldICmpWithClamp(CxtI, Op1, MinMax))
7608 return Res;
7609 }
7610
7611 {
7612 Value *X;
7613 const APInt *C;
7614 // icmp X+Cst, X
7615 if (match(Op0, m_Add(m_Value(X), m_APInt(C))) && Op1 == X)
7616 return foldICmpAddOpConst(X, *C, Pred);
7617 }
7618
7619 // abs(X) >= X --> true
7620 // abs(X) u<= X --> true
7621 // abs(X) < X --> false
7622 // abs(X) u> X --> false
7623 // abs(X) u>= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7624 // abs(X) <= X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7625 // abs(X) == X --> IsIntMinPosion ? `X > -1`: `X u<= INTMIN`
7626 // abs(X) u< X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7627 // abs(X) > X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7628 // abs(X) != X --> IsIntMinPosion ? `X < 0` : `X > INTMIN`
7629 {
7630 Value *X;
7631 Constant *C;
7633 match(Op1, m_Specific(X))) {
7634 Value *NullValue = Constant::getNullValue(X->getType());
7635 Value *AllOnesValue = Constant::getAllOnesValue(X->getType());
7636 const APInt SMin =
7637 APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
7638 bool IsIntMinPosion = C->isAllOnesValue();
7639 switch (Pred) {
7640 case CmpInst::ICMP_ULE:
7641 case CmpInst::ICMP_SGE:
7642 return replaceInstUsesWith(CxtI, ConstantInt::getTrue(CxtI.getType()));
7643 case CmpInst::ICMP_UGT:
7644 case CmpInst::ICMP_SLT:
7646 case CmpInst::ICMP_UGE:
7647 case CmpInst::ICMP_SLE:
7648 case CmpInst::ICMP_EQ: {
7649 return replaceInstUsesWith(
7650 CxtI, IsIntMinPosion
7651 ? Builder.CreateICmpSGT(X, AllOnesValue)
7652 : Builder.CreateICmpULT(
7653 X, ConstantInt::get(X->getType(), SMin + 1)));
7654 }
7655 case CmpInst::ICMP_ULT:
7656 case CmpInst::ICMP_SGT:
7657 case CmpInst::ICMP_NE: {
7658 return replaceInstUsesWith(
7659 CxtI, IsIntMinPosion
7660 ? Builder.CreateICmpSLT(X, NullValue)
7661 : Builder.CreateICmpUGT(
7662 X, ConstantInt::get(X->getType(), SMin)));
7663 }
7664 default:
7665 llvm_unreachable("Invalid predicate!");
7666 }
7667 }
7668 }
7669
7670 const SimplifyQuery Q = SQ.getWithInstruction(&CxtI);
7671 if (Value *V = foldICmpWithLowBitMaskedVal(Pred, Op0, Op1, Q, *this))
7672 return replaceInstUsesWith(CxtI, V);
7673
7674 // Folding (X / Y) pred X => X swap(pred) 0 for constant Y other than 0 or 1
7675 auto CheckUGT1 = [](const APInt &Divisor) { return Divisor.ugt(1); };
7676 {
7677 if (match(Op0, m_UDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7678 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7680 }
7681
7682 if (!ICmpInst::isUnsigned(Pred) &&
7683 match(Op0, m_SDiv(m_Specific(Op1), m_CheckedInt(CheckUGT1)))) {
7684 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7686 }
7687 }
7688
7689 // Another case of this fold is (X >> Y) pred X => X swap(pred) 0 if Y != 0
7690 auto CheckNE0 = [](const APInt &Shift) { return !Shift.isZero(); };
7691 {
7692 if (match(Op0, m_LShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7693 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7695 }
7696
7697 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SGE) &&
7698 match(Op0, m_AShr(m_Specific(Op1), m_CheckedInt(CheckNE0)))) {
7699 return new ICmpInst(ICmpInst::getSwappedPredicate(Pred), Op1,
7701 }
7702 }
7703
7704 return nullptr;
7705}
7706
7708 bool Changed = false;
7709 const SimplifyQuery Q = SQ.getWithInstruction(&I);
7710 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
7711 unsigned Op0Cplxity = getComplexity(Op0);
7712 unsigned Op1Cplxity = getComplexity(Op1);
7713
7714 /// Orders the operands of the compare so that they are listed from most
7715 /// complex to least complex. This puts constants before unary operators,
7716 /// before binary operators.
7717 if (Op0Cplxity < Op1Cplxity) {
7718 I.swapOperands();
7719 std::swap(Op0, Op1);
7720 Changed = true;
7721 }
7722
7723 if (Value *V = simplifyICmpInst(I.getCmpPredicate(), Op0, Op1, Q))
7724 return replaceInstUsesWith(I, V);
7725
7726 // Comparing -val or val with non-zero is the same as just comparing val
7727 // ie, abs(val) != 0 -> val != 0
7728 if (I.getPredicate() == ICmpInst::ICMP_NE && match(Op1, m_Zero())) {
7729 Value *Cond, *SelectTrue, *SelectFalse;
7730 if (match(Op0, m_Select(m_Value(Cond), m_Value(SelectTrue),
7731 m_Value(SelectFalse)))) {
7732 if (Value *V = dyn_castNegVal(SelectTrue)) {
7733 if (V == SelectFalse)
7734 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7735 } else if (Value *V = dyn_castNegVal(SelectFalse)) {
7736 if (V == SelectTrue)
7737 return CmpInst::Create(Instruction::ICmp, I.getPredicate(), V, Op1);
7738 }
7739 }
7740 }
7741
7743 return Res;
7744
7745 if (Op0->getType()->isIntOrIntVectorTy(1))
7747 return Res;
7748
7750 return Res;
7751
7753 return Res;
7754
7756 return Res;
7757
7759 return Res;
7760
7762 return Res;
7763
7765 return Res;
7766
7768 return Res;
7769
7770 // Test if the ICmpInst instruction is used exclusively by a select as
7771 // part of a minimum or maximum operation. If so, refrain from doing
7772 // any other folding. This helps out other analyses which understand
7773 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
7774 // and CodeGen. And in this case, at least one of the comparison
7775 // operands has at least one user besides the compare (the select),
7776 // which would often largely negate the benefit of folding anyway.
7777 //
7778 // Do the same for the other patterns recognized by matchSelectPattern.
7779 if (I.hasOneUse())
7780 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
7781 Value *A, *B;
7783 if (SPR.Flavor != SPF_UNKNOWN)
7784 return nullptr;
7785 }
7786
7787 // Do this after checking for min/max to prevent infinite looping.
7788 if (Instruction *Res = foldICmpWithZero(I))
7789 return Res;
7790
7791 Value *X;
7792 const APInt *C;
7793 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
7794 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7795 match(Op1, m_Not(m_Specific(X)))) {
7796 if (C->isNonNegative())
7797 return new ICmpInst(ICmpInst::ICMP_SLT, X,
7798 Constant::getNullValue(X->getType()));
7799 return new ICmpInst(ICmpInst::ICMP_UGT, X,
7800 ConstantInt::get(X->getType(), ~*C));
7801 }
7802
7803 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
7804 match(Op0, m_UMax(m_Value(X), m_APInt(C))) &&
7805 match(Op1, m_Not(m_Specific(X)))) {
7806 if (C->isNonNegative())
7807 return new ICmpInst(ICmpInst::ICMP_SGT, X,
7808 Constant::getAllOnesValue(X->getType()));
7809 return new ICmpInst(ICmpInst::ICMP_ULT, X,
7810 ConstantInt::get(X->getType(), ~*C));
7811 }
7812
7813 // FIXME: We only do this after checking for min/max to prevent infinite
7814 // looping caused by a reverse canonicalization of these patterns for min/max.
7815 // FIXME: The organization of folds is a mess. These would naturally go into
7816 // canonicalizeCmpWithConstant(), but we can't move all of the above folds
7817 // down here after the min/max restriction.
7818 ICmpInst::Predicate Pred = I.getPredicate();
7819 if (match(Op1, m_APInt(C))) {
7820 // For i32: x >u 2147483647 -> x <s 0 -> true if sign bit set
7821 if (Pred == ICmpInst::ICMP_UGT && C->isMaxSignedValue()) {
7822 Constant *Zero = Constant::getNullValue(Op0->getType());
7823 return new ICmpInst(ICmpInst::ICMP_SLT, Op0, Zero);
7824 }
7825
7826 // For i32: x <u 2147483648 -> x >s -1 -> true if sign bit clear
7827 if (Pred == ICmpInst::ICMP_ULT && C->isMinSignedValue()) {
7829 return new ICmpInst(ICmpInst::ICMP_SGT, Op0, AllOnes);
7830 }
7831 }
7832
7833 // The folds in here may rely on wrapping flags and special constants, so
7834 // they can break up min/max idioms in some cases but not seemingly similar
7835 // patterns.
7836 // FIXME: It may be possible to enhance select folding to make this
7837 // unnecessary. It may also be moot if we canonicalize to min/max
7838 // intrinsics.
7839 if (Instruction *Res = foldICmpBinOp(I, Q))
7840 return Res;
7841
7843 return Res;
7844
7845 // Try to match comparison as a sign bit test. Intentionally do this after
7846 // foldICmpInstWithConstant() to potentially let other folds to happen first.
7847 if (Instruction *New = foldSignBitTest(I))
7848 return New;
7849
7850 if (auto *PN = dyn_cast<PHINode>(Op0))
7851 if (Instruction *NV = foldOpIntoPhi(I, PN))
7852 return NV;
7853 if (auto *PN = dyn_cast<PHINode>(Op1))
7854 if (Instruction *NV = foldOpIntoPhi(I, PN))
7855 return NV;
7856
7858 return Res;
7859
7860 if (Instruction *Res = foldICmpCommutative(I.getCmpPredicate(), Op0, Op1, I))
7861 return Res;
7862 if (Instruction *Res =
7863 foldICmpCommutative(I.getSwappedCmpPredicate(), Op1, Op0, I))
7864 return Res;
7865
7866 if (I.isCommutative()) {
7867 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
7868 replaceOperand(I, 0, Pair->first);
7869 replaceOperand(I, 1, Pair->second);
7870 return &I;
7871 }
7872 }
7873
7874 // Fold icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
7875 // when all select arms are constants, via truth table.
7877 return R;
7878
7879 // In case of a comparison with two select instructions having the same
7880 // condition, check whether one of the resulting branches can be simplified.
7881 // If so, just compare the other branch and select the appropriate result.
7882 // For example:
7883 // %tmp1 = select i1 %cmp, i32 %y, i32 %x
7884 // %tmp2 = select i1 %cmp, i32 %z, i32 %x
7885 // %cmp2 = icmp slt i32 %tmp2, %tmp1
7886 // The icmp will result false for the false value of selects and the result
7887 // will depend upon the comparison of true values of selects if %cmp is
7888 // true. Thus, transform this into:
7889 // %cmp = icmp slt i32 %y, %z
7890 // %sel = select i1 %cond, i1 %cmp, i1 false
7891 // This handles similar cases to transform.
7892 {
7893 Value *Cond, *A, *B, *C, *D;
7894 if (match(Op0, m_Select(m_Value(Cond), m_Value(A), m_Value(B))) &&
7896 (Op0->hasOneUse() || Op1->hasOneUse())) {
7897 // Check whether comparison of TrueValues can be simplified
7898 if (Value *Res = simplifyICmpInst(Pred, A, C, SQ)) {
7899 Value *NewICMP = Builder.CreateICmp(Pred, B, D);
7900 return SelectInst::Create(
7901 Cond, Res, NewICMP, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7903 }
7904 // Check whether comparison of FalseValues can be simplified
7905 if (Value *Res = simplifyICmpInst(Pred, B, D, SQ)) {
7906 Value *NewICMP = Builder.CreateICmp(Pred, A, C);
7907 return SelectInst::Create(
7908 Cond, NewICMP, Res, /*NameStr=*/"", /*InsertBefore=*/nullptr,
7910 }
7911 }
7912 }
7913
7914 // icmp slt (sub nsw x, y), (add nsw x, y) --> icmp sgt y, 0
7915 // icmp ult (sub nuw x, y), (add nuw x, y) --> icmp ugt y, 0
7916 // icmp eq (sub nsw/nuw x, y), (add nsw/nuw x, y) --> icmp eq y, 0
7917 {
7918 Value *A, *B;
7919 CmpPredicate CmpPred;
7920 if (match(&I, m_c_ICmp(CmpPred, m_Sub(m_Value(A), m_Value(B)),
7922 auto *I0 = cast<OverflowingBinaryOperator>(Op0);
7923 auto *I1 = cast<OverflowingBinaryOperator>(Op1);
7924 bool I0NUW = I0->hasNoUnsignedWrap();
7925 bool I1NUW = I1->hasNoUnsignedWrap();
7926 bool I0NSW = I0->hasNoSignedWrap();
7927 bool I1NSW = I1->hasNoSignedWrap();
7928 if ((ICmpInst::isUnsigned(Pred) && I0NUW && I1NUW) ||
7929 (ICmpInst::isSigned(Pred) && I0NSW && I1NSW) ||
7930 (ICmpInst::isEquality(Pred) &&
7931 ((I0NUW || I0NSW) && (I1NUW || I1NSW)))) {
7932 return new ICmpInst(CmpPredicate::getSwapped(CmpPred), B,
7933 ConstantInt::get(Op0->getType(), 0));
7934 }
7935 }
7936 }
7937
7938 // Try to optimize equality comparisons against alloca-based pointers.
7939 if (Op0->getType()->isPointerTy() && I.isEquality()) {
7940 assert(Op1->getType()->isPointerTy() &&
7941 "Comparing pointer with non-pointer?");
7942 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op0)))
7943 if (foldAllocaCmp(Alloca))
7944 return nullptr;
7945 if (auto *Alloca = dyn_cast<AllocaInst>(getUnderlyingObject(Op1)))
7946 if (foldAllocaCmp(Alloca))
7947 return nullptr;
7948 }
7949
7950 if (Instruction *Res = foldICmpBitCast(I))
7951 return Res;
7952
7953 // TODO: Hoist this above the min/max bailout.
7955 return R;
7956
7957 {
7958 Value *X, *Y;
7959 // Transform (X & ~Y) == 0 --> (X & Y) != 0
7960 // and (X & ~Y) != 0 --> (X & Y) == 0
7961 // if A is a power of 2.
7962 if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&
7963 match(Op1, m_Zero()) && isKnownToBeAPowerOfTwo(X, false, &I) &&
7964 I.isEquality())
7965 return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
7966 Op1);
7967
7968 // Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7969 if (Op0->getType()->isIntOrIntVectorTy()) {
7970 bool ConsumesOp0, ConsumesOp1;
7971 if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7972 isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7973 (ConsumesOp0 || ConsumesOp1)) {
7974 Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7975 Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7976 assert(InvOp0 && InvOp1 &&
7977 "Mismatch between isFreeToInvert and getFreelyInverted");
7978 return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7979 }
7980 }
7981
7982 Instruction *AddI = nullptr;
7984 m_Instruction(AddI))) &&
7985 isa<IntegerType>(X->getType())) {
7986 Value *Result;
7987 Constant *Overflow;
7988 // m_UAddWithOverflow can match patterns that do not include an explicit
7989 // "add" instruction, so check the opcode of the matched op.
7990 if (AddI->getOpcode() == Instruction::Add &&
7991 OptimizeOverflowCheck(Instruction::Add, /*Signed*/ false, X, Y, *AddI,
7992 Result, Overflow)) {
7993 replaceInstUsesWith(*AddI, Result);
7994 eraseInstFromFunction(*AddI);
7995 return replaceInstUsesWith(I, Overflow);
7996 }
7997 }
7998
7999 // (zext X) * (zext Y) --> llvm.umul.with.overflow.
8000 if (match(Op0, m_NUWMul(m_ZExt(m_Value(X)), m_ZExt(m_Value(Y)))) &&
8001 match(Op1, m_APInt(C))) {
8002 if (Instruction *R = processUMulZExtIdiom(I, Op0, C, *this))
8003 return R;
8004 }
8005
8006 // Signbit test folds
8007 // Fold (X u>> BitWidth - 1 Pred ZExt(i1)) --> X s< 0 Pred i1
8008 // Fold (X s>> BitWidth - 1 Pred SExt(i1)) --> X s< 0 Pred i1
8009 Instruction *ExtI;
8010 if ((I.isUnsigned() || I.isEquality()) &&
8011 match(Op1,
8013 Y->getType()->getScalarSizeInBits() == 1 &&
8014 (Op0->hasOneUse() || Op1->hasOneUse())) {
8015 unsigned OpWidth = Op0->getType()->getScalarSizeInBits();
8016 Instruction *ShiftI;
8017 if (match(Op0, m_CombineAnd(m_Instruction(ShiftI),
8019 OpWidth - 1))))) {
8020 unsigned ExtOpc = ExtI->getOpcode();
8021 unsigned ShiftOpc = ShiftI->getOpcode();
8022 if ((ExtOpc == Instruction::ZExt && ShiftOpc == Instruction::LShr) ||
8023 (ExtOpc == Instruction::SExt && ShiftOpc == Instruction::AShr)) {
8024 Value *SLTZero =
8025 Builder.CreateICmpSLT(X, Constant::getNullValue(X->getType()));
8026 Value *Cmp = Builder.CreateICmp(Pred, SLTZero, Y, I.getName());
8027 return replaceInstUsesWith(I, Cmp);
8028 }
8029 }
8030 }
8031 }
8032
8033 if (Instruction *Res = foldICmpEquality(I))
8034 return Res;
8035
8037 return Res;
8038
8039 if (Instruction *Res = foldICmpOfUAddOv(I))
8040 return Res;
8041
8043 return Res;
8044
8045 // The 'cmpxchg' instruction returns an aggregate containing the old value and
8046 // an i1 which indicates whether or not we successfully did the swap.
8047 //
8048 // Replace comparisons between the old value and the expected value with the
8049 // indicator that 'cmpxchg' returns.
8050 //
8051 // N.B. This transform is only valid when the 'cmpxchg' is not permitted to
8052 // spuriously fail. In those cases, the old value may equal the expected
8053 // value but it is possible for the swap to not occur.
8054 if (I.getPredicate() == ICmpInst::ICMP_EQ)
8055 if (auto *EVI = dyn_cast<ExtractValueInst>(Op0))
8056 if (auto *ACXI = dyn_cast<AtomicCmpXchgInst>(EVI->getAggregateOperand()))
8057 if (EVI->getIndices()[0] == 0 && ACXI->getCompareOperand() == Op1 &&
8058 !ACXI->isWeak())
8059 return ExtractValueInst::Create(ACXI, 1);
8060
8062 return Res;
8063
8064 if (I.getType()->isVectorTy())
8065 if (Instruction *Res = foldVectorCmp(I, Builder))
8066 return Res;
8067
8069 return Res;
8070
8072 return Res;
8073
8074 {
8075 Value *A;
8076 const APInt *C1, *C2;
8077 ICmpInst::Predicate Pred = I.getPredicate();
8078 if (ICmpInst::isEquality(Pred)) {
8079 // sext(a) & c1 == c2 --> a & c3 == trunc(c2)
8080 // sext(a) & c1 != c2 --> a & c3 != trunc(c2)
8081 if (match(Op0, m_And(m_SExt(m_Value(A)), m_APInt(C1))) &&
8082 match(Op1, m_APInt(C2))) {
8083 Type *InputTy = A->getType();
8084 unsigned InputBitWidth = InputTy->getScalarSizeInBits();
8085 // c2 must be non-negative at the bitwidth of a.
8086 if (C2->getActiveBits() < InputBitWidth) {
8087 APInt TruncC1 = C1->trunc(InputBitWidth);
8088 // Check if there are 1s in C1 high bits of size InputBitWidth.
8089 if (C1->uge(APInt::getOneBitSet(C1->getBitWidth(), InputBitWidth)))
8090 TruncC1.setBit(InputBitWidth - 1);
8091 Value *AndInst = Builder.CreateAnd(A, TruncC1);
8092 return new ICmpInst(
8093 Pred, AndInst,
8094 ConstantInt::get(InputTy, C2->trunc(InputBitWidth)));
8095 }
8096 }
8097 }
8098 }
8099
8100 return Changed ? &I : nullptr;
8101}
8102
8103/// Fold fcmp ([us]itofp x, cst) if possible.
8105 Instruction *LHSI,
8106 Constant *RHSC) {
8107 const APFloat *RHS;
8108 if (!match(RHSC, m_APFloat(RHS)))
8109 return nullptr;
8110
8111 // Get the width of the mantissa. We don't want to hack on conversions that
8112 // might lose information from the integer, e.g. "i64 -> float"
8113 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8114 if (MantissaWidth == -1)
8115 return nullptr; // Unknown.
8116
8117 Type *IntTy = LHSI->getOperand(0)->getType();
8118 unsigned IntWidth = IntTy->getScalarSizeInBits();
8119 bool LHSUnsigned = isa<UIToFPInst>(LHSI);
8120
8121 if (I.isEquality()) {
8122 FCmpInst::Predicate P = I.getPredicate();
8123 bool IsExact = false;
8124 APSInt RHSCvt(IntWidth, LHSUnsigned);
8125 RHS->convertToInteger(RHSCvt, APFloat::rmNearestTiesToEven, &IsExact);
8126
8127 // If the floating point constant isn't an integer value, we know if we will
8128 // ever compare equal / not equal to it.
8129 if (!IsExact) {
8130 // TODO: Can never be -0.0 and other non-representable values
8131 APFloat RHSRoundInt(*RHS);
8133 if (*RHS != RHSRoundInt) {
8135 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8136
8138 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8139 }
8140 }
8141
8142 // TODO: If the constant is exactly representable, is it always OK to do
8143 // equality compares as integer?
8144 }
8145
8146 // Check to see that the input is converted from an integer type that is small
8147 // enough that preserves all bits. TODO: check here for "known" sign bits.
8148 // This would allow us to handle (fptosi (x >>s 62) to float) if x is i64 f.e.
8149
8150 // Following test does NOT adjust IntWidth downwards for signed inputs,
8151 // because the most negative value still requires all the mantissa bits
8152 // to distinguish it from one less than that value.
8153 if ((int)IntWidth > MantissaWidth) {
8154 // Conversion would lose accuracy. Check if loss can impact comparison.
8155 int Exp = ilogb(*RHS);
8156 if (Exp == APFloat::IEK_Inf) {
8157 int MaxExponent = ilogb(APFloat::getLargest(RHS->getSemantics()));
8158 if (MaxExponent < (int)IntWidth - !LHSUnsigned)
8159 // Conversion could create infinity.
8160 return nullptr;
8161 } else {
8162 // Note that if RHS is zero or NaN, then Exp is negative
8163 // and first condition is trivially false.
8164 if (MantissaWidth <= Exp && Exp <= (int)IntWidth - !LHSUnsigned)
8165 // Conversion could affect comparison.
8166 return nullptr;
8167 }
8168 }
8169
8170 // Otherwise, we can potentially simplify the comparison. We know that it
8171 // will always come through as an integer value and we know the constant is
8172 // not a NAN (it would have been previously simplified).
8173 assert(!RHS->isNaN() && "NaN comparison not already folded!");
8174
8176 switch (I.getPredicate()) {
8177 default:
8178 llvm_unreachable("Unexpected predicate!");
8179 case FCmpInst::FCMP_UEQ:
8180 case FCmpInst::FCMP_OEQ:
8181 Pred = ICmpInst::ICMP_EQ;
8182 break;
8183 case FCmpInst::FCMP_UGT:
8184 case FCmpInst::FCMP_OGT:
8185 Pred = LHSUnsigned ? ICmpInst::ICMP_UGT : ICmpInst::ICMP_SGT;
8186 break;
8187 case FCmpInst::FCMP_UGE:
8188 case FCmpInst::FCMP_OGE:
8189 Pred = LHSUnsigned ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
8190 break;
8191 case FCmpInst::FCMP_ULT:
8192 case FCmpInst::FCMP_OLT:
8193 Pred = LHSUnsigned ? ICmpInst::ICMP_ULT : ICmpInst::ICMP_SLT;
8194 break;
8195 case FCmpInst::FCMP_ULE:
8196 case FCmpInst::FCMP_OLE:
8197 Pred = LHSUnsigned ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_SLE;
8198 break;
8199 case FCmpInst::FCMP_UNE:
8200 case FCmpInst::FCMP_ONE:
8201 Pred = ICmpInst::ICMP_NE;
8202 break;
8203 case FCmpInst::FCMP_ORD:
8204 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8205 case FCmpInst::FCMP_UNO:
8206 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8207 }
8208
8209 // Now we know that the APFloat is a normal number, zero or inf.
8210
8211 // See if the FP constant is too large for the integer. For example,
8212 // comparing an i8 to 300.0.
8213 if (!LHSUnsigned) {
8214 // If the RHS value is > SignedMax, fold the comparison. This handles +INF
8215 // and large values.
8216 APFloat SMax(RHS->getSemantics());
8217 SMax.convertFromAPInt(APInt::getSignedMaxValue(IntWidth), true,
8219 if (SMax < *RHS) { // smax < 13123.0
8220 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SLT ||
8221 Pred == ICmpInst::ICMP_SLE)
8222 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8223 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8224 }
8225 } else {
8226 // If the RHS value is > UnsignedMax, fold the comparison. This handles
8227 // +INF and large values.
8228 APFloat UMax(RHS->getSemantics());
8229 UMax.convertFromAPInt(APInt::getMaxValue(IntWidth), false,
8231 if (UMax < *RHS) { // umax < 13123.0
8232 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_ULT ||
8233 Pred == ICmpInst::ICMP_ULE)
8234 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8235 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8236 }
8237 }
8238
8239 if (!LHSUnsigned) {
8240 // See if the RHS value is < SignedMin.
8241 APFloat SMin(RHS->getSemantics());
8242 SMin.convertFromAPInt(APInt::getSignedMinValue(IntWidth), true,
8244 if (SMin > *RHS) { // smin > 12312.0
8245 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_SGT ||
8246 Pred == ICmpInst::ICMP_SGE)
8247 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8248 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8249 }
8250 } else {
8251 // See if the RHS value is < UnsignedMin.
8252 APFloat UMin(RHS->getSemantics());
8253 UMin.convertFromAPInt(APInt::getMinValue(IntWidth), false,
8255 if (UMin > *RHS) { // umin > 12312.0
8256 if (Pred == ICmpInst::ICMP_NE || Pred == ICmpInst::ICMP_UGT ||
8257 Pred == ICmpInst::ICMP_UGE)
8258 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8259 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8260 }
8261 }
8262
8263 // Okay, now we know that the FP constant fits in the range [SMIN, SMAX] or
8264 // [0, UMAX], but it may still be fractional. Check whether this is the case
8265 // using the IsExact flag.
8266 // Don't do this for zero, because -0.0 is not fractional.
8267 APSInt RHSInt(IntWidth, LHSUnsigned);
8268 bool IsExact;
8269 RHS->convertToInteger(RHSInt, APFloat::rmTowardZero, &IsExact);
8270 if (!RHS->isZero()) {
8271 if (!IsExact) {
8272 // If we had a comparison against a fractional value, we have to adjust
8273 // the compare predicate and sometimes the value. RHSC is rounded towards
8274 // zero at this point.
8275 switch (Pred) {
8276 default:
8277 llvm_unreachable("Unexpected integer comparison!");
8278 case ICmpInst::ICMP_NE: // (float)int != 4.4 --> true
8279 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8280 case ICmpInst::ICMP_EQ: // (float)int == 4.4 --> false
8281 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8282 case ICmpInst::ICMP_ULE:
8283 // (float)int <= 4.4 --> int <= 4
8284 // (float)int <= -4.4 --> false
8285 if (RHS->isNegative())
8286 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8287 break;
8288 case ICmpInst::ICMP_SLE:
8289 // (float)int <= 4.4 --> int <= 4
8290 // (float)int <= -4.4 --> int < -4
8291 if (RHS->isNegative())
8292 Pred = ICmpInst::ICMP_SLT;
8293 break;
8294 case ICmpInst::ICMP_ULT:
8295 // (float)int < -4.4 --> false
8296 // (float)int < 4.4 --> int <= 4
8297 if (RHS->isNegative())
8298 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8299 Pred = ICmpInst::ICMP_ULE;
8300 break;
8301 case ICmpInst::ICMP_SLT:
8302 // (float)int < -4.4 --> int < -4
8303 // (float)int < 4.4 --> int <= 4
8304 if (!RHS->isNegative())
8305 Pred = ICmpInst::ICMP_SLE;
8306 break;
8307 case ICmpInst::ICMP_UGT:
8308 // (float)int > 4.4 --> int > 4
8309 // (float)int > -4.4 --> true
8310 if (RHS->isNegative())
8311 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8312 break;
8313 case ICmpInst::ICMP_SGT:
8314 // (float)int > 4.4 --> int > 4
8315 // (float)int > -4.4 --> int >= -4
8316 if (RHS->isNegative())
8317 Pred = ICmpInst::ICMP_SGE;
8318 break;
8319 case ICmpInst::ICMP_UGE:
8320 // (float)int >= -4.4 --> true
8321 // (float)int >= 4.4 --> int > 4
8322 if (RHS->isNegative())
8323 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8324 Pred = ICmpInst::ICMP_UGT;
8325 break;
8326 case ICmpInst::ICMP_SGE:
8327 // (float)int >= -4.4 --> int >= -4
8328 // (float)int >= 4.4 --> int > 4
8329 if (!RHS->isNegative())
8330 Pred = ICmpInst::ICMP_SGT;
8331 break;
8332 }
8333 }
8334 }
8335
8336 // Lower this FP comparison into an appropriate integer version of the
8337 // comparison.
8338 return new ICmpInst(Pred, LHSI->getOperand(0),
8339 ConstantInt::get(LHSI->getOperand(0)->getType(), RHSInt));
8340}
8341
8342/// Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2)
8343/// where all true/false values are constants that allow the compare to be
8344/// constant-folded for every combination of C1 and C2.
8345/// We compute a 4-entry truth table and use createLogicFromTable to
8346/// synthesize a boolean expression of C1 and C2.
8348 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8349 Value *C1, *C2;
8350 Constant *TV1, *FV1, *TV2, *FV2;
8351
8352 if (!match(Op0, m_Select(m_Value(C1), m_Constant(TV1), m_Constant(FV1))) ||
8353 !match(Op1, m_Select(m_Value(C2), m_Constant(TV2), m_Constant(FV2))))
8354 return nullptr;
8355
8356 if (I.getType() != C1->getType() || I.getType() != C2->getType())
8357 return nullptr;
8358
8359 unsigned Pred = I.getPredicate();
8360 const DataLayout &DL = I.getDataLayout();
8361
8362 Constant *Res00 = ConstantFoldCompareInstOperands(Pred, FV1, FV2, DL);
8363 Constant *Res01 = ConstantFoldCompareInstOperands(Pred, FV1, TV2, DL);
8364 Constant *Res10 = ConstantFoldCompareInstOperands(Pred, TV1, FV2, DL);
8365 Constant *Res11 = ConstantFoldCompareInstOperands(Pred, TV1, TV2, DL);
8366
8367 if (!Res00 || !Res01 || !Res10 || !Res11)
8368 return nullptr;
8369
8370 if ((!Res00->isNullValue() && !Res00->isAllOnesValue()) ||
8371 (!Res01->isNullValue() && !Res01->isAllOnesValue()) ||
8372 (!Res10->isNullValue() && !Res10->isAllOnesValue()) ||
8373 (!Res11->isNullValue() && !Res11->isAllOnesValue()))
8374 return nullptr;
8375
8376 std::bitset<4> Table;
8377 if (!Res00->isNullValue())
8378 Table.set(0);
8379 if (!Res01->isNullValue())
8380 Table.set(1);
8381 if (!Res10->isNullValue())
8382 Table.set(2);
8383 if (!Res11->isNullValue())
8384 Table.set(3);
8385
8386 Value *Res = createLogicFromTable(Table, C1, C2, Builder,
8387 Op0->hasOneUse() && Op1->hasOneUse());
8388 if (!Res)
8389 return nullptr;
8390 return replaceInstUsesWith(I, Res);
8391}
8392
8393/// Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
8395 Constant *RHSC) {
8396 // When C is not 0.0 and infinities are not allowed:
8397 // (C / X) < 0.0 is a sign-bit test of X
8398 // (C / X) < 0.0 --> X < 0.0 (if C is positive)
8399 // (C / X) < 0.0 --> X > 0.0 (if C is negative, swap the predicate)
8400 //
8401 // Proof:
8402 // Multiply (C / X) < 0.0 by X * X / C.
8403 // - X is non zero, if it is the flag 'ninf' is violated.
8404 // - C defines the sign of X * X * C. Thus it also defines whether to swap
8405 // the predicate. C is also non zero by definition.
8406 //
8407 // Thus X * X / C is non zero and the transformation is valid. [qed]
8408
8409 FCmpInst::Predicate Pred = I.getPredicate();
8410
8411 // Check that predicates are valid.
8412 if ((Pred != FCmpInst::FCMP_OGT) && (Pred != FCmpInst::FCMP_OLT) &&
8413 (Pred != FCmpInst::FCMP_OGE) && (Pred != FCmpInst::FCMP_OLE))
8414 return nullptr;
8415
8416 // Check that RHS operand is zero.
8417 if (!match(RHSC, m_AnyZeroFP()))
8418 return nullptr;
8419
8420 // Check fastmath flags ('ninf').
8421 if (!LHSI->hasNoInfs() || !I.hasNoInfs())
8422 return nullptr;
8423
8424 // Check the properties of the dividend. It must not be zero to avoid a
8425 // division by zero (see Proof).
8426 const APFloat *C;
8427 if (!match(LHSI->getOperand(0), m_APFloat(C)))
8428 return nullptr;
8429
8430 if (C->isZero())
8431 return nullptr;
8432
8433 // Get swapped predicate if necessary.
8434 if (C->isNegative())
8435 Pred = I.getSwappedPredicate();
8436
8437 return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
8438}
8439
8440// Transform 'fptrunc(x) cmp C' to 'x cmp ext(C)' if possible.
8441// Patterns include:
8442// fptrunc(x) < C --> x < ext(C)
8443// fptrunc(x) <= C --> x <= ext(C)
8444// fptrunc(x) > C --> x > ext(C)
8445// fptrunc(x) >= C --> x >= ext(C)
8446// fptrunc(x) ord/uno C --> x ord/uno 0
8447// where 'ext(C)' is the extension of 'C' to the type of 'x' with a small bias
8448// due to precision loss.
8450 const Constant &C) {
8451 FCmpInst::Predicate Pred = I.getPredicate();
8452 Type *DestType = FPTrunc.getOperand(0)->getType();
8453
8454 const APFloat *CValue;
8455 // TODO: support vec
8456 if (!match(&C, m_APFloat(CValue)))
8457 return nullptr;
8458
8459 // Handle ord/uno
8460 if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
8461 assert(!CValue->isNaN() &&
8462 "X ord/uno NaN should be folded away by simplifyFCmpInst()");
8463 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8464 ConstantFP::getZero(DestType), "", &I);
8465 }
8466
8467 // Handle <, >, <=, >=
8468 bool RoundDown = false;
8469
8470 if (Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE ||
8471 Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT)
8472 RoundDown = true;
8473 else if (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT ||
8474 Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)
8475 RoundDown = false;
8476 else
8477 return nullptr;
8478
8479 if (CValue->isNaN() || CValue->isInfinity())
8480 return nullptr;
8481
8482 auto ConvertFltSema = [](const APFloat &Src, const fltSemantics &Sema) {
8483 bool LosesInfo;
8484 APFloat Dest = Src;
8485 Dest.convert(Sema, APFloat::rmNearestTiesToEven, &LosesInfo);
8486 return Dest;
8487 };
8488
8489 auto NextValue = [](const APFloat &Value, bool RoundDown) {
8490 APFloat NextValue = Value;
8491 NextValue.next(RoundDown);
8492 return NextValue;
8493 };
8494
8495 APFloat NextCValue = NextValue(*CValue, RoundDown);
8496
8497 const fltSemantics &DestFltSema =
8498 DestType->getScalarType()->getFltSemantics();
8499
8500 APFloat ExtCValue = ConvertFltSema(*CValue, DestFltSema);
8501 APFloat ExtNextCValue = ConvertFltSema(NextCValue, DestFltSema);
8502
8503 // When 'NextCValue' is infinity, use an imaged 'NextCValue' that equals
8504 // 'CValue + bias' to avoid the infinity after conversion. The bias is
8505 // estimated as 'CValue - PrevCValue', where 'PrevCValue' is the previous
8506 // value of 'CValue'.
8507 if (NextCValue.isInfinity()) {
8508 APFloat PrevCValue = NextValue(*CValue, !RoundDown);
8509 APFloat Bias = ConvertFltSema(*CValue - PrevCValue, DestFltSema);
8510
8511 ExtNextCValue = ExtCValue + Bias;
8512 }
8513
8514 APFloat ExtMidValue =
8515 scalbn(ExtCValue + ExtNextCValue, -1, APFloat::rmNearestTiesToEven);
8516
8517 const fltSemantics &SrcFltSema =
8518 C.getType()->getScalarType()->getFltSemantics();
8519
8520 // 'MidValue' might be rounded to 'NextCValue'. Correct it here.
8521 APFloat MidValue = ConvertFltSema(ExtMidValue, SrcFltSema);
8522 if (MidValue != *CValue)
8523 ExtMidValue.next(!RoundDown);
8524
8525 // Check whether 'ExtMidValue' is a valid result since the assumption on
8526 // imaged 'NextCValue' might not hold for new float types.
8527 // ppc_fp128 can't pass here when converting from max float because of
8528 // APFloat implementation.
8529 if (NextCValue.isInfinity()) {
8530 // ExtMidValue --- narrowed ---> Finite
8531 if (ConvertFltSema(ExtMidValue, SrcFltSema).isInfinity())
8532 return nullptr;
8533
8534 // NextExtMidValue --- narrowed ---> Infinity
8535 APFloat NextExtMidValue = NextValue(ExtMidValue, RoundDown);
8536 if (ConvertFltSema(NextExtMidValue, SrcFltSema).isFinite())
8537 return nullptr;
8538 }
8539
8540 return new FCmpInst(Pred, FPTrunc.getOperand(0),
8541 ConstantFP::get(DestType, ExtMidValue), "", &I);
8542}
8543
8544/// Optimize fabs(X) compared with zero.
8546 Value *X;
8547 if (!match(I.getOperand(0), m_FAbs(m_Value(X))))
8548 return nullptr;
8549
8550 const APFloat *C;
8551 if (!match(I.getOperand(1), m_APFloat(C)))
8552 return nullptr;
8553
8554 if (!C->isPosZero()) {
8555 if (!C->isSmallestNormalized())
8556 return nullptr;
8557
8558 const Function *F = I.getFunction();
8559 DenormalMode Mode = F->getDenormalMode(C->getSemantics());
8560 if (Mode.Input == DenormalMode::PreserveSign ||
8562
8563 auto replaceFCmp = [](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8564 Constant *Zero = ConstantFP::getZero(X->getType());
8565 return new FCmpInst(P, X, Zero, "", I);
8566 };
8567
8568 switch (I.getPredicate()) {
8569 case FCmpInst::FCMP_OLT:
8570 // fcmp olt fabs(x), smallest_normalized_number -> fcmp oeq x, 0.0
8571 return replaceFCmp(&I, FCmpInst::FCMP_OEQ, X);
8572 case FCmpInst::FCMP_UGE:
8573 // fcmp uge fabs(x), smallest_normalized_number -> fcmp une x, 0.0
8574 return replaceFCmp(&I, FCmpInst::FCMP_UNE, X);
8575 case FCmpInst::FCMP_OGE:
8576 // fcmp oge fabs(x), smallest_normalized_number -> fcmp one x, 0.0
8577 return replaceFCmp(&I, FCmpInst::FCMP_ONE, X);
8578 case FCmpInst::FCMP_ULT:
8579 // fcmp ult fabs(x), smallest_normalized_number -> fcmp ueq x, 0.0
8580 return replaceFCmp(&I, FCmpInst::FCMP_UEQ, X);
8581 default:
8582 break;
8583 }
8584 }
8585
8586 return nullptr;
8587 }
8588
8589 auto replacePredAndOp0 = [&IC](FCmpInst *I, FCmpInst::Predicate P, Value *X) {
8590 I->setPredicate(P);
8591 return IC.replaceOperand(*I, 0, X);
8592 };
8593
8594 switch (I.getPredicate()) {
8595 case FCmpInst::FCMP_UGE:
8596 case FCmpInst::FCMP_OLT:
8597 // fabs(X) >= 0.0 --> true
8598 // fabs(X) < 0.0 --> false
8599 llvm_unreachable("fcmp should have simplified");
8600
8601 case FCmpInst::FCMP_OGT:
8602 // fabs(X) > 0.0 --> X != 0.0
8603 return replacePredAndOp0(&I, FCmpInst::FCMP_ONE, X);
8604
8605 case FCmpInst::FCMP_UGT:
8606 // fabs(X) u> 0.0 --> X u!= 0.0
8607 return replacePredAndOp0(&I, FCmpInst::FCMP_UNE, X);
8608
8609 case FCmpInst::FCMP_OLE:
8610 // fabs(X) <= 0.0 --> X == 0.0
8611 return replacePredAndOp0(&I, FCmpInst::FCMP_OEQ, X);
8612
8613 case FCmpInst::FCMP_ULE:
8614 // fabs(X) u<= 0.0 --> X u== 0.0
8615 return replacePredAndOp0(&I, FCmpInst::FCMP_UEQ, X);
8616
8617 case FCmpInst::FCMP_OGE:
8618 // fabs(X) >= 0.0 --> !isnan(X)
8619 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8620 return replacePredAndOp0(&I, FCmpInst::FCMP_ORD, X);
8621
8622 case FCmpInst::FCMP_ULT:
8623 // fabs(X) u< 0.0 --> isnan(X)
8624 assert(!I.hasNoNaNs() && "fcmp should have simplified");
8625 return replacePredAndOp0(&I, FCmpInst::FCMP_UNO, X);
8626
8627 case FCmpInst::FCMP_OEQ:
8628 case FCmpInst::FCMP_UEQ:
8629 case FCmpInst::FCMP_ONE:
8630 case FCmpInst::FCMP_UNE:
8631 case FCmpInst::FCMP_ORD:
8632 case FCmpInst::FCMP_UNO:
8633 // Look through the fabs() because it doesn't change anything but the sign.
8634 // fabs(X) == 0.0 --> X == 0.0,
8635 // fabs(X) != 0.0 --> X != 0.0
8636 // isnan(fabs(X)) --> isnan(X)
8637 // !isnan(fabs(X) --> !isnan(X)
8638 return replacePredAndOp0(&I, I.getPredicate(), X);
8639
8640 default:
8641 return nullptr;
8642 }
8643}
8644
8645/// Optimize sqrt(X) compared with zero.
8647 Value *X;
8648 if (!match(I.getOperand(0), m_Sqrt(m_Value(X))))
8649 return nullptr;
8650
8651 if (!match(I.getOperand(1), m_PosZeroFP()))
8652 return nullptr;
8653
8654 auto ReplacePredAndOp0 = [&](FCmpInst::Predicate P) {
8655 I.setPredicate(P);
8656 return IC.replaceOperand(I, 0, X);
8657 };
8658
8659 // Clear ninf flag if sqrt doesn't have it.
8660 if (!cast<Instruction>(I.getOperand(0))->hasNoInfs())
8661 I.setHasNoInfs(false);
8662
8663 switch (I.getPredicate()) {
8664 case FCmpInst::FCMP_OLT:
8665 case FCmpInst::FCMP_UGE:
8666 // sqrt(X) < 0.0 --> false
8667 // sqrt(X) u>= 0.0 --> true
8668 llvm_unreachable("fcmp should have simplified");
8669 case FCmpInst::FCMP_ULT:
8670 case FCmpInst::FCMP_ULE:
8671 case FCmpInst::FCMP_OGT:
8672 case FCmpInst::FCMP_OGE:
8673 case FCmpInst::FCMP_OEQ:
8674 case FCmpInst::FCMP_UNE:
8675 // sqrt(X) u< 0.0 --> X u< 0.0
8676 // sqrt(X) u<= 0.0 --> X u<= 0.0
8677 // sqrt(X) > 0.0 --> X > 0.0
8678 // sqrt(X) >= 0.0 --> X >= 0.0
8679 // sqrt(X) == 0.0 --> X == 0.0
8680 // sqrt(X) u!= 0.0 --> X u!= 0.0
8681 return IC.replaceOperand(I, 0, X);
8682
8683 case FCmpInst::FCMP_OLE:
8684 // sqrt(X) <= 0.0 --> X == 0.0
8685 return ReplacePredAndOp0(FCmpInst::FCMP_OEQ);
8686 case FCmpInst::FCMP_UGT:
8687 // sqrt(X) u> 0.0 --> X u!= 0.0
8688 return ReplacePredAndOp0(FCmpInst::FCMP_UNE);
8689 case FCmpInst::FCMP_UEQ:
8690 // sqrt(X) u== 0.0 --> X u<= 0.0
8691 return ReplacePredAndOp0(FCmpInst::FCMP_ULE);
8692 case FCmpInst::FCMP_ONE:
8693 // sqrt(X) != 0.0 --> X > 0.0
8694 return ReplacePredAndOp0(FCmpInst::FCMP_OGT);
8695 case FCmpInst::FCMP_ORD:
8696 // !isnan(sqrt(X)) --> X >= 0.0
8697 return ReplacePredAndOp0(FCmpInst::FCMP_OGE);
8698 case FCmpInst::FCMP_UNO:
8699 // isnan(sqrt(X)) --> X u< 0.0
8700 return ReplacePredAndOp0(FCmpInst::FCMP_ULT);
8701 default:
8702 llvm_unreachable("Unexpected predicate!");
8703 }
8704}
8705
8707 CmpInst::Predicate Pred = I.getPredicate();
8708 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8709
8710 // Canonicalize fneg as Op1.
8711 if (match(Op0, m_FNeg(m_Value())) && !match(Op1, m_FNeg(m_Value()))) {
8712 std::swap(Op0, Op1);
8713 Pred = I.getSwappedPredicate();
8714 }
8715
8716 if (!match(Op1, m_FNeg(m_Specific(Op0))))
8717 return nullptr;
8718
8719 // Replace the negated operand with 0.0:
8720 // fcmp Pred Op0, -Op0 --> fcmp Pred Op0, 0.0
8721 Constant *Zero = ConstantFP::getZero(Op0->getType());
8722 return new FCmpInst(Pred, Op0, Zero, "", &I);
8723}
8724
8726 Constant *RHSC, InstCombinerImpl &CI) {
8727 const CmpInst::Predicate Pred = I.getPredicate();
8728 Value *X = LHSI->getOperand(0);
8729 Value *Y = LHSI->getOperand(1);
8730 switch (Pred) {
8731 default:
8732 break;
8733 case FCmpInst::FCMP_UGT:
8734 case FCmpInst::FCMP_ULT:
8735 case FCmpInst::FCMP_UNE:
8736 case FCmpInst::FCMP_OEQ:
8737 case FCmpInst::FCMP_OGE:
8738 case FCmpInst::FCMP_OLE:
8739 // The optimization is not valid if X and Y are infinities of the same
8740 // sign, i.e. the inf - inf = nan case. If the fsub has the ninf or nnan
8741 // flag then we can assume we do not have that case. Otherwise we might be
8742 // able to prove that either X or Y is not infinity.
8743 if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8747 break;
8748
8749 [[fallthrough]];
8750 case FCmpInst::FCMP_OGT:
8751 case FCmpInst::FCMP_OLT:
8752 case FCmpInst::FCMP_ONE:
8753 case FCmpInst::FCMP_UEQ:
8754 case FCmpInst::FCMP_UGE:
8755 case FCmpInst::FCMP_ULE:
8756 // fcmp pred (x - y), 0 --> fcmp pred x, y
8757 if (match(RHSC, m_AnyZeroFP()) &&
8758 I.getFunction()->getDenormalMode(
8759 LHSI->getType()->getScalarType()->getFltSemantics()) ==
8761 CI.replaceOperand(I, 0, X);
8762 CI.replaceOperand(I, 1, Y);
8763 I.setHasNoInfs(LHSI->hasNoInfs());
8764 if (LHSI->hasNoNaNs())
8765 I.setHasNoNaNs(true);
8766 return &I;
8767 }
8768 // fcmp `pred (C - Y), C` -> `fcmp swap(pred), Y, 0`
8769 // where C and Y can't be arbitrary floating-point values.
8770 // For example, with `C = 1.0f` and `Y = 0x1p-149`, `1.0f - Y` rounds back
8771 // to `1.0f`, so the source compare is false while the rewritten compare is
8772 // true.
8773 // We need to make sure (C - Y) never rounds back to C
8774 const APFloat *C;
8775 Value *IntSrc;
8776 if (match(RHSC, m_APFloat(C)) &&
8777 match(LHSI, m_FSub(m_Specific(RHSC), m_IToFP(m_Value(IntSrc)))) &&
8778 C->isNormal()) {
8779 // Requirements on C and Y:
8780 // 1. C is finite, nonzero, normal.
8781 // 2. C shouldn't be too large, that is, ULP(C) <= 1.
8782 // 3. Y must be the form of `[su]itofp`, so the finite nonzero result of Y
8783 // must be integer-valued with an absolute value of at least 1;
8784 // as long as the step size near C does not exceed 1,
8785 // C - Y cannot be rounded back to C when Y != 0.
8786 // 4. If Y = 0, `fcmp pred (C - 0), C` are equivalent to `fcmp swap(pred)
8787 // 0, 0` for ordered and unordered predicates as long as C is finite and
8788 // nonzero.
8789 int MantissaWidth = LHSI->getType()->getFPMantissaWidth();
8790 if (MantissaWidth != -1 && ilogb(*C) < MantissaWidth) {
8791 Constant *ZeroC = ConstantFP::getZero(LHSI->getType());
8792 I.setPredicate(I.getSwappedPredicate());
8793 CI.replaceOperand(I, 0, Y);
8794 CI.replaceOperand(I, 1, ZeroC);
8795 return &I;
8796 }
8797 }
8798 break;
8799 }
8800
8801 return nullptr;
8802}
8803
8804/// Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b
8805/// where 'pred' is olt, ult, ogt, ugt, oge or uge and C is a positive, Non-NaN
8806/// float when the uitofp casts are exact and C is in the valid range.
8807///
8808/// Since exact uitofp means distinct integers map to distinct floats, the only
8809/// values fabs(uitofp(a) - uitofp(b)) can take are {0.0, 1.0, 2.0, ...}.
8810/// There are no values in the open interval (0, 1), so:
8811/// fabs(...) < C where 0 < C <= 1.0 --> a == b (strict lt: C=1.0 ok)
8812// fabs(..) >= C where C >= 1.0 -> a != b
8813///
8814/// The same logic applies to sitofp.
8816 Value *FAbsArg;
8817 if (!match(I.getOperand(0), m_FAbs(m_Value(FAbsArg))))
8818 return nullptr;
8819
8820 const APFloat *C;
8821 if (!match(I.getOperand(1), PatternMatch::m_FiniteNonZero(C)))
8822 return nullptr;
8823
8824 FCmpInst::Predicate Pred = I.getPredicate();
8825 bool IsStrictLt = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_ULT;
8826 bool IsLe = Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE;
8827 bool IsStrictGt = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT;
8828 bool IsGe = Pred == FCmpInst::FCMP_OGE || Pred == FCmpInst::FCMP_UGE;
8829 if (!IsStrictLt && !IsStrictGt && !IsGe)
8830 return nullptr;
8831
8832 APFloat One = APFloat::getOne(C->getSemantics());
8833 APFloat::cmpResult Cmp = C->compare(One);
8834
8835 // For strict-lt (olt/ult): C must be in (0, 1.0] -- C == 1.0 is fine since
8836 // the next possible value after 0.0 is 1.0, and < 1.0 excludes it.
8837 if (IsStrictLt && Cmp == APFloat::cmpGreaterThan)
8838 return nullptr;
8839 if (IsGe && Cmp == APFloat::cmpGreaterThan)
8840 return nullptr;
8841 if (IsLe && Cmp != APFloat::cmpGreaterThan)
8842 return nullptr;
8843 if (IsStrictGt && Cmp != APFloat::cmpLessThan)
8844 return nullptr;
8845
8846 // Match: fsub(uitofp(A), uitofp(B)) where both casts are uitofp or sitofp
8847 Value *A, *B;
8848 bool IsSigned;
8849 if (match(FAbsArg, m_FSub(m_UIToFP(m_Value(A)), m_UIToFP(m_Value(B))))) {
8850 IsSigned = false;
8851 } else if (match(FAbsArg,
8853 IsSigned = true;
8854 } else {
8855 return nullptr;
8856 }
8857
8858 // A and B must have the same integer type
8859 if (A->getType() != B->getType())
8860 return nullptr;
8861
8862 Type *FPTy = FAbsArg->getType();
8863 if (!IC.canBeCastedExactlyIntToFP(A, FPTy, IsSigned, &I) ||
8864 !IC.canBeCastedExactlyIntToFP(B, FPTy, IsSigned, &I))
8865 return nullptr;
8866 ICmpInst::Predicate ResultPred =
8867 IsStrictLt || IsLe ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
8868 return new ICmpInst(ResultPred, A, B);
8869}
8870
8872 InstCombinerImpl &IC) {
8873 Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8874 Type *OpType = LHS->getType();
8875 CmpInst::Predicate Pred = I.getPredicate();
8876
8879
8880 if (!FloorX && !CeilX) {
8883 std::swap(LHS, RHS);
8884 Pred = I.getSwappedPredicate();
8885 }
8886 }
8887
8888 if ((FloorX || CeilX) && FCmpInst::isCommutative(Pred) && LHS->hasOneUse()) {
8889 // fcmp pred floor(x), x => fcmp pred trunc(x), x
8890 // fcmp pred ceil(x), x => fcmp pred trunc(x), x
8891 // where pred is oeq, one, ord, ueq, une, uno.
8892 Value *TruncX = IC.Builder.CreateUnaryIntrinsic(Intrinsic::trunc, RHS);
8893 return new FCmpInst(Pred, TruncX, RHS, "", &I);
8894 }
8895
8896 switch (Pred) {
8897 case FCmpInst::FCMP_OLE:
8898 // fcmp ole floor(x), x => fcmp ord x, 0
8899 if (FloorX)
8901 "", &I);
8902 break;
8903 case FCmpInst::FCMP_OGT:
8904 // fcmp ogt floor(x), x => false
8905 if (FloorX)
8906 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8907 break;
8908 case FCmpInst::FCMP_OGE:
8909 // fcmp oge ceil(x), x => fcmp ord x, 0
8910 if (CeilX)
8912 "", &I);
8913 break;
8914 case FCmpInst::FCMP_OLT:
8915 // fcmp olt ceil(x), x => false
8916 if (CeilX)
8917 return IC.replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
8918 break;
8919 case FCmpInst::FCMP_ULE:
8920 // fcmp ule floor(x), x => true
8921 if (FloorX)
8922 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8923 break;
8924 case FCmpInst::FCMP_UGT:
8925 // fcmp ugt floor(x), x => fcmp uno x, 0
8926 if (FloorX)
8928 "", &I);
8929 break;
8930 case FCmpInst::FCMP_UGE:
8931 // fcmp uge ceil(x), x => true
8932 if (CeilX)
8933 return IC.replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
8934 break;
8935 case FCmpInst::FCMP_ULT:
8936 // fcmp ult ceil(x), x => fcmp uno x, 0
8937 if (CeilX)
8939 "", &I);
8940 break;
8941 default:
8942 break;
8943 }
8944
8945 return nullptr;
8946}
8947
8948/// Returns true if a select that implements a min/max is redundant and
8949/// select result can be replaced with its non-constant operand, e.g.,
8950/// select ( (si/ui-to-fp A) <= C ), C, (si/ui-to-fp A)
8951/// where C is the FP constant equal to the minimum integer value
8952/// representable by A.
8954 Value *B) {
8955 const APFloat *APF;
8956 if (!match(B, m_APFloat(APF)))
8957 return false;
8958
8959 auto *I = dyn_cast<Instruction>(A);
8960 if (!I || !(I->getOpcode() == Instruction::SIToFP ||
8961 I->getOpcode() == Instruction::UIToFP))
8962 return false;
8963
8964 bool IsUnsigned = I->getOpcode() == Instruction::UIToFP;
8965 unsigned BitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
8966 APSInt IntBoundary = (Flavor == SPF_FMAXNUM)
8967 ? APSInt::getMinValue(BitWidth, IsUnsigned)
8968 : APSInt::getMaxValue(BitWidth, IsUnsigned);
8969 APSInt ConvertedInt(BitWidth, IsUnsigned);
8970 bool IsExact;
8972 APF->convertToInteger(ConvertedInt, APFloat::rmTowardZero, &IsExact);
8973 return Status == APFloat::opOK && IsExact && ConvertedInt == IntBoundary;
8974}
8975
8977 bool Changed = false;
8978
8979 /// Orders the operands of the compare so that they are listed from most
8980 /// complex to least complex. This puts constants before unary operators,
8981 /// before binary operators.
8982 if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand(1))) {
8983 I.swapOperands();
8984 Changed = true;
8985 }
8986
8987 const CmpInst::Predicate Pred = I.getPredicate();
8988 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
8989 if (Value *V = simplifyFCmpInst(Pred, Op0, Op1, I.getFastMathFlags(),
8990 SQ.getWithInstruction(&I)))
8991 return replaceInstUsesWith(I, V);
8992
8993 // Simplify 'fcmp pred X, X'
8994 Type *OpType = Op0->getType();
8995 assert(OpType == Op1->getType() && "fcmp with different-typed operands?");
8996 if (Op0 == Op1) {
8997 switch (Pred) {
8998 default:
8999 break;
9000 case FCmpInst::FCMP_UNO: // True if unordered: isnan(X) | isnan(Y)
9001 case FCmpInst::FCMP_ULT: // True if unordered or less than
9002 case FCmpInst::FCMP_UGT: // True if unordered or greater than
9003 case FCmpInst::FCMP_UNE: // True if unordered or not equal
9004 // Canonicalize these to be 'fcmp uno %X, 0.0'.
9005 I.setPredicate(FCmpInst::FCMP_UNO);
9006 I.setOperand(1, Constant::getNullValue(OpType));
9007 return &I;
9008
9009 case FCmpInst::FCMP_ORD: // True if ordered (no nans)
9010 case FCmpInst::FCMP_OEQ: // True if ordered and equal
9011 case FCmpInst::FCMP_OGE: // True if ordered and greater than or equal
9012 case FCmpInst::FCMP_OLE: // True if ordered and less than or equal
9013 // Canonicalize these to be 'fcmp ord %X, 0.0'.
9014 I.setPredicate(FCmpInst::FCMP_ORD);
9015 I.setOperand(1, Constant::getNullValue(OpType));
9016 return &I;
9017 }
9018 }
9019
9020 if (I.isCommutative()) {
9021 if (auto Pair = matchSymmetricPair(I.getOperand(0), I.getOperand(1))) {
9022 replaceOperand(I, 0, Pair->first);
9023 replaceOperand(I, 1, Pair->second);
9024 return &I;
9025 }
9026 }
9027
9028 // If we're just checking for a NaN (ORD/UNO) and have a non-NaN operand,
9029 // then canonicalize the operand to 0.0.
9030 if (Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) {
9031 if (!match(Op0, m_PosZeroFP()) &&
9032 isKnownNeverNaN(Op0, getSimplifyQuery().getWithInstruction(&I)))
9033 return replaceOperand(I, 0, ConstantFP::getZero(OpType));
9034
9035 if (!match(Op1, m_PosZeroFP()) &&
9036 isKnownNeverNaN(Op1, getSimplifyQuery().getWithInstruction(&I)))
9037 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9038 }
9039
9040 // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
9041 Value *X, *Y;
9042 if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
9043 return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
9044
9046 return R;
9047
9048 // Test if the FCmpInst instruction is used exclusively by a select as
9049 // part of a minimum or maximum operation. If so, refrain from doing
9050 // any other folding. This helps out other analyses which understand
9051 // non-obfuscated minimum and maximum idioms, such as ScalarEvolution
9052 // and CodeGen. And in this case, at least one of the comparison
9053 // operands has at least one user besides the compare (the select),
9054 // which would often largely negate the benefit of folding anyway.
9055 if (I.hasOneUse())
9056 if (SelectInst *SI = dyn_cast<SelectInst>(I.user_back())) {
9057 Value *A, *B;
9059 bool IsRedundantMinMaxClamp =
9060 (SPR.Flavor == SPF_FMAXNUM || SPR.Flavor == SPF_FMINNUM) &&
9062 if (SPR.Flavor != SPF_UNKNOWN && !IsRedundantMinMaxClamp)
9063 return nullptr;
9064 }
9065
9066 // The sign of 0.0 is ignored by fcmp, so canonicalize to +0.0:
9067 // fcmp Pred X, -0.0 --> fcmp Pred X, 0.0
9068 if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
9069 return replaceOperand(I, 1, ConstantFP::getZero(OpType));
9070
9071 // Canonicalize:
9072 // fcmp olt X, +inf -> fcmp one X, +inf
9073 // fcmp ole X, +inf -> fcmp ord X, 0
9074 // fcmp ogt X, +inf -> false
9075 // fcmp oge X, +inf -> fcmp oeq X, +inf
9076 // fcmp ult X, +inf -> fcmp une X, +inf
9077 // fcmp ule X, +inf -> true
9078 // fcmp ugt X, +inf -> fcmp uno X, 0
9079 // fcmp uge X, +inf -> fcmp ueq X, +inf
9080 // fcmp olt X, -inf -> false
9081 // fcmp ole X, -inf -> fcmp oeq X, -inf
9082 // fcmp ogt X, -inf -> fcmp one X, -inf
9083 // fcmp oge X, -inf -> fcmp ord X, 0
9084 // fcmp ult X, -inf -> fcmp uno X, 0
9085 // fcmp ule X, -inf -> fcmp ueq X, -inf
9086 // fcmp ugt X, -inf -> fcmp une X, -inf
9087 // fcmp uge X, -inf -> true
9088 const APFloat *C;
9089 if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
9090 switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
9091 default:
9092 break;
9093 case FCmpInst::FCMP_ORD:
9094 case FCmpInst::FCMP_UNO:
9097 case FCmpInst::FCMP_OGT:
9098 case FCmpInst::FCMP_ULE:
9099 llvm_unreachable("Should be simplified by InstSimplify");
9100 case FCmpInst::FCMP_OLT:
9101 return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
9102 case FCmpInst::FCMP_OLE:
9103 return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
9104 "", &I);
9105 case FCmpInst::FCMP_OGE:
9106 return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
9107 case FCmpInst::FCMP_ULT:
9108 return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
9109 case FCmpInst::FCMP_UGT:
9110 return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
9111 "", &I);
9112 case FCmpInst::FCMP_UGE:
9113 return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
9114 }
9115 }
9116
9117 // Ignore signbit of bitcasted int when comparing equality to FP 0.0:
9118 // fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
9119 if (match(Op1, m_PosZeroFP()) &&
9121 !F.getDenormalMode(Op1->getType()->getScalarType()->getFltSemantics())
9122 .inputsMayBeZero()) {
9124 if (Pred == FCmpInst::FCMP_OEQ)
9125 IntPred = ICmpInst::ICMP_EQ;
9126 else if (Pred == FCmpInst::FCMP_UNE)
9127 IntPred = ICmpInst::ICMP_NE;
9128
9129 if (IntPred != ICmpInst::BAD_ICMP_PREDICATE) {
9130 Type *IntTy = X->getType();
9131 const APInt &SignMask = ~APInt::getSignMask(IntTy->getScalarSizeInBits());
9132 Value *MaskX = Builder.CreateAnd(X, ConstantInt::get(IntTy, SignMask));
9133 return new ICmpInst(IntPred, MaskX, ConstantInt::getNullValue(IntTy));
9134 }
9135 }
9136
9137 // Handle fcmp with instruction LHS and constant RHS.
9138 Instruction *LHSI;
9139 Constant *RHSC;
9140 if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
9141 switch (LHSI->getOpcode()) {
9142 case Instruction::Select:
9143 // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
9144 if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
9146 return replaceOperand(I, 0, X);
9148 return NV;
9149 break;
9150 case Instruction::FSub:
9151 if (LHSI->hasOneUse())
9152 if (Instruction *NV = foldFCmpFSubIntoFCmp(I, LHSI, RHSC, *this))
9153 return NV;
9154 break;
9155 case Instruction::PHI:
9156 if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
9157 return NV;
9158 break;
9159 case Instruction::SIToFP:
9160 case Instruction::UIToFP:
9161 if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
9162 return NV;
9163 break;
9164 case Instruction::FDiv:
9165 if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
9166 return NV;
9167 break;
9168 case Instruction::Load:
9169 if (auto *GEP = dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
9170 if (Instruction *Res =
9172 return Res;
9173 break;
9174 case Instruction::FPTrunc:
9175 if (Instruction *NV = foldFCmpFpTrunc(I, *LHSI, *RHSC))
9176 return NV;
9177 break;
9178 }
9179 }
9180
9181 if (Instruction *R = foldFabsWithFcmpZero(I, *this))
9182 return R;
9183
9184 if (Instruction *R = foldFCmpFAbsFSubIntToFP(I, *this))
9185 return R;
9186
9187 if (Instruction *R = foldSqrtWithFcmpZero(I, *this))
9188 return R;
9189
9190 if (Instruction *R = foldFCmpWithFloorAndCeil(I, *this))
9191 return R;
9192
9194 return R;
9195
9196 if (match(Op0, m_FNeg(m_Value(X)))) {
9197 // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
9198 Constant *C;
9199 if (match(Op1, m_Constant(C)))
9200 if (Constant *NegC = ConstantFoldUnaryOpOperand(Instruction::FNeg, C, DL))
9201 return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
9202 }
9203
9204 // fcmp (fadd X, 0.0), Y --> fcmp X, Y
9205 if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
9206 return new FCmpInst(Pred, X, Op1, "", &I);
9207
9208 // fcmp X, (fadd Y, 0.0) --> fcmp X, Y
9209 if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
9210 return new FCmpInst(Pred, Op0, Y, "", &I);
9211
9212 // fcmp ord/uno (fptrunc X), (fptrunc Y) -> fcmp ord/uno X, Y
9213 if ((Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) &&
9214 match(Op0, m_FPTrunc(m_Value(X))) && match(Op1, m_FPTrunc(m_Value(Y))) &&
9215 X->getType() == Y->getType())
9216 return new FCmpInst(Pred, X, Y, "", &I);
9217
9218 if (match(Op0, m_FPExt(m_Value(X)))) {
9219 // fcmp (fpext X), (fpext Y) -> fcmp X, Y
9220 if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
9221 return new FCmpInst(Pred, X, Y, "", &I);
9222
9223 const APFloat *C;
9224 if (match(Op1, m_APFloat(C))) {
9225 const fltSemantics &FPSem =
9226 X->getType()->getScalarType()->getFltSemantics();
9227 bool Lossy;
9228 APFloat TruncC = *C;
9229 TruncC.convert(FPSem, APFloat::rmNearestTiesToEven, &Lossy);
9230
9231 if (Lossy) {
9232 // X can't possibly equal the higher-precision constant, so reduce any
9233 // equality comparison.
9234 // TODO: Other predicates can be handled via getFCmpCode().
9235 switch (Pred) {
9236 case FCmpInst::FCMP_OEQ:
9237 // X is ordered and equal to an impossible constant --> false
9238 return replaceInstUsesWith(I, ConstantInt::getFalse(I.getType()));
9239 case FCmpInst::FCMP_ONE:
9240 // X is ordered and not equal to an impossible constant --> ordered
9241 return new FCmpInst(FCmpInst::FCMP_ORD, X,
9242 ConstantFP::getZero(X->getType()));
9243 case FCmpInst::FCMP_UEQ:
9244 // X is unordered or equal to an impossible constant --> unordered
9245 return new FCmpInst(FCmpInst::FCMP_UNO, X,
9246 ConstantFP::getZero(X->getType()));
9247 case FCmpInst::FCMP_UNE:
9248 // X is unordered or not equal to an impossible constant --> true
9249 return replaceInstUsesWith(I, ConstantInt::getTrue(I.getType()));
9250 default:
9251 break;
9252 }
9253 }
9254
9255 // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
9256 // Avoid lossy conversions and denormals.
9257 // Zero is a special case that's OK to convert.
9258 APFloat Fabs = TruncC;
9259 Fabs.clearSign();
9260 if (!Lossy &&
9261 (Fabs.isZero() || !(Fabs < APFloat::getSmallestNormalized(FPSem)))) {
9262 Constant *NewC = ConstantFP::get(X->getType(), TruncC);
9263 return new FCmpInst(Pred, X, NewC, "", &I);
9264 }
9265 }
9266 }
9267
9268 // Convert a sign-bit test of an FP value into a cast and integer compare.
9269 // TODO: Simplify if the copysign constant is 0.0 or NaN.
9270 // TODO: Handle non-zero compare constants.
9271 // TODO: Handle other predicates.
9273 m_Value(X)))) &&
9274 match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {
9275 Type *IntType = Builder.getIntNTy(X->getType()->getScalarSizeInBits());
9276 if (auto *VecTy = dyn_cast<VectorType>(OpType))
9277 IntType = VectorType::get(IntType, VecTy->getElementCount());
9278
9279 // copysign(non-zero constant, X) < 0.0 --> (bitcast X) < 0
9280 if (Pred == FCmpInst::FCMP_OLT) {
9281 Value *IntX = Builder.CreateBitCast(X, IntType);
9282 return new ICmpInst(ICmpInst::ICMP_SLT, IntX,
9283 ConstantInt::getNullValue(IntType));
9284 }
9285 }
9286
9287 {
9288 Value *CanonLHS = nullptr;
9290 // (canonicalize(x) == x) => (x == x)
9291 if (CanonLHS == Op1)
9292 return new FCmpInst(Pred, Op1, Op1, "", &I);
9293
9294 Value *CanonRHS = nullptr;
9296 // (x == canonicalize(x)) => (x == x)
9297 if (CanonRHS == Op0)
9298 return new FCmpInst(Pred, Op0, Op0, "", &I);
9299
9300 // (canonicalize(x) == canonicalize(y)) => (x == y)
9301 if (CanonLHS && CanonRHS)
9302 return new FCmpInst(Pred, CanonLHS, CanonRHS, "", &I);
9303 }
9304
9305 if (I.getType()->isVectorTy())
9306 if (Instruction *Res = foldVectorCmp(I, Builder))
9307 return Res;
9308
9309 return Changed ? &I : nullptr;
9310}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:851
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define Check(C,...)
Hexagon Common GEP
static Instruction * foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold (C / X) < 0.0 --> X < 0.0 if possible. Swap predicate if necessary.
static Instruction * foldFabsWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize fabs(X) compared with zero.
static void collectOffsetOp(Value *V, SmallVectorImpl< OffsetOp > &Offsets, bool AllowRecursion)
static Value * rewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags NW, const DataLayout &DL, SetVector< Value * > &Explored, InstCombiner &IC)
Returns a re-written value of Start as an indexed GEP using Base as a pointer.
static bool isMinMaxCmpSelectEliminable(SelectPatternFlavor Flavor, Value *A, Value *B)
Returns true if a select that implements a min/max is redundant and select result can be replaced wit...
static Instruction * foldICmpEqualityWithOffset(ICmpInst &I, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Offset both sides of an equality icmp to see if we can save some instructions: icmp eq/ne X,...
static bool addWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1+In2, returning true if the result overflowed for this type.
static Instruction * foldICmpOfVectorReduce(ICmpInst &I, const DataLayout &DL, IRBuilderBase &Builder)
static Instruction * foldICmpAndXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldVectorCmp(CmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static bool isMaskOrZero(const Value *V, bool Not, const SimplifyQuery &Q, unsigned Depth=0)
static Value * createLogicFromTable(const std::bitset< 4 > &Table, Value *Op0, Value *Op1, IRBuilderBase &Builder, bool HasOneUse)
static Instruction * foldICmpOfUAddOv(ICmpInst &I)
static bool isChainSelectCmpBranch(const SelectInst *SI)
Return true when the instruction sequence within a block is select-cmp-br.
static Instruction * foldICmpInvariantGroup(ICmpInst &I)
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static Instruction * foldReductionIdiom(ICmpInst &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
This function folds patterns produced by lowering of reduce idioms, such as llvm.vector....
static Instruction * canonicalizeICmpBool(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Integer compare with boolean values can always be turned into bitwise ops.
static Instruction * foldFCmpFSubIntoFCmp(FCmpInst &I, Instruction *LHSI, Constant *RHSC, InstCombinerImpl &CI)
static Value * foldICmpOrXorSubChain(ICmpInst &Cmp, BinaryOperator *Or, InstCombiner::BuilderTy &Builder)
Fold icmp eq/ne (or (xor/sub (X1, X2), xor/sub (X3, X4))), 0.
static bool hasBranchUse(ICmpInst &I)
Given an icmp instruction, return true if any use of this comparison is a branch on sign bit comparis...
static Value * foldICmpWithLowBitMaskedVal(CmpPredicate Pred, Value *Op0, Value *Op1, const SimplifyQuery &Q, InstCombiner &IC)
Some comparisons can be simplified.
static APInt getDemandedBitsLHSMask(ICmpInst &I, unsigned BitWidth)
When performing a comparison against a constant, it is possible that not all the bits in the LHS are ...
static Instruction * foldICmpShlLHSC(ICmpInst &Cmp, Instruction *Shl, const APInt &C)
Fold icmp (shl nuw C2, Y), C.
static Instruction * foldFCmpWithFloorAndCeil(FCmpInst &I, InstCombinerImpl &IC)
static Instruction * foldICmpXorXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
static Instruction * foldICmpOfCmpIntrinsicWithConstant(CmpPredicate Pred, IntrinsicInst *I, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * processUMulZExtIdiom(ICmpInst &I, Value *MulVal, const APInt *OtherVal, InstCombinerImpl &IC)
Recognize and process idiom involving test for multiplication overflow.
static Instruction * foldSqrtWithFcmpZero(FCmpInst &I, InstCombinerImpl &IC)
Optimize sqrt(X) compared with zero.
static Instruction * foldFCmpFNegCommonOp(FCmpInst &I)
static Instruction * foldICmpWithHighBitMask(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
static ICmpInst * canonicalizeCmpWithConstant(ICmpInst &I)
If we have an icmp le or icmp ge instruction with a constant operand, turn it into the appropriate ic...
static Instruction * foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp, InstCombiner::BuilderTy &Builder)
Fold an icmp with LLVM intrinsics.
static Instruction * foldICmpUSubSatOrUAddSatWithConstant(CmpPredicate Pred, SaturatingInst *II, const APInt &C, InstCombiner::BuilderTy &Builder)
static Instruction * foldICmpPow2Test(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static bool subWithOverflow(APInt &Result, const APInt &In1, const APInt &In2, bool IsSigned=false)
Compute Result = In1-In2, returning true if the result overflowed for this type.
static bool canRewriteGEPAsOffset(Value *Start, Value *Base, GEPNoWrapFlags &NW, const DataLayout &DL, SetVector< Value * > &Explored)
Returns true if we can rewrite Start as a GEP with pointer Base and some integer offset.
static Instruction * foldFCmpFpTrunc(FCmpInst &I, const Instruction &FPTrunc, const Constant &C)
static Instruction * foldICmpXNegX(ICmpInst &I, InstCombiner::BuilderTy &Builder)
static Instruction * processUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombinerImpl &IC)
The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of t...
static Value * foldShiftIntoShiftInAnotherHandOfAndInICmp(ICmpInst &I, const SimplifyQuery SQ, InstCombiner::BuilderTy &Builder)
static bool isSignTest(ICmpInst::Predicate &Pred, const APInt &C)
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the pre...
static Instruction * transformToIndexedCompare(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, const DataLayout &DL, InstCombiner &IC)
Converts (CMP GEPLHS, RHS) if this change would make RHS a constant.
static Instruction * foldCtpopPow2Test(ICmpInst &I, IntrinsicInst *CtpopLhs, const APInt &CRhs, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
static Instruction * foldFCmpFAbsFSubIntToFP(FCmpInst &I, InstCombinerImpl &IC)
Fold: fabs(uitofp(a) - uitofp(b)) pred C --> a == b where 'pred' is olt, ult, ogt,...
static void setInsertionPoint(IRBuilder<> &Builder, Value *V, bool Before=true)
static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned)
static bool isMultipleOf(Value *X, const APInt &C, const SimplifyQuery &Q)
Return true if X is a multiple of C.
static Value * foldICmpWithTruncSignExtendedVal(ICmpInst &I, InstCombiner::BuilderTy &Builder)
Some comparisons can be simplified.
static Instruction * foldICmpOrXX(ICmpInst &I, const SimplifyQuery &Q, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T1
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
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:171
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
BinaryOperator * Mul
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5890
void clearSign()
Definition APFloat.h:1353
bool isNaN() const
Definition APFloat.h:1514
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1143
bool isZero() const
Definition APFloat.h:1512
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1213
APInt bitcastToAPInt() const
Definition APFloat.h:1408
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1193
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1387
opStatus next(bool nextDown)
Definition APFloat.h:1309
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1153
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
Definition APFloat.cpp:5819
opStatus roundToIntegral(roundingMode RM)
Definition APFloat.h:1303
bool isInfinity() const
Definition APFloat.h:1513
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1615
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1809
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1054
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1563
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1535
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:967
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1353
APInt abs() const
Get the absolute value.
Definition APInt.h:1818
unsigned ceilLogBase2() const
Definition APInt.h:1787
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1208
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1999
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1979
bool eq(const APInt &RHS) const
Equality comparison.
Definition APInt.h:1086
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1686
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1986
void negate()
Negate this APInt in place.
Definition APInt.h:1491
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1662
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
void flipAllBits()
Toggle every bit to its opposite value.
Definition APInt.h:1475
unsigned countl_one() const
Count the number of leading one bits.
Definition APInt.h:1638
unsigned logBase2() const
Definition APInt.h:1784
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:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1992
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1679
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
static APSInt getMinValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the minimum integer value with the given bit width and signedness.
Definition APSInt.h:310
static APSInt getMaxValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the maximum integer value with the given bit width and signedness.
Definition APSInt.h:302
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:374
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:986
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:858
static LLVM_ABI Predicate getFlippedStrictnessPredicate(Predicate pred)
This is a static version that you can use without an instruction available.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:679
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:693
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:682
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:691
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:680
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:681
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:690
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:684
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:687
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:688
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:683
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:704
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:692
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:689
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:678
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:686
bool isSigned() const
Definition InstrTypes.h:930
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
bool isTrueWhenEqual() const
This is just a convenience.
Definition InstrTypes.h:942
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:871
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:789
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:776
bool isUnsigned() const
Definition InstrTypes.h:936
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Conditional Branch instruction.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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:269
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI 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...
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
LLVM_ABI 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.
LLVM_ABI ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
static LLVM_ABI 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...
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
LLVM_ABI 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...
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
LLVM_ABI 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 LLVM_ABI 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 LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI 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...
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition Constants.cpp:95
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:74
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
iterator end()
Definition DenseMap.h:81
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:169
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
static bool isCommutative(Predicate Pred)
static bool isEquality(Predicate Pred)
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
bool isInBounds() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
bool isInBounds() const
Test whether this is an inbounds GEP, as defined by LangRef.html.
Definition Operator.h:430
LLVM_ABI Type * getSourceElementType() const
Definition Operator.cpp:82
Value * getPointerOperand()
Definition Operator.h:457
GEPNoWrapFlags getNoWrapFlags() const
Definition Operator.h:425
bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
Definition Operator.h:504
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
LLVM_ABI CallInst * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1585
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2459
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1607
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:544
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2829
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, 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 * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
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.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CxtI)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldCmpSelectOfConstants(CmpInst &I)
Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2) where all true/false values are cons...
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 * visitFCmpInst(FCmpInst &I)
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
Instruction * foldICmpEquality(ICmpInst &Cmp)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
bool dominatesAllUses(const Instruction *DI, const Instruction *UI, const BasicBlock *DB) const
True when DB dominates all uses of DI except UI.
bool foldAllocaCmp(AllocaInst *Alloca)
Instruction * visitICmpInst(ICmpInst &I)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CxtI) const
Instruction * foldICmpWithDominatingICmp(ICmpInst &Cmp)
Canonicalize icmp instructions based on dominating conditions.
bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp, const unsigned SIOpd)
Try to replace select with select operand SIOpd in SI-ICmp sequence.
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
The core instruction combiner logic.
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
TargetLibraryInfo & TLI
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CxtI=nullptr) const
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
const DataLayout & DL
DomConditionCache DC
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
BuilderTy & Builder
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI 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.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI 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.
bool isShift() const
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:354
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
An instruction for reading from memory.
bool isVolatile() const
Return true if this is a load from a volatile memory location.
This class represents min/max intrinsics.
Value * getLHS() const
Value * getRHS() const
static bool isMin(Intrinsic::ID ID)
Whether the intrinsic is a smin or umin.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const 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:103
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h:252
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class represents a truncation of integer types.
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:290
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:263
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:284
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:167
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:370
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:201
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:236
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:310
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Definition Type.cpp:241
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:110
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition Value.cpp:154
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:709
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:318
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:399
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI 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:2814
LLVM_ABI 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:2832
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
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)
BinaryOp_match< LHS, RHS, Instruction::FSub > m_FSub(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
BinaryOp_match< LHS, RHS, Instruction::URem > m_URem(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< 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()...
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
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)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap, true > m_c_NUWAdd(const LHS &L, const RHS &R)
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.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
m_Intrinsic_Ty< Opnd0 >::Ty m_Sqrt(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoSignedWrap > m_NSWShl(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< is_negated_power2_or_zero > m_NegatedPower2OrZero()
Match a integer or vector negated power-of-2.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
cst_pred_ty< is_lowbit_mask_or_zero > m_LowBitMaskOrZero()
Match an integer or vector with only the low bit(s) set.
auto m_MaxOrMin(const LHS &L, const RHS &R)
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.
cstfp_pred_ty< is_finitenonzero > m_FiniteNonZero()
Match a finite non-zero FP constant.
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
Signum_match< Val_t > m_Signum(const Val_t &V)
Matches a signum pattern.
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
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.
CastInst_match< OpTy, FPTruncInst > m_FPTrunc(const OpTy &Op)
auto m_Undef()
Match an arbitrary undef constant.
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.
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.
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.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
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:831
@ 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.
cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI 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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI Value * stripNullTest(Value *V)
Returns the inner value X if the expression has the form f(X) where f(X) == 0 if and only if X == 0,...
LLVM_ABI 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:634
LLVM_ABI Value * simplifyFCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for an FCmpInst, fold the result or return null.
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
Definition APFloat.h:1601
LLVM_ABI bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
LLVM_ABI 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:331
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:263
LLVM_ABI 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
LLVM_ABI Constant * ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op, const DataLayout &DL)
Attempt to constant fold a unary operation with the specified operand.
LLVM_ABI bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_FMAXNUM
Floating point minnum.
@ SPF_UNKNOWN
@ SPF_FMINNUM
Unsigned maximum.
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL, Value *Ptr)
Decompose a pointer into a linear expression.
Definition Loads.cpp:907
LLVM_ABI bool isFinite(const Loop *L)
Return true if this loop can be assumed to run for a finite number of iterations.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Returns: X * 2^Exp for integral exponents.
Definition APFloat.h:1610
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI 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...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI 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.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:394
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
LLVM_ABI bool isKnownNonEqual(const Value *V1, const Value *V2, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the given values are known to be non-equal when defined.
DWARFExpression::Operation Op
LLVM_ABI bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, unsigned MaxUsesToExplore=0)
PointerMayBeCaptured - Return true if this pointer value may be captured by the enclosing function (w...
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
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:2019
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
@ Continue
Definition DWP.h:22
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isKnownPositive(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be positive (i.e.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
LLVM_ABI 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.
std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, const SimplifyQuery &SQ, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define NC
Definition regutils.h:42
Value * materialize(InstCombiner::BuilderTy &Builder) const
static OffsetResult select(Value *Cond, Value *TrueV, Value *FalseV, Instruction *MDFrom)
static OffsetResult value(Value *V)
static OffsetResult invalid()
This callback is used in conjunction with PointerMayBeCaptured.
static CommonPointerBase compute(Value *LHS, Value *RHS)
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
static constexpr DenormalMode getIEEE()
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
Definition KnownBits.h:152
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
Definition KnownBits.h:130
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
Definition KnownBits.h:136
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:58
Linear expression BasePtr + Index * Scale + Offset.
Definition Loads.h:211
GEPNoWrapFlags Flags
Definition Loads.h:216
Matching combinators.
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
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:276
Capture information for a specific Use.