1 //===- InstCombineSelect.cpp ----------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the visitSelect function.
11 //===----------------------------------------------------------------------===//
13 #include "InstCombineInternal.h"
14 #include "llvm/ADT/APInt.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/Analysis/AssumptionCache.h"
18 #include "llvm/Analysis/CmpInstAnalysis.h"
19 #include "llvm/Analysis/InstructionSimplify.h"
20 #include "llvm/Analysis/OverflowInstAnalysis.h"
21 #include "llvm/Analysis/ValueTracking.h"
22 #include "llvm/Analysis/VectorUtils.h"
23 #include "llvm/IR/BasicBlock.h"
24 #include "llvm/IR/Constant.h"
25 #include "llvm/IR/ConstantRange.h"
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/DerivedTypes.h"
28 #include "llvm/IR/IRBuilder.h"
29 #include "llvm/IR/InstrTypes.h"
30 #include "llvm/IR/Instruction.h"
31 #include "llvm/IR/Instructions.h"
32 #include "llvm/IR/IntrinsicInst.h"
33 #include "llvm/IR/Intrinsics.h"
34 #include "llvm/IR/Operator.h"
35 #include "llvm/IR/PatternMatch.h"
36 #include "llvm/IR/Type.h"
37 #include "llvm/IR/User.h"
38 #include "llvm/IR/Value.h"
39 #include "llvm/Support/Casting.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/KnownBits.h"
42 #include "llvm/Transforms/InstCombine/InstCombiner.h"
46 #define DEBUG_TYPE "instcombine"
47 #include "llvm/Transforms/Utils/InstructionWorklist.h"
50 using namespace PatternMatch
;
53 /// Replace a select operand based on an equality comparison with the identity
54 /// constant of a binop.
55 static Instruction
*foldSelectBinOpIdentity(SelectInst
&Sel
,
56 const TargetLibraryInfo
&TLI
,
57 InstCombinerImpl
&IC
) {
58 // The select condition must be an equality compare with a constant operand.
61 CmpInst::Predicate Pred
;
62 if (!match(Sel
.getCondition(), m_Cmp(Pred
, m_Value(X
), m_Constant(C
))))
66 if (ICmpInst::isEquality(Pred
))
67 IsEq
= Pred
== ICmpInst::ICMP_EQ
;
68 else if (Pred
== FCmpInst::FCMP_OEQ
)
70 else if (Pred
== FCmpInst::FCMP_UNE
)
75 // A select operand must be a binop.
77 if (!match(Sel
.getOperand(IsEq
? 1 : 2), m_BinOp(BO
)))
80 // The compare constant must be the identity constant for that binop.
81 // If this a floating-point compare with 0.0, any zero constant will do.
82 Type
*Ty
= BO
->getType();
83 Constant
*IdC
= ConstantExpr::getBinOpIdentity(BO
->getOpcode(), Ty
, true);
85 if (!IdC
|| !CmpInst::isFPPredicate(Pred
))
87 if (!match(IdC
, m_AnyZeroFP()) || !match(C
, m_AnyZeroFP()))
91 // Last, match the compare variable operand with a binop operand.
93 if (!BO
->isCommutative() && !match(BO
, m_BinOp(m_Value(Y
), m_Specific(X
))))
95 if (!match(BO
, m_c_BinOp(m_Value(Y
), m_Specific(X
))))
98 // +0.0 compares equal to -0.0, and so it does not behave as required for this
99 // transform. Bail out if we can not exclude that possibility.
100 if (isa
<FPMathOperator
>(BO
))
101 if (!BO
->hasNoSignedZeros() &&
102 !cannotBeNegativeZero(Y
, IC
.getDataLayout(), &TLI
))
106 // S = { select (cmp eq X, C), BO, ? } or { select (cmp ne X, C), ?, BO }
108 // S = { select (cmp eq X, C), Y, ? } or { select (cmp ne X, C), ?, Y }
109 return IC
.replaceOperand(Sel
, IsEq
? 1 : 2, Y
);
113 /// select (icmp eq (and X, C1)), TC, FC
114 /// iff C1 is a power 2 and the difference between TC and FC is a power-of-2.
115 /// To something like:
116 /// (shr (and (X, C1)), (log2(C1) - log2(TC-FC))) + FC
118 /// (shl (and (X, C1)), (log2(TC-FC) - log2(C1))) + FC
119 /// With some variations depending if FC is larger than TC, or the shift
120 /// isn't needed, or the bit widths don't match.
121 static Value
*foldSelectICmpAnd(SelectInst
&Sel
, ICmpInst
*Cmp
,
122 InstCombiner::BuilderTy
&Builder
) {
123 const APInt
*SelTC
, *SelFC
;
124 if (!match(Sel
.getTrueValue(), m_APInt(SelTC
)) ||
125 !match(Sel
.getFalseValue(), m_APInt(SelFC
)))
128 // If this is a vector select, we need a vector compare.
129 Type
*SelType
= Sel
.getType();
130 if (SelType
->isVectorTy() != Cmp
->getType()->isVectorTy())
135 bool CreateAnd
= false;
136 ICmpInst::Predicate Pred
= Cmp
->getPredicate();
137 if (ICmpInst::isEquality(Pred
)) {
138 if (!match(Cmp
->getOperand(1), m_Zero()))
141 V
= Cmp
->getOperand(0);
143 if (!match(V
, m_And(m_Value(), m_Power2(AndRHS
))))
147 } else if (decomposeBitTestICmp(Cmp
->getOperand(0), Cmp
->getOperand(1),
149 assert(ICmpInst::isEquality(Pred
) && "Not equality test?");
150 if (!AndMask
.isPowerOf2())
158 // In general, when both constants are non-zero, we would need an offset to
159 // replace the select. This would require more instructions than we started
160 // with. But there's one special-case that we handle here because it can
161 // simplify/reduce the instructions.
164 if (!TC
.isZero() && !FC
.isZero()) {
165 // If the select constants differ by exactly one bit and that's the same
166 // bit that is masked and checked by the select condition, the select can
167 // be replaced by bitwise logic to set/clear one bit of the constant result.
168 if (TC
.getBitWidth() != AndMask
.getBitWidth() || (TC
^ FC
) != AndMask
)
171 // If we have to create an 'and', then we must kill the cmp to not
172 // increase the instruction count.
173 if (!Cmp
->hasOneUse())
175 V
= Builder
.CreateAnd(V
, ConstantInt::get(SelType
, AndMask
));
177 bool ExtraBitInTC
= TC
.ugt(FC
);
178 if (Pred
== ICmpInst::ICMP_EQ
) {
179 // If the masked bit in V is clear, clear or set the bit in the result:
180 // (V & AndMaskC) == 0 ? TC : FC --> (V & AndMaskC) ^ TC
181 // (V & AndMaskC) == 0 ? TC : FC --> (V & AndMaskC) | TC
182 Constant
*C
= ConstantInt::get(SelType
, TC
);
183 return ExtraBitInTC
? Builder
.CreateXor(V
, C
) : Builder
.CreateOr(V
, C
);
185 if (Pred
== ICmpInst::ICMP_NE
) {
186 // If the masked bit in V is set, set or clear the bit in the result:
187 // (V & AndMaskC) != 0 ? TC : FC --> (V & AndMaskC) | FC
188 // (V & AndMaskC) != 0 ? TC : FC --> (V & AndMaskC) ^ FC
189 Constant
*C
= ConstantInt::get(SelType
, FC
);
190 return ExtraBitInTC
? Builder
.CreateOr(V
, C
) : Builder
.CreateXor(V
, C
);
192 llvm_unreachable("Only expecting equality predicates");
195 // Make sure one of the select arms is a power-of-2.
196 if (!TC
.isPowerOf2() && !FC
.isPowerOf2())
199 // Determine which shift is needed to transform result of the 'and' into the
201 const APInt
&ValC
= !TC
.isZero() ? TC
: FC
;
202 unsigned ValZeros
= ValC
.logBase2();
203 unsigned AndZeros
= AndMask
.logBase2();
205 // Insert the 'and' instruction on the input to the truncate.
207 V
= Builder
.CreateAnd(V
, ConstantInt::get(V
->getType(), AndMask
));
209 // If types don't match, we can still convert the select by introducing a zext
210 // or a trunc of the 'and'.
211 if (ValZeros
> AndZeros
) {
212 V
= Builder
.CreateZExtOrTrunc(V
, SelType
);
213 V
= Builder
.CreateShl(V
, ValZeros
- AndZeros
);
214 } else if (ValZeros
< AndZeros
) {
215 V
= Builder
.CreateLShr(V
, AndZeros
- ValZeros
);
216 V
= Builder
.CreateZExtOrTrunc(V
, SelType
);
218 V
= Builder
.CreateZExtOrTrunc(V
, SelType
);
221 // Okay, now we know that everything is set up, we just don't know whether we
222 // have a icmp_ne or icmp_eq and whether the true or false val is the zero.
223 bool ShouldNotVal
= !TC
.isZero();
224 ShouldNotVal
^= Pred
== ICmpInst::ICMP_NE
;
226 V
= Builder
.CreateXor(V
, ValC
);
231 /// We want to turn code that looks like this:
233 /// %D = select %cond, %C, %A
235 /// %C = select %cond, %B, 0
238 /// Assuming that the specified instruction is an operand to the select, return
239 /// a bitmask indicating which operands of this instruction are foldable if they
240 /// equal the other incoming value of the select.
241 static unsigned getSelectFoldableOperands(BinaryOperator
*I
) {
242 switch (I
->getOpcode()) {
243 case Instruction::Add
:
244 case Instruction::FAdd
:
245 case Instruction::Mul
:
246 case Instruction::FMul
:
247 case Instruction::And
:
248 case Instruction::Or
:
249 case Instruction::Xor
:
250 return 3; // Can fold through either operand.
251 case Instruction::Sub
: // Can only fold on the amount subtracted.
252 case Instruction::FSub
:
253 case Instruction::FDiv
: // Can only fold on the divisor amount.
254 case Instruction::Shl
: // Can only fold on the shift amount.
255 case Instruction::LShr
:
256 case Instruction::AShr
:
259 return 0; // Cannot fold
263 /// We have (select c, TI, FI), and we know that TI and FI have the same opcode.
264 Instruction
*InstCombinerImpl::foldSelectOpOp(SelectInst
&SI
, Instruction
*TI
,
266 // Don't break up min/max patterns. The hasOneUse checks below prevent that
267 // for most cases, but vector min/max with bitcasts can be transformed. If the
268 // one-use restrictions are eased for other patterns, we still don't want to
269 // obfuscate min/max.
270 if ((match(&SI
, m_SMin(m_Value(), m_Value())) ||
271 match(&SI
, m_SMax(m_Value(), m_Value())) ||
272 match(&SI
, m_UMin(m_Value(), m_Value())) ||
273 match(&SI
, m_UMax(m_Value(), m_Value()))))
276 // If this is a cast from the same type, merge.
277 Value
*Cond
= SI
.getCondition();
278 Type
*CondTy
= Cond
->getType();
279 if (TI
->getNumOperands() == 1 && TI
->isCast()) {
280 Type
*FIOpndTy
= FI
->getOperand(0)->getType();
281 if (TI
->getOperand(0)->getType() != FIOpndTy
)
284 // The select condition may be a vector. We may only change the operand
285 // type if the vector width remains the same (and matches the condition).
286 if (auto *CondVTy
= dyn_cast
<VectorType
>(CondTy
)) {
287 if (!FIOpndTy
->isVectorTy() ||
288 CondVTy
->getElementCount() !=
289 cast
<VectorType
>(FIOpndTy
)->getElementCount())
292 // TODO: If the backend knew how to deal with casts better, we could
293 // remove this limitation. For now, there's too much potential to create
294 // worse codegen by promoting the select ahead of size-altering casts
297 // Note that ValueTracking's matchSelectPattern() looks through casts
298 // without checking 'hasOneUse' when it matches min/max patterns, so this
299 // transform may end up happening anyway.
300 if (TI
->getOpcode() != Instruction::BitCast
&&
301 (!TI
->hasOneUse() || !FI
->hasOneUse()))
303 } else if (!TI
->hasOneUse() || !FI
->hasOneUse()) {
304 // TODO: The one-use restrictions for a scalar select could be eased if
305 // the fold of a select in visitLoadInst() was enhanced to match a pattern
306 // that includes a cast.
310 // Fold this by inserting a select from the input values.
312 Builder
.CreateSelect(Cond
, TI
->getOperand(0), FI
->getOperand(0),
313 SI
.getName() + ".v", &SI
);
314 return CastInst::Create(Instruction::CastOps(TI
->getOpcode()), NewSI
,
318 Value
*OtherOpT
, *OtherOpF
;
320 auto getCommonOp
= [&](Instruction
*TI
, Instruction
*FI
, bool Commute
,
321 bool Swapped
= false) -> Value
* {
322 assert(!(Commute
&& Swapped
) &&
323 "Commute and Swapped can't set at the same time");
325 if (TI
->getOperand(0) == FI
->getOperand(0)) {
326 OtherOpT
= TI
->getOperand(1);
327 OtherOpF
= FI
->getOperand(1);
328 MatchIsOpZero
= true;
329 return TI
->getOperand(0);
330 } else if (TI
->getOperand(1) == FI
->getOperand(1)) {
331 OtherOpT
= TI
->getOperand(0);
332 OtherOpF
= FI
->getOperand(0);
333 MatchIsOpZero
= false;
334 return TI
->getOperand(1);
338 if (!Commute
&& !Swapped
)
341 // If we are allowing commute or swap of operands, then
342 // allow a cross-operand match. In that case, MatchIsOpZero
343 // means that TI's operand 0 (FI's operand 1) is the common op.
344 if (TI
->getOperand(0) == FI
->getOperand(1)) {
345 OtherOpT
= TI
->getOperand(1);
346 OtherOpF
= FI
->getOperand(0);
347 MatchIsOpZero
= true;
348 return TI
->getOperand(0);
349 } else if (TI
->getOperand(1) == FI
->getOperand(0)) {
350 OtherOpT
= TI
->getOperand(0);
351 OtherOpF
= FI
->getOperand(1);
352 MatchIsOpZero
= false;
353 return TI
->getOperand(1);
358 if (TI
->hasOneUse() || FI
->hasOneUse()) {
359 // Cond ? -X : -Y --> -(Cond ? X : Y)
361 if (match(TI
, m_FNeg(m_Value(X
))) && match(FI
, m_FNeg(m_Value(Y
)))) {
362 // Intersect FMF from the fneg instructions and union those with the
364 FastMathFlags FMF
= TI
->getFastMathFlags();
365 FMF
&= FI
->getFastMathFlags();
366 FMF
|= SI
.getFastMathFlags();
368 Builder
.CreateSelect(Cond
, X
, Y
, SI
.getName() + ".v", &SI
);
369 if (auto *NewSelI
= dyn_cast
<Instruction
>(NewSel
))
370 NewSelI
->setFastMathFlags(FMF
);
371 Instruction
*NewFNeg
= UnaryOperator::CreateFNeg(NewSel
);
372 NewFNeg
->setFastMathFlags(FMF
);
376 // Min/max intrinsic with a common operand can have the common operand
377 // pulled after the select. This is the same transform as below for binops,
378 // but specialized for intrinsic matching and without the restrictive uses
380 auto *TII
= dyn_cast
<IntrinsicInst
>(TI
);
381 auto *FII
= dyn_cast
<IntrinsicInst
>(FI
);
382 if (TII
&& FII
&& TII
->getIntrinsicID() == FII
->getIntrinsicID()) {
383 if (match(TII
, m_MaxOrMin(m_Value(), m_Value()))) {
384 if (Value
*MatchOp
= getCommonOp(TI
, FI
, true)) {
386 Builder
.CreateSelect(Cond
, OtherOpT
, OtherOpF
, "minmaxop", &SI
);
387 return CallInst::Create(TII
->getCalledFunction(), {NewSel
, MatchOp
});
391 // select c, (ldexp v, e0), (ldexp v, e1) -> ldexp v, (select c, e0, e1)
392 // select c, (ldexp v0, e), (ldexp v1, e) -> ldexp (select c, v0, v1), e
394 // select c, (ldexp v0, e0), (ldexp v1, e1) ->
395 // ldexp (select c, v0, v1), (select c, e0, e1)
396 if (TII
->getIntrinsicID() == Intrinsic::ldexp
) {
397 Value
*LdexpVal0
= TII
->getArgOperand(0);
398 Value
*LdexpExp0
= TII
->getArgOperand(1);
399 Value
*LdexpVal1
= FII
->getArgOperand(0);
400 Value
*LdexpExp1
= FII
->getArgOperand(1);
401 if (LdexpExp0
->getType() == LdexpExp1
->getType()) {
402 FPMathOperator
*SelectFPOp
= cast
<FPMathOperator
>(&SI
);
403 FastMathFlags FMF
= cast
<FPMathOperator
>(TII
)->getFastMathFlags();
404 FMF
&= cast
<FPMathOperator
>(FII
)->getFastMathFlags();
405 FMF
|= SelectFPOp
->getFastMathFlags();
407 Value
*SelectVal
= Builder
.CreateSelect(Cond
, LdexpVal0
, LdexpVal1
);
408 Value
*SelectExp
= Builder
.CreateSelect(Cond
, LdexpExp0
, LdexpExp1
);
410 CallInst
*NewLdexp
= Builder
.CreateIntrinsic(
411 TII
->getType(), Intrinsic::ldexp
, {SelectVal
, SelectExp
});
412 NewLdexp
->setFastMathFlags(FMF
);
413 return replaceInstUsesWith(SI
, NewLdexp
);
418 // icmp with a common operand also can have the common operand
419 // pulled after the select.
420 ICmpInst::Predicate 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 (TPred
== FPred
|| TPred
== CmpInst::getSwappedPredicate(FPred
)) {
424 bool Swapped
= TPred
!= FPred
;
426 getCommonOp(TI
, FI
, ICmpInst::isEquality(TPred
), Swapped
)) {
427 Value
*NewSel
= Builder
.CreateSelect(Cond
, OtherOpT
, OtherOpF
,
428 SI
.getName() + ".v", &SI
);
430 MatchIsOpZero
? TPred
: CmpInst::getSwappedPredicate(TPred
),
437 // Only handle binary operators (including two-operand getelementptr) with
438 // one-use here. As with the cast case above, it may be possible to relax the
439 // one-use constraint, but that needs be examined carefully since it may not
440 // reduce the total number of instructions.
441 if (TI
->getNumOperands() != 2 || FI
->getNumOperands() != 2 ||
442 !TI
->isSameOperationAs(FI
) ||
443 (!isa
<BinaryOperator
>(TI
) && !isa
<GetElementPtrInst
>(TI
)) ||
444 !TI
->hasOneUse() || !FI
->hasOneUse())
447 // Figure out if the operations have any operands in common.
448 Value
*MatchOp
= getCommonOp(TI
, FI
, TI
->isCommutative());
452 // If the select condition is a vector, the operands of the original select's
453 // operands also must be vectors. This may not be the case for getelementptr
455 if (CondTy
->isVectorTy() && (!OtherOpT
->getType()->isVectorTy() ||
456 !OtherOpF
->getType()->isVectorTy()))
459 // If we are sinking div/rem after a select, we may need to freeze the
460 // condition because div/rem may induce immediate UB with a poison operand.
461 // For example, the following transform is not safe if Cond can ever be poison
462 // because we can replace poison with zero and then we have div-by-zero that
463 // didn't exist in the original code:
464 // Cond ? x/y : x/z --> x / (Cond ? y : z)
465 auto *BO
= dyn_cast
<BinaryOperator
>(TI
);
466 if (BO
&& BO
->isIntDivRem() && !isGuaranteedNotToBePoison(Cond
)) {
467 // A udiv/urem with a common divisor is safe because UB can only occur with
468 // div-by-zero, and that would be present in the original code.
469 if (BO
->getOpcode() == Instruction::SDiv
||
470 BO
->getOpcode() == Instruction::SRem
|| MatchIsOpZero
)
471 Cond
= Builder
.CreateFreeze(Cond
);
474 // If we reach here, they do have operations in common.
475 Value
*NewSI
= Builder
.CreateSelect(Cond
, OtherOpT
, OtherOpF
,
476 SI
.getName() + ".v", &SI
);
477 Value
*Op0
= MatchIsOpZero
? MatchOp
: NewSI
;
478 Value
*Op1
= MatchIsOpZero
? NewSI
: MatchOp
;
479 if (auto *BO
= dyn_cast
<BinaryOperator
>(TI
)) {
480 BinaryOperator
*NewBO
= BinaryOperator::Create(BO
->getOpcode(), Op0
, Op1
);
481 NewBO
->copyIRFlags(TI
);
482 NewBO
->andIRFlags(FI
);
485 if (auto *TGEP
= dyn_cast
<GetElementPtrInst
>(TI
)) {
486 auto *FGEP
= cast
<GetElementPtrInst
>(FI
);
487 Type
*ElementType
= TGEP
->getResultElementType();
488 return TGEP
->isInBounds() && FGEP
->isInBounds()
489 ? GetElementPtrInst::CreateInBounds(ElementType
, Op0
, {Op1
})
490 : GetElementPtrInst::Create(ElementType
, Op0
, {Op1
});
492 llvm_unreachable("Expected BinaryOperator or GEP");
496 static bool isSelect01(const APInt
&C1I
, const APInt
&C2I
) {
497 if (!C1I
.isZero() && !C2I
.isZero()) // One side must be zero.
499 return C1I
.isOne() || C1I
.isAllOnes() || C2I
.isOne() || C2I
.isAllOnes();
502 /// Try to fold the select into one of the operands to allow further
504 Instruction
*InstCombinerImpl::foldSelectIntoOp(SelectInst
&SI
, Value
*TrueVal
,
506 // See the comment above getSelectFoldableOperands for a description of the
507 // transformation we are doing here.
508 auto TryFoldSelectIntoOp
= [&](SelectInst
&SI
, Value
*TrueVal
,
510 bool Swapped
) -> Instruction
* {
511 auto *TVI
= dyn_cast
<BinaryOperator
>(TrueVal
);
512 if (!TVI
|| !TVI
->hasOneUse() || isa
<Constant
>(FalseVal
))
515 unsigned SFO
= getSelectFoldableOperands(TVI
);
516 unsigned OpToFold
= 0;
517 if ((SFO
& 1) && FalseVal
== TVI
->getOperand(0))
519 else if ((SFO
& 2) && FalseVal
== TVI
->getOperand(1))
525 // TODO: We probably ought to revisit cases where the select and FP
526 // instructions have different flags and add tests to ensure the
527 // behaviour is correct.
529 if (isa
<FPMathOperator
>(&SI
))
530 FMF
= SI
.getFastMathFlags();
531 Constant
*C
= ConstantExpr::getBinOpIdentity(
532 TVI
->getOpcode(), TVI
->getType(), true, FMF
.noSignedZeros());
533 Value
*OOp
= TVI
->getOperand(2 - OpToFold
);
534 // Avoid creating select between 2 constants unless it's selecting
535 // between 0, 1 and -1.
537 bool OOpIsAPInt
= match(OOp
, m_APInt(OOpC
));
538 if (!isa
<Constant
>(OOp
) ||
539 (OOpIsAPInt
&& isSelect01(C
->getUniqueInteger(), *OOpC
))) {
540 Value
*NewSel
= Builder
.CreateSelect(SI
.getCondition(), Swapped
? C
: OOp
,
541 Swapped
? OOp
: C
, "", &SI
);
542 if (isa
<FPMathOperator
>(&SI
))
543 cast
<Instruction
>(NewSel
)->setFastMathFlags(FMF
);
544 NewSel
->takeName(TVI
);
546 BinaryOperator::Create(TVI
->getOpcode(), FalseVal
, NewSel
);
547 BO
->copyIRFlags(TVI
);
553 if (Instruction
*R
= TryFoldSelectIntoOp(SI
, TrueVal
, FalseVal
, false))
556 if (Instruction
*R
= TryFoldSelectIntoOp(SI
, FalseVal
, TrueVal
, true))
563 /// (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1)
565 /// zext (icmp ne i32 (and X, (or Y, (shl 1, Z))), 0)
567 /// Z may be 0 if lshr is missing.
568 /// Worst-case scenario is that we will replace 5 instructions with 5 different
569 /// instructions, but we got rid of select.
570 static Instruction
*foldSelectICmpAndAnd(Type
*SelType
, const ICmpInst
*Cmp
,
571 Value
*TVal
, Value
*FVal
,
572 InstCombiner::BuilderTy
&Builder
) {
573 if (!(Cmp
->hasOneUse() && Cmp
->getOperand(0)->hasOneUse() &&
574 Cmp
->getPredicate() == ICmpInst::ICMP_EQ
&&
575 match(Cmp
->getOperand(1), m_Zero()) && match(FVal
, m_One())))
578 // The TrueVal has general form of: and %B, 1
580 if (!match(TVal
, m_OneUse(m_And(m_Value(B
), m_One()))))
583 // Where %B may be optionally shifted: lshr %X, %Z.
585 const bool HasShift
= match(B
, m_OneUse(m_LShr(m_Value(X
), m_Value(Z
))));
587 // The shift must be valid.
588 // TODO: This restricts the fold to constant shift amounts. Is there a way to
589 // handle variable shifts safely? PR47012
591 !match(Z
, m_SpecificInt_ICMP(CmpInst::ICMP_ULT
,
592 APInt(SelType
->getScalarSizeInBits(),
593 SelType
->getScalarSizeInBits()))))
600 if (!match(Cmp
->getOperand(0), m_c_And(m_Specific(X
), m_Value(Y
))))
603 // ((X & Y) == 0) ? ((X >> Z) & 1) : 1 --> (X & (Y | (1 << Z))) != 0
604 // ((X & Y) == 0) ? (X & 1) : 1 --> (X & (Y | 1)) != 0
605 Constant
*One
= ConstantInt::get(SelType
, 1);
606 Value
*MaskB
= HasShift
? Builder
.CreateShl(One
, Z
) : One
;
607 Value
*FullMask
= Builder
.CreateOr(Y
, MaskB
);
608 Value
*MaskedX
= Builder
.CreateAnd(X
, FullMask
);
609 Value
*ICmpNeZero
= Builder
.CreateIsNotNull(MaskedX
);
610 return new ZExtInst(ICmpNeZero
, SelType
);
614 /// (select (icmp eq (and X, C1), 0), 0, (shl [nsw/nuw] X, C2));
615 /// iff C1 is a mask and the number of its leading zeros is equal to C2
618 static Value
*foldSelectICmpAndZeroShl(const ICmpInst
*Cmp
, Value
*TVal
,
620 InstCombiner::BuilderTy
&Builder
) {
621 ICmpInst::Predicate Pred
;
623 if (!match(Cmp
, m_ICmp(Pred
, m_Value(AndVal
), m_Zero())))
626 if (Pred
== ICmpInst::ICMP_NE
) {
627 Pred
= ICmpInst::ICMP_EQ
;
628 std::swap(TVal
, FVal
);
632 const APInt
*C2
, *C1
;
633 if (Pred
!= ICmpInst::ICMP_EQ
||
634 !match(AndVal
, m_And(m_Value(X
), m_APInt(C1
))) ||
635 !match(TVal
, m_Zero()) || !match(FVal
, m_Shl(m_Specific(X
), m_APInt(C2
))))
639 C1
->countLeadingZeros() != static_cast<unsigned>(C2
->getZExtValue()))
642 auto *FI
= dyn_cast
<Instruction
>(FVal
);
646 FI
->setHasNoSignedWrap(false);
647 FI
->setHasNoUnsignedWrap(false);
652 /// (select (icmp sgt x, C), lshr (X, Y), ashr (X, Y)); iff C s>= -1
653 /// (select (icmp slt x, C), ashr (X, Y), lshr (X, Y)); iff C s>= 0
656 static Value
*foldSelectICmpLshrAshr(const ICmpInst
*IC
, Value
*TrueVal
,
658 InstCombiner::BuilderTy
&Builder
) {
659 ICmpInst::Predicate Pred
= IC
->getPredicate();
660 Value
*CmpLHS
= IC
->getOperand(0);
661 Value
*CmpRHS
= IC
->getOperand(1);
662 if (!CmpRHS
->getType()->isIntOrIntVectorTy())
666 unsigned Bitwidth
= CmpRHS
->getType()->getScalarSizeInBits();
667 if ((Pred
!= ICmpInst::ICMP_SGT
||
669 m_SpecificInt_ICMP(ICmpInst::ICMP_SGE
, APInt(Bitwidth
, -1)))) &&
670 (Pred
!= ICmpInst::ICMP_SLT
||
672 m_SpecificInt_ICMP(ICmpInst::ICMP_SGE
, APInt(Bitwidth
, 0)))))
675 // Canonicalize so that ashr is in FalseVal.
676 if (Pred
== ICmpInst::ICMP_SLT
)
677 std::swap(TrueVal
, FalseVal
);
679 if (match(TrueVal
, m_LShr(m_Value(X
), m_Value(Y
))) &&
680 match(FalseVal
, m_AShr(m_Specific(X
), m_Specific(Y
))) &&
681 match(CmpLHS
, m_Specific(X
))) {
682 const auto *Ashr
= cast
<Instruction
>(FalseVal
);
683 // if lshr is not exact and ashr is, this new ashr must not be exact.
684 bool IsExact
= Ashr
->isExact() && cast
<Instruction
>(TrueVal
)->isExact();
685 return Builder
.CreateAShr(X
, Y
, IC
->getName(), IsExact
);
692 /// (select (icmp eq (and X, C1), 0), Y, (BinOp Y, C2))
695 /// (BinOp Y, (shl (and X, C1), C3))
697 /// (BinOp Y, (lshr (and X, C1), C3))
699 /// 0 on the RHS is the identity value (i.e add, xor, shl, etc...)
700 /// C1 and C2 are both powers of 2
703 /// C3 = Log(C2) - Log(C1)
705 /// C3 = Log(C1) - Log(C2)
707 /// This transform handles cases where:
708 /// 1. The icmp predicate is inverted
709 /// 2. The select operands are reversed
710 /// 3. The magnitude of C2 and C1 are flipped
711 static Value
*foldSelectICmpAndBinOp(const ICmpInst
*IC
, Value
*TrueVal
,
713 InstCombiner::BuilderTy
&Builder
) {
714 // Only handle integer compares. Also, if this is a vector select, we need a
716 if (!TrueVal
->getType()->isIntOrIntVectorTy() ||
717 TrueVal
->getType()->isVectorTy() != IC
->getType()->isVectorTy())
720 Value
*CmpLHS
= IC
->getOperand(0);
721 Value
*CmpRHS
= IC
->getOperand(1);
724 bool NeedAnd
= false;
725 CmpInst::Predicate Pred
= IC
->getPredicate();
726 if (IC
->isEquality()) {
727 if (!match(CmpRHS
, m_Zero()))
731 if (!match(CmpLHS
, m_And(m_Value(), m_Power2(C1
))))
734 C1Log
= C1
->logBase2();
737 if (!decomposeBitTestICmp(CmpLHS
, CmpRHS
, Pred
, CmpLHS
, C1
) ||
741 C1Log
= C1
.logBase2();
745 Value
*Y
, *V
= CmpLHS
;
746 BinaryOperator
*BinOp
;
749 if (match(FalseVal
, m_BinOp(m_Specific(TrueVal
), m_Power2(C2
)))) {
751 BinOp
= cast
<BinaryOperator
>(FalseVal
);
752 NeedXor
= Pred
== ICmpInst::ICMP_NE
;
753 } else if (match(TrueVal
, m_BinOp(m_Specific(FalseVal
), m_Power2(C2
)))) {
755 BinOp
= cast
<BinaryOperator
>(TrueVal
);
756 NeedXor
= Pred
== ICmpInst::ICMP_EQ
;
761 // Check that 0 on RHS is identity value for this binop.
763 ConstantExpr::getBinOpIdentity(BinOp
->getOpcode(), BinOp
->getType(),
764 /*AllowRHSConstant*/ true);
765 if (IdentityC
== nullptr || !IdentityC
->isNullValue())
768 unsigned C2Log
= C2
->logBase2();
770 bool NeedShift
= C1Log
!= C2Log
;
771 bool NeedZExtTrunc
= Y
->getType()->getScalarSizeInBits() !=
772 V
->getType()->getScalarSizeInBits();
774 // Make sure we don't create more instructions than we save.
775 if ((NeedShift
+ NeedXor
+ NeedZExtTrunc
+ NeedAnd
) >
776 (IC
->hasOneUse() + BinOp
->hasOneUse()))
780 // Insert the AND instruction on the input to the truncate.
781 APInt C1
= APInt::getOneBitSet(V
->getType()->getScalarSizeInBits(), C1Log
);
782 V
= Builder
.CreateAnd(V
, ConstantInt::get(V
->getType(), C1
));
786 V
= Builder
.CreateZExtOrTrunc(V
, Y
->getType());
787 V
= Builder
.CreateShl(V
, C2Log
- C1Log
);
788 } else if (C1Log
> C2Log
) {
789 V
= Builder
.CreateLShr(V
, C1Log
- C2Log
);
790 V
= Builder
.CreateZExtOrTrunc(V
, Y
->getType());
792 V
= Builder
.CreateZExtOrTrunc(V
, Y
->getType());
795 V
= Builder
.CreateXor(V
, *C2
);
797 return Builder
.CreateBinOp(BinOp
->getOpcode(), Y
, V
);
800 /// Canonicalize a set or clear of a masked set of constant bits to
801 /// select-of-constants form.
802 static Instruction
*foldSetClearBits(SelectInst
&Sel
,
803 InstCombiner::BuilderTy
&Builder
) {
804 Value
*Cond
= Sel
.getCondition();
805 Value
*T
= Sel
.getTrueValue();
806 Value
*F
= Sel
.getFalseValue();
807 Type
*Ty
= Sel
.getType();
809 const APInt
*NotC
, *C
;
811 // Cond ? (X & ~C) : (X | C) --> (X & ~C) | (Cond ? 0 : C)
812 if (match(T
, m_And(m_Value(X
), m_APInt(NotC
))) &&
813 match(F
, m_OneUse(m_Or(m_Specific(X
), m_APInt(C
)))) && *NotC
== ~(*C
)) {
814 Constant
*Zero
= ConstantInt::getNullValue(Ty
);
815 Constant
*OrC
= ConstantInt::get(Ty
, *C
);
816 Value
*NewSel
= Builder
.CreateSelect(Cond
, Zero
, OrC
, "masksel", &Sel
);
817 return BinaryOperator::CreateOr(T
, NewSel
);
820 // Cond ? (X | C) : (X & ~C) --> (X & ~C) | (Cond ? C : 0)
821 if (match(F
, m_And(m_Value(X
), m_APInt(NotC
))) &&
822 match(T
, m_OneUse(m_Or(m_Specific(X
), m_APInt(C
)))) && *NotC
== ~(*C
)) {
823 Constant
*Zero
= ConstantInt::getNullValue(Ty
);
824 Constant
*OrC
= ConstantInt::get(Ty
, *C
);
825 Value
*NewSel
= Builder
.CreateSelect(Cond
, OrC
, Zero
, "masksel", &Sel
);
826 return BinaryOperator::CreateOr(F
, NewSel
);
832 // select (x == 0), 0, x * y --> freeze(y) * x
833 // select (y == 0), 0, x * y --> freeze(x) * y
834 // select (x == 0), undef, x * y --> freeze(y) * x
835 // select (x == undef), 0, x * y --> freeze(y) * x
836 // Usage of mul instead of 0 will make the result more poisonous,
837 // so the operand that was not checked in the condition should be frozen.
838 // The latter folding is applied only when a constant compared with x is
839 // is a vector consisting of 0 and undefs. If a constant compared with x
840 // is a scalar undefined value or undefined vector then an expression
841 // should be already folded into a constant.
842 static Instruction
*foldSelectZeroOrMul(SelectInst
&SI
, InstCombinerImpl
&IC
) {
843 auto *CondVal
= SI
.getCondition();
844 auto *TrueVal
= SI
.getTrueValue();
845 auto *FalseVal
= SI
.getFalseValue();
847 ICmpInst::Predicate Predicate
;
849 // Assuming that constant compared with zero is not undef (but it may be
850 // a vector with some undef elements). Otherwise (when a constant is undef)
851 // the select expression should be already simplified.
852 if (!match(CondVal
, m_ICmp(Predicate
, m_Value(X
), m_Zero())) ||
853 !ICmpInst::isEquality(Predicate
))
856 if (Predicate
== ICmpInst::ICMP_NE
)
857 std::swap(TrueVal
, FalseVal
);
859 // Check that TrueVal is a constant instead of matching it with m_Zero()
860 // to handle the case when it is a scalar undef value or a vector containing
861 // non-zero elements that are masked by undef elements in the compare
863 auto *TrueValC
= dyn_cast
<Constant
>(TrueVal
);
864 if (TrueValC
== nullptr ||
865 !match(FalseVal
, m_c_Mul(m_Specific(X
), m_Value(Y
))) ||
866 !isa
<Instruction
>(FalseVal
))
869 auto *ZeroC
= cast
<Constant
>(cast
<Instruction
>(CondVal
)->getOperand(1));
870 auto *MergedC
= Constant::mergeUndefsWith(TrueValC
, ZeroC
);
871 // If X is compared with 0 then TrueVal could be either zero or undef.
872 // m_Zero match vectors containing some undef elements, but for scalars
873 // m_Undef should be used explicitly.
874 if (!match(MergedC
, m_Zero()) && !match(MergedC
, m_Undef()))
877 auto *FalseValI
= cast
<Instruction
>(FalseVal
);
878 auto *FrY
= IC
.InsertNewInstBefore(new FreezeInst(Y
, Y
->getName() + ".fr"),
879 FalseValI
->getIterator());
880 IC
.replaceOperand(*FalseValI
, FalseValI
->getOperand(0) == Y
? 0 : 1, FrY
);
881 return IC
.replaceInstUsesWith(SI
, FalseValI
);
884 /// Transform patterns such as (a > b) ? a - b : 0 into usub.sat(a, b).
885 /// There are 8 commuted/swapped variants of this pattern.
886 /// TODO: Also support a - UMIN(a,b) patterns.
887 static Value
*canonicalizeSaturatedSubtract(const ICmpInst
*ICI
,
888 const Value
*TrueVal
,
889 const Value
*FalseVal
,
890 InstCombiner::BuilderTy
&Builder
) {
891 ICmpInst::Predicate Pred
= ICI
->getPredicate();
892 Value
*A
= ICI
->getOperand(0);
893 Value
*B
= ICI
->getOperand(1);
895 // (b > a) ? 0 : a - b -> (b <= a) ? a - b : 0
896 // (a == 0) ? 0 : a - 1 -> (a != 0) ? a - 1 : 0
897 if (match(TrueVal
, m_Zero())) {
898 Pred
= ICmpInst::getInversePredicate(Pred
);
899 std::swap(TrueVal
, FalseVal
);
902 if (!match(FalseVal
, m_Zero()))
905 // ugt 0 is canonicalized to ne 0 and requires special handling
906 // (a != 0) ? a + -1 : 0 -> usub.sat(a, 1)
907 if (Pred
== ICmpInst::ICMP_NE
) {
908 if (match(B
, m_Zero()) && match(TrueVal
, m_Add(m_Specific(A
), m_AllOnes())))
909 return Builder
.CreateBinaryIntrinsic(Intrinsic::usub_sat
, A
,
910 ConstantInt::get(A
->getType(), 1));
914 if (!ICmpInst::isUnsigned(Pred
))
917 if (Pred
== ICmpInst::ICMP_ULE
|| Pred
== ICmpInst::ICMP_ULT
) {
918 // (b < a) ? a - b : 0 -> (a > b) ? a - b : 0
920 Pred
= ICmpInst::getSwappedPredicate(Pred
);
923 assert((Pred
== ICmpInst::ICMP_UGE
|| Pred
== ICmpInst::ICMP_UGT
) &&
924 "Unexpected isUnsigned predicate!");
926 // Ensure the sub is of the form:
927 // (a > b) ? a - b : 0 -> usub.sat(a, b)
928 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
929 // Checking for both a-b and a+(-b) as a constant.
930 bool IsNegative
= false;
932 if (match(TrueVal
, m_Sub(m_Specific(B
), m_Specific(A
))) ||
933 (match(A
, m_APInt(C
)) &&
934 match(TrueVal
, m_Add(m_Specific(B
), m_SpecificInt(-*C
)))))
936 else if (!match(TrueVal
, m_Sub(m_Specific(A
), m_Specific(B
))) &&
937 !(match(B
, m_APInt(C
)) &&
938 match(TrueVal
, m_Add(m_Specific(A
), m_SpecificInt(-*C
)))))
941 // If we are adding a negate and the sub and icmp are used anywhere else, we
942 // would end up with more instructions.
943 if (IsNegative
&& !TrueVal
->hasOneUse() && !ICI
->hasOneUse())
946 // (a > b) ? a - b : 0 -> usub.sat(a, b)
947 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
948 Value
*Result
= Builder
.CreateBinaryIntrinsic(Intrinsic::usub_sat
, A
, B
);
950 Result
= Builder
.CreateNeg(Result
);
954 static Value
*canonicalizeSaturatedAdd(ICmpInst
*Cmp
, Value
*TVal
, Value
*FVal
,
955 InstCombiner::BuilderTy
&Builder
) {
956 if (!Cmp
->hasOneUse())
959 // Match unsigned saturated add with constant.
960 Value
*Cmp0
= Cmp
->getOperand(0);
961 Value
*Cmp1
= Cmp
->getOperand(1);
962 ICmpInst::Predicate Pred
= Cmp
->getPredicate();
964 const APInt
*C
, *CmpC
;
965 if (Pred
== ICmpInst::ICMP_ULT
&&
966 match(TVal
, m_Add(m_Value(X
), m_APInt(C
))) && X
== Cmp0
&&
967 match(FVal
, m_AllOnes()) && match(Cmp1
, m_APInt(CmpC
)) && *CmpC
== ~*C
) {
968 // (X u< ~C) ? (X + C) : -1 --> uadd.sat(X, C)
969 return Builder
.CreateBinaryIntrinsic(
970 Intrinsic::uadd_sat
, X
, ConstantInt::get(X
->getType(), *C
));
973 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
974 // There are 8 commuted variants.
975 // Canonicalize -1 (saturated result) to true value of the select.
976 if (match(FVal
, m_AllOnes())) {
977 std::swap(TVal
, FVal
);
978 Pred
= CmpInst::getInversePredicate(Pred
);
980 if (!match(TVal
, m_AllOnes()))
983 // Canonicalize predicate to less-than or less-or-equal-than.
984 if (Pred
== ICmpInst::ICMP_UGT
|| Pred
== ICmpInst::ICMP_UGE
) {
985 std::swap(Cmp0
, Cmp1
);
986 Pred
= CmpInst::getSwappedPredicate(Pred
);
988 if (Pred
!= ICmpInst::ICMP_ULT
&& Pred
!= ICmpInst::ICMP_ULE
)
991 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
992 // Strictness of the comparison is irrelevant.
994 if (match(Cmp0
, m_Not(m_Value(X
))) &&
995 match(FVal
, m_c_Add(m_Specific(X
), m_Value(Y
))) && Y
== Cmp1
) {
996 // (~X u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
997 // (~X u< Y) ? -1 : (Y + X) --> uadd.sat(X, Y)
998 return Builder
.CreateBinaryIntrinsic(Intrinsic::uadd_sat
, X
, Y
);
1000 // The 'not' op may be included in the sum but not the compare.
1001 // Strictness of the comparison is irrelevant.
1004 if (match(FVal
, m_c_Add(m_Not(m_Specific(X
)), m_Specific(Y
)))) {
1005 // (X u< Y) ? -1 : (~X + Y) --> uadd.sat(~X, Y)
1006 // (X u< Y) ? -1 : (Y + ~X) --> uadd.sat(Y, ~X)
1007 BinaryOperator
*BO
= cast
<BinaryOperator
>(FVal
);
1008 return Builder
.CreateBinaryIntrinsic(
1009 Intrinsic::uadd_sat
, BO
->getOperand(0), BO
->getOperand(1));
1011 // The overflow may be detected via the add wrapping round.
1012 // This is only valid for strict comparison!
1013 if (Pred
== ICmpInst::ICMP_ULT
&&
1014 match(Cmp0
, m_c_Add(m_Specific(Cmp1
), m_Value(Y
))) &&
1015 match(FVal
, m_c_Add(m_Specific(Cmp1
), m_Specific(Y
)))) {
1016 // ((X + Y) u< X) ? -1 : (X + Y) --> uadd.sat(X, Y)
1017 // ((X + Y) u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
1018 return Builder
.CreateBinaryIntrinsic(Intrinsic::uadd_sat
, Cmp1
, Y
);
1024 /// Try to match patterns with select and subtract as absolute difference.
1025 static Value
*foldAbsDiff(ICmpInst
*Cmp
, Value
*TVal
, Value
*FVal
,
1026 InstCombiner::BuilderTy
&Builder
) {
1027 auto *TI
= dyn_cast
<Instruction
>(TVal
);
1028 auto *FI
= dyn_cast
<Instruction
>(FVal
);
1032 // Normalize predicate to gt/lt rather than ge/le.
1033 ICmpInst::Predicate Pred
= Cmp
->getStrictPredicate();
1034 Value
*A
= Cmp
->getOperand(0);
1035 Value
*B
= Cmp
->getOperand(1);
1037 // Normalize "A - B" as the true value of the select.
1038 if (match(FI
, m_Sub(m_Specific(A
), m_Specific(B
)))) {
1040 Pred
= ICmpInst::getSwappedPredicate(Pred
);
1043 // With any pair of no-wrap subtracts:
1044 // (A > B) ? (A - B) : (B - A) --> abs(A - B)
1045 if (Pred
== CmpInst::ICMP_SGT
&&
1046 match(TI
, m_Sub(m_Specific(A
), m_Specific(B
))) &&
1047 match(FI
, m_Sub(m_Specific(B
), m_Specific(A
))) &&
1048 (TI
->hasNoSignedWrap() || TI
->hasNoUnsignedWrap()) &&
1049 (FI
->hasNoSignedWrap() || FI
->hasNoUnsignedWrap())) {
1050 // The remaining subtract is not "nuw" any more.
1051 // If there's one use of the subtract (no other use than the use we are
1052 // about to replace), then we know that the sub is "nsw" in this context
1053 // even if it was only "nuw" before. If there's another use, then we can't
1054 // add "nsw" to the existing instruction because it may not be safe in the
1055 // other user's context.
1056 TI
->setHasNoUnsignedWrap(false);
1057 if (!TI
->hasNoSignedWrap())
1058 TI
->setHasNoSignedWrap(TI
->hasOneUse());
1059 return Builder
.CreateBinaryIntrinsic(Intrinsic::abs
, TI
, Builder
.getTrue());
1065 /// Fold the following code sequence:
1067 /// int a = ctlz(x & -x);
1075 static Instruction
*foldSelectCtlzToCttz(ICmpInst
*ICI
, Value
*TrueVal
,
1077 InstCombiner::BuilderTy
&Builder
) {
1078 unsigned BitWidth
= TrueVal
->getType()->getScalarSizeInBits();
1079 if (!ICI
->isEquality() || !match(ICI
->getOperand(1), m_Zero()))
1082 if (ICI
->getPredicate() == ICmpInst::ICMP_NE
)
1083 std::swap(TrueVal
, FalseVal
);
1086 if (!match(FalseVal
,
1087 m_Xor(m_Value(Ctlz
), m_SpecificInt(BitWidth
- 1))))
1090 if (!match(Ctlz
, m_Intrinsic
<Intrinsic::ctlz
>()))
1093 if (TrueVal
!= Ctlz
&& !match(TrueVal
, m_SpecificInt(BitWidth
)))
1096 Value
*X
= ICI
->getOperand(0);
1097 auto *II
= cast
<IntrinsicInst
>(Ctlz
);
1098 if (!match(II
->getOperand(0), m_c_And(m_Specific(X
), m_Neg(m_Specific(X
)))))
1101 Function
*F
= Intrinsic::getDeclaration(II
->getModule(), Intrinsic::cttz
,
1103 return CallInst::Create(F
, {X
, II
->getArgOperand(1)});
1106 /// Attempt to fold a cttz/ctlz followed by a icmp plus select into a single
1107 /// call to cttz/ctlz with flag 'is_zero_poison' cleared.
1109 /// For example, we can fold the following code sequence:
1111 /// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
1112 /// %1 = icmp ne i32 %x, 0
1113 /// %2 = select i1 %1, i32 %0, i32 32
1117 /// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
1118 static Value
*foldSelectCttzCtlz(ICmpInst
*ICI
, Value
*TrueVal
, Value
*FalseVal
,
1119 InstCombiner::BuilderTy
&Builder
) {
1120 ICmpInst::Predicate Pred
= ICI
->getPredicate();
1121 Value
*CmpLHS
= ICI
->getOperand(0);
1122 Value
*CmpRHS
= ICI
->getOperand(1);
1124 // Check if the select condition compares a value for equality.
1125 if (!ICI
->isEquality())
1128 Value
*SelectArg
= FalseVal
;
1129 Value
*ValueOnZero
= TrueVal
;
1130 if (Pred
== ICmpInst::ICMP_NE
)
1131 std::swap(SelectArg
, ValueOnZero
);
1133 // Skip zero extend/truncate.
1134 Value
*Count
= nullptr;
1135 if (!match(SelectArg
, m_ZExt(m_Value(Count
))) &&
1136 !match(SelectArg
, m_Trunc(m_Value(Count
))))
1139 // Check that 'Count' is a call to intrinsic cttz/ctlz. Also check that the
1140 // input to the cttz/ctlz is used as LHS for the compare instruction.
1142 if (!match(Count
, m_Intrinsic
<Intrinsic::cttz
>(m_Value(X
))) &&
1143 !match(Count
, m_Intrinsic
<Intrinsic::ctlz
>(m_Value(X
))))
1146 // (X == 0) ? BitWidth : ctz(X)
1147 // (X == -1) ? BitWidth : ctz(~X)
1148 if ((X
!= CmpLHS
|| !match(CmpRHS
, m_Zero())) &&
1149 (!match(X
, m_Not(m_Specific(CmpLHS
))) || !match(CmpRHS
, m_AllOnes())))
1152 IntrinsicInst
*II
= cast
<IntrinsicInst
>(Count
);
1154 // Check if the value propagated on zero is a constant number equal to the
1155 // sizeof in bits of 'Count'.
1156 unsigned SizeOfInBits
= Count
->getType()->getScalarSizeInBits();
1157 if (match(ValueOnZero
, m_SpecificInt(SizeOfInBits
))) {
1158 // Explicitly clear the 'is_zero_poison' flag. It's always valid to go from
1159 // true to false on this flag, so we can replace it for all users.
1160 II
->setArgOperand(1, ConstantInt::getFalse(II
->getContext()));
1164 // The ValueOnZero is not the bitwidth. But if the cttz/ctlz (and optional
1165 // zext/trunc) have one use (ending at the select), the cttz/ctlz result will
1166 // not be used if the input is zero. Relax to 'zero is poison' for that case.
1167 if (II
->hasOneUse() && SelectArg
->hasOneUse() &&
1168 !match(II
->getArgOperand(1), m_One()))
1169 II
->setArgOperand(1, ConstantInt::getTrue(II
->getContext()));
1174 static Value
*canonicalizeSPF(ICmpInst
&Cmp
, Value
*TrueVal
, Value
*FalseVal
,
1175 InstCombinerImpl
&IC
) {
1177 // TODO: What to do with pointer min/max patterns?
1178 if (!TrueVal
->getType()->isIntOrIntVectorTy())
1181 SelectPatternFlavor SPF
=
1182 matchDecomposedSelectPattern(&Cmp
, TrueVal
, FalseVal
, LHS
, RHS
).Flavor
;
1183 if (SPF
== SelectPatternFlavor::SPF_ABS
||
1184 SPF
== SelectPatternFlavor::SPF_NABS
) {
1185 if (!Cmp
.hasOneUse() && !RHS
->hasOneUse())
1186 return nullptr; // TODO: Relax this restriction.
1188 // Note that NSW flag can only be propagated for normal, non-negated abs!
1189 bool IntMinIsPoison
= SPF
== SelectPatternFlavor::SPF_ABS
&&
1190 match(RHS
, m_NSWNeg(m_Specific(LHS
)));
1191 Constant
*IntMinIsPoisonC
=
1192 ConstantInt::get(Type::getInt1Ty(Cmp
.getContext()), IntMinIsPoison
);
1194 IC
.Builder
.CreateBinaryIntrinsic(Intrinsic::abs
, LHS
, IntMinIsPoisonC
);
1196 if (SPF
== SelectPatternFlavor::SPF_NABS
)
1197 return IC
.Builder
.CreateNeg(Abs
); // Always without NSW flag!
1201 if (SelectPatternResult::isMinOrMax(SPF
)) {
1202 Intrinsic::ID IntrinsicID
;
1204 case SelectPatternFlavor::SPF_UMIN
:
1205 IntrinsicID
= Intrinsic::umin
;
1207 case SelectPatternFlavor::SPF_UMAX
:
1208 IntrinsicID
= Intrinsic::umax
;
1210 case SelectPatternFlavor::SPF_SMIN
:
1211 IntrinsicID
= Intrinsic::smin
;
1213 case SelectPatternFlavor::SPF_SMAX
:
1214 IntrinsicID
= Intrinsic::smax
;
1217 llvm_unreachable("Unexpected SPF");
1219 return IC
.Builder
.CreateBinaryIntrinsic(IntrinsicID
, LHS
, RHS
);
1225 bool InstCombinerImpl::replaceInInstruction(Value
*V
, Value
*Old
, Value
*New
,
1227 // Conservatively limit replacement to two instructions upwards.
1231 auto *I
= dyn_cast
<Instruction
>(V
);
1232 if (!I
|| !I
->hasOneUse() || !isSafeToSpeculativelyExecute(I
))
1235 bool Changed
= false;
1236 for (Use
&U
: I
->operands()) {
1242 Changed
|= replaceInInstruction(U
, Old
, New
, Depth
+ 1);
1248 /// If we have a select with an equality comparison, then we know the value in
1249 /// one of the arms of the select. See if substituting this value into an arm
1250 /// and simplifying the result yields the same value as the other arm.
1252 /// To make this transform safe, we must drop poison-generating flags
1253 /// (nsw, etc) if we simplified to a binop because the select may be guarding
1254 /// that poison from propagating. If the existing binop already had no
1255 /// poison-generating flags, then this transform can be done by instsimplify.
1258 /// %cmp = icmp eq i32 %x, 2147483647
1259 /// %add = add nsw i32 %x, 1
1260 /// %sel = select i1 %cmp, i32 -2147483648, i32 %add
1262 /// We can't replace %sel with %add unless we strip away the flags.
1263 /// TODO: Wrapping flags could be preserved in some cases with better analysis.
1264 Instruction
*InstCombinerImpl::foldSelectValueEquivalence(SelectInst
&Sel
,
1266 if (!Cmp
.isEquality())
1269 // Canonicalize the pattern to ICMP_EQ by swapping the select operands.
1270 Value
*TrueVal
= Sel
.getTrueValue(), *FalseVal
= Sel
.getFalseValue();
1271 bool Swapped
= false;
1272 if (Cmp
.getPredicate() == ICmpInst::ICMP_NE
) {
1273 std::swap(TrueVal
, FalseVal
);
1277 // In X == Y ? f(X) : Z, try to evaluate f(Y) and replace the operand.
1278 // Make sure Y cannot be undef though, as we might pick different values for
1279 // undef in the icmp and in f(Y). Additionally, take care to avoid replacing
1280 // X == Y ? X : Z with X == Y ? Y : Z, as that would lead to an infinite
1281 // replacement cycle.
1282 Value
*CmpLHS
= Cmp
.getOperand(0), *CmpRHS
= Cmp
.getOperand(1);
1283 if (TrueVal
!= CmpLHS
&&
1284 isGuaranteedNotToBeUndefOrPoison(CmpRHS
, SQ
.AC
, &Sel
, &DT
)) {
1285 if (Value
*V
= simplifyWithOpReplaced(TrueVal
, CmpLHS
, CmpRHS
, SQ
,
1286 /* AllowRefinement */ true))
1287 // Require either the replacement or the simplification result to be a
1288 // constant to avoid infinite loops.
1289 // FIXME: Make this check more precise.
1290 if (isa
<Constant
>(CmpRHS
) || isa
<Constant
>(V
))
1291 return replaceOperand(Sel
, Swapped
? 2 : 1, V
);
1293 // Even if TrueVal does not simplify, we can directly replace a use of
1294 // CmpLHS with CmpRHS, as long as the instruction is not used anywhere
1295 // else and is safe to speculatively execute (we may end up executing it
1296 // with different operands, which should not cause side-effects or trigger
1297 // undefined behavior). Only do this if CmpRHS is a constant, as
1298 // profitability is not clear for other cases.
1299 // FIXME: Support vectors.
1300 if (match(CmpRHS
, m_ImmConstant()) && !match(CmpLHS
, m_ImmConstant()) &&
1301 !Cmp
.getType()->isVectorTy())
1302 if (replaceInInstruction(TrueVal
, CmpLHS
, CmpRHS
))
1305 if (TrueVal
!= CmpRHS
&&
1306 isGuaranteedNotToBeUndefOrPoison(CmpLHS
, SQ
.AC
, &Sel
, &DT
))
1307 if (Value
*V
= simplifyWithOpReplaced(TrueVal
, CmpRHS
, CmpLHS
, SQ
,
1308 /* AllowRefinement */ true))
1309 if (isa
<Constant
>(CmpLHS
) || isa
<Constant
>(V
))
1310 return replaceOperand(Sel
, Swapped
? 2 : 1, V
);
1312 auto *FalseInst
= dyn_cast
<Instruction
>(FalseVal
);
1316 // InstSimplify already performed this fold if it was possible subject to
1317 // current poison-generating flags. Check whether dropping poison-generating
1318 // flags enables the transform.
1320 // Try each equivalence substitution possibility.
1321 // We have an 'EQ' comparison, so the select's false value will propagate.
1323 // (X == 42) ? 43 : (X + 1) --> (X == 42) ? (X + 1) : (X + 1) --> X + 1
1324 SmallVector
<Instruction
*> DropFlags
;
1325 if (simplifyWithOpReplaced(FalseVal
, CmpLHS
, CmpRHS
, SQ
,
1326 /* AllowRefinement */ false,
1327 &DropFlags
) == TrueVal
||
1328 simplifyWithOpReplaced(FalseVal
, CmpRHS
, CmpLHS
, SQ
,
1329 /* AllowRefinement */ false,
1330 &DropFlags
) == TrueVal
) {
1331 for (Instruction
*I
: DropFlags
) {
1332 I
->dropPoisonGeneratingFlagsAndMetadata();
1336 return replaceInstUsesWith(Sel
, FalseVal
);
1342 // See if this is a pattern like:
1343 // %old_cmp1 = icmp slt i32 %x, C2
1344 // %old_replacement = select i1 %old_cmp1, i32 %target_low, i32 %target_high
1345 // %old_x_offseted = add i32 %x, C1
1346 // %old_cmp0 = icmp ult i32 %old_x_offseted, C0
1347 // %r = select i1 %old_cmp0, i32 %x, i32 %old_replacement
1348 // This can be rewritten as more canonical pattern:
1349 // %new_cmp1 = icmp slt i32 %x, -C1
1350 // %new_cmp2 = icmp sge i32 %x, C0-C1
1351 // %new_clamped_low = select i1 %new_cmp1, i32 %target_low, i32 %x
1352 // %r = select i1 %new_cmp2, i32 %target_high, i32 %new_clamped_low
1353 // Iff -C1 s<= C2 s<= C0-C1
1354 // Also ULT predicate can also be UGT iff C0 != -1 (+invert result)
1355 // SLT predicate can also be SGT iff C2 != INT_MAX (+invert res.)
1356 static Value
*canonicalizeClampLike(SelectInst
&Sel0
, ICmpInst
&Cmp0
,
1357 InstCombiner::BuilderTy
&Builder
) {
1358 Value
*X
= Sel0
.getTrueValue();
1359 Value
*Sel1
= Sel0
.getFalseValue();
1361 // First match the condition of the outermost select.
1362 // Said condition must be one-use.
1363 if (!Cmp0
.hasOneUse())
1365 ICmpInst::Predicate Pred0
= Cmp0
.getPredicate();
1366 Value
*Cmp00
= Cmp0
.getOperand(0);
1368 if (!match(Cmp0
.getOperand(1),
1369 m_CombineAnd(m_AnyIntegralConstant(), m_Constant(C0
))))
1372 if (!isa
<SelectInst
>(Sel1
)) {
1373 Pred0
= ICmpInst::getInversePredicate(Pred0
);
1377 // Canonicalize Cmp0 into ult or uge.
1378 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1380 case ICmpInst::Predicate::ICMP_ULT
:
1381 case ICmpInst::Predicate::ICMP_UGE
:
1382 // Although icmp ult %x, 0 is an unusual thing to try and should generally
1383 // have been simplified, it does not verify with undef inputs so ensure we
1384 // are not in a strange state.
1385 if (!match(C0
, m_SpecificInt_ICMP(
1386 ICmpInst::Predicate::ICMP_NE
,
1387 APInt::getZero(C0
->getType()->getScalarSizeInBits()))))
1390 case ICmpInst::Predicate::ICMP_ULE
:
1391 case ICmpInst::Predicate::ICMP_UGT
:
1392 // We want to canonicalize it to 'ult' or 'uge', so we'll need to increment
1393 // C0, which again means it must not have any all-ones elements.
1396 ICmpInst::Predicate::ICMP_NE
,
1397 APInt::getAllOnes(C0
->getType()->getScalarSizeInBits()))))
1398 return nullptr; // Can't do, have all-ones element[s].
1399 Pred0
= ICmpInst::getFlippedStrictnessPredicate(Pred0
);
1400 C0
= InstCombiner::AddOne(C0
);
1403 return nullptr; // Unknown predicate.
1406 // Now that we've canonicalized the ICmp, we know the X we expect;
1407 // the select in other hand should be one-use.
1408 if (!Sel1
->hasOneUse())
1411 // If the types do not match, look through any truncs to the underlying
1413 if (Cmp00
->getType() != X
->getType() && X
->hasOneUse())
1414 match(X
, m_TruncOrSelf(m_Value(X
)));
1416 // We now can finish matching the condition of the outermost select:
1417 // it should either be the X itself, or an addition of some constant to X.
1420 C1
= ConstantInt::getNullValue(X
->getType());
1421 else if (!match(Cmp00
,
1422 m_Add(m_Specific(X
),
1423 m_CombineAnd(m_AnyIntegralConstant(), m_Constant(C1
)))))
1427 ICmpInst::Predicate Pred1
;
1429 Value
*ReplacementLow
, *ReplacementHigh
;
1430 if (!match(Sel1
, m_Select(m_Value(Cmp1
), m_Value(ReplacementLow
),
1431 m_Value(ReplacementHigh
))) ||
1433 m_ICmp(Pred1
, m_Specific(X
),
1434 m_CombineAnd(m_AnyIntegralConstant(), m_Constant(C2
)))))
1437 if (!Cmp1
->hasOneUse() && (Cmp00
== X
|| !Cmp00
->hasOneUse()))
1438 return nullptr; // Not enough one-use instructions for the fold.
1439 // FIXME: this restriction could be relaxed if Cmp1 can be reused as one of
1440 // two comparisons we'll need to build.
1442 // Canonicalize Cmp1 into the form we expect.
1443 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1445 case ICmpInst::Predicate::ICMP_SLT
:
1447 case ICmpInst::Predicate::ICMP_SLE
:
1448 // We'd have to increment C2 by one, and for that it must not have signed
1449 // max element, but then it would have been canonicalized to 'slt' before
1450 // we get here. So we can't do anything useful with 'sle'.
1452 case ICmpInst::Predicate::ICMP_SGT
:
1453 // We want to canonicalize it to 'slt', so we'll need to increment C2,
1454 // which again means it must not have any signed max elements.
1456 m_SpecificInt_ICMP(ICmpInst::Predicate::ICMP_NE
,
1457 APInt::getSignedMaxValue(
1458 C2
->getType()->getScalarSizeInBits()))))
1459 return nullptr; // Can't do, have signed max element[s].
1460 C2
= InstCombiner::AddOne(C2
);
1462 case ICmpInst::Predicate::ICMP_SGE
:
1463 // Also non-canonical, but here we don't need to change C2,
1464 // so we don't have any restrictions on C2, so we can just handle it.
1465 Pred1
= ICmpInst::Predicate::ICMP_SLT
;
1466 std::swap(ReplacementLow
, ReplacementHigh
);
1469 return nullptr; // Unknown predicate.
1471 assert(Pred1
== ICmpInst::Predicate::ICMP_SLT
&&
1472 "Unexpected predicate type.");
1474 // The thresholds of this clamp-like pattern.
1475 auto *ThresholdLowIncl
= ConstantExpr::getNeg(C1
);
1476 auto *ThresholdHighExcl
= ConstantExpr::getSub(C0
, C1
);
1478 assert((Pred0
== ICmpInst::Predicate::ICMP_ULT
||
1479 Pred0
== ICmpInst::Predicate::ICMP_UGE
) &&
1480 "Unexpected predicate type.");
1481 if (Pred0
== ICmpInst::Predicate::ICMP_UGE
)
1482 std::swap(ThresholdLowIncl
, ThresholdHighExcl
);
1484 // The fold has a precondition 1: C2 s>= ThresholdLow
1485 auto *Precond1
= ConstantExpr::getICmp(ICmpInst::Predicate::ICMP_SGE
, C2
,
1487 if (!match(Precond1
, m_One()))
1489 // The fold has a precondition 2: C2 s<= ThresholdHigh
1490 auto *Precond2
= ConstantExpr::getICmp(ICmpInst::Predicate::ICMP_SLE
, C2
,
1492 if (!match(Precond2
, m_One()))
1495 // If we are matching from a truncated input, we need to sext the
1496 // ReplacementLow and ReplacementHigh values. Only do the transform if they
1497 // are free to extend due to being constants.
1498 if (X
->getType() != Sel0
.getType()) {
1499 Constant
*LowC
, *HighC
;
1500 if (!match(ReplacementLow
, m_ImmConstant(LowC
)) ||
1501 !match(ReplacementHigh
, m_ImmConstant(HighC
)))
1503 const DataLayout
&DL
= Sel0
.getModule()->getDataLayout();
1505 ConstantFoldCastOperand(Instruction::SExt
, LowC
, X
->getType(), DL
);
1507 ConstantFoldCastOperand(Instruction::SExt
, HighC
, X
->getType(), DL
);
1508 assert(ReplacementLow
&& ReplacementHigh
&&
1509 "Constant folding of ImmConstant cannot fail");
1512 // All good, finally emit the new pattern.
1513 Value
*ShouldReplaceLow
= Builder
.CreateICmpSLT(X
, ThresholdLowIncl
);
1514 Value
*ShouldReplaceHigh
= Builder
.CreateICmpSGE(X
, ThresholdHighExcl
);
1515 Value
*MaybeReplacedLow
=
1516 Builder
.CreateSelect(ShouldReplaceLow
, ReplacementLow
, X
);
1518 // Create the final select. If we looked through a truncate above, we will
1519 // need to retruncate the result.
1520 Value
*MaybeReplacedHigh
= Builder
.CreateSelect(
1521 ShouldReplaceHigh
, ReplacementHigh
, MaybeReplacedLow
);
1522 return Builder
.CreateTrunc(MaybeReplacedHigh
, Sel0
.getType());
1526 // %cmp = icmp [canonical predicate] i32 %x, C0
1527 // %r = select i1 %cmp, i32 %y, i32 C1
1528 // Where C0 != C1 and %x may be different from %y, see if the constant that we
1529 // will have if we flip the strictness of the predicate (i.e. without changing
1530 // the result) is identical to the C1 in select. If it matches we can change
1531 // original comparison to one with swapped predicate, reuse the constant,
1532 // and swap the hands of select.
1533 static Instruction
*
1534 tryToReuseConstantFromSelectInComparison(SelectInst
&Sel
, ICmpInst
&Cmp
,
1535 InstCombinerImpl
&IC
) {
1536 ICmpInst::Predicate Pred
;
1539 if (!match(&Cmp
, m_OneUse(m_ICmp(
1541 m_CombineAnd(m_AnyIntegralConstant(), m_Constant(C0
))))))
1544 // If comparison predicate is non-relational, we won't be able to do anything.
1545 if (ICmpInst::isEquality(Pred
))
1548 // If comparison predicate is non-canonical, then we certainly won't be able
1549 // to make it canonical; canonicalizeCmpWithConstant() already tried.
1550 if (!InstCombiner::isCanonicalPredicate(Pred
))
1553 // If the [input] type of comparison and select type are different, lets abort
1554 // for now. We could try to compare constants with trunc/[zs]ext though.
1555 if (C0
->getType() != Sel
.getType())
1558 // ULT with 'add' of a constant is canonical. See foldICmpAddConstant().
1559 // FIXME: Are there more magic icmp predicate+constant pairs we must avoid?
1560 // Or should we just abandon this transform entirely?
1561 if (Pred
== CmpInst::ICMP_ULT
&& match(X
, m_Add(m_Value(), m_Constant())))
1565 Value
*SelVal0
, *SelVal1
; // We do not care which one is from where.
1566 match(&Sel
, m_Select(m_Value(), m_Value(SelVal0
), m_Value(SelVal1
)));
1567 // At least one of these values we are selecting between must be a constant
1568 // else we'll never succeed.
1569 if (!match(SelVal0
, m_AnyIntegralConstant()) &&
1570 !match(SelVal1
, m_AnyIntegralConstant()))
1573 // Does this constant C match any of the `select` values?
1574 auto MatchesSelectValue
= [SelVal0
, SelVal1
](Constant
*C
) {
1575 return C
->isElementWiseEqual(SelVal0
) || C
->isElementWiseEqual(SelVal1
);
1578 // If C0 *already* matches true/false value of select, we are done.
1579 if (MatchesSelectValue(C0
))
1582 // Check the constant we'd have with flipped-strictness predicate.
1583 auto FlippedStrictness
=
1584 InstCombiner::getFlippedStrictnessPredicateAndConstant(Pred
, C0
);
1585 if (!FlippedStrictness
)
1588 // If said constant doesn't match either, then there is no hope,
1589 if (!MatchesSelectValue(FlippedStrictness
->second
))
1592 // It matched! Lets insert the new comparison just before select.
1593 InstCombiner::BuilderTy::InsertPointGuard
Guard(IC
.Builder
);
1594 IC
.Builder
.SetInsertPoint(&Sel
);
1596 Pred
= ICmpInst::getSwappedPredicate(Pred
); // Yes, swapped.
1597 Value
*NewCmp
= IC
.Builder
.CreateICmp(Pred
, X
, FlippedStrictness
->second
,
1598 Cmp
.getName() + ".inv");
1599 IC
.replaceOperand(Sel
, 0, NewCmp
);
1601 Sel
.swapProfMetadata();
1606 static Instruction
*foldSelectZeroOrOnes(ICmpInst
*Cmp
, Value
*TVal
,
1608 InstCombiner::BuilderTy
&Builder
) {
1609 if (!Cmp
->hasOneUse())
1613 if (!match(Cmp
->getOperand(1), m_APIntAllowUndef(CmpC
)))
1616 // (X u< 2) ? -X : -1 --> sext (X != 0)
1617 Value
*X
= Cmp
->getOperand(0);
1618 if (Cmp
->getPredicate() == ICmpInst::ICMP_ULT
&& *CmpC
== 2 &&
1619 match(TVal
, m_Neg(m_Specific(X
))) && match(FVal
, m_AllOnes()))
1620 return new SExtInst(Builder
.CreateIsNotNull(X
), TVal
->getType());
1622 // (X u> 1) ? -1 : -X --> sext (X != 0)
1623 if (Cmp
->getPredicate() == ICmpInst::ICMP_UGT
&& *CmpC
== 1 &&
1624 match(FVal
, m_Neg(m_Specific(X
))) && match(TVal
, m_AllOnes()))
1625 return new SExtInst(Builder
.CreateIsNotNull(X
), TVal
->getType());
1630 static Value
*foldSelectInstWithICmpConst(SelectInst
&SI
, ICmpInst
*ICI
,
1631 InstCombiner::BuilderTy
&Builder
) {
1634 CmpInst::Predicate Pred
;
1635 if (!match(ICI
, m_ICmp(Pred
, m_Value(V
), m_APInt(CmpC
))))
1638 // Match clamp away from min/max value as a max/min operation.
1639 Value
*TVal
= SI
.getTrueValue();
1640 Value
*FVal
= SI
.getFalseValue();
1641 if (Pred
== ICmpInst::ICMP_EQ
&& V
== FVal
) {
1642 // (V == UMIN) ? UMIN+1 : V --> umax(V, UMIN+1)
1643 if (CmpC
->isMinValue() && match(TVal
, m_SpecificInt(*CmpC
+ 1)))
1644 return Builder
.CreateBinaryIntrinsic(Intrinsic::umax
, V
, TVal
);
1645 // (V == UMAX) ? UMAX-1 : V --> umin(V, UMAX-1)
1646 if (CmpC
->isMaxValue() && match(TVal
, m_SpecificInt(*CmpC
- 1)))
1647 return Builder
.CreateBinaryIntrinsic(Intrinsic::umin
, V
, TVal
);
1648 // (V == SMIN) ? SMIN+1 : V --> smax(V, SMIN+1)
1649 if (CmpC
->isMinSignedValue() && match(TVal
, m_SpecificInt(*CmpC
+ 1)))
1650 return Builder
.CreateBinaryIntrinsic(Intrinsic::smax
, V
, TVal
);
1651 // (V == SMAX) ? SMAX-1 : V --> smin(V, SMAX-1)
1652 if (CmpC
->isMaxSignedValue() && match(TVal
, m_SpecificInt(*CmpC
- 1)))
1653 return Builder
.CreateBinaryIntrinsic(Intrinsic::smin
, V
, TVal
);
1658 CmpInst::Predicate CPred
;
1659 if (match(&SI
, m_Select(m_Specific(ICI
), m_APInt(C
), m_BinOp(BO
))))
1660 CPred
= ICI
->getPredicate();
1661 else if (match(&SI
, m_Select(m_Specific(ICI
), m_BinOp(BO
), m_APInt(C
))))
1662 CPred
= ICI
->getInversePredicate();
1666 const APInt
*BinOpC
;
1667 if (!match(BO
, m_BinOp(m_Specific(V
), m_APInt(BinOpC
))))
1670 ConstantRange R
= ConstantRange::makeExactICmpRegion(CPred
, *CmpC
)
1671 .binaryOp(BO
->getOpcode(), *BinOpC
);
1673 BO
->dropPoisonGeneratingFlags();
1679 /// Visit a SelectInst that has an ICmpInst as its first operand.
1680 Instruction
*InstCombinerImpl::foldSelectInstWithICmp(SelectInst
&SI
,
1682 if (Instruction
*NewSel
= foldSelectValueEquivalence(SI
, *ICI
))
1686 canonicalizeSPF(*ICI
, SI
.getTrueValue(), SI
.getFalseValue(), *this))
1687 return replaceInstUsesWith(SI
, V
);
1689 if (Value
*V
= foldSelectInstWithICmpConst(SI
, ICI
, Builder
))
1690 return replaceInstUsesWith(SI
, V
);
1692 if (Value
*V
= canonicalizeClampLike(SI
, *ICI
, Builder
))
1693 return replaceInstUsesWith(SI
, V
);
1695 if (Instruction
*NewSel
=
1696 tryToReuseConstantFromSelectInComparison(SI
, *ICI
, *this))
1699 if (Value
*V
= foldSelectICmpAnd(SI
, ICI
, Builder
))
1700 return replaceInstUsesWith(SI
, V
);
1702 // NOTE: if we wanted to, this is where to detect integer MIN/MAX
1703 bool Changed
= false;
1704 Value
*TrueVal
= SI
.getTrueValue();
1705 Value
*FalseVal
= SI
.getFalseValue();
1706 ICmpInst::Predicate Pred
= ICI
->getPredicate();
1707 Value
*CmpLHS
= ICI
->getOperand(0);
1708 Value
*CmpRHS
= ICI
->getOperand(1);
1709 if (CmpRHS
!= CmpLHS
&& isa
<Constant
>(CmpRHS
) && !isa
<Constant
>(CmpLHS
)) {
1710 if (CmpLHS
== TrueVal
&& Pred
== ICmpInst::ICMP_EQ
) {
1711 // Transform (X == C) ? X : Y -> (X == C) ? C : Y
1712 replaceOperand(SI
, 1, CmpRHS
);
1714 } else if (CmpLHS
== FalseVal
&& Pred
== ICmpInst::ICMP_NE
) {
1715 // Transform (X != C) ? Y : X -> (X != C) ? Y : C
1716 replaceOperand(SI
, 2, CmpRHS
);
1721 // Canonicalize a signbit condition to use zero constant by swapping:
1722 // (CmpLHS > -1) ? TV : FV --> (CmpLHS < 0) ? FV : TV
1723 // To avoid conflicts (infinite loops) with other canonicalizations, this is
1724 // not applied with any constant select arm.
1725 if (Pred
== ICmpInst::ICMP_SGT
&& match(CmpRHS
, m_AllOnes()) &&
1726 !match(TrueVal
, m_Constant()) && !match(FalseVal
, m_Constant()) &&
1728 InstCombiner::BuilderTy::InsertPointGuard
Guard(Builder
);
1729 Builder
.SetInsertPoint(&SI
);
1730 Value
*IsNeg
= Builder
.CreateIsNeg(CmpLHS
, ICI
->getName());
1731 replaceOperand(SI
, 0, IsNeg
);
1733 SI
.swapProfMetadata();
1737 // FIXME: This code is nearly duplicated in InstSimplify. Using/refactoring
1738 // decomposeBitTestICmp() might help.
1739 if (TrueVal
->getType()->isIntOrIntVectorTy()) {
1741 DL
.getTypeSizeInBits(TrueVal
->getType()->getScalarType());
1742 APInt MinSignedValue
= APInt::getSignedMinValue(BitWidth
);
1746 bool IsBitTest
= false;
1747 if (ICmpInst::isEquality(Pred
) &&
1748 match(CmpLHS
, m_And(m_Value(X
), m_Power2(Y
))) &&
1749 match(CmpRHS
, m_Zero())) {
1751 TrueWhenUnset
= Pred
== ICmpInst::ICMP_EQ
;
1752 } else if (Pred
== ICmpInst::ICMP_SLT
&& match(CmpRHS
, m_Zero())) {
1754 Y
= &MinSignedValue
;
1756 TrueWhenUnset
= false;
1757 } else if (Pred
== ICmpInst::ICMP_SGT
&& match(CmpRHS
, m_AllOnes())) {
1759 Y
= &MinSignedValue
;
1761 TrueWhenUnset
= true;
1765 // (X & Y) == 0 ? X : X ^ Y --> X & ~Y
1766 if (TrueWhenUnset
&& TrueVal
== X
&&
1767 match(FalseVal
, m_Xor(m_Specific(X
), m_APInt(C
))) && *Y
== *C
)
1768 V
= Builder
.CreateAnd(X
, ~(*Y
));
1769 // (X & Y) != 0 ? X ^ Y : X --> X & ~Y
1770 else if (!TrueWhenUnset
&& FalseVal
== X
&&
1771 match(TrueVal
, m_Xor(m_Specific(X
), m_APInt(C
))) && *Y
== *C
)
1772 V
= Builder
.CreateAnd(X
, ~(*Y
));
1773 // (X & Y) == 0 ? X ^ Y : X --> X | Y
1774 else if (TrueWhenUnset
&& FalseVal
== X
&&
1775 match(TrueVal
, m_Xor(m_Specific(X
), m_APInt(C
))) && *Y
== *C
)
1776 V
= Builder
.CreateOr(X
, *Y
);
1777 // (X & Y) != 0 ? X : X ^ Y --> X | Y
1778 else if (!TrueWhenUnset
&& TrueVal
== X
&&
1779 match(FalseVal
, m_Xor(m_Specific(X
), m_APInt(C
))) && *Y
== *C
)
1780 V
= Builder
.CreateOr(X
, *Y
);
1783 return replaceInstUsesWith(SI
, V
);
1787 if (Instruction
*V
=
1788 foldSelectICmpAndAnd(SI
.getType(), ICI
, TrueVal
, FalseVal
, Builder
))
1791 if (Value
*V
= foldSelectICmpAndZeroShl(ICI
, TrueVal
, FalseVal
, Builder
))
1792 return replaceInstUsesWith(SI
, V
);
1794 if (Instruction
*V
= foldSelectCtlzToCttz(ICI
, TrueVal
, FalseVal
, Builder
))
1797 if (Instruction
*V
= foldSelectZeroOrOnes(ICI
, TrueVal
, FalseVal
, Builder
))
1800 if (Value
*V
= foldSelectICmpAndBinOp(ICI
, TrueVal
, FalseVal
, Builder
))
1801 return replaceInstUsesWith(SI
, V
);
1803 if (Value
*V
= foldSelectICmpLshrAshr(ICI
, TrueVal
, FalseVal
, Builder
))
1804 return replaceInstUsesWith(SI
, V
);
1806 if (Value
*V
= foldSelectCttzCtlz(ICI
, TrueVal
, FalseVal
, Builder
))
1807 return replaceInstUsesWith(SI
, V
);
1809 if (Value
*V
= canonicalizeSaturatedSubtract(ICI
, TrueVal
, FalseVal
, Builder
))
1810 return replaceInstUsesWith(SI
, V
);
1812 if (Value
*V
= canonicalizeSaturatedAdd(ICI
, TrueVal
, FalseVal
, Builder
))
1813 return replaceInstUsesWith(SI
, V
);
1815 if (Value
*V
= foldAbsDiff(ICI
, TrueVal
, FalseVal
, Builder
))
1816 return replaceInstUsesWith(SI
, V
);
1818 return Changed
? &SI
: nullptr;
1821 /// SI is a select whose condition is a PHI node (but the two may be in
1822 /// different blocks). See if the true/false values (V) are live in all of the
1823 /// predecessor blocks of the PHI. For example, cases like this can't be mapped:
1825 /// X = phi [ C1, BB1], [C2, BB2]
1827 /// Z = select X, Y, 0
1829 /// because Y is not live in BB1/BB2.
1830 static bool canSelectOperandBeMappingIntoPredBlock(const Value
*V
,
1831 const SelectInst
&SI
) {
1832 // If the value is a non-instruction value like a constant or argument, it
1833 // can always be mapped.
1834 const Instruction
*I
= dyn_cast
<Instruction
>(V
);
1835 if (!I
) return true;
1837 // If V is a PHI node defined in the same block as the condition PHI, we can
1838 // map the arguments.
1839 const PHINode
*CondPHI
= cast
<PHINode
>(SI
.getCondition());
1841 if (const PHINode
*VP
= dyn_cast
<PHINode
>(I
))
1842 if (VP
->getParent() == CondPHI
->getParent())
1845 // Otherwise, if the PHI and select are defined in the same block and if V is
1846 // defined in a different block, then we can transform it.
1847 if (SI
.getParent() == CondPHI
->getParent() &&
1848 I
->getParent() != CondPHI
->getParent())
1851 // Otherwise we have a 'hard' case and we can't tell without doing more
1852 // detailed dominator based analysis, punt.
1856 /// We have an SPF (e.g. a min or max) of an SPF of the form:
1857 /// SPF2(SPF1(A, B), C)
1858 Instruction
*InstCombinerImpl::foldSPFofSPF(Instruction
*Inner
,
1859 SelectPatternFlavor SPF1
, Value
*A
,
1860 Value
*B
, Instruction
&Outer
,
1861 SelectPatternFlavor SPF2
,
1863 if (Outer
.getType() != Inner
->getType())
1866 if (C
== A
|| C
== B
) {
1867 // MAX(MAX(A, B), B) -> MAX(A, B)
1868 // MIN(MIN(a, b), a) -> MIN(a, b)
1869 // TODO: This could be done in instsimplify.
1870 if (SPF1
== SPF2
&& SelectPatternResult::isMinOrMax(SPF1
))
1871 return replaceInstUsesWith(Outer
, Inner
);
1877 /// Turn select C, (X + Y), (X - Y) --> (X + (select C, Y, (-Y))).
1878 /// This is even legal for FP.
1879 static Instruction
*foldAddSubSelect(SelectInst
&SI
,
1880 InstCombiner::BuilderTy
&Builder
) {
1881 Value
*CondVal
= SI
.getCondition();
1882 Value
*TrueVal
= SI
.getTrueValue();
1883 Value
*FalseVal
= SI
.getFalseValue();
1884 auto *TI
= dyn_cast
<Instruction
>(TrueVal
);
1885 auto *FI
= dyn_cast
<Instruction
>(FalseVal
);
1886 if (!TI
|| !FI
|| !TI
->hasOneUse() || !FI
->hasOneUse())
1889 Instruction
*AddOp
= nullptr, *SubOp
= nullptr;
1890 if ((TI
->getOpcode() == Instruction::Sub
&&
1891 FI
->getOpcode() == Instruction::Add
) ||
1892 (TI
->getOpcode() == Instruction::FSub
&&
1893 FI
->getOpcode() == Instruction::FAdd
)) {
1896 } else if ((FI
->getOpcode() == Instruction::Sub
&&
1897 TI
->getOpcode() == Instruction::Add
) ||
1898 (FI
->getOpcode() == Instruction::FSub
&&
1899 TI
->getOpcode() == Instruction::FAdd
)) {
1905 Value
*OtherAddOp
= nullptr;
1906 if (SubOp
->getOperand(0) == AddOp
->getOperand(0)) {
1907 OtherAddOp
= AddOp
->getOperand(1);
1908 } else if (SubOp
->getOperand(0) == AddOp
->getOperand(1)) {
1909 OtherAddOp
= AddOp
->getOperand(0);
1913 // So at this point we know we have (Y -> OtherAddOp):
1914 // select C, (add X, Y), (sub X, Z)
1915 Value
*NegVal
; // Compute -Z
1916 if (SI
.getType()->isFPOrFPVectorTy()) {
1917 NegVal
= Builder
.CreateFNeg(SubOp
->getOperand(1));
1918 if (Instruction
*NegInst
= dyn_cast
<Instruction
>(NegVal
)) {
1919 FastMathFlags Flags
= AddOp
->getFastMathFlags();
1920 Flags
&= SubOp
->getFastMathFlags();
1921 NegInst
->setFastMathFlags(Flags
);
1924 NegVal
= Builder
.CreateNeg(SubOp
->getOperand(1));
1927 Value
*NewTrueOp
= OtherAddOp
;
1928 Value
*NewFalseOp
= NegVal
;
1930 std::swap(NewTrueOp
, NewFalseOp
);
1931 Value
*NewSel
= Builder
.CreateSelect(CondVal
, NewTrueOp
, NewFalseOp
,
1932 SI
.getName() + ".p", &SI
);
1934 if (SI
.getType()->isFPOrFPVectorTy()) {
1936 BinaryOperator::CreateFAdd(SubOp
->getOperand(0), NewSel
);
1938 FastMathFlags Flags
= AddOp
->getFastMathFlags();
1939 Flags
&= SubOp
->getFastMathFlags();
1940 RI
->setFastMathFlags(Flags
);
1943 return BinaryOperator::CreateAdd(SubOp
->getOperand(0), NewSel
);
1949 /// Turn X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
1950 /// And X - Y overflows ? 0 : X - Y -> usub_sat X, Y
1951 /// Along with a number of patterns similar to:
1952 /// X + Y overflows ? (X < 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
1953 /// X - Y overflows ? (X > 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
1954 static Instruction
*
1955 foldOverflowingAddSubSelect(SelectInst
&SI
, InstCombiner::BuilderTy
&Builder
) {
1956 Value
*CondVal
= SI
.getCondition();
1957 Value
*TrueVal
= SI
.getTrueValue();
1958 Value
*FalseVal
= SI
.getFalseValue();
1960 WithOverflowInst
*II
;
1961 if (!match(CondVal
, m_ExtractValue
<1>(m_WithOverflowInst(II
))) ||
1962 !match(FalseVal
, m_ExtractValue
<0>(m_Specific(II
))))
1965 Value
*X
= II
->getLHS();
1966 Value
*Y
= II
->getRHS();
1968 auto IsSignedSaturateLimit
= [&](Value
*Limit
, bool IsAdd
) {
1969 Type
*Ty
= Limit
->getType();
1971 ICmpInst::Predicate Pred
;
1972 Value
*TrueVal
, *FalseVal
, *Op
;
1974 if (!match(Limit
, m_Select(m_ICmp(Pred
, m_Value(Op
), m_APInt(C
)),
1975 m_Value(TrueVal
), m_Value(FalseVal
))))
1978 auto IsZeroOrOne
= [](const APInt
&C
) { return C
.isZero() || C
.isOne(); };
1979 auto IsMinMax
= [&](Value
*Min
, Value
*Max
) {
1980 APInt MinVal
= APInt::getSignedMinValue(Ty
->getScalarSizeInBits());
1981 APInt MaxVal
= APInt::getSignedMaxValue(Ty
->getScalarSizeInBits());
1982 return match(Min
, m_SpecificInt(MinVal
)) &&
1983 match(Max
, m_SpecificInt(MaxVal
));
1986 if (Op
!= X
&& Op
!= Y
)
1990 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
1991 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
1992 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
1993 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
1994 if (Pred
== ICmpInst::ICMP_SLT
&& IsZeroOrOne(*C
) &&
1995 IsMinMax(TrueVal
, FalseVal
))
1997 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
1998 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
1999 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2000 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2001 if (Pred
== ICmpInst::ICMP_SGT
&& IsZeroOrOne(*C
+ 1) &&
2002 IsMinMax(FalseVal
, TrueVal
))
2005 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2006 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2007 if (Op
== X
&& Pred
== ICmpInst::ICMP_SLT
&& IsZeroOrOne(*C
+ 1) &&
2008 IsMinMax(TrueVal
, FalseVal
))
2010 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2011 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2012 if (Op
== X
&& Pred
== ICmpInst::ICMP_SGT
&& IsZeroOrOne(*C
+ 2) &&
2013 IsMinMax(FalseVal
, TrueVal
))
2015 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2016 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2017 if (Op
== Y
&& Pred
== ICmpInst::ICMP_SLT
&& IsZeroOrOne(*C
) &&
2018 IsMinMax(FalseVal
, TrueVal
))
2020 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2021 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2022 if (Op
== Y
&& Pred
== ICmpInst::ICMP_SGT
&& IsZeroOrOne(*C
+ 1) &&
2023 IsMinMax(TrueVal
, FalseVal
))
2030 Intrinsic::ID NewIntrinsicID
;
2031 if (II
->getIntrinsicID() == Intrinsic::uadd_with_overflow
&&
2032 match(TrueVal
, m_AllOnes()))
2033 // X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
2034 NewIntrinsicID
= Intrinsic::uadd_sat
;
2035 else if (II
->getIntrinsicID() == Intrinsic::usub_with_overflow
&&
2036 match(TrueVal
, m_Zero()))
2037 // X - Y overflows ? 0 : X - Y -> usub_sat X, Y
2038 NewIntrinsicID
= Intrinsic::usub_sat
;
2039 else if (II
->getIntrinsicID() == Intrinsic::sadd_with_overflow
&&
2040 IsSignedSaturateLimit(TrueVal
, /*IsAdd=*/true))
2041 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2042 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2043 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2044 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2045 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2046 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2047 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2048 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2049 NewIntrinsicID
= Intrinsic::sadd_sat
;
2050 else if (II
->getIntrinsicID() == Intrinsic::ssub_with_overflow
&&
2051 IsSignedSaturateLimit(TrueVal
, /*IsAdd=*/false))
2052 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2053 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2054 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2055 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2056 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2057 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2058 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2059 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2060 NewIntrinsicID
= Intrinsic::ssub_sat
;
2065 Intrinsic::getDeclaration(SI
.getModule(), NewIntrinsicID
, SI
.getType());
2066 return CallInst::Create(F
, {X
, Y
});
2069 Instruction
*InstCombinerImpl::foldSelectExtConst(SelectInst
&Sel
) {
2071 if (!match(Sel
.getTrueValue(), m_Constant(C
)) &&
2072 !match(Sel
.getFalseValue(), m_Constant(C
)))
2075 Instruction
*ExtInst
;
2076 if (!match(Sel
.getTrueValue(), m_Instruction(ExtInst
)) &&
2077 !match(Sel
.getFalseValue(), m_Instruction(ExtInst
)))
2080 auto ExtOpcode
= ExtInst
->getOpcode();
2081 if (ExtOpcode
!= Instruction::ZExt
&& ExtOpcode
!= Instruction::SExt
)
2084 // If we are extending from a boolean type or if we can create a select that
2085 // has the same size operands as its condition, try to narrow the select.
2086 Value
*X
= ExtInst
->getOperand(0);
2087 Type
*SmallType
= X
->getType();
2088 Value
*Cond
= Sel
.getCondition();
2089 auto *Cmp
= dyn_cast
<CmpInst
>(Cond
);
2090 if (!SmallType
->isIntOrIntVectorTy(1) &&
2091 (!Cmp
|| Cmp
->getOperand(0)->getType() != SmallType
))
2094 // If the constant is the same after truncation to the smaller type and
2095 // extension to the original type, we can narrow the select.
2096 Type
*SelType
= Sel
.getType();
2097 Constant
*TruncC
= getLosslessTrunc(C
, SmallType
, ExtOpcode
);
2098 if (TruncC
&& ExtInst
->hasOneUse()) {
2099 Value
*TruncCVal
= cast
<Value
>(TruncC
);
2100 if (ExtInst
== Sel
.getFalseValue())
2101 std::swap(X
, TruncCVal
);
2103 // select Cond, (ext X), C --> ext(select Cond, X, C')
2104 // select Cond, C, (ext X) --> ext(select Cond, C', X)
2105 Value
*NewSel
= Builder
.CreateSelect(Cond
, X
, TruncCVal
, "narrow", &Sel
);
2106 return CastInst::Create(Instruction::CastOps(ExtOpcode
), NewSel
, SelType
);
2112 /// Try to transform a vector select with a constant condition vector into a
2113 /// shuffle for easier combining with other shuffles and insert/extract.
2114 static Instruction
*canonicalizeSelectToShuffle(SelectInst
&SI
) {
2115 Value
*CondVal
= SI
.getCondition();
2117 auto *CondValTy
= dyn_cast
<FixedVectorType
>(CondVal
->getType());
2118 if (!CondValTy
|| !match(CondVal
, m_Constant(CondC
)))
2121 unsigned NumElts
= CondValTy
->getNumElements();
2122 SmallVector
<int, 16> Mask
;
2123 Mask
.reserve(NumElts
);
2124 for (unsigned i
= 0; i
!= NumElts
; ++i
) {
2125 Constant
*Elt
= CondC
->getAggregateElement(i
);
2129 if (Elt
->isOneValue()) {
2130 // If the select condition element is true, choose from the 1st vector.
2132 } else if (Elt
->isNullValue()) {
2133 // If the select condition element is false, choose from the 2nd vector.
2134 Mask
.push_back(i
+ NumElts
);
2135 } else if (isa
<UndefValue
>(Elt
)) {
2136 // Undef in a select condition (choose one of the operands) does not mean
2137 // the same thing as undef in a shuffle mask (any value is acceptable), so
2141 // Bail out on a constant expression.
2146 return new ShuffleVectorInst(SI
.getTrueValue(), SI
.getFalseValue(), Mask
);
2149 /// If we have a select of vectors with a scalar condition, try to convert that
2150 /// to a vector select by splatting the condition. A splat may get folded with
2151 /// other operations in IR and having all operands of a select be vector types
2152 /// is likely better for vector codegen.
2153 static Instruction
*canonicalizeScalarSelectOfVecs(SelectInst
&Sel
,
2154 InstCombinerImpl
&IC
) {
2155 auto *Ty
= dyn_cast
<VectorType
>(Sel
.getType());
2159 // We can replace a single-use extract with constant index.
2160 Value
*Cond
= Sel
.getCondition();
2161 if (!match(Cond
, m_OneUse(m_ExtractElt(m_Value(), m_ConstantInt()))))
2164 // select (extelt V, Index), T, F --> select (splat V, Index), T, F
2165 // Splatting the extracted condition reduces code (we could directly create a
2166 // splat shuffle of the source vector to eliminate the intermediate step).
2167 return IC
.replaceOperand(
2168 Sel
, 0, IC
.Builder
.CreateVectorSplat(Ty
->getElementCount(), Cond
));
2171 /// Reuse bitcasted operands between a compare and select:
2172 /// select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2173 /// bitcast (select (cmp (bitcast C), (bitcast D)), (bitcast C), (bitcast D))
2174 static Instruction
*foldSelectCmpBitcasts(SelectInst
&Sel
,
2175 InstCombiner::BuilderTy
&Builder
) {
2176 Value
*Cond
= Sel
.getCondition();
2177 Value
*TVal
= Sel
.getTrueValue();
2178 Value
*FVal
= Sel
.getFalseValue();
2180 CmpInst::Predicate Pred
;
2182 if (!match(Cond
, m_Cmp(Pred
, m_Value(A
), m_Value(B
))))
2185 // The select condition is a compare instruction. If the select's true/false
2186 // values are already the same as the compare operands, there's nothing to do.
2187 if (TVal
== A
|| TVal
== B
|| FVal
== A
|| FVal
== B
)
2191 if (!match(A
, m_BitCast(m_Value(C
))) || !match(B
, m_BitCast(m_Value(D
))))
2194 // select (cmp (bitcast C), (bitcast D)), (bitcast TSrc), (bitcast FSrc)
2196 if (!match(TVal
, m_BitCast(m_Value(TSrc
))) ||
2197 !match(FVal
, m_BitCast(m_Value(FSrc
))))
2200 // If the select true/false values are *different bitcasts* of the same source
2201 // operands, make the select operands the same as the compare operands and
2202 // cast the result. This is the canonical select form for min/max.
2204 if (TSrc
== C
&& FSrc
== D
) {
2205 // select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2206 // bitcast (select (cmp A, B), A, B)
2207 NewSel
= Builder
.CreateSelect(Cond
, A
, B
, "", &Sel
);
2208 } else if (TSrc
== D
&& FSrc
== C
) {
2209 // select (cmp (bitcast C), (bitcast D)), (bitcast' D), (bitcast' C) -->
2210 // bitcast (select (cmp A, B), B, A)
2211 NewSel
= Builder
.CreateSelect(Cond
, B
, A
, "", &Sel
);
2215 return CastInst::CreateBitOrPointerCast(NewSel
, Sel
.getType());
2218 /// Try to eliminate select instructions that test the returned flag of cmpxchg
2221 /// If a select instruction tests the returned flag of a cmpxchg instruction and
2222 /// selects between the returned value of the cmpxchg instruction its compare
2223 /// operand, the result of the select will always be equal to its false value.
2226 /// %0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2227 /// %1 = extractvalue { i64, i1 } %0, 1
2228 /// %2 = extractvalue { i64, i1 } %0, 0
2229 /// %3 = select i1 %1, i64 %compare, i64 %2
2232 /// The returned value of the cmpxchg instruction (%2) is the original value
2233 /// located at %ptr prior to any update. If the cmpxchg operation succeeds, %2
2234 /// must have been equal to %compare. Thus, the result of the select is always
2235 /// equal to %2, and the code can be simplified to:
2237 /// %0 = cmpxchg i64* %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2238 /// %1 = extractvalue { i64, i1 } %0, 0
2241 static Value
*foldSelectCmpXchg(SelectInst
&SI
) {
2242 // A helper that determines if V is an extractvalue instruction whose
2243 // aggregate operand is a cmpxchg instruction and whose single index is equal
2244 // to I. If such conditions are true, the helper returns the cmpxchg
2245 // instruction; otherwise, a nullptr is returned.
2246 auto isExtractFromCmpXchg
= [](Value
*V
, unsigned I
) -> AtomicCmpXchgInst
* {
2247 auto *Extract
= dyn_cast
<ExtractValueInst
>(V
);
2250 if (Extract
->getIndices()[0] != I
)
2252 return dyn_cast
<AtomicCmpXchgInst
>(Extract
->getAggregateOperand());
2255 // If the select has a single user, and this user is a select instruction that
2256 // we can simplify, skip the cmpxchg simplification for now.
2258 if (auto *Select
= dyn_cast
<SelectInst
>(SI
.user_back()))
2259 if (Select
->getCondition() == SI
.getCondition())
2260 if (Select
->getFalseValue() == SI
.getTrueValue() ||
2261 Select
->getTrueValue() == SI
.getFalseValue())
2264 // Ensure the select condition is the returned flag of a cmpxchg instruction.
2265 auto *CmpXchg
= isExtractFromCmpXchg(SI
.getCondition(), 1);
2269 // Check the true value case: The true value of the select is the returned
2270 // value of the same cmpxchg used by the condition, and the false value is the
2271 // cmpxchg instruction's compare operand.
2272 if (auto *X
= isExtractFromCmpXchg(SI
.getTrueValue(), 0))
2273 if (X
== CmpXchg
&& X
->getCompareOperand() == SI
.getFalseValue())
2274 return SI
.getFalseValue();
2276 // Check the false value case: The false value of the select is the returned
2277 // value of the same cmpxchg used by the condition, and the true value is the
2278 // cmpxchg instruction's compare operand.
2279 if (auto *X
= isExtractFromCmpXchg(SI
.getFalseValue(), 0))
2280 if (X
== CmpXchg
&& X
->getCompareOperand() == SI
.getTrueValue())
2281 return SI
.getFalseValue();
2286 /// Try to reduce a funnel/rotate pattern that includes a compare and select
2287 /// into a funnel shift intrinsic. Example:
2288 /// rotl32(a, b) --> (b == 0 ? a : ((a >> (32 - b)) | (a << b)))
2289 /// --> call llvm.fshl.i32(a, a, b)
2290 /// fshl32(a, b, c) --> (c == 0 ? a : ((b >> (32 - c)) | (a << c)))
2291 /// --> call llvm.fshl.i32(a, b, c)
2292 /// fshr32(a, b, c) --> (c == 0 ? b : ((a >> (32 - c)) | (b << c)))
2293 /// --> call llvm.fshr.i32(a, b, c)
2294 static Instruction
*foldSelectFunnelShift(SelectInst
&Sel
,
2295 InstCombiner::BuilderTy
&Builder
) {
2296 // This must be a power-of-2 type for a bitmasking transform to be valid.
2297 unsigned Width
= Sel
.getType()->getScalarSizeInBits();
2298 if (!isPowerOf2_32(Width
))
2301 BinaryOperator
*Or0
, *Or1
;
2302 if (!match(Sel
.getFalseValue(), m_OneUse(m_Or(m_BinOp(Or0
), m_BinOp(Or1
)))))
2305 Value
*SV0
, *SV1
, *SA0
, *SA1
;
2306 if (!match(Or0
, m_OneUse(m_LogicalShift(m_Value(SV0
),
2307 m_ZExtOrSelf(m_Value(SA0
))))) ||
2308 !match(Or1
, m_OneUse(m_LogicalShift(m_Value(SV1
),
2309 m_ZExtOrSelf(m_Value(SA1
))))) ||
2310 Or0
->getOpcode() == Or1
->getOpcode())
2313 // Canonicalize to or(shl(SV0, SA0), lshr(SV1, SA1)).
2314 if (Or0
->getOpcode() == BinaryOperator::LShr
) {
2315 std::swap(Or0
, Or1
);
2316 std::swap(SV0
, SV1
);
2317 std::swap(SA0
, SA1
);
2319 assert(Or0
->getOpcode() == BinaryOperator::Shl
&&
2320 Or1
->getOpcode() == BinaryOperator::LShr
&&
2321 "Illegal or(shift,shift) pair");
2323 // Check the shift amounts to see if they are an opposite pair.
2325 if (match(SA1
, m_OneUse(m_Sub(m_SpecificInt(Width
), m_Specific(SA0
)))))
2327 else if (match(SA0
, m_OneUse(m_Sub(m_SpecificInt(Width
), m_Specific(SA1
)))))
2332 // We should now have this pattern:
2333 // select ?, TVal, (or (shl SV0, SA0), (lshr SV1, SA1))
2334 // The false value of the select must be a funnel-shift of the true value:
2335 // IsFShl -> TVal must be SV0 else TVal must be SV1.
2336 bool IsFshl
= (ShAmt
== SA0
);
2337 Value
*TVal
= Sel
.getTrueValue();
2338 if ((IsFshl
&& TVal
!= SV0
) || (!IsFshl
&& TVal
!= SV1
))
2341 // Finally, see if the select is filtering out a shift-by-zero.
2342 Value
*Cond
= Sel
.getCondition();
2343 ICmpInst::Predicate Pred
;
2344 if (!match(Cond
, m_OneUse(m_ICmp(Pred
, m_Specific(ShAmt
), m_ZeroInt()))) ||
2345 Pred
!= ICmpInst::ICMP_EQ
)
2348 // If this is not a rotate then the select was blocking poison from the
2349 // 'shift-by-zero' non-TVal, but a funnel shift won't - so freeze it.
2351 if (IsFshl
&& !llvm::isGuaranteedNotToBePoison(SV1
))
2352 SV1
= Builder
.CreateFreeze(SV1
);
2353 else if (!IsFshl
&& !llvm::isGuaranteedNotToBePoison(SV0
))
2354 SV0
= Builder
.CreateFreeze(SV0
);
2357 // This is a funnel/rotate that avoids shift-by-bitwidth UB in a suboptimal way.
2358 // Convert to funnel shift intrinsic.
2359 Intrinsic::ID IID
= IsFshl
? Intrinsic::fshl
: Intrinsic::fshr
;
2360 Function
*F
= Intrinsic::getDeclaration(Sel
.getModule(), IID
, Sel
.getType());
2361 ShAmt
= Builder
.CreateZExt(ShAmt
, Sel
.getType());
2362 return CallInst::Create(F
, { SV0
, SV1
, ShAmt
});
2365 static Instruction
*foldSelectToCopysign(SelectInst
&Sel
,
2366 InstCombiner::BuilderTy
&Builder
) {
2367 Value
*Cond
= Sel
.getCondition();
2368 Value
*TVal
= Sel
.getTrueValue();
2369 Value
*FVal
= Sel
.getFalseValue();
2370 Type
*SelType
= Sel
.getType();
2372 if (ICmpInst::makeCmpResultType(TVal
->getType()) != Cond
->getType())
2375 // Match select ?, TC, FC where the constants are equal but negated.
2376 // TODO: Generalize to handle a negated variable operand?
2377 const APFloat
*TC
, *FC
;
2378 if (!match(TVal
, m_APFloatAllowUndef(TC
)) ||
2379 !match(FVal
, m_APFloatAllowUndef(FC
)) ||
2380 !abs(*TC
).bitwiseIsEqual(abs(*FC
)))
2383 assert(TC
!= FC
&& "Expected equal select arms to simplify");
2387 bool IsTrueIfSignSet
;
2388 ICmpInst::Predicate Pred
;
2389 if (!match(Cond
, m_OneUse(m_ICmp(Pred
, m_BitCast(m_Value(X
)), m_APInt(C
)))) ||
2390 !InstCombiner::isSignBitCheck(Pred
, *C
, IsTrueIfSignSet
) ||
2391 X
->getType() != SelType
)
2394 // If needed, negate the value that will be the sign argument of the copysign:
2395 // (bitcast X) < 0 ? -TC : TC --> copysign(TC, X)
2396 // (bitcast X) < 0 ? TC : -TC --> copysign(TC, -X)
2397 // (bitcast X) >= 0 ? -TC : TC --> copysign(TC, -X)
2398 // (bitcast X) >= 0 ? TC : -TC --> copysign(TC, X)
2399 // Note: FMF from the select can not be propagated to the new instructions.
2400 if (IsTrueIfSignSet
^ TC
->isNegative())
2401 X
= Builder
.CreateFNeg(X
);
2403 // Canonicalize the magnitude argument as the positive constant since we do
2404 // not care about its sign.
2405 Value
*MagArg
= ConstantFP::get(SelType
, abs(*TC
));
2406 Function
*F
= Intrinsic::getDeclaration(Sel
.getModule(), Intrinsic::copysign
,
2408 return CallInst::Create(F
, { MagArg
, X
});
2411 Instruction
*InstCombinerImpl::foldVectorSelect(SelectInst
&Sel
) {
2412 if (!isa
<VectorType
>(Sel
.getType()))
2415 Value
*Cond
= Sel
.getCondition();
2416 Value
*TVal
= Sel
.getTrueValue();
2417 Value
*FVal
= Sel
.getFalseValue();
2420 if (match(Cond
, m_VecReverse(m_Value(C
)))) {
2421 auto createSelReverse
= [&](Value
*C
, Value
*X
, Value
*Y
) {
2422 Value
*V
= Builder
.CreateSelect(C
, X
, Y
, Sel
.getName(), &Sel
);
2423 if (auto *I
= dyn_cast
<Instruction
>(V
))
2424 I
->copyIRFlags(&Sel
);
2425 Module
*M
= Sel
.getModule();
2426 Function
*F
= Intrinsic::getDeclaration(
2427 M
, Intrinsic::experimental_vector_reverse
, V
->getType());
2428 return CallInst::Create(F
, V
);
2431 if (match(TVal
, m_VecReverse(m_Value(X
)))) {
2432 // select rev(C), rev(X), rev(Y) --> rev(select C, X, Y)
2433 if (match(FVal
, m_VecReverse(m_Value(Y
))) &&
2434 (Cond
->hasOneUse() || TVal
->hasOneUse() || FVal
->hasOneUse()))
2435 return createSelReverse(C
, X
, Y
);
2437 // select rev(C), rev(X), FValSplat --> rev(select C, X, FValSplat)
2438 if ((Cond
->hasOneUse() || TVal
->hasOneUse()) && isSplatValue(FVal
))
2439 return createSelReverse(C
, X
, FVal
);
2441 // select rev(C), TValSplat, rev(Y) --> rev(select C, TValSplat, Y)
2442 else if (isSplatValue(TVal
) && match(FVal
, m_VecReverse(m_Value(Y
))) &&
2443 (Cond
->hasOneUse() || FVal
->hasOneUse()))
2444 return createSelReverse(C
, TVal
, Y
);
2447 auto *VecTy
= dyn_cast
<FixedVectorType
>(Sel
.getType());
2451 unsigned NumElts
= VecTy
->getNumElements();
2452 APInt
PoisonElts(NumElts
, 0);
2453 APInt
AllOnesEltMask(APInt::getAllOnes(NumElts
));
2454 if (Value
*V
= SimplifyDemandedVectorElts(&Sel
, AllOnesEltMask
, PoisonElts
)) {
2456 return replaceInstUsesWith(Sel
, V
);
2460 // A select of a "select shuffle" with a common operand can be rearranged
2461 // to select followed by "select shuffle". Because of poison, this only works
2462 // in the case of a shuffle with no undefined mask elements.
2464 if (match(TVal
, m_OneUse(m_Shuffle(m_Value(X
), m_Value(Y
), m_Mask(Mask
)))) &&
2465 !is_contained(Mask
, PoisonMaskElem
) &&
2466 cast
<ShuffleVectorInst
>(TVal
)->isSelect()) {
2468 // select Cond, (shuf_sel X, Y), X --> shuf_sel X, (select Cond, Y, X)
2469 Value
*NewSel
= Builder
.CreateSelect(Cond
, Y
, X
, "sel", &Sel
);
2470 return new ShuffleVectorInst(X
, NewSel
, Mask
);
2473 // select Cond, (shuf_sel X, Y), Y --> shuf_sel (select Cond, X, Y), Y
2474 Value
*NewSel
= Builder
.CreateSelect(Cond
, X
, Y
, "sel", &Sel
);
2475 return new ShuffleVectorInst(NewSel
, Y
, Mask
);
2478 if (match(FVal
, m_OneUse(m_Shuffle(m_Value(X
), m_Value(Y
), m_Mask(Mask
)))) &&
2479 !is_contained(Mask
, PoisonMaskElem
) &&
2480 cast
<ShuffleVectorInst
>(FVal
)->isSelect()) {
2482 // select Cond, X, (shuf_sel X, Y) --> shuf_sel X, (select Cond, X, Y)
2483 Value
*NewSel
= Builder
.CreateSelect(Cond
, X
, Y
, "sel", &Sel
);
2484 return new ShuffleVectorInst(X
, NewSel
, Mask
);
2487 // select Cond, Y, (shuf_sel X, Y) --> shuf_sel (select Cond, Y, X), Y
2488 Value
*NewSel
= Builder
.CreateSelect(Cond
, Y
, X
, "sel", &Sel
);
2489 return new ShuffleVectorInst(NewSel
, Y
, Mask
);
2496 static Instruction
*foldSelectToPhiImpl(SelectInst
&Sel
, BasicBlock
*BB
,
2497 const DominatorTree
&DT
,
2498 InstCombiner::BuilderTy
&Builder
) {
2499 // Find the block's immediate dominator that ends with a conditional branch
2500 // that matches select's condition (maybe inverted).
2501 auto *IDomNode
= DT
[BB
]->getIDom();
2504 BasicBlock
*IDom
= IDomNode
->getBlock();
2506 Value
*Cond
= Sel
.getCondition();
2507 Value
*IfTrue
, *IfFalse
;
2508 BasicBlock
*TrueSucc
, *FalseSucc
;
2509 if (match(IDom
->getTerminator(),
2510 m_Br(m_Specific(Cond
), m_BasicBlock(TrueSucc
),
2511 m_BasicBlock(FalseSucc
)))) {
2512 IfTrue
= Sel
.getTrueValue();
2513 IfFalse
= Sel
.getFalseValue();
2514 } else if (match(IDom
->getTerminator(),
2515 m_Br(m_Not(m_Specific(Cond
)), m_BasicBlock(TrueSucc
),
2516 m_BasicBlock(FalseSucc
)))) {
2517 IfTrue
= Sel
.getFalseValue();
2518 IfFalse
= Sel
.getTrueValue();
2522 // Make sure the branches are actually different.
2523 if (TrueSucc
== FalseSucc
)
2526 // We want to replace select %cond, %a, %b with a phi that takes value %a
2527 // for all incoming edges that are dominated by condition `%cond == true`,
2528 // and value %b for edges dominated by condition `%cond == false`. If %a
2529 // or %b are also phis from the same basic block, we can go further and take
2530 // their incoming values from the corresponding blocks.
2531 BasicBlockEdge
TrueEdge(IDom
, TrueSucc
);
2532 BasicBlockEdge
FalseEdge(IDom
, FalseSucc
);
2533 DenseMap
<BasicBlock
*, Value
*> Inputs
;
2534 for (auto *Pred
: predecessors(BB
)) {
2535 // Check implication.
2536 BasicBlockEdge
Incoming(Pred
, BB
);
2537 if (DT
.dominates(TrueEdge
, Incoming
))
2538 Inputs
[Pred
] = IfTrue
->DoPHITranslation(BB
, Pred
);
2539 else if (DT
.dominates(FalseEdge
, Incoming
))
2540 Inputs
[Pred
] = IfFalse
->DoPHITranslation(BB
, Pred
);
2543 // Check availability.
2544 if (auto *Insn
= dyn_cast
<Instruction
>(Inputs
[Pred
]))
2545 if (!DT
.dominates(Insn
, Pred
->getTerminator()))
2549 Builder
.SetInsertPoint(BB
, BB
->begin());
2550 auto *PN
= Builder
.CreatePHI(Sel
.getType(), Inputs
.size());
2551 for (auto *Pred
: predecessors(BB
))
2552 PN
->addIncoming(Inputs
[Pred
], Pred
);
2557 static Instruction
*foldSelectToPhi(SelectInst
&Sel
, const DominatorTree
&DT
,
2558 InstCombiner::BuilderTy
&Builder
) {
2559 // Try to replace this select with Phi in one of these blocks.
2560 SmallSetVector
<BasicBlock
*, 4> CandidateBlocks
;
2561 CandidateBlocks
.insert(Sel
.getParent());
2562 for (Value
*V
: Sel
.operands())
2563 if (auto *I
= dyn_cast
<Instruction
>(V
))
2564 CandidateBlocks
.insert(I
->getParent());
2566 for (BasicBlock
*BB
: CandidateBlocks
)
2567 if (auto *PN
= foldSelectToPhiImpl(Sel
, BB
, DT
, Builder
))
2572 /// Tries to reduce a pattern that arises when calculating the remainder of the
2573 /// Euclidean division. When the divisor is a power of two and is guaranteed not
2574 /// to be negative, a signed remainder can be folded with a bitwise and.
2576 /// (x % n) < 0 ? (x % n) + n : (x % n)
2578 static Instruction
*foldSelectWithSRem(SelectInst
&SI
, InstCombinerImpl
&IC
,
2579 IRBuilderBase
&Builder
) {
2580 Value
*CondVal
= SI
.getCondition();
2581 Value
*TrueVal
= SI
.getTrueValue();
2582 Value
*FalseVal
= SI
.getFalseValue();
2584 ICmpInst::Predicate Pred
;
2585 Value
*Op
, *RemRes
, *Remainder
;
2587 bool TrueIfSigned
= false;
2589 if (!(match(CondVal
, m_ICmp(Pred
, m_Value(RemRes
), m_APInt(C
))) &&
2590 IC
.isSignBitCheck(Pred
, *C
, TrueIfSigned
)))
2593 // If the sign bit is not set, we have a SGE/SGT comparison, and the operands
2594 // of the select are inverted.
2596 std::swap(TrueVal
, FalseVal
);
2598 auto FoldToBitwiseAnd
= [&](Value
*Remainder
) -> Instruction
* {
2599 Value
*Add
= Builder
.CreateAdd(
2600 Remainder
, Constant::getAllOnesValue(RemRes
->getType()));
2601 return BinaryOperator::CreateAnd(Op
, Add
);
2604 // Match the general case:
2605 // %rem = srem i32 %x, %n
2606 // %cnd = icmp slt i32 %rem, 0
2607 // %add = add i32 %rem, %n
2608 // %sel = select i1 %cnd, i32 %add, i32 %rem
2609 if (match(TrueVal
, m_Add(m_Value(RemRes
), m_Value(Remainder
))) &&
2610 match(RemRes
, m_SRem(m_Value(Op
), m_Specific(Remainder
))) &&
2611 IC
.isKnownToBeAPowerOfTwo(Remainder
, /*OrZero*/ true) &&
2613 return FoldToBitwiseAnd(Remainder
);
2615 // Match the case where the one arm has been replaced by constant 1:
2616 // %rem = srem i32 %n, 2
2617 // %cnd = icmp slt i32 %rem, 0
2618 // %sel = select i1 %cnd, i32 1, i32 %rem
2619 if (match(TrueVal
, m_One()) &&
2620 match(RemRes
, m_SRem(m_Value(Op
), m_SpecificInt(2))) &&
2622 return FoldToBitwiseAnd(ConstantInt::get(RemRes
->getType(), 2));
2627 static Value
*foldSelectWithFrozenICmp(SelectInst
&Sel
, InstCombiner::BuilderTy
&Builder
) {
2628 FreezeInst
*FI
= dyn_cast
<FreezeInst
>(Sel
.getCondition());
2632 Value
*Cond
= FI
->getOperand(0);
2633 Value
*TrueVal
= Sel
.getTrueValue(), *FalseVal
= Sel
.getFalseValue();
2635 // select (freeze(x == y)), x, y --> y
2636 // select (freeze(x != y)), x, y --> x
2637 // The freeze should be only used by this select. Otherwise, remaining uses of
2638 // the freeze can observe a contradictory value.
2639 // c = freeze(x == y) ; Let's assume that y = poison & x = 42; c is 0 or 1
2640 // a = select c, x, y ;
2641 // f(a, c) ; f(poison, 1) cannot happen, but if a is folded
2642 // ; to y, this can happen.
2643 CmpInst::Predicate Pred
;
2644 if (FI
->hasOneUse() &&
2645 match(Cond
, m_c_ICmp(Pred
, m_Specific(TrueVal
), m_Specific(FalseVal
))) &&
2646 (Pred
== ICmpInst::ICMP_EQ
|| Pred
== ICmpInst::ICMP_NE
)) {
2647 return Pred
== ICmpInst::ICMP_EQ
? FalseVal
: TrueVal
;
2653 Instruction
*InstCombinerImpl::foldAndOrOfSelectUsingImpliedCond(Value
*Op
,
2656 Value
*CondVal
= SI
.getCondition();
2657 Value
*A
= SI
.getTrueValue();
2658 Value
*B
= SI
.getFalseValue();
2660 assert(Op
->getType()->isIntOrIntVectorTy(1) &&
2661 "Op must be either i1 or vector of i1.");
2663 std::optional
<bool> Res
= isImpliedCondition(Op
, CondVal
, DL
, IsAnd
);
2667 Value
*Zero
= Constant::getNullValue(A
->getType());
2668 Value
*One
= Constant::getAllOnesValue(A
->getType());
2672 // select op, (select cond, A, B), false => select op, A, false
2673 // and op, (select cond, A, B) => select op, A, false
2674 // if op = true implies condval = true.
2675 return SelectInst::Create(Op
, A
, Zero
);
2677 // select op, true, (select cond, A, B) => select op, true, A
2678 // or op, (select cond, A, B) => select op, true, A
2679 // if op = false implies condval = true.
2680 return SelectInst::Create(Op
, One
, A
);
2683 // select op, (select cond, A, B), false => select op, B, false
2684 // and op, (select cond, A, B) => select op, B, false
2685 // if op = true implies condval = false.
2686 return SelectInst::Create(Op
, B
, Zero
);
2688 // select op, true, (select cond, A, B) => select op, true, B
2689 // or op, (select cond, A, B) => select op, true, B
2690 // if op = false implies condval = false.
2691 return SelectInst::Create(Op
, One
, B
);
2695 // Canonicalize select with fcmp to fabs(). -0.0 makes this tricky. We need
2696 // fast-math-flags (nsz) or fsub with +0.0 (not fneg) for this to work.
2697 static Instruction
*foldSelectWithFCmpToFabs(SelectInst
&SI
,
2698 InstCombinerImpl
&IC
) {
2699 Value
*CondVal
= SI
.getCondition();
2701 bool ChangedFMF
= false;
2702 for (bool Swap
: {false, true}) {
2703 Value
*TrueVal
= SI
.getTrueValue();
2704 Value
*X
= SI
.getFalseValue();
2705 CmpInst::Predicate Pred
;
2708 std::swap(TrueVal
, X
);
2710 if (!match(CondVal
, m_FCmp(Pred
, m_Specific(X
), m_AnyZeroFP())))
2713 // fold (X <= +/-0.0) ? (0.0 - X) : X to fabs(X), when 'Swap' is false
2714 // fold (X > +/-0.0) ? X : (0.0 - X) to fabs(X), when 'Swap' is true
2715 if (match(TrueVal
, m_FSub(m_PosZeroFP(), m_Specific(X
)))) {
2716 if (!Swap
&& (Pred
== FCmpInst::FCMP_OLE
|| Pred
== FCmpInst::FCMP_ULE
)) {
2717 Value
*Fabs
= IC
.Builder
.CreateUnaryIntrinsic(Intrinsic::fabs
, X
, &SI
);
2718 return IC
.replaceInstUsesWith(SI
, Fabs
);
2720 if (Swap
&& (Pred
== FCmpInst::FCMP_OGT
|| Pred
== FCmpInst::FCMP_UGT
)) {
2721 Value
*Fabs
= IC
.Builder
.CreateUnaryIntrinsic(Intrinsic::fabs
, X
, &SI
);
2722 return IC
.replaceInstUsesWith(SI
, Fabs
);
2726 if (!match(TrueVal
, m_FNeg(m_Specific(X
))))
2729 // Forward-propagate nnan and ninf from the fneg to the select.
2730 // If all inputs are not those values, then the select is not either.
2731 // Note: nsz is defined differently, so it may not be correct to propagate.
2732 FastMathFlags FMF
= cast
<FPMathOperator
>(TrueVal
)->getFastMathFlags();
2733 if (FMF
.noNaNs() && !SI
.hasNoNaNs()) {
2734 SI
.setHasNoNaNs(true);
2737 if (FMF
.noInfs() && !SI
.hasNoInfs()) {
2738 SI
.setHasNoInfs(true);
2742 // With nsz, when 'Swap' is false:
2743 // fold (X < +/-0.0) ? -X : X or (X <= +/-0.0) ? -X : X to fabs(X)
2744 // fold (X > +/-0.0) ? -X : X or (X >= +/-0.0) ? -X : X to -fabs(x)
2745 // when 'Swap' is true:
2746 // fold (X > +/-0.0) ? X : -X or (X >= +/-0.0) ? X : -X to fabs(X)
2747 // fold (X < +/-0.0) ? X : -X or (X <= +/-0.0) ? X : -X to -fabs(X)
2749 // Note: We require "nnan" for this fold because fcmp ignores the signbit
2750 // of NAN, but IEEE-754 specifies the signbit of NAN values with
2751 // fneg/fabs operations.
2752 if (!SI
.hasNoSignedZeros() || !SI
.hasNoNaNs())
2756 Pred
= FCmpInst::getSwappedPredicate(Pred
);
2758 bool IsLTOrLE
= Pred
== FCmpInst::FCMP_OLT
|| Pred
== FCmpInst::FCMP_OLE
||
2759 Pred
== FCmpInst::FCMP_ULT
|| Pred
== FCmpInst::FCMP_ULE
;
2760 bool IsGTOrGE
= Pred
== FCmpInst::FCMP_OGT
|| Pred
== FCmpInst::FCMP_OGE
||
2761 Pred
== FCmpInst::FCMP_UGT
|| Pred
== FCmpInst::FCMP_UGE
;
2764 Value
*Fabs
= IC
.Builder
.CreateUnaryIntrinsic(Intrinsic::fabs
, X
, &SI
);
2765 return IC
.replaceInstUsesWith(SI
, Fabs
);
2768 Value
*Fabs
= IC
.Builder
.CreateUnaryIntrinsic(Intrinsic::fabs
, X
, &SI
);
2769 Instruction
*NewFNeg
= UnaryOperator::CreateFNeg(Fabs
);
2770 NewFNeg
->setFastMathFlags(SI
.getFastMathFlags());
2775 return ChangedFMF
? &SI
: nullptr;
2778 // Match the following IR pattern:
2779 // %x.lowbits = and i8 %x, %lowbitmask
2780 // %x.lowbits.are.zero = icmp eq i8 %x.lowbits, 0
2781 // %x.biased = add i8 %x, %bias
2782 // %x.biased.highbits = and i8 %x.biased, %highbitmask
2783 // %x.roundedup = select i1 %x.lowbits.are.zero, i8 %x, i8 %x.biased.highbits
2785 // %alignment = add i8 %lowbitmask, 1
2786 // Iff 1. an %alignment is a power-of-two (aka, %lowbitmask is a low bit mask)
2787 // and 2. %bias is equal to either %lowbitmask or %alignment,
2788 // and 3. %highbitmask is equal to ~%lowbitmask (aka, to -%alignment)
2789 // then this pattern can be transformed into:
2790 // %x.offset = add i8 %x, %lowbitmask
2791 // %x.roundedup = and i8 %x.offset, %highbitmask
2793 foldRoundUpIntegerWithPow2Alignment(SelectInst
&SI
,
2794 InstCombiner::BuilderTy
&Builder
) {
2795 Value
*Cond
= SI
.getCondition();
2796 Value
*X
= SI
.getTrueValue();
2797 Value
*XBiasedHighBits
= SI
.getFalseValue();
2799 ICmpInst::Predicate Pred
;
2801 if (!match(Cond
, m_ICmp(Pred
, m_Value(XLowBits
), m_ZeroInt())) ||
2802 !ICmpInst::isEquality(Pred
))
2805 if (Pred
== ICmpInst::Predicate::ICMP_NE
)
2806 std::swap(X
, XBiasedHighBits
);
2808 // FIXME: we could support non non-splats here.
2810 const APInt
*LowBitMaskCst
;
2811 if (!match(XLowBits
, m_And(m_Specific(X
), m_APIntAllowUndef(LowBitMaskCst
))))
2814 // Match even if the AND and ADD are swapped.
2815 const APInt
*BiasCst
, *HighBitMaskCst
;
2816 if (!match(XBiasedHighBits
,
2817 m_And(m_Add(m_Specific(X
), m_APIntAllowUndef(BiasCst
)),
2818 m_APIntAllowUndef(HighBitMaskCst
))) &&
2819 !match(XBiasedHighBits
,
2820 m_Add(m_And(m_Specific(X
), m_APIntAllowUndef(HighBitMaskCst
)),
2821 m_APIntAllowUndef(BiasCst
))))
2824 if (!LowBitMaskCst
->isMask())
2827 APInt InvertedLowBitMaskCst
= ~*LowBitMaskCst
;
2828 if (InvertedLowBitMaskCst
!= *HighBitMaskCst
)
2831 APInt AlignmentCst
= *LowBitMaskCst
+ 1;
2833 if (*BiasCst
!= AlignmentCst
&& *BiasCst
!= *LowBitMaskCst
)
2836 if (!XBiasedHighBits
->hasOneUse()) {
2837 if (*BiasCst
== *LowBitMaskCst
)
2838 return XBiasedHighBits
;
2842 // FIXME: could we preserve undef's here?
2843 Type
*Ty
= X
->getType();
2844 Value
*XOffset
= Builder
.CreateAdd(X
, ConstantInt::get(Ty
, *LowBitMaskCst
),
2845 X
->getName() + ".biased");
2846 Value
*R
= Builder
.CreateAnd(XOffset
, ConstantInt::get(Ty
, *HighBitMaskCst
));
2852 struct DecomposedSelect
{
2853 Value
*Cond
= nullptr;
2854 Value
*TrueVal
= nullptr;
2855 Value
*FalseVal
= nullptr;
2859 /// Look for patterns like
2860 /// %outer.cond = select i1 %inner.cond, i1 %alt.cond, i1 false
2861 /// %inner.sel = select i1 %inner.cond, i8 %inner.sel.t, i8 %inner.sel.f
2862 /// %outer.sel = select i1 %outer.cond, i8 %outer.sel.t, i8 %inner.sel
2863 /// and rewrite it as
2864 /// %inner.sel = select i1 %cond.alternative, i8 %sel.outer.t, i8 %sel.inner.t
2865 /// %sel.outer = select i1 %cond.inner, i8 %inner.sel, i8 %sel.inner.f
2866 static Instruction
*foldNestedSelects(SelectInst
&OuterSelVal
,
2867 InstCombiner::BuilderTy
&Builder
) {
2868 // We must start with a `select`.
2869 DecomposedSelect OuterSel
;
2871 m_Select(m_Value(OuterSel
.Cond
), m_Value(OuterSel
.TrueVal
),
2872 m_Value(OuterSel
.FalseVal
)));
2874 // Canonicalize inversion of the outermost `select`'s condition.
2875 if (match(OuterSel
.Cond
, m_Not(m_Value(OuterSel
.Cond
))))
2876 std::swap(OuterSel
.TrueVal
, OuterSel
.FalseVal
);
2878 // The condition of the outermost select must be an `and`/`or`.
2879 if (!match(OuterSel
.Cond
, m_c_LogicalOp(m_Value(), m_Value())))
2882 // Depending on the logical op, inner select might be in different hand.
2883 bool IsAndVariant
= match(OuterSel
.Cond
, m_LogicalAnd());
2884 Value
*InnerSelVal
= IsAndVariant
? OuterSel
.FalseVal
: OuterSel
.TrueVal
;
2886 // Profitability check - avoid increasing instruction count.
2887 if (none_of(ArrayRef
<Value
*>({OuterSelVal
.getCondition(), InnerSelVal
}),
2888 [](Value
*V
) { return V
->hasOneUse(); }))
2891 // The appropriate hand of the outermost `select` must be a select itself.
2892 DecomposedSelect InnerSel
;
2893 if (!match(InnerSelVal
,
2894 m_Select(m_Value(InnerSel
.Cond
), m_Value(InnerSel
.TrueVal
),
2895 m_Value(InnerSel
.FalseVal
))))
2898 // Canonicalize inversion of the innermost `select`'s condition.
2899 if (match(InnerSel
.Cond
, m_Not(m_Value(InnerSel
.Cond
))))
2900 std::swap(InnerSel
.TrueVal
, InnerSel
.FalseVal
);
2902 Value
*AltCond
= nullptr;
2903 auto matchOuterCond
= [OuterSel
, IsAndVariant
, &AltCond
](auto m_InnerCond
) {
2904 // An unsimplified select condition can match both LogicalAnd and LogicalOr
2905 // (select true, true, false). Since below we assume that LogicalAnd implies
2906 // InnerSel match the FVal and vice versa for LogicalOr, we can't match the
2907 // alternative pattern here.
2908 return IsAndVariant
? match(OuterSel
.Cond
,
2909 m_c_LogicalAnd(m_InnerCond
, m_Value(AltCond
)))
2910 : match(OuterSel
.Cond
,
2911 m_c_LogicalOr(m_InnerCond
, m_Value(AltCond
)));
2914 // Finally, match the condition that was driving the outermost `select`,
2915 // it should be a logical operation between the condition that was driving
2916 // the innermost `select` (after accounting for the possible inversions
2917 // of the condition), and some other condition.
2918 if (matchOuterCond(m_Specific(InnerSel
.Cond
))) {
2920 } else if (Value
* NotInnerCond
; matchOuterCond(m_CombineAnd(
2921 m_Not(m_Specific(InnerSel
.Cond
)), m_Value(NotInnerCond
)))) {
2923 std::swap(InnerSel
.TrueVal
, InnerSel
.FalseVal
);
2924 InnerSel
.Cond
= NotInnerCond
;
2925 } else // Not the pattern we were looking for.
2928 Value
*SelInner
= Builder
.CreateSelect(
2929 AltCond
, IsAndVariant
? OuterSel
.TrueVal
: InnerSel
.FalseVal
,
2930 IsAndVariant
? InnerSel
.TrueVal
: OuterSel
.FalseVal
);
2931 SelInner
->takeName(InnerSelVal
);
2932 return SelectInst::Create(InnerSel
.Cond
,
2933 IsAndVariant
? SelInner
: InnerSel
.TrueVal
,
2934 !IsAndVariant
? SelInner
: InnerSel
.FalseVal
);
2937 Instruction
*InstCombinerImpl::foldSelectOfBools(SelectInst
&SI
) {
2938 Value
*CondVal
= SI
.getCondition();
2939 Value
*TrueVal
= SI
.getTrueValue();
2940 Value
*FalseVal
= SI
.getFalseValue();
2941 Type
*SelType
= SI
.getType();
2943 // Avoid potential infinite loops by checking for non-constant condition.
2944 // TODO: Can we assert instead by improving canonicalizeSelectToShuffle()?
2945 // Scalar select must have simplified?
2946 if (!SelType
->isIntOrIntVectorTy(1) || isa
<Constant
>(CondVal
) ||
2947 TrueVal
->getType() != CondVal
->getType())
2950 auto *One
= ConstantInt::getTrue(SelType
);
2951 auto *Zero
= ConstantInt::getFalse(SelType
);
2952 Value
*A
, *B
, *C
, *D
;
2954 // Folding select to and/or i1 isn't poison safe in general. impliesPoison
2955 // checks whether folding it does not convert a well-defined value into
2957 if (match(TrueVal
, m_One())) {
2958 if (impliesPoison(FalseVal
, CondVal
)) {
2959 // Change: A = select B, true, C --> A = or B, C
2960 return BinaryOperator::CreateOr(CondVal
, FalseVal
);
2963 if (auto *LHS
= dyn_cast
<FCmpInst
>(CondVal
))
2964 if (auto *RHS
= dyn_cast
<FCmpInst
>(FalseVal
))
2965 if (Value
*V
= foldLogicOfFCmps(LHS
, RHS
, /*IsAnd*/ false,
2966 /*IsSelectLogical*/ true))
2967 return replaceInstUsesWith(SI
, V
);
2969 // (A && B) || (C && B) --> (A || C) && B
2970 if (match(CondVal
, m_LogicalAnd(m_Value(A
), m_Value(B
))) &&
2971 match(FalseVal
, m_LogicalAnd(m_Value(C
), m_Value(D
))) &&
2972 (CondVal
->hasOneUse() || FalseVal
->hasOneUse())) {
2973 bool CondLogicAnd
= isa
<SelectInst
>(CondVal
);
2974 bool FalseLogicAnd
= isa
<SelectInst
>(FalseVal
);
2975 auto AndFactorization
= [&](Value
*Common
, Value
*InnerCond
,
2977 bool SelFirst
= false) -> Instruction
* {
2978 Value
*InnerSel
= Builder
.CreateSelect(InnerCond
, One
, InnerVal
);
2980 std::swap(Common
, InnerSel
);
2981 if (FalseLogicAnd
|| (CondLogicAnd
&& Common
== A
))
2982 return SelectInst::Create(Common
, InnerSel
, Zero
);
2984 return BinaryOperator::CreateAnd(Common
, InnerSel
);
2988 return AndFactorization(A
, B
, D
);
2990 return AndFactorization(A
, B
, C
);
2992 return AndFactorization(B
, A
, D
);
2994 return AndFactorization(B
, A
, C
, CondLogicAnd
&& FalseLogicAnd
);
2998 if (match(FalseVal
, m_Zero())) {
2999 if (impliesPoison(TrueVal
, CondVal
)) {
3000 // Change: A = select B, C, false --> A = and B, C
3001 return BinaryOperator::CreateAnd(CondVal
, TrueVal
);
3004 if (auto *LHS
= dyn_cast
<FCmpInst
>(CondVal
))
3005 if (auto *RHS
= dyn_cast
<FCmpInst
>(TrueVal
))
3006 if (Value
*V
= foldLogicOfFCmps(LHS
, RHS
, /*IsAnd*/ true,
3007 /*IsSelectLogical*/ true))
3008 return replaceInstUsesWith(SI
, V
);
3010 // (A || B) && (C || B) --> (A && C) || B
3011 if (match(CondVal
, m_LogicalOr(m_Value(A
), m_Value(B
))) &&
3012 match(TrueVal
, m_LogicalOr(m_Value(C
), m_Value(D
))) &&
3013 (CondVal
->hasOneUse() || TrueVal
->hasOneUse())) {
3014 bool CondLogicOr
= isa
<SelectInst
>(CondVal
);
3015 bool TrueLogicOr
= isa
<SelectInst
>(TrueVal
);
3016 auto OrFactorization
= [&](Value
*Common
, Value
*InnerCond
,
3018 bool SelFirst
= false) -> Instruction
* {
3019 Value
*InnerSel
= Builder
.CreateSelect(InnerCond
, InnerVal
, Zero
);
3021 std::swap(Common
, InnerSel
);
3022 if (TrueLogicOr
|| (CondLogicOr
&& Common
== A
))
3023 return SelectInst::Create(Common
, One
, InnerSel
);
3025 return BinaryOperator::CreateOr(Common
, InnerSel
);
3029 return OrFactorization(A
, B
, D
);
3031 return OrFactorization(A
, B
, C
);
3033 return OrFactorization(B
, A
, D
);
3035 return OrFactorization(B
, A
, C
, CondLogicOr
&& TrueLogicOr
);
3039 // We match the "full" 0 or 1 constant here to avoid a potential infinite
3040 // loop with vectors that may have undefined/poison elements.
3041 // select a, false, b -> select !a, b, false
3042 if (match(TrueVal
, m_Specific(Zero
))) {
3043 Value
*NotCond
= Builder
.CreateNot(CondVal
, "not." + CondVal
->getName());
3044 return SelectInst::Create(NotCond
, FalseVal
, Zero
);
3046 // select a, b, true -> select !a, true, b
3047 if (match(FalseVal
, m_Specific(One
))) {
3048 Value
*NotCond
= Builder
.CreateNot(CondVal
, "not." + CondVal
->getName());
3049 return SelectInst::Create(NotCond
, One
, TrueVal
);
3052 // DeMorgan in select form: !a && !b --> !(a || b)
3053 // select !a, !b, false --> not (select a, true, b)
3054 if (match(&SI
, m_LogicalAnd(m_Not(m_Value(A
)), m_Not(m_Value(B
)))) &&
3055 (CondVal
->hasOneUse() || TrueVal
->hasOneUse()) &&
3056 !match(A
, m_ConstantExpr()) && !match(B
, m_ConstantExpr()))
3057 return BinaryOperator::CreateNot(Builder
.CreateSelect(A
, One
, B
));
3059 // DeMorgan in select form: !a || !b --> !(a && b)
3060 // select !a, true, !b --> not (select a, b, false)
3061 if (match(&SI
, m_LogicalOr(m_Not(m_Value(A
)), m_Not(m_Value(B
)))) &&
3062 (CondVal
->hasOneUse() || FalseVal
->hasOneUse()) &&
3063 !match(A
, m_ConstantExpr()) && !match(B
, m_ConstantExpr()))
3064 return BinaryOperator::CreateNot(Builder
.CreateSelect(A
, B
, Zero
));
3066 // select (select a, true, b), true, b -> select a, true, b
3067 if (match(CondVal
, m_Select(m_Value(A
), m_One(), m_Value(B
))) &&
3068 match(TrueVal
, m_One()) && match(FalseVal
, m_Specific(B
)))
3069 return replaceOperand(SI
, 0, A
);
3070 // select (select a, b, false), b, false -> select a, b, false
3071 if (match(CondVal
, m_Select(m_Value(A
), m_Value(B
), m_Zero())) &&
3072 match(TrueVal
, m_Specific(B
)) && match(FalseVal
, m_Zero()))
3073 return replaceOperand(SI
, 0, A
);
3075 // ~(A & B) & (A | B) --> A ^ B
3076 if (match(&SI
, m_c_LogicalAnd(m_Not(m_LogicalAnd(m_Value(A
), m_Value(B
))),
3077 m_c_LogicalOr(m_Deferred(A
), m_Deferred(B
)))))
3078 return BinaryOperator::CreateXor(A
, B
);
3080 // select (~a | c), a, b -> select a, (select c, true, b), false
3082 m_OneUse(m_c_Or(m_Not(m_Specific(TrueVal
)), m_Value(C
))))) {
3083 Value
*OrV
= Builder
.CreateSelect(C
, One
, FalseVal
);
3084 return SelectInst::Create(TrueVal
, OrV
, Zero
);
3086 // select (c & b), a, b -> select b, (select ~c, true, a), false
3087 if (match(CondVal
, m_OneUse(m_c_And(m_Value(C
), m_Specific(FalseVal
))))) {
3088 if (Value
*NotC
= getFreelyInverted(C
, C
->hasOneUse(), &Builder
)) {
3089 Value
*OrV
= Builder
.CreateSelect(NotC
, One
, TrueVal
);
3090 return SelectInst::Create(FalseVal
, OrV
, Zero
);
3093 // select (a | c), a, b -> select a, true, (select ~c, b, false)
3094 if (match(CondVal
, m_OneUse(m_c_Or(m_Specific(TrueVal
), m_Value(C
))))) {
3095 if (Value
*NotC
= getFreelyInverted(C
, C
->hasOneUse(), &Builder
)) {
3096 Value
*AndV
= Builder
.CreateSelect(NotC
, FalseVal
, Zero
);
3097 return SelectInst::Create(TrueVal
, One
, AndV
);
3100 // select (c & ~b), a, b -> select b, true, (select c, a, false)
3102 m_OneUse(m_c_And(m_Value(C
), m_Not(m_Specific(FalseVal
)))))) {
3103 Value
*AndV
= Builder
.CreateSelect(C
, TrueVal
, Zero
);
3104 return SelectInst::Create(FalseVal
, One
, AndV
);
3107 if (match(FalseVal
, m_Zero()) || match(TrueVal
, m_One())) {
3109 bool IsAnd
= match(FalseVal
, m_Zero()) ? true : false;
3110 Value
*Op1
= IsAnd
? TrueVal
: FalseVal
;
3111 if (isCheckForZeroAndMulWithOverflow(CondVal
, Op1
, IsAnd
, Y
)) {
3112 auto *FI
= new FreezeInst(*Y
, (*Y
)->getName() + ".fr");
3113 InsertNewInstBefore(FI
, cast
<Instruction
>(Y
->getUser())->getIterator());
3115 return replaceInstUsesWith(SI
, Op1
);
3118 if (auto *Op1SI
= dyn_cast
<SelectInst
>(Op1
))
3119 if (auto *I
= foldAndOrOfSelectUsingImpliedCond(CondVal
, *Op1SI
,
3123 if (auto *ICmp0
= dyn_cast
<ICmpInst
>(CondVal
))
3124 if (auto *ICmp1
= dyn_cast
<ICmpInst
>(Op1
))
3125 if (auto *V
= foldAndOrOfICmps(ICmp0
, ICmp1
, SI
, IsAnd
,
3126 /* IsLogical */ true))
3127 return replaceInstUsesWith(SI
, V
);
3130 // select (a || b), c, false -> select a, c, false
3131 // select c, (a || b), false -> select c, a, false
3132 // if c implies that b is false.
3133 if (match(CondVal
, m_LogicalOr(m_Value(A
), m_Value(B
))) &&
3134 match(FalseVal
, m_Zero())) {
3135 std::optional
<bool> Res
= isImpliedCondition(TrueVal
, B
, DL
);
3136 if (Res
&& *Res
== false)
3137 return replaceOperand(SI
, 0, A
);
3139 if (match(TrueVal
, m_LogicalOr(m_Value(A
), m_Value(B
))) &&
3140 match(FalseVal
, m_Zero())) {
3141 std::optional
<bool> Res
= isImpliedCondition(CondVal
, B
, DL
);
3142 if (Res
&& *Res
== false)
3143 return replaceOperand(SI
, 1, A
);
3145 // select c, true, (a && b) -> select c, true, a
3146 // select (a && b), true, c -> select a, true, c
3147 // if c = false implies that b = true
3148 if (match(TrueVal
, m_One()) &&
3149 match(FalseVal
, m_LogicalAnd(m_Value(A
), m_Value(B
)))) {
3150 std::optional
<bool> Res
= isImpliedCondition(CondVal
, B
, DL
, false);
3151 if (Res
&& *Res
== true)
3152 return replaceOperand(SI
, 2, A
);
3154 if (match(CondVal
, m_LogicalAnd(m_Value(A
), m_Value(B
))) &&
3155 match(TrueVal
, m_One())) {
3156 std::optional
<bool> Res
= isImpliedCondition(FalseVal
, B
, DL
, false);
3157 if (Res
&& *Res
== true)
3158 return replaceOperand(SI
, 0, A
);
3161 if (match(TrueVal
, m_One())) {
3164 // (C && A) || (!C && B) --> sel C, A, B
3165 // (A && C) || (!C && B) --> sel C, A, B
3166 // (C && A) || (B && !C) --> sel C, A, B
3167 // (A && C) || (B && !C) --> sel C, A, B (may require freeze)
3168 if (match(FalseVal
, m_c_LogicalAnd(m_Not(m_Value(C
)), m_Value(B
))) &&
3169 match(CondVal
, m_c_LogicalAnd(m_Specific(C
), m_Value(A
)))) {
3170 auto *SelCond
= dyn_cast
<SelectInst
>(CondVal
);
3171 auto *SelFVal
= dyn_cast
<SelectInst
>(FalseVal
);
3172 bool MayNeedFreeze
= SelCond
&& SelFVal
&&
3173 match(SelFVal
->getTrueValue(),
3174 m_Not(m_Specific(SelCond
->getTrueValue())));
3176 C
= Builder
.CreateFreeze(C
);
3177 return SelectInst::Create(C
, A
, B
);
3180 // (!C && A) || (C && B) --> sel C, B, A
3181 // (A && !C) || (C && B) --> sel C, B, A
3182 // (!C && A) || (B && C) --> sel C, B, A
3183 // (A && !C) || (B && C) --> sel C, B, A (may require freeze)
3184 if (match(CondVal
, m_c_LogicalAnd(m_Not(m_Value(C
)), m_Value(A
))) &&
3185 match(FalseVal
, m_c_LogicalAnd(m_Specific(C
), m_Value(B
)))) {
3186 auto *SelCond
= dyn_cast
<SelectInst
>(CondVal
);
3187 auto *SelFVal
= dyn_cast
<SelectInst
>(FalseVal
);
3188 bool MayNeedFreeze
= SelCond
&& SelFVal
&&
3189 match(SelCond
->getTrueValue(),
3190 m_Not(m_Specific(SelFVal
->getTrueValue())));
3192 C
= Builder
.CreateFreeze(C
);
3193 return SelectInst::Create(C
, B
, A
);
3200 // Return true if we can safely remove the select instruction for std::bit_ceil
3202 static bool isSafeToRemoveBitCeilSelect(ICmpInst::Predicate Pred
, Value
*Cond0
,
3203 const APInt
*Cond1
, Value
*CtlzOp
,
3204 unsigned BitWidth
) {
3205 // The challenge in recognizing std::bit_ceil(X) is that the operand is used
3206 // for the CTLZ proper and select condition, each possibly with some
3207 // operation like add and sub.
3209 // Our aim is to make sure that -ctlz & (BitWidth - 1) == 0 even when the
3210 // select instruction would select 1, which allows us to get rid of the select
3213 // To see if we can do so, we do some symbolic execution with ConstantRange.
3214 // Specifically, we compute the range of values that Cond0 could take when
3215 // Cond == false. Then we successively transform the range until we obtain
3216 // the range of values that CtlzOp could take.
3218 // Conceptually, we follow the def-use chain backward from Cond0 while
3219 // transforming the range for Cond0 until we meet the common ancestor of Cond0
3220 // and CtlzOp. Then we follow the def-use chain forward until we obtain the
3221 // range for CtlzOp. That said, we only follow at most one ancestor from
3222 // Cond0. Likewise, we only follow at most one ancestor from CtrlOp.
3224 ConstantRange CR
= ConstantRange::makeExactICmpRegion(
3225 CmpInst::getInversePredicate(Pred
), *Cond1
);
3227 // Match the operation that's used to compute CtlzOp from CommonAncestor. If
3228 // CtlzOp == CommonAncestor, return true as no operation is needed. If a
3229 // match is found, execute the operation on CR, update CR, and return true.
3230 // Otherwise, return false.
3231 auto MatchForward
= [&](Value
*CommonAncestor
) {
3232 const APInt
*C
= nullptr;
3233 if (CtlzOp
== CommonAncestor
)
3235 if (match(CtlzOp
, m_Add(m_Specific(CommonAncestor
), m_APInt(C
)))) {
3239 if (match(CtlzOp
, m_Sub(m_APInt(C
), m_Specific(CommonAncestor
)))) {
3240 CR
= ConstantRange(*C
).sub(CR
);
3243 if (match(CtlzOp
, m_Not(m_Specific(CommonAncestor
)))) {
3244 CR
= CR
.binaryNot();
3250 const APInt
*C
= nullptr;
3251 Value
*CommonAncestor
;
3252 if (MatchForward(Cond0
)) {
3253 // Cond0 is either CtlzOp or CtlzOp's parent. CR has been updated.
3254 } else if (match(Cond0
, m_Add(m_Value(CommonAncestor
), m_APInt(C
)))) {
3256 if (!MatchForward(CommonAncestor
))
3258 // Cond0's parent is either CtlzOp or CtlzOp's parent. CR has been updated.
3263 // Return true if all the values in the range are either 0 or negative (if
3264 // treated as signed). We do so by evaluating:
3266 // CR - 1 u>= (1 << BitWidth) - 1.
3267 APInt IntMax
= APInt::getSignMask(BitWidth
) - 1;
3268 CR
= CR
.sub(APInt(BitWidth
, 1));
3269 return CR
.icmp(ICmpInst::ICMP_UGE
, IntMax
);
3272 // Transform the std::bit_ceil(X) pattern like:
3274 // %dec = add i32 %x, -1
3275 // %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
3276 // %sub = sub i32 32, %ctlz
3277 // %shl = shl i32 1, %sub
3278 // %ugt = icmp ugt i32 %x, 1
3279 // %sel = select i1 %ugt, i32 %shl, i32 1
3283 // %dec = add i32 %x, -1
3284 // %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
3285 // %neg = sub i32 0, %ctlz
3286 // %masked = and i32 %ctlz, 31
3287 // %shl = shl i32 1, %sub
3289 // Note that the select is optimized away while the shift count is masked with
3290 // 31. We handle some variations of the input operand like std::bit_ceil(X +
3292 static Instruction
*foldBitCeil(SelectInst
&SI
, IRBuilderBase
&Builder
) {
3293 Type
*SelType
= SI
.getType();
3294 unsigned BitWidth
= SelType
->getScalarSizeInBits();
3296 Value
*FalseVal
= SI
.getFalseValue();
3297 Value
*TrueVal
= SI
.getTrueValue();
3298 ICmpInst::Predicate Pred
;
3300 Value
*Cond0
, *Ctlz
, *CtlzOp
;
3301 if (!match(SI
.getCondition(), m_ICmp(Pred
, m_Value(Cond0
), m_APInt(Cond1
))))
3304 if (match(TrueVal
, m_One())) {
3305 std::swap(FalseVal
, TrueVal
);
3306 Pred
= CmpInst::getInversePredicate(Pred
);
3309 if (!match(FalseVal
, m_One()) ||
3311 m_OneUse(m_Shl(m_One(), m_OneUse(m_Sub(m_SpecificInt(BitWidth
),
3312 m_Value(Ctlz
)))))) ||
3313 !match(Ctlz
, m_Intrinsic
<Intrinsic::ctlz
>(m_Value(CtlzOp
), m_Zero())) ||
3314 !isSafeToRemoveBitCeilSelect(Pred
, Cond0
, Cond1
, CtlzOp
, BitWidth
))
3317 // Build 1 << (-CTLZ & (BitWidth-1)). The negation likely corresponds to a
3318 // single hardware instruction as opposed to BitWidth - CTLZ, where BitWidth
3319 // is an integer constant. Masking with BitWidth-1 comes free on some
3320 // hardware as part of the shift instruction.
3321 Value
*Neg
= Builder
.CreateNeg(Ctlz
);
3323 Builder
.CreateAnd(Neg
, ConstantInt::get(SelType
, BitWidth
- 1));
3324 return BinaryOperator::Create(Instruction::Shl
, ConstantInt::get(SelType
, 1),
3328 bool InstCombinerImpl::fmulByZeroIsZero(Value
*MulVal
, FastMathFlags FMF
,
3329 const Instruction
*CtxI
) const {
3330 KnownFPClass Known
= computeKnownFPClass(MulVal
, FMF
, fcNegative
, CtxI
);
3332 return Known
.isKnownNeverNaN() && Known
.isKnownNeverInfinity() &&
3333 (FMF
.noSignedZeros() || Known
.signBitIsZeroOrNaN());
3336 static bool matchFMulByZeroIfResultEqZero(InstCombinerImpl
&IC
, Value
*Cmp0
,
3337 Value
*Cmp1
, Value
*TrueVal
,
3338 Value
*FalseVal
, Instruction
&CtxI
,
3341 if (match(Cmp1
, m_PosZeroFP()) &&
3342 match(TrueVal
, m_c_FMul(m_Specific(Cmp0
), m_Value(MulRHS
)))) {
3343 FastMathFlags FMF
= cast
<FPMathOperator
>(TrueVal
)->getFastMathFlags();
3344 // nsz must be on the select, it must be ignored on the multiply. We
3345 // need nnan and ninf on the multiply for the other value.
3346 FMF
.setNoSignedZeros(SelectIsNSZ
);
3347 return IC
.fmulByZeroIsZero(MulRHS
, FMF
, &CtxI
);
3353 Instruction
*InstCombinerImpl::visitSelectInst(SelectInst
&SI
) {
3354 Value
*CondVal
= SI
.getCondition();
3355 Value
*TrueVal
= SI
.getTrueValue();
3356 Value
*FalseVal
= SI
.getFalseValue();
3357 Type
*SelType
= SI
.getType();
3359 if (Value
*V
= simplifySelectInst(CondVal
, TrueVal
, FalseVal
,
3360 SQ
.getWithInstruction(&SI
)))
3361 return replaceInstUsesWith(SI
, V
);
3363 if (Instruction
*I
= canonicalizeSelectToShuffle(SI
))
3366 if (Instruction
*I
= canonicalizeScalarSelectOfVecs(SI
, *this))
3369 // If the type of select is not an integer type or if the condition and
3370 // the selection type are not both scalar nor both vector types, there is no
3371 // point in attempting to match these patterns.
3372 Type
*CondType
= CondVal
->getType();
3373 if (!isa
<Constant
>(CondVal
) && SelType
->isIntOrIntVectorTy() &&
3374 CondType
->isVectorTy() == SelType
->isVectorTy()) {
3375 if (Value
*S
= simplifyWithOpReplaced(TrueVal
, CondVal
,
3376 ConstantInt::getTrue(CondType
), SQ
,
3377 /* AllowRefinement */ true))
3378 return replaceOperand(SI
, 1, S
);
3380 if (Value
*S
= simplifyWithOpReplaced(FalseVal
, CondVal
,
3381 ConstantInt::getFalse(CondType
), SQ
,
3382 /* AllowRefinement */ true))
3383 return replaceOperand(SI
, 2, S
);
3386 if (Instruction
*R
= foldSelectOfBools(SI
))
3389 // Selecting between two integer or vector splat integer constants?
3391 // Note that we don't handle a scalar select of vectors:
3392 // select i1 %c, <2 x i8> <1, 1>, <2 x i8> <0, 0>
3393 // because that may need 3 instructions to splat the condition value:
3394 // extend, insertelement, shufflevector.
3396 // Do not handle i1 TrueVal and FalseVal otherwise would result in
3397 // zext/sext i1 to i1.
3398 if (SelType
->isIntOrIntVectorTy() && !SelType
->isIntOrIntVectorTy(1) &&
3399 CondVal
->getType()->isVectorTy() == SelType
->isVectorTy()) {
3400 // select C, 1, 0 -> zext C to int
3401 if (match(TrueVal
, m_One()) && match(FalseVal
, m_Zero()))
3402 return new ZExtInst(CondVal
, SelType
);
3404 // select C, -1, 0 -> sext C to int
3405 if (match(TrueVal
, m_AllOnes()) && match(FalseVal
, m_Zero()))
3406 return new SExtInst(CondVal
, SelType
);
3408 // select C, 0, 1 -> zext !C to int
3409 if (match(TrueVal
, m_Zero()) && match(FalseVal
, m_One())) {
3410 Value
*NotCond
= Builder
.CreateNot(CondVal
, "not." + CondVal
->getName());
3411 return new ZExtInst(NotCond
, SelType
);
3414 // select C, 0, -1 -> sext !C to int
3415 if (match(TrueVal
, m_Zero()) && match(FalseVal
, m_AllOnes())) {
3416 Value
*NotCond
= Builder
.CreateNot(CondVal
, "not." + CondVal
->getName());
3417 return new SExtInst(NotCond
, SelType
);
3421 auto *SIFPOp
= dyn_cast
<FPMathOperator
>(&SI
);
3423 if (auto *FCmp
= dyn_cast
<FCmpInst
>(CondVal
)) {
3424 FCmpInst::Predicate Pred
= FCmp
->getPredicate();
3425 Value
*Cmp0
= FCmp
->getOperand(0), *Cmp1
= FCmp
->getOperand(1);
3426 // Are we selecting a value based on a comparison of the two values?
3427 if ((Cmp0
== TrueVal
&& Cmp1
== FalseVal
) ||
3428 (Cmp0
== FalseVal
&& Cmp1
== TrueVal
)) {
3429 // Canonicalize to use ordered comparisons by swapping the select
3433 // (X ugt Y) ? X : Y -> (X ole Y) ? Y : X
3434 if (FCmp
->hasOneUse() && FCmpInst::isUnordered(Pred
)) {
3435 FCmpInst::Predicate InvPred
= FCmp
->getInversePredicate();
3436 IRBuilder
<>::FastMathFlagGuard
FMFG(Builder
);
3437 // FIXME: The FMF should propagate from the select, not the fcmp.
3438 Builder
.setFastMathFlags(FCmp
->getFastMathFlags());
3439 Value
*NewCond
= Builder
.CreateFCmp(InvPred
, Cmp0
, Cmp1
,
3440 FCmp
->getName() + ".inv");
3441 Value
*NewSel
= Builder
.CreateSelect(NewCond
, FalseVal
, TrueVal
);
3442 return replaceInstUsesWith(SI
, NewSel
);
3447 // Fold out scale-if-equals-zero pattern.
3449 // This pattern appears in code with denormal range checks after it's
3450 // assumed denormals are treated as zero. This drops a canonicalization.
3452 // TODO: Could relax the signed zero logic. We just need to know the sign
3453 // of the result matches (fmul x, y has the same sign as x).
3455 // TODO: Handle always-canonicalizing variant that selects some value or 1
3456 // scaling factor in the fmul visitor.
3458 // TODO: Handle ldexp too
3460 Value
*MatchCmp0
= nullptr;
3461 Value
*MatchCmp1
= nullptr;
3463 // (select (fcmp [ou]eq x, 0.0), (fmul x, K), x => x
3464 // (select (fcmp [ou]ne x, 0.0), x, (fmul x, K) => x
3465 if (Pred
== CmpInst::FCMP_OEQ
|| Pred
== CmpInst::FCMP_UEQ
) {
3466 MatchCmp0
= FalseVal
;
3467 MatchCmp1
= TrueVal
;
3468 } else if (Pred
== CmpInst::FCMP_ONE
|| Pred
== CmpInst::FCMP_UNE
) {
3469 MatchCmp0
= TrueVal
;
3470 MatchCmp1
= FalseVal
;
3473 if (Cmp0
== MatchCmp0
&&
3474 matchFMulByZeroIfResultEqZero(*this, Cmp0
, Cmp1
, MatchCmp1
, MatchCmp0
,
3475 SI
, SIFPOp
->hasNoSignedZeros()))
3476 return replaceInstUsesWith(SI
, Cmp0
);
3481 // TODO: Try to forward-propagate FMF from select arms to the select.
3483 // Canonicalize select of FP values where NaN and -0.0 are not valid as
3484 // minnum/maxnum intrinsics.
3485 if (SIFPOp
->hasNoNaNs() && SIFPOp
->hasNoSignedZeros()) {
3487 if (match(&SI
, m_OrdFMax(m_Value(X
), m_Value(Y
))))
3488 return replaceInstUsesWith(
3489 SI
, Builder
.CreateBinaryIntrinsic(Intrinsic::maxnum
, X
, Y
, &SI
));
3491 if (match(&SI
, m_OrdFMin(m_Value(X
), m_Value(Y
))))
3492 return replaceInstUsesWith(
3493 SI
, Builder
.CreateBinaryIntrinsic(Intrinsic::minnum
, X
, Y
, &SI
));
3497 // Fold selecting to fabs.
3498 if (Instruction
*Fabs
= foldSelectWithFCmpToFabs(SI
, *this))
3501 // See if we are selecting two values based on a comparison of the two values.
3502 if (ICmpInst
*ICI
= dyn_cast
<ICmpInst
>(CondVal
))
3503 if (Instruction
*Result
= foldSelectInstWithICmp(SI
, ICI
))
3506 if (Instruction
*Add
= foldAddSubSelect(SI
, Builder
))
3508 if (Instruction
*Add
= foldOverflowingAddSubSelect(SI
, Builder
))
3510 if (Instruction
*Or
= foldSetClearBits(SI
, Builder
))
3512 if (Instruction
*Mul
= foldSelectZeroOrMul(SI
, *this))
3515 // Turn (select C, (op X, Y), (op X, Z)) -> (op X, (select C, Y, Z))
3516 auto *TI
= dyn_cast
<Instruction
>(TrueVal
);
3517 auto *FI
= dyn_cast
<Instruction
>(FalseVal
);
3518 if (TI
&& FI
&& TI
->getOpcode() == FI
->getOpcode())
3519 if (Instruction
*IV
= foldSelectOpOp(SI
, TI
, FI
))
3522 if (Instruction
*I
= foldSelectExtConst(SI
))
3525 if (Instruction
*I
= foldSelectWithSRem(SI
, *this, Builder
))
3528 // Fold (select C, (gep Ptr, Idx), Ptr) -> (gep Ptr, (select C, Idx, 0))
3529 // Fold (select C, Ptr, (gep Ptr, Idx)) -> (gep Ptr, (select C, 0, Idx))
3530 auto SelectGepWithBase
= [&](GetElementPtrInst
*Gep
, Value
*Base
,
3531 bool Swap
) -> GetElementPtrInst
* {
3532 Value
*Ptr
= Gep
->getPointerOperand();
3533 if (Gep
->getNumOperands() != 2 || Gep
->getPointerOperand() != Base
||
3536 Value
*Idx
= Gep
->getOperand(1);
3537 if (isa
<VectorType
>(CondVal
->getType()) && !isa
<VectorType
>(Idx
->getType()))
3539 Type
*ElementType
= Gep
->getResultElementType();
3541 Value
*NewF
= Constant::getNullValue(Idx
->getType());
3543 std::swap(NewT
, NewF
);
3545 Builder
.CreateSelect(CondVal
, NewT
, NewF
, SI
.getName() + ".idx", &SI
);
3546 if (Gep
->isInBounds())
3547 return GetElementPtrInst::CreateInBounds(ElementType
, Ptr
, {NewSI
});
3548 return GetElementPtrInst::Create(ElementType
, Ptr
, {NewSI
});
3550 if (auto *TrueGep
= dyn_cast
<GetElementPtrInst
>(TrueVal
))
3551 if (auto *NewGep
= SelectGepWithBase(TrueGep
, FalseVal
, false))
3553 if (auto *FalseGep
= dyn_cast
<GetElementPtrInst
>(FalseVal
))
3554 if (auto *NewGep
= SelectGepWithBase(FalseGep
, TrueVal
, true))
3557 // See if we can fold the select into one of our operands.
3558 if (SelType
->isIntOrIntVectorTy() || SelType
->isFPOrFPVectorTy()) {
3559 if (Instruction
*FoldI
= foldSelectIntoOp(SI
, TrueVal
, FalseVal
))
3563 Instruction::CastOps CastOp
;
3564 SelectPatternResult SPR
= matchSelectPattern(&SI
, LHS
, RHS
, &CastOp
);
3565 auto SPF
= SPR
.Flavor
;
3568 if (SelectPatternFlavor SPF2
= matchSelectPattern(LHS
, LHS2
, RHS2
).Flavor
)
3569 if (Instruction
*R
= foldSPFofSPF(cast
<Instruction
>(LHS
), SPF2
, LHS2
,
3570 RHS2
, SI
, SPF
, RHS
))
3572 if (SelectPatternFlavor SPF2
= matchSelectPattern(RHS
, LHS2
, RHS2
).Flavor
)
3573 if (Instruction
*R
= foldSPFofSPF(cast
<Instruction
>(RHS
), SPF2
, LHS2
,
3574 RHS2
, SI
, SPF
, LHS
))
3578 if (SelectPatternResult::isMinOrMax(SPF
)) {
3579 // Canonicalize so that
3580 // - type casts are outside select patterns.
3581 // - float clamp is transformed to min/max pattern
3583 bool IsCastNeeded
= LHS
->getType() != SelType
;
3584 Value
*CmpLHS
= cast
<CmpInst
>(CondVal
)->getOperand(0);
3585 Value
*CmpRHS
= cast
<CmpInst
>(CondVal
)->getOperand(1);
3587 (LHS
->getType()->isFPOrFPVectorTy() &&
3588 ((CmpLHS
!= LHS
&& CmpLHS
!= RHS
) ||
3589 (CmpRHS
!= LHS
&& CmpRHS
!= RHS
)))) {
3590 CmpInst::Predicate MinMaxPred
= getMinMaxPred(SPF
, SPR
.Ordered
);
3593 if (CmpInst::isIntPredicate(MinMaxPred
)) {
3594 Cmp
= Builder
.CreateICmp(MinMaxPred
, LHS
, RHS
);
3596 IRBuilder
<>::FastMathFlagGuard
FMFG(Builder
);
3598 cast
<FPMathOperator
>(SI
.getCondition())->getFastMathFlags();
3599 Builder
.setFastMathFlags(FMF
);
3600 Cmp
= Builder
.CreateFCmp(MinMaxPred
, LHS
, RHS
);
3603 Value
*NewSI
= Builder
.CreateSelect(Cmp
, LHS
, RHS
, SI
.getName(), &SI
);
3605 return replaceInstUsesWith(SI
, NewSI
);
3607 Value
*NewCast
= Builder
.CreateCast(CastOp
, NewSI
, SelType
);
3608 return replaceInstUsesWith(SI
, NewCast
);
3613 // See if we can fold the select into a phi node if the condition is a select.
3614 if (auto *PN
= dyn_cast
<PHINode
>(SI
.getCondition()))
3615 // The true/false values have to be live in the PHI predecessor's blocks.
3616 if (canSelectOperandBeMappingIntoPredBlock(TrueVal
, SI
) &&
3617 canSelectOperandBeMappingIntoPredBlock(FalseVal
, SI
))
3618 if (Instruction
*NV
= foldOpIntoPhi(SI
, PN
))
3621 if (SelectInst
*TrueSI
= dyn_cast
<SelectInst
>(TrueVal
)) {
3622 if (TrueSI
->getCondition()->getType() == CondVal
->getType()) {
3623 // select(C, select(C, a, b), c) -> select(C, a, c)
3624 if (TrueSI
->getCondition() == CondVal
) {
3625 if (SI
.getTrueValue() == TrueSI
->getTrueValue())
3627 return replaceOperand(SI
, 1, TrueSI
->getTrueValue());
3629 // select(C0, select(C1, a, b), b) -> select(C0&C1, a, b)
3630 // We choose this as normal form to enable folding on the And and
3631 // shortening paths for the values (this helps getUnderlyingObjects() for
3633 if (TrueSI
->getFalseValue() == FalseVal
&& TrueSI
->hasOneUse()) {
3634 Value
*And
= Builder
.CreateLogicalAnd(CondVal
, TrueSI
->getCondition());
3635 replaceOperand(SI
, 0, And
);
3636 replaceOperand(SI
, 1, TrueSI
->getTrueValue());
3641 if (SelectInst
*FalseSI
= dyn_cast
<SelectInst
>(FalseVal
)) {
3642 if (FalseSI
->getCondition()->getType() == CondVal
->getType()) {
3643 // select(C, a, select(C, b, c)) -> select(C, a, c)
3644 if (FalseSI
->getCondition() == CondVal
) {
3645 if (SI
.getFalseValue() == FalseSI
->getFalseValue())
3647 return replaceOperand(SI
, 2, FalseSI
->getFalseValue());
3649 // select(C0, a, select(C1, a, b)) -> select(C0|C1, a, b)
3650 if (FalseSI
->getTrueValue() == TrueVal
&& FalseSI
->hasOneUse()) {
3651 Value
*Or
= Builder
.CreateLogicalOr(CondVal
, FalseSI
->getCondition());
3652 replaceOperand(SI
, 0, Or
);
3653 replaceOperand(SI
, 2, FalseSI
->getFalseValue());
3659 // Try to simplify a binop sandwiched between 2 selects with the same
3660 // condition. This is not valid for div/rem because the select might be
3661 // preventing a division-by-zero.
3662 // TODO: A div/rem restriction is conservative; use something like
3663 // isSafeToSpeculativelyExecute().
3664 // select(C, binop(select(C, X, Y), W), Z) -> select(C, binop(X, W), Z)
3665 BinaryOperator
*TrueBO
;
3666 if (match(TrueVal
, m_OneUse(m_BinOp(TrueBO
))) && !TrueBO
->isIntDivRem()) {
3667 if (auto *TrueBOSI
= dyn_cast
<SelectInst
>(TrueBO
->getOperand(0))) {
3668 if (TrueBOSI
->getCondition() == CondVal
) {
3669 replaceOperand(*TrueBO
, 0, TrueBOSI
->getTrueValue());
3670 Worklist
.push(TrueBO
);
3674 if (auto *TrueBOSI
= dyn_cast
<SelectInst
>(TrueBO
->getOperand(1))) {
3675 if (TrueBOSI
->getCondition() == CondVal
) {
3676 replaceOperand(*TrueBO
, 1, TrueBOSI
->getTrueValue());
3677 Worklist
.push(TrueBO
);
3683 // select(C, Z, binop(select(C, X, Y), W)) -> select(C, Z, binop(Y, W))
3684 BinaryOperator
*FalseBO
;
3685 if (match(FalseVal
, m_OneUse(m_BinOp(FalseBO
))) && !FalseBO
->isIntDivRem()) {
3686 if (auto *FalseBOSI
= dyn_cast
<SelectInst
>(FalseBO
->getOperand(0))) {
3687 if (FalseBOSI
->getCondition() == CondVal
) {
3688 replaceOperand(*FalseBO
, 0, FalseBOSI
->getFalseValue());
3689 Worklist
.push(FalseBO
);
3693 if (auto *FalseBOSI
= dyn_cast
<SelectInst
>(FalseBO
->getOperand(1))) {
3694 if (FalseBOSI
->getCondition() == CondVal
) {
3695 replaceOperand(*FalseBO
, 1, FalseBOSI
->getFalseValue());
3696 Worklist
.push(FalseBO
);
3703 if (match(CondVal
, m_Not(m_Value(NotCond
))) &&
3704 !InstCombiner::shouldAvoidAbsorbingNotIntoSelect(SI
)) {
3705 replaceOperand(SI
, 0, NotCond
);
3707 SI
.swapProfMetadata();
3711 if (Instruction
*I
= foldVectorSelect(SI
))
3714 // If we can compute the condition, there's no need for a select.
3715 // Like the above fold, we are attempting to reduce compile-time cost by
3716 // putting this fold here with limitations rather than in InstSimplify.
3717 // The motivation for this call into value tracking is to take advantage of
3718 // the assumption cache, so make sure that is populated.
3719 if (!CondVal
->getType()->isVectorTy() && !AC
.assumptions().empty()) {
3721 computeKnownBits(CondVal
, Known
, 0, &SI
);
3722 if (Known
.One
.isOne())
3723 return replaceInstUsesWith(SI
, TrueVal
);
3724 if (Known
.Zero
.isOne())
3725 return replaceInstUsesWith(SI
, FalseVal
);
3728 if (Instruction
*BitCastSel
= foldSelectCmpBitcasts(SI
, Builder
))
3731 // Simplify selects that test the returned flag of cmpxchg instructions.
3732 if (Value
*V
= foldSelectCmpXchg(SI
))
3733 return replaceInstUsesWith(SI
, V
);
3735 if (Instruction
*Select
= foldSelectBinOpIdentity(SI
, TLI
, *this))
3738 if (Instruction
*Funnel
= foldSelectFunnelShift(SI
, Builder
))
3741 if (Instruction
*Copysign
= foldSelectToCopysign(SI
, Builder
))
3744 if (Instruction
*PN
= foldSelectToPhi(SI
, DT
, Builder
))
3745 return replaceInstUsesWith(SI
, PN
);
3747 if (Value
*Fr
= foldSelectWithFrozenICmp(SI
, Builder
))
3748 return replaceInstUsesWith(SI
, Fr
);
3750 if (Value
*V
= foldRoundUpIntegerWithPow2Alignment(SI
, Builder
))
3751 return replaceInstUsesWith(SI
, V
);
3753 // select(mask, mload(,,mask,0), 0) -> mload(,,mask,0)
3754 // Load inst is intentionally not checked for hasOneUse()
3755 if (match(FalseVal
, m_Zero()) &&
3756 (match(TrueVal
, m_MaskedLoad(m_Value(), m_Value(), m_Specific(CondVal
),
3757 m_CombineOr(m_Undef(), m_Zero()))) ||
3758 match(TrueVal
, m_MaskedGather(m_Value(), m_Value(), m_Specific(CondVal
),
3759 m_CombineOr(m_Undef(), m_Zero()))))) {
3760 auto *MaskedInst
= cast
<IntrinsicInst
>(TrueVal
);
3761 if (isa
<UndefValue
>(MaskedInst
->getArgOperand(3)))
3762 MaskedInst
->setArgOperand(3, FalseVal
/* Zero */);
3763 return replaceInstUsesWith(SI
, MaskedInst
);
3767 if (match(TrueVal
, m_Zero()) &&
3768 (match(FalseVal
, m_MaskedLoad(m_Value(), m_Value(), m_Value(Mask
),
3769 m_CombineOr(m_Undef(), m_Zero()))) ||
3770 match(FalseVal
, m_MaskedGather(m_Value(), m_Value(), m_Value(Mask
),
3771 m_CombineOr(m_Undef(), m_Zero())))) &&
3772 (CondVal
->getType() == Mask
->getType())) {
3773 // We can remove the select by ensuring the load zeros all lanes the
3774 // select would have. We determine this by proving there is no overlap
3775 // between the load and select masks.
3776 // (i.e (load_mask & select_mask) == 0 == no overlap)
3777 bool CanMergeSelectIntoLoad
= false;
3778 if (Value
*V
= simplifyAndInst(CondVal
, Mask
, SQ
.getWithInstruction(&SI
)))
3779 CanMergeSelectIntoLoad
= match(V
, m_Zero());
3781 if (CanMergeSelectIntoLoad
) {
3782 auto *MaskedInst
= cast
<IntrinsicInst
>(FalseVal
);
3783 if (isa
<UndefValue
>(MaskedInst
->getArgOperand(3)))
3784 MaskedInst
->setArgOperand(3, TrueVal
/* Zero */);
3785 return replaceInstUsesWith(SI
, MaskedInst
);
3789 if (Instruction
*I
= foldNestedSelects(SI
, Builder
))
3792 // Match logical variants of the pattern,
3793 // and transform them iff that gets rid of inversions.
3794 // (~x) | y --> ~(x & (~y))
3795 // (~x) & y --> ~(x | (~y))
3796 if (sinkNotIntoOtherHandOfLogicalOp(SI
))
3799 if (Instruction
*I
= foldBitCeil(SI
, Builder
))
3803 // (select A && B, T, F) -> (select A, (select B, T, F), F)
3804 // (select A || B, T, F) -> (select A, T, (select B, T, F))
3805 // if (select B, T, F) is foldable.
3806 // TODO: preserve FMF flags
3807 auto FoldSelectWithAndOrCond
= [&](bool IsAnd
, Value
*A
,
3808 Value
*B
) -> Instruction
* {
3809 if (Value
*V
= simplifySelectInst(B
, TrueVal
, FalseVal
,
3810 SQ
.getWithInstruction(&SI
)))
3811 return SelectInst::Create(A
, IsAnd
? V
: TrueVal
, IsAnd
? FalseVal
: V
);
3813 // Is (select B, T, F) a SPF?
3814 if (CondVal
->hasOneUse() && SelType
->isIntOrIntVectorTy()) {
3815 if (ICmpInst
*Cmp
= dyn_cast
<ICmpInst
>(B
))
3816 if (Value
*V
= canonicalizeSPF(*Cmp
, TrueVal
, FalseVal
, *this))
3817 return SelectInst::Create(A
, IsAnd
? V
: TrueVal
,
3818 IsAnd
? FalseVal
: V
);
3825 if (match(CondVal
, m_And(m_Value(LHS
), m_Value(RHS
)))) {
3826 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS
, RHS
))
3828 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ true, RHS
, LHS
))
3830 } else if (match(CondVal
, m_Or(m_Value(LHS
), m_Value(RHS
)))) {
3831 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS
, RHS
))
3833 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ false, RHS
, LHS
))
3836 // We cannot swap the operands of logical and/or.
3837 // TODO: Can we swap the operands by inserting a freeze?
3838 if (match(CondVal
, m_LogicalAnd(m_Value(LHS
), m_Value(RHS
)))) {
3839 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS
, RHS
))
3841 } else if (match(CondVal
, m_LogicalOr(m_Value(LHS
), m_Value(RHS
)))) {
3842 if (Instruction
*I
= FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS
, RHS
))