LLVM 22.0.0git
InstCombineSelect.cpp
Go to the documentation of this file.
1//===- InstCombineSelect.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 visitSelect function.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APInt.h"
15#include "llvm/ADT/STLExtras.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/Constant.h"
26#include "llvm/IR/Constants.h"
28#include "llvm/IR/FMF.h"
29#include "llvm/IR/IRBuilder.h"
30#include "llvm/IR/InstrTypes.h"
31#include "llvm/IR/Instruction.h"
34#include "llvm/IR/Intrinsics.h"
35#include "llvm/IR/Operator.h"
37#include "llvm/IR/Type.h"
38#include "llvm/IR/User.h"
39#include "llvm/IR/Value.h"
44#include <cassert>
45#include <utility>
46
47#define DEBUG_TYPE "instcombine"
49
50using namespace llvm;
51using namespace PatternMatch;
52
53
54/// Replace a select operand based on an equality comparison with the identity
55/// constant of a binop.
57 const TargetLibraryInfo &TLI,
58 InstCombinerImpl &IC) {
59 // The select condition must be an equality compare with a constant operand.
60 Value *X;
61 Constant *C;
62 CmpPredicate Pred;
63 if (!match(Sel.getCondition(), m_Cmp(Pred, m_Value(X), m_Constant(C))))
64 return nullptr;
65
66 bool IsEq;
67 if (ICmpInst::isEquality(Pred))
68 IsEq = Pred == ICmpInst::ICMP_EQ;
69 else if (Pred == FCmpInst::FCMP_OEQ)
70 IsEq = true;
71 else if (Pred == FCmpInst::FCMP_UNE)
72 IsEq = false;
73 else
74 return nullptr;
75
76 // A select operand must be a binop.
78 if (!match(Sel.getOperand(IsEq ? 1 : 2), m_BinOp(BO)))
79 return nullptr;
80
81 // The compare constant must be the identity constant for that binop.
82 // If this a floating-point compare with 0.0, any zero constant will do.
83 Type *Ty = BO->getType();
85 if (IdC != C) {
86 if (!IdC || !CmpInst::isFPPredicate(Pred))
87 return nullptr;
88 if (!match(IdC, m_AnyZeroFP()) || !match(C, m_AnyZeroFP()))
89 return nullptr;
90 }
91
92 // Last, match the compare variable operand with a binop operand.
93 Value *Y;
94 if (!BO->isCommutative() && !match(BO, m_BinOp(m_Value(Y), m_Specific(X))))
95 return nullptr;
96 if (!match(BO, m_c_BinOp(m_Value(Y), m_Specific(X))))
97 return nullptr;
98
99 // +0.0 compares equal to -0.0, and so it does not behave as required for this
100 // transform. Bail out if we can not exclude that possibility.
101 if (isa<FPMathOperator>(BO))
102 if (!BO->hasNoSignedZeros() &&
105 return nullptr;
106
107 // BO = binop Y, X
108 // S = { select (cmp eq X, C), BO, ? } or { select (cmp ne X, C), ?, BO }
109 // =>
110 // S = { select (cmp eq X, C), Y, ? } or { select (cmp ne X, C), ?, Y }
111 return IC.replaceOperand(Sel, IsEq ? 1 : 2, Y);
112}
113
114/// This folds:
115/// select (icmp eq (and X, C1)), TC, FC
116/// iff C1 is a power 2 and the difference between TC and FC is a power-of-2.
117/// To something like:
118/// (shr (and (X, C1)), (log2(C1) - log2(TC-FC))) + FC
119/// Or:
120/// (shl (and (X, C1)), (log2(TC-FC) - log2(C1))) + FC
121/// With some variations depending if FC is larger than TC, or the shift
122/// isn't needed, or the bit widths don't match.
123static Value *foldSelectICmpAnd(SelectInst &Sel, Value *CondVal, Value *TrueVal,
124 Value *FalseVal, Value *V, const APInt &AndMask,
125 bool CreateAnd,
126 InstCombiner::BuilderTy &Builder) {
127 const APInt *SelTC, *SelFC;
128 if (!match(TrueVal, m_APInt(SelTC)) || !match(FalseVal, m_APInt(SelFC)))
129 return nullptr;
130
131 Type *SelType = Sel.getType();
132 // In general, when both constants are non-zero, we would need an offset to
133 // replace the select. This would require more instructions than we started
134 // with. But there's one special-case that we handle here because it can
135 // simplify/reduce the instructions.
136 const APInt &TC = *SelTC;
137 const APInt &FC = *SelFC;
138 if (!TC.isZero() && !FC.isZero()) {
139 if (TC.getBitWidth() != AndMask.getBitWidth())
140 return nullptr;
141 // If we have to create an 'and', then we must kill the cmp to not
142 // increase the instruction count.
143 if (CreateAnd && !CondVal->hasOneUse())
144 return nullptr;
145
146 // (V & AndMaskC) == 0 ? TC : FC --> TC | (V & AndMaskC)
147 // (V & AndMaskC) == 0 ? TC : FC --> TC ^ (V & AndMaskC)
148 // (V & AndMaskC) == 0 ? TC : FC --> TC + (V & AndMaskC)
149 // (V & AndMaskC) == 0 ? TC : FC --> TC - (V & AndMaskC)
150 Constant *TCC = ConstantInt::get(SelType, TC);
151 Constant *FCC = ConstantInt::get(SelType, FC);
152 Constant *MaskC = ConstantInt::get(SelType, AndMask);
153 for (auto Opc : {Instruction::Or, Instruction::Xor, Instruction::Add,
154 Instruction::Sub}) {
155 if (ConstantFoldBinaryOpOperands(Opc, TCC, MaskC, Sel.getDataLayout()) ==
156 FCC) {
157 if (CreateAnd)
158 V = Builder.CreateAnd(V, MaskC);
159 return Builder.CreateBinOp(Opc, TCC, V);
160 }
161 }
162
163 return nullptr;
164 }
165
166 // Make sure one of the select arms is a power-of-2.
167 if (!TC.isPowerOf2() && !FC.isPowerOf2())
168 return nullptr;
169
170 // Determine which shift is needed to transform result of the 'and' into the
171 // desired result.
172 const APInt &ValC = !TC.isZero() ? TC : FC;
173 unsigned ValZeros = ValC.logBase2();
174 unsigned AndZeros = AndMask.logBase2();
175 bool ShouldNotVal = !TC.isZero();
176 bool NeedShift = ValZeros != AndZeros;
177 bool NeedZExtTrunc =
178 SelType->getScalarSizeInBits() != V->getType()->getScalarSizeInBits();
179
180 // If we would need to create an 'and' + 'shift' + 'xor' + cast to replace
181 // a 'select' + 'icmp', then this transformation would result in more
182 // instructions and potentially interfere with other folding.
183 if (CreateAnd + ShouldNotVal + NeedShift + NeedZExtTrunc >
184 1 + CondVal->hasOneUse())
185 return nullptr;
186
187 // Insert the 'and' instruction on the input to the truncate.
188 if (CreateAnd)
189 V = Builder.CreateAnd(V, ConstantInt::get(V->getType(), AndMask));
190
191 // If types don't match, we can still convert the select by introducing a zext
192 // or a trunc of the 'and'.
193 if (ValZeros > AndZeros) {
194 V = Builder.CreateZExtOrTrunc(V, SelType);
195 V = Builder.CreateShl(V, ValZeros - AndZeros);
196 } else if (ValZeros < AndZeros) {
197 V = Builder.CreateLShr(V, AndZeros - ValZeros);
198 V = Builder.CreateZExtOrTrunc(V, SelType);
199 } else {
200 V = Builder.CreateZExtOrTrunc(V, SelType);
201 }
202
203 // Okay, now we know that everything is set up, we just don't know whether we
204 // have a icmp_ne or icmp_eq and whether the true or false val is the zero.
205 if (ShouldNotVal)
206 V = Builder.CreateXor(V, ValC);
207
208 return V;
209}
210
211/// We want to turn code that looks like this:
212/// %C = or %A, %B
213/// %D = select %cond, %C, %A
214/// into:
215/// %C = select %cond, %B, 0
216/// %D = or %A, %C
217///
218/// Assuming that the specified instruction is an operand to the select, return
219/// a bitmask indicating which operands of this instruction are foldable if they
220/// equal the other incoming value of the select.
222 switch (I->getOpcode()) {
223 case Instruction::Add:
224 case Instruction::FAdd:
225 case Instruction::Mul:
226 case Instruction::FMul:
227 case Instruction::And:
228 case Instruction::Or:
229 case Instruction::Xor:
230 return 3; // Can fold through either operand.
231 case Instruction::Sub: // Can only fold on the amount subtracted.
232 case Instruction::FSub:
233 case Instruction::FDiv: // Can only fold on the divisor amount.
234 case Instruction::Shl: // Can only fold on the shift amount.
235 case Instruction::LShr:
236 case Instruction::AShr:
237 return 1;
238 default:
239 return 0; // Cannot fold
240 }
241}
242
243/// We have (select c, TI, FI), and we know that TI and FI have the same opcode.
245 Instruction *FI) {
246 // Don't break up min/max patterns. The hasOneUse checks below prevent that
247 // for most cases, but vector min/max with bitcasts can be transformed. If the
248 // one-use restrictions are eased for other patterns, we still don't want to
249 // obfuscate min/max.
250 if ((match(&SI, m_SMin(m_Value(), m_Value())) ||
251 match(&SI, m_SMax(m_Value(), m_Value())) ||
252 match(&SI, m_UMin(m_Value(), m_Value())) ||
253 match(&SI, m_UMax(m_Value(), m_Value()))))
254 return nullptr;
255
256 // If this is a cast from the same type, merge.
257 Value *Cond = SI.getCondition();
258 Type *CondTy = Cond->getType();
259 if (TI->getNumOperands() == 1 && TI->isCast()) {
260 Type *FIOpndTy = FI->getOperand(0)->getType();
261 if (TI->getOperand(0)->getType() != FIOpndTy)
262 return nullptr;
263
264 // The select condition may be a vector. We may only change the operand
265 // type if the vector width remains the same (and matches the condition).
266 if (auto *CondVTy = dyn_cast<VectorType>(CondTy)) {
267 if (!FIOpndTy->isVectorTy() ||
268 CondVTy->getElementCount() !=
269 cast<VectorType>(FIOpndTy)->getElementCount())
270 return nullptr;
271
272 // TODO: If the backend knew how to deal with casts better, we could
273 // remove this limitation. For now, there's too much potential to create
274 // worse codegen by promoting the select ahead of size-altering casts
275 // (PR28160).
276 //
277 // Note that ValueTracking's matchSelectPattern() looks through casts
278 // without checking 'hasOneUse' when it matches min/max patterns, so this
279 // transform may end up happening anyway.
280 if (TI->getOpcode() != Instruction::BitCast &&
281 (!TI->hasOneUse() || !FI->hasOneUse()))
282 return nullptr;
283 } else if (!TI->hasOneUse() || !FI->hasOneUse()) {
284 // TODO: The one-use restrictions for a scalar select could be eased if
285 // the fold of a select in visitLoadInst() was enhanced to match a pattern
286 // that includes a cast.
287 return nullptr;
288 }
289
290 // Fold this by inserting a select from the input values.
291 Value *NewSI =
292 Builder.CreateSelect(Cond, TI->getOperand(0), FI->getOperand(0),
293 SI.getName() + ".v", &SI);
295 TI->getType());
296 }
297
298 Value *OtherOpT, *OtherOpF;
299 bool MatchIsOpZero;
300 auto getCommonOp = [&](Instruction *TI, Instruction *FI, bool Commute,
301 bool Swapped = false) -> Value * {
302 assert(!(Commute && Swapped) &&
303 "Commute and Swapped can't set at the same time");
304 if (!Swapped) {
305 if (TI->getOperand(0) == FI->getOperand(0)) {
306 OtherOpT = TI->getOperand(1);
307 OtherOpF = FI->getOperand(1);
308 MatchIsOpZero = true;
309 return TI->getOperand(0);
310 } else if (TI->getOperand(1) == FI->getOperand(1)) {
311 OtherOpT = TI->getOperand(0);
312 OtherOpF = FI->getOperand(0);
313 MatchIsOpZero = false;
314 return TI->getOperand(1);
315 }
316 }
317
318 if (!Commute && !Swapped)
319 return nullptr;
320
321 // If we are allowing commute or swap of operands, then
322 // allow a cross-operand match. In that case, MatchIsOpZero
323 // means that TI's operand 0 (FI's operand 1) is the common op.
324 if (TI->getOperand(0) == FI->getOperand(1)) {
325 OtherOpT = TI->getOperand(1);
326 OtherOpF = FI->getOperand(0);
327 MatchIsOpZero = true;
328 return TI->getOperand(0);
329 } else if (TI->getOperand(1) == FI->getOperand(0)) {
330 OtherOpT = TI->getOperand(0);
331 OtherOpF = FI->getOperand(1);
332 MatchIsOpZero = false;
333 return TI->getOperand(1);
334 }
335 return nullptr;
336 };
337
338 if (TI->hasOneUse() || FI->hasOneUse()) {
339 // Cond ? -X : -Y --> -(Cond ? X : Y)
340 Value *X, *Y;
341 if (match(TI, m_FNeg(m_Value(X))) && match(FI, m_FNeg(m_Value(Y)))) {
342 // Intersect FMF from the fneg instructions and union those with the
343 // select.
345 FMF &= FI->getFastMathFlags();
346 FMF |= SI.getFastMathFlags();
347 Value *NewSel =
348 Builder.CreateSelect(Cond, X, Y, SI.getName() + ".v", &SI);
349 if (auto *NewSelI = dyn_cast<Instruction>(NewSel))
350 NewSelI->setFastMathFlags(FMF);
351 Instruction *NewFNeg = UnaryOperator::CreateFNeg(NewSel);
352 NewFNeg->setFastMathFlags(FMF);
353 return NewFNeg;
354 }
355
356 // Min/max intrinsic with a common operand can have the common operand
357 // pulled after the select. This is the same transform as below for binops,
358 // but specialized for intrinsic matching and without the restrictive uses
359 // clause.
360 auto *TII = dyn_cast<IntrinsicInst>(TI);
361 auto *FII = dyn_cast<IntrinsicInst>(FI);
362 if (TII && FII && TII->getIntrinsicID() == FII->getIntrinsicID()) {
363 if (match(TII, m_MaxOrMin(m_Value(), m_Value()))) {
364 if (Value *MatchOp = getCommonOp(TI, FI, true)) {
365 Value *NewSel =
366 Builder.CreateSelect(Cond, OtherOpT, OtherOpF, "minmaxop", &SI);
367 return CallInst::Create(TII->getCalledFunction(), {NewSel, MatchOp});
368 }
369 }
370
371 // select c, (ldexp v, e0), (ldexp v, e1) -> ldexp v, (select c, e0, e1)
372 // select c, (ldexp v0, e), (ldexp v1, e) -> ldexp (select c, v0, v1), e
373 //
374 // select c, (ldexp v0, e0), (ldexp v1, e1) ->
375 // ldexp (select c, v0, v1), (select c, e0, e1)
376 if (TII->getIntrinsicID() == Intrinsic::ldexp) {
377 Value *LdexpVal0 = TII->getArgOperand(0);
378 Value *LdexpExp0 = TII->getArgOperand(1);
379 Value *LdexpVal1 = FII->getArgOperand(0);
380 Value *LdexpExp1 = FII->getArgOperand(1);
381 if (LdexpExp0->getType() == LdexpExp1->getType()) {
382 FPMathOperator *SelectFPOp = cast<FPMathOperator>(&SI);
383 FastMathFlags FMF = cast<FPMathOperator>(TII)->getFastMathFlags();
384 FMF &= cast<FPMathOperator>(FII)->getFastMathFlags();
385 FMF |= SelectFPOp->getFastMathFlags();
386
387 Value *SelectVal = Builder.CreateSelect(Cond, LdexpVal0, LdexpVal1);
388 Value *SelectExp = Builder.CreateSelect(Cond, LdexpExp0, LdexpExp1);
389
390 CallInst *NewLdexp = Builder.CreateIntrinsic(
391 TII->getType(), Intrinsic::ldexp, {SelectVal, SelectExp});
392 NewLdexp->setFastMathFlags(FMF);
393 return replaceInstUsesWith(SI, NewLdexp);
394 }
395 }
396 }
397
398 auto CreateCmpSel = [&](std::optional<CmpPredicate> P,
399 bool Swapped) -> CmpInst * {
400 if (!P)
401 return nullptr;
402 auto *MatchOp = getCommonOp(TI, FI, ICmpInst::isEquality(*P),
403 ICmpInst::isRelational(*P) && Swapped);
404 if (!MatchOp)
405 return nullptr;
406 Value *NewSel = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,
407 SI.getName() + ".v", &SI);
408 return new ICmpInst(MatchIsOpZero ? *P
410 MatchOp, NewSel);
411 };
412
413 // icmp with a common operand also can have the common operand
414 // pulled after the select.
415 CmpPredicate TPred, FPred;
416 if (match(TI, m_ICmp(TPred, m_Value(), m_Value())) &&
417 match(FI, m_ICmp(FPred, m_Value(), m_Value()))) {
418 if (auto *R =
419 CreateCmpSel(CmpPredicate::getMatching(TPred, FPred), false))
420 return R;
421 if (auto *R =
422 CreateCmpSel(CmpPredicate::getMatching(
424 true))
425 return R;
426 }
427 }
428
429 // Only handle binary operators (including two-operand getelementptr) with
430 // one-use here. As with the cast case above, it may be possible to relax the
431 // one-use constraint, but that needs be examined carefully since it may not
432 // reduce the total number of instructions.
433 if (TI->getNumOperands() != 2 || FI->getNumOperands() != 2 ||
434 !TI->isSameOperationAs(FI) ||
436 !TI->hasOneUse() || !FI->hasOneUse())
437 return nullptr;
438
439 // Figure out if the operations have any operands in common.
440 Value *MatchOp = getCommonOp(TI, FI, TI->isCommutative());
441 if (!MatchOp)
442 return nullptr;
443
444 // If the select condition is a vector, the operands of the original select's
445 // operands also must be vectors. This may not be the case for getelementptr
446 // for example.
447 if (CondTy->isVectorTy() && (!OtherOpT->getType()->isVectorTy() ||
448 !OtherOpF->getType()->isVectorTy()))
449 return nullptr;
450
451 // If we are sinking div/rem after a select, we may need to freeze the
452 // condition because div/rem may induce immediate UB with a poison operand.
453 // For example, the following transform is not safe if Cond can ever be poison
454 // because we can replace poison with zero and then we have div-by-zero that
455 // didn't exist in the original code:
456 // Cond ? x/y : x/z --> x / (Cond ? y : z)
457 auto *BO = dyn_cast<BinaryOperator>(TI);
458 if (BO && BO->isIntDivRem() && !isGuaranteedNotToBePoison(Cond)) {
459 // A udiv/urem with a common divisor is safe because UB can only occur with
460 // div-by-zero, and that would be present in the original code.
461 if (BO->getOpcode() == Instruction::SDiv ||
462 BO->getOpcode() == Instruction::SRem || MatchIsOpZero)
463 Cond = Builder.CreateFreeze(Cond);
464 }
465
466 // If we reach here, they do have operations in common.
467 Value *NewSI = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,
468 SI.getName() + ".v", &SI);
469 Value *Op0 = MatchIsOpZero ? MatchOp : NewSI;
470 Value *Op1 = MatchIsOpZero ? NewSI : MatchOp;
471 if (auto *BO = dyn_cast<BinaryOperator>(TI)) {
472 BinaryOperator *NewBO = BinaryOperator::Create(BO->getOpcode(), Op0, Op1);
473 NewBO->copyIRFlags(TI);
474 NewBO->andIRFlags(FI);
475 return NewBO;
476 }
477 if (auto *TGEP = dyn_cast<GetElementPtrInst>(TI)) {
478 auto *FGEP = cast<GetElementPtrInst>(FI);
479 Type *ElementType = TGEP->getSourceElementType();
481 ElementType, Op0, Op1, TGEP->getNoWrapFlags() & FGEP->getNoWrapFlags());
482 }
483 llvm_unreachable("Expected BinaryOperator or GEP");
484 return nullptr;
485}
486
487static bool isSelect01(const APInt &C1I, const APInt &C2I) {
488 if (!C1I.isZero() && !C2I.isZero()) // One side must be zero.
489 return false;
490 return C1I.isOne() || C1I.isAllOnes() || C2I.isOne() || C2I.isAllOnes();
491}
492
493/// Try to fold the select into one of the operands to allow further
494/// optimization.
496 Value *FalseVal) {
497 // See the comment above getSelectFoldableOperands for a description of the
498 // transformation we are doing here.
499 auto TryFoldSelectIntoOp = [&](SelectInst &SI, Value *TrueVal,
500 Value *FalseVal,
501 bool Swapped) -> Instruction * {
502 auto *TVI = dyn_cast<BinaryOperator>(TrueVal);
503 if (!TVI || !TVI->hasOneUse() || isa<Constant>(FalseVal))
504 return nullptr;
505
506 unsigned SFO = getSelectFoldableOperands(TVI);
507 unsigned OpToFold = 0;
508 if ((SFO & 1) && FalseVal == TVI->getOperand(0))
509 OpToFold = 1;
510 else if ((SFO & 2) && FalseVal == TVI->getOperand(1))
511 OpToFold = 2;
512
513 if (!OpToFold)
514 return nullptr;
515
516 FastMathFlags FMF;
518 FMF = SI.getFastMathFlags();
520 TVI->getOpcode(), TVI->getType(), true, FMF.noSignedZeros());
521 Value *OOp = TVI->getOperand(2 - OpToFold);
522 // Avoid creating select between 2 constants unless it's selecting
523 // between 0, 1 and -1.
524 const APInt *OOpC;
525 bool OOpIsAPInt = match(OOp, m_APInt(OOpC));
526 if (isa<Constant>(OOp) &&
527 (!OOpIsAPInt || !isSelect01(C->getUniqueInteger(), *OOpC)))
528 return nullptr;
529
530 // If the false value is a NaN then we have that the floating point math
531 // operation in the transformed code may not preserve the exact NaN
532 // bit-pattern -- e.g. `fadd sNaN, 0.0 -> qNaN`.
533 // This makes the transformation incorrect since the original program would
534 // have preserved the exact NaN bit-pattern.
535 // Avoid the folding if the false value might be a NaN.
536 if (isa<FPMathOperator>(&SI) &&
537 !computeKnownFPClass(FalseVal, FMF, fcNan, &SI).isKnownNeverNaN())
538 return nullptr;
539
540 Value *NewSel = Builder.CreateSelect(SI.getCondition(), Swapped ? C : OOp,
541 Swapped ? OOp : C, "", &SI);
543 cast<Instruction>(NewSel)->setFastMathFlags(FMF);
544 NewSel->takeName(TVI);
545 BinaryOperator *BO =
546 BinaryOperator::Create(TVI->getOpcode(), FalseVal, NewSel);
547 BO->copyIRFlags(TVI);
548 if (isa<FPMathOperator>(&SI)) {
549 // Merge poison generating flags from the select.
550 BO->setHasNoNaNs(BO->hasNoNaNs() && FMF.noNaNs());
551 BO->setHasNoInfs(BO->hasNoInfs() && FMF.noInfs());
552 // Merge no-signed-zeros flag from the select.
553 // Otherwise we may produce zeros with different sign.
555 }
556 return BO;
557 };
558
559 if (Instruction *R = TryFoldSelectIntoOp(SI, TrueVal, FalseVal, false))
560 return R;
561
562 if (Instruction *R = TryFoldSelectIntoOp(SI, FalseVal, TrueVal, true))
563 return R;
564
565 return nullptr;
566}
567
568/// Try to fold a select to a min/max intrinsic. Many cases are already handled
569/// by matchDecomposedSelectPattern but here we handle the cases where more
570/// extensive modification of the IR is required.
571static Value *foldSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal,
572 Value *FVal,
574 const SimplifyQuery &SQ) {
575 const Value *CmpLHS = Cmp->getOperand(0);
576 const Value *CmpRHS = Cmp->getOperand(1);
577 ICmpInst::Predicate Pred = Cmp->getPredicate();
578
579 // (X > Y) ? X : (Y - 1) ==> MIN(X, Y - 1)
580 // (X < Y) ? X : (Y + 1) ==> MAX(X, Y + 1)
581 // This transformation is valid when overflow corresponding to the sign of
582 // the comparison is poison and we must drop the non-matching overflow flag.
583 if (CmpRHS == TVal) {
584 std::swap(CmpLHS, CmpRHS);
585 Pred = CmpInst::getSwappedPredicate(Pred);
586 }
587
588 // TODO: consider handling 'or disjoint' as well, though these would need to
589 // be converted to 'add' instructions.
590 if (!(CmpLHS == TVal && isa<Instruction>(FVal)))
591 return nullptr;
592
593 if (Pred == CmpInst::ICMP_SGT &&
594 match(FVal, m_NSWAdd(m_Specific(CmpRHS), m_One()))) {
595 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
596 return Builder.CreateBinaryIntrinsic(Intrinsic::smax, TVal, FVal);
597 }
598
599 if (Pred == CmpInst::ICMP_SLT &&
600 match(FVal, m_NSWAdd(m_Specific(CmpRHS), m_AllOnes()))) {
601 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
602 return Builder.CreateBinaryIntrinsic(Intrinsic::smin, TVal, FVal);
603 }
604
605 if (Pred == CmpInst::ICMP_UGT &&
606 match(FVal, m_NUWAdd(m_Specific(CmpRHS), m_One()))) {
607 cast<Instruction>(FVal)->setHasNoSignedWrap(false);
608 return Builder.CreateBinaryIntrinsic(Intrinsic::umax, TVal, FVal);
609 }
610
611 // Note: We must use isKnownNonZero here because "sub nuw %x, 1" will be
612 // canonicalized to "add %x, -1" discarding the nuw flag.
613 if (Pred == CmpInst::ICMP_ULT &&
614 match(FVal, m_Add(m_Specific(CmpRHS), m_AllOnes())) &&
615 isKnownNonZero(CmpRHS, SQ)) {
616 cast<Instruction>(FVal)->setHasNoSignedWrap(false);
617 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
618 return Builder.CreateBinaryIntrinsic(Intrinsic::umin, TVal, FVal);
619 }
620
621 return nullptr;
622}
623
624/// We want to turn:
625/// (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1)
626/// into:
627/// zext (icmp ne i32 (and X, (or Y, (shl 1, Z))), 0)
628/// Note:
629/// Z may be 0 if lshr is missing.
630/// Worst-case scenario is that we will replace 5 instructions with 5 different
631/// instructions, but we got rid of select.
632static Instruction *foldSelectICmpAndAnd(Type *SelType, const ICmpInst *Cmp,
633 Value *TVal, Value *FVal,
634 InstCombiner::BuilderTy &Builder) {
635 if (!(Cmp->hasOneUse() && Cmp->getOperand(0)->hasOneUse() &&
636 Cmp->getPredicate() == ICmpInst::ICMP_EQ &&
637 match(Cmp->getOperand(1), m_Zero()) && match(FVal, m_One())))
638 return nullptr;
639
640 // The TrueVal has general form of: and %B, 1
641 Value *B;
642 if (!match(TVal, m_OneUse(m_And(m_Value(B), m_One()))))
643 return nullptr;
644
645 // Where %B may be optionally shifted: lshr %X, %Z.
646 Value *X, *Z;
647 const bool HasShift = match(B, m_OneUse(m_LShr(m_Value(X), m_Value(Z))));
648
649 // The shift must be valid.
650 // TODO: This restricts the fold to constant shift amounts. Is there a way to
651 // handle variable shifts safely? PR47012
652 if (HasShift &&
654 APInt(SelType->getScalarSizeInBits(),
655 SelType->getScalarSizeInBits()))))
656 return nullptr;
657
658 if (!HasShift)
659 X = B;
660
661 Value *Y;
662 if (!match(Cmp->getOperand(0), m_c_And(m_Specific(X), m_Value(Y))))
663 return nullptr;
664
665 // ((X & Y) == 0) ? ((X >> Z) & 1) : 1 --> (X & (Y | (1 << Z))) != 0
666 // ((X & Y) == 0) ? (X & 1) : 1 --> (X & (Y | 1)) != 0
667 Constant *One = ConstantInt::get(SelType, 1);
668 Value *MaskB = HasShift ? Builder.CreateShl(One, Z) : One;
669 Value *FullMask = Builder.CreateOr(Y, MaskB);
670 Value *MaskedX = Builder.CreateAnd(X, FullMask);
671 Value *ICmpNeZero = Builder.CreateIsNotNull(MaskedX);
672 return new ZExtInst(ICmpNeZero, SelType);
673}
674
675/// We want to turn:
676/// (select (icmp eq (and X, C1), 0), 0, (shl [nsw/nuw] X, C2));
677/// iff C1 is a mask and the number of its leading zeros is equal to C2
678/// into:
679/// shl X, C2
681 Value *FVal,
682 InstCombiner::BuilderTy &Builder) {
683 CmpPredicate Pred;
684 Value *AndVal;
685 if (!match(Cmp, m_ICmp(Pred, m_Value(AndVal), m_Zero())))
686 return nullptr;
687
688 if (Pred == ICmpInst::ICMP_NE) {
689 Pred = ICmpInst::ICMP_EQ;
690 std::swap(TVal, FVal);
691 }
692
693 Value *X;
694 const APInt *C2, *C1;
695 if (Pred != ICmpInst::ICMP_EQ ||
696 !match(AndVal, m_And(m_Value(X), m_APInt(C1))) ||
697 !match(TVal, m_Zero()) || !match(FVal, m_Shl(m_Specific(X), m_APInt(C2))))
698 return nullptr;
699
700 if (!C1->isMask() ||
701 C1->countLeadingZeros() != static_cast<unsigned>(C2->getZExtValue()))
702 return nullptr;
703
704 auto *FI = dyn_cast<Instruction>(FVal);
705 if (!FI)
706 return nullptr;
707
708 FI->setHasNoSignedWrap(false);
709 FI->setHasNoUnsignedWrap(false);
710 return FVal;
711}
712
713/// We want to turn:
714/// (select (icmp sgt x, C), lshr (X, Y), ashr (X, Y)); iff C s>= -1
715/// (select (icmp slt x, C), ashr (X, Y), lshr (X, Y)); iff C s>= 0
716/// into:
717/// ashr (X, Y)
718static Value *foldSelectICmpLshrAshr(const ICmpInst *IC, Value *TrueVal,
719 Value *FalseVal,
720 InstCombiner::BuilderTy &Builder) {
722 Value *CmpLHS = IC->getOperand(0);
723 Value *CmpRHS = IC->getOperand(1);
724 if (!CmpRHS->getType()->isIntOrIntVectorTy())
725 return nullptr;
726
727 Value *X, *Y;
728 unsigned Bitwidth = CmpRHS->getType()->getScalarSizeInBits();
729 if ((Pred != ICmpInst::ICMP_SGT ||
731 APInt::getAllOnes(Bitwidth)))) &&
732 (Pred != ICmpInst::ICMP_SLT ||
734 APInt::getZero(Bitwidth)))))
735 return nullptr;
736
737 // Canonicalize so that ashr is in FalseVal.
738 if (Pred == ICmpInst::ICMP_SLT)
739 std::swap(TrueVal, FalseVal);
740
741 if (match(TrueVal, m_LShr(m_Value(X), m_Value(Y))) &&
742 match(FalseVal, m_AShr(m_Specific(X), m_Specific(Y))) &&
743 match(CmpLHS, m_Specific(X))) {
744 const auto *Ashr = cast<Instruction>(FalseVal);
745 // if lshr is not exact and ashr is, this new ashr must not be exact.
746 bool IsExact = Ashr->isExact() && cast<Instruction>(TrueVal)->isExact();
747 return Builder.CreateAShr(X, Y, IC->getName(), IsExact);
748 }
749
750 return nullptr;
751}
752
753/// We want to turn:
754/// (select (icmp eq (and X, C1), 0), Y, (BinOp Y, C2))
755/// into:
756/// IF C2 u>= C1
757/// (BinOp Y, (shl (and X, C1), C3))
758/// ELSE
759/// (BinOp Y, (lshr (and X, C1), C3))
760/// iff:
761/// 0 on the RHS is the identity value (i.e add, xor, shl, etc...)
762/// C1 and C2 are both powers of 2
763/// where:
764/// IF C2 u>= C1
765/// C3 = Log(C2) - Log(C1)
766/// ELSE
767/// C3 = Log(C1) - Log(C2)
768///
769/// This transform handles cases where:
770/// 1. The icmp predicate is inverted
771/// 2. The select operands are reversed
772/// 3. The magnitude of C2 and C1 are flipped
773static Value *foldSelectICmpAndBinOp(Value *CondVal, Value *TrueVal,
774 Value *FalseVal, Value *V,
775 const APInt &AndMask, bool CreateAnd,
776 InstCombiner::BuilderTy &Builder) {
777 // Only handle integer compares.
778 if (!TrueVal->getType()->isIntOrIntVectorTy())
779 return nullptr;
780
781 unsigned C1Log = AndMask.logBase2();
782 Value *Y;
783 BinaryOperator *BinOp;
784 const APInt *C2;
785 bool NeedXor;
786 if (match(FalseVal, m_BinOp(m_Specific(TrueVal), m_Power2(C2)))) {
787 Y = TrueVal;
788 BinOp = cast<BinaryOperator>(FalseVal);
789 NeedXor = false;
790 } else if (match(TrueVal, m_BinOp(m_Specific(FalseVal), m_Power2(C2)))) {
791 Y = FalseVal;
792 BinOp = cast<BinaryOperator>(TrueVal);
793 NeedXor = true;
794 } else {
795 return nullptr;
796 }
797
798 // Check that 0 on RHS is identity value for this binop.
799 auto *IdentityC =
801 /*AllowRHSConstant*/ true);
802 if (IdentityC == nullptr || !IdentityC->isNullValue())
803 return nullptr;
804
805 unsigned C2Log = C2->logBase2();
806
807 bool NeedShift = C1Log != C2Log;
808 bool NeedZExtTrunc = Y->getType()->getScalarSizeInBits() !=
809 V->getType()->getScalarSizeInBits();
810
811 // Make sure we don't create more instructions than we save.
812 if ((NeedShift + NeedXor + NeedZExtTrunc + CreateAnd) >
813 (CondVal->hasOneUse() + BinOp->hasOneUse()))
814 return nullptr;
815
816 if (CreateAnd) {
817 // Insert the AND instruction on the input to the truncate.
818 V = Builder.CreateAnd(V, ConstantInt::get(V->getType(), AndMask));
819 }
820
821 if (C2Log > C1Log) {
822 V = Builder.CreateZExtOrTrunc(V, Y->getType());
823 V = Builder.CreateShl(V, C2Log - C1Log);
824 } else if (C1Log > C2Log) {
825 V = Builder.CreateLShr(V, C1Log - C2Log);
826 V = Builder.CreateZExtOrTrunc(V, Y->getType());
827 } else
828 V = Builder.CreateZExtOrTrunc(V, Y->getType());
829
830 if (NeedXor)
831 V = Builder.CreateXor(V, *C2);
832
833 auto *Res = Builder.CreateBinOp(BinOp->getOpcode(), Y, V);
834 if (auto *BO = dyn_cast<BinaryOperator>(Res))
835 BO->copyIRFlags(BinOp);
836 return Res;
837}
838
839/// Canonicalize a set or clear of a masked set of constant bits to
840/// select-of-constants form.
842 InstCombiner::BuilderTy &Builder) {
843 Value *Cond = Sel.getCondition();
844 Value *T = Sel.getTrueValue();
845 Value *F = Sel.getFalseValue();
846 Type *Ty = Sel.getType();
847 Value *X;
848 const APInt *NotC, *C;
849
850 // Cond ? (X & ~C) : (X | C) --> (X & ~C) | (Cond ? 0 : C)
851 if (match(T, m_And(m_Value(X), m_APInt(NotC))) &&
852 match(F, m_OneUse(m_Or(m_Specific(X), m_APInt(C)))) && *NotC == ~(*C)) {
854 Constant *OrC = ConstantInt::get(Ty, *C);
855 Value *NewSel = Builder.CreateSelect(Cond, Zero, OrC, "masksel", &Sel);
856 return BinaryOperator::CreateOr(T, NewSel);
857 }
858
859 // Cond ? (X | C) : (X & ~C) --> (X & ~C) | (Cond ? C : 0)
860 if (match(F, m_And(m_Value(X), m_APInt(NotC))) &&
861 match(T, m_OneUse(m_Or(m_Specific(X), m_APInt(C)))) && *NotC == ~(*C)) {
863 Constant *OrC = ConstantInt::get(Ty, *C);
864 Value *NewSel = Builder.CreateSelect(Cond, OrC, Zero, "masksel", &Sel);
865 return BinaryOperator::CreateOr(F, NewSel);
866 }
867
868 return nullptr;
869}
870
871// select (x == 0), 0, x * y --> freeze(y) * x
872// select (y == 0), 0, x * y --> freeze(x) * y
873// select (x == 0), undef, x * y --> freeze(y) * x
874// select (x == undef), 0, x * y --> freeze(y) * x
875// Usage of mul instead of 0 will make the result more poisonous,
876// so the operand that was not checked in the condition should be frozen.
877// The latter folding is applied only when a constant compared with x is
878// is a vector consisting of 0 and undefs. If a constant compared with x
879// is a scalar undefined value or undefined vector then an expression
880// should be already folded into a constant.
881//
882// This also holds all operations such that Op(0) == 0
883// e.g. Shl, Umin, etc
885 InstCombinerImpl &IC) {
886 auto *CondVal = SI.getCondition();
887 auto *TrueVal = SI.getTrueValue();
888 auto *FalseVal = SI.getFalseValue();
889 Value *X, *Y;
891
892 // Assuming that constant compared with zero is not undef (but it may be
893 // a vector with some undef elements). Otherwise (when a constant is undef)
894 // the select expression should be already simplified.
895 if (!match(CondVal, m_ICmp(Predicate, m_Value(X), m_Zero())) ||
897 return nullptr;
898
900 std::swap(TrueVal, FalseVal);
901
902 // Check that TrueVal is a constant instead of matching it with m_Zero()
903 // to handle the case when it is a scalar undef value or a vector containing
904 // non-zero elements that are masked by undef elements in the compare
905 // constant.
906 auto *TrueValC = dyn_cast<Constant>(TrueVal);
907 if (TrueValC == nullptr || !isa<Instruction>(FalseVal))
908 return nullptr;
909
910 bool FreezeY;
911 if (match(FalseVal, m_c_Mul(m_Specific(X), m_Value(Y))) ||
912 match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
913 match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
914 match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
915 match(FalseVal,
917 FreezeY = true;
918 } else if (match(FalseVal, m_IDiv(m_Specific(X), m_Value(Y))) ||
919 match(FalseVal, m_IRem(m_Specific(X), m_Value(Y)))) {
920 FreezeY = false;
921 } else {
922 return nullptr;
923 }
924
925 auto *ZeroC = cast<Constant>(cast<Instruction>(CondVal)->getOperand(1));
926 auto *MergedC = Constant::mergeUndefsWith(TrueValC, ZeroC);
927 // If X is compared with 0 then TrueVal could be either zero or undef.
928 // m_Zero match vectors containing some undef elements, but for scalars
929 // m_Undef should be used explicitly.
930 if (!match(MergedC, m_Zero()) && !match(MergedC, m_Undef()))
931 return nullptr;
932
933 auto *FalseValI = cast<Instruction>(FalseVal);
934 if (FreezeY) {
935 auto *FrY = IC.InsertNewInstBefore(new FreezeInst(Y, Y->getName() + ".fr"),
936 FalseValI->getIterator());
937 IC.replaceOperand(*FalseValI,
938 FalseValI->getOperand(0) == Y
939 ? 0
940 : (FalseValI->getOperand(1) == Y ? 1 : 2),
941 FrY);
942 }
943 return IC.replaceInstUsesWith(SI, FalseValI);
944}
945
946/// Transform patterns such as (a > b) ? a - b : 0 into usub.sat(a, b).
947/// There are 8 commuted/swapped variants of this pattern.
949 const Value *TrueVal,
950 const Value *FalseVal,
951 InstCombiner::BuilderTy &Builder) {
952 ICmpInst::Predicate Pred = ICI->getPredicate();
953 Value *A = ICI->getOperand(0);
954 Value *B = ICI->getOperand(1);
955
956 // (b > a) ? 0 : a - b -> (b <= a) ? a - b : 0
957 // (a == 0) ? 0 : a - 1 -> (a != 0) ? a - 1 : 0
958 if (match(TrueVal, m_Zero())) {
960 std::swap(TrueVal, FalseVal);
961 }
962
963 if (!match(FalseVal, m_Zero()))
964 return nullptr;
965
966 // ugt 0 is canonicalized to ne 0 and requires special handling
967 // (a != 0) ? a + -1 : 0 -> usub.sat(a, 1)
968 if (Pred == ICmpInst::ICMP_NE) {
969 if (match(B, m_Zero()) && match(TrueVal, m_Add(m_Specific(A), m_AllOnes())))
970 return Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A,
971 ConstantInt::get(A->getType(), 1));
972 return nullptr;
973 }
974
975 if (!ICmpInst::isUnsigned(Pred))
976 return nullptr;
977
978 if (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_ULT) {
979 // (b < a) ? a - b : 0 -> (a > b) ? a - b : 0
980 std::swap(A, B);
982 }
983
984 assert((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_UGT) &&
985 "Unexpected isUnsigned predicate!");
986
987 // Ensure the sub is of the form:
988 // (a > b) ? a - b : 0 -> usub.sat(a, b)
989 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
990 // Checking for both a-b and a+(-b) as a constant.
991 bool IsNegative = false;
992 const APInt *C;
993 if (match(TrueVal, m_Sub(m_Specific(B), m_Specific(A))) ||
994 (match(A, m_APInt(C)) &&
995 match(TrueVal, m_Add(m_Specific(B), m_SpecificInt(-*C)))))
996 IsNegative = true;
997 else if (!match(TrueVal, m_Sub(m_Specific(A), m_Specific(B))) &&
998 !(match(B, m_APInt(C)) &&
999 match(TrueVal, m_Add(m_Specific(A), m_SpecificInt(-*C)))))
1000 return nullptr;
1001
1002 // If we are adding a negate and the sub and icmp are used anywhere else, we
1003 // would end up with more instructions.
1004 if (IsNegative && !TrueVal->hasOneUse() && !ICI->hasOneUse())
1005 return nullptr;
1006
1007 // (a > b) ? a - b : 0 -> usub.sat(a, b)
1008 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
1009 Value *Result = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A, B);
1010 if (IsNegative)
1011 Result = Builder.CreateNeg(Result);
1012 return Result;
1013}
1014
1016 InstCombiner::BuilderTy &Builder) {
1017 if (!Cmp->hasOneUse())
1018 return nullptr;
1019
1020 // Match unsigned saturated add with constant.
1021 Value *Cmp0 = Cmp->getOperand(0);
1022 Value *Cmp1 = Cmp->getOperand(1);
1023 ICmpInst::Predicate Pred = Cmp->getPredicate();
1024 Value *X;
1025 const APInt *C;
1026
1027 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
1028 // There are 8 commuted variants.
1029 // Canonicalize -1 (saturated result) to true value of the select.
1030 if (match(FVal, m_AllOnes())) {
1031 std::swap(TVal, FVal);
1032 Pred = CmpInst::getInversePredicate(Pred);
1033 }
1034 if (!match(TVal, m_AllOnes()))
1035 return nullptr;
1036
1037 // uge -1 is canonicalized to eq -1 and requires special handling
1038 // (a == -1) ? -1 : a + 1 -> uadd.sat(a, 1)
1039 if (Pred == ICmpInst::ICMP_EQ) {
1040 if (match(FVal, m_Add(m_Specific(Cmp0), m_One())) &&
1041 match(Cmp1, m_AllOnes())) {
1042 return Builder.CreateBinaryIntrinsic(
1043 Intrinsic::uadd_sat, Cmp0, ConstantInt::get(Cmp0->getType(), 1));
1044 }
1045 return nullptr;
1046 }
1047
1048 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_UGT) &&
1049 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1050 match(Cmp1, m_SpecificIntAllowPoison(~*C))) {
1051 // (X u> ~C) ? -1 : (X + C) --> uadd.sat(X, C)
1052 // (X u>= ~C)? -1 : (X + C) --> uadd.sat(X, C)
1053 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1054 ConstantInt::get(Cmp0->getType(), *C));
1055 }
1056
1057 // Negative one does not work here because X u> -1 ? -1, X + -1 is not a
1058 // saturated add.
1059 if (Pred == ICmpInst::ICMP_UGT &&
1060 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1061 match(Cmp1, m_SpecificIntAllowPoison(~*C - 1)) && !C->isAllOnes()) {
1062 // (X u> ~C - 1) ? -1 : (X + C) --> uadd.sat(X, C)
1063 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1064 ConstantInt::get(Cmp0->getType(), *C));
1065 }
1066
1067 // Zero does not work here because X u>= 0 ? -1 : X -> is always -1, which is
1068 // not a saturated add.
1069 if (Pred == ICmpInst::ICMP_UGE &&
1070 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1071 match(Cmp1, m_SpecificIntAllowPoison(-*C)) && !C->isZero()) {
1072 // (X u >= -C) ? -1 : (X + C) --> uadd.sat(X, C)
1073 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1074 ConstantInt::get(Cmp0->getType(), *C));
1075 }
1076
1077 // Canonicalize predicate to less-than or less-or-equal-than.
1078 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE) {
1079 std::swap(Cmp0, Cmp1);
1080 Pred = CmpInst::getSwappedPredicate(Pred);
1081 }
1082 if (Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_ULE)
1083 return nullptr;
1084
1085 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
1086 // Strictness of the comparison is irrelevant.
1087 Value *Y;
1088 if (match(Cmp0, m_Not(m_Value(X))) &&
1089 match(FVal, m_c_Add(m_Specific(X), m_Value(Y))) && Y == Cmp1) {
1090 // (~X u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
1091 // (~X u< Y) ? -1 : (Y + X) --> uadd.sat(X, Y)
1092 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, X, Y);
1093 }
1094 // The 'not' op may be included in the sum but not the compare.
1095 // Strictness of the comparison is irrelevant.
1096 X = Cmp0;
1097 Y = Cmp1;
1099 // (X u< Y) ? -1 : (~X + Y) --> uadd.sat(~X, Y)
1100 // (X u< Y) ? -1 : (Y + ~X) --> uadd.sat(Y, ~X)
1102 return Builder.CreateBinaryIntrinsic(
1103 Intrinsic::uadd_sat, BO->getOperand(0), BO->getOperand(1));
1104 }
1105 // The overflow may be detected via the add wrapping round.
1106 // This is only valid for strict comparison!
1107 if (Pred == ICmpInst::ICMP_ULT &&
1108 match(Cmp0, m_c_Add(m_Specific(Cmp1), m_Value(Y))) &&
1109 match(FVal, m_c_Add(m_Specific(Cmp1), m_Specific(Y)))) {
1110 // ((X + Y) u< X) ? -1 : (X + Y) --> uadd.sat(X, Y)
1111 // ((X + Y) u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
1112 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp1, Y);
1113 }
1114
1115 return nullptr;
1116}
1117
1118/// Try to match patterns with select and subtract as absolute difference.
1119static Value *foldAbsDiff(ICmpInst *Cmp, Value *TVal, Value *FVal,
1120 InstCombiner::BuilderTy &Builder) {
1121 auto *TI = dyn_cast<Instruction>(TVal);
1122 auto *FI = dyn_cast<Instruction>(FVal);
1123 if (!TI || !FI)
1124 return nullptr;
1125
1126 // Normalize predicate to gt/lt rather than ge/le.
1127 ICmpInst::Predicate Pred = Cmp->getStrictPredicate();
1128 Value *A = Cmp->getOperand(0);
1129 Value *B = Cmp->getOperand(1);
1130
1131 // Normalize "A - B" as the true value of the select.
1132 if (match(FI, m_Sub(m_Specific(A), m_Specific(B)))) {
1133 std::swap(FI, TI);
1134 Pred = ICmpInst::getSwappedPredicate(Pred);
1135 }
1136
1137 // With any pair of no-wrap subtracts:
1138 // (A > B) ? (A - B) : (B - A) --> abs(A - B)
1139 if (Pred == CmpInst::ICMP_SGT &&
1140 match(TI, m_Sub(m_Specific(A), m_Specific(B))) &&
1141 match(FI, m_Sub(m_Specific(B), m_Specific(A))) &&
1142 (TI->hasNoSignedWrap() || TI->hasNoUnsignedWrap()) &&
1143 (FI->hasNoSignedWrap() || FI->hasNoUnsignedWrap())) {
1144 // The remaining subtract is not "nuw" any more.
1145 // If there's one use of the subtract (no other use than the use we are
1146 // about to replace), then we know that the sub is "nsw" in this context
1147 // even if it was only "nuw" before. If there's another use, then we can't
1148 // add "nsw" to the existing instruction because it may not be safe in the
1149 // other user's context.
1150 TI->setHasNoUnsignedWrap(false);
1151 if (!TI->hasNoSignedWrap())
1152 TI->setHasNoSignedWrap(TI->hasOneUse());
1153 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI, Builder.getTrue());
1154 }
1155
1156 // Match: (A > B) ? (A - B) : (0 - (A - B)) --> abs(A - B)
1157 if (Pred == CmpInst::ICMP_SGT &&
1159 match(FI, m_Neg(m_Specific(TI)))) {
1160 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI,
1161 Builder.getFalse());
1162 }
1163
1164 // Match: (A < B) ? (0 - (A - B)) : (A - B) --> abs(A - B)
1165 if (Pred == CmpInst::ICMP_SLT &&
1167 match(TI, m_Neg(m_Specific(FI)))) {
1168 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, FI,
1169 Builder.getFalse());
1170 }
1171
1172 // Match: (A > B) ? (0 - (B - A)) : (B - A) --> abs(B - A)
1173 if (Pred == CmpInst::ICMP_SGT &&
1175 match(TI, m_Neg(m_Specific(FI)))) {
1176 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, FI,
1177 Builder.getFalse());
1178 }
1179
1180 // Match: (A < B) ? (B - A) : (0 - (B - A)) --> abs(B - A)
1181 if (Pred == CmpInst::ICMP_SLT &&
1183 match(FI, m_Neg(m_Specific(TI)))) {
1184 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI,
1185 Builder.getFalse());
1186 }
1187
1188 return nullptr;
1189}
1190
1191/// Fold the following code sequence:
1192/// \code
1193/// int a = ctlz(x & -x);
1194// x ? 31 - a : a;
1195// // or
1196// x ? 31 - a : 32;
1197/// \code
1198///
1199/// into:
1200/// cttz(x)
1201static Instruction *foldSelectCtlzToCttz(ICmpInst *ICI, Value *TrueVal,
1202 Value *FalseVal,
1203 InstCombiner::BuilderTy &Builder) {
1204 unsigned BitWidth = TrueVal->getType()->getScalarSizeInBits();
1205 if (!ICI->isEquality() || !match(ICI->getOperand(1), m_Zero()))
1206 return nullptr;
1207
1208 if (ICI->getPredicate() == ICmpInst::ICMP_NE)
1209 std::swap(TrueVal, FalseVal);
1210
1211 Value *Ctlz;
1212 if (!match(FalseVal,
1213 m_Xor(m_Value(Ctlz), m_SpecificInt(BitWidth - 1))))
1214 return nullptr;
1215
1216 if (!match(Ctlz, m_Intrinsic<Intrinsic::ctlz>()))
1217 return nullptr;
1218
1219 if (TrueVal != Ctlz && !match(TrueVal, m_SpecificInt(BitWidth)))
1220 return nullptr;
1221
1222 Value *X = ICI->getOperand(0);
1223 auto *II = cast<IntrinsicInst>(Ctlz);
1224 if (!match(II->getOperand(0), m_c_And(m_Specific(X), m_Neg(m_Specific(X)))))
1225 return nullptr;
1226
1228 II->getModule(), Intrinsic::cttz, II->getType());
1229 return CallInst::Create(F, {X, II->getArgOperand(1)});
1230}
1231
1232/// Attempt to fold a cttz/ctlz followed by a icmp plus select into a single
1233/// call to cttz/ctlz with flag 'is_zero_poison' cleared.
1234///
1235/// For example, we can fold the following code sequence:
1236/// \code
1237/// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
1238/// %1 = icmp ne i32 %x, 0
1239/// %2 = select i1 %1, i32 %0, i32 32
1240/// \code
1241///
1242/// into:
1243/// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
1244static Value *foldSelectCttzCtlz(ICmpInst *ICI, Value *TrueVal, Value *FalseVal,
1245 InstCombinerImpl &IC) {
1246 ICmpInst::Predicate Pred = ICI->getPredicate();
1247 Value *CmpLHS = ICI->getOperand(0);
1248 Value *CmpRHS = ICI->getOperand(1);
1249
1250 // Check if the select condition compares a value for equality.
1251 if (!ICI->isEquality())
1252 return nullptr;
1253
1254 Value *SelectArg = FalseVal;
1255 Value *ValueOnZero = TrueVal;
1256 if (Pred == ICmpInst::ICMP_NE)
1257 std::swap(SelectArg, ValueOnZero);
1258
1259 // Skip zero extend/truncate.
1260 Value *Count = nullptr;
1261 if (!match(SelectArg, m_ZExt(m_Value(Count))) &&
1262 !match(SelectArg, m_Trunc(m_Value(Count))))
1263 Count = SelectArg;
1264
1265 // Check that 'Count' is a call to intrinsic cttz/ctlz. Also check that the
1266 // input to the cttz/ctlz is used as LHS for the compare instruction.
1267 Value *X;
1270 return nullptr;
1271
1272 // (X == 0) ? BitWidth : ctz(X)
1273 // (X == -1) ? BitWidth : ctz(~X)
1274 // (X == Y) ? BitWidth : ctz(X ^ Y)
1275 if ((X != CmpLHS || !match(CmpRHS, m_Zero())) &&
1276 (!match(X, m_Not(m_Specific(CmpLHS))) || !match(CmpRHS, m_AllOnes())) &&
1277 !match(X, m_c_Xor(m_Specific(CmpLHS), m_Specific(CmpRHS))))
1278 return nullptr;
1279
1281
1282 // Check if the value propagated on zero is a constant number equal to the
1283 // sizeof in bits of 'Count'.
1284 unsigned SizeOfInBits = Count->getType()->getScalarSizeInBits();
1285 if (match(ValueOnZero, m_SpecificInt(SizeOfInBits))) {
1286 // Explicitly clear the 'is_zero_poison' flag. It's always valid to go from
1287 // true to false on this flag, so we can replace it for all users.
1288 II->setArgOperand(1, ConstantInt::getFalse(II->getContext()));
1289 // A range annotation on the intrinsic may no longer be valid.
1290 II->dropPoisonGeneratingAnnotations();
1291 IC.addToWorklist(II);
1292 return SelectArg;
1293 }
1294
1295 // The ValueOnZero is not the bitwidth. But if the cttz/ctlz (and optional
1296 // zext/trunc) have one use (ending at the select), the cttz/ctlz result will
1297 // not be used if the input is zero. Relax to 'zero is poison' for that case.
1298 if (II->hasOneUse() && SelectArg->hasOneUse() &&
1299 !match(II->getArgOperand(1), m_One())) {
1300 II->setArgOperand(1, ConstantInt::getTrue(II->getContext()));
1301 // noundef attribute on the intrinsic may no longer be valid.
1302 II->dropUBImplyingAttrsAndMetadata();
1303 IC.addToWorklist(II);
1304 }
1305
1306 return nullptr;
1307}
1308
1309static Value *canonicalizeSPF(ICmpInst &Cmp, Value *TrueVal, Value *FalseVal,
1310 InstCombinerImpl &IC) {
1311 Value *LHS, *RHS;
1312 // TODO: What to do with pointer min/max patterns?
1313 if (!TrueVal->getType()->isIntOrIntVectorTy())
1314 return nullptr;
1315
1317 matchDecomposedSelectPattern(&Cmp, TrueVal, FalseVal, LHS, RHS).Flavor;
1318 if (SPF == SelectPatternFlavor::SPF_ABS ||
1320 if (!Cmp.hasOneUse() && !RHS->hasOneUse())
1321 return nullptr; // TODO: Relax this restriction.
1322
1323 // Note that NSW flag can only be propagated for normal, non-negated abs!
1324 bool IntMinIsPoison = SPF == SelectPatternFlavor::SPF_ABS &&
1326 Constant *IntMinIsPoisonC =
1327 ConstantInt::get(Type::getInt1Ty(Cmp.getContext()), IntMinIsPoison);
1328 Value *Abs =
1329 IC.Builder.CreateBinaryIntrinsic(Intrinsic::abs, LHS, IntMinIsPoisonC);
1330
1332 return IC.Builder.CreateNeg(Abs); // Always without NSW flag!
1333 return Abs;
1334 }
1335
1337 Intrinsic::ID IntrinsicID = getMinMaxIntrinsic(SPF);
1338 return IC.Builder.CreateBinaryIntrinsic(IntrinsicID, LHS, RHS);
1339 }
1340
1341 return nullptr;
1342}
1343
1345 unsigned Depth) {
1346 // Conservatively limit replacement to two instructions upwards.
1347 if (Depth == 2)
1348 return false;
1349
1350 assert(!isa<Constant>(Old) && "Only replace non-constant values");
1351
1352 auto *I = dyn_cast<Instruction>(V);
1353 if (!I || !I->hasOneUse() ||
1355 return false;
1356
1357 // Forbid potentially lane-crossing instructions.
1358 if (Old->getType()->isVectorTy() && !isNotCrossLaneOperation(I))
1359 return false;
1360
1361 bool Changed = false;
1362 for (Use &U : I->operands()) {
1363 if (U == Old) {
1364 replaceUse(U, New);
1365 Worklist.add(I);
1366 Changed = true;
1367 } else {
1368 Changed |= replaceInInstruction(U, Old, New, Depth + 1);
1369 }
1370 }
1371 return Changed;
1372}
1373
1374/// If we have a select with an equality comparison, then we know the value in
1375/// one of the arms of the select. See if substituting this value into an arm
1376/// and simplifying the result yields the same value as the other arm.
1377///
1378/// To make this transform safe, we must drop poison-generating flags
1379/// (nsw, etc) if we simplified to a binop because the select may be guarding
1380/// that poison from propagating. If the existing binop already had no
1381/// poison-generating flags, then this transform can be done by instsimplify.
1382///
1383/// Consider:
1384/// %cmp = icmp eq i32 %x, 2147483647
1385/// %add = add nsw i32 %x, 1
1386/// %sel = select i1 %cmp, i32 -2147483648, i32 %add
1387///
1388/// We can't replace %sel with %add unless we strip away the flags.
1389/// TODO: Wrapping flags could be preserved in some cases with better analysis.
1391 CmpInst &Cmp) {
1392 // Canonicalize the pattern to an equivalence on the predicate by swapping the
1393 // select operands.
1394 Value *TrueVal = Sel.getTrueValue(), *FalseVal = Sel.getFalseValue();
1395 bool Swapped = false;
1396 if (Cmp.isEquivalence(/*Invert=*/true)) {
1397 std::swap(TrueVal, FalseVal);
1398 Swapped = true;
1399 } else if (!Cmp.isEquivalence()) {
1400 return nullptr;
1401 }
1402
1403 Value *CmpLHS = Cmp.getOperand(0), *CmpRHS = Cmp.getOperand(1);
1404 auto ReplaceOldOpWithNewOp = [&](Value *OldOp,
1405 Value *NewOp) -> Instruction * {
1406 // In X == Y ? f(X) : Z, try to evaluate f(Y) and replace the operand.
1407 // Take care to avoid replacing X == Y ? X : Z with X == Y ? Y : Z, as that
1408 // would lead to an infinite replacement cycle.
1409 // If we will be able to evaluate f(Y) to a constant, we can allow undef,
1410 // otherwise Y cannot be undef as we might pick different values for undef
1411 // in the cmp and in f(Y).
1412 if (TrueVal == OldOp && (isa<Constant>(OldOp) || !isa<Constant>(NewOp)))
1413 return nullptr;
1414
1415 if (Value *V = simplifyWithOpReplaced(TrueVal, OldOp, NewOp, SQ,
1416 /* AllowRefinement=*/true)) {
1417 // Need some guarantees about the new simplified op to ensure we don't inf
1418 // loop.
1419 // If we simplify to a constant, replace if we aren't creating new undef.
1420 if (match(V, m_ImmConstant()) &&
1421 isGuaranteedNotToBeUndef(V, SQ.AC, &Sel, &DT))
1422 return replaceOperand(Sel, Swapped ? 2 : 1, V);
1423
1424 // If NewOp is a constant and OldOp is not replace iff NewOp doesn't
1425 // contain and undef elements.
1426 // Make sure that V is always simpler than TrueVal, otherwise we might
1427 // end up in an infinite loop.
1428 if (match(NewOp, m_ImmConstant()) ||
1429 (isa<Instruction>(TrueVal) &&
1430 is_contained(cast<Instruction>(TrueVal)->operands(), V))) {
1431 if (isGuaranteedNotToBeUndef(NewOp, SQ.AC, &Sel, &DT))
1432 return replaceOperand(Sel, Swapped ? 2 : 1, V);
1433 return nullptr;
1434 }
1435 }
1436
1437 // Even if TrueVal does not simplify, we can directly replace a use of
1438 // CmpLHS with CmpRHS, as long as the instruction is not used anywhere
1439 // else and is safe to speculatively execute (we may end up executing it
1440 // with different operands, which should not cause side-effects or trigger
1441 // undefined behavior). Only do this if CmpRHS is a constant, as
1442 // profitability is not clear for other cases.
1443 if (OldOp == CmpLHS && match(NewOp, m_ImmConstant()) &&
1444 !match(OldOp, m_Constant()) &&
1445 isGuaranteedNotToBeUndef(NewOp, SQ.AC, &Sel, &DT))
1446 if (replaceInInstruction(TrueVal, OldOp, NewOp))
1447 return &Sel;
1448 return nullptr;
1449 };
1450
1451 if (Instruction *R = ReplaceOldOpWithNewOp(CmpLHS, CmpRHS))
1452 return R;
1453 if (Instruction *R = ReplaceOldOpWithNewOp(CmpRHS, CmpLHS))
1454 return R;
1455
1456 auto *FalseInst = dyn_cast<Instruction>(FalseVal);
1457 if (!FalseInst)
1458 return nullptr;
1459
1460 // InstSimplify already performed this fold if it was possible subject to
1461 // current poison-generating flags. Check whether dropping poison-generating
1462 // flags enables the transform.
1463
1464 // Try each equivalence substitution possibility.
1465 // We have an 'EQ' comparison, so the select's false value will propagate.
1466 // Example:
1467 // (X == 42) ? 43 : (X + 1) --> (X == 42) ? (X + 1) : (X + 1) --> X + 1
1469 if (simplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, SQ,
1470 /* AllowRefinement */ false,
1471 &DropFlags) == TrueVal ||
1472 simplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, SQ,
1473 /* AllowRefinement */ false,
1474 &DropFlags) == TrueVal) {
1475 for (Instruction *I : DropFlags) {
1476 I->dropPoisonGeneratingAnnotations();
1477 Worklist.add(I);
1478 }
1479
1480 return replaceInstUsesWith(Sel, FalseVal);
1481 }
1482
1483 return nullptr;
1484}
1485
1486/// Fold the following code sequence:
1487/// \code
1488/// %XeqZ = icmp eq i64 %X, %Z
1489/// %YeqZ = icmp eq i64 %Y, %Z
1490/// %XeqY = icmp eq i64 %X, %Y
1491/// %not.YeqZ = xor i1 %YeqZ, true
1492/// %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
1493/// %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
1494/// \code
1495///
1496/// into:
1497/// %equal = icmp eq i64 %X, %Y
1499 Value *X, *Y, *Z;
1500 Value *XeqY, *XeqZ = Sel.getCondition(), *YeqZ = Sel.getTrueValue();
1501
1503 return nullptr;
1504
1505 if (!match(YeqZ,
1507 std::swap(X, Z);
1508
1509 if (!match(YeqZ,
1511 return nullptr;
1512
1513 if (!match(Sel.getFalseValue(),
1514 m_c_LogicalAnd(m_Not(m_Specific(YeqZ)), m_Value(XeqY))))
1515 return nullptr;
1516
1517 if (!match(XeqY,
1519 return nullptr;
1520
1521 cast<ICmpInst>(XeqY)->setSameSign(false);
1522 return replaceInstUsesWith(Sel, XeqY);
1523}
1524
1525// See if this is a pattern like:
1526// %old_cmp1 = icmp slt i32 %x, C2
1527// %old_replacement = select i1 %old_cmp1, i32 %target_low, i32 %target_high
1528// %old_x_offseted = add i32 %x, C1
1529// %old_cmp0 = icmp ult i32 %old_x_offseted, C0
1530// %r = select i1 %old_cmp0, i32 %x, i32 %old_replacement
1531// This can be rewritten as more canonical pattern:
1532// %new_cmp1 = icmp slt i32 %x, -C1
1533// %new_cmp2 = icmp sge i32 %x, C0-C1
1534// %new_clamped_low = select i1 %new_cmp1, i32 %target_low, i32 %x
1535// %r = select i1 %new_cmp2, i32 %target_high, i32 %new_clamped_low
1536// Iff -C1 s<= C2 s<= C0-C1
1537// Also ULT predicate can also be UGT iff C0 != -1 (+invert result)
1538// SLT predicate can also be SGT iff C2 != INT_MAX (+invert res.)
1539static Value *canonicalizeClampLike(SelectInst &Sel0, ICmpInst &Cmp0,
1540 InstCombiner::BuilderTy &Builder,
1541 InstCombiner &IC) {
1542 Value *X = Sel0.getTrueValue();
1543 Value *Sel1 = Sel0.getFalseValue();
1544
1545 // First match the condition of the outermost select.
1546 // Said condition must be one-use.
1547 if (!Cmp0.hasOneUse())
1548 return nullptr;
1549 ICmpInst::Predicate Pred0 = Cmp0.getPredicate();
1550 Value *Cmp00 = Cmp0.getOperand(0);
1551 Constant *C0;
1552 if (!match(Cmp0.getOperand(1),
1554 return nullptr;
1555
1556 if (!isa<SelectInst>(Sel1)) {
1557 Pred0 = ICmpInst::getInversePredicate(Pred0);
1558 std::swap(X, Sel1);
1559 }
1560
1561 // Canonicalize Cmp0 into ult or uge.
1562 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1563 switch (Pred0) {
1566 // Although icmp ult %x, 0 is an unusual thing to try and should generally
1567 // have been simplified, it does not verify with undef inputs so ensure we
1568 // are not in a strange state.
1569 if (!match(C0, m_SpecificInt_ICMP(
1572 return nullptr;
1573 break; // Great!
1576 // We want to canonicalize it to 'ult' or 'uge', so we'll need to increment
1577 // C0, which again means it must not have any all-ones elements.
1578 if (!match(C0,
1582 return nullptr; // Can't do, have all-ones element[s].
1584 C0 = InstCombiner::AddOne(C0);
1585 break;
1586 default:
1587 return nullptr; // Unknown predicate.
1588 }
1589
1590 // Now that we've canonicalized the ICmp, we know the X we expect;
1591 // the select in other hand should be one-use.
1592 if (!Sel1->hasOneUse())
1593 return nullptr;
1594
1595 // If the types do not match, look through any truncs to the underlying
1596 // instruction.
1597 if (Cmp00->getType() != X->getType() && X->hasOneUse())
1599
1600 // We now can finish matching the condition of the outermost select:
1601 // it should either be the X itself, or an addition of some constant to X.
1602 Constant *C1;
1603 if (Cmp00 == X)
1604 C1 = ConstantInt::getNullValue(X->getType());
1605 else if (!match(Cmp00,
1608 return nullptr;
1609
1610 Value *Cmp1;
1611 CmpPredicate Pred1;
1612 Constant *C2;
1613 Value *ReplacementLow, *ReplacementHigh;
1614 if (!match(Sel1, m_Select(m_Value(Cmp1), m_Value(ReplacementLow),
1615 m_Value(ReplacementHigh))) ||
1616 !match(Cmp1,
1617 m_ICmp(Pred1, m_Specific(X),
1619 return nullptr;
1620
1621 if (!Cmp1->hasOneUse() && (Cmp00 == X || !Cmp00->hasOneUse()))
1622 return nullptr; // Not enough one-use instructions for the fold.
1623 // FIXME: this restriction could be relaxed if Cmp1 can be reused as one of
1624 // two comparisons we'll need to build.
1625
1626 // Canonicalize Cmp1 into the form we expect.
1627 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1628 switch (Pred1) {
1630 break;
1632 // We'd have to increment C2 by one, and for that it must not have signed
1633 // max element, but then it would have been canonicalized to 'slt' before
1634 // we get here. So we can't do anything useful with 'sle'.
1635 return nullptr;
1637 // We want to canonicalize it to 'slt', so we'll need to increment C2,
1638 // which again means it must not have any signed max elements.
1639 if (!match(C2,
1642 C2->getType()->getScalarSizeInBits()))))
1643 return nullptr; // Can't do, have signed max element[s].
1644 C2 = InstCombiner::AddOne(C2);
1645 [[fallthrough]];
1647 // Also non-canonical, but here we don't need to change C2,
1648 // so we don't have any restrictions on C2, so we can just handle it.
1650 std::swap(ReplacementLow, ReplacementHigh);
1651 break;
1652 default:
1653 return nullptr; // Unknown predicate.
1654 }
1656 "Unexpected predicate type.");
1657
1658 // The thresholds of this clamp-like pattern.
1659 auto *ThresholdLowIncl = ConstantExpr::getNeg(C1);
1660 auto *ThresholdHighExcl = ConstantExpr::getSub(C0, C1);
1661
1664 "Unexpected predicate type.");
1665 if (Pred0 == ICmpInst::Predicate::ICMP_UGE)
1666 std::swap(ThresholdLowIncl, ThresholdHighExcl);
1667
1668 // The fold has a precondition 1: C2 s>= ThresholdLow
1669 auto *Precond1 = ConstantFoldCompareInstOperands(
1670 ICmpInst::Predicate::ICMP_SGE, C2, ThresholdLowIncl, IC.getDataLayout());
1671 if (!Precond1 || !match(Precond1, m_One()))
1672 return nullptr;
1673 // The fold has a precondition 2: C2 s<= ThresholdHigh
1674 auto *Precond2 = ConstantFoldCompareInstOperands(
1675 ICmpInst::Predicate::ICMP_SLE, C2, ThresholdHighExcl, IC.getDataLayout());
1676 if (!Precond2 || !match(Precond2, m_One()))
1677 return nullptr;
1678
1679 // If we are matching from a truncated input, we need to sext the
1680 // ReplacementLow and ReplacementHigh values. Only do the transform if they
1681 // are free to extend due to being constants.
1682 if (X->getType() != Sel0.getType()) {
1683 Constant *LowC, *HighC;
1684 if (!match(ReplacementLow, m_ImmConstant(LowC)) ||
1685 !match(ReplacementHigh, m_ImmConstant(HighC)))
1686 return nullptr;
1687 const DataLayout &DL = Sel0.getDataLayout();
1688 ReplacementLow =
1689 ConstantFoldCastOperand(Instruction::SExt, LowC, X->getType(), DL);
1690 ReplacementHigh =
1691 ConstantFoldCastOperand(Instruction::SExt, HighC, X->getType(), DL);
1692 assert(ReplacementLow && ReplacementHigh &&
1693 "Constant folding of ImmConstant cannot fail");
1694 }
1695
1696 // All good, finally emit the new pattern.
1697 Value *ShouldReplaceLow = Builder.CreateICmpSLT(X, ThresholdLowIncl);
1698 Value *ShouldReplaceHigh = Builder.CreateICmpSGE(X, ThresholdHighExcl);
1699 Value *MaybeReplacedLow =
1700 Builder.CreateSelect(ShouldReplaceLow, ReplacementLow, X);
1701
1702 // Create the final select. If we looked through a truncate above, we will
1703 // need to retruncate the result.
1704 Value *MaybeReplacedHigh = Builder.CreateSelect(
1705 ShouldReplaceHigh, ReplacementHigh, MaybeReplacedLow);
1706 return Builder.CreateTrunc(MaybeReplacedHigh, Sel0.getType());
1707}
1708
1709// If we have
1710// %cmp = icmp [canonical predicate] i32 %x, C0
1711// %r = select i1 %cmp, i32 %y, i32 C1
1712// Where C0 != C1 and %x may be different from %y, see if the constant that we
1713// will have if we flip the strictness of the predicate (i.e. without changing
1714// the result) is identical to the C1 in select. If it matches we can change
1715// original comparison to one with swapped predicate, reuse the constant,
1716// and swap the hands of select.
1717static Instruction *
1718tryToReuseConstantFromSelectInComparison(SelectInst &Sel, ICmpInst &Cmp,
1719 InstCombinerImpl &IC) {
1720 CmpPredicate Pred;
1721 Value *X;
1722 Constant *C0;
1723 if (!match(&Cmp, m_OneUse(m_ICmp(
1724 Pred, m_Value(X),
1726 return nullptr;
1727
1728 // If comparison predicate is non-relational, we won't be able to do anything.
1729 if (ICmpInst::isEquality(Pred))
1730 return nullptr;
1731
1732 // If comparison predicate is non-canonical, then we certainly won't be able
1733 // to make it canonical; canonicalizeCmpWithConstant() already tried.
1735 return nullptr;
1736
1737 // If the [input] type of comparison and select type are different, lets abort
1738 // for now. We could try to compare constants with trunc/[zs]ext though.
1739 if (C0->getType() != Sel.getType())
1740 return nullptr;
1741
1742 // ULT with 'add' of a constant is canonical. See foldICmpAddConstant().
1743 // FIXME: Are there more magic icmp predicate+constant pairs we must avoid?
1744 // Or should we just abandon this transform entirely?
1745 if (Pred == CmpInst::ICMP_ULT && match(X, m_Add(m_Value(), m_Constant())))
1746 return nullptr;
1747
1748
1749 Value *SelVal0, *SelVal1; // We do not care which one is from where.
1750 match(&Sel, m_Select(m_Value(), m_Value(SelVal0), m_Value(SelVal1)));
1751 // At least one of these values we are selecting between must be a constant
1752 // else we'll never succeed.
1753 if (!match(SelVal0, m_AnyIntegralConstant()) &&
1754 !match(SelVal1, m_AnyIntegralConstant()))
1755 return nullptr;
1756
1757 // Does this constant C match any of the `select` values?
1758 auto MatchesSelectValue = [SelVal0, SelVal1](Constant *C) {
1759 return C->isElementWiseEqual(SelVal0) || C->isElementWiseEqual(SelVal1);
1760 };
1761
1762 // If C0 *already* matches true/false value of select, we are done.
1763 if (MatchesSelectValue(C0))
1764 return nullptr;
1765
1766 // Check the constant we'd have with flipped-strictness predicate.
1767 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, C0);
1768 if (!FlippedStrictness)
1769 return nullptr;
1770
1771 // If said constant doesn't match either, then there is no hope,
1772 if (!MatchesSelectValue(FlippedStrictness->second))
1773 return nullptr;
1774
1775 // It matched! Lets insert the new comparison just before select.
1777 IC.Builder.SetInsertPoint(&Sel);
1778
1779 Pred = ICmpInst::getSwappedPredicate(Pred); // Yes, swapped.
1780 Value *NewCmp = IC.Builder.CreateICmp(Pred, X, FlippedStrictness->second,
1781 Cmp.getName() + ".inv");
1782 IC.replaceOperand(Sel, 0, NewCmp);
1783 Sel.swapValues();
1784 Sel.swapProfMetadata();
1785
1786 return &Sel;
1787}
1788
1789static Instruction *foldSelectZeroOrOnes(ICmpInst *Cmp, Value *TVal,
1790 Value *FVal,
1791 InstCombiner::BuilderTy &Builder) {
1792 if (!Cmp->hasOneUse())
1793 return nullptr;
1794
1795 const APInt *CmpC;
1796 if (!match(Cmp->getOperand(1), m_APIntAllowPoison(CmpC)))
1797 return nullptr;
1798
1799 // (X u< 2) ? -X : -1 --> sext (X != 0)
1800 Value *X = Cmp->getOperand(0);
1801 if (Cmp->getPredicate() == ICmpInst::ICMP_ULT && *CmpC == 2 &&
1802 match(TVal, m_Neg(m_Specific(X))) && match(FVal, m_AllOnes()))
1803 return new SExtInst(Builder.CreateIsNotNull(X), TVal->getType());
1804
1805 // (X u> 1) ? -1 : -X --> sext (X != 0)
1806 if (Cmp->getPredicate() == ICmpInst::ICMP_UGT && *CmpC == 1 &&
1807 match(FVal, m_Neg(m_Specific(X))) && match(TVal, m_AllOnes()))
1808 return new SExtInst(Builder.CreateIsNotNull(X), TVal->getType());
1809
1810 return nullptr;
1811}
1812
1813static Value *foldSelectInstWithICmpConst(SelectInst &SI, ICmpInst *ICI,
1814 InstCombiner::BuilderTy &Builder) {
1815 const APInt *CmpC;
1816 Value *V;
1817 CmpPredicate Pred;
1818 if (!match(ICI, m_ICmp(Pred, m_Value(V), m_APInt(CmpC))))
1819 return nullptr;
1820
1821 // Match clamp away from min/max value as a max/min operation.
1822 Value *TVal = SI.getTrueValue();
1823 Value *FVal = SI.getFalseValue();
1824 if (Pred == ICmpInst::ICMP_EQ && V == FVal) {
1825 // (V == UMIN) ? UMIN+1 : V --> umax(V, UMIN+1)
1826 if (CmpC->isMinValue() && match(TVal, m_SpecificInt(*CmpC + 1)))
1827 return Builder.CreateBinaryIntrinsic(Intrinsic::umax, V, TVal);
1828 // (V == UMAX) ? UMAX-1 : V --> umin(V, UMAX-1)
1829 if (CmpC->isMaxValue() && match(TVal, m_SpecificInt(*CmpC - 1)))
1830 return Builder.CreateBinaryIntrinsic(Intrinsic::umin, V, TVal);
1831 // (V == SMIN) ? SMIN+1 : V --> smax(V, SMIN+1)
1832 if (CmpC->isMinSignedValue() && match(TVal, m_SpecificInt(*CmpC + 1)))
1833 return Builder.CreateBinaryIntrinsic(Intrinsic::smax, V, TVal);
1834 // (V == SMAX) ? SMAX-1 : V --> smin(V, SMAX-1)
1835 if (CmpC->isMaxSignedValue() && match(TVal, m_SpecificInt(*CmpC - 1)))
1836 return Builder.CreateBinaryIntrinsic(Intrinsic::smin, V, TVal);
1837 }
1838
1839 // Fold icmp(X) ? f(X) : C to f(X) when f(X) is guaranteed to be equal to C
1840 // for all X in the exact range of the inverse predicate.
1841 Instruction *Op;
1842 const APInt *C;
1843 CmpInst::Predicate CPred;
1845 CPred = ICI->getPredicate();
1846 else if (match(&SI, m_Select(m_Specific(ICI), m_Instruction(Op), m_APInt(C))))
1847 CPred = ICI->getInversePredicate();
1848 else
1849 return nullptr;
1850
1851 ConstantRange InvDomCR = ConstantRange::makeExactICmpRegion(CPred, *CmpC);
1852 const APInt *OpC;
1853 if (match(Op, m_BinOp(m_Specific(V), m_APInt(OpC)))) {
1854 ConstantRange R = InvDomCR.binaryOp(
1855 static_cast<Instruction::BinaryOps>(Op->getOpcode()), *OpC);
1856 if (R == *C) {
1857 Op->dropPoisonGeneratingFlags();
1858 return Op;
1859 }
1860 }
1861 if (auto *MMI = dyn_cast<MinMaxIntrinsic>(Op);
1862 MMI && MMI->getLHS() == V && match(MMI->getRHS(), m_APInt(OpC))) {
1863 ConstantRange R = ConstantRange::intrinsic(MMI->getIntrinsicID(),
1864 {InvDomCR, ConstantRange(*OpC)});
1865 if (R == *C) {
1866 MMI->dropPoisonGeneratingAnnotations();
1867 return MMI;
1868 }
1869 }
1870
1871 return nullptr;
1872}
1873
1874/// `A == MIN_INT ? B != MIN_INT : A < B` --> `A < B`
1875/// `A == MAX_INT ? B != MAX_INT : A > B` --> `A > B`
1876static Instruction *foldSelectWithExtremeEqCond(Value *CmpLHS, Value *CmpRHS,
1877 Value *TrueVal,
1878 Value *FalseVal) {
1879 Type *Ty = CmpLHS->getType();
1880
1881 if (Ty->isPtrOrPtrVectorTy())
1882 return nullptr;
1883
1884 CmpPredicate Pred;
1885 Value *B;
1886
1887 if (!match(FalseVal, m_c_ICmp(Pred, m_Specific(CmpLHS), m_Value(B))))
1888 return nullptr;
1889
1890 Value *TValRHS;
1892 m_Value(TValRHS))))
1893 return nullptr;
1894
1895 APInt C;
1896 unsigned BitWidth = Ty->getScalarSizeInBits();
1897
1898 if (ICmpInst::isLT(Pred)) {
1901 } else if (ICmpInst::isGT(Pred)) {
1904 } else {
1905 return nullptr;
1906 }
1907
1908 if (!match(CmpRHS, m_SpecificInt(C)) || !match(TValRHS, m_SpecificInt(C)))
1909 return nullptr;
1910
1911 return new ICmpInst(Pred, CmpLHS, B);
1912}
1913
1914static Instruction *foldSelectICmpEq(SelectInst &SI, ICmpInst *ICI,
1915 InstCombinerImpl &IC) {
1916 ICmpInst::Predicate Pred = ICI->getPredicate();
1917 if (!ICmpInst::isEquality(Pred))
1918 return nullptr;
1919
1920 Value *TrueVal = SI.getTrueValue();
1921 Value *FalseVal = SI.getFalseValue();
1922 Value *CmpLHS = ICI->getOperand(0);
1923 Value *CmpRHS = ICI->getOperand(1);
1924
1925 if (Pred == ICmpInst::ICMP_NE)
1926 std::swap(TrueVal, FalseVal);
1927
1928 if (Instruction *Res =
1929 foldSelectWithExtremeEqCond(CmpLHS, CmpRHS, TrueVal, FalseVal))
1930 return Res;
1931
1932 return nullptr;
1933}
1934
1935/// Fold `X Pred C1 ? X BOp C2 : C1 BOp C2` to `min/max(X, C1) BOp C2`.
1936/// This allows for better canonicalization.
1938 Value *TrueVal,
1939 Value *FalseVal) {
1940 Constant *C1, *C2, *C3;
1941 Value *X;
1942 CmpPredicate Predicate;
1943
1944 if (!match(Cmp, m_ICmp(Predicate, m_Value(X), m_Constant(C1))))
1945 return nullptr;
1946
1947 if (!ICmpInst::isRelational(Predicate))
1948 return nullptr;
1949
1950 if (match(TrueVal, m_Constant())) {
1951 std::swap(FalseVal, TrueVal);
1953 }
1954
1955 if (!match(FalseVal, m_Constant(C3)) || !TrueVal->hasOneUse())
1956 return nullptr;
1957
1958 bool IsIntrinsic;
1959 unsigned Opcode;
1960 if (BinaryOperator *BOp = dyn_cast<BinaryOperator>(TrueVal)) {
1961 Opcode = BOp->getOpcode();
1962 IsIntrinsic = false;
1963
1964 // This fold causes some regressions and is primarily intended for
1965 // add and sub. So we early exit for div and rem to minimize the
1966 // regressions.
1967 if (Instruction::isIntDivRem(Opcode))
1968 return nullptr;
1969
1970 if (!match(BOp, m_BinOp(m_Specific(X), m_Constant(C2))))
1971 return nullptr;
1972
1973 } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(TrueVal)) {
1974 if (!match(II, m_MaxOrMin(m_Specific(X), m_Constant(C2))))
1975 return nullptr;
1976 Opcode = II->getIntrinsicID();
1977 IsIntrinsic = true;
1978 } else {
1979 return nullptr;
1980 }
1981
1982 Value *RHS;
1984 const DataLayout &DL = Cmp->getDataLayout();
1985 auto Flipped = getFlippedStrictnessPredicateAndConstant(Predicate, C1);
1986
1987 auto FoldBinaryOpOrIntrinsic = [&](Constant *LHS, Constant *RHS) {
1988 return IsIntrinsic ? ConstantFoldBinaryIntrinsic(Opcode, LHS, RHS,
1989 LHS->getType(), nullptr)
1991 };
1992
1993 if (C3 == FoldBinaryOpOrIntrinsic(C1, C2)) {
1994 SPF = getSelectPattern(Predicate).Flavor;
1995 RHS = C1;
1996 } else if (Flipped && C3 == FoldBinaryOpOrIntrinsic(Flipped->second, C2)) {
1997 SPF = getSelectPattern(Flipped->first).Flavor;
1998 RHS = Flipped->second;
1999 } else {
2000 return nullptr;
2001 }
2002
2003 Intrinsic::ID MinMaxID = getMinMaxIntrinsic(SPF);
2004 Value *MinMax = Builder.CreateBinaryIntrinsic(MinMaxID, X, RHS);
2005 if (IsIntrinsic)
2006 return Builder.CreateBinaryIntrinsic(Opcode, MinMax, C2);
2007
2008 const auto BinOpc = Instruction::BinaryOps(Opcode);
2009 Value *BinOp = Builder.CreateBinOp(BinOpc, MinMax, C2);
2010
2011 // If we can attach no-wrap flags to the new instruction, do so if the
2012 // old instruction had them and C1 BinOp C2 does not overflow.
2013 if (Instruction *BinOpInst = dyn_cast<Instruction>(BinOp)) {
2014 if (BinOpc == Instruction::Add || BinOpc == Instruction::Sub ||
2015 BinOpc == Instruction::Mul) {
2016 Instruction *OldBinOp = cast<BinaryOperator>(TrueVal);
2017 if (OldBinOp->hasNoSignedWrap() &&
2018 willNotOverflow(BinOpc, RHS, C2, *BinOpInst, /*IsSigned=*/true))
2019 BinOpInst->setHasNoSignedWrap();
2020 if (OldBinOp->hasNoUnsignedWrap() &&
2021 willNotOverflow(BinOpc, RHS, C2, *BinOpInst, /*IsSigned=*/false))
2022 BinOpInst->setHasNoUnsignedWrap();
2023 }
2024 }
2025 return BinOp;
2026}
2027
2028/// Folds:
2029/// %a_sub = call @llvm.usub.sat(x, IntConst1)
2030/// %b_sub = call @llvm.usub.sat(y, IntConst2)
2031/// %or = or %a_sub, %b_sub
2032/// %cmp = icmp eq %or, 0
2033/// %sel = select %cmp, 0, MostSignificantBit
2034/// into:
2035/// %a_sub' = usub.sat(x, IntConst1 - MostSignificantBit)
2036/// %b_sub' = usub.sat(y, IntConst2 - MostSignificantBit)
2037/// %or = or %a_sub', %b_sub'
2038/// %and = and %or, MostSignificantBit
2039/// Likewise, for vector arguments as well.
2040static Instruction *foldICmpUSubSatWithAndForMostSignificantBitCmp(
2041 SelectInst &SI, ICmpInst *ICI, InstCombiner::BuilderTy &Builder) {
2042 if (!SI.hasOneUse() || !ICI->hasOneUse())
2043 return nullptr;
2044 CmpPredicate Pred;
2045 Value *A, *B;
2046 const APInt *Constant1, *Constant2;
2047 if (!match(SI.getCondition(),
2048 m_ICmp(Pred,
2050 m_Value(A), m_APInt(Constant1))),
2052 m_Value(B), m_APInt(Constant2))))),
2053 m_Zero())))
2054 return nullptr;
2055
2056 Value *TrueVal = SI.getTrueValue();
2057 Value *FalseVal = SI.getFalseValue();
2058 if (!(Pred == ICmpInst::ICMP_EQ &&
2059 (match(TrueVal, m_Zero()) && match(FalseVal, m_SignMask()))) ||
2060 (Pred == ICmpInst::ICMP_NE &&
2061 (match(TrueVal, m_SignMask()) && match(FalseVal, m_Zero()))))
2062 return nullptr;
2063
2064 auto *Ty = A->getType();
2065 unsigned BW = Constant1->getBitWidth();
2066 APInt MostSignificantBit = APInt::getSignMask(BW);
2067
2068 // Anything over MSB is negative
2069 if (Constant1->isNonNegative() || Constant2->isNonNegative())
2070 return nullptr;
2071
2072 APInt AdjAP1 = *Constant1 - MostSignificantBit + 1;
2073 APInt AdjAP2 = *Constant2 - MostSignificantBit + 1;
2074
2075 auto *Adj1 = ConstantInt::get(Ty, AdjAP1);
2076 auto *Adj2 = ConstantInt::get(Ty, AdjAP2);
2077
2078 Value *NewA = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A, Adj1);
2079 Value *NewB = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, B, Adj2);
2080 Value *Or = Builder.CreateOr(NewA, NewB);
2081 Constant *MSBConst = ConstantInt::get(Ty, MostSignificantBit);
2082 return BinaryOperator::CreateAnd(Or, MSBConst);
2083}
2084
2085/// Visit a SelectInst that has an ICmpInst as its first operand.
2087 ICmpInst *ICI) {
2088 if (Value *V =
2089 canonicalizeSPF(*ICI, SI.getTrueValue(), SI.getFalseValue(), *this))
2090 return replaceInstUsesWith(SI, V);
2091
2092 if (Value *V = foldSelectInstWithICmpConst(SI, ICI, Builder))
2093 return replaceInstUsesWith(SI, V);
2094
2095 if (Value *V = canonicalizeClampLike(SI, *ICI, Builder, *this))
2096 return replaceInstUsesWith(SI, V);
2097
2098 if (Instruction *NewSel =
2099 tryToReuseConstantFromSelectInComparison(SI, *ICI, *this))
2100 return NewSel;
2101 if (Instruction *Folded =
2102 foldICmpUSubSatWithAndForMostSignificantBitCmp(SI, ICI, Builder))
2103 return Folded;
2104
2105 // NOTE: if we wanted to, this is where to detect integer MIN/MAX
2106 bool Changed = false;
2107 Value *TrueVal = SI.getTrueValue();
2108 Value *FalseVal = SI.getFalseValue();
2109 ICmpInst::Predicate Pred = ICI->getPredicate();
2110 Value *CmpLHS = ICI->getOperand(0);
2111 Value *CmpRHS = ICI->getOperand(1);
2112
2113 if (Instruction *NewSel = foldSelectICmpEq(SI, ICI, *this))
2114 return NewSel;
2115
2116 // Canonicalize a signbit condition to use zero constant by swapping:
2117 // (CmpLHS > -1) ? TV : FV --> (CmpLHS < 0) ? FV : TV
2118 // To avoid conflicts (infinite loops) with other canonicalizations, this is
2119 // not applied with any constant select arm.
2120 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, m_AllOnes()) &&
2121 !match(TrueVal, m_Constant()) && !match(FalseVal, m_Constant()) &&
2122 ICI->hasOneUse()) {
2123 InstCombiner::BuilderTy::InsertPointGuard Guard(Builder);
2124 Builder.SetInsertPoint(&SI);
2125 Value *IsNeg = Builder.CreateIsNeg(CmpLHS, ICI->getName());
2126 replaceOperand(SI, 0, IsNeg);
2127 SI.swapValues();
2128 SI.swapProfMetadata();
2129 return &SI;
2130 }
2131
2132 if (Value *V = foldSelectICmpMinMax(ICI, TrueVal, FalseVal, Builder, SQ))
2133 return replaceInstUsesWith(SI, V);
2134
2135 if (Instruction *V =
2136 foldSelectICmpAndAnd(SI.getType(), ICI, TrueVal, FalseVal, Builder))
2137 return V;
2138
2139 if (Value *V = foldSelectICmpAndZeroShl(ICI, TrueVal, FalseVal, Builder))
2140 return replaceInstUsesWith(SI, V);
2141
2142 if (Instruction *V = foldSelectCtlzToCttz(ICI, TrueVal, FalseVal, Builder))
2143 return V;
2144
2145 if (Instruction *V = foldSelectZeroOrOnes(ICI, TrueVal, FalseVal, Builder))
2146 return V;
2147
2148 if (Value *V = foldSelectICmpLshrAshr(ICI, TrueVal, FalseVal, Builder))
2149 return replaceInstUsesWith(SI, V);
2150
2151 if (Value *V = foldSelectCttzCtlz(ICI, TrueVal, FalseVal, *this))
2152 return replaceInstUsesWith(SI, V);
2153
2154 if (Value *V = canonicalizeSaturatedSubtract(ICI, TrueVal, FalseVal, Builder))
2155 return replaceInstUsesWith(SI, V);
2156
2157 if (Value *V = canonicalizeSaturatedAdd(ICI, TrueVal, FalseVal, Builder))
2158 return replaceInstUsesWith(SI, V);
2159
2160 if (Value *V = foldAbsDiff(ICI, TrueVal, FalseVal, Builder))
2161 return replaceInstUsesWith(SI, V);
2162
2163 if (Value *V = foldSelectWithConstOpToBinOp(ICI, TrueVal, FalseVal))
2164 return replaceInstUsesWith(SI, V);
2165
2166 return Changed ? &SI : nullptr;
2167}
2168
2169/// We have an SPF (e.g. a min or max) of an SPF of the form:
2170/// SPF2(SPF1(A, B), C)
2173 Value *B, Instruction &Outer,
2175 Value *C) {
2176 if (Outer.getType() != Inner->getType())
2177 return nullptr;
2178
2179 if (C == A || C == B) {
2180 // MAX(MAX(A, B), B) -> MAX(A, B)
2181 // MIN(MIN(a, b), a) -> MIN(a, b)
2182 // TODO: This could be done in instsimplify.
2183 if (SPF1 == SPF2 && SelectPatternResult::isMinOrMax(SPF1))
2184 return replaceInstUsesWith(Outer, Inner);
2185 }
2186
2187 return nullptr;
2188}
2189
2190/// Turn select C, (X + Y), (X - Y) --> (X + (select C, Y, (-Y))).
2191/// This is even legal for FP.
2192static Instruction *foldAddSubSelect(SelectInst &SI,
2193 InstCombiner::BuilderTy &Builder) {
2194 Value *CondVal = SI.getCondition();
2195 Value *TrueVal = SI.getTrueValue();
2196 Value *FalseVal = SI.getFalseValue();
2197 auto *TI = dyn_cast<Instruction>(TrueVal);
2198 auto *FI = dyn_cast<Instruction>(FalseVal);
2199 if (!TI || !FI || !TI->hasOneUse() || !FI->hasOneUse())
2200 return nullptr;
2201
2202 Instruction *AddOp = nullptr, *SubOp = nullptr;
2203 if ((TI->getOpcode() == Instruction::Sub &&
2204 FI->getOpcode() == Instruction::Add) ||
2205 (TI->getOpcode() == Instruction::FSub &&
2206 FI->getOpcode() == Instruction::FAdd)) {
2207 AddOp = FI;
2208 SubOp = TI;
2209 } else if ((FI->getOpcode() == Instruction::Sub &&
2210 TI->getOpcode() == Instruction::Add) ||
2211 (FI->getOpcode() == Instruction::FSub &&
2212 TI->getOpcode() == Instruction::FAdd)) {
2213 AddOp = TI;
2214 SubOp = FI;
2215 }
2216
2217 if (AddOp) {
2218 Value *OtherAddOp = nullptr;
2219 if (SubOp->getOperand(0) == AddOp->getOperand(0)) {
2220 OtherAddOp = AddOp->getOperand(1);
2221 } else if (SubOp->getOperand(0) == AddOp->getOperand(1)) {
2222 OtherAddOp = AddOp->getOperand(0);
2223 }
2224
2225 if (OtherAddOp) {
2226 // So at this point we know we have (Y -> OtherAddOp):
2227 // select C, (add X, Y), (sub X, Z)
2228 Value *NegVal; // Compute -Z
2229 if (SI.getType()->isFPOrFPVectorTy()) {
2230 NegVal = Builder.CreateFNeg(SubOp->getOperand(1));
2231 if (Instruction *NegInst = dyn_cast<Instruction>(NegVal)) {
2233 Flags &= SubOp->getFastMathFlags();
2234 NegInst->setFastMathFlags(Flags);
2235 }
2236 } else {
2237 NegVal = Builder.CreateNeg(SubOp->getOperand(1));
2238 }
2239
2240 Value *NewTrueOp = OtherAddOp;
2241 Value *NewFalseOp = NegVal;
2242 if (AddOp != TI)
2243 std::swap(NewTrueOp, NewFalseOp);
2244 Value *NewSel = Builder.CreateSelect(CondVal, NewTrueOp, NewFalseOp,
2245 SI.getName() + ".p", &SI);
2246
2247 if (SI.getType()->isFPOrFPVectorTy()) {
2248 Instruction *RI =
2249 BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel);
2250
2252 Flags &= SubOp->getFastMathFlags();
2253 RI->setFastMathFlags(Flags);
2254 return RI;
2255 } else
2256 return BinaryOperator::CreateAdd(SubOp->getOperand(0), NewSel);
2257 }
2258 }
2259 return nullptr;
2260}
2261
2262/// Turn X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
2263/// And X - Y overflows ? 0 : X - Y -> usub_sat X, Y
2264/// Along with a number of patterns similar to:
2265/// X + Y overflows ? (X < 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2266/// X - Y overflows ? (X > 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2267static Instruction *
2268foldOverflowingAddSubSelect(SelectInst &SI, InstCombiner::BuilderTy &Builder) {
2269 Value *CondVal = SI.getCondition();
2270 Value *TrueVal = SI.getTrueValue();
2271 Value *FalseVal = SI.getFalseValue();
2272
2274 if (!match(CondVal, m_ExtractValue<1>(m_WithOverflowInst(II))) ||
2275 !match(FalseVal, m_ExtractValue<0>(m_Specific(II))))
2276 return nullptr;
2277
2278 Value *X = II->getLHS();
2279 Value *Y = II->getRHS();
2280
2281 auto IsSignedSaturateLimit = [&](Value *Limit, bool IsAdd) {
2282 Type *Ty = Limit->getType();
2283
2284 CmpPredicate Pred;
2285 Value *TrueVal, *FalseVal, *Op;
2286 const APInt *C;
2287 if (!match(Limit, m_Select(m_ICmp(Pred, m_Value(Op), m_APInt(C)),
2288 m_Value(TrueVal), m_Value(FalseVal))))
2289 return false;
2290
2291 auto IsZeroOrOne = [](const APInt &C) { return C.isZero() || C.isOne(); };
2292 auto IsMinMax = [&](Value *Min, Value *Max) {
2295 return match(Min, m_SpecificInt(MinVal)) &&
2296 match(Max, m_SpecificInt(MaxVal));
2297 };
2298
2299 if (Op != X && Op != Y)
2300 return false;
2301
2302 if (IsAdd) {
2303 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2304 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2305 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2306 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2307 if (Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C) &&
2308 IsMinMax(TrueVal, FalseVal))
2309 return true;
2310 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2311 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2312 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2313 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2314 if (Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 1) &&
2315 IsMinMax(FalseVal, TrueVal))
2316 return true;
2317 } else {
2318 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2319 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2320 if (Op == X && Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C + 1) &&
2321 IsMinMax(TrueVal, FalseVal))
2322 return true;
2323 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2324 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2325 if (Op == X && Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 2) &&
2326 IsMinMax(FalseVal, TrueVal))
2327 return true;
2328 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2329 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2330 if (Op == Y && Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C) &&
2331 IsMinMax(FalseVal, TrueVal))
2332 return true;
2333 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2334 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2335 if (Op == Y && Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 1) &&
2336 IsMinMax(TrueVal, FalseVal))
2337 return true;
2338 }
2339
2340 return false;
2341 };
2342
2343 Intrinsic::ID NewIntrinsicID;
2344 if (II->getIntrinsicID() == Intrinsic::uadd_with_overflow &&
2345 match(TrueVal, m_AllOnes()))
2346 // X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
2347 NewIntrinsicID = Intrinsic::uadd_sat;
2348 else if (II->getIntrinsicID() == Intrinsic::usub_with_overflow &&
2349 match(TrueVal, m_Zero()))
2350 // X - Y overflows ? 0 : X - Y -> usub_sat X, Y
2351 NewIntrinsicID = Intrinsic::usub_sat;
2352 else if (II->getIntrinsicID() == Intrinsic::sadd_with_overflow &&
2353 IsSignedSaturateLimit(TrueVal, /*IsAdd=*/true))
2354 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2355 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2356 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2357 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2358 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2359 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2360 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2361 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2362 NewIntrinsicID = Intrinsic::sadd_sat;
2363 else if (II->getIntrinsicID() == Intrinsic::ssub_with_overflow &&
2364 IsSignedSaturateLimit(TrueVal, /*IsAdd=*/false))
2365 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2366 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2367 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2368 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2369 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2370 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2371 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2372 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2373 NewIntrinsicID = Intrinsic::ssub_sat;
2374 else
2375 return nullptr;
2376
2378 NewIntrinsicID, SI.getType());
2379 return CallInst::Create(F, {X, Y});
2380}
2381
2383 Constant *C;
2384 if (!match(Sel.getTrueValue(), m_Constant(C)) &&
2385 !match(Sel.getFalseValue(), m_Constant(C)))
2386 return nullptr;
2387
2388 Instruction *ExtInst;
2389 if (!match(Sel.getTrueValue(), m_Instruction(ExtInst)) &&
2390 !match(Sel.getFalseValue(), m_Instruction(ExtInst)))
2391 return nullptr;
2392
2393 auto ExtOpcode = ExtInst->getOpcode();
2394 if (ExtOpcode != Instruction::ZExt && ExtOpcode != Instruction::SExt)
2395 return nullptr;
2396
2397 // If we are extending from a boolean type or if we can create a select that
2398 // has the same size operands as its condition, try to narrow the select.
2399 Value *X = ExtInst->getOperand(0);
2400 Type *SmallType = X->getType();
2401 Value *Cond = Sel.getCondition();
2402 auto *Cmp = dyn_cast<CmpInst>(Cond);
2403 if (!SmallType->isIntOrIntVectorTy(1) &&
2404 (!Cmp || Cmp->getOperand(0)->getType() != SmallType))
2405 return nullptr;
2406
2407 // If the constant is the same after truncation to the smaller type and
2408 // extension to the original type, we can narrow the select.
2409 Type *SelType = Sel.getType();
2410 Constant *TruncC = getLosslessInvCast(C, SmallType, ExtOpcode, DL);
2411 if (TruncC && ExtInst->hasOneUse()) {
2412 Value *TruncCVal = cast<Value>(TruncC);
2413 if (ExtInst == Sel.getFalseValue())
2414 std::swap(X, TruncCVal);
2415
2416 // select Cond, (ext X), C --> ext(select Cond, X, C')
2417 // select Cond, C, (ext X) --> ext(select Cond, C', X)
2418 Value *NewSel = Builder.CreateSelect(Cond, X, TruncCVal, "narrow", &Sel);
2419 return CastInst::Create(Instruction::CastOps(ExtOpcode), NewSel, SelType);
2420 }
2421
2422 return nullptr;
2423}
2424
2425/// Try to transform a vector select with a constant condition vector into a
2426/// shuffle for easier combining with other shuffles and insert/extract.
2427static Instruction *canonicalizeSelectToShuffle(SelectInst &SI) {
2428 Value *CondVal = SI.getCondition();
2429 Constant *CondC;
2430 auto *CondValTy = dyn_cast<FixedVectorType>(CondVal->getType());
2431 if (!CondValTy || !match(CondVal, m_Constant(CondC)))
2432 return nullptr;
2433
2434 unsigned NumElts = CondValTy->getNumElements();
2436 Mask.reserve(NumElts);
2437 for (unsigned i = 0; i != NumElts; ++i) {
2438 Constant *Elt = CondC->getAggregateElement(i);
2439 if (!Elt)
2440 return nullptr;
2441
2442 if (Elt->isOneValue()) {
2443 // If the select condition element is true, choose from the 1st vector.
2444 Mask.push_back(i);
2445 } else if (Elt->isNullValue()) {
2446 // If the select condition element is false, choose from the 2nd vector.
2447 Mask.push_back(i + NumElts);
2448 } else if (isa<UndefValue>(Elt)) {
2449 // Undef in a select condition (choose one of the operands) does not mean
2450 // the same thing as undef in a shuffle mask (any value is acceptable), so
2451 // give up.
2452 return nullptr;
2453 } else {
2454 // Bail out on a constant expression.
2455 return nullptr;
2456 }
2457 }
2458
2459 return new ShuffleVectorInst(SI.getTrueValue(), SI.getFalseValue(), Mask);
2460}
2461
2462/// If we have a select of vectors with a scalar condition, try to convert that
2463/// to a vector select by splatting the condition. A splat may get folded with
2464/// other operations in IR and having all operands of a select be vector types
2465/// is likely better for vector codegen.
2466static Instruction *canonicalizeScalarSelectOfVecs(SelectInst &Sel,
2467 InstCombinerImpl &IC) {
2468 auto *Ty = dyn_cast<VectorType>(Sel.getType());
2469 if (!Ty)
2470 return nullptr;
2471
2472 // We can replace a single-use extract with constant index.
2473 Value *Cond = Sel.getCondition();
2475 return nullptr;
2476
2477 // select (extelt V, Index), T, F --> select (splat V, Index), T, F
2478 // Splatting the extracted condition reduces code (we could directly create a
2479 // splat shuffle of the source vector to eliminate the intermediate step).
2480 return IC.replaceOperand(
2481 Sel, 0, IC.Builder.CreateVectorSplat(Ty->getElementCount(), Cond));
2482}
2483
2484/// Reuse bitcasted operands between a compare and select:
2485/// select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2486/// bitcast (select (cmp (bitcast C), (bitcast D)), (bitcast C), (bitcast D))
2487static Instruction *foldSelectCmpBitcasts(SelectInst &Sel,
2488 InstCombiner::BuilderTy &Builder) {
2489 Value *Cond = Sel.getCondition();
2490 Value *TVal = Sel.getTrueValue();
2491 Value *FVal = Sel.getFalseValue();
2492
2493 CmpPredicate Pred;
2494 Value *A, *B;
2495 if (!match(Cond, m_Cmp(Pred, m_Value(A), m_Value(B))))
2496 return nullptr;
2497
2498 // The select condition is a compare instruction. If the select's true/false
2499 // values are already the same as the compare operands, there's nothing to do.
2500 if (TVal == A || TVal == B || FVal == A || FVal == B)
2501 return nullptr;
2502
2503 Value *C, *D;
2504 if (!match(A, m_BitCast(m_Value(C))) || !match(B, m_BitCast(m_Value(D))))
2505 return nullptr;
2506
2507 // select (cmp (bitcast C), (bitcast D)), (bitcast TSrc), (bitcast FSrc)
2508 Value *TSrc, *FSrc;
2509 if (!match(TVal, m_BitCast(m_Value(TSrc))) ||
2510 !match(FVal, m_BitCast(m_Value(FSrc))))
2511 return nullptr;
2512
2513 // If the select true/false values are *different bitcasts* of the same source
2514 // operands, make the select operands the same as the compare operands and
2515 // cast the result. This is the canonical select form for min/max.
2516 Value *NewSel;
2517 if (TSrc == C && FSrc == D) {
2518 // select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2519 // bitcast (select (cmp A, B), A, B)
2520 NewSel = Builder.CreateSelect(Cond, A, B, "", &Sel);
2521 } else if (TSrc == D && FSrc == C) {
2522 // select (cmp (bitcast C), (bitcast D)), (bitcast' D), (bitcast' C) -->
2523 // bitcast (select (cmp A, B), B, A)
2524 NewSel = Builder.CreateSelect(Cond, B, A, "", &Sel);
2525 } else {
2526 return nullptr;
2527 }
2528 return new BitCastInst(NewSel, Sel.getType());
2529}
2530
2531/// Try to eliminate select instructions that test the returned flag of cmpxchg
2532/// instructions.
2533///
2534/// If a select instruction tests the returned flag of a cmpxchg instruction and
2535/// selects between the returned value of the cmpxchg instruction its compare
2536/// operand, the result of the select will always be equal to its false value.
2537/// For example:
2538///
2539/// %cmpxchg = cmpxchg ptr %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2540/// %val = extractvalue { i64, i1 } %cmpxchg, 0
2541/// %success = extractvalue { i64, i1 } %cmpxchg, 1
2542/// %sel = select i1 %success, i64 %compare, i64 %val
2543/// ret i64 %sel
2544///
2545/// The returned value of the cmpxchg instruction (%val) is the original value
2546/// located at %ptr prior to any update. If the cmpxchg operation succeeds, %val
2547/// must have been equal to %compare. Thus, the result of the select is always
2548/// equal to %val, and the code can be simplified to:
2549///
2550/// %cmpxchg = cmpxchg ptr %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2551/// %val = extractvalue { i64, i1 } %cmpxchg, 0
2552/// ret i64 %val
2553///
2554static Value *foldSelectCmpXchg(SelectInst &SI) {
2555 // A helper that determines if V is an extractvalue instruction whose
2556 // aggregate operand is a cmpxchg instruction and whose single index is equal
2557 // to I. If such conditions are true, the helper returns the cmpxchg
2558 // instruction; otherwise, a nullptr is returned.
2559 auto isExtractFromCmpXchg = [](Value *V, unsigned I) -> AtomicCmpXchgInst * {
2560 auto *Extract = dyn_cast<ExtractValueInst>(V);
2561 if (!Extract)
2562 return nullptr;
2563 if (Extract->getIndices()[0] != I)
2564 return nullptr;
2565 return dyn_cast<AtomicCmpXchgInst>(Extract->getAggregateOperand());
2566 };
2567
2568 // If the select has a single user, and this user is a select instruction that
2569 // we can simplify, skip the cmpxchg simplification for now.
2570 if (SI.hasOneUse())
2571 if (auto *Select = dyn_cast<SelectInst>(SI.user_back()))
2572 if (Select->getCondition() == SI.getCondition())
2573 if (Select->getFalseValue() == SI.getTrueValue() ||
2574 Select->getTrueValue() == SI.getFalseValue())
2575 return nullptr;
2576
2577 // Ensure the select condition is the returned flag of a cmpxchg instruction.
2578 auto *CmpXchg = isExtractFromCmpXchg(SI.getCondition(), 1);
2579 if (!CmpXchg)
2580 return nullptr;
2581
2582 // Check the true value case: The true value of the select is the returned
2583 // value of the same cmpxchg used by the condition, and the false value is the
2584 // cmpxchg instruction's compare operand.
2585 if (auto *X = isExtractFromCmpXchg(SI.getTrueValue(), 0))
2586 if (X == CmpXchg && X->getCompareOperand() == SI.getFalseValue())
2587 return SI.getFalseValue();
2588
2589 // Check the false value case: The false value of the select is the returned
2590 // value of the same cmpxchg used by the condition, and the true value is the
2591 // cmpxchg instruction's compare operand.
2592 if (auto *X = isExtractFromCmpXchg(SI.getFalseValue(), 0))
2593 if (X == CmpXchg && X->getCompareOperand() == SI.getTrueValue())
2594 return SI.getFalseValue();
2595
2596 return nullptr;
2597}
2598
2599/// Try to reduce a funnel/rotate pattern that includes a compare and select
2600/// into a funnel shift intrinsic. Example:
2601/// rotl32(a, b) --> (b == 0 ? a : ((a >> (32 - b)) | (a << b)))
2602/// --> call llvm.fshl.i32(a, a, b)
2603/// fshl32(a, b, c) --> (c == 0 ? a : ((b >> (32 - c)) | (a << c)))
2604/// --> call llvm.fshl.i32(a, b, c)
2605/// fshr32(a, b, c) --> (c == 0 ? b : ((a >> (32 - c)) | (b << c)))
2606/// --> call llvm.fshr.i32(a, b, c)
2607static Instruction *foldSelectFunnelShift(SelectInst &Sel,
2608 InstCombiner::BuilderTy &Builder) {
2609 // This must be a power-of-2 type for a bitmasking transform to be valid.
2610 unsigned Width = Sel.getType()->getScalarSizeInBits();
2611 if (!isPowerOf2_32(Width))
2612 return nullptr;
2613
2614 BinaryOperator *Or0, *Or1;
2615 if (!match(Sel.getFalseValue(), m_OneUse(m_Or(m_BinOp(Or0), m_BinOp(Or1)))))
2616 return nullptr;
2617
2618 Value *SV0, *SV1, *SA0, *SA1;
2619 if (!match(Or0, m_OneUse(m_LogicalShift(m_Value(SV0),
2620 m_ZExtOrSelf(m_Value(SA0))))) ||
2622 m_ZExtOrSelf(m_Value(SA1))))) ||
2623 Or0->getOpcode() == Or1->getOpcode())
2624 return nullptr;
2625
2626 // Canonicalize to or(shl(SV0, SA0), lshr(SV1, SA1)).
2627 if (Or0->getOpcode() == BinaryOperator::LShr) {
2628 std::swap(Or0, Or1);
2629 std::swap(SV0, SV1);
2630 std::swap(SA0, SA1);
2631 }
2632 assert(Or0->getOpcode() == BinaryOperator::Shl &&
2633 Or1->getOpcode() == BinaryOperator::LShr &&
2634 "Illegal or(shift,shift) pair");
2635
2636 // Check the shift amounts to see if they are an opposite pair.
2637 Value *ShAmt;
2638 if (match(SA1, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(SA0)))))
2639 ShAmt = SA0;
2640 else if (match(SA0, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(SA1)))))
2641 ShAmt = SA1;
2642 else
2643 return nullptr;
2644
2645 // We should now have this pattern:
2646 // select ?, TVal, (or (shl SV0, SA0), (lshr SV1, SA1))
2647 // The false value of the select must be a funnel-shift of the true value:
2648 // IsFShl -> TVal must be SV0 else TVal must be SV1.
2649 bool IsFshl = (ShAmt == SA0);
2650 Value *TVal = Sel.getTrueValue();
2651 if ((IsFshl && TVal != SV0) || (!IsFshl && TVal != SV1))
2652 return nullptr;
2653
2654 // Finally, see if the select is filtering out a shift-by-zero.
2655 Value *Cond = Sel.getCondition();
2657 m_ZeroInt()))))
2658 return nullptr;
2659
2660 // If this is not a rotate then the select was blocking poison from the
2661 // 'shift-by-zero' non-TVal, but a funnel shift won't - so freeze it.
2662 if (SV0 != SV1) {
2663 if (IsFshl && !llvm::isGuaranteedNotToBePoison(SV1))
2664 SV1 = Builder.CreateFreeze(SV1);
2665 else if (!IsFshl && !llvm::isGuaranteedNotToBePoison(SV0))
2666 SV0 = Builder.CreateFreeze(SV0);
2667 }
2668
2669 // This is a funnel/rotate that avoids shift-by-bitwidth UB in a suboptimal way.
2670 // Convert to funnel shift intrinsic.
2671 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
2672 Function *F =
2674 ShAmt = Builder.CreateZExt(ShAmt, Sel.getType());
2675 return CallInst::Create(F, { SV0, SV1, ShAmt });
2676}
2677
2678static Instruction *foldSelectToCopysign(SelectInst &Sel,
2679 InstCombiner::BuilderTy &Builder) {
2680 Value *Cond = Sel.getCondition();
2681 Value *TVal = Sel.getTrueValue();
2682 Value *FVal = Sel.getFalseValue();
2683 Type *SelType = Sel.getType();
2684
2685 // Match select ?, TC, FC where the constants are equal but negated.
2686 // TODO: Generalize to handle a negated variable operand?
2687 const APFloat *TC, *FC;
2688 if (!match(TVal, m_APFloatAllowPoison(TC)) ||
2689 !match(FVal, m_APFloatAllowPoison(FC)) ||
2690 !abs(*TC).bitwiseIsEqual(abs(*FC)))
2691 return nullptr;
2692
2693 assert(TC != FC && "Expected equal select arms to simplify");
2694
2695 Value *X;
2696 const APInt *C;
2697 bool IsTrueIfSignSet;
2698 CmpPredicate Pred;
2700 m_APInt(C)))) ||
2701 !isSignBitCheck(Pred, *C, IsTrueIfSignSet) || X->getType() != SelType)
2702 return nullptr;
2703
2704 // If needed, negate the value that will be the sign argument of the copysign:
2705 // (bitcast X) < 0 ? -TC : TC --> copysign(TC, X)
2706 // (bitcast X) < 0 ? TC : -TC --> copysign(TC, -X)
2707 // (bitcast X) >= 0 ? -TC : TC --> copysign(TC, -X)
2708 // (bitcast X) >= 0 ? TC : -TC --> copysign(TC, X)
2709 // Note: FMF from the select can not be propagated to the new instructions.
2710 if (IsTrueIfSignSet ^ TC->isNegative())
2711 X = Builder.CreateFNeg(X);
2712
2713 // Canonicalize the magnitude argument as the positive constant since we do
2714 // not care about its sign.
2715 Value *MagArg = ConstantFP::get(SelType, abs(*TC));
2717 Sel.getModule(), Intrinsic::copysign, Sel.getType());
2718 return CallInst::Create(F, { MagArg, X });
2719}
2720
2722 if (!isa<VectorType>(Sel.getType()))
2723 return nullptr;
2724
2725 Value *Cond = Sel.getCondition();
2726 Value *TVal = Sel.getTrueValue();
2727 Value *FVal = Sel.getFalseValue();
2728 Value *C, *X, *Y;
2729
2730 if (match(Cond, m_VecReverse(m_Value(C)))) {
2731 auto createSelReverse = [&](Value *C, Value *X, Value *Y) {
2732 Value *V = Builder.CreateSelect(C, X, Y, Sel.getName(), &Sel);
2733 if (auto *I = dyn_cast<Instruction>(V))
2734 I->copyIRFlags(&Sel);
2735 Module *M = Sel.getModule();
2737 M, Intrinsic::vector_reverse, V->getType());
2738 return CallInst::Create(F, V);
2739 };
2740
2741 if (match(TVal, m_VecReverse(m_Value(X)))) {
2742 // select rev(C), rev(X), rev(Y) --> rev(select C, X, Y)
2743 if (match(FVal, m_VecReverse(m_Value(Y))) &&
2744 (Cond->hasOneUse() || TVal->hasOneUse() || FVal->hasOneUse()))
2745 return createSelReverse(C, X, Y);
2746
2747 // select rev(C), rev(X), FValSplat --> rev(select C, X, FValSplat)
2748 if ((Cond->hasOneUse() || TVal->hasOneUse()) && isSplatValue(FVal))
2749 return createSelReverse(C, X, FVal);
2750 }
2751 // select rev(C), TValSplat, rev(Y) --> rev(select C, TValSplat, Y)
2752 else if (isSplatValue(TVal) && match(FVal, m_VecReverse(m_Value(Y))) &&
2753 (Cond->hasOneUse() || FVal->hasOneUse()))
2754 return createSelReverse(C, TVal, Y);
2755 }
2756
2757 auto *VecTy = dyn_cast<FixedVectorType>(Sel.getType());
2758 if (!VecTy)
2759 return nullptr;
2760
2761 unsigned NumElts = VecTy->getNumElements();
2762 APInt PoisonElts(NumElts, 0);
2763 APInt AllOnesEltMask(APInt::getAllOnes(NumElts));
2764 if (Value *V = SimplifyDemandedVectorElts(&Sel, AllOnesEltMask, PoisonElts)) {
2765 if (V != &Sel)
2766 return replaceInstUsesWith(Sel, V);
2767 return &Sel;
2768 }
2769
2770 // A select of a "select shuffle" with a common operand can be rearranged
2771 // to select followed by "select shuffle". Because of poison, this only works
2772 // in the case of a shuffle with no undefined mask elements.
2773 ArrayRef<int> Mask;
2774 if (match(TVal, m_OneUse(m_Shuffle(m_Value(X), m_Value(Y), m_Mask(Mask)))) &&
2775 !is_contained(Mask, PoisonMaskElem) &&
2776 cast<ShuffleVectorInst>(TVal)->isSelect()) {
2777 if (X == FVal) {
2778 // select Cond, (shuf_sel X, Y), X --> shuf_sel X, (select Cond, Y, X)
2779 Value *NewSel = Builder.CreateSelect(Cond, Y, X, "sel", &Sel);
2780 return new ShuffleVectorInst(X, NewSel, Mask);
2781 }
2782 if (Y == FVal) {
2783 // select Cond, (shuf_sel X, Y), Y --> shuf_sel (select Cond, X, Y), Y
2784 Value *NewSel = Builder.CreateSelect(Cond, X, Y, "sel", &Sel);
2785 return new ShuffleVectorInst(NewSel, Y, Mask);
2786 }
2787 }
2788 if (match(FVal, m_OneUse(m_Shuffle(m_Value(X), m_Value(Y), m_Mask(Mask)))) &&
2789 !is_contained(Mask, PoisonMaskElem) &&
2790 cast<ShuffleVectorInst>(FVal)->isSelect()) {
2791 if (X == TVal) {
2792 // select Cond, X, (shuf_sel X, Y) --> shuf_sel X, (select Cond, X, Y)
2793 Value *NewSel = Builder.CreateSelect(Cond, X, Y, "sel", &Sel);
2794 return new ShuffleVectorInst(X, NewSel, Mask);
2795 }
2796 if (Y == TVal) {
2797 // select Cond, Y, (shuf_sel X, Y) --> shuf_sel (select Cond, Y, X), Y
2798 Value *NewSel = Builder.CreateSelect(Cond, Y, X, "sel", &Sel);
2799 return new ShuffleVectorInst(NewSel, Y, Mask);
2800 }
2801 }
2802
2803 return nullptr;
2804}
2805
2806static Instruction *foldSelectToPhiImpl(SelectInst &Sel, BasicBlock *BB,
2807 const DominatorTree &DT,
2808 InstCombiner::BuilderTy &Builder) {
2809 // Find the block's immediate dominator that ends with a conditional branch
2810 // that matches select's condition (maybe inverted).
2811 auto *IDomNode = DT[BB]->getIDom();
2812 if (!IDomNode)
2813 return nullptr;
2814 BasicBlock *IDom = IDomNode->getBlock();
2815
2816 Value *Cond = Sel.getCondition();
2817 Value *IfTrue, *IfFalse;
2818 BasicBlock *TrueSucc, *FalseSucc;
2819 if (match(IDom->getTerminator(),
2820 m_Br(m_Specific(Cond), m_BasicBlock(TrueSucc),
2821 m_BasicBlock(FalseSucc)))) {
2822 IfTrue = Sel.getTrueValue();
2823 IfFalse = Sel.getFalseValue();
2824 } else if (match(IDom->getTerminator(),
2825 m_Br(m_Not(m_Specific(Cond)), m_BasicBlock(TrueSucc),
2826 m_BasicBlock(FalseSucc)))) {
2827 IfTrue = Sel.getFalseValue();
2828 IfFalse = Sel.getTrueValue();
2829 } else
2830 return nullptr;
2831
2832 // Make sure the branches are actually different.
2833 if (TrueSucc == FalseSucc)
2834 return nullptr;
2835
2836 // We want to replace select %cond, %a, %b with a phi that takes value %a
2837 // for all incoming edges that are dominated by condition `%cond == true`,
2838 // and value %b for edges dominated by condition `%cond == false`. If %a
2839 // or %b are also phis from the same basic block, we can go further and take
2840 // their incoming values from the corresponding blocks.
2841 BasicBlockEdge TrueEdge(IDom, TrueSucc);
2842 BasicBlockEdge FalseEdge(IDom, FalseSucc);
2844 for (auto *Pred : predecessors(BB)) {
2845 // Check implication.
2846 BasicBlockEdge Incoming(Pred, BB);
2847 if (DT.dominates(TrueEdge, Incoming))
2848 Inputs[Pred] = IfTrue->DoPHITranslation(BB, Pred);
2849 else if (DT.dominates(FalseEdge, Incoming))
2850 Inputs[Pred] = IfFalse->DoPHITranslation(BB, Pred);
2851 else
2852 return nullptr;
2853 // Check availability.
2854 if (auto *Insn = dyn_cast<Instruction>(Inputs[Pred]))
2855 if (!DT.dominates(Insn, Pred->getTerminator()))
2856 return nullptr;
2857 }
2858
2859 Builder.SetInsertPoint(BB, BB->begin());
2860 auto *PN = Builder.CreatePHI(Sel.getType(), Inputs.size());
2861 for (auto *Pred : predecessors(BB))
2862 PN->addIncoming(Inputs[Pred], Pred);
2863 PN->takeName(&Sel);
2864 return PN;
2865}
2866
2867static Instruction *foldSelectToPhi(SelectInst &Sel, const DominatorTree &DT,
2868 InstCombiner::BuilderTy &Builder) {
2869 // Try to replace this select with Phi in one of these blocks.
2870 SmallSetVector<BasicBlock *, 4> CandidateBlocks;
2871 CandidateBlocks.insert(Sel.getParent());
2872 for (Value *V : Sel.operands())
2873 if (auto *I = dyn_cast<Instruction>(V))
2874 CandidateBlocks.insert(I->getParent());
2875
2876 for (BasicBlock *BB : CandidateBlocks)
2877 if (auto *PN = foldSelectToPhiImpl(Sel, BB, DT, Builder))
2878 return PN;
2879 return nullptr;
2880}
2881
2882/// Tries to reduce a pattern that arises when calculating the remainder of the
2883/// Euclidean division. When the divisor is a power of two and is guaranteed not
2884/// to be negative, a signed remainder can be folded with a bitwise and.
2885///
2886/// (x % n) < 0 ? (x % n) + n : (x % n)
2887/// -> x & (n - 1)
2888static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
2889 IRBuilderBase &Builder) {
2890 Value *CondVal = SI.getCondition();
2891 Value *TrueVal = SI.getTrueValue();
2892 Value *FalseVal = SI.getFalseValue();
2893
2894 CmpPredicate Pred;
2895 Value *Op, *RemRes, *Remainder;
2896 const APInt *C;
2897 bool TrueIfSigned = false;
2898
2899 if (!(match(CondVal, m_ICmp(Pred, m_Value(RemRes), m_APInt(C))) &&
2900 isSignBitCheck(Pred, *C, TrueIfSigned)))
2901 return nullptr;
2902
2903 // If the sign bit is not set, we have a SGE/SGT comparison, and the operands
2904 // of the select are inverted.
2905 if (!TrueIfSigned)
2906 std::swap(TrueVal, FalseVal);
2907
2908 auto FoldToBitwiseAnd = [&](Value *Remainder) -> Instruction * {
2909 Value *Add = Builder.CreateAdd(
2910 Remainder, Constant::getAllOnesValue(RemRes->getType()));
2911 return BinaryOperator::CreateAnd(Op, Add);
2912 };
2913
2914 // Match the general case:
2915 // %rem = srem i32 %x, %n
2916 // %cnd = icmp slt i32 %rem, 0
2917 // %add = add i32 %rem, %n
2918 // %sel = select i1 %cnd, i32 %add, i32 %rem
2919 if (match(TrueVal, m_c_Add(m_Specific(RemRes), m_Value(Remainder))) &&
2920 match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
2921 IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero=*/true) &&
2922 FalseVal == RemRes)
2923 return FoldToBitwiseAnd(Remainder);
2924
2925 // Match the case where the one arm has been replaced by constant 1:
2926 // %rem = srem i32 %n, 2
2927 // %cnd = icmp slt i32 %rem, 0
2928 // %sel = select i1 %cnd, i32 1, i32 %rem
2929 if (match(TrueVal, m_One()) &&
2930 match(RemRes, m_SRem(m_Value(Op), m_SpecificInt(2))) &&
2931 FalseVal == RemRes)
2932 return FoldToBitwiseAnd(ConstantInt::get(RemRes->getType(), 2));
2933
2934 return nullptr;
2935}
2936
2937static Value *foldSelectWithFrozenICmp(SelectInst &Sel, InstCombiner::BuilderTy &Builder) {
2939 if (!FI)
2940 return nullptr;
2941
2942 Value *Cond = FI->getOperand(0);
2943 Value *TrueVal = Sel.getTrueValue(), *FalseVal = Sel.getFalseValue();
2944
2945 // select (freeze(x == y)), x, y --> y
2946 // select (freeze(x != y)), x, y --> x
2947 // The freeze should be only used by this select. Otherwise, remaining uses of
2948 // the freeze can observe a contradictory value.
2949 // c = freeze(x == y) ; Let's assume that y = poison & x = 42; c is 0 or 1
2950 // a = select c, x, y ;
2951 // f(a, c) ; f(poison, 1) cannot happen, but if a is folded
2952 // ; to y, this can happen.
2953 CmpPredicate Pred;
2954 if (FI->hasOneUse() &&
2955 match(Cond, m_c_ICmp(Pred, m_Specific(TrueVal), m_Specific(FalseVal))) &&
2956 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)) {
2957 return Pred == ICmpInst::ICMP_EQ ? FalseVal : TrueVal;
2958 }
2959
2960 return nullptr;
2961}
2962
2963/// Given that \p CondVal is known to be \p CondIsTrue, try to simplify \p SI.
2964static Value *simplifyNestedSelectsUsingImpliedCond(SelectInst &SI,
2965 Value *CondVal,
2966 bool CondIsTrue,
2967 const DataLayout &DL) {
2968 Value *InnerCondVal = SI.getCondition();
2969 Value *InnerTrueVal = SI.getTrueValue();
2970 Value *InnerFalseVal = SI.getFalseValue();
2971 assert(CondVal->getType() == InnerCondVal->getType() &&
2972 "The type of inner condition must match with the outer.");
2973 if (auto Implied = isImpliedCondition(CondVal, InnerCondVal, DL, CondIsTrue))
2974 return *Implied ? InnerTrueVal : InnerFalseVal;
2975 return nullptr;
2976}
2977
2978Instruction *InstCombinerImpl::foldAndOrOfSelectUsingImpliedCond(Value *Op,
2979 SelectInst &SI,
2980 bool IsAnd) {
2981 assert(Op->getType()->isIntOrIntVectorTy(1) &&
2982 "Op must be either i1 or vector of i1.");
2983 if (SI.getCondition()->getType() != Op->getType())
2984 return nullptr;
2985 if (Value *V = simplifyNestedSelectsUsingImpliedCond(SI, Op, IsAnd, DL))
2986 return SelectInst::Create(Op,
2987 IsAnd ? V : ConstantInt::getTrue(Op->getType()),
2988 IsAnd ? ConstantInt::getFalse(Op->getType()) : V);
2989 return nullptr;
2990}
2991
2992// Canonicalize select with fcmp to fabs(). -0.0 makes this tricky. We need
2993// fast-math-flags (nsz) or fsub with +0.0 (not fneg) for this to work.
2994static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
2995 InstCombinerImpl &IC) {
2996 Value *CondVal = SI.getCondition();
2997
2998 bool ChangedFMF = false;
2999 for (bool Swap : {false, true}) {
3000 Value *TrueVal = SI.getTrueValue();
3001 Value *X = SI.getFalseValue();
3002 CmpPredicate Pred;
3003
3004 if (Swap)
3005 std::swap(TrueVal, X);
3006
3007 if (!match(CondVal, m_FCmp(Pred, m_Specific(X), m_AnyZeroFP())))
3008 continue;
3009
3010 // fold (X <= +/-0.0) ? (0.0 - X) : X to fabs(X), when 'Swap' is false
3011 // fold (X > +/-0.0) ? X : (0.0 - X) to fabs(X), when 'Swap' is true
3012 // Note: We require "nnan" for this fold because fcmp ignores the signbit
3013 // of NAN, but IEEE-754 specifies the signbit of NAN values with
3014 // fneg/fabs operations.
3015 if (match(TrueVal, m_FSub(m_PosZeroFP(), m_Specific(X))) &&
3016 (cast<FPMathOperator>(CondVal)->hasNoNaNs() || SI.hasNoNaNs() ||
3017 (SI.hasOneUse() && canIgnoreSignBitOfNaN(*SI.use_begin())) ||
3019 cast<Instruction>(CondVal))))) {
3020 if (!Swap && (Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)) {
3021 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
3022 return IC.replaceInstUsesWith(SI, Fabs);
3023 }
3024 if (Swap && (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT)) {
3025 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
3026 return IC.replaceInstUsesWith(SI, Fabs);
3027 }
3028 }
3029
3030 if (!match(TrueVal, m_FNeg(m_Specific(X))))
3031 return nullptr;
3032
3033 // Forward-propagate nnan and ninf from the fcmp to the select.
3034 // If all inputs are not those values, then the select is not either.
3035 // Note: nsz is defined differently, so it may not be correct to propagate.
3036 FastMathFlags FMF = cast<FPMathOperator>(CondVal)->getFastMathFlags();
3037 if (FMF.noNaNs() && !SI.hasNoNaNs()) {
3038 SI.setHasNoNaNs(true);
3039 ChangedFMF = true;
3040 }
3041 if (FMF.noInfs() && !SI.hasNoInfs()) {
3042 SI.setHasNoInfs(true);
3043 ChangedFMF = true;
3044 }
3045 // Forward-propagate nnan from the fneg to the select.
3046 // The nnan flag can be propagated iff fneg is selected when X is NaN.
3047 if (!SI.hasNoNaNs() && cast<FPMathOperator>(TrueVal)->hasNoNaNs() &&
3048 (Swap ? FCmpInst::isOrdered(Pred) : FCmpInst::isUnordered(Pred))) {
3049 SI.setHasNoNaNs(true);
3050 ChangedFMF = true;
3051 }
3052
3053 // With nsz, when 'Swap' is false:
3054 // fold (X < +/-0.0) ? -X : X or (X <= +/-0.0) ? -X : X to fabs(X)
3055 // fold (X > +/-0.0) ? -X : X or (X >= +/-0.0) ? -X : X to -fabs(x)
3056 // when 'Swap' is true:
3057 // fold (X > +/-0.0) ? X : -X or (X >= +/-0.0) ? X : -X to fabs(X)
3058 // fold (X < +/-0.0) ? X : -X or (X <= +/-0.0) ? X : -X to -fabs(X)
3059 //
3060 // Note: We require "nnan" for this fold because fcmp ignores the signbit
3061 // of NAN, but IEEE-754 specifies the signbit of NAN values with
3062 // fneg/fabs operations.
3063 if (!SI.hasNoSignedZeros() &&
3064 (!SI.hasOneUse() || !canIgnoreSignBitOfZero(*SI.use_begin())))
3065 return nullptr;
3066 if (!SI.hasNoNaNs() &&
3067 (!SI.hasOneUse() || !canIgnoreSignBitOfNaN(*SI.use_begin())))
3068 return nullptr;
3069
3070 if (Swap)
3071 Pred = FCmpInst::getSwappedPredicate(Pred);
3072
3073 bool IsLTOrLE = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_OLE ||
3074 Pred == FCmpInst::FCMP_ULT || Pred == FCmpInst::FCMP_ULE;
3075 bool IsGTOrGE = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_OGE ||
3076 Pred == FCmpInst::FCMP_UGT || Pred == FCmpInst::FCMP_UGE;
3077
3078 if (IsLTOrLE) {
3079 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
3080 return IC.replaceInstUsesWith(SI, Fabs);
3081 }
3082 if (IsGTOrGE) {
3083 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
3084 Instruction *NewFNeg = UnaryOperator::CreateFNeg(Fabs);
3085 NewFNeg->setFastMathFlags(SI.getFastMathFlags());
3086 return NewFNeg;
3087 }
3088 }
3089
3090 // Match select with (icmp slt (bitcast X to int), 0)
3091 // or (icmp sgt (bitcast X to int), -1)
3092
3093 for (bool Swap : {false, true}) {
3094 Value *TrueVal = SI.getTrueValue();
3095 Value *X = SI.getFalseValue();
3096
3097 if (Swap)
3098 std::swap(TrueVal, X);
3099
3100 CmpPredicate Pred;
3101 const APInt *C;
3102 bool TrueIfSigned;
3103 if (!match(CondVal,
3105 !isSignBitCheck(Pred, *C, TrueIfSigned))
3106 continue;
3107 if (!match(TrueVal, m_FNeg(m_Specific(X))))
3108 return nullptr;
3109 if (Swap == TrueIfSigned && !CondVal->hasOneUse() && !TrueVal->hasOneUse())
3110 return nullptr;
3111
3112 // Fold (IsNeg ? -X : X) or (!IsNeg ? X : -X) to fabs(X)
3113 // Fold (IsNeg ? X : -X) or (!IsNeg ? -X : X) to -fabs(X)
3114 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
3115 if (Swap != TrueIfSigned)
3116 return IC.replaceInstUsesWith(SI, Fabs);
3117 return UnaryOperator::CreateFNegFMF(Fabs, &SI);
3118 }
3119
3120 return ChangedFMF ? &SI : nullptr;
3121}
3122
3123// Match the following IR pattern:
3124// %x.lowbits = and i8 %x, %lowbitmask
3125// %x.lowbits.are.zero = icmp eq i8 %x.lowbits, 0
3126// %x.biased = add i8 %x, %bias
3127// %x.biased.highbits = and i8 %x.biased, %highbitmask
3128// %x.roundedup = select i1 %x.lowbits.are.zero, i8 %x, i8 %x.biased.highbits
3129// Define:
3130// %alignment = add i8 %lowbitmask, 1
3131// Iff 1. an %alignment is a power-of-two (aka, %lowbitmask is a low bit mask)
3132// and 2. %bias is equal to either %lowbitmask or %alignment,
3133// and 3. %highbitmask is equal to ~%lowbitmask (aka, to -%alignment)
3134// then this pattern can be transformed into:
3135// %x.offset = add i8 %x, %lowbitmask
3136// %x.roundedup = and i8 %x.offset, %highbitmask
3137static Value *
3138foldRoundUpIntegerWithPow2Alignment(SelectInst &SI,
3139 InstCombiner::BuilderTy &Builder) {
3140 Value *Cond = SI.getCondition();
3141 Value *X = SI.getTrueValue();
3142 Value *XBiasedHighBits = SI.getFalseValue();
3143
3144 CmpPredicate Pred;
3145 Value *XLowBits;
3146 if (!match(Cond, m_ICmp(Pred, m_Value(XLowBits), m_ZeroInt())) ||
3147 !ICmpInst::isEquality(Pred))
3148 return nullptr;
3149
3150 if (Pred == ICmpInst::Predicate::ICMP_NE)
3151 std::swap(X, XBiasedHighBits);
3152
3153 // FIXME: we could support non non-splats here.
3154
3155 const APInt *LowBitMaskCst;
3156 if (!match(XLowBits, m_And(m_Specific(X), m_APIntAllowPoison(LowBitMaskCst))))
3157 return nullptr;
3158
3159 // Match even if the AND and ADD are swapped.
3160 const APInt *BiasCst, *HighBitMaskCst;
3161 if (!match(XBiasedHighBits,
3163 m_APIntAllowPoison(HighBitMaskCst))) &&
3164 !match(XBiasedHighBits,
3165 m_Add(m_And(m_Specific(X), m_APIntAllowPoison(HighBitMaskCst)),
3166 m_APIntAllowPoison(BiasCst))))
3167 return nullptr;
3168
3169 if (!LowBitMaskCst->isMask())
3170 return nullptr;
3171
3172 APInt InvertedLowBitMaskCst = ~*LowBitMaskCst;
3173 if (InvertedLowBitMaskCst != *HighBitMaskCst)
3174 return nullptr;
3175
3176 APInt AlignmentCst = *LowBitMaskCst + 1;
3177
3178 if (*BiasCst != AlignmentCst && *BiasCst != *LowBitMaskCst)
3179 return nullptr;
3180
3181 if (!XBiasedHighBits->hasOneUse()) {
3182 // We can't directly return XBiasedHighBits if it is more poisonous.
3183 if (*BiasCst == *LowBitMaskCst && impliesPoison(XBiasedHighBits, X))
3184 return XBiasedHighBits;
3185 return nullptr;
3186 }
3187
3188 // FIXME: could we preserve undef's here?
3189 Type *Ty = X->getType();
3190 Value *XOffset = Builder.CreateAdd(X, ConstantInt::get(Ty, *LowBitMaskCst),
3191 X->getName() + ".biased");
3192 Value *R = Builder.CreateAnd(XOffset, ConstantInt::get(Ty, *HighBitMaskCst));
3193 R->takeName(&SI);
3194 return R;
3195}
3196
3197namespace {
3198struct DecomposedSelect {
3199 Value *Cond = nullptr;
3200 Value *TrueVal = nullptr;
3201 Value *FalseVal = nullptr;
3202};
3203} // namespace
3204
3205/// Folds patterns like:
3206/// select c2 (select c1 a b) (select c1 b a)
3207/// into:
3208/// select (xor c1 c2) b a
3209static Instruction *
3210foldSelectOfSymmetricSelect(SelectInst &OuterSelVal,
3211 InstCombiner::BuilderTy &Builder) {
3212
3213 Value *OuterCond, *InnerCond, *InnerTrueVal, *InnerFalseVal;
3214 if (!match(
3215 &OuterSelVal,
3216 m_Select(m_Value(OuterCond),
3217 m_OneUse(m_Select(m_Value(InnerCond), m_Value(InnerTrueVal),
3218 m_Value(InnerFalseVal))),
3219 m_OneUse(m_Select(m_Deferred(InnerCond),
3220 m_Deferred(InnerFalseVal),
3221 m_Deferred(InnerTrueVal))))))
3222 return nullptr;
3223
3224 if (OuterCond->getType() != InnerCond->getType())
3225 return nullptr;
3226
3227 Value *Xor = Builder.CreateXor(InnerCond, OuterCond);
3228 return SelectInst::Create(Xor, InnerFalseVal, InnerTrueVal);
3229}
3230
3231/// Look for patterns like
3232/// %outer.cond = select i1 %inner.cond, i1 %alt.cond, i1 false
3233/// %inner.sel = select i1 %inner.cond, i8 %inner.sel.t, i8 %inner.sel.f
3234/// %outer.sel = select i1 %outer.cond, i8 %outer.sel.t, i8 %inner.sel
3235/// and rewrite it as
3236/// %inner.sel = select i1 %cond.alternative, i8 %sel.outer.t, i8 %sel.inner.t
3237/// %sel.outer = select i1 %cond.inner, i8 %inner.sel, i8 %sel.inner.f
3238static Instruction *foldNestedSelects(SelectInst &OuterSelVal,
3239 InstCombiner::BuilderTy &Builder) {
3240 // We must start with a `select`.
3241 DecomposedSelect OuterSel;
3242 match(&OuterSelVal,
3243 m_Select(m_Value(OuterSel.Cond), m_Value(OuterSel.TrueVal),
3244 m_Value(OuterSel.FalseVal)));
3245
3246 // Canonicalize inversion of the outermost `select`'s condition.
3247 if (match(OuterSel.Cond, m_Not(m_Value(OuterSel.Cond))))
3248 std::swap(OuterSel.TrueVal, OuterSel.FalseVal);
3249
3250 // The condition of the outermost select must be an `and`/`or`.
3251 if (!match(OuterSel.Cond, m_c_LogicalOp(m_Value(), m_Value())))
3252 return nullptr;
3253
3254 // Depending on the logical op, inner select might be in different hand.
3255 bool IsAndVariant = match(OuterSel.Cond, m_LogicalAnd());
3256 Value *InnerSelVal = IsAndVariant ? OuterSel.FalseVal : OuterSel.TrueVal;
3257
3258 // Profitability check - avoid increasing instruction count.
3259 if (none_of(ArrayRef<Value *>({OuterSelVal.getCondition(), InnerSelVal}),
3260 [](Value *V) { return V->hasOneUse(); }))
3261 return nullptr;
3262
3263 // The appropriate hand of the outermost `select` must be a select itself.
3264 DecomposedSelect InnerSel;
3265 if (!match(InnerSelVal,
3266 m_Select(m_Value(InnerSel.Cond), m_Value(InnerSel.TrueVal),
3267 m_Value(InnerSel.FalseVal))))
3268 return nullptr;
3269
3270 // Canonicalize inversion of the innermost `select`'s condition.
3271 if (match(InnerSel.Cond, m_Not(m_Value(InnerSel.Cond))))
3272 std::swap(InnerSel.TrueVal, InnerSel.FalseVal);
3273
3274 Value *AltCond = nullptr;
3275 auto matchOuterCond = [OuterSel, IsAndVariant, &AltCond](auto m_InnerCond) {
3276 // An unsimplified select condition can match both LogicalAnd and LogicalOr
3277 // (select true, true, false). Since below we assume that LogicalAnd implies
3278 // InnerSel match the FVal and vice versa for LogicalOr, we can't match the
3279 // alternative pattern here.
3280 return IsAndVariant ? match(OuterSel.Cond,
3281 m_c_LogicalAnd(m_InnerCond, m_Value(AltCond)))
3282 : match(OuterSel.Cond,
3283 m_c_LogicalOr(m_InnerCond, m_Value(AltCond)));
3284 };
3285
3286 // Finally, match the condition that was driving the outermost `select`,
3287 // it should be a logical operation between the condition that was driving
3288 // the innermost `select` (after accounting for the possible inversions
3289 // of the condition), and some other condition.
3290 if (matchOuterCond(m_Specific(InnerSel.Cond))) {
3291 // Done!
3292 } else if (Value * NotInnerCond; matchOuterCond(m_CombineAnd(
3293 m_Not(m_Specific(InnerSel.Cond)), m_Value(NotInnerCond)))) {
3294 // Done!
3295 std::swap(InnerSel.TrueVal, InnerSel.FalseVal);
3296 InnerSel.Cond = NotInnerCond;
3297 } else // Not the pattern we were looking for.
3298 return nullptr;
3299
3300 Value *SelInner = Builder.CreateSelect(
3301 AltCond, IsAndVariant ? OuterSel.TrueVal : InnerSel.FalseVal,
3302 IsAndVariant ? InnerSel.TrueVal : OuterSel.FalseVal);
3303 SelInner->takeName(InnerSelVal);
3304 return SelectInst::Create(InnerSel.Cond,
3305 IsAndVariant ? SelInner : InnerSel.TrueVal,
3306 !IsAndVariant ? SelInner : InnerSel.FalseVal);
3307}
3308
3309/// Return true if V is poison or \p Expected given that ValAssumedPoison is
3310/// already poison. For example, if ValAssumedPoison is `icmp samesign X, 10`
3311/// and V is `icmp ne X, 5`, impliesPoisonOrCond returns true.
3312static bool impliesPoisonOrCond(const Value *ValAssumedPoison, const Value *V,
3313 bool Expected) {
3314 if (impliesPoison(ValAssumedPoison, V))
3315 return true;
3316
3317 // Handle the case that ValAssumedPoison is `icmp samesign pred X, C1` and V
3318 // is `icmp pred X, C2`, where C1 is well-defined.
3319 if (auto *ICmp = dyn_cast<ICmpInst>(ValAssumedPoison)) {
3320 Value *LHS = ICmp->getOperand(0);
3321 const APInt *RHSC1;
3322 const APInt *RHSC2;
3323 CmpPredicate Pred;
3324 if (ICmp->hasSameSign() &&
3325 match(ICmp->getOperand(1), m_APIntForbidPoison(RHSC1)) &&
3326 match(V, m_ICmp(Pred, m_Specific(LHS), m_APIntAllowPoison(RHSC2)))) {
3327 unsigned BitWidth = RHSC1->getBitWidth();
3328 ConstantRange CRX =
3329 RHSC1->isNonNegative()
3332 : ConstantRange(APInt::getZero(BitWidth),
3333 APInt::getSignedMinValue(BitWidth));
3334 return CRX.icmp(Expected ? Pred : ICmpInst::getInverseCmpPredicate(Pred),
3335 *RHSC2);
3336 }
3337 }
3338
3339 return false;
3340}
3341
3343 Value *CondVal = SI.getCondition();
3344 Value *TrueVal = SI.getTrueValue();
3345 Value *FalseVal = SI.getFalseValue();
3346 Type *SelType = SI.getType();
3347
3348 // Avoid potential infinite loops by checking for non-constant condition.
3349 // TODO: Can we assert instead by improving canonicalizeSelectToShuffle()?
3350 // Scalar select must have simplified?
3351 if (!SelType->isIntOrIntVectorTy(1) || isa<Constant>(CondVal) ||
3352 TrueVal->getType() != CondVal->getType())
3353 return nullptr;
3354
3355 auto *One = ConstantInt::getTrue(SelType);
3356 auto *Zero = ConstantInt::getFalse(SelType);
3357 Value *A, *B, *C, *D;
3358
3359 // Folding select to and/or i1 isn't poison safe in general. impliesPoison
3360 // checks whether folding it does not convert a well-defined value into
3361 // poison.
3362 if (match(TrueVal, m_One())) {
3363 if (impliesPoisonOrCond(FalseVal, CondVal, /*Expected=*/false)) {
3364 // Change: A = select B, true, C --> A = or B, C
3365 return BinaryOperator::CreateOr(CondVal, FalseVal);
3366 }
3367
3368 if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_One(), m_Value(B)))) &&
3369 impliesPoisonOrCond(FalseVal, B, /*Expected=*/false)) {
3370 // (A || B) || C --> A || (B | C)
3371 return replaceInstUsesWith(
3372 SI, Builder.CreateLogicalOr(A, Builder.CreateOr(B, FalseVal)));
3373 }
3374
3375 // (A && B) || (C && B) --> (A || C) && B
3376 if (match(CondVal, m_LogicalAnd(m_Value(A), m_Value(B))) &&
3377 match(FalseVal, m_LogicalAnd(m_Value(C), m_Value(D))) &&
3378 (CondVal->hasOneUse() || FalseVal->hasOneUse())) {
3379 bool CondLogicAnd = isa<SelectInst>(CondVal);
3380 bool FalseLogicAnd = isa<SelectInst>(FalseVal);
3381 auto AndFactorization = [&](Value *Common, Value *InnerCond,
3382 Value *InnerVal,
3383 bool SelFirst = false) -> Instruction * {
3384 Value *InnerSel = Builder.CreateSelect(InnerCond, One, InnerVal);
3385 if (SelFirst)
3386 std::swap(Common, InnerSel);
3387 if (FalseLogicAnd || (CondLogicAnd && Common == A))
3388 return SelectInst::Create(Common, InnerSel, Zero);
3389 else
3390 return BinaryOperator::CreateAnd(Common, InnerSel);
3391 };
3392
3393 if (A == C)
3394 return AndFactorization(A, B, D);
3395 if (A == D)
3396 return AndFactorization(A, B, C);
3397 if (B == C)
3398 return AndFactorization(B, A, D);
3399 if (B == D)
3400 return AndFactorization(B, A, C, CondLogicAnd && FalseLogicAnd);
3401 }
3402 }
3403
3404 if (match(FalseVal, m_Zero())) {
3405 if (impliesPoisonOrCond(TrueVal, CondVal, /*Expected=*/true)) {
3406 // Change: A = select B, C, false --> A = and B, C
3407 return BinaryOperator::CreateAnd(CondVal, TrueVal);
3408 }
3409
3410 if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_Value(B), m_Zero()))) &&
3411 impliesPoisonOrCond(TrueVal, B, /*Expected=*/true)) {
3412 // (A && B) && C --> A && (B & C)
3413 return replaceInstUsesWith(
3414 SI, Builder.CreateLogicalAnd(A, Builder.CreateAnd(B, TrueVal)));
3415 }
3416
3417 // (A || B) && (C || B) --> (A && C) || B
3418 if (match(CondVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3419 match(TrueVal, m_LogicalOr(m_Value(C), m_Value(D))) &&
3420 (CondVal->hasOneUse() || TrueVal->hasOneUse())) {
3421 bool CondLogicOr = isa<SelectInst>(CondVal);
3422 bool TrueLogicOr = isa<SelectInst>(TrueVal);
3423 auto OrFactorization = [&](Value *Common, Value *InnerCond,
3424 Value *InnerVal,
3425 bool SelFirst = false) -> Instruction * {
3426 Value *InnerSel = Builder.CreateSelect(InnerCond, InnerVal, Zero);
3427 if (SelFirst)
3428 std::swap(Common, InnerSel);
3429 if (TrueLogicOr || (CondLogicOr && Common == A))
3430 return SelectInst::Create(Common, One, InnerSel);
3431 else
3432 return BinaryOperator::CreateOr(Common, InnerSel);
3433 };
3434
3435 if (A == C)
3436 return OrFactorization(A, B, D);
3437 if (A == D)
3438 return OrFactorization(A, B, C);
3439 if (B == C)
3440 return OrFactorization(B, A, D);
3441 if (B == D)
3442 return OrFactorization(B, A, C, CondLogicOr && TrueLogicOr);
3443 }
3444 }
3445
3446 // We match the "full" 0 or 1 constant here to avoid a potential infinite
3447 // loop with vectors that may have undefined/poison elements.
3448 // select a, false, b -> select !a, b, false
3449 if (match(TrueVal, m_Specific(Zero))) {
3450 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
3451 return SelectInst::Create(NotCond, FalseVal, Zero);
3452 }
3453 // select a, b, true -> select !a, true, b
3454 if (match(FalseVal, m_Specific(One))) {
3455 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
3456 return SelectInst::Create(NotCond, One, TrueVal);
3457 }
3458
3459 // DeMorgan in select form: !a && !b --> !(a || b)
3460 // select !a, !b, false --> not (select a, true, b)
3461 if (match(&SI, m_LogicalAnd(m_Not(m_Value(A)), m_Not(m_Value(B)))) &&
3462 (CondVal->hasOneUse() || TrueVal->hasOneUse()) &&
3464 return BinaryOperator::CreateNot(Builder.CreateSelect(A, One, B));
3465
3466 // DeMorgan in select form: !a || !b --> !(a && b)
3467 // select !a, true, !b --> not (select a, b, false)
3468 if (match(&SI, m_LogicalOr(m_Not(m_Value(A)), m_Not(m_Value(B)))) &&
3469 (CondVal->hasOneUse() || FalseVal->hasOneUse()) &&
3471 return BinaryOperator::CreateNot(Builder.CreateSelect(A, B, Zero));
3472
3473 // select (select a, true, b), true, b -> select a, true, b
3474 if (match(CondVal, m_Select(m_Value(A), m_One(), m_Value(B))) &&
3475 match(TrueVal, m_One()) && match(FalseVal, m_Specific(B)))
3476 return replaceOperand(SI, 0, A);
3477 // select (select a, b, false), b, false -> select a, b, false
3478 if (match(CondVal, m_Select(m_Value(A), m_Value(B), m_Zero())) &&
3479 match(TrueVal, m_Specific(B)) && match(FalseVal, m_Zero()))
3480 return replaceOperand(SI, 0, A);
3481
3482 // ~(A & B) & (A | B) --> A ^ B
3485 return BinaryOperator::CreateXor(A, B);
3486
3487 // select (~a | c), a, b -> select a, (select c, true, b), false
3488 if (match(CondVal,
3489 m_OneUse(m_c_Or(m_Not(m_Specific(TrueVal)), m_Value(C))))) {
3490 Value *OrV = Builder.CreateSelect(C, One, FalseVal);
3491 return SelectInst::Create(TrueVal, OrV, Zero);
3492 }
3493 // select (c & b), a, b -> select b, (select ~c, true, a), false
3494 if (match(CondVal, m_OneUse(m_c_And(m_Value(C), m_Specific(FalseVal))))) {
3495 if (Value *NotC = getFreelyInverted(C, C->hasOneUse(), &Builder)) {
3496 Value *OrV = Builder.CreateSelect(NotC, One, TrueVal);
3497 return SelectInst::Create(FalseVal, OrV, Zero);
3498 }
3499 }
3500 // select (a | c), a, b -> select a, true, (select ~c, b, false)
3501 if (match(CondVal, m_OneUse(m_c_Or(m_Specific(TrueVal), m_Value(C))))) {
3502 if (Value *NotC = getFreelyInverted(C, C->hasOneUse(), &Builder)) {
3503 Value *AndV = Builder.CreateSelect(NotC, FalseVal, Zero);
3504 return SelectInst::Create(TrueVal, One, AndV);
3505 }
3506 }
3507 // select (c & ~b), a, b -> select b, true, (select c, a, false)
3508 if (match(CondVal,
3509 m_OneUse(m_c_And(m_Value(C), m_Not(m_Specific(FalseVal)))))) {
3510 Value *AndV = Builder.CreateSelect(C, TrueVal, Zero);
3511 return SelectInst::Create(FalseVal, One, AndV);
3512 }
3513
3514 if (match(FalseVal, m_Zero()) || match(TrueVal, m_One())) {
3515 Use *Y = nullptr;
3516 bool IsAnd = match(FalseVal, m_Zero()) ? true : false;
3517 Value *Op1 = IsAnd ? TrueVal : FalseVal;
3518 if (isCheckForZeroAndMulWithOverflow(CondVal, Op1, IsAnd, Y)) {
3519 auto *FI = new FreezeInst(*Y, (*Y)->getName() + ".fr");
3520 InsertNewInstBefore(FI, cast<Instruction>(Y->getUser())->getIterator());
3521 replaceUse(*Y, FI);
3522 return replaceInstUsesWith(SI, Op1);
3523 }
3524
3525 if (auto *V = foldBooleanAndOr(CondVal, Op1, SI, IsAnd,
3526 /*IsLogical=*/true))
3527 return replaceInstUsesWith(SI, V);
3528 }
3529
3530 // select (a || b), c, false -> select a, c, false
3531 // select c, (a || b), false -> select c, a, false
3532 // if c implies that b is false.
3533 if (match(CondVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3534 match(FalseVal, m_Zero())) {
3535 std::optional<bool> Res = isImpliedCondition(TrueVal, B, DL);
3536 if (Res && *Res == false)
3537 return replaceOperand(SI, 0, A);
3538 }
3539 if (match(TrueVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3540 match(FalseVal, m_Zero())) {
3541 std::optional<bool> Res = isImpliedCondition(CondVal, B, DL);
3542 if (Res && *Res == false)
3543 return replaceOperand(SI, 1, A);
3544 }
3545 // select c, true, (a && b) -> select c, true, a
3546 // select (a && b), true, c -> select a, true, c
3547 // if c = false implies that b = true
3548 if (match(TrueVal, m_One()) &&
3549 match(FalseVal, m_LogicalAnd(m_Value(A), m_Value(B)))) {
3550 std::optional<bool> Res = isImpliedCondition(CondVal, B, DL, false);
3551 if (Res && *Res == true)
3552 return replaceOperand(SI, 2, A);
3553 }
3554 if (match(CondVal, m_LogicalAnd(m_Value(A), m_Value(B))) &&
3555 match(TrueVal, m_One())) {
3556 std::optional<bool> Res = isImpliedCondition(FalseVal, B, DL, false);
3557 if (Res && *Res == true)
3558 return replaceOperand(SI, 0, A);
3559 }
3560
3561 if (match(TrueVal, m_One())) {
3562 Value *C;
3563
3564 // (C && A) || (!C && B) --> sel C, A, B
3565 // (A && C) || (!C && B) --> sel C, A, B
3566 // (C && A) || (B && !C) --> sel C, A, B
3567 // (A && C) || (B && !C) --> sel C, A, B (may require freeze)
3568 if (match(FalseVal, m_c_LogicalAnd(m_Not(m_Value(C)), m_Value(B))) &&
3569 match(CondVal, m_c_LogicalAnd(m_Specific(C), m_Value(A)))) {
3570 auto *SelCond = dyn_cast<SelectInst>(CondVal);
3571 auto *SelFVal = dyn_cast<SelectInst>(FalseVal);
3572 bool MayNeedFreeze = SelCond && SelFVal &&
3573 match(SelFVal->getTrueValue(),
3574 m_Not(m_Specific(SelCond->getTrueValue())));
3575 if (MayNeedFreeze)
3576 C = Builder.CreateFreeze(C);
3577 return SelectInst::Create(C, A, B);
3578 }
3579
3580 // (!C && A) || (C && B) --> sel C, B, A
3581 // (A && !C) || (C && B) --> sel C, B, A
3582 // (!C && A) || (B && C) --> sel C, B, A
3583 // (A && !C) || (B && C) --> sel C, B, A (may require freeze)
3584 if (match(CondVal, m_c_LogicalAnd(m_Not(m_Value(C)), m_Value(A))) &&
3585 match(FalseVal, m_c_LogicalAnd(m_Specific(C), m_Value(B)))) {
3586 auto *SelCond = dyn_cast<SelectInst>(CondVal);
3587 auto *SelFVal = dyn_cast<SelectInst>(FalseVal);
3588 bool MayNeedFreeze = SelCond && SelFVal &&
3589 match(SelCond->getTrueValue(),
3590 m_Not(m_Specific(SelFVal->getTrueValue())));
3591 if (MayNeedFreeze)
3592 C = Builder.CreateFreeze(C);
3593 return SelectInst::Create(C, B, A);
3594 }
3595 }
3596
3597 return nullptr;
3598}
3599
3600// Return true if we can safely remove the select instruction for std::bit_ceil
3601// pattern.
3602static bool isSafeToRemoveBitCeilSelect(ICmpInst::Predicate Pred, Value *Cond0,
3603 const APInt *Cond1, Value *CtlzOp,
3604 unsigned BitWidth,
3605 bool &ShouldDropNoWrap) {
3606 // The challenge in recognizing std::bit_ceil(X) is that the operand is used
3607 // for the CTLZ proper and select condition, each possibly with some
3608 // operation like add and sub.
3609 //
3610 // Our aim is to make sure that -ctlz & (BitWidth - 1) == 0 even when the
3611 // select instruction would select 1, which allows us to get rid of the select
3612 // instruction.
3613 //
3614 // To see if we can do so, we do some symbolic execution with ConstantRange.
3615 // Specifically, we compute the range of values that Cond0 could take when
3616 // Cond == false. Then we successively transform the range until we obtain
3617 // the range of values that CtlzOp could take.
3618 //
3619 // Conceptually, we follow the def-use chain backward from Cond0 while
3620 // transforming the range for Cond0 until we meet the common ancestor of Cond0
3621 // and CtlzOp. Then we follow the def-use chain forward until we obtain the
3622 // range for CtlzOp. That said, we only follow at most one ancestor from
3623 // Cond0. Likewise, we only follow at most one ancestor from CtrlOp.
3624
3626 CmpInst::getInversePredicate(Pred), *Cond1);
3627
3628 ShouldDropNoWrap = false;
3629
3630 // Match the operation that's used to compute CtlzOp from CommonAncestor. If
3631 // CtlzOp == CommonAncestor, return true as no operation is needed. If a
3632 // match is found, execute the operation on CR, update CR, and return true.
3633 // Otherwise, return false.
3634 auto MatchForward = [&](Value *CommonAncestor) {
3635 const APInt *C = nullptr;
3636 if (CtlzOp == CommonAncestor)
3637 return true;
3638 if (match(CtlzOp, m_Add(m_Specific(CommonAncestor), m_APInt(C)))) {
3639 ShouldDropNoWrap = true;
3640 CR = CR.add(*C);
3641 return true;
3642 }
3643 if (match(CtlzOp, m_Sub(m_APInt(C), m_Specific(CommonAncestor)))) {
3644 ShouldDropNoWrap = true;
3645 CR = ConstantRange(*C).sub(CR);
3646 return true;
3647 }
3648 if (match(CtlzOp, m_Not(m_Specific(CommonAncestor)))) {
3649 CR = CR.binaryNot();
3650 return true;
3651 }
3652 return false;
3653 };
3654
3655 const APInt *C = nullptr;
3656 Value *CommonAncestor;
3657 if (MatchForward(Cond0)) {
3658 // Cond0 is either CtlzOp or CtlzOp's parent. CR has been updated.
3659 } else if (match(Cond0, m_Add(m_Value(CommonAncestor), m_APInt(C)))) {
3660 CR = CR.sub(*C);
3661 if (!MatchForward(CommonAncestor))
3662 return false;
3663 // Cond0's parent is either CtlzOp or CtlzOp's parent. CR has been updated.
3664 } else {
3665 return false;
3666 }
3667
3668 // Return true if all the values in the range are either 0 or negative (if
3669 // treated as signed). We do so by evaluating:
3670 //
3671 // CR - 1 u>= (1 << BitWidth) - 1.
3672 APInt IntMax = APInt::getSignMask(BitWidth) - 1;
3673 CR = CR.sub(APInt(BitWidth, 1));
3674 return CR.icmp(ICmpInst::ICMP_UGE, IntMax);
3675}
3676
3677// Transform the std::bit_ceil(X) pattern like:
3678//
3679// %dec = add i32 %x, -1
3680// %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
3681// %sub = sub i32 32, %ctlz
3682// %shl = shl i32 1, %sub
3683// %ugt = icmp ugt i32 %x, 1
3684// %sel = select i1 %ugt, i32 %shl, i32 1
3685//
3686// into:
3687//
3688// %dec = add i32 %x, -1
3689// %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
3690// %neg = sub i32 0, %ctlz
3691// %masked = and i32 %ctlz, 31
3692// %shl = shl i32 1, %sub
3693//
3694// Note that the select is optimized away while the shift count is masked with
3695// 31. We handle some variations of the input operand like std::bit_ceil(X +
3696// 1).
3697static Instruction *foldBitCeil(SelectInst &SI, IRBuilderBase &Builder,
3698 InstCombinerImpl &IC) {
3699 Type *SelType = SI.getType();
3700 unsigned BitWidth = SelType->getScalarSizeInBits();
3701
3702 Value *FalseVal = SI.getFalseValue();
3703 Value *TrueVal = SI.getTrueValue();
3704 CmpPredicate Pred;
3705 const APInt *Cond1;
3706 Value *Cond0, *Ctlz, *CtlzOp;
3707 if (!match(SI.getCondition(), m_ICmp(Pred, m_Value(Cond0), m_APInt(Cond1))))
3708 return nullptr;
3709
3710 if (match(TrueVal, m_One())) {
3711 std::swap(FalseVal, TrueVal);
3712 Pred = CmpInst::getInversePredicate(Pred);
3713 }
3714
3715 bool ShouldDropNoWrap;
3716
3717 if (!match(FalseVal, m_One()) ||
3718 !match(TrueVal,
3720 m_Value(Ctlz)))))) ||
3721 !match(Ctlz, m_Intrinsic<Intrinsic::ctlz>(m_Value(CtlzOp), m_Value())) ||
3722 !isSafeToRemoveBitCeilSelect(Pred, Cond0, Cond1, CtlzOp, BitWidth,
3723 ShouldDropNoWrap))
3724 return nullptr;
3725
3726 if (ShouldDropNoWrap) {
3727 cast<Instruction>(CtlzOp)->setHasNoUnsignedWrap(false);
3728 cast<Instruction>(CtlzOp)->setHasNoSignedWrap(false);
3729 }
3730
3731 // Build 1 << (-CTLZ & (BitWidth-1)). The negation likely corresponds to a
3732 // single hardware instruction as opposed to BitWidth - CTLZ, where BitWidth
3733 // is an integer constant. Masking with BitWidth-1 comes free on some
3734 // hardware as part of the shift instruction.
3735
3736 // Drop range attributes and re-infer them in the next iteration.
3737 cast<Instruction>(Ctlz)->dropPoisonGeneratingAnnotations();
3738 // Set is_zero_poison to false and re-infer them in the next iteration.
3739 cast<Instruction>(Ctlz)->setOperand(1, Builder.getFalse());
3741 Value *Neg = Builder.CreateNeg(Ctlz);
3742 Value *Masked =
3743 Builder.CreateAnd(Neg, ConstantInt::get(SelType, BitWidth - 1));
3744 return BinaryOperator::Create(Instruction::Shl, ConstantInt::get(SelType, 1),
3745 Masked);
3746}
3747
3748// This function tries to fold the following operations:
3749// (x < y) ? -1 : zext(x != y)
3750// (x < y) ? -1 : zext(x > y)
3751// (x > y) ? 1 : sext(x != y)
3752// (x > y) ? 1 : sext(x < y)
3753// Into ucmp/scmp(x, y), where signedness is determined by the signedness
3754// of the comparison in the original sequence.
3756 Value *TV = SI.getTrueValue();
3757 Value *FV = SI.getFalseValue();
3758
3759 CmpPredicate Pred;
3760 Value *LHS, *RHS;
3761 if (!match(SI.getCondition(), m_ICmp(Pred, m_Value(LHS), m_Value(RHS))))
3762 return nullptr;
3763
3764 if (!LHS->getType()->isIntOrIntVectorTy())
3765 return nullptr;
3766
3767 // If there is no -1, 0 or 1 at TV, then invert the select statement and try
3768 // to canonicalize to one of the forms above
3769 if (!isa<Constant>(TV)) {
3770 if (!isa<Constant>(FV))
3771 return nullptr;
3773 std::swap(TV, FV);
3774 }
3775
3777 if (Constant *C = dyn_cast<Constant>(RHS)) {
3778 auto FlippedPredAndConst =
3780 if (!FlippedPredAndConst)
3781 return nullptr;
3782 Pred = FlippedPredAndConst->first;
3783 RHS = FlippedPredAndConst->second;
3784 } else {
3785 return nullptr;
3786 }
3787 }
3788
3789 // Try to swap operands and the predicate. We need to be careful when doing
3790 // so because two of the patterns have opposite predicates, so use the
3791 // constant inside select to determine if swapping operands would be
3792 // beneficial to us.
3793 if ((ICmpInst::isGT(Pred) && match(TV, m_AllOnes())) ||
3794 (ICmpInst::isLT(Pred) && match(TV, m_One()))) {
3795 Pred = ICmpInst::getSwappedPredicate(Pred);
3796 std::swap(LHS, RHS);
3797 }
3798 bool IsSigned = ICmpInst::isSigned(Pred);
3799
3800 bool Replace = false;
3801 CmpPredicate ExtendedCmpPredicate;
3802 // (x < y) ? -1 : zext(x != y)
3803 // (x < y) ? -1 : zext(x > y)
3804 if (ICmpInst::isLT(Pred) && match(TV, m_AllOnes()) &&
3805 match(FV, m_ZExt(m_c_ICmp(ExtendedCmpPredicate, m_Specific(LHS),
3806 m_Specific(RHS)))) &&
3807 (ExtendedCmpPredicate == ICmpInst::ICMP_NE ||
3808 ICmpInst::getSwappedPredicate(ExtendedCmpPredicate) == Pred))
3809 Replace = true;
3810
3811 // (x > y) ? 1 : sext(x != y)
3812 // (x > y) ? 1 : sext(x < y)
3813 if (ICmpInst::isGT(Pred) && match(TV, m_One()) &&
3814 match(FV, m_SExt(m_c_ICmp(ExtendedCmpPredicate, m_Specific(LHS),
3815 m_Specific(RHS)))) &&
3816 (ExtendedCmpPredicate == ICmpInst::ICMP_NE ||
3817 ICmpInst::getSwappedPredicate(ExtendedCmpPredicate) == Pred))
3818 Replace = true;
3819
3820 // (x == y) ? 0 : (x > y ? 1 : -1)
3821 CmpPredicate FalseBranchSelectPredicate;
3822 const APInt *InnerTV, *InnerFV;
3823 if (Pred == ICmpInst::ICMP_EQ && match(TV, m_Zero()) &&
3824 match(FV, m_Select(m_c_ICmp(FalseBranchSelectPredicate, m_Specific(LHS),
3825 m_Specific(RHS)),
3826 m_APInt(InnerTV), m_APInt(InnerFV)))) {
3827 if (!ICmpInst::isGT(FalseBranchSelectPredicate)) {
3828 FalseBranchSelectPredicate =
3829 ICmpInst::getSwappedPredicate(FalseBranchSelectPredicate);
3830 std::swap(LHS, RHS);
3831 }
3832
3833 if (!InnerTV->isOne()) {
3834 std::swap(InnerTV, InnerFV);
3835 std::swap(LHS, RHS);
3836 }
3837
3838 if (ICmpInst::isGT(FalseBranchSelectPredicate) && InnerTV->isOne() &&
3839 InnerFV->isAllOnes()) {
3840 IsSigned = ICmpInst::isSigned(FalseBranchSelectPredicate);
3841 Replace = true;
3842 }
3843 }
3844
3845 Intrinsic::ID IID = IsSigned ? Intrinsic::scmp : Intrinsic::ucmp;
3846 if (Replace)
3847 return replaceInstUsesWith(
3848 SI, Builder.CreateIntrinsic(SI.getType(), IID, {LHS, RHS}));
3849 return nullptr;
3850}
3851
3853 const Instruction *CtxI) const {
3854 KnownFPClass Known = computeKnownFPClass(MulVal, FMF, fcNegative, CtxI);
3855
3856 return Known.isKnownNeverNaN() && Known.isKnownNeverInfinity() &&
3857 (FMF.noSignedZeros() || Known.signBitIsZeroOrNaN());
3858}
3859
3860static bool matchFMulByZeroIfResultEqZero(InstCombinerImpl &IC, Value *Cmp0,
3861 Value *Cmp1, Value *TrueVal,
3862 Value *FalseVal, Instruction &CtxI,
3863 bool SelectIsNSZ) {
3864 Value *MulRHS;
3865 if (match(Cmp1, m_PosZeroFP()) &&
3866 match(TrueVal, m_c_FMul(m_Specific(Cmp0), m_Value(MulRHS)))) {
3867 FastMathFlags FMF = cast<FPMathOperator>(TrueVal)->getFastMathFlags();
3868 // nsz must be on the select, it must be ignored on the multiply. We
3869 // need nnan and ninf on the multiply for the other value.
3870 FMF.setNoSignedZeros(SelectIsNSZ);
3871 return IC.fmulByZeroIsZero(MulRHS, FMF, &CtxI);
3872 }
3873
3874 return false;
3875}
3876
3877/// Check whether the KnownBits of a select arm may be affected by the
3878/// select condition.
3879static bool hasAffectedValue(Value *V, SmallPtrSetImpl<Value *> &Affected,
3880 unsigned Depth) {
3882 return false;
3883
3884 // Ignore the case where the select arm itself is affected. These cases
3885 // are handled more efficiently by other optimizations.
3886 if (Depth != 0 && Affected.contains(V))
3887 return true;
3888
3889 if (auto *I = dyn_cast<Instruction>(V)) {
3890 if (isa<PHINode>(I)) {
3892 return false;
3894 }
3895 return any_of(I->operands(), [&](Value *Op) {
3896 return Op->getType()->isIntOrIntVectorTy() &&
3897 hasAffectedValue(Op, Affected, Depth + 1);
3898 });
3899 }
3900
3901 return false;
3902}
3903
3904// This transformation enables the possibility of transforming fcmp + sel into
3905// a fmaxnum/fminnum intrinsic.
3906static Value *foldSelectIntoAddConstant(SelectInst &SI,
3907 InstCombiner::BuilderTy &Builder) {
3908 // Do this transformation only when select instruction gives NaN and NSZ
3909 // guarantee.
3910 auto *SIFOp = dyn_cast<FPMathOperator>(&SI);
3911 if (!SIFOp || !SIFOp->hasNoSignedZeros() || !SIFOp->hasNoNaNs())
3912 return nullptr;
3913
3914 auto TryFoldIntoAddConstant =
3915 [&Builder, &SI](CmpInst::Predicate Pred, Value *X, Value *Z,
3916 Instruction *FAdd, Constant *C, bool Swapped) -> Value * {
3917 // Only these relational predicates can be transformed into maxnum/minnum
3918 // intrinsic.
3919 if (!CmpInst::isRelational(Pred) || !match(Z, m_AnyZeroFP()))
3920 return nullptr;
3921
3923 return nullptr;
3924
3925 Value *NewSelect = Builder.CreateSelect(SI.getCondition(), Swapped ? Z : X,
3926 Swapped ? X : Z, "", &SI);
3927 NewSelect->takeName(&SI);
3928
3929 Value *NewFAdd = Builder.CreateFAdd(NewSelect, C);
3930 NewFAdd->takeName(FAdd);
3931
3932 // Propagate FastMath flags
3933 FastMathFlags SelectFMF = SI.getFastMathFlags();
3934 FastMathFlags FAddFMF = FAdd->getFastMathFlags();
3935 FastMathFlags NewFMF = FastMathFlags::intersectRewrite(SelectFMF, FAddFMF) |
3936 FastMathFlags::unionValue(SelectFMF, FAddFMF);
3937 cast<Instruction>(NewFAdd)->setFastMathFlags(NewFMF);
3938 cast<Instruction>(NewSelect)->setFastMathFlags(NewFMF);
3939
3940 return NewFAdd;
3941 };
3942
3943 // select((fcmp Pred, X, 0), (fadd X, C), C)
3944 // => fadd((select (fcmp Pred, X, 0), X, 0), C)
3945 //
3946 // Pred := OGT, OGE, OLT, OLE, UGT, UGE, ULT, and ULE
3948 Constant *C;
3949 Value *X, *Z;
3950 CmpPredicate Pred;
3951
3952 // Note: OneUse check for `Cmp` is necessary because it makes sure that other
3953 // InstCombine folds don't undo this transformation and cause an infinite
3954 // loop. Furthermore, it could also increase the operation count.
3955 if (match(&SI, m_Select(m_OneUse(m_FCmp(Pred, m_Value(X), m_Value(Z))),
3957 return TryFoldIntoAddConstant(Pred, X, Z, FAdd, C, /*Swapped=*/false);
3958
3959 if (match(&SI, m_Select(m_OneUse(m_FCmp(Pred, m_Value(X), m_Value(Z))),
3961 return TryFoldIntoAddConstant(Pred, X, Z, FAdd, C, /*Swapped=*/true);
3962
3963 return nullptr;
3964}
3965
3966static Value *foldSelectBitTest(SelectInst &Sel, Value *CondVal, Value *TrueVal,
3967 Value *FalseVal,
3968 InstCombiner::BuilderTy &Builder,
3969 const SimplifyQuery &SQ) {
3970 // If this is a vector select, we need a vector compare.
3971 Type *SelType = Sel.getType();
3972 if (SelType->isVectorTy() != CondVal->getType()->isVectorTy())
3973 return nullptr;
3974
3975 Value *V;
3976 APInt AndMask;
3977 bool CreateAnd = false;
3978 CmpPredicate Pred;
3979 Value *CmpLHS, *CmpRHS;
3980
3981 if (match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS)))) {
3982 if (ICmpInst::isEquality(Pred)) {
3983 if (!match(CmpRHS, m_Zero()))
3984 return nullptr;
3985
3986 V = CmpLHS;
3987 const APInt *AndRHS;
3988 if (!match(CmpLHS, m_And(m_Value(), m_Power2(AndRHS))))
3989 return nullptr;
3990
3991 AndMask = *AndRHS;
3992 } else if (auto Res = decomposeBitTestICmp(CmpLHS, CmpRHS, Pred)) {
3993 assert(ICmpInst::isEquality(Res->Pred) && "Not equality test?");
3994 AndMask = Res->Mask;
3995 V = Res->X;
3996 KnownBits Known = computeKnownBits(V, SQ.getWithInstruction(&Sel));
3997 AndMask &= Known.getMaxValue();
3998 if (!AndMask.isPowerOf2())
3999 return nullptr;
4000
4001 Pred = Res->Pred;
4002 CreateAnd = true;
4003 } else {
4004 return nullptr;
4005 }
4006 } else if (auto *Trunc = dyn_cast<TruncInst>(CondVal)) {
4007 V = Trunc->getOperand(0);
4008 AndMask = APInt(V->getType()->getScalarSizeInBits(), 1);
4009 Pred = ICmpInst::ICMP_NE;
4010 CreateAnd = !Trunc->hasNoUnsignedWrap();
4011 } else {
4012 return nullptr;
4013 }
4014
4015 if (Pred == ICmpInst::ICMP_NE)
4016 std::swap(TrueVal, FalseVal);
4017
4018 if (Value *X = foldSelectICmpAnd(Sel, CondVal, TrueVal, FalseVal, V, AndMask,
4019 CreateAnd, Builder))
4020 return X;
4021
4022 if (Value *X = foldSelectICmpAndBinOp(CondVal, TrueVal, FalseVal, V, AndMask,
4023 CreateAnd, Builder))
4024 return X;
4025
4026 return nullptr;
4027}
4028
4030 Value *CondVal = SI.getCondition();
4031 Value *TrueVal = SI.getTrueValue();
4032 Value *FalseVal = SI.getFalseValue();
4033 Type *SelType = SI.getType();
4034
4035 if (Value *V = simplifySelectInst(CondVal, TrueVal, FalseVal,
4036 SQ.getWithInstruction(&SI)))
4037 return replaceInstUsesWith(SI, V);
4038
4039 if (Instruction *I = canonicalizeSelectToShuffle(SI))
4040 return I;
4041
4042 if (Instruction *I = canonicalizeScalarSelectOfVecs(SI, *this))
4043 return I;
4044
4045 // If the type of select is not an integer type or if the condition and
4046 // the selection type are not both scalar nor both vector types, there is no
4047 // point in attempting to match these patterns.
4048 Type *CondType = CondVal->getType();
4049 if (!isa<Constant>(CondVal) && SelType->isIntOrIntVectorTy() &&
4050 CondType->isVectorTy() == SelType->isVectorTy()) {
4051 if (Value *S = simplifyWithOpReplaced(TrueVal, CondVal,
4052 ConstantInt::getTrue(CondType), SQ,
4053 /* AllowRefinement */ true))
4054 return replaceOperand(SI, 1, S);
4055
4056 if (Value *S = simplifyWithOpReplaced(FalseVal, CondVal,
4057 ConstantInt::getFalse(CondType), SQ,
4058 /* AllowRefinement */ true))
4059 return replaceOperand(SI, 2, S);
4060
4061 if (replaceInInstruction(TrueVal, CondVal,
4062 ConstantInt::getTrue(CondType)) ||
4063 replaceInInstruction(FalseVal, CondVal,
4064 ConstantInt::getFalse(CondType)))
4065 return &SI;
4066 }
4067
4068 if (Instruction *R = foldSelectOfBools(SI))
4069 return R;
4070
4071 // Selecting between two integer or vector splat integer constants?
4072 //
4073 // Note that we don't handle a scalar select of vectors:
4074 // select i1 %c, <2 x i8> <1, 1>, <2 x i8> <0, 0>
4075 // because that may need 3 instructions to splat the condition value:
4076 // extend, insertelement, shufflevector.
4077 //
4078 // Do not handle i1 TrueVal and FalseVal otherwise would result in
4079 // zext/sext i1 to i1.
4080 if (SelType->isIntOrIntVectorTy() && !SelType->isIntOrIntVectorTy(1) &&
4081 CondVal->getType()->isVectorTy() == SelType->isVectorTy()) {
4082 // select C, 1, 0 -> zext C to int
4083 if (match(TrueVal, m_One()) && match(FalseVal, m_Zero()))
4084 return new ZExtInst(CondVal, SelType);
4085
4086 // select C, -1, 0 -> sext C to int
4087 if (match(TrueVal, m_AllOnes()) && match(FalseVal, m_Zero()))
4088 return new SExtInst(CondVal, SelType);
4089
4090 // select C, 0, 1 -> zext !C to int
4091 if (match(TrueVal, m_Zero()) && match(FalseVal, m_One())) {
4092 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
4093 return new ZExtInst(NotCond, SelType);
4094 }
4095
4096 // select C, 0, -1 -> sext !C to int
4097 if (match(TrueVal, m_Zero()) && match(FalseVal, m_AllOnes())) {
4098 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
4099 return new SExtInst(NotCond, SelType);
4100 }
4101 }
4102
4103 auto *SIFPOp = dyn_cast<FPMathOperator>(&SI);
4104
4105 if (auto *FCmp = dyn_cast<FCmpInst>(CondVal)) {
4106 FCmpInst::Predicate Pred = FCmp->getPredicate();
4107 Value *Cmp0 = FCmp->getOperand(0), *Cmp1 = FCmp->getOperand(1);
4108 // Are we selecting a value based on a comparison of the two values?
4109 if ((Cmp0 == TrueVal && Cmp1 == FalseVal) ||
4110 (Cmp0 == FalseVal && Cmp1 == TrueVal)) {
4111 // Canonicalize to use ordered comparisons by swapping the select
4112 // operands.
4113 //
4114 // e.g.
4115 // (X ugt Y) ? X : Y -> (X ole Y) ? Y : X
4116 if (FCmp->hasOneUse() && FCmpInst::isUnordered(Pred)) {
4117 FCmpInst::Predicate InvPred = FCmp->getInversePredicate();
4118 Value *NewCond = Builder.CreateFCmpFMF(InvPred, Cmp0, Cmp1, FCmp,
4119 FCmp->getName() + ".inv");
4120 // Propagate ninf/nnan from fcmp to select.
4121 FastMathFlags FMF = SI.getFastMathFlags();
4122 if (FCmp->hasNoNaNs())
4123 FMF.setNoNaNs(true);
4124 if (FCmp->hasNoInfs())
4125 FMF.setNoInfs(true);
4126 Value *NewSel =
4127 Builder.CreateSelectFMF(NewCond, FalseVal, TrueVal, FMF);
4128 return replaceInstUsesWith(SI, NewSel);
4129 }
4130 }
4131
4132 if (SIFPOp) {
4133 // Fold out scale-if-equals-zero pattern.
4134 //
4135 // This pattern appears in code with denormal range checks after it's
4136 // assumed denormals are treated as zero. This drops a canonicalization.
4137
4138 // TODO: Could relax the signed zero logic. We just need to know the sign
4139 // of the result matches (fmul x, y has the same sign as x).
4140 //
4141 // TODO: Handle always-canonicalizing variant that selects some value or 1
4142 // scaling factor in the fmul visitor.
4143
4144 // TODO: Handle ldexp too
4145
4146 Value *MatchCmp0 = nullptr;
4147 Value *MatchCmp1 = nullptr;
4148
4149 // (select (fcmp [ou]eq x, 0.0), (fmul x, K), x => x
4150 // (select (fcmp [ou]ne x, 0.0), x, (fmul x, K) => x
4151 if (Pred == CmpInst::FCMP_OEQ || Pred == CmpInst::FCMP_UEQ) {
4152 MatchCmp0 = FalseVal;
4153 MatchCmp1 = TrueVal;
4154 } else if (Pred == CmpInst::FCMP_ONE || Pred == CmpInst::FCMP_UNE) {
4155 MatchCmp0 = TrueVal;
4156 MatchCmp1 = FalseVal;
4157 }
4158
4159 if (Cmp0 == MatchCmp0 &&
4160 matchFMulByZeroIfResultEqZero(*this, Cmp0, Cmp1, MatchCmp1, MatchCmp0,
4161 SI, SIFPOp->hasNoSignedZeros()))
4162 return replaceInstUsesWith(SI, Cmp0);
4163 }
4164 }
4165
4166 if (SIFPOp) {
4167 // TODO: Try to forward-propagate FMF from select arms to the select.
4168
4169 auto *FCmp = dyn_cast<FCmpInst>(CondVal);
4170
4171 // Canonicalize select of FP values where NaN and -0.0 are not valid as
4172 // minnum/maxnum intrinsics.
4173 if (SIFPOp->hasNoNaNs() &&
4174 (SIFPOp->hasNoSignedZeros() ||
4175 (SIFPOp->hasOneUse() &&
4176 canIgnoreSignBitOfZero(*SIFPOp->use_begin())))) {
4177 Value *X, *Y;
4178 if (match(&SI, m_OrdOrUnordFMax(m_Value(X), m_Value(Y)))) {
4179 Value *BinIntr =
4180 Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, X, Y, &SI);
4181 if (auto *BinIntrInst = dyn_cast<Instruction>(BinIntr)) {
4182 BinIntrInst->setHasNoNaNs(FCmp->hasNoNaNs());
4183 BinIntrInst->setHasNoInfs(FCmp->hasNoInfs());
4184 }
4185 return replaceInstUsesWith(SI, BinIntr);
4186 }
4187
4188 if (match(&SI, m_OrdOrUnordFMin(m_Value(X), m_Value(Y)))) {
4189 Value *BinIntr =
4190 Builder.CreateBinaryIntrinsic(Intrinsic::minnum, X, Y, &SI);
4191 if (auto *BinIntrInst = dyn_cast<Instruction>(BinIntr)) {
4192 BinIntrInst->setHasNoNaNs(FCmp->hasNoNaNs());
4193 BinIntrInst->setHasNoInfs(FCmp->hasNoInfs());
4194 }
4195 return replaceInstUsesWith(SI, BinIntr);
4196 }
4197 }
4198 }
4199
4200 // Fold selecting to fabs.
4201 if (Instruction *Fabs = foldSelectWithFCmpToFabs(SI, *this))
4202 return Fabs;
4203
4204 // See if we are selecting two values based on a comparison of the two values.
4205 if (CmpInst *CI = dyn_cast<CmpInst>(CondVal))
4206 if (Instruction *NewSel = foldSelectValueEquivalence(SI, *CI))
4207 return NewSel;
4208
4209 if (ICmpInst *ICI = dyn_cast<ICmpInst>(CondVal))
4210 if (Instruction *Result = foldSelectInstWithICmp(SI, ICI))
4211 return Result;
4212
4213 if (Value *V = foldSelectBitTest(SI, CondVal, TrueVal, FalseVal, Builder, SQ))
4214 return replaceInstUsesWith(SI, V);
4215
4216 if (Instruction *Add = foldAddSubSelect(SI, Builder))
4217 return Add;
4218 if (Instruction *Add = foldOverflowingAddSubSelect(SI, Builder))
4219 return Add;
4220 if (Instruction *Or = foldSetClearBits(SI, Builder))
4221 return Or;
4222 if (Instruction *Mul = foldSelectZeroOrFixedOp(SI, *this))
4223 return Mul;
4224
4225 // Turn (select C, (op X, Y), (op X, Z)) -> (op X, (select C, Y, Z))
4226 auto *TI = dyn_cast<Instruction>(TrueVal);
4227 auto *FI = dyn_cast<Instruction>(FalseVal);
4228 if (TI && FI && TI->getOpcode() == FI->getOpcode())
4229 if (Instruction *IV = foldSelectOpOp(SI, TI, FI))
4230 return IV;
4231
4232 if (Instruction *I = foldSelectExtConst(SI))
4233 return I;
4234
4235 if (Instruction *I = foldSelectWithSRem(SI, *this, Builder))
4236 return I;
4237
4238 // Fold (select C, (gep Ptr, Idx), Ptr) -> (gep Ptr, (select C, Idx, 0))
4239 // Fold (select C, Ptr, (gep Ptr, Idx)) -> (gep Ptr, (select C, 0, Idx))
4240 auto SelectGepWithBase = [&](GetElementPtrInst *Gep, Value *Base,
4241 bool Swap) -> GetElementPtrInst * {
4242 Value *Ptr = Gep->getPointerOperand();
4243 if (Gep->getNumOperands() != 2 || Gep->getPointerOperand() != Base ||
4244 !Gep->hasOneUse())
4245 return nullptr;
4246 Value *Idx = Gep->getOperand(1);
4247 if (isa<VectorType>(CondVal->getType()) && !isa<VectorType>(Idx->getType()))
4248 return nullptr;
4250 Value *NewT = Idx;
4251 Value *NewF = Constant::getNullValue(Idx->getType());
4252 if (Swap)
4253 std::swap(NewT, NewF);
4254 Value *NewSI =
4255 Builder.CreateSelect(CondVal, NewT, NewF, SI.getName() + ".idx", &SI);
4256 return GetElementPtrInst::Create(ElementType, Ptr, NewSI,
4257 Gep->getNoWrapFlags());
4258 };
4259 if (auto *TrueGep = dyn_cast<GetElementPtrInst>(TrueVal))
4260 if (auto *NewGep = SelectGepWithBase(TrueGep, FalseVal, false))
4261 return NewGep;
4262 if (auto *FalseGep = dyn_cast<GetElementPtrInst>(FalseVal))
4263 if (auto *NewGep = SelectGepWithBase(FalseGep, TrueVal, true))
4264 return NewGep;
4265
4266 // See if we can fold the select into one of our operands.
4267 if (SelType->isIntOrIntVectorTy() || SelType->isFPOrFPVectorTy()) {
4268 if (Instruction *FoldI = foldSelectIntoOp(SI, TrueVal, FalseVal))
4269 return FoldI;
4270
4271 Value *LHS, *RHS;
4272 Instruction::CastOps CastOp;
4273 SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);
4274 auto SPF = SPR.Flavor;
4275 if (SPF) {
4276 Value *LHS2, *RHS2;
4277 if (SelectPatternFlavor SPF2 = matchSelectPattern(LHS, LHS2, RHS2).Flavor)
4278 if (Instruction *R = foldSPFofSPF(cast<Instruction>(LHS), SPF2, LHS2,
4279 RHS2, SI, SPF, RHS))
4280 return R;
4281 if (SelectPatternFlavor SPF2 = matchSelectPattern(RHS, LHS2, RHS2).Flavor)
4282 if (Instruction *R = foldSPFofSPF(cast<Instruction>(RHS), SPF2, LHS2,
4283 RHS2, SI, SPF, LHS))
4284 return R;
4285 }
4286
4288 // Canonicalize so that
4289 // - type casts are outside select patterns.
4290 // - float clamp is transformed to min/max pattern
4291
4292 bool IsCastNeeded = LHS->getType() != SelType;
4293 Value *CmpLHS = cast<CmpInst>(CondVal)->getOperand(0);
4294 Value *CmpRHS = cast<CmpInst>(CondVal)->getOperand(1);
4295 if (IsCastNeeded ||
4296 (LHS->getType()->isFPOrFPVectorTy() &&
4297 ((CmpLHS != LHS && CmpLHS != RHS) ||
4298 (CmpRHS != LHS && CmpRHS != RHS)))) {
4299 CmpInst::Predicate MinMaxPred = getMinMaxPred(SPF, SPR.Ordered);
4300
4301 Value *Cmp;
4302 if (CmpInst::isIntPredicate(MinMaxPred))
4303 Cmp = Builder.CreateICmp(MinMaxPred, LHS, RHS);
4304 else
4305 Cmp = Builder.CreateFCmpFMF(MinMaxPred, LHS, RHS,
4306 cast<Instruction>(SI.getCondition()));
4307
4308 Value *NewSI = Builder.CreateSelect(Cmp, LHS, RHS, SI.getName(), &SI);
4309 if (!IsCastNeeded)
4310 return replaceInstUsesWith(SI, NewSI);
4311
4312 Value *NewCast = Builder.CreateCast(CastOp, NewSI, SelType);
4313 return replaceInstUsesWith(SI, NewCast);
4314 }
4315 }
4316 }
4317
4318 // See if we can fold the select into a phi node if the condition is a select.
4319 if (auto *PN = dyn_cast<PHINode>(SI.getCondition()))
4320 if (Instruction *NV = foldOpIntoPhi(SI, PN))
4321 return NV;
4322
4323 if (SelectInst *TrueSI = dyn_cast<SelectInst>(TrueVal)) {
4324 if (TrueSI->getCondition()->getType() == CondVal->getType()) {
4325 // Fold nested selects if the inner condition can be implied by the outer
4326 // condition.
4327 if (Value *V = simplifyNestedSelectsUsingImpliedCond(
4328 *TrueSI, CondVal, /*CondIsTrue=*/true, DL))
4329 return replaceOperand(SI, 1, V);
4330
4331 // select(C0, select(C1, a, b), b) -> select(C0&C1, a, b)
4332 // We choose this as normal form to enable folding on the And and
4333 // shortening paths for the values (this helps getUnderlyingObjects() for
4334 // example).
4335 if (TrueSI->getFalseValue() == FalseVal && TrueSI->hasOneUse()) {
4336 Value *And = Builder.CreateLogicalAnd(CondVal, TrueSI->getCondition());
4337 replaceOperand(SI, 0, And);
4338 replaceOperand(SI, 1, TrueSI->getTrueValue());
4339 return &SI;
4340 }
4341 }
4342 }
4343 if (SelectInst *FalseSI = dyn_cast<SelectInst>(FalseVal)) {
4344 if (FalseSI->getCondition()->getType() == CondVal->getType()) {
4345 // Fold nested selects if the inner condition can be implied by the outer
4346 // condition.
4347 if (Value *V = simplifyNestedSelectsUsingImpliedCond(
4348 *FalseSI, CondVal, /*CondIsTrue=*/false, DL))
4349 return replaceOperand(SI, 2, V);
4350
4351 // select(C0, a, select(C1, a, b)) -> select(C0|C1, a, b)
4352 if (FalseSI->getTrueValue() == TrueVal && FalseSI->hasOneUse()) {
4353 Value *Or = Builder.CreateLogicalOr(CondVal, FalseSI->getCondition());
4354 replaceOperand(SI, 0, Or);
4355 replaceOperand(SI, 2, FalseSI->getFalseValue());
4356 return &SI;
4357 }
4358 }
4359 }
4360
4361 // Try to simplify a binop sandwiched between 2 selects with the same
4362 // condition. This is not valid for div/rem because the select might be
4363 // preventing a division-by-zero.
4364 // TODO: A div/rem restriction is conservative; use something like
4365 // isSafeToSpeculativelyExecute().
4366 // select(C, binop(select(C, X, Y), W), Z) -> select(C, binop(X, W), Z)
4367 BinaryOperator *TrueBO;
4368 if (match(TrueVal, m_OneUse(m_BinOp(TrueBO))) && !TrueBO->isIntDivRem()) {
4369 if (auto *TrueBOSI = dyn_cast<SelectInst>(TrueBO->getOperand(0))) {
4370 if (TrueBOSI->getCondition() == CondVal) {
4371 replaceOperand(*TrueBO, 0, TrueBOSI->getTrueValue());
4372 Worklist.push(TrueBO);
4373 return &SI;
4374 }
4375 }
4376 if (auto *TrueBOSI = dyn_cast<SelectInst>(TrueBO->getOperand(1))) {
4377 if (TrueBOSI->getCondition() == CondVal) {
4378 replaceOperand(*TrueBO, 1, TrueBOSI->getTrueValue());
4379 Worklist.push(TrueBO);
4380 return &SI;
4381 }
4382 }
4383 }
4384
4385 // select(C, Z, binop(select(C, X, Y), W)) -> select(C, Z, binop(Y, W))
4386 BinaryOperator *FalseBO;
4387 if (match(FalseVal, m_OneUse(m_BinOp(FalseBO))) && !FalseBO->isIntDivRem()) {
4388 if (auto *FalseBOSI = dyn_cast<SelectInst>(FalseBO->getOperand(0))) {
4389 if (FalseBOSI->getCondition() == CondVal) {
4390 replaceOperand(*FalseBO, 0, FalseBOSI->getFalseValue());
4391 Worklist.push(FalseBO);
4392 return &SI;
4393 }
4394 }
4395 if (auto *FalseBOSI = dyn_cast<SelectInst>(FalseBO->getOperand(1))) {
4396 if (FalseBOSI->getCondition() == CondVal) {
4397 replaceOperand(*FalseBO, 1, FalseBOSI->getFalseValue());
4398 Worklist.push(FalseBO);
4399 return &SI;
4400 }
4401 }
4402 }
4403
4404 Value *NotCond;
4405 if (match(CondVal, m_Not(m_Value(NotCond))) &&
4407 replaceOperand(SI, 0, NotCond);
4408 SI.swapValues();
4409 SI.swapProfMetadata();
4410 return &SI;
4411 }
4412
4413 if (Instruction *I = foldVectorSelect(SI))
4414 return I;
4415
4416 // If we can compute the condition, there's no need for a select.
4417 // Like the above fold, we are attempting to reduce compile-time cost by
4418 // putting this fold here with limitations rather than in InstSimplify.
4419 // The motivation for this call into value tracking is to take advantage of
4420 // the assumption cache, so make sure that is populated.
4421 if (!CondVal->getType()->isVectorTy() && !AC.assumptions().empty()) {
4422 KnownBits Known(1);
4423 computeKnownBits(CondVal, Known, &SI);
4424 if (Known.One.isOne())
4425 return replaceInstUsesWith(SI, TrueVal);
4426 if (Known.Zero.isOne())
4427 return replaceInstUsesWith(SI, FalseVal);
4428 }
4429
4430 if (Instruction *BitCastSel = foldSelectCmpBitcasts(SI, Builder))
4431 return BitCastSel;
4432
4433 // Simplify selects that test the returned flag of cmpxchg instructions.
4434 if (Value *V = foldSelectCmpXchg(SI))
4435 return replaceInstUsesWith(SI, V);
4436
4437 if (Instruction *Select = foldSelectBinOpIdentity(SI, TLI, *this))
4438 return Select;
4439
4440 if (Instruction *Funnel = foldSelectFunnelShift(SI, Builder))
4441 return Funnel;
4442
4443 if (Instruction *Copysign = foldSelectToCopysign(SI, Builder))
4444 return Copysign;
4445
4446 if (Instruction *PN = foldSelectToPhi(SI, DT, Builder))
4447 return replaceInstUsesWith(SI, PN);
4448
4449 if (Value *Fr = foldSelectWithFrozenICmp(SI, Builder))
4450 return replaceInstUsesWith(SI, Fr);
4451
4452 if (Value *V = foldRoundUpIntegerWithPow2Alignment(SI, Builder))
4453 return replaceInstUsesWith(SI, V);
4454
4455 if (Value *V = foldSelectIntoAddConstant(SI, Builder))
4456 return replaceInstUsesWith(SI, V);
4457
4458 // select(mask, mload(,,mask,0), 0) -> mload(,,mask,0)
4459 // Load inst is intentionally not checked for hasOneUse()
4460 if (match(FalseVal, m_Zero()) &&
4461 (match(TrueVal, m_MaskedLoad(m_Value(), m_Value(), m_Specific(CondVal),
4462 m_CombineOr(m_Undef(), m_Zero()))) ||
4463 match(TrueVal, m_MaskedGather(m_Value(), m_Value(), m_Specific(CondVal),
4464 m_CombineOr(m_Undef(), m_Zero()))))) {
4465 auto *MaskedInst = cast<IntrinsicInst>(TrueVal);
4466 if (isa<UndefValue>(MaskedInst->getArgOperand(3)))
4467 MaskedInst->setArgOperand(3, FalseVal /* Zero */);
4468 return replaceInstUsesWith(SI, MaskedInst);
4469 }
4470
4471 Value *Mask;
4472 if (match(TrueVal, m_Zero()) &&
4473 (match(FalseVal, m_MaskedLoad(m_Value(), m_Value(), m_Value(Mask),
4474 m_CombineOr(m_Undef(), m_Zero()))) ||
4475 match(FalseVal, m_MaskedGather(m_Value(), m_Value(), m_Value(Mask),
4476 m_CombineOr(m_Undef(), m_Zero())))) &&
4477 (CondVal->getType() == Mask->getType())) {
4478 // We can remove the select by ensuring the load zeros all lanes the
4479 // select would have. We determine this by proving there is no overlap
4480 // between the load and select masks.
4481 // (i.e (load_mask & select_mask) == 0 == no overlap)
4482 bool CanMergeSelectIntoLoad = false;
4483 if (Value *V = simplifyAndInst(CondVal, Mask, SQ.getWithInstruction(&SI)))
4484 CanMergeSelectIntoLoad = match(V, m_Zero());
4485
4486 if (CanMergeSelectIntoLoad) {
4487 auto *MaskedInst = cast<IntrinsicInst>(FalseVal);
4488 if (isa<UndefValue>(MaskedInst->getArgOperand(3)))
4489 MaskedInst->setArgOperand(3, TrueVal /* Zero */);
4490 return replaceInstUsesWith(SI, MaskedInst);
4491 }
4492 }
4493
4494 if (Instruction *I = foldSelectOfSymmetricSelect(SI, Builder))
4495 return I;
4496
4497 if (Instruction *I = foldNestedSelects(SI, Builder))
4498 return I;
4499
4500 // Match logical variants of the pattern,
4501 // and transform them iff that gets rid of inversions.
4502 // (~x) | y --> ~(x & (~y))
4503 // (~x) & y --> ~(x | (~y))
4505 return &SI;
4506
4507 if (Instruction *I = foldBitCeil(SI, Builder, *this))
4508 return I;
4509
4510 if (Instruction *I = foldSelectToCmp(SI))
4511 return I;
4512
4513 if (Instruction *I = foldSelectEqualityTest(SI))
4514 return I;
4515
4516 // Fold:
4517 // (select A && B, T, F) -> (select A, (select B, T, F), F)
4518 // (select A || B, T, F) -> (select A, T, (select B, T, F))
4519 // if (select B, T, F) is foldable.
4520 // TODO: preserve FMF flags
4521 auto FoldSelectWithAndOrCond = [&](bool IsAnd, Value *A,
4522 Value *B) -> Instruction * {
4523 if (Value *V = simplifySelectInst(B, TrueVal, FalseVal,
4524 SQ.getWithInstruction(&SI)))
4525 return SelectInst::Create(A, IsAnd ? V : TrueVal, IsAnd ? FalseVal : V);
4526
4527 // Is (select B, T, F) a SPF?
4528 if (CondVal->hasOneUse() && SelType->isIntOrIntVectorTy()) {
4529 if (ICmpInst *Cmp = dyn_cast<ICmpInst>(B))
4530 if (Value *V = canonicalizeSPF(*Cmp, TrueVal, FalseVal, *this))
4531 return SelectInst::Create(A, IsAnd ? V : TrueVal,
4532 IsAnd ? FalseVal : V);
4533 }
4534
4535 return nullptr;
4536 };
4537
4538 Value *LHS, *RHS;
4539 if (match(CondVal, m_And(m_Value(LHS), m_Value(RHS)))) {
4540 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS, RHS))
4541 return I;
4542 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, RHS, LHS))
4543 return I;
4544 } else if (match(CondVal, m_Or(m_Value(LHS), m_Value(RHS)))) {
4545 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS, RHS))
4546 return I;
4547 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, RHS, LHS))
4548 return I;
4549 } else {
4550 // We cannot swap the operands of logical and/or.
4551 // TODO: Can we swap the operands by inserting a freeze?
4552 if (match(CondVal, m_LogicalAnd(m_Value(LHS), m_Value(RHS)))) {
4553 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS, RHS))
4554 return I;
4555 } else if (match(CondVal, m_LogicalOr(m_Value(LHS), m_Value(RHS)))) {
4556 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS, RHS))
4557 return I;
4558 }
4559 }
4560
4561 // select Cond, !X, X -> xor Cond, X
4562 if (CondVal->getType() == SI.getType() && isKnownInversion(FalseVal, TrueVal))
4563 return BinaryOperator::CreateXor(CondVal, FalseVal);
4564
4565 // For vectors, this transform is only safe if the simplification does not
4566 // look through any lane-crossing operations. For now, limit to scalars only.
4567 if (SelType->isIntegerTy() &&
4568 (!isa<Constant>(TrueVal) || !isa<Constant>(FalseVal))) {
4569 // Try to simplify select arms based on KnownBits implied by the condition.
4570 CondContext CC(CondVal);
4571 findValuesAffectedByCondition(CondVal, /*IsAssume=*/false, [&](Value *V) {
4572 CC.AffectedValues.insert(V);
4573 });
4574 SimplifyQuery Q = SQ.getWithInstruction(&SI).getWithCondContext(CC);
4575 if (!CC.AffectedValues.empty()) {
4576 if (!isa<Constant>(TrueVal) &&
4577 hasAffectedValue(TrueVal, CC.AffectedValues, /*Depth=*/0)) {
4578 KnownBits Known = llvm::computeKnownBits(TrueVal, Q);
4579 if (Known.isConstant())
4580 return replaceOperand(SI, 1,
4581 ConstantInt::get(SelType, Known.getConstant()));
4582 }
4583
4584 CC.Invert = true;
4585 if (!isa<Constant>(FalseVal) &&
4586 hasAffectedValue(FalseVal, CC.AffectedValues, /*Depth=*/0)) {
4587 KnownBits Known = llvm::computeKnownBits(FalseVal, Q);
4588 if (Known.isConstant())
4589 return replaceOperand(SI, 2,
4590 ConstantInt::get(SelType, Known.getConstant()));
4591 }
4592 }
4593 }
4594
4595 // select (trunc nuw X to i1), X, Y --> select (trunc nuw X to i1), 1, Y
4596 // select (trunc nuw X to i1), Y, X --> select (trunc nuw X to i1), Y, 0
4597 // select (trunc nsw X to i1), X, Y --> select (trunc nsw X to i1), -1, Y
4598 // select (trunc nsw X to i1), Y, X --> select (trunc nsw X to i1), Y, 0
4599 Value *Trunc;
4600 if (match(CondVal, m_NUWTrunc(m_Value(Trunc)))) {
4601 if (TrueVal == Trunc)
4602 return replaceOperand(SI, 1, ConstantInt::get(TrueVal->getType(), 1));
4603 if (FalseVal == Trunc)
4604 return replaceOperand(SI, 2, ConstantInt::get(FalseVal->getType(), 0));
4605 }
4606 if (match(CondVal, m_NSWTrunc(m_Value(Trunc)))) {
4607 if (TrueVal == Trunc)
4608 return replaceOperand(SI, 1,
4610 if (FalseVal == Trunc)
4611 return replaceOperand(SI, 2, ConstantInt::get(FalseVal->getType(), 0));
4612 }
4613
4614 return nullptr;
4615}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
basic Basic Alias true
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const HexagonInstrInfo * TII
This file provides internal interfaces used to implement the InstCombine.
static Value * foldSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Try to fold a select to a min/max intrinsic.
static Value * canonicalizeSaturatedAdd(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
static Instruction * foldSetClearBits(SelectInst &Sel, InstCombiner::BuilderTy &Builder)
Canonicalize a set or clear of a masked set of constant bits to select-of-constants form.
static Instruction * foldSelectICmpAndAnd(Type *SelType, const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1) into: zext (icmp ne i32 (a...
static unsigned getSelectFoldableOperands(BinaryOperator *I)
We want to turn code that looks like this: C = or A, B D = select cond, C, A into: C = select cond,...
static Value * canonicalizeSaturatedSubtract(const ICmpInst *ICI, const Value *TrueVal, const Value *FalseVal, InstCombiner::BuilderTy &Builder)
Transform patterns such as (a > b) ?
static Value * foldAbsDiff(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
Try to match patterns with select and subtract as absolute difference.
static Instruction * foldSelectZeroOrFixedOp(SelectInst &SI, InstCombinerImpl &IC)
static Instruction * foldSelectBinOpIdentity(SelectInst &Sel, const TargetLibraryInfo &TLI, InstCombinerImpl &IC)
Replace a select operand based on an equality comparison with the identity constant of a binop.
static Value * foldSelectICmpAnd(SelectInst &Sel, Value *CondVal, Value *TrueVal, Value *FalseVal, Value *V, const APInt &AndMask, bool CreateAnd, InstCombiner::BuilderTy &Builder)
This folds: select (icmp eq (and X, C1)), TC, FC iff C1 is a power 2 and the difference between TC an...
static Value * foldSelectICmpAndZeroShl(const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, C1), 0), 0, (shl [nsw/nuw] X, C2)); iff C1 is a mask and th...
static Value * foldSelectICmpLshrAshr(const ICmpInst *IC, Value *TrueVal, Value *FalseVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp sgt x, C), lshr (X, Y), ashr (X, Y)); iff C s>= -1 (select (icmp slt x...
static bool isSelect01(const APInt &C1I, const APInt &C2I)
static Value * foldSelectICmpAndBinOp(Value *CondVal, Value *TrueVal, Value *FalseVal, Value *V, const APInt &AndMask, bool CreateAnd, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, C1), 0), Y, (BinOp Y, C2)) into: IF C2 u>= C1 (BinOp Y,...
This file provides the interface for the instcombine pass implementation.
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
Machine Check Debug Module
#define T
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
bool bitwiseIsEqual(const APFloat &RHS) const
Definition APFloat.h:1414
bool isNegative() const
Definition APFloat.h:1449
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:234
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:229
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:423
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1540
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:371
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:380
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1488
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:209
bool isMinValue() const
Determine if this is the smallest unsigned value.
Definition APInt.h:417
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:219
unsigned countLeadingZeros() const
Definition APInt.h:1606
unsigned logBase2() const
Definition APInt.h:1761
bool isMask(unsigned numBits) const
Definition APInt.h:488
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:405
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:334
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:440
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:200
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:389
bool isMaxValue() const
Determine if this is the largest unsigned value.
Definition APInt.h:399
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
An instruction that atomically checks whether a specified value is in a memory location,...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:459
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
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.
This class represents a no-op cast from one type to another.
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)
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
This class is the base class for the comparison instructions.
Definition InstrTypes.h:666
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:678
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:681
@ ICMP_SLT
signed less than
Definition InstrTypes.h:707
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:708
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:684
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:693
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:682
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:683
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:702
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:701
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:705
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:692
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:686
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:689
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:703
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:690
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:700
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:706
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:694
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:704
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:691
bool isSigned() const
Definition InstrTypes.h:932
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:829
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:772
bool isNonStrictPredicate() const
Definition InstrTypes.h:854
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:925
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:791
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:767
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition InstrTypes.h:895
bool isIntPredicate() const
Definition InstrTypes.h:785
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:938
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
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 bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
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 binaryNot() const
Return a new range representing the possible values resulting from a binary-xor of a value in this ra...
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
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...
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isOneValue() const
Returns true if the value is one.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
unsigned size() const
Definition DenseMap.h:108
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:165
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Tagged union holding either a T or a Error.
Definition Error.h:485
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition Operator.h:200
FastMathFlags getFastMathFlags() const
Convenience function for getting all the fast-math flags.
Definition Operator.h:333
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:22
static FastMathFlags intersectRewrite(FastMathFlags LHS, FastMathFlags RHS)
Intersect rewrite-based flags.
Definition FMF.h:112
bool noSignedZeros() const
Definition FMF.h:67
bool noInfs() const
Definition FMF.h:66
static FastMathFlags unionValue(FastMathFlags LHS, FastMathFlags RHS)
Union value flags.
Definition FMF.h:120
void setNoSignedZeros(bool B=true)
Definition FMF.h:84
void setNoNaNs(bool B=true)
Definition FMF.h:78
bool noNaNs() const
Definition FMF.h:65
void setNoInfs(bool B=true)
Definition FMF.h:81
This class represents a freeze function that returns random concrete value if an operand is either a ...
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Type * getSourceElementType() const
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
This instruction compares its operands according to the predicate given to the constructor.
static CmpPredicate getSwappedCmpPredicate(CmpPredicate Pred)
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
CmpPredicate getInverseCmpPredicate() const
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
static CmpPredicate getInverseCmpPredicate(CmpPredicate Pred)
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).
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateFAdd(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1613
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Value * CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2357
LLVM_ABI Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
Value * CreateFreeze(Value *V, const Twine &Name="")
Definition IRBuilder.h:2637
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition IRBuilder.h:1781
LLVM_ABI Value * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type.
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition IRBuilder.h:2494
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 * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition IRBuilder.h:2082
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1551
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1403
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition IRBuilder.h:507
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
Definition IRBuilder.h:2651
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition IRBuilder.h:2068
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2361
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1599
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2439
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1790
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1573
Instruction * foldSelectToCmp(SelectInst &SI)
bool fmulByZeroIsZero(Value *MulVal, FastMathFlags FMF, const Instruction *CtxI) const
Check if fmul MulVal, +0.0 will yield +0.0 (or signed zero is ignorable).
KnownFPClass computeKnownFPClass(Value *Val, FastMathFlags FMF, FPClassTest Interested=fcAllFlags, const Instruction *CtxI=nullptr, unsigned Depth=0) const
Instruction * foldSelectEqualityTest(SelectInst &SI)
Instruction * foldSelectValueEquivalence(SelectInst &SI, CmpInst &CI)
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,...
Instruction * foldVectorSelect(SelectInst &Sel)
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
Instruction * foldSPFofSPF(Instruction *Inner, SelectPatternFlavor SPF1, Value *A, Value *B, Instruction &Outer, SelectPatternFlavor SPF2, Value *C)
Instruction * foldSelectOpOp(SelectInst &SI, Instruction *TI, Instruction *FI)
We have (select c, TI, FI), and we know that TI and FI have the same opcode.
bool replaceInInstruction(Value *V, Value *Old, Value *New, unsigned Depth=0)
Instruction * foldSelectInstWithICmp(SelectInst &SI, ICmpInst *ICI)
bool sinkNotIntoOtherHandOfLogicalOp(Instruction &I)
Instruction * foldSelectIntoOp(SelectInst &SI, Value *, Value *)
Try to fold the select into one of the operands to allow further optimization.
Value * foldSelectWithConstOpToBinOp(ICmpInst *Cmp, Value *TrueVal, Value *FalseVal)
Instruction * visitSelectInst(SelectInst &SI)
Instruction * foldSelectOfBools(SelectInst &SI)
Instruction * foldSelectExtConst(SelectInst &Sel)
The core instruction combiner logic.
SimplifyQuery SQ
const DataLayout & getDataLayout() const
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
TargetLibraryInfo & TLI
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI)
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
const DataLayout & DL
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
AssumptionCache & AC
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
BuilderTy & Builder
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
static Constant * AddOne(Constant *C)
Add one to a Constant.
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.
LLVM_ABI bool isSameOperationAs(const Instruction *I, unsigned flags=0) const LLVM_READONLY
This function determines if the specified instruction executes the same operation as the current one.
bool isCast() const
LLVM_ABI void setHasNoSignedZeros(bool B)
Set or clear the no-signed-zeros flag on this instruction, which must be an operator which supports t...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void setHasNoNaNs(bool B)
Set or clear the no-nans flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI void swapProfMetadata()
If the instruction has "branch_weights" MD_prof metadata and the MDNode has three operands (including...
LLVM_ABI void setHasNoInfs(bool B)
Set or clear the no-infs flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
bool isIntDivRem() const
A wrapper class for inspecting calls to intrinsic functions.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, Instruction *MDFrom=nullptr)
const Value * getFalseValue() const
void swapValues()
Swap the true and false values of the select instruction.
const Value * getCondition() const
const Value * getTrueValue() const
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:168
This instruction constructs a fixed permutation of two input vectors.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool contains(ConstPtrType Ptr) const
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:356
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:231
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:294
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:270
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:225
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:147
op_range operands()
Definition User.h:292
Value * getOperand(unsigned i) const
Definition User.h:232
unsigned getNumOperands() const
Definition User.h:254
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI const Value * DoPHITranslation(const BasicBlock *CurBB, const BasicBlock *PredBB) const
Translate PHI node to its predecessor from the given basic block.
Definition Value.cpp:1093
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
Represents an op.with.overflow intrinsic.
This class represents zero extension of integer types.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:134
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
int getMinValue(MCInstrInfo const &MCII, MCInst const &MCI)
Return the minimum value of an extendable operand.
int getMaxValue(MCInstrInfo const &MCII, MCInst const &MCI)
Return the maximum value of an extendable operand.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOpc_match< LHS, RHS, false > m_BinOp(unsigned Opcode, const LHS &L, const RHS &R)
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)
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< cst_pred_ty< is_all_ones, false >, ValTy, Instruction::Xor, true > m_NotForbidPoison(const ValTy &V)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FMul, true > m_c_FMul(const LHS &L, const RHS &R)
Matches FMul with LHS and RHS in either order.
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.
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
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)
LogicalOp_match< LHS, RHS, Instruction::And > m_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R either in the form of L & R or L ?
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
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.
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we 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.
constantexpr_match m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
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.
match_combine_or< MaxMin_match< FCmpInst, LHS, RHS, ofmin_pred_ty >, MaxMin_match< FCmpInst, LHS, RHS, ufmin_pred_ty > > m_OrdOrUnordFMin(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point minimum function.
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.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
cst_pred_ty< is_any_apint > m_AnyIntegralConstant()
Match an integer or vector with any integral constant.
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
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)
match_combine_or< typename m_Intrinsic_Ty< T0, T1 >::Ty, typename m_Intrinsic_Ty< T1, T0 >::Ty > m_c_Intrinsic(const T0 &Op0, const T1 &Op1)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2, Opnd3 >::Ty m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2, const Opnd3 &Op3)
Matches MaskedLoad Intrinsic.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
apint_match m_APIntForbidPoison(const APInt *&Res)
Match APInt while forbidding poison in splat vector constants.
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty > m_UMax(const LHS &L, const RHS &R)
class_match< CmpInst > m_Cmp()
Matches any compare instruction and ignore it.
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
auto m_c_LogicalOp(const LHS &L, const RHS &R)
Matches either L && R or L || R with LHS and RHS in either order.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
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.
apfloat_match m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
match_combine_or< MaxMin_match< FCmpInst, LHS, RHS, ofmax_pred_ty >, MaxMin_match< FCmpInst, LHS, RHS, ufmax_pred_ty > > m_OrdOrUnordFMax(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point maximum function.
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
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)
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.
LogicalOp_match< LHS, RHS, Instruction::And, true > m_c_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
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.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > > > m_MaxOrMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
class_match< BasicBlock > m_BasicBlock()
Match an arbitrary basic block value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
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.
LogicalOp_match< LHS, RHS, Instruction::Or, true > m_c_LogicalOr(const LHS &L, const RHS &R)
Matches L || R with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, ICmpInst, true > m_c_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
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.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > m_UMin(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2, Opnd3 >::Ty m_MaskedGather(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2, const Opnd3 &Op3)
Matches MaskedGather Intrinsic.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
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.
ElementType
The element type of an SRV or UAV resource.
Definition DXILABI.h:60
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
LLVM_ABI Constant * ConstantFoldBinaryIntrinsic(Intrinsic::ID ID, Constant *LHS, Constant *RHS, Type *Ty, Instruction *FMFSource)
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:649
APFloat abs(APFloat X)
Returns the absolute value of the argument.
Definition APFloat.h:1563
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.
LLVM_ABI CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
LLVM_ABI bool canIgnoreSignBitOfZero(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is zero.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1721
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...
constexpr unsigned MaxAnalysisRecursionDepth
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:288
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI SelectPatternResult getSelectPattern(CmpInst::Predicate Pred, SelectPatternNaNBehavior NaNBehavior=SPNB_NA, bool Ordered=false)
Determine the pattern for predicate X Pred Y ? X : Y.
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 cannotBeNegativeZero(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if we can prove that the specified FP value is never equal to -0.0.
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:1728
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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 Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI bool isKnownInversion(const Value *X, const Value *Y)
Return true iff:
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:548
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
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 int PoisonMaskElem
LLVM_ABI Intrinsic::ID getMinMaxIntrinsic(SelectPatternFlavor SPF)
Convert given SPF to equivalent min/max intrinsic.
LLVM_ABI SelectPatternResult matchDecomposedSelectPattern(CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, FastMathFlags FMF=FastMathFlags(), Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Determine the pattern that a select with the given compare as its predicate and given values as its t...
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ And
Bitwise or logical AND of integers.
@ Add
Sum of integers.
@ FAdd
Sum of floats.
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
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...
LLVM_ABI Value * simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags=nullptr)
See if V simplifies when its operand Op is replaced with RepOp.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
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...
auto predecessors(const MachineBasicBlock *BB)
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 is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1886
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
bool isCheckForZeroAndMulWithOverflow(Value *Op0, Value *Op1, bool IsAnd, Use *&Y)
Match one of the patterns up to the select/logic op: Op0 = icmp ne i4 X, 0 Agg = call { i4,...
LLVM_ABI Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
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 bool canIgnoreSignBitOfNaN(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is NaN.
LLVM_ABI void findValuesAffectedByCondition(Value *Cond, bool IsAssume, function_ref< void(Value *)> InsertAffected)
Call InsertAffected on all Values whose known bits / value may be affected by the condition Cond.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:853
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:138
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:60
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool signBitIsZeroOrNaN() const
Return true if the sign bit must be 0, ignoring the sign of nans.
SelectPatternFlavor Flavor
bool Ordered
Only applicable if Flavor is SPF_FMINNUM or SPF_FMAXNUM.
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
SimplifyQuery getWithInstruction(const Instruction *I) const