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