LLVM 24.0.0git
InstCombineSelect.cpp
Go to the documentation of this file.
1//===- InstCombineSelect.cpp ----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the visitSelect function.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APInt.h"
15#include "llvm/ADT/STLExtras.h"
20#include "llvm/Analysis/Loads.h"
24#include "llvm/IR/BasicBlock.h"
25#include "llvm/IR/Constant.h"
27#include "llvm/IR/Constants.h"
29#include "llvm/IR/FMF.h"
30#include "llvm/IR/IRBuilder.h"
31#include "llvm/IR/InstrTypes.h"
32#include "llvm/IR/Instruction.h"
35#include "llvm/IR/Intrinsics.h"
36#include "llvm/IR/Operator.h"
39#include "llvm/IR/Type.h"
40#include "llvm/IR/User.h"
41#include "llvm/IR/Value.h"
47#include <cassert>
48#include <optional>
49#include <utility>
50
51#define DEBUG_TYPE "instcombine"
53
54using namespace llvm;
55using namespace PatternMatch;
56
57namespace llvm {
59}
60
61/// Replace a select operand based on an equality comparison with the identity
62/// constant of a binop.
64 const TargetLibraryInfo &TLI,
65 InstCombinerImpl &IC) {
66 // The select condition must be an equality compare with a constant operand.
67 Value *X;
68 Constant *C;
69 CmpPredicate Pred;
70 if (!match(Sel.getCondition(), m_Cmp(Pred, m_Value(X), m_Constant(C))))
71 return nullptr;
72
73 bool IsEq;
74 if (ICmpInst::isEquality(Pred))
75 IsEq = Pred == ICmpInst::ICMP_EQ;
76 else if (Pred == FCmpInst::FCMP_OEQ)
77 IsEq = true;
78 else if (Pred == FCmpInst::FCMP_UNE)
79 IsEq = false;
80 else
81 return nullptr;
82
83 // A select operand must be a binop.
85 if (!match(Sel.getOperand(IsEq ? 1 : 2), m_BinOp(BO)))
86 return nullptr;
87
88 // For absorbing values, we can fold to the compared value.
89 bool IsAbsorbingValue = false;
90
91 // Last, match the compare variable operand with a binop operand.
92 Value *Y;
93 if (BO->isCommutative()) {
94 // Recognized 0 as an absorbing value for fmul, but we need to be careful
95 // about the sign. This could be more aggressive, by handling arbitrary sign
96 // bit operations as long as we know the fmul sign matches (and handling
97 // arbitrary opcodes).
98 if (match(BO, m_c_FMul(m_FAbs(m_Specific(X)), m_Value(Y))) &&
99 match(C, m_AnyZeroFP()) &&
100 IC.fmulByZeroIsZero(Y, BO->getFastMathFlags(), &Sel))
101 IsAbsorbingValue = true;
102 else if (!match(BO, m_c_BinOp(m_Value(Y), m_Specific(X))))
103 return nullptr;
104 } else {
105 if (!match(BO, m_BinOp(m_Value(Y), m_Specific(X))))
106 return nullptr;
107 }
108
109 // The compare constant must be the identity constant for that binop.
110 // If this a floating-point compare with 0.0, any zero constant will do.
111 Type *Ty = BO->getType();
112
113 Value *FoldedVal;
114 if (IsAbsorbingValue) {
115 FoldedVal = C;
116 } else {
117 Constant *IdC = ConstantExpr::getBinOpIdentity(BO->getOpcode(), Ty, true);
118 if (IdC != C) {
119 if (!IdC || !CmpInst::isFPPredicate(Pred))
120 return nullptr;
121
122 if (!match(IdC, m_AnyZeroFP()) || !match(C, m_AnyZeroFP()))
123 return nullptr;
124 }
125
126 // +0.0 compares equal to -0.0, and so it does not behave as required for
127 // this transform. Bail out if we can not exclude that possibility.
128 if (const auto *FPO = dyn_cast<FPMathOperator>(BO))
129 if (!FPO->hasNoSignedZeros() &&
132 return nullptr;
133
134 FoldedVal = Y;
135 }
136
137 // BO = binop Y, X
138 // S = { select (cmp eq X, C), BO, ? } or { select (cmp ne X, C), ?, BO }
139 // =>
140 // S = { select (cmp eq X, C), Y, ? } or { select (cmp ne X, C), ?, Y }
141 return IC.replaceOperand(Sel, IsEq ? 1 : 2, FoldedVal);
142}
143
144/// This folds:
145/// select (icmp eq (and X, C1)), TC, FC
146/// iff C1 is a power 2 and the difference between TC and FC is a power-of-2.
147/// To something like:
148/// (shr (and (X, C1)), (log2(C1) - log2(TC-FC))) + FC
149/// Or:
150/// (shl (and (X, C1)), (log2(TC-FC) - log2(C1))) + FC
151/// With some variations depending if FC is larger than TC, or the shift
152/// isn't needed, or the bit widths don't match.
153static Value *foldSelectICmpAnd(SelectInst &Sel, Value *CondVal, Value *TrueVal,
154 Value *FalseVal, Value *V, const APInt &AndMask,
155 bool CreateAnd,
156 InstCombiner::BuilderTy &Builder) {
157 const APInt *SelTC, *SelFC;
158 if (!match(TrueVal, m_APInt(SelTC)) || !match(FalseVal, m_APInt(SelFC)))
159 return nullptr;
160
161 Type *SelType = Sel.getType();
162 // In general, when both constants are non-zero, we would need an offset to
163 // replace the select. This would require more instructions than we started
164 // with. But there's one special-case that we handle here because it can
165 // simplify/reduce the instructions.
166 const APInt &TC = *SelTC;
167 const APInt &FC = *SelFC;
168 if (!TC.isZero() && !FC.isZero()) {
169 if (TC.getBitWidth() != AndMask.getBitWidth())
170 return nullptr;
171 // If we have to create an 'and', then we must kill the cmp to not
172 // increase the instruction count.
173 if (CreateAnd && !CondVal->hasOneUse())
174 return nullptr;
175
176 // (V & AndMaskC) == 0 ? TC : FC --> TC | (V & AndMaskC)
177 // (V & AndMaskC) == 0 ? TC : FC --> TC ^ (V & AndMaskC)
178 // (V & AndMaskC) == 0 ? TC : FC --> TC + (V & AndMaskC)
179 // (V & AndMaskC) == 0 ? TC : FC --> TC - (V & AndMaskC)
180 Constant *TCC = ConstantInt::get(SelType, TC);
181 Constant *FCC = ConstantInt::get(SelType, FC);
182 Constant *MaskC = ConstantInt::get(SelType, AndMask);
183 for (auto Opc : {Instruction::Or, Instruction::Xor, Instruction::Add,
184 Instruction::Sub}) {
185 if (ConstantFoldBinaryOpOperands(Opc, TCC, MaskC, Sel.getDataLayout()) ==
186 FCC) {
187 if (CreateAnd)
188 V = Builder.CreateAnd(V, MaskC);
189 return Builder.CreateBinOp(Opc, TCC, V);
190 }
191 }
192
193 return nullptr;
194 }
195
196 // Make sure one of the select arms is a power-of-2.
197 if (!TC.isPowerOf2() && !FC.isPowerOf2())
198 return nullptr;
199
200 // Determine which shift is needed to transform result of the 'and' into the
201 // desired result.
202 const APInt &ValC = !TC.isZero() ? TC : FC;
203 unsigned ValZeros = ValC.logBase2();
204 unsigned AndZeros = AndMask.logBase2();
205 bool ShouldNotVal = !TC.isZero();
206 bool NeedShift = ValZeros != AndZeros;
207 bool NeedZExtTrunc =
208 SelType->getScalarSizeInBits() != V->getType()->getScalarSizeInBits();
209
210 // If we would need to create an 'and' + 'shift' + 'xor' + cast to replace
211 // a 'select' + 'icmp', then this transformation would result in more
212 // instructions and potentially interfere with other folding.
213 if (CreateAnd + ShouldNotVal + NeedShift + NeedZExtTrunc >
214 1 + CondVal->hasOneUse())
215 return nullptr;
216
217 // Insert the 'and' instruction on the input to the truncate.
218 if (CreateAnd)
219 V = Builder.CreateAnd(V, ConstantInt::get(V->getType(), AndMask));
220
221 // If types don't match, we can still convert the select by introducing a zext
222 // or a trunc of the 'and'.
223 if (ValZeros > AndZeros) {
224 V = Builder.CreateZExtOrTrunc(V, SelType);
225 V = Builder.CreateShl(V, ValZeros - AndZeros);
226 } else if (ValZeros < AndZeros) {
227 V = Builder.CreateLShr(V, AndZeros - ValZeros);
228 V = Builder.CreateZExtOrTrunc(V, SelType);
229 } else {
230 V = Builder.CreateZExtOrTrunc(V, SelType);
231 }
232
233 // Okay, now we know that everything is set up, we just don't know whether we
234 // have a icmp_ne or icmp_eq and whether the true or false val is the zero.
235 if (ShouldNotVal)
236 V = Builder.CreateXor(V, ValC);
237
238 return V;
239}
240
241/// We want to turn code that looks like this:
242/// %C = or %A, %B
243/// %D = select %cond, %C, %A
244/// into:
245/// %C = select %cond, %B, 0
246/// %D = or %A, %C
247///
248/// Assuming that the specified instruction is an operand to the select, return
249/// a bitmask indicating which operands of this instruction are foldable if they
250/// equal the other incoming value of the select.
252 switch (I->getOpcode()) {
253 case Instruction::Add:
254 case Instruction::FAdd:
255 case Instruction::Mul:
256 case Instruction::FMul:
257 case Instruction::And:
258 case Instruction::Or:
259 case Instruction::Xor:
260 return 3; // Can fold through either operand.
261 case Instruction::Sub: // Can only fold on the amount subtracted.
262 case Instruction::FSub:
263 case Instruction::FDiv: // Can only fold on the divisor amount.
264 case Instruction::Shl: // Can only fold on the shift amount.
265 case Instruction::LShr:
266 case Instruction::AShr:
267 return 1;
268 default:
269 return 0; // Cannot fold
270 }
271}
272
273/// We have (select c, TI, FI), and we know that TI and FI have the same opcode.
275 Instruction *FI) {
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)
282 return nullptr;
283
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())
290 return nullptr;
291
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
295 // (PR28160).
296 //
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()))
302 return nullptr;
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.
307 return nullptr;
308 }
309
310 // Fold this by inserting a select from the input values.
311 Value *NewSI =
312 Builder.CreateSelect(Cond, TI->getOperand(0), FI->getOperand(0),
313 SI.getName() + ".v", &SI);
315 TI->getType());
316 }
317
318 Value *OtherOpT, *OtherOpF;
319 bool MatchIsOpZero;
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");
324 if (!Swapped) {
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);
335 }
336 }
337
338 if (!Commute && !Swapped)
339 return nullptr;
340
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);
354 }
355 return nullptr;
356 };
357
358 if (TI->hasOneUse() || FI->hasOneUse()) {
359 // Cond ? -X : -Y --> -(Cond ? X : Y)
360 Value *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
363 // select.
365 FMF &= FI->getFastMathFlags();
366 FMF |= SI.getFastMathFlags();
367 Value *NewSel =
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);
373 return NewFNeg;
374 }
375
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
379 // clause.
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)) {
385 Value *NewSel =
386 Builder.CreateSelect(Cond, OtherOpT, OtherOpF, "minmaxop", &SI);
387 return CallInst::Create(TII->getCalledFunction(), {NewSel, MatchOp});
388 }
389 }
390
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
393 //
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();
406
407 Value *SelectVal = Builder.CreateSelect(Cond, LdexpVal0, LdexpVal1);
408 Value *SelectExp = Builder.CreateSelect(Cond, LdexpExp0, LdexpExp1);
409
410 Value *NewLdexp = Builder.CreateIntrinsic(
411 TII->getType(), Intrinsic::ldexp, {SelectVal, SelectExp}, FMF);
412 return replaceInstUsesWith(SI, NewLdexp);
413 }
414 }
415 }
416
417 auto CreateCmpSel = [&](std::optional<CmpPredicate> P,
418 bool Swapped) -> CmpInst * {
419 if (!P)
420 return nullptr;
421 auto *MatchOp = getCommonOp(TI, FI, ICmpInst::isEquality(*P),
422 ICmpInst::isRelational(*P) && Swapped);
423 if (!MatchOp)
424 return nullptr;
425 Value *NewSel = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,
426 SI.getName() + ".v", &SI);
427 return new ICmpInst(MatchIsOpZero ? *P
429 MatchOp, NewSel);
430 };
431
432 // icmp with a common operand also can have the common operand
433 // pulled after the select.
434 CmpPredicate TPred, FPred;
435 if (match(TI, m_ICmp(TPred, m_Value(), m_Value())) &&
436 match(FI, m_ICmp(FPred, m_Value(), m_Value()))) {
437 if (auto *R =
438 CreateCmpSel(CmpPredicate::getMatching(TPred, FPred), false))
439 return R;
440 if (auto *R =
441 CreateCmpSel(CmpPredicate::getMatching(
443 true))
444 return R;
445 }
446 }
447
448 // Only handle binary operators (including two-operand getelementptr) with
449 // one-use here. As with the cast case above, it may be possible to relax the
450 // one-use constraint, but that needs be examined carefully since it may not
451 // reduce the total number of instructions.
452 if (TI->getNumOperands() != 2 || FI->getNumOperands() != 2 ||
453 !TI->isSameOperationAs(FI) ||
455 !TI->hasOneUse() || !FI->hasOneUse())
456 return nullptr;
457
458 // Figure out if the operations have any operands in common.
459 Value *MatchOp = getCommonOp(TI, FI, TI->isCommutative());
460 if (!MatchOp)
461 return nullptr;
462
463 // If the select condition is a vector, the operands of the original select's
464 // operands also must be vectors. This may not be the case for getelementptr
465 // for example.
466 if (CondTy->isVectorTy() && (!OtherOpT->getType()->isVectorTy() ||
467 !OtherOpF->getType()->isVectorTy()))
468 return nullptr;
469
470 // If we are sinking div/rem after a select, we may need to freeze the
471 // condition because div/rem may induce immediate UB with a poison operand.
472 // For example, the following transform is not safe if Cond can ever be poison
473 // because we can replace poison with zero and then we have div-by-zero that
474 // didn't exist in the original code:
475 // Cond ? x/y : x/z --> x / (Cond ? y : z)
476 auto *BO = dyn_cast<BinaryOperator>(TI);
477 if (BO && BO->isIntDivRem() && !isGuaranteedNotToBePoison(Cond)) {
478 // A udiv/urem with a common divisor is safe because UB can only occur with
479 // div-by-zero, and that would be present in the original code.
480 if (BO->getOpcode() == Instruction::SDiv ||
481 BO->getOpcode() == Instruction::SRem || MatchIsOpZero)
482 Cond = Builder.CreateFreeze(Cond);
483 }
484
485 // If we reach here, they do have operations in common.
486 Value *NewSI = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,
487 SI.getName() + ".v", &SI);
488 Value *Op0 = MatchIsOpZero ? MatchOp : NewSI;
489 Value *Op1 = MatchIsOpZero ? NewSI : MatchOp;
490 if (auto *BO = dyn_cast<BinaryOperator>(TI)) {
491 BinaryOperator *NewBO = BinaryOperator::Create(BO->getOpcode(), Op0, Op1);
492 NewBO->copyIRFlags(TI);
493 NewBO->andIRFlags(FI);
494 return NewBO;
495 }
496 if (auto *TGEP = dyn_cast<GetElementPtrInst>(TI)) {
497 auto *FGEP = cast<GetElementPtrInst>(FI);
498 Type *ElementType = TGEP->getSourceElementType();
500 ElementType, Op0, Op1, TGEP->getNoWrapFlags() & FGEP->getNoWrapFlags());
501 }
502 llvm_unreachable("Expected BinaryOperator or GEP");
503 return nullptr;
504}
505
506/// This transforms patterns of the form:
507/// select cond, intrinsic(x, ...), intrinsic(y, ...)
508/// into:
509/// intrinsic(select cond, x, y, ...)
511 auto *LHSIntrinsic = dyn_cast<IntrinsicInst>(SI.getTrueValue());
512 if (!LHSIntrinsic)
513 return nullptr;
514 auto *RHSIntrinsic = dyn_cast<IntrinsicInst>(SI.getFalseValue());
515 if (!RHSIntrinsic ||
516 LHSIntrinsic->getIntrinsicID() != RHSIntrinsic->getIntrinsicID() ||
517 !LHSIntrinsic->hasOneUse() || !RHSIntrinsic->hasOneUse())
518 return nullptr;
519
520 const Intrinsic::ID IID = LHSIntrinsic->getIntrinsicID();
521 switch (IID) {
522 case Intrinsic::abs:
523 case Intrinsic::cttz:
524 case Intrinsic::ctlz: {
525 auto *TZ = cast<ConstantInt>(LHSIntrinsic->getArgOperand(1));
526 auto *FZ = cast<ConstantInt>(RHSIntrinsic->getArgOperand(1));
527
528 Value *TV = LHSIntrinsic->getArgOperand(0);
529 Value *FV = RHSIntrinsic->getArgOperand(0);
530
531 Value *NewSel = Builder.CreateSelect(SI.getCondition(), TV, FV, "", &SI);
532 Value *NewPoisonFlag = Builder.CreateAnd(TZ, FZ);
533 Value *NewCall = Builder.CreateBinaryIntrinsic(IID, NewSel, NewPoisonFlag);
534
535 return replaceInstUsesWith(SI, NewCall);
536 }
537 case Intrinsic::ctpop: {
538 Value *TV = LHSIntrinsic->getArgOperand(0);
539 Value *FV = RHSIntrinsic->getArgOperand(0);
540
541 Value *NewSel = Builder.CreateSelect(SI.getCondition(), TV, FV, "", &SI);
542 Value *NewCall = Builder.CreateUnaryIntrinsic(IID, NewSel);
543
544 return replaceInstUsesWith(SI, NewCall);
545 }
546 default:
547 return nullptr;
548 }
549}
550
551static bool isSelect01(const APInt &C1I, const APInt &C2I) {
552 if (!C1I.isZero() && !C2I.isZero()) // One side must be zero.
553 return false;
554 return C1I.isOne() || C1I.isAllOnes() || C2I.isOne() || C2I.isAllOnes();
555}
556
557/// Try to fold the select into one of the operands to allow further
558/// optimization.
560 Value *FalseVal) {
561 // See the comment above getSelectFoldableOperands for a description of the
562 // transformation we are doing here.
563 auto TryFoldSelectIntoOp = [&](SelectInst &SI, Value *TrueVal,
564 Value *FalseVal,
565 bool Swapped) -> Instruction * {
566 auto *TVI = dyn_cast<BinaryOperator>(TrueVal);
567 if (!TVI || !TVI->hasOneUse() || isa<Constant>(FalseVal))
568 return nullptr;
569
570 unsigned SFO = getSelectFoldableOperands(TVI);
571 unsigned OpToFold = 0;
572 if ((SFO & 1) && FalseVal == TVI->getOperand(0))
573 OpToFold = 1;
574 else if ((SFO & 2) && FalseVal == TVI->getOperand(1))
575 OpToFold = 2;
576
577 if (!OpToFold)
578 return nullptr;
579
580 FastMathFlags FMF;
581 if (const auto *FPO = dyn_cast<FPMathOperator>(&SI))
582 FMF = FPO->getFastMathFlags();
584 TVI->getOpcode(), TVI->getType(), true, FMF.noSignedZeros());
585 Value *OOp = TVI->getOperand(2 - OpToFold);
586 // Avoid creating select between 2 constants unless it's selecting
587 // between 0, 1 and -1.
588 const APInt *OOpC;
589 bool OOpIsAPInt = match(OOp, m_APInt(OOpC));
590 if (isa<Constant>(OOp) &&
591 (!OOpIsAPInt || !isSelect01(C->getUniqueInteger(), *OOpC)))
592 return nullptr;
593
594 // If the false value is a NaN then we have that the floating point math
595 // operation in the transformed code may not preserve the exact NaN
596 // bit-pattern -- e.g. `fadd sNaN, 0.0 -> qNaN`.
597 // This makes the transformation incorrect since the original program would
598 // have preserved the exact NaN bit-pattern.
599 // Avoid the folding if the false value might be a NaN.
600 if (isa<FPMathOperator>(&SI) &&
601 !computeKnownFPClass(FalseVal, FMF, fcNan, SQ.getWithInstruction(&SI))
603 return nullptr;
604
605 Value *NewSel = Builder.CreateSelect(SI.getCondition(), Swapped ? C : OOp,
606 Swapped ? OOp : C, "", &SI);
607 if (isa<FPMathOperator>(&SI)) {
608 FastMathFlags NewSelFMF = FMF;
609 // We cannot propagate ninf from the original select, because OOp may be
610 // inf and the flag only guarantees that FalseVal (op OOp) is never
611 // infinity.
612 // Examples: -inf + +inf = NaN, -inf - -inf = NaN, 0 * inf = NaN
613 // Specifically, if the original select has both ninf and nnan, we can
614 // safely propagate the flag.
615 // Note: This property holds for fadd, fsub, and fmul, but does not
616 // hold for fdiv (e.g. A / Inf == 0.0).
617 bool CanInferFiniteOperandsFromResult =
618 TVI->getOpcode() == Instruction::FAdd ||
619 TVI->getOpcode() == Instruction::FSub ||
620 TVI->getOpcode() == Instruction::FMul;
621 NewSelFMF.setNoInfs(TVI->hasNoInfs() ||
622 (CanInferFiniteOperandsFromResult &&
623 NewSelFMF.noInfs() && NewSelFMF.noNaNs()));
624 cast<Instruction>(NewSel)->setFastMathFlags(NewSelFMF);
625 }
626 NewSel->takeName(TVI);
627 BinaryOperator *BO =
628 BinaryOperator::Create(TVI->getOpcode(), FalseVal, NewSel);
629 BO->copyIRFlags(TVI);
630 if (isa<FPMathOperator>(&SI)) {
631 // Merge poison generating flags from the select.
632 BO->setHasNoNaNs(BO->hasNoNaNs() && FMF.noNaNs());
633 BO->setHasNoInfs(BO->hasNoInfs() && FMF.noInfs());
634 // Merge no-signed-zeros flag from the select.
635 // Otherwise we may produce zeros with different sign.
637 }
638 return BO;
639 };
640
641 if (Instruction *R = TryFoldSelectIntoOp(SI, TrueVal, FalseVal, false))
642 return R;
643
644 if (Instruction *R = TryFoldSelectIntoOp(SI, FalseVal, TrueVal, true))
645 return R;
646
647 return nullptr;
648}
649
651 Value *FVal,
653 const SimplifyQuery &SQ) {
654 Value *CmpLHS = Cmp->getOperand(0);
655 Value *CmpRHS = Cmp->getOperand(1);
656 ICmpInst::Predicate Pred = Cmp->getPredicate();
657 if (match(FVal, m_Zero())) {
658 std::swap(TVal, FVal);
660 }
661 if (!match(TVal, m_Zero()))
662 return nullptr;
663
664 if (Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE) {
665 std::swap(CmpLHS, CmpRHS);
667 }
668
669 // Handles:
670 // (X <= Y) ? 0 : (X - Y)
671 // (X <= Y) ? (Y - X) : 0
672 // (X >= Y) ? 0 : (Y - X)
673 // (X >= Y) ? (X - Y) : 0
674 if ((Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE) &&
675 match(FVal, m_NSWSub(m_Specific(CmpLHS), m_Specific(CmpRHS))) &&
676 isGuaranteedNotToBeUndef(CmpLHS, SQ.AC, SQ.CtxI, SQ.DT)) {
677 Value *SMin =
678 Builder.CreateBinaryIntrinsic(Intrinsic::smin, CmpRHS, CmpLHS);
679 return Builder.CreateNSWSub(CmpLHS, SMin);
680 }
681
682 return nullptr;
683}
684
685/// Try to fold a select to a min/max intrinsic. Many cases are already handled
686/// by matchDecomposedSelectPattern but here we handle the cases where more
687/// extensive modification of the IR is required.
688static Value *foldSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal,
689 Value *FVal,
691 const SimplifyQuery &SQ) {
692 Value *CmpLHS = Cmp->getOperand(0);
693 Value *CmpRHS = Cmp->getOperand(1);
694 ICmpInst::Predicate Pred = Cmp->getPredicate();
695
696 if (Value *V = canoncalizeSelectICmpMinMax(Cmp, TVal, FVal, Builder, SQ))
697 return V;
698
699 // (X > Y) ? X : (Y - 1) ==> MIN(X, Y - 1)
700 // (X < Y) ? X : (Y + 1) ==> MAX(X, Y + 1)
701 // This transformation is valid when overflow corresponding to the sign of
702 // the comparison is poison and we must drop the non-matching overflow flag.
703 if (CmpRHS == TVal) {
704 std::swap(CmpLHS, CmpRHS);
705 Pred = CmpInst::getSwappedPredicate(Pred);
706 }
707
708 // TODO: consider handling 'or disjoint' as well, though these would need to
709 // be converted to 'add' instructions.
710 if (!(CmpLHS == TVal && isa<Instruction>(FVal)))
711 return nullptr;
712
713 if (Pred == CmpInst::ICMP_SGT &&
714 match(FVal, m_NSWAdd(m_Specific(CmpRHS), m_One()))) {
715 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
716 return Builder.CreateBinaryIntrinsic(Intrinsic::smax, TVal, FVal);
717 }
718
719 if (Pred == CmpInst::ICMP_SLT &&
720 match(FVal, m_NSWAdd(m_Specific(CmpRHS), m_AllOnes()))) {
721 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
722 return Builder.CreateBinaryIntrinsic(Intrinsic::smin, TVal, FVal);
723 }
724
725 if (Pred == CmpInst::ICMP_UGT &&
726 match(FVal, m_NUWAdd(m_Specific(CmpRHS), m_One()))) {
727 cast<Instruction>(FVal)->setHasNoSignedWrap(false);
728 return Builder.CreateBinaryIntrinsic(Intrinsic::umax, TVal, FVal);
729 }
730
731 // Note: We must use isKnownNonZero here because "sub nuw %x, 1" will be
732 // canonicalized to "add %x, -1" discarding the nuw flag.
733 if (Pred == CmpInst::ICMP_ULT &&
734 match(FVal, m_Add(m_Specific(CmpRHS), m_AllOnes())) &&
735 isKnownNonZero(CmpRHS, SQ)) {
736 cast<Instruction>(FVal)->setHasNoSignedWrap(false);
737 cast<Instruction>(FVal)->setHasNoUnsignedWrap(false);
738 return Builder.CreateBinaryIntrinsic(Intrinsic::umin, TVal, FVal);
739 }
740
741 return nullptr;
742}
743
744/// We want to turn:
745/// (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1)
746/// into:
747/// zext (icmp ne i32 (and X, (or Y, (shl 1, Z))), 0)
748/// Note:
749/// Z may be 0 if lshr is missing.
750/// Worst-case scenario is that we will replace 5 instructions with 5 different
751/// instructions, but we got rid of select.
753 Value *TVal, Value *FVal,
754 InstCombiner::BuilderTy &Builder) {
755 Value *A, *X, *Y, *Z;
756 CmpPredicate Pred;
757 unsigned NumReplaced = 1 + Cond->hasOneUse();
758 if (match(Cond, m_Trunc(m_Value(X)))) {
759 Y = ConstantInt::get(X->getType(), 1);
760 Pred = ICmpInst::ICMP_NE;
761 } else if (match(Cond,
762 m_ICmp(Pred, m_And(m_Value(X), m_Value(Y)), m_Zero())) &&
763 ICmpInst::isEquality(Pred)) {
764 NumReplaced +=
765 Cond->hasOneUse() && cast<ICmpInst>(Cond)->getOperand(0)->hasOneUse();
766 } else
767 return nullptr;
768
769 if (Pred == ICmpInst::ICMP_NE)
770 std::swap(TVal, FVal);
771
772 if (!match(FVal, m_One()))
773 return nullptr;
774
775 // The TrueVal has general form of: and %B, 1
776 if (!match(TVal, m_And(m_Value(A), m_One())))
777 return nullptr;
778
780 SelType->getScalarSizeInBits());
781 auto TValPattern = m_CombineOr(
782 m_Deferred(X),
785
786 if (!match(A, TValPattern)) {
787 std::swap(X, Y);
788 if (!match(A, TValPattern))
789 return nullptr;
790 }
791
792 bool HasShift = A != X;
793 if (TVal->hasOneUse())
794 NumReplaced += 1 + (HasShift && A->hasOneUse());
795
796 if (NumReplaced < (4u - isa<Constant>(Y)))
797 return nullptr;
798
799 // ((X & Y) == 0) ? ((X >> Z) & 1) : 1 --> (X & (Y | (1 << Z))) != 0
800 // ((X & Y) == 0) ? (X & 1) : 1 --> (X & (Y | 1)) != 0
801 Constant *One = ConstantInt::get(SelType, 1);
802 Value *MaskB = HasShift ? Builder.CreateShl(One, Z) : One;
803 Value *FullMask = Builder.CreateOr(Y, MaskB);
804 Value *MaskedX = Builder.CreateAnd(X, FullMask);
805 Value *ICmpNeZero = Builder.CreateIsNotNull(MaskedX);
806 return new ZExtInst(ICmpNeZero, SelType);
807}
808
809/// We want to turn:
810/// (select (icmp eq (and X, C1), 0), 0, (shl [nsw/nuw] X, C2));
811/// iff C1 is a mask and the number of its leading zeros is equal to C2
812/// into:
813/// shl X, C2
815 Value *FVal,
816 InstCombiner::BuilderTy &Builder) {
817 CmpPredicate Pred;
818 Value *AndVal;
819 if (!match(Cmp, m_ICmp(Pred, m_Value(AndVal), m_Zero())))
820 return nullptr;
821
822 if (Pred == ICmpInst::ICMP_NE) {
823 Pred = ICmpInst::ICMP_EQ;
824 std::swap(TVal, FVal);
825 }
826
827 Value *X;
828 const APInt *C2, *C1;
829 if (Pred != ICmpInst::ICMP_EQ ||
830 !match(AndVal, m_And(m_Value(X), m_APInt(C1))) ||
831 !match(TVal, m_Zero()) || !match(FVal, m_Shl(m_Specific(X), m_APInt(C2))))
832 return nullptr;
833
834 if (!C1->isMask() ||
835 C1->countLeadingZeros() != static_cast<unsigned>(C2->getZExtValue()))
836 return nullptr;
837
838 auto *FI = dyn_cast<Instruction>(FVal);
839 if (!FI)
840 return nullptr;
841
842 FI->setHasNoSignedWrap(false);
843 FI->setHasNoUnsignedWrap(false);
844 return FVal;
845}
846
847/// We want to turn:
848/// (select (icmp sgt x, C), lshr (X, Y), ashr (X, Y)); iff C s>= -1
849/// (select (icmp slt x, C), ashr (X, Y), lshr (X, Y)); iff C s>= 0
850/// into:
851/// ashr (X, Y)
852static Value *foldSelectICmpLshrAshr(const ICmpInst *IC, Value *TrueVal,
853 Value *FalseVal,
854 InstCombiner::BuilderTy &Builder) {
856 Value *CmpLHS = IC->getOperand(0);
857 Value *CmpRHS = IC->getOperand(1);
858 if (!CmpRHS->getType()->isIntOrIntVectorTy())
859 return nullptr;
860
861 Value *X, *Y;
862 unsigned Bitwidth = CmpRHS->getType()->getScalarSizeInBits();
863 if ((Pred != ICmpInst::ICMP_SGT ||
865 APInt::getAllOnes(Bitwidth)))) &&
866 (Pred != ICmpInst::ICMP_SLT ||
868 APInt::getZero(Bitwidth)))))
869 return nullptr;
870
871 // Canonicalize so that ashr is in FalseVal.
872 if (Pred == ICmpInst::ICMP_SLT)
873 std::swap(TrueVal, FalseVal);
874
875 if (match(TrueVal, m_LShr(m_Value(X), m_Value(Y))) &&
876 match(FalseVal, m_AShr(m_Specific(X), m_Specific(Y))) &&
877 match(CmpLHS, m_Specific(X))) {
878 const auto *Ashr = cast<Instruction>(FalseVal);
879 // if lshr is not exact and ashr is, this new ashr must not be exact.
880 bool IsExact = Ashr->isExact() && cast<Instruction>(TrueVal)->isExact();
881 return Builder.CreateAShr(X, Y, IC->getName(), IsExact);
882 }
883
884 return nullptr;
885}
886
887/// We want to turn:
888/// (select (icmp eq (and X, C1), 0), Y, (BinOp Y, C2))
889/// into:
890/// IF C2 u>= C1
891/// (BinOp Y, (shl (and X, C1), C3))
892/// ELSE
893/// (BinOp Y, (lshr (and X, C1), C3))
894/// iff:
895/// 0 on the RHS is the identity value (i.e add, xor, shl, etc...)
896/// C1 and C2 are both powers of 2
897/// where:
898/// IF C2 u>= C1
899/// C3 = Log(C2) - Log(C1)
900/// ELSE
901/// C3 = Log(C1) - Log(C2)
902///
903/// This transform handles cases where:
904/// 1. The icmp predicate is inverted
905/// 2. The select operands are reversed
906/// 3. The magnitude of C2 and C1 are flipped
907static Value *foldSelectICmpAndBinOp(Value *CondVal, Value *TrueVal,
908 Value *FalseVal, Value *V,
909 const APInt &AndMask, bool CreateAnd,
910 InstCombiner::BuilderTy &Builder) {
911 // Only handle integer compares.
912 if (!TrueVal->getType()->isIntOrIntVectorTy())
913 return nullptr;
914
915 unsigned C1Log = AndMask.logBase2();
916 Value *Y;
917 BinaryOperator *BinOp;
918 const APInt *C2;
919 bool NeedXor;
920 if (match(FalseVal, m_BinOp(m_Specific(TrueVal), m_Power2(C2)))) {
921 Y = TrueVal;
922 BinOp = cast<BinaryOperator>(FalseVal);
923 NeedXor = false;
924 } else if (match(TrueVal, m_BinOp(m_Specific(FalseVal), m_Power2(C2)))) {
925 Y = FalseVal;
926 BinOp = cast<BinaryOperator>(TrueVal);
927 NeedXor = true;
928 } else {
929 return nullptr;
930 }
931
932 // Check that 0 on RHS is identity value for this binop.
933 auto *IdentityC =
935 /*AllowRHSConstant*/ true);
936 if (IdentityC == nullptr || !IdentityC->isNullValue())
937 return nullptr;
938
939 unsigned C2Log = C2->logBase2();
940
941 bool NeedShift = C1Log != C2Log;
942 bool NeedZExtTrunc = Y->getType()->getScalarSizeInBits() !=
943 V->getType()->getScalarSizeInBits();
944
945 // the demanded bits for the created shl make the and redundant
946 if (AndMask.isOne() && C2->isSignBitSet())
947 CreateAnd = false;
948
949 // Make sure we don't create more instructions than we save.
950 if ((NeedShift + NeedXor + NeedZExtTrunc + CreateAnd) >
951 (CondVal->hasOneUse() + BinOp->hasOneUse()))
952 return nullptr;
953
954 if (CreateAnd) {
955 // Insert the AND instruction on the input to the truncate.
956 V = Builder.CreateAnd(V, ConstantInt::get(V->getType(), AndMask));
957 }
958
959 if (C2Log > C1Log) {
960 V = Builder.CreateZExtOrTrunc(V, Y->getType());
961 V = Builder.CreateShl(V, C2Log - C1Log);
962 } else if (C1Log > C2Log) {
963 V = Builder.CreateLShr(V, C1Log - C2Log);
964 V = Builder.CreateZExtOrTrunc(V, Y->getType());
965 } else
966 V = Builder.CreateZExtOrTrunc(V, Y->getType());
967
968 if (NeedXor)
969 V = Builder.CreateXor(V, *C2);
970
971 auto *Res = Builder.CreateBinOp(BinOp->getOpcode(), Y, V);
972 if (auto *BO = dyn_cast<BinaryOperator>(Res))
973 BO->copyIRFlags(BinOp);
974 return Res;
975}
976
977/// Canonicalize a set or clear of a masked set of constant bits to
978/// select-of-constants form.
980 InstCombiner::BuilderTy &Builder) {
981 Value *Cond = Sel.getCondition();
982 Value *T = Sel.getTrueValue();
983 Value *F = Sel.getFalseValue();
984 Type *Ty = Sel.getType();
985 Value *X;
986 const APInt *NotC, *C;
987
988 // Cond ? (X & ~C) : (X | C) --> (X & ~C) | (Cond ? 0 : C)
989 if (match(T, m_And(m_Value(X), m_APInt(NotC))) &&
990 match(F, m_OneUse(m_Or(m_Specific(X), m_APInt(C)))) && *NotC == ~(*C)) {
992 Constant *OrC = ConstantInt::get(Ty, *C);
993 Value *NewSel = Builder.CreateSelect(Cond, Zero, OrC, "masksel", &Sel);
994 return BinaryOperator::CreateOr(T, NewSel);
995 }
996
997 // Cond ? (X | C) : (X & ~C) --> (X & ~C) | (Cond ? C : 0)
998 if (match(F, m_And(m_Value(X), m_APInt(NotC))) &&
999 match(T, m_OneUse(m_Or(m_Specific(X), m_APInt(C)))) && *NotC == ~(*C)) {
1001 Constant *OrC = ConstantInt::get(Ty, *C);
1002 Value *NewSel = Builder.CreateSelect(Cond, OrC, Zero, "masksel", &Sel);
1003 return BinaryOperator::CreateOr(F, NewSel);
1004 }
1005
1006 return nullptr;
1007}
1008
1009// select (x == 0), 0, x * y --> freeze(y) * x
1010// select (y == 0), 0, x * y --> freeze(x) * y
1011// select (x == 0), undef, x * y --> freeze(y) * x
1012// select (x == undef), 0, x * y --> freeze(y) * x
1013// Usage of mul instead of 0 will make the result more poisonous,
1014// so the operand that was not checked in the condition should be frozen.
1015// The latter folding is applied only when a constant compared with x is
1016// is a vector consisting of 0 and undefs. If a constant compared with x
1017// is a scalar undefined value or undefined vector then an expression
1018// should be already folded into a constant.
1019//
1020// This also holds all operations such that Op(0) == 0
1021// e.g. Shl, Umin, etc
1023 InstCombinerImpl &IC) {
1024 auto *CondVal = SI.getCondition();
1025 auto *TrueVal = SI.getTrueValue();
1026 auto *FalseVal = SI.getFalseValue();
1027 Value *X, *Y;
1029
1030 // Assuming that constant compared with zero is not undef (but it may be
1031 // a vector with some undef elements). Otherwise (when a constant is undef)
1032 // the select expression should be already simplified.
1033 if (!match(CondVal, m_ICmp(Predicate, m_Value(X), m_Zero())) ||
1035 return nullptr;
1036
1038 std::swap(TrueVal, FalseVal);
1039
1040 // Check that TrueVal is a constant instead of matching it with m_Zero()
1041 // to handle the case when it is a scalar undef value or a vector containing
1042 // non-zero elements that are masked by undef elements in the compare
1043 // constant.
1044 auto *TrueValC = dyn_cast<Constant>(TrueVal);
1045 if (TrueValC == nullptr || !isa<Instruction>(FalseVal))
1046 return nullptr;
1047
1048 bool FreezeY;
1049 if (match(FalseVal, m_c_Mul(m_Specific(X), m_Value(Y))) ||
1050 match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
1051 match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
1052 match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
1053 match(FalseVal,
1055 FreezeY = true;
1056 } else if (match(FalseVal, m_IDiv(m_Specific(X), m_Value(Y))) ||
1057 match(FalseVal, m_IRem(m_Specific(X), m_Value(Y)))) {
1058 FreezeY = false;
1059 } else {
1060 return nullptr;
1061 }
1062
1063 auto *ZeroC = cast<Constant>(cast<Instruction>(CondVal)->getOperand(1));
1064 auto *MergedC = Constant::mergeUndefsWith(TrueValC, ZeroC);
1065 // If X is compared with 0 then TrueVal could be either zero or undef.
1066 // m_Zero match vectors containing some undef elements, but for scalars
1067 // m_Undef should be used explicitly.
1068 if (!match(MergedC, m_Zero()) && !match(MergedC, m_Undef()))
1069 return nullptr;
1070
1071 auto *FalseValI = cast<Instruction>(FalseVal);
1072 if (FreezeY) {
1073 auto *FrY = IC.InsertNewInstBefore(new FreezeInst(Y, Y->getName() + ".fr"),
1074 FalseValI->getIterator());
1075 IC.replaceOperand(*FalseValI,
1076 FalseValI->getOperand(0) == Y
1077 ? 0
1078 : (FalseValI->getOperand(1) == Y ? 1 : 2),
1079 FrY);
1080 }
1081 return IC.replaceInstUsesWith(SI, FalseValI);
1082}
1083
1084/// Transform patterns such as (a > b) ? a - b : 0 into usub.sat(a, b).
1085/// There are 8 commuted/swapped variants of this pattern.
1086static Value *
1088 const Value *FalseVal,
1089 InstCombiner::BuilderTy &Builder) {
1090 ICmpInst::Predicate Pred = ICI->getPredicate();
1091 Value *A = ICI->getOperand(0);
1092 Value *B = ICI->getOperand(1);
1093
1094 // (b > a) ? 0 : a - b -> (b <= a) ? a - b : 0
1095 // (a == 0) ? 0 : a - 1 -> (a != 0) ? a - 1 : 0
1096 if (match(TrueVal, m_Zero())) {
1097 Pred = ICmpInst::getInversePredicate(Pred);
1098 std::swap(TrueVal, FalseVal);
1099 }
1100
1101 if (!match(FalseVal, m_Zero()))
1102 return nullptr;
1103
1104 // ugt 0 is canonicalized to ne 0 and requires special handling
1105 // (a != 0) ? a + -1 : 0 -> usub.sat(a, 1)
1106 if (Pred == ICmpInst::ICMP_NE) {
1107 if (match(B, m_Zero()) && match(TrueVal, m_Add(m_Specific(A), m_AllOnes())))
1108 return Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A,
1109 ConstantInt::get(A->getType(), 1));
1110 return nullptr;
1111 }
1112
1113 if (!ICmpInst::isUnsigned(Pred))
1114 return nullptr;
1115
1116 if (Pred == ICmpInst::ICMP_ULE || Pred == ICmpInst::ICMP_ULT) {
1117 // (b < a) ? a - b : 0 -> (a > b) ? a - b : 0
1118 std::swap(A, B);
1119 Pred = ICmpInst::getSwappedPredicate(Pred);
1120 }
1121
1122 assert((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_UGT) &&
1123 "Unexpected isUnsigned predicate!");
1124
1125 // Ensure the sub is of the form:
1126 // (a > b) ? a - b : 0 -> usub.sat(a, b)
1127 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
1128 // Checking for both a-b and a+(-b) as a constant.
1129 bool IsNegative = false;
1130 const APInt *C;
1131 if (match(TrueVal, m_Sub(m_Specific(B), m_Specific(A))) ||
1132 (match(A, m_APInt(C)) &&
1133 match(TrueVal, m_Add(m_Specific(B), m_SpecificInt(-*C)))))
1134 IsNegative = true;
1135 else if (!match(TrueVal, m_Sub(m_Specific(A), m_Specific(B))) &&
1136 !(match(B, m_APInt(C)) &&
1137 match(TrueVal, m_Add(m_Specific(A), m_SpecificInt(-*C)))))
1138 return nullptr;
1139
1140 // If we are adding a negate and the sub and icmp are used anywhere else, we
1141 // would end up with more instructions.
1142 if (IsNegative && !TrueVal->hasOneUse() && !ICI->hasOneUse())
1143 return nullptr;
1144
1145 // (a > b) ? a - b : 0 -> usub.sat(a, b)
1146 // (a > b) ? b - a : 0 -> -usub.sat(a, b)
1147 Value *Result = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A, B);
1148 if (IsNegative)
1149 Result = Builder.CreateNeg(Result);
1150 return Result;
1151}
1152
1153static Value *
1155 const Value *FalseVal,
1156 InstCombiner::BuilderTy &Builder) {
1157 ICmpInst::Predicate Pred = ICI->getPredicate();
1158 Value *CmpLHS = ICI->getOperand(0);
1159 Value *CmpRHS = ICI->getOperand(1);
1160
1161 // `A != B ? X : Y` --> `A == B ? Y : X`
1162 // This canonicalization allows us to handle more patterns with fewer checks.
1163 if (Pred == ICmpInst::ICMP_NE) {
1164 Pred = ICmpInst::ICMP_EQ;
1165 std::swap(TrueVal, FalseVal);
1166 }
1167
1168 // `A == MIN_INT ? MAX_INT : 0 - A` --> `ssub_sat 0, A`
1169 if (Pred == ICmpInst::ICMP_EQ && match(CmpRHS, m_SignMask()) &&
1170 match(TrueVal, m_MaxSignedValue()) &&
1171 match(FalseVal, m_Neg(m_Specific(CmpLHS)))) {
1172 return Builder.CreateBinaryIntrinsic(
1173 Intrinsic::ssub_sat, ConstantInt::getNullValue(CmpLHS->getType()),
1174 CmpLHS);
1175 }
1176
1177 return nullptr;
1178}
1179
1181 const Value *TrueVal,
1182 const Value *FalseVal,
1183 InstCombiner::BuilderTy &Builder) {
1184 if (Value *V = canonicalizeSaturatedSubtractUnsigned(ICI, TrueVal, FalseVal,
1185 Builder))
1186 return V;
1187
1188 if (Value *V =
1189 canonicalizeSaturatedSubtractSigned(ICI, TrueVal, FalseVal, Builder))
1190 return V;
1191
1192 return nullptr;
1193}
1194
1195static Value *
1197 InstCombiner::BuilderTy &Builder) {
1198
1199 // Match unsigned saturated add with constant.
1200 Value *Cmp0 = Cmp->getOperand(0);
1201 Value *Cmp1 = Cmp->getOperand(1);
1202 ICmpInst::Predicate Pred = Cmp->getPredicate();
1203 Value *X;
1204 const APInt *C;
1205
1206 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
1207 // There are 8 commuted variants.
1208 // Canonicalize -1 (saturated result) to true value of the select.
1209 if (match(FVal, m_AllOnes())) {
1210 std::swap(TVal, FVal);
1211 Pred = CmpInst::getInversePredicate(Pred);
1212 }
1213 if (!match(TVal, m_AllOnes()))
1214 return nullptr;
1215
1216 // uge -1 is canonicalized to eq -1 and requires special handling
1217 // (a == -1) ? -1 : a + 1 -> uadd.sat(a, 1)
1218 if (Pred == ICmpInst::ICMP_EQ) {
1219 if (match(FVal, m_Add(m_Specific(Cmp0), m_One())) &&
1220 match(Cmp1, m_AllOnes())) {
1221 return Builder.CreateBinaryIntrinsic(
1222 Intrinsic::uadd_sat, Cmp0, ConstantInt::get(Cmp0->getType(), 1));
1223 }
1224 return nullptr;
1225 }
1226
1227 if ((Pred == ICmpInst::ICMP_UGE || Pred == ICmpInst::ICMP_UGT) &&
1228 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1229 match(Cmp1, m_SpecificIntAllowPoison(~*C))) {
1230 // (X u> ~C) ? -1 : (X + C) --> uadd.sat(X, C)
1231 // (X u>= ~C)? -1 : (X + C) --> uadd.sat(X, C)
1232 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1233 ConstantInt::get(Cmp0->getType(), *C));
1234 }
1235
1236 // Negative one does not work here because X u> -1 ? -1, X + -1 is not a
1237 // saturated add.
1238 if (Pred == ICmpInst::ICMP_UGT &&
1239 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1240 match(Cmp1, m_SpecificIntAllowPoison(~*C - 1)) && !C->isAllOnes()) {
1241 // (X u> ~C - 1) ? -1 : (X + C) --> uadd.sat(X, C)
1242 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1243 ConstantInt::get(Cmp0->getType(), *C));
1244 }
1245
1246 // Zero does not work here because X u>= 0 ? -1 : X -> is always -1, which is
1247 // not a saturated add.
1248 if (Pred == ICmpInst::ICMP_UGE &&
1249 match(FVal, m_Add(m_Specific(Cmp0), m_APIntAllowPoison(C))) &&
1250 match(Cmp1, m_SpecificIntAllowPoison(-*C)) && !C->isZero()) {
1251 // (X u >= -C) ? -1 : (X + C) --> uadd.sat(X, C)
1252 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp0,
1253 ConstantInt::get(Cmp0->getType(), *C));
1254 }
1255
1256 // Canonicalize predicate to less-than or less-or-equal-than.
1257 if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_UGE) {
1258 std::swap(Cmp0, Cmp1);
1259 Pred = CmpInst::getSwappedPredicate(Pred);
1260 }
1261 if (Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_ULE)
1262 return nullptr;
1263
1264 // Match unsigned saturated add of 2 variables with an unnecessary 'not'.
1265 // Strictness of the comparison is irrelevant.
1266 Value *Y;
1267 if (match(Cmp0, m_Not(m_Value(X))) &&
1268 match(FVal, m_c_Add(m_Specific(X), m_Value(Y))) && Y == Cmp1) {
1269 // (~X u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
1270 // (~X u< Y) ? -1 : (Y + X) --> uadd.sat(X, Y)
1271 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, X, Y);
1272 }
1273 // The 'not' op may be included in the sum but not the compare.
1274 // Strictness of the comparison is irrelevant.
1275 X = Cmp0;
1276 Y = Cmp1;
1278 // (X u< Y) ? -1 : (~X + Y) --> uadd.sat(~X, Y)
1279 // (X u< Y) ? -1 : (Y + ~X) --> uadd.sat(Y, ~X)
1281 return Builder.CreateBinaryIntrinsic(
1282 Intrinsic::uadd_sat, BO->getOperand(0), BO->getOperand(1));
1283 }
1284 // The overflow may be detected via the add wrapping round.
1285 // This is only valid for strict comparison!
1286 if (Pred == ICmpInst::ICMP_ULT &&
1287 match(Cmp0, m_c_Add(m_Specific(Cmp1), m_Value(Y))) &&
1288 match(FVal, m_c_Add(m_Specific(Cmp1), m_Specific(Y)))) {
1289 // ((X + Y) u< X) ? -1 : (X + Y) --> uadd.sat(X, Y)
1290 // ((X + Y) u< Y) ? -1 : (X + Y) --> uadd.sat(X, Y)
1291 return Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat, Cmp1, Y);
1292 }
1293
1294 return nullptr;
1295}
1296
1298 Value *FVal,
1299 InstCombiner::BuilderTy &Builder) {
1300 // Match saturated add with constant.
1301 Value *Cmp0 = Cmp->getOperand(0);
1302 Value *Cmp1 = Cmp->getOperand(1);
1303 ICmpInst::Predicate Pred = Cmp->getPredicate();
1304
1305 // Canonicalize TVal to be the saturation constant.
1306 if (match(FVal, m_MaxSignedValue()) || match(FVal, m_SignMask())) {
1307 std::swap(TVal, FVal);
1308 Pred = CmpInst::getInversePredicate(Pred);
1309 }
1310
1311 const APInt *SatC;
1312 if (!match(TVal, m_APInt(SatC)) ||
1313 !(SatC->isMaxSignedValue() || SatC->isSignMask()))
1314 return nullptr;
1315
1316 bool IsMax = SatC->isMaxSignedValue();
1317
1318 // sge maximum signed value is canonicalized to eq maximum signed value and
1319 // requires special handling. sle minimum signed value is similarly
1320 // canonicalized to eq minimum signed value.
1321 if (Pred == ICmpInst::ICMP_EQ && Cmp1 == TVal) {
1322 // (a == INT_MAX) ? INT_MAX : a + 1 -> sadd.sat(a, 1)
1323 if (IsMax && match(FVal, m_Add(m_Specific(Cmp0), m_One()))) {
1324 return Builder.CreateBinaryIntrinsic(
1325 Intrinsic::sadd_sat, Cmp0, ConstantInt::get(Cmp0->getType(), 1));
1326 }
1327
1328 // (a == INT_MIN) ? INT_MIN : a + -1 -> sadd.sat(a, -1)
1329 if (!IsMax && match(FVal, m_Add(m_Specific(Cmp0), m_AllOnes()))) {
1330 return Builder.CreateBinaryIntrinsic(
1331 Intrinsic::sadd_sat, Cmp0,
1333 }
1334 return nullptr;
1335 }
1336
1337 const APInt *C;
1338
1339 // (X > Y) ? INT_MAX : (X + C) --> sadd.sat(X, C)
1340 // (X >= Y) ? INT_MAX : (X + C) --> sadd.sat(X, C)
1341 // where C > 0 and Y is INT_MAX - C or INT_MAX - C - 1
1342 if (IsMax && (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) &&
1343 isa<Constant>(Cmp1) &&
1344 match(FVal, m_Add(m_Specific(Cmp0), m_StrictlyPositive(C)))) {
1345 // Normalize SGE to SGT for threshold comparison.
1346 if (Pred == ICmpInst::ICMP_SGE) {
1348 Pred, cast<Constant>(Cmp1))) {
1349 Pred = Flipped->first;
1350 Cmp1 = Flipped->second;
1351 }
1352 }
1353 // Check: X > INT_MAX - C or X > INT_MAX - C - 1
1354 APInt Threshold = *SatC - *C;
1355 if (Pred == ICmpInst::ICMP_SGT &&
1356 (match(Cmp1, m_SpecificIntAllowPoison(Threshold)) ||
1357 match(Cmp1, m_SpecificIntAllowPoison(Threshold - 1))))
1358 return Builder.CreateBinaryIntrinsic(
1359 Intrinsic::sadd_sat, Cmp0, ConstantInt::get(Cmp0->getType(), *C));
1360 }
1361
1362 // (X < Y) ? INT_MIN : (X + C) --> sadd.sat(X, C)
1363 // (X <= Y) ? INT_MIN : (X + C) --> sadd.sat(X, C)
1364 // where C < 0 and Y is INT_MIN - C or INT_MIN - C + 1
1365 if (!IsMax && (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) &&
1366 isa<Constant>(Cmp1) &&
1367 match(FVal, m_Add(m_Specific(Cmp0), m_Negative(C)))) {
1368 // Normalize SLE to SLT for threshold comparison.
1369 if (Pred == ICmpInst::ICMP_SLE) {
1371 Pred, cast<Constant>(Cmp1))) {
1372 Pred = Flipped->first;
1373 Cmp1 = Flipped->second;
1374 }
1375 }
1376 // Check: X < INT_MIN - C or X < INT_MIN - C + 1
1377 // INT_MIN - C for negative C is like INT_MIN + |C|
1378 APInt Threshold = *SatC - *C;
1379 if (Pred == ICmpInst::ICMP_SLT &&
1380 (match(Cmp1, m_SpecificIntAllowPoison(Threshold)) ||
1381 match(Cmp1, m_SpecificIntAllowPoison(Threshold + 1))))
1382 return Builder.CreateBinaryIntrinsic(
1383 Intrinsic::sadd_sat, Cmp0, ConstantInt::get(Cmp0->getType(), *C));
1384 }
1385
1386 // Canonicalize predicate to less-than or less-or-equal-than.
1387 if (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE) {
1388 std::swap(Cmp0, Cmp1);
1389 Pred = CmpInst::getSwappedPredicate(Pred);
1390 }
1391
1392 if (Pred != ICmpInst::ICMP_SLT && Pred != ICmpInst::ICMP_SLE)
1393 return nullptr;
1394
1395 Value *X;
1396
1397 // (INT_MAX - X s< Y) ? INT_MAX : (X + Y) --> sadd.sat(X, Y)
1398 // (INT_MAX - X s< Y) ? INT_MAX : (Y + X) --> sadd.sat(X, Y)
1399 if (IsMax && match(Cmp0, m_NSWSub(m_SpecificInt(*SatC), m_Value(X))) &&
1400 match(FVal, m_c_Add(m_Specific(X), m_Specific(Cmp1)))) {
1401 return Builder.CreateBinaryIntrinsic(Intrinsic::sadd_sat, X, Cmp1);
1402 }
1403
1404 // (INT_MIN - X s> Y) ? INT_MIN : (X + Y) --> sadd.sat(X, Y)
1405 // (INT_MIN - X s> Y) ? INT_MIN : (Y + X) --> sadd.sat(X, Y)
1406 // After swapping operands from the SGT/SGE canonicalization above,
1407 // this becomes (Y s< INT_MIN - X).
1408 if (!IsMax && match(Cmp1, m_NSWSub(m_SpecificInt(*SatC), m_Value(X))) &&
1409 match(FVal, m_c_Add(m_Specific(X), m_Specific(Cmp0)))) {
1410 return Builder.CreateBinaryIntrinsic(Intrinsic::sadd_sat, X, Cmp0);
1411 }
1412
1413 return nullptr;
1414}
1415
1417 InstCombiner::BuilderTy &Builder) {
1418 if (!Cmp->hasOneUse())
1419 return nullptr;
1420
1421 if (Value *V = canonicalizeSaturatedAddUnsigned(Cmp, TVal, FVal, Builder))
1422 return V;
1423
1424 if (Value *V = canonicalizeSaturatedAddSigned(Cmp, TVal, FVal, Builder))
1425 return V;
1426
1427 return nullptr;
1428}
1429
1430/// Try to match patterns with select and subtract as absolute difference.
1431static Value *foldAbsDiff(ICmpInst *Cmp, Value *TVal, Value *FVal,
1432 InstCombiner::BuilderTy &Builder) {
1433 auto *TI = dyn_cast<Instruction>(TVal);
1434 auto *FI = dyn_cast<Instruction>(FVal);
1435 if (!TI || !FI)
1436 return nullptr;
1437
1438 // Normalize predicate to gt/lt rather than ge/le.
1439 ICmpInst::Predicate Pred = Cmp->getStrictPredicate();
1440 Value *A = Cmp->getOperand(0);
1441 Value *B = Cmp->getOperand(1);
1442
1443 // Normalize "A - B" as the true value of the select.
1444 if (match(FI, m_Sub(m_Specific(A), m_Specific(B)))) {
1445 std::swap(FI, TI);
1446 Pred = ICmpInst::getSwappedPredicate(Pred);
1447 }
1448
1449 // With any pair of no-wrap subtracts:
1450 // (A > B) ? (A - B) : (B - A) --> abs(A - B)
1451 if (Pred == CmpInst::ICMP_SGT &&
1452 match(TI, m_Sub(m_Specific(A), m_Specific(B))) &&
1453 match(FI, m_Sub(m_Specific(B), m_Specific(A))) &&
1454 (TI->hasNoSignedWrap() || TI->hasNoUnsignedWrap()) &&
1455 (FI->hasNoSignedWrap() || FI->hasNoUnsignedWrap())) {
1456 // The remaining subtract is not "nuw" any more.
1457 // If there's one use of the subtract (no other use than the use we are
1458 // about to replace), then we know that the sub is "nsw" in this context
1459 // even if it was only "nuw" before. If there's another use, then we can't
1460 // add "nsw" to the existing instruction because it may not be safe in the
1461 // other user's context.
1462 TI->setHasNoUnsignedWrap(false);
1463 if (!TI->hasNoSignedWrap())
1464 TI->setHasNoSignedWrap(TI->hasOneUse());
1465 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI, Builder.getTrue());
1466 }
1467
1468 // Match: (A > B) ? (A - B) : (0 - (A - B)) --> abs(A - B)
1469 if (Pred == CmpInst::ICMP_SGT &&
1471 match(FI, m_Neg(m_Specific(TI)))) {
1472 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI,
1473 Builder.getFalse());
1474 }
1475
1476 // Match: (A < B) ? (0 - (A - B)) : (A - B) --> abs(A - B)
1477 if (Pred == CmpInst::ICMP_SLT &&
1479 match(TI, m_Neg(m_Specific(FI)))) {
1480 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, FI,
1481 Builder.getFalse());
1482 }
1483
1484 // Match: (A > B) ? (0 - (B - A)) : (B - A) --> abs(B - A)
1485 if (Pred == CmpInst::ICMP_SGT &&
1487 match(TI, m_Neg(m_Specific(FI)))) {
1488 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, FI,
1489 Builder.getFalse());
1490 }
1491
1492 // Match: (A < B) ? (B - A) : (0 - (B - A)) --> abs(B - A)
1493 if (Pred == CmpInst::ICMP_SLT &&
1495 match(FI, m_Neg(m_Specific(TI)))) {
1496 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, TI,
1497 Builder.getFalse());
1498 }
1499
1500 return nullptr;
1501}
1502
1503/// Fold the following code sequence:
1504/// \code
1505/// int a = ctlz(x & -x);
1506// x ? 31 - a : 32;
1507/// \code
1508///
1509/// into:
1510/// cttz(x)
1511static Instruction *foldSelectCtlzToCttz(ICmpInst *ICI, Value *TrueVal,
1512 Value *FalseVal,
1513 InstCombiner::BuilderTy &Builder) {
1514 unsigned BitWidth = TrueVal->getType()->getScalarSizeInBits();
1515 if (!ICI->isEquality() || !match(ICI->getOperand(1), m_Zero()))
1516 return nullptr;
1517
1518 if (ICI->getPredicate() == ICmpInst::ICMP_NE)
1519 std::swap(TrueVal, FalseVal);
1520
1521 Value *Ctlz;
1522 if (match(FalseVal,
1524 if (!isPowerOf2_32(BitWidth))
1525 return nullptr;
1526 } else if (!match(FalseVal, m_Sub(m_SpecificIntAllowPoison(BitWidth - 1),
1527 m_Value(Ctlz)))) {
1528 return nullptr;
1529 }
1530
1531 if (!match(Ctlz, m_Ctlz(m_Value(), m_Value())))
1532 return nullptr;
1533
1534 if (!match(TrueVal, m_SpecificInt(BitWidth)))
1535 return nullptr;
1536
1537 Value *X = ICI->getOperand(0);
1538 auto *II = cast<IntrinsicInst>(Ctlz);
1539 if (!match(II->getOperand(0), m_c_And(m_Specific(X), m_Neg(m_Specific(X)))))
1540 return nullptr;
1541
1542 // The original select returns the constant bitwidth when x == 0, so the
1543 // result is defined there; the cttz must use is_zero_poison = false.
1545 II->getModule(), Intrinsic::cttz, II->getType());
1546 return CallInst::Create(F, {X, Builder.getFalse()});
1547}
1548
1549/// Attempt to fold a cttz/ctlz followed by a icmp plus select into a single
1550/// call to cttz/ctlz with flag 'is_zero_poison' cleared.
1551///
1552/// For example, we can fold the following code sequence:
1553/// \code
1554/// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 true)
1555/// %1 = icmp ne i32 %x, 0
1556/// %2 = select i1 %1, i32 %0, i32 32
1557/// \code
1558///
1559/// into:
1560/// %0 = tail call i32 @llvm.cttz.i32(i32 %x, i1 false)
1561static Value *foldSelectCttzCtlz(ICmpInst *ICI, Value *TrueVal, Value *FalseVal,
1562 InstCombinerImpl &IC) {
1563 ICmpInst::Predicate Pred = ICI->getPredicate();
1564 Value *CmpLHS = ICI->getOperand(0);
1565 Value *CmpRHS = ICI->getOperand(1);
1566
1567 // Check if the select condition compares a value for equality.
1568 if (!ICI->isEquality())
1569 return nullptr;
1570
1571 Value *SelectArg = FalseVal;
1572 Value *ValueOnZero = TrueVal;
1573 if (Pred == ICmpInst::ICMP_NE)
1574 std::swap(SelectArg, ValueOnZero);
1575
1576 // Skip zero extend/truncate.
1577 Value *Count = nullptr;
1578 if (!match(SelectArg, m_ZExt(m_Value(Count))) &&
1579 !match(SelectArg, m_Trunc(m_Value(Count))))
1580 Count = SelectArg;
1581
1582 // Check that 'Count' is a call to intrinsic cttz/ctlz. Also check that the
1583 // input to the cttz/ctlz is used as LHS for the compare instruction.
1584 Value *X;
1585 if (!match(Count, m_Cttz(m_Value(X), m_Value())) &&
1587 return nullptr;
1588
1589 // (X == 0) ? BitWidth : ctz(X)
1590 // (X == -1) ? BitWidth : ctz(~X)
1591 // (X == Y) ? BitWidth : ctz(X ^ Y)
1592 if ((X != CmpLHS || !match(CmpRHS, m_Zero())) &&
1593 (!match(X, m_Not(m_Specific(CmpLHS))) || !match(CmpRHS, m_AllOnes())) &&
1594 !match(X, m_c_Xor(m_Specific(CmpLHS), m_Specific(CmpRHS))))
1595 return nullptr;
1596
1598
1599 // Check if the value propagated on zero is a constant number equal to the
1600 // sizeof in bits of 'Count'.
1601 unsigned SizeOfInBits = Count->getType()->getScalarSizeInBits();
1602 if (match(ValueOnZero, m_SpecificInt(SizeOfInBits))) {
1603 // A range annotation on the intrinsic may no longer be valid.
1604 II->dropPoisonGeneratingAnnotations();
1605 IC.addToWorklist(II);
1606 return SelectArg;
1607 }
1608
1609 // The ValueOnZero is not the bitwidth. But if the cttz/ctlz (and optional
1610 // zext/trunc) have one use (ending at the select), the cttz/ctlz result will
1611 // not be used if the input is zero. Relax to 'zero is poison' for that case.
1612 if (II->hasOneUse() && SelectArg->hasOneUse() &&
1613 !match(II->getArgOperand(1), m_One())) {
1614 II->setArgOperand(1, ConstantInt::getTrue(II->getContext()));
1615 // noundef attribute on the intrinsic may no longer be valid.
1616 II->dropUBImplyingAttrsAndMetadata();
1617 IC.addToWorklist(II);
1618 }
1619
1620 return nullptr;
1621}
1622
1623static Value *canonicalizeSPF(ICmpInst &Cmp, Value *TrueVal, Value *FalseVal,
1624 InstCombinerImpl &IC) {
1625 Value *LHS, *RHS;
1626 // TODO: What to do with pointer min/max patterns?
1627 if (!TrueVal->getType()->isIntOrIntVectorTy())
1628 return nullptr;
1629
1631 matchDecomposedSelectPattern(&Cmp, TrueVal, FalseVal, LHS, RHS).Flavor;
1632 if (SPF == SelectPatternFlavor::SPF_ABS ||
1634 if (!Cmp.hasOneUse() && !RHS->hasOneUse())
1635 return nullptr; // TODO: Relax this restriction.
1636
1637 // Note that NSW flag can only be propagated for normal, non-negated abs!
1638 bool IntMinIsPoison = SPF == SelectPatternFlavor::SPF_ABS &&
1640 Constant *IntMinIsPoisonC =
1641 ConstantInt::get(Type::getInt1Ty(Cmp.getContext()), IntMinIsPoison);
1642 Value *Abs =
1643 IC.Builder.CreateBinaryIntrinsic(Intrinsic::abs, LHS, IntMinIsPoisonC);
1644
1646 return IC.Builder.CreateNeg(Abs); // Always without NSW flag!
1647 return Abs;
1648 }
1649
1651 Intrinsic::ID IntrinsicID = getMinMaxIntrinsic(SPF);
1652 return IC.Builder.CreateBinaryIntrinsic(IntrinsicID, LHS, RHS);
1653 }
1654
1655 return nullptr;
1656}
1657
1659 unsigned Depth) {
1660 // Conservatively limit replacement to two instructions upwards.
1661 if (Depth == 2)
1662 return false;
1663
1664 assert(!isa<Constant>(Old) && "Only replace non-constant values");
1665
1666 auto *I = dyn_cast<Instruction>(V);
1667 if (!I || !I->hasOneUse() ||
1669 return false;
1670
1671 // Forbid potentially lane-crossing instructions.
1672 if (Old->getType()->isVectorTy() && !isNotCrossLaneOperation(I))
1673 return false;
1674
1675 bool Changed = false;
1676 for (Use &U : I->operands()) {
1677 if (U == Old) {
1678 replaceUse(U, New);
1679 Worklist.add(I);
1680 Changed = true;
1681 } else {
1682 Changed |= replaceInInstruction(U, Old, New, Depth + 1);
1683 }
1684 }
1685 return Changed;
1686}
1687
1688/// If we have a select with an equality comparison, then we know the value in
1689/// one of the arms of the select. See if substituting this value into an arm
1690/// and simplifying the result yields the same value as the other arm.
1691///
1692/// To make this transform safe, we must drop poison-generating flags
1693/// (nsw, etc) if we simplified to a binop because the select may be guarding
1694/// that poison from propagating. If the existing binop already had no
1695/// poison-generating flags, then this transform can be done by instsimplify.
1696///
1697/// Consider:
1698/// %cmp = icmp eq i32 %x, 2147483647
1699/// %add = add nsw i32 %x, 1
1700/// %sel = select i1 %cmp, i32 -2147483648, i32 %add
1701///
1702/// We can't replace %sel with %add unless we strip away the flags.
1703/// TODO: Wrapping flags could be preserved in some cases with better analysis.
1705 CmpInst &Cmp) {
1706 // Canonicalize the pattern to an equivalence on the predicate by swapping the
1707 // select operands.
1708 Value *TrueVal = Sel.getTrueValue(), *FalseVal = Sel.getFalseValue();
1709 bool Swapped = false;
1710 if (Cmp.isEquivalence(/*Invert=*/true)) {
1711 std::swap(TrueVal, FalseVal);
1712 Swapped = true;
1713 } else if (!Cmp.isEquivalence()) {
1714 return nullptr;
1715 }
1716
1717 Value *CmpLHS = Cmp.getOperand(0), *CmpRHS = Cmp.getOperand(1);
1718 auto ReplaceOldOpWithNewOp = [&](Value *OldOp,
1719 Value *NewOp) -> Instruction * {
1720 // In X == Y ? f(X) : Z, try to evaluate f(Y) and replace the operand.
1721 // Take care to avoid replacing X == Y ? X : Z with X == Y ? Y : Z, as that
1722 // would lead to an infinite replacement cycle.
1723 // If we will be able to evaluate f(Y) to a constant, we can allow undef,
1724 // otherwise Y cannot be undef as we might pick different values for undef
1725 // in the cmp and in f(Y).
1726 if (TrueVal == OldOp && (isa<Constant>(OldOp) || !isa<Constant>(NewOp)))
1727 return nullptr;
1728
1729 if (Value *V = simplifyWithOpReplaced(TrueVal, OldOp, NewOp, SQ,
1730 /* AllowRefinement=*/true)) {
1731 // Need some guarantees about the new simplified op to ensure we don't inf
1732 // loop.
1733 // If we simplify to a constant, replace if we aren't creating new undef.
1734 if (match(V, m_ImmConstant()) &&
1735 isGuaranteedNotToBeUndef(V, SQ.AC, &Sel, &DT))
1736 return replaceOperand(Sel, Swapped ? 2 : 1, V);
1737
1738 // If NewOp is a constant and OldOp is not replace iff NewOp doesn't
1739 // contain and undef elements.
1740 // Make sure that V is always simpler than TrueVal, otherwise we might
1741 // end up in an infinite loop.
1742 if (match(NewOp, m_ImmConstant()) ||
1743 (isa<Instruction>(TrueVal) &&
1744 is_contained(cast<Instruction>(TrueVal)->operands(), V))) {
1745 if (isGuaranteedNotToBeUndef(NewOp, SQ.AC, &Sel, &DT))
1746 return replaceOperand(Sel, Swapped ? 2 : 1, V);
1747 return nullptr;
1748 }
1749 }
1750
1751 // Even if TrueVal does not simplify, we can directly replace a use of
1752 // CmpLHS with CmpRHS, as long as the instruction is not used anywhere
1753 // else and is safe to speculatively execute (we may end up executing it
1754 // with different operands, which should not cause side-effects or trigger
1755 // undefined behavior). Only do this if CmpRHS is a constant, as
1756 // profitability is not clear for other cases.
1757 if (OldOp == CmpLHS && match(NewOp, m_ImmConstant()) &&
1758 !match(OldOp, m_Constant()) &&
1759 isGuaranteedNotToBeUndef(NewOp, SQ.AC, &Sel, &DT))
1760 if (replaceInInstruction(TrueVal, OldOp, NewOp))
1761 return &Sel;
1762 return nullptr;
1763 };
1764
1765 bool CanReplaceCmpLHSWithRHS = canReplacePointersIfEqual(CmpLHS, CmpRHS, DL);
1766 if (CanReplaceCmpLHSWithRHS) {
1767 if (Instruction *R = ReplaceOldOpWithNewOp(CmpLHS, CmpRHS))
1768 return R;
1769 }
1770 bool CanReplaceCmpRHSWithLHS = canReplacePointersIfEqual(CmpRHS, CmpLHS, DL);
1771 if (CanReplaceCmpRHSWithLHS) {
1772 if (Instruction *R = ReplaceOldOpWithNewOp(CmpRHS, CmpLHS))
1773 return R;
1774 }
1775
1776 auto *FalseInst = dyn_cast<Instruction>(FalseVal);
1777 if (!FalseInst)
1778 return nullptr;
1779
1780 // InstSimplify already performed this fold if it was possible subject to
1781 // current poison-generating flags. Check whether dropping poison-generating
1782 // flags enables the transform.
1783
1784 // Try each equivalence substitution possibility.
1785 // We have an 'EQ' comparison, so the select's false value will propagate.
1786 // Example:
1787 // (X == 42) ? 43 : (X + 1) --> (X == 42) ? (X + 1) : (X + 1) --> X + 1
1788 SmallVector<Instruction *> DropFlags;
1789 if ((CanReplaceCmpLHSWithRHS &&
1790 simplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, SQ,
1791 /* AllowRefinement */ false,
1792 &DropFlags) == TrueVal) ||
1793 (CanReplaceCmpRHSWithLHS &&
1794 simplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, SQ,
1795 /* AllowRefinement */ false,
1796 &DropFlags) == TrueVal)) {
1797 for (Instruction *I : DropFlags) {
1798 I->dropPoisonGeneratingAnnotations();
1799 Worklist.add(I);
1800 }
1801
1802 return replaceInstUsesWith(Sel, FalseVal);
1803 }
1804
1805 Constant *CmpC;
1806 if (FalseVal->getType()->isIntOrIntVectorTy(1) &&
1807 match(FalseVal, m_NUWTrunc(m_Specific(CmpLHS))) &&
1808 match(CmpRHS, m_ImmConstant(CmpC)) &&
1811 ConstantInt::getNullValue(CmpLHS->getType()), DL) == TrueVal) {
1812 return new ICmpInst(CmpInst::Predicate::ICMP_NE, CmpLHS,
1814 }
1815
1816 return nullptr;
1817}
1818
1819/// Fold the following code sequence:
1820/// \code
1821/// %XeqZ = icmp eq i64 %X, %Z
1822/// %YeqZ = icmp eq i64 %Y, %Z
1823/// %XeqY = icmp eq i64 %X, %Y
1824/// %not.YeqZ = xor i1 %YeqZ, true
1825/// %and = select i1 %not.YeqZ, i1 %XeqY, i1 false
1826/// %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and
1827/// \code
1828///
1829/// into:
1830/// %equal = icmp eq i64 %X, %Y
1832 Value *X, *Y, *Z;
1833 Value *XeqY, *XeqZ = Sel.getCondition(), *YeqZ = Sel.getTrueValue();
1834
1836 return nullptr;
1837
1838 if (!match(YeqZ,
1840 std::swap(X, Z);
1841
1842 if (!match(YeqZ,
1844 return nullptr;
1845
1846 if (!match(Sel.getFalseValue(),
1847 m_c_LogicalAnd(m_Not(m_Specific(YeqZ)), m_Value(XeqY))))
1848 return nullptr;
1849
1850 if (!match(XeqY,
1852 return nullptr;
1853
1854 cast<ICmpInst>(XeqY)->setSameSign(false);
1855 return replaceInstUsesWith(Sel, XeqY);
1856}
1857
1858// See if this is a pattern like:
1859// %old_cmp1 = icmp slt i32 %x, C2
1860// %old_replacement = select i1 %old_cmp1, i32 %target_low, i32 %target_high
1861// %old_x_offseted = add i32 %x, C1
1862// %old_cmp0 = icmp ult i32 %old_x_offseted, C0
1863// %r = select i1 %old_cmp0, i32 %x, i32 %old_replacement
1864// This can be rewritten as more canonical pattern:
1865// %new_cmp1 = icmp slt i32 %x, -C1
1866// %new_cmp2 = icmp sge i32 %x, C0-C1
1867// %new_clamped_low = select i1 %new_cmp1, i32 %target_low, i32 %x
1868// %r = select i1 %new_cmp2, i32 %target_high, i32 %new_clamped_low
1869// Iff -C1 s<= C2 s<= C0-C1
1870// Also ULT predicate can also be UGT iff C0 != -1 (+invert result)
1871// SLT predicate can also be SGT iff C2 != INT_MAX (+invert res.)
1872static Value *canonicalizeClampLike(SelectInst &Sel0, ICmpInst &Cmp0,
1873 InstCombiner::BuilderTy &Builder,
1874 InstCombiner &IC) {
1875 Value *X = Sel0.getTrueValue();
1876 Value *Sel1 = Sel0.getFalseValue();
1877
1878 // First match the condition of the outermost select.
1879 // Said condition must be one-use.
1880 if (!Cmp0.hasOneUse())
1881 return nullptr;
1882 ICmpInst::Predicate Pred0 = Cmp0.getPredicate();
1883 Value *Cmp00 = Cmp0.getOperand(0);
1884 Constant *C0;
1885 if (!match(Cmp0.getOperand(1),
1887 return nullptr;
1888
1889 if (!match(Sel1, m_SelectLike(m_Value(), m_Value(), m_Value()))) {
1890 Pred0 = ICmpInst::getInversePredicate(Pred0);
1891 std::swap(X, Sel1);
1892 }
1893
1894 // Canonicalize Cmp0 into ult or uge.
1895 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1896 switch (Pred0) {
1899 // Although icmp ult %x, 0 is an unusual thing to try and should generally
1900 // have been simplified, it does not verify with undef inputs so ensure we
1901 // are not in a strange state.
1902 if (!match(C0, m_SpecificInt_ICMP(
1905 return nullptr;
1906 break; // Great!
1909 // We want to canonicalize it to 'ult' or 'uge', so we'll need to increment
1910 // C0, which again means it must not have any all-ones elements.
1911 if (!match(C0,
1915 return nullptr; // Can't do, have all-ones element[s].
1917 C0 = InstCombiner::AddOne(C0);
1918 break;
1919 default:
1920 return nullptr; // Unknown predicate.
1921 }
1922
1923 // Now that we've canonicalized the ICmp, we know the X we expect;
1924 // the select in other hand should be one-use.
1925 if (!Sel1->hasOneUse())
1926 return nullptr;
1927
1928 // If the types do not match, look through any truncs to the underlying
1929 // instruction.
1930 if (Cmp00->getType() != X->getType() && X->hasOneUse())
1932
1933 // We now can finish matching the condition of the outermost select:
1934 // it should either be the X itself, or an addition of some constant to X.
1935 Constant *C1;
1936 if (Cmp00 == X)
1937 C1 = ConstantInt::getNullValue(X->getType());
1938 else if (!match(Cmp00,
1941 return nullptr;
1942
1943 Value *Cmp1;
1944 CmpPredicate Pred1;
1945 Constant *C2;
1946 Value *ReplacementLow, *ReplacementHigh;
1947 if (!match(Sel1, m_SelectLike(m_Value(Cmp1), m_Value(ReplacementLow),
1948 m_Value(ReplacementHigh))) ||
1949 !match(Cmp1,
1950 m_ICmp(Pred1, m_Specific(X),
1952 return nullptr;
1953
1954 if (!Cmp1->hasOneUse() && (Cmp00 == X || !Cmp00->hasOneUse()))
1955 return nullptr; // Not enough one-use instructions for the fold.
1956 // FIXME: this restriction could be relaxed if Cmp1 can be reused as one of
1957 // two comparisons we'll need to build.
1958
1959 // Canonicalize Cmp1 into the form we expect.
1960 // FIXME: we shouldn't care about lanes that are 'undef' in the end?
1961 switch (Pred1) {
1963 break;
1965 // We'd have to increment C2 by one, and for that it must not have signed
1966 // max element, but then it would have been canonicalized to 'slt' before
1967 // we get here. So we can't do anything useful with 'sle'.
1968 return nullptr;
1970 // We want to canonicalize it to 'slt', so we'll need to increment C2,
1971 // which again means it must not have any signed max elements.
1972 if (!match(C2,
1975 C2->getType()->getScalarSizeInBits()))))
1976 return nullptr; // Can't do, have signed max element[s].
1977 C2 = InstCombiner::AddOne(C2);
1978 [[fallthrough]];
1980 // Also non-canonical, but here we don't need to change C2,
1981 // so we don't have any restrictions on C2, so we can just handle it.
1983 std::swap(ReplacementLow, ReplacementHigh);
1984 break;
1985 default:
1986 return nullptr; // Unknown predicate.
1987 }
1989 "Unexpected predicate type.");
1990
1991 // The thresholds of this clamp-like pattern.
1992 auto *ThresholdLowIncl = ConstantExpr::getNeg(C1);
1993 auto *ThresholdHighExcl = ConstantExpr::getSub(C0, C1);
1994
1997 "Unexpected predicate type.");
1998 if (Pred0 == ICmpInst::Predicate::ICMP_UGE)
1999 std::swap(ThresholdLowIncl, ThresholdHighExcl);
2000
2001 // The fold has a precondition 1: C2 s>= ThresholdLow
2002 auto *Precond1 = ConstantFoldCompareInstOperands(
2003 ICmpInst::Predicate::ICMP_SGE, C2, ThresholdLowIncl, IC.getDataLayout());
2004 if (!Precond1 || !match(Precond1, m_One()))
2005 return nullptr;
2006 // The fold has a precondition 2: C2 s<= ThresholdHigh
2007 auto *Precond2 = ConstantFoldCompareInstOperands(
2008 ICmpInst::Predicate::ICMP_SLE, C2, ThresholdHighExcl, IC.getDataLayout());
2009 if (!Precond2 || !match(Precond2, m_One()))
2010 return nullptr;
2011
2012 // If we are matching from a truncated input, we need to sext the
2013 // ReplacementLow and ReplacementHigh values. Only do the transform if they
2014 // are free to extend due to being constants.
2015 if (X->getType() != Sel0.getType()) {
2016 Constant *LowC, *HighC;
2017 if (!match(ReplacementLow, m_ImmConstant(LowC)) ||
2018 !match(ReplacementHigh, m_ImmConstant(HighC)))
2019 return nullptr;
2020 const DataLayout &DL = Sel0.getDataLayout();
2021 ReplacementLow =
2022 ConstantFoldCastOperand(Instruction::SExt, LowC, X->getType(), DL);
2023 ReplacementHigh =
2024 ConstantFoldCastOperand(Instruction::SExt, HighC, X->getType(), DL);
2025 assert(ReplacementLow && ReplacementHigh &&
2026 "Constant folding of ImmConstant cannot fail");
2027 }
2028
2029 // All good, finally emit the new pattern.
2030 Value *ShouldReplaceLow = Builder.CreateICmpSLT(X, ThresholdLowIncl);
2031 Value *ShouldReplaceHigh = Builder.CreateICmpSGE(X, ThresholdHighExcl);
2032 Value *MaybeReplacedLow =
2033 Builder.CreateSelect(ShouldReplaceLow, ReplacementLow, X);
2034
2035 // Create the final select. If we looked through a truncate above, we will
2036 // need to retruncate the result.
2037 Value *MaybeReplacedHigh = Builder.CreateSelect(
2038 ShouldReplaceHigh, ReplacementHigh, MaybeReplacedLow);
2039 return Builder.CreateTrunc(MaybeReplacedHigh, Sel0.getType());
2040}
2041
2042// If we have
2043// %cmp = icmp [canonical predicate] i32 %x, C0
2044// %r = select i1 %cmp, i32 %y, i32 C1
2045// Where C0 != C1 and %x may be different from %y, see if the constant that we
2046// will have if we flip the strictness of the predicate (i.e. without changing
2047// the result) is identical to the C1 in select. If it matches we can change
2048// original comparison to one with swapped predicate, reuse the constant,
2049// and swap the hands of select.
2050static Instruction *
2051tryToReuseConstantFromSelectInComparison(SelectInst &Sel, ICmpInst &Cmp,
2052 InstCombinerImpl &IC) {
2053 CmpPredicate Pred;
2054 Value *X;
2055 Constant *C0;
2056 if (!match(&Cmp, m_OneUse(m_ICmp(
2057 Pred, m_Value(X),
2059 return nullptr;
2060
2061 // If comparison predicate is non-relational, we won't be able to do anything.
2062 if (ICmpInst::isEquality(Pred))
2063 return nullptr;
2064
2065 // If comparison predicate is non-canonical, then we certainly won't be able
2066 // to make it canonical; canonicalizeCmpWithConstant() already tried.
2068 return nullptr;
2069
2070 // If the [input] type of comparison and select type are different, lets abort
2071 // for now. We could try to compare constants with trunc/[zs]ext though.
2072 if (C0->getType() != Sel.getType())
2073 return nullptr;
2074
2075 // ULT with 'add' of a constant is canonical. See foldICmpAddConstant().
2076 // FIXME: Are there more magic icmp predicate+constant pairs we must avoid?
2077 // Or should we just abandon this transform entirely?
2078 if (Pred == CmpInst::ICMP_ULT && match(X, m_Add(m_Value(), m_Constant())))
2079 return nullptr;
2080
2081
2082 Value *SelVal0, *SelVal1; // We do not care which one is from where.
2083 match(&Sel, m_Select(m_Value(), m_Value(SelVal0), m_Value(SelVal1)));
2084 // At least one of these values we are selecting between must be a constant
2085 // else we'll never succeed.
2086 if (!match(SelVal0, m_AnyIntegralConstant()) &&
2087 !match(SelVal1, m_AnyIntegralConstant()))
2088 return nullptr;
2089
2090 // Does this constant C match any of the `select` values?
2091 auto MatchesSelectValue = [SelVal0, SelVal1](Constant *C) {
2092 return C->isElementWiseEqual(SelVal0) || C->isElementWiseEqual(SelVal1);
2093 };
2094
2095 // If C0 *already* matches true/false value of select, we are done.
2096 if (MatchesSelectValue(C0))
2097 return nullptr;
2098
2099 // Check the constant we'd have with flipped-strictness predicate.
2100 auto FlippedStrictness = getFlippedStrictnessPredicateAndConstant(Pred, C0);
2101 if (!FlippedStrictness)
2102 return nullptr;
2103
2104 // If said constant doesn't match either, then there is no hope,
2105 if (!MatchesSelectValue(FlippedStrictness->second))
2106 return nullptr;
2107
2108 // It matched! Lets insert the new comparison just before select.
2110 IC.Builder.SetInsertPoint(&Sel);
2111
2112 Pred = ICmpInst::getSwappedPredicate(Pred); // Yes, swapped.
2113 Value *NewCmp = IC.Builder.CreateICmp(Pred, X, FlippedStrictness->second,
2114 Cmp.getName() + ".inv");
2115 IC.replaceOperand(Sel, 0, NewCmp);
2116 Sel.swapValues();
2117 Sel.swapProfMetadata();
2118
2119 return &Sel;
2120}
2121
2122static Instruction *foldSelectZeroOrOnes(ICmpInst *Cmp, Value *TVal,
2123 Value *FVal,
2124 InstCombiner::BuilderTy &Builder) {
2125 if (!Cmp->hasOneUse())
2126 return nullptr;
2127
2128 const APInt *CmpC;
2129 if (!match(Cmp->getOperand(1), m_APIntAllowPoison(CmpC)))
2130 return nullptr;
2131
2132 // (X u< 2) ? -X : -1 --> sext (X != 0)
2133 Value *X = Cmp->getOperand(0);
2134 if (Cmp->getPredicate() == ICmpInst::ICMP_ULT && *CmpC == 2 &&
2135 match(TVal, m_Neg(m_Specific(X))) && match(FVal, m_AllOnes()))
2136 return new SExtInst(Builder.CreateIsNotNull(X), TVal->getType());
2137
2138 // (X u> 1) ? -1 : -X --> sext (X != 0)
2139 if (Cmp->getPredicate() == ICmpInst::ICMP_UGT && *CmpC == 1 &&
2140 match(FVal, m_Neg(m_Specific(X))) && match(TVal, m_AllOnes()))
2141 return new SExtInst(Builder.CreateIsNotNull(X), TVal->getType());
2142
2143 return nullptr;
2144}
2145
2146static Value *foldSelectInstWithICmpConst(SelectInst &SI, ICmpInst *ICI,
2147 InstCombiner::BuilderTy &Builder) {
2148 const APInt *CmpC;
2149 Value *V;
2150 CmpPredicate Pred;
2151 if (!match(ICI, m_ICmp(Pred, m_Value(V), m_APInt(CmpC))))
2152 return nullptr;
2153
2154 // Match clamp away from min/max value as a max/min operation.
2155 Value *TVal = SI.getTrueValue();
2156 Value *FVal = SI.getFalseValue();
2157 if (Pred == ICmpInst::ICMP_EQ && V == FVal) {
2158 // (V == UMIN) ? UMIN+1 : V --> umax(V, UMIN+1)
2159 if (CmpC->isMinValue() && match(TVal, m_SpecificInt(*CmpC + 1)))
2160 return Builder.CreateBinaryIntrinsic(Intrinsic::umax, V, TVal);
2161 // (V == UMAX) ? UMAX-1 : V --> umin(V, UMAX-1)
2162 if (CmpC->isMaxValue() && match(TVal, m_SpecificInt(*CmpC - 1)))
2163 return Builder.CreateBinaryIntrinsic(Intrinsic::umin, V, TVal);
2164 // (V == SMIN) ? SMIN+1 : V --> smax(V, SMIN+1)
2165 if (CmpC->isMinSignedValue() && match(TVal, m_SpecificInt(*CmpC + 1)))
2166 return Builder.CreateBinaryIntrinsic(Intrinsic::smax, V, TVal);
2167 // (V == SMAX) ? SMAX-1 : V --> smin(V, SMAX-1)
2168 if (CmpC->isMaxSignedValue() && match(TVal, m_SpecificInt(*CmpC - 1)))
2169 return Builder.CreateBinaryIntrinsic(Intrinsic::smin, V, TVal);
2170 }
2171
2172 // Fold icmp(X) ? f(X) : C to f(X) when f(X) is guaranteed to be equal to C
2173 // for all X in the exact range of the inverse predicate.
2174 Instruction *Op;
2175 const APInt *C;
2176 CmpInst::Predicate CPred;
2178 CPred = ICI->getPredicate();
2179 else if (match(&SI, m_Select(m_Specific(ICI), m_Instruction(Op), m_APInt(C))))
2180 CPred = ICI->getInversePredicate();
2181 else
2182 return nullptr;
2183
2184 ConstantRange InvDomCR = ConstantRange::makeExactICmpRegion(CPred, *CmpC);
2185 const APInt *OpC;
2186 if (match(Op, m_BinOp(m_Specific(V), m_APInt(OpC)))) {
2187 ConstantRange R = InvDomCR.binaryOp(
2188 static_cast<Instruction::BinaryOps>(Op->getOpcode()), *OpC);
2189 if (R == *C) {
2190 Op->dropPoisonGeneratingFlags();
2191 return Op;
2192 }
2193 }
2194 if (auto *MMI = dyn_cast<MinMaxIntrinsic>(Op);
2195 MMI && MMI->getLHS() == V && match(MMI->getRHS(), m_APInt(OpC))) {
2196 ConstantRange R = ConstantRange::intrinsic(MMI->getIntrinsicID(),
2197 {InvDomCR, ConstantRange(*OpC)});
2198 if (R == *C) {
2199 MMI->dropPoisonGeneratingAnnotations();
2200 return MMI;
2201 }
2202 }
2203
2204 return nullptr;
2205}
2206
2207/// `A == MIN_INT ? B != MIN_INT : A < B` --> `A < B`
2208/// `A == MAX_INT ? B != MAX_INT : A > B` --> `A > B`
2209static Instruction *foldSelectWithExtremeEqCond(Value *CmpLHS, Value *CmpRHS,
2210 Value *TrueVal,
2211 Value *FalseVal) {
2212 Type *Ty = CmpLHS->getType();
2213
2214 if (Ty->isPtrOrPtrVectorTy())
2215 return nullptr;
2216
2217 CmpPredicate Pred;
2218 Value *B;
2219
2220 if (!match(FalseVal, m_c_ICmp(Pred, m_Specific(CmpLHS), m_Value(B))))
2221 return nullptr;
2222
2223 Value *TValRHS;
2225 m_Value(TValRHS))))
2226 return nullptr;
2227
2228 APInt C;
2229 unsigned BitWidth = Ty->getScalarSizeInBits();
2230
2231 if (ICmpInst::isLT(Pred)) {
2234 } else if (ICmpInst::isGT(Pred)) {
2237 } else {
2238 return nullptr;
2239 }
2240
2241 if (!match(CmpRHS, m_SpecificInt(C)) || !match(TValRHS, m_SpecificInt(C)))
2242 return nullptr;
2243
2244 return new ICmpInst(Pred, CmpLHS, B);
2245}
2246
2247static Instruction *foldSelectICmpEq(SelectInst &SI, ICmpInst *ICI,
2248 InstCombinerImpl &IC) {
2249 ICmpInst::Predicate Pred = ICI->getPredicate();
2250 if (!ICmpInst::isEquality(Pred))
2251 return nullptr;
2252
2253 Value *TrueVal = SI.getTrueValue();
2254 Value *FalseVal = SI.getFalseValue();
2255 Value *CmpLHS = ICI->getOperand(0);
2256 Value *CmpRHS = ICI->getOperand(1);
2257
2258 if (Pred == ICmpInst::ICMP_NE)
2259 std::swap(TrueVal, FalseVal);
2260
2261 if (Instruction *Res =
2262 foldSelectWithExtremeEqCond(CmpLHS, CmpRHS, TrueVal, FalseVal))
2263 return Res;
2264
2265 return nullptr;
2266}
2267
2268/// Fold `X Pred C1 ? X BOp C2 : C1 BOp C2` to `min/max(X, C1) BOp C2`.
2269/// This allows for better canonicalization.
2271 Value *TrueVal,
2272 Value *FalseVal) {
2273 Constant *C1, *C2, *C3;
2274 Value *X;
2275 CmpPredicate Predicate;
2276
2277 if (!match(Cmp, m_ICmp(Predicate, m_Value(X), m_Constant(C1))))
2278 return nullptr;
2279
2280 if (!ICmpInst::isRelational(Predicate))
2281 return nullptr;
2282
2283 if (match(TrueVal, m_Constant())) {
2284 std::swap(FalseVal, TrueVal);
2286 }
2287
2288 if (!match(FalseVal, m_Constant(C3)) || !TrueVal->hasOneUse())
2289 return nullptr;
2290
2291 bool IsIntrinsic;
2292 unsigned Opcode;
2293 if (BinaryOperator *BOp = dyn_cast<BinaryOperator>(TrueVal)) {
2294 Opcode = BOp->getOpcode();
2295 IsIntrinsic = false;
2296
2297 // This fold causes some regressions and is primarily intended for
2298 // add and sub. So we early exit for div and rem to minimize the
2299 // regressions.
2300 if (Instruction::isIntDivRem(Opcode))
2301 return nullptr;
2302
2303 if (!match(BOp, m_BinOp(m_Specific(X), m_Constant(C2))))
2304 return nullptr;
2305
2306 } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(TrueVal)) {
2307 if (!match(II, m_MaxOrMin(m_Specific(X), m_Constant(C2))))
2308 return nullptr;
2309 Opcode = II->getIntrinsicID();
2310 IsIntrinsic = true;
2311 } else {
2312 return nullptr;
2313 }
2314
2315 Value *RHS;
2317 const DataLayout &DL = Cmp->getDataLayout();
2318 auto Flipped = getFlippedStrictnessPredicateAndConstant(Predicate, C1);
2319
2320 auto FoldBinaryOpOrIntrinsic = [&](Constant *LHS, Constant *RHS) {
2321 return IsIntrinsic
2322 ? ConstantFoldIntrinsic(Opcode, {LHS, RHS}, LHS->getType(), DL)
2324 };
2325
2326 if (C3 == FoldBinaryOpOrIntrinsic(C1, C2)) {
2327 SPF = getSelectPattern(Predicate).Flavor;
2328 RHS = C1;
2329 } else if (Flipped && C3 == FoldBinaryOpOrIntrinsic(Flipped->second, C2)) {
2330 SPF = getSelectPattern(Flipped->first).Flavor;
2331 RHS = Flipped->second;
2332 } else {
2333 return nullptr;
2334 }
2335
2336 Intrinsic::ID MinMaxID = getMinMaxIntrinsic(SPF);
2337 Value *MinMax = Builder.CreateBinaryIntrinsic(MinMaxID, X, RHS);
2338 if (IsIntrinsic)
2339 return Builder.CreateBinaryIntrinsic(Opcode, MinMax, C2);
2340
2341 const auto BinOpc = Instruction::BinaryOps(Opcode);
2342 Value *BinOp = Builder.CreateBinOp(BinOpc, MinMax, C2);
2343
2344 // If we can attach no-wrap flags to the new instruction, do so if the
2345 // old instruction had them and C1 BinOp C2 does not overflow.
2346 if (Instruction *BinOpInst = dyn_cast<Instruction>(BinOp)) {
2347 if (BinOpc == Instruction::Add || BinOpc == Instruction::Sub ||
2348 BinOpc == Instruction::Mul) {
2349 Instruction *OldBinOp = cast<BinaryOperator>(TrueVal);
2350 if (OldBinOp->hasNoSignedWrap() &&
2351 willNotOverflow(BinOpc, RHS, C2, *BinOpInst, /*IsSigned=*/true))
2352 BinOpInst->setHasNoSignedWrap();
2353 if (OldBinOp->hasNoUnsignedWrap() &&
2354 willNotOverflow(BinOpc, RHS, C2, *BinOpInst, /*IsSigned=*/false))
2355 BinOpInst->setHasNoUnsignedWrap();
2356 }
2357 }
2358 return BinOp;
2359}
2360
2361/// Folds:
2362/// %a_sub = call @llvm.usub.sat(x, IntConst1)
2363/// %b_sub = call @llvm.usub.sat(y, IntConst2)
2364/// %or = or %a_sub, %b_sub
2365/// %cmp = icmp eq %or, 0
2366/// %sel = select %cmp, 0, MostSignificantBit
2367/// into:
2368/// %a_sub' = usub.sat(x, IntConst1 - MostSignificantBit)
2369/// %b_sub' = usub.sat(y, IntConst2 - MostSignificantBit)
2370/// %or = or %a_sub', %b_sub'
2371/// %and = and %or, MostSignificantBit
2372/// Likewise, for vector arguments as well.
2373static Instruction *foldICmpUSubSatWithAndForMostSignificantBitCmp(
2374 SelectInst &SI, ICmpInst *ICI, InstCombiner::BuilderTy &Builder) {
2375 if (!SI.hasOneUse() || !ICI->hasOneUse())
2376 return nullptr;
2377 CmpPredicate Pred;
2378 Value *A, *B;
2379 const APInt *Constant1, *Constant2;
2380 if (!match(SI.getCondition(),
2381 m_ICmp(Pred,
2383 m_Value(A), m_APInt(Constant1))),
2385 m_Value(B), m_APInt(Constant2))))),
2386 m_Zero())))
2387 return nullptr;
2388
2389 Value *TrueVal = SI.getTrueValue();
2390 Value *FalseVal = SI.getFalseValue();
2391 if (!((Pred == ICmpInst::ICMP_EQ && match(TrueVal, m_Zero()) &&
2392 match(FalseVal, m_SignMask())) ||
2393 (Pred == ICmpInst::ICMP_NE && match(TrueVal, m_SignMask()) &&
2394 match(FalseVal, m_Zero()))))
2395 return nullptr;
2396
2397 auto *Ty = A->getType();
2398 unsigned BW = Constant1->getBitWidth();
2399 APInt MostSignificantBit = APInt::getSignMask(BW);
2400
2401 // Anything over MSB is negative
2402 if (Constant1->isNonNegative() || Constant2->isNonNegative())
2403 return nullptr;
2404
2405 APInt AdjAP1 = *Constant1 - MostSignificantBit + 1;
2406 APInt AdjAP2 = *Constant2 - MostSignificantBit + 1;
2407
2408 auto *Adj1 = ConstantInt::get(Ty, AdjAP1);
2409 auto *Adj2 = ConstantInt::get(Ty, AdjAP2);
2410
2411 Value *NewA = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, A, Adj1);
2412 Value *NewB = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, B, Adj2);
2413 Value *Or = Builder.CreateOr(NewA, NewB);
2414 Constant *MSBConst = ConstantInt::get(Ty, MostSignificantBit);
2415 return BinaryOperator::CreateAnd(Or, MSBConst);
2416}
2417
2418/// Visit a SelectInst that has an ICmpInst as its first operand.
2420 ICmpInst *ICI) {
2421 if (Value *V =
2422 canonicalizeSPF(*ICI, SI.getTrueValue(), SI.getFalseValue(), *this))
2423 return replaceInstUsesWith(SI, V);
2424
2425 if (Value *V = foldSelectInstWithICmpConst(SI, ICI, Builder))
2426 return replaceInstUsesWith(SI, V);
2427
2428 if (Value *V = canonicalizeClampLike(SI, *ICI, Builder, *this))
2429 return replaceInstUsesWith(SI, V);
2430
2431 if (Instruction *NewSel =
2432 tryToReuseConstantFromSelectInComparison(SI, *ICI, *this))
2433 return NewSel;
2434 if (Instruction *Folded =
2435 foldICmpUSubSatWithAndForMostSignificantBitCmp(SI, ICI, Builder))
2436 return Folded;
2437
2438 // NOTE: if we wanted to, this is where to detect integer MIN/MAX
2439 bool Changed = false;
2440 Value *TrueVal = SI.getTrueValue();
2441 Value *FalseVal = SI.getFalseValue();
2442 ICmpInst::Predicate Pred = ICI->getPredicate();
2443 Value *CmpLHS = ICI->getOperand(0);
2444 Value *CmpRHS = ICI->getOperand(1);
2445
2446 if (Instruction *NewSel = foldSelectICmpEq(SI, ICI, *this))
2447 return NewSel;
2448
2449 // Canonicalize a signbit condition to use zero constant by swapping:
2450 // (CmpLHS > -1) ? TV : FV --> (CmpLHS < 0) ? FV : TV
2451 // To avoid conflicts (infinite loops) with other canonicalizations, this is
2452 // not applied with any constant select arm.
2453 if (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, m_AllOnes()) &&
2454 !match(TrueVal, m_Constant()) && !match(FalseVal, m_Constant()) &&
2455 ICI->hasOneUse()) {
2456 InstCombiner::BuilderTy::InsertPointGuard Guard(Builder);
2457 Builder.SetInsertPoint(&SI);
2458 Value *IsNeg = Builder.CreateIsNeg(CmpLHS, ICI->getName());
2459 replaceOperand(SI, 0, IsNeg);
2460 SI.swapValues();
2461 SI.swapProfMetadata();
2462 return &SI;
2463 }
2464
2465 if (Value *V = foldSelectICmpMinMax(ICI, TrueVal, FalseVal, Builder,
2466 SQ.getWithInstruction(&SI)))
2467 return replaceInstUsesWith(SI, V);
2468
2469 if (Value *V = foldSelectICmpAndZeroShl(ICI, TrueVal, FalseVal, Builder))
2470 return replaceInstUsesWith(SI, V);
2471
2472 if (Instruction *V = foldSelectCtlzToCttz(ICI, TrueVal, FalseVal, Builder))
2473 return V;
2474
2475 if (Instruction *V = foldSelectZeroOrOnes(ICI, TrueVal, FalseVal, Builder))
2476 return V;
2477
2478 if (Value *V = foldSelectICmpLshrAshr(ICI, TrueVal, FalseVal, Builder))
2479 return replaceInstUsesWith(SI, V);
2480
2481 if (Value *V = foldSelectCttzCtlz(ICI, TrueVal, FalseVal, *this))
2482 return replaceInstUsesWith(SI, V);
2483
2484 if (Value *V = canonicalizeSaturatedSubtract(ICI, TrueVal, FalseVal, Builder))
2485 return replaceInstUsesWith(SI, V);
2486
2487 if (Value *V = canonicalizeSaturatedAdd(ICI, TrueVal, FalseVal, Builder))
2488 return replaceInstUsesWith(SI, V);
2489
2490 if (Value *V = foldAbsDiff(ICI, TrueVal, FalseVal, Builder))
2491 return replaceInstUsesWith(SI, V);
2492
2493 if (Value *V = foldSelectWithConstOpToBinOp(ICI, TrueVal, FalseVal))
2494 return replaceInstUsesWith(SI, V);
2495
2496 return Changed ? &SI : nullptr;
2497}
2498
2499/// We have an SPF (e.g. a min or max) of an SPF of the form:
2500/// SPF2(SPF1(A, B), C)
2503 Value *B, Instruction &Outer,
2505 Value *C) {
2506 if (Outer.getType() != Inner->getType())
2507 return nullptr;
2508
2509 if (C == A || C == B) {
2510 // MAX(MAX(A, B), B) -> MAX(A, B)
2511 // MIN(MIN(a, b), a) -> MIN(a, b)
2512 // TODO: This could be done in instsimplify.
2513 if (SPF1 == SPF2 && SelectPatternResult::isMinOrMax(SPF1))
2514 return replaceInstUsesWith(Outer, Inner);
2515 }
2516
2517 return nullptr;
2518}
2519
2520/// Turn select C, (X + Y), (X - Y) --> (X + (select C, Y, (-Y))).
2521/// This is even legal for FP.
2522static Instruction *foldAddSubSelect(SelectInst &SI,
2523 InstCombiner::BuilderTy &Builder) {
2524 Value *CondVal = SI.getCondition();
2525 Value *TrueVal = SI.getTrueValue();
2526 Value *FalseVal = SI.getFalseValue();
2527 auto *TI = dyn_cast<Instruction>(TrueVal);
2528 auto *FI = dyn_cast<Instruction>(FalseVal);
2529 if (!TI || !FI || !TI->hasOneUse() || !FI->hasOneUse())
2530 return nullptr;
2531
2532 Instruction *AddOp = nullptr, *SubOp = nullptr;
2533 if ((TI->getOpcode() == Instruction::Sub &&
2534 FI->getOpcode() == Instruction::Add) ||
2535 (TI->getOpcode() == Instruction::FSub &&
2536 FI->getOpcode() == Instruction::FAdd)) {
2537 AddOp = FI;
2538 SubOp = TI;
2539 } else if ((FI->getOpcode() == Instruction::Sub &&
2540 TI->getOpcode() == Instruction::Add) ||
2541 (FI->getOpcode() == Instruction::FSub &&
2542 TI->getOpcode() == Instruction::FAdd)) {
2543 AddOp = TI;
2544 SubOp = FI;
2545 }
2546
2547 if (AddOp) {
2548 Value *OtherAddOp = nullptr;
2549 if (SubOp->getOperand(0) == AddOp->getOperand(0)) {
2550 OtherAddOp = AddOp->getOperand(1);
2551 } else if (SubOp->getOperand(0) == AddOp->getOperand(1)) {
2552 OtherAddOp = AddOp->getOperand(0);
2553 }
2554
2555 if (OtherAddOp) {
2556 // So at this point we know we have (Y -> OtherAddOp):
2557 // select C, (add X, Y), (sub X, Z)
2558 Value *NegVal; // Compute -Z
2559 if (SI.getType()->isFPOrFPVectorTy()) {
2560 NegVal = Builder.CreateFNeg(SubOp->getOperand(1));
2561 if (Instruction *NegInst = dyn_cast<Instruction>(NegVal)) {
2563 Flags &= SubOp->getFastMathFlags();
2564 NegInst->setFastMathFlags(Flags);
2565 }
2566 } else {
2567 NegVal = Builder.CreateNeg(SubOp->getOperand(1));
2568 }
2569
2570 Value *NewTrueOp = OtherAddOp;
2571 Value *NewFalseOp = NegVal;
2572 if (AddOp != TI)
2573 std::swap(NewTrueOp, NewFalseOp);
2574 Value *NewSel = Builder.CreateSelect(CondVal, NewTrueOp, NewFalseOp,
2575 SI.getName() + ".p", &SI);
2576
2577 if (SI.getType()->isFPOrFPVectorTy()) {
2578 Instruction *RI =
2579 BinaryOperator::CreateFAdd(SubOp->getOperand(0), NewSel);
2580
2582 Flags &= SubOp->getFastMathFlags();
2583 RI->setFastMathFlags(Flags);
2584 return RI;
2585 } else
2586 return BinaryOperator::CreateAdd(SubOp->getOperand(0), NewSel);
2587 }
2588 }
2589 return nullptr;
2590}
2591
2592/// Turn X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
2593/// And X - Y overflows ? 0 : X - Y -> usub_sat X, Y
2594/// Along with a number of patterns similar to:
2595/// X + Y overflows ? (X < 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2596/// X - Y overflows ? (X > 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2597static Instruction *
2598foldOverflowingAddSubSelect(SelectInst &SI, InstCombiner::BuilderTy &Builder) {
2599 Value *CondVal = SI.getCondition();
2600 Value *TrueVal = SI.getTrueValue();
2601 Value *FalseVal = SI.getFalseValue();
2602
2604 if (!match(CondVal, m_ExtractValue<1>(m_WithOverflowInst(II))) ||
2605 !match(FalseVal, m_ExtractValue<0>(m_Specific(II))))
2606 return nullptr;
2607
2608 Value *X = II->getLHS();
2609 Value *Y = II->getRHS();
2610
2611 auto IsSignedSaturateLimit = [&](Value *Limit, bool IsAdd) {
2612 Type *Ty = Limit->getType();
2613
2614 CmpPredicate Pred;
2615 Value *TrueVal, *FalseVal, *Op;
2616 const APInt *C;
2617 if (!match(Limit, m_Select(m_ICmp(Pred, m_Value(Op), m_APInt(C)),
2618 m_Value(TrueVal), m_Value(FalseVal))))
2619 return false;
2620
2621 auto IsZeroOrOne = [](const APInt &C) { return C.isZero() || C.isOne(); };
2622 auto IsMinMax = [&](Value *Min, Value *Max) {
2625 return match(Min, m_SpecificInt(MinVal)) &&
2626 match(Max, m_SpecificInt(MaxVal));
2627 };
2628
2629 if (Op != X && Op != Y)
2630 return false;
2631
2632 if (IsAdd) {
2633 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2634 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2635 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2636 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2637 if (Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C) &&
2638 IsMinMax(TrueVal, FalseVal))
2639 return true;
2640 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2641 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2642 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2643 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2644 if (Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 1) &&
2645 IsMinMax(FalseVal, TrueVal))
2646 return true;
2647 } else {
2648 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2649 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2650 if (Op == X && Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C + 1) &&
2651 IsMinMax(TrueVal, FalseVal))
2652 return true;
2653 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2654 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2655 if (Op == X && Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 2) &&
2656 IsMinMax(FalseVal, TrueVal))
2657 return true;
2658 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2659 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2660 if (Op == Y && Pred == ICmpInst::ICMP_SLT && IsZeroOrOne(*C) &&
2661 IsMinMax(FalseVal, TrueVal))
2662 return true;
2663 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2664 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2665 if (Op == Y && Pred == ICmpInst::ICMP_SGT && IsZeroOrOne(*C + 1) &&
2666 IsMinMax(TrueVal, FalseVal))
2667 return true;
2668 }
2669
2670 return false;
2671 };
2672
2673 Intrinsic::ID NewIntrinsicID;
2674 if (II->getIntrinsicID() == Intrinsic::uadd_with_overflow &&
2675 match(TrueVal, m_AllOnes()))
2676 // X + Y overflows ? -1 : X + Y -> uadd_sat X, Y
2677 NewIntrinsicID = Intrinsic::uadd_sat;
2678 else if (II->getIntrinsicID() == Intrinsic::usub_with_overflow &&
2679 match(TrueVal, m_Zero()))
2680 // X - Y overflows ? 0 : X - Y -> usub_sat X, Y
2681 NewIntrinsicID = Intrinsic::usub_sat;
2682 else if (II->getIntrinsicID() == Intrinsic::sadd_with_overflow &&
2683 IsSignedSaturateLimit(TrueVal, /*IsAdd=*/true))
2684 // X + Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2685 // X + Y overflows ? (X <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2686 // X + Y overflows ? (X >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2687 // X + Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2688 // X + Y overflows ? (Y <s 0 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2689 // X + Y overflows ? (Y <s 1 ? INTMIN : INTMAX) : X + Y --> sadd_sat X, Y
2690 // X + Y overflows ? (Y >s 0 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2691 // X + Y overflows ? (Y >s -1 ? INTMAX : INTMIN) : X + Y --> sadd_sat X, Y
2692 NewIntrinsicID = Intrinsic::sadd_sat;
2693 else if (II->getIntrinsicID() == Intrinsic::ssub_with_overflow &&
2694 IsSignedSaturateLimit(TrueVal, /*IsAdd=*/false))
2695 // X - Y overflows ? (X <s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2696 // X - Y overflows ? (X <s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2697 // X - Y overflows ? (X >s -1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2698 // X - Y overflows ? (X >s -2 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2699 // X - Y overflows ? (Y <s 0 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2700 // X - Y overflows ? (Y <s 1 ? INTMAX : INTMIN) : X - Y --> ssub_sat X, Y
2701 // X - Y overflows ? (Y >s 0 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2702 // X - Y overflows ? (Y >s -1 ? INTMIN : INTMAX) : X - Y --> ssub_sat X, Y
2703 NewIntrinsicID = Intrinsic::ssub_sat;
2704 else
2705 return nullptr;
2706
2708 NewIntrinsicID, SI.getType());
2709 return CallInst::Create(F, {X, Y});
2710}
2711
2713 Constant *C;
2714 if (!match(Sel.getTrueValue(), m_Constant(C)) &&
2715 !match(Sel.getFalseValue(), m_Constant(C)))
2716 return nullptr;
2717
2718 Instruction *ExtInst;
2719 if (!match(Sel.getTrueValue(), m_Instruction(ExtInst)) &&
2720 !match(Sel.getFalseValue(), m_Instruction(ExtInst)))
2721 return nullptr;
2722
2723 auto ExtOpcode = ExtInst->getOpcode();
2724 if (ExtOpcode != Instruction::ZExt && ExtOpcode != Instruction::SExt)
2725 return nullptr;
2726
2727 // If we are extending from a boolean type or if we can create a select that
2728 // has the same size operands as its condition, try to narrow the select.
2729 Value *X = ExtInst->getOperand(0);
2730 Type *SmallType = X->getType();
2731 Value *Cond = Sel.getCondition();
2732 if (!SmallType->isIntOrIntVectorTy(1) &&
2734 cast<Instruction>(Cond)->getOperand(0)->getType() != SmallType))
2735 return nullptr;
2736
2737 // If the constant is the same after truncation to the smaller type and
2738 // extension to the original type, we can narrow the select.
2739 Type *SelType = Sel.getType();
2740 Constant *TruncC = getLosslessInvCast(C, SmallType, ExtOpcode, DL);
2741 if (TruncC && ExtInst->hasOneUse()) {
2742 Value *TruncCVal = cast<Value>(TruncC);
2743 if (ExtInst == Sel.getFalseValue())
2744 std::swap(X, TruncCVal);
2745
2746 // select Cond, (ext X), C --> ext(select Cond, X, C')
2747 // select Cond, C, (ext X) --> ext(select Cond, C', X)
2748 Value *NewSel = Builder.CreateSelect(Cond, X, TruncCVal, "narrow", &Sel);
2749 return CastInst::Create(Instruction::CastOps(ExtOpcode), NewSel, SelType);
2750 }
2751
2752 return nullptr;
2753}
2754
2755/// Try to transform a vector select with a constant condition vector into a
2756/// shuffle for easier combining with other shuffles and insert/extract.
2757static Instruction *canonicalizeSelectToShuffle(SelectInst &SI) {
2758 Value *CondVal = SI.getCondition();
2759 Constant *CondC;
2760 auto *CondValTy = dyn_cast<FixedVectorType>(CondVal->getType());
2761 if (!CondValTy || !match(CondVal, m_Constant(CondC)))
2762 return nullptr;
2763
2764 unsigned NumElts = CondValTy->getNumElements();
2766 Mask.reserve(NumElts);
2767 for (unsigned i = 0; i != NumElts; ++i) {
2768 Constant *Elt = CondC->getAggregateElement(i);
2769 if (!Elt)
2770 return nullptr;
2771
2772 if (Elt->isOneValue()) {
2773 // If the select condition element is true, choose from the 1st vector.
2774 Mask.push_back(i);
2775 } else if (Elt->isNullValue()) {
2776 // If the select condition element is false, choose from the 2nd vector.
2777 Mask.push_back(i + NumElts);
2778 } else if (isa<UndefValue>(Elt)) {
2779 // Undef in a select condition (choose one of the operands) does not mean
2780 // the same thing as undef in a shuffle mask (any value is acceptable), so
2781 // give up.
2782 return nullptr;
2783 } else {
2784 // Bail out on a constant expression.
2785 return nullptr;
2786 }
2787 }
2788
2789 return new ShuffleVectorInst(SI.getTrueValue(), SI.getFalseValue(), Mask);
2790}
2791
2792/// If we have a select of vectors with a scalar condition, try to convert that
2793/// to a vector select by splatting the condition. A splat may get folded with
2794/// other operations in IR and having all operands of a select be vector types
2795/// is likely better for vector codegen.
2796static Instruction *canonicalizeScalarSelectOfVecs(SelectInst &Sel,
2797 InstCombinerImpl &IC) {
2798 auto *Ty = dyn_cast<VectorType>(Sel.getType());
2799 if (!Ty)
2800 return nullptr;
2801
2802 // We can replace a single-use extract with constant index.
2803 Value *Cond = Sel.getCondition();
2805 return nullptr;
2806
2807 // select (extelt V, Index), T, F --> select (splat V, Index), T, F
2808 // Splatting the extracted condition reduces code (we could directly create a
2809 // splat shuffle of the source vector to eliminate the intermediate step).
2810 return IC.replaceOperand(
2811 Sel, 0, IC.Builder.CreateVectorSplat(Ty->getElementCount(), Cond));
2812}
2813
2814/// Reuse bitcasted operands between a compare and select:
2815/// select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2816/// bitcast (select (cmp (bitcast C), (bitcast D)), (bitcast C), (bitcast D))
2817static Instruction *foldSelectCmpBitcasts(SelectInst &Sel,
2818 InstCombiner::BuilderTy &Builder) {
2819 Value *Cond = Sel.getCondition();
2820 Value *TVal = Sel.getTrueValue();
2821 Value *FVal = Sel.getFalseValue();
2822
2823 CmpPredicate Pred;
2824 Value *A, *B;
2825 if (!match(Cond, m_Cmp(Pred, m_Value(A), m_Value(B))))
2826 return nullptr;
2827
2828 // The select condition is a compare instruction. If the select's true/false
2829 // values are already the same as the compare operands, there's nothing to do.
2830 if (TVal == A || TVal == B || FVal == A || FVal == B)
2831 return nullptr;
2832
2833 Value *C, *D;
2834 if (!match(A, m_BitCast(m_Value(C))) || !match(B, m_BitCast(m_Value(D))))
2835 return nullptr;
2836
2837 // select (cmp (bitcast C), (bitcast D)), (bitcast TSrc), (bitcast FSrc)
2838 Value *TSrc, *FSrc;
2839 if (!match(TVal, m_BitCast(m_Value(TSrc))) ||
2840 !match(FVal, m_BitCast(m_Value(FSrc))))
2841 return nullptr;
2842
2843 // If the select true/false values are *different bitcasts* of the same source
2844 // operands, make the select operands the same as the compare operands and
2845 // cast the result. This is the canonical select form for min/max.
2846 Value *NewSel;
2847 if (TSrc == C && FSrc == D) {
2848 // select (cmp (bitcast C), (bitcast D)), (bitcast' C), (bitcast' D) -->
2849 // bitcast (select (cmp A, B), A, B)
2850 NewSel = Builder.CreateSelect(Cond, A, B, "", &Sel);
2851 } else if (TSrc == D && FSrc == C) {
2852 // select (cmp (bitcast C), (bitcast D)), (bitcast' D), (bitcast' C) -->
2853 // bitcast (select (cmp A, B), B, A)
2854 NewSel = Builder.CreateSelect(Cond, B, A, "", &Sel);
2855 } else {
2856 return nullptr;
2857 }
2858 return new BitCastInst(NewSel, Sel.getType());
2859}
2860
2861/// Try to eliminate select instructions that test the returned flag of cmpxchg
2862/// instructions.
2863///
2864/// If a select instruction tests the returned flag of a cmpxchg instruction and
2865/// selects between the returned value of the cmpxchg instruction its compare
2866/// operand, the result of the select will always be equal to its false value.
2867/// For example:
2868///
2869/// %cmpxchg = cmpxchg ptr %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2870/// %val = extractvalue { i64, i1 } %cmpxchg, 0
2871/// %success = extractvalue { i64, i1 } %cmpxchg, 1
2872/// %sel = select i1 %success, i64 %compare, i64 %val
2873/// ret i64 %sel
2874///
2875/// The returned value of the cmpxchg instruction (%val) is the original value
2876/// located at %ptr prior to any update. If the cmpxchg operation succeeds, %val
2877/// must have been equal to %compare. Thus, the result of the select is always
2878/// equal to %val, and the code can be simplified to:
2879///
2880/// %cmpxchg = cmpxchg ptr %ptr, i64 %compare, i64 %new_value seq_cst seq_cst
2881/// %val = extractvalue { i64, i1 } %cmpxchg, 0
2882/// ret i64 %val
2883///
2884static Value *foldSelectCmpXchg(SelectInst &SI) {
2885 // A helper that determines if V is an extractvalue instruction whose
2886 // aggregate operand is a cmpxchg instruction and whose single index is equal
2887 // to I. If such conditions are true, the helper returns the cmpxchg
2888 // instruction; otherwise, a nullptr is returned.
2889 auto isExtractFromCmpXchg = [](Value *V, unsigned I) -> AtomicCmpXchgInst * {
2890 // When extracting the value loaded by a cmpxchg, allow peeking through a
2891 // bitcast. These are inserted for floating-point cmpxchg, for example:
2892 // %bc = bitcast float %compare to i32
2893 // %cmpxchg = cmpxchg ptr %ptr, i32 %bc, i32 %new_value seq_cst seq_cst
2894 // %val = extractvalue { i32, i1 } %cmpxchg, 0
2895 // %success = extractvalue { i32, i1 } %cmpxchg, 1
2896 // %val.bc = bitcast i32 %val to float
2897 // %sel = select i1 %success, float %compare, float %val.bc
2898 if (auto *BI = dyn_cast<BitCastInst>(V); BI && I == 0)
2899 V = BI->getOperand(0);
2900 auto *Extract = dyn_cast<ExtractValueInst>(V);
2901 if (!Extract)
2902 return nullptr;
2903 if (Extract->getIndices()[0] != I)
2904 return nullptr;
2905 return dyn_cast<AtomicCmpXchgInst>(Extract->getAggregateOperand());
2906 };
2907
2908 // Check if the compare value of a cmpxchg matches another value.
2909 auto isCompareSameAsValue = [](Value *CmpVal, Value *SelVal) {
2910 // The values match if they are the same or %CmpVal = bitcast %SelVal (see
2911 // above).
2912 if (CmpVal == SelVal || match(CmpVal, m_BitCast(m_Specific(SelVal))))
2913 return true;
2914 // For FP constants, the value may have been bitcast to Int directly.
2915 auto *IntC = dyn_cast<ConstantInt>(CmpVal);
2916 auto *FpC = dyn_cast<ConstantFP>(SelVal);
2917 return IntC && FpC && IntC->getValue() == FpC->getValue().bitcastToAPInt();
2918 };
2919
2920 // If the select has a single user, and this user is a select instruction that
2921 // we can simplify, skip the cmpxchg simplification for now.
2922 if (SI.hasOneUse())
2923 if (auto *Select = dyn_cast<SelectInst>(SI.user_back()))
2924 if (Select->getCondition() == SI.getCondition())
2925 if (Select->getFalseValue() == SI.getTrueValue() ||
2926 Select->getTrueValue() == SI.getFalseValue())
2927 return nullptr;
2928
2929 // Ensure the select condition is the returned flag of a cmpxchg instruction.
2930 auto *CmpXchg = isExtractFromCmpXchg(SI.getCondition(), 1);
2931 if (!CmpXchg)
2932 return nullptr;
2933
2934 // Check the true value case: The true value of the select is the returned
2935 // value of the same cmpxchg used by the condition, and the false value is the
2936 // cmpxchg instruction's compare operand.
2937 if (auto *X = isExtractFromCmpXchg(SI.getTrueValue(), 0))
2938 if (X == CmpXchg &&
2939 isCompareSameAsValue(X->getCompareOperand(), SI.getFalseValue()))
2940 return SI.getFalseValue();
2941
2942 // Check the false value case: The false value of the select is the returned
2943 // value of the same cmpxchg used by the condition, and the true value is the
2944 // cmpxchg instruction's compare operand.
2945 if (auto *X = isExtractFromCmpXchg(SI.getFalseValue(), 0))
2946 if (X == CmpXchg &&
2947 isCompareSameAsValue(X->getCompareOperand(), SI.getTrueValue()))
2948 return SI.getFalseValue();
2949
2950 return nullptr;
2951}
2952
2953/// Try to reduce a funnel/rotate pattern that includes a compare and select
2954/// into a funnel shift intrinsic. Example:
2955/// rotl32(a, b) --> (b == 0 ? a : ((a >> (32 - b)) | (a << b)))
2956/// --> call llvm.fshl.i32(a, a, b)
2957/// fshl32(a, b, c) --> (c == 0 ? a : ((b >> (32 - c)) | (a << c)))
2958/// --> call llvm.fshl.i32(a, b, c)
2959/// fshr32(a, b, c) --> (c == 0 ? b : ((a >> (32 - c)) | (b << c)))
2960/// --> call llvm.fshr.i32(a, b, c)
2961static Instruction *foldSelectFunnelShift(SelectInst &Sel,
2962 InstCombiner::BuilderTy &Builder) {
2963 // This must be a power-of-2 type for a bitmasking transform to be valid.
2964 unsigned Width = Sel.getType()->getScalarSizeInBits();
2965 if (!isPowerOf2_32(Width))
2966 return nullptr;
2967
2968 BinaryOperator *Or0, *Or1;
2969 if (!match(Sel.getFalseValue(), m_OneUse(m_Or(m_BinOp(Or0), m_BinOp(Or1)))))
2970 return nullptr;
2971
2972 Value *SV0, *SV1, *SA0, *SA1;
2973 if (!match(Or0, m_OneUse(m_LogicalShift(m_Value(SV0),
2974 m_ZExtOrSelf(m_Value(SA0))))) ||
2976 m_ZExtOrSelf(m_Value(SA1))))) ||
2977 Or0->getOpcode() == Or1->getOpcode())
2978 return nullptr;
2979
2980 // Canonicalize to or(shl(SV0, SA0), lshr(SV1, SA1)).
2981 if (Or0->getOpcode() == BinaryOperator::LShr) {
2982 std::swap(Or0, Or1);
2983 std::swap(SV0, SV1);
2984 std::swap(SA0, SA1);
2985 }
2986 assert(Or0->getOpcode() == BinaryOperator::Shl &&
2987 Or1->getOpcode() == BinaryOperator::LShr &&
2988 "Illegal or(shift,shift) pair");
2989
2990 // Check the shift amounts to see if they are an opposite pair.
2991 Value *ShAmt;
2992 if (match(SA1, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(SA0)))))
2993 ShAmt = SA0;
2994 else if (match(SA0, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(SA1)))))
2995 ShAmt = SA1;
2996 else
2997 return nullptr;
2998
2999 // We should now have this pattern:
3000 // select ?, TVal, (or (shl SV0, SA0), (lshr SV1, SA1))
3001 // The false value of the select must be a funnel-shift of the true value:
3002 // IsFShl -> TVal must be SV0 else TVal must be SV1.
3003 bool IsFshl = (ShAmt == SA0);
3004 Value *TVal = Sel.getTrueValue();
3005 if ((IsFshl && TVal != SV0) || (!IsFshl && TVal != SV1))
3006 return nullptr;
3007
3008 // Finally, see if the select is filtering out a shift-by-zero.
3009 Value *Cond = Sel.getCondition();
3011 m_ZeroInt()))))
3012 return nullptr;
3013
3014 // If this is not a rotate then the select was blocking poison from the
3015 // 'shift-by-zero' non-TVal, but a funnel shift won't - so freeze it.
3016 if (SV0 != SV1) {
3017 if (IsFshl && !llvm::isGuaranteedNotToBePoison(SV1))
3018 SV1 = Builder.CreateFreeze(SV1);
3019 else if (!IsFshl && !llvm::isGuaranteedNotToBePoison(SV0))
3020 SV0 = Builder.CreateFreeze(SV0);
3021 }
3022
3023 // This is a funnel/rotate that avoids shift-by-bitwidth UB in a suboptimal way.
3024 // Convert to funnel shift intrinsic.
3025 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
3026 Function *F =
3028 ShAmt = Builder.CreateZExt(ShAmt, Sel.getType());
3029 return CallInst::Create(F, { SV0, SV1, ShAmt });
3030}
3031
3032static Instruction *foldSelectToCopysign(SelectInst &Sel,
3033 InstCombiner::BuilderTy &Builder) {
3034 Value *Cond = Sel.getCondition();
3035 Value *TVal = Sel.getTrueValue();
3036 Value *FVal = Sel.getFalseValue();
3037 Type *SelType = Sel.getType();
3038
3039 // Match select ?, TC, FC where the constants are equal but negated.
3040 // TODO: Generalize to handle a negated variable operand?
3041 const APFloat *TC, *FC;
3042 if (!match(TVal, m_APFloatAllowPoison(TC)) ||
3043 !match(FVal, m_APFloatAllowPoison(FC)) ||
3044 !abs(*TC).bitwiseIsEqual(abs(*FC)))
3045 return nullptr;
3046
3047 assert(TC != FC && "Expected equal select arms to simplify");
3048
3049 Value *X;
3050 const APInt *C;
3051 bool IsTrueIfSignSet;
3052 CmpPredicate Pred;
3054 m_APInt(C)))) ||
3055 !isSignBitCheck(Pred, *C, IsTrueIfSignSet) || X->getType() != SelType)
3056 return nullptr;
3057
3058 // If needed, negate the value that will be the sign argument of the copysign:
3059 // (bitcast X) < 0 ? -TC : TC --> copysign(TC, X)
3060 // (bitcast X) < 0 ? TC : -TC --> copysign(TC, -X)
3061 // (bitcast X) >= 0 ? -TC : TC --> copysign(TC, -X)
3062 // (bitcast X) >= 0 ? TC : -TC --> copysign(TC, X)
3063 // Note: FMF from the select can not be propagated to the new instructions.
3064 if (IsTrueIfSignSet ^ TC->isNegative())
3065 X = Builder.CreateFNeg(X);
3066
3067 // Canonicalize the magnitude argument as the positive constant since we do
3068 // not care about its sign.
3069 Value *MagArg = ConstantFP::get(SelType, abs(*TC));
3071 Sel.getModule(), Intrinsic::copysign, Sel.getType());
3072 return CallInst::Create(F, { MagArg, X });
3073}
3074
3076 if (!isa<VectorType>(Sel.getType()))
3077 return nullptr;
3078
3079 Value *Cond = Sel.getCondition();
3080 Value *TVal = Sel.getTrueValue();
3081 Value *FVal = Sel.getFalseValue();
3082 Value *C, *X, *Y;
3083
3084 if (match(Cond, m_VecReverse(m_Value(C)))) {
3085 auto createSelReverse = [&](Value *C, Value *X, Value *Y) {
3086 Value *V = Builder.CreateSelect(C, X, Y, Sel.getName(), &Sel);
3087 if (auto *I = dyn_cast<Instruction>(V))
3088 I->copyIRFlags(&Sel);
3089 Module *M = Sel.getModule();
3091 M, Intrinsic::vector_reverse, V->getType());
3092 return CallInst::Create(F, V);
3093 };
3094
3095 if (match(TVal, m_VecReverse(m_Value(X)))) {
3096 // select rev(C), rev(X), rev(Y) --> rev(select C, X, Y)
3097 if (match(FVal, m_VecReverse(m_Value(Y))) &&
3098 (Cond->hasOneUse() || TVal->hasOneUse() || FVal->hasOneUse()))
3099 return createSelReverse(C, X, Y);
3100
3101 // select rev(C), rev(X), FValSplat --> rev(select C, X, FValSplat)
3102 if ((Cond->hasOneUse() || TVal->hasOneUse()) && isSplatValue(FVal))
3103 return createSelReverse(C, X, FVal);
3104 }
3105 // select rev(C), TValSplat, rev(Y) --> rev(select C, TValSplat, Y)
3106 else if (isSplatValue(TVal) && match(FVal, m_VecReverse(m_Value(Y))) &&
3107 (Cond->hasOneUse() || FVal->hasOneUse()))
3108 return createSelReverse(C, TVal, Y);
3109 }
3110
3111 auto *VecTy = dyn_cast<FixedVectorType>(Sel.getType());
3112 if (!VecTy)
3113 return nullptr;
3114
3115 unsigned NumElts = VecTy->getNumElements();
3116 APInt PoisonElts(NumElts, 0);
3117 APInt AllOnesEltMask(APInt::getAllOnes(NumElts));
3118 if (Value *V = SimplifyDemandedVectorElts(&Sel, AllOnesEltMask, PoisonElts)) {
3119 if (V != &Sel)
3120 return replaceInstUsesWith(Sel, V);
3121 return &Sel;
3122 }
3123
3124 // A select of a "select shuffle" with a common operand can be rearranged
3125 // to select followed by "select shuffle". Because of poison, this only works
3126 // in the case of a shuffle with no undefined mask elements.
3127 ArrayRef<int> Mask;
3128 if (match(TVal, m_OneUse(m_Shuffle(m_Value(X), m_Value(Y), m_Mask(Mask)))) &&
3129 !is_contained(Mask, PoisonMaskElem) &&
3130 cast<ShuffleVectorInst>(TVal)->isSelect()) {
3131 if (X == FVal) {
3132 // select Cond, (shuf_sel X, Y), X --> shuf_sel X, (select Cond, Y, X)
3133 Value *NewSel = Builder.CreateSelect(Cond, Y, X, "sel", &Sel);
3134 return new ShuffleVectorInst(X, NewSel, Mask);
3135 }
3136 if (Y == FVal) {
3137 // select Cond, (shuf_sel X, Y), Y --> shuf_sel (select Cond, X, Y), Y
3138 Value *NewSel = Builder.CreateSelect(Cond, X, Y, "sel", &Sel);
3139 return new ShuffleVectorInst(NewSel, Y, Mask);
3140 }
3141 }
3142 if (match(FVal, m_OneUse(m_Shuffle(m_Value(X), m_Value(Y), m_Mask(Mask)))) &&
3143 !is_contained(Mask, PoisonMaskElem) &&
3144 cast<ShuffleVectorInst>(FVal)->isSelect()) {
3145 if (X == TVal) {
3146 // select Cond, X, (shuf_sel X, Y) --> shuf_sel X, (select Cond, X, Y)
3147 Value *NewSel = Builder.CreateSelect(Cond, X, Y, "sel", &Sel);
3148 return new ShuffleVectorInst(X, NewSel, Mask);
3149 }
3150 if (Y == TVal) {
3151 // select Cond, Y, (shuf_sel X, Y) --> shuf_sel (select Cond, Y, X), Y
3152 Value *NewSel = Builder.CreateSelect(Cond, Y, X, "sel", &Sel);
3153 return new ShuffleVectorInst(NewSel, Y, Mask);
3154 }
3155 }
3156
3157 return nullptr;
3158}
3159
3160static Instruction *foldSelectToPhiImpl(SelectInst &Sel, BasicBlock *BB,
3161 const DominatorTree &DT,
3162 InstCombiner::BuilderTy &Builder) {
3163 // Find the block's immediate dominator that ends with a conditional branch
3164 // that matches select's condition (maybe inverted).
3165 auto *IDomNode = DT[BB]->getIDom();
3166 if (!IDomNode)
3167 return nullptr;
3168 BasicBlock *IDom = IDomNode->getBlock();
3169
3170 Value *Cond = Sel.getCondition();
3171 Value *IfTrue, *IfFalse;
3172 BasicBlock *TrueSucc, *FalseSucc;
3173 if (match(IDom->getTerminator(),
3174 m_Br(m_Specific(Cond), m_BasicBlock(TrueSucc),
3175 m_BasicBlock(FalseSucc)))) {
3176 IfTrue = Sel.getTrueValue();
3177 IfFalse = Sel.getFalseValue();
3178 } else if (match(IDom->getTerminator(),
3179 m_Br(m_Not(m_Specific(Cond)), m_BasicBlock(TrueSucc),
3180 m_BasicBlock(FalseSucc)))) {
3181 IfTrue = Sel.getFalseValue();
3182 IfFalse = Sel.getTrueValue();
3183 } else
3184 return nullptr;
3185
3186 // Make sure the branches are actually different.
3187 if (TrueSucc == FalseSucc)
3188 return nullptr;
3189
3190 // We want to replace select %cond, %a, %b with a phi that takes value %a
3191 // for all incoming edges that are dominated by condition `%cond == true`,
3192 // and value %b for edges dominated by condition `%cond == false`. If %a
3193 // or %b are also phis from the same basic block, we can go further and take
3194 // their incoming values from the corresponding blocks.
3195 BasicBlockEdge TrueEdge(IDom, TrueSucc);
3196 BasicBlockEdge FalseEdge(IDom, FalseSucc);
3198 for (auto *Pred : predecessors(BB)) {
3199 // Check implication.
3200 BasicBlockEdge Incoming(Pred, BB);
3201 if (DT.dominates(TrueEdge, Incoming))
3202 Inputs[Pred] = IfTrue->DoPHITranslation(BB, Pred);
3203 else if (DT.dominates(FalseEdge, Incoming))
3204 Inputs[Pred] = IfFalse->DoPHITranslation(BB, Pred);
3205 else
3206 return nullptr;
3207 // Check availability.
3208 if (auto *Insn = dyn_cast<Instruction>(Inputs[Pred]))
3209 if (!DT.dominates(Insn, Pred->getTerminator()))
3210 return nullptr;
3211 }
3212
3213 Builder.SetInsertPoint(BB, BB->begin());
3214 auto *PN = Builder.CreatePHI(Sel.getType(), Inputs.size());
3215 for (auto *Pred : predecessors(BB))
3216 PN->addIncoming(Inputs[Pred], Pred);
3217 PN->takeName(&Sel);
3218 return PN;
3219}
3220
3221static Instruction *foldSelectToPhi(SelectInst &Sel, const DominatorTree &DT,
3222 InstCombiner::BuilderTy &Builder) {
3223 // Try to replace this select with Phi in one of these blocks.
3224 SmallSetVector<BasicBlock *, 4> CandidateBlocks;
3225 CandidateBlocks.insert(Sel.getParent());
3226 for (Value *V : Sel.operands())
3227 if (auto *I = dyn_cast<Instruction>(V))
3228 CandidateBlocks.insert(I->getParent());
3229
3230 for (BasicBlock *BB : CandidateBlocks)
3231 if (auto *PN = foldSelectToPhiImpl(Sel, BB, DT, Builder))
3232 return PN;
3233 return nullptr;
3234}
3235
3236/// Tries to reduce a pattern that arises when calculating the remainder of the
3237/// Euclidean division. When the divisor is a power of two and is guaranteed not
3238/// to be negative, a signed remainder can be folded with a bitwise and.
3239///
3240/// (x % n) < 0 ? (x % n) + n : (x % n)
3241/// -> x & (n - 1)
3242static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC,
3243 IRBuilderBase &Builder) {
3244 Value *CondVal = SI.getCondition();
3245 Value *TrueVal = SI.getTrueValue();
3246 Value *FalseVal = SI.getFalseValue();
3247
3248 CmpPredicate Pred;
3249 Value *Op, *RemRes, *Remainder;
3250 const APInt *C;
3251 bool TrueIfSigned = false;
3252
3253 if (!(match(CondVal, m_ICmp(Pred, m_Value(RemRes), m_APInt(C))) &&
3254 isSignBitCheck(Pred, *C, TrueIfSigned)))
3255 return nullptr;
3256
3257 // If the sign bit is not set, we have a SGE/SGT comparison, and the operands
3258 // of the select are inverted.
3259 if (!TrueIfSigned)
3260 std::swap(TrueVal, FalseVal);
3261
3262 auto FoldToBitwiseAnd = [&](Value *Remainder) -> Instruction * {
3263 Value *Add = Builder.CreateAdd(
3264 Remainder, Constant::getAllOnesValue(RemRes->getType()));
3265 return BinaryOperator::CreateAnd(Op, Add);
3266 };
3267
3268 // Match the general case:
3269 // %rem = srem i32 %x, %n
3270 // %cnd = icmp slt i32 %rem, 0
3271 // %add = add i32 %rem, %n
3272 // %sel = select i1 %cnd, i32 %add, i32 %rem
3273 if (match(TrueVal, m_c_Add(m_Specific(RemRes), m_Value(Remainder))) &&
3274 match(RemRes, m_SRem(m_Value(Op), m_Specific(Remainder))) &&
3275 IC.isKnownToBeAPowerOfTwo(Remainder, /*OrZero=*/true) &&
3276 FalseVal == RemRes)
3277 return FoldToBitwiseAnd(Remainder);
3278
3279 // Match the case where the one arm has been replaced by constant 1:
3280 // %rem = srem i32 %n, 2
3281 // %cnd = icmp slt i32 %rem, 0
3282 // %sel = select i1 %cnd, i32 1, i32 %rem
3283 if (match(TrueVal, m_One()) &&
3284 match(RemRes, m_SRem(m_Value(Op), m_SpecificInt(2))) &&
3285 FalseVal == RemRes)
3286 return FoldToBitwiseAnd(ConstantInt::get(RemRes->getType(), 2));
3287
3288 return nullptr;
3289}
3290
3291/// Given that \p CondVal is known to be \p CondIsTrue, try to simplify \p SI.
3292static Value *simplifyNestedSelectsUsingImpliedCond(SelectInst &SI,
3293 Value *CondVal,
3294 bool CondIsTrue,
3295 const DataLayout &DL) {
3296 Value *InnerCondVal = SI.getCondition();
3297 Value *InnerTrueVal = SI.getTrueValue();
3298 Value *InnerFalseVal = SI.getFalseValue();
3299 assert(CondVal->getType() == InnerCondVal->getType() &&
3300 "The type of inner condition must match with the outer.");
3301 if (auto Implied = isImpliedCondition(CondVal, InnerCondVal, DL, CondIsTrue))
3302 return *Implied ? InnerTrueVal : InnerFalseVal;
3303 return nullptr;
3304}
3305
3306Instruction *InstCombinerImpl::foldAndOrOfSelectUsingImpliedCond(Value *Op,
3307 SelectInst &SI,
3308 bool IsAnd) {
3309 assert(Op->getType()->isIntOrIntVectorTy(1) &&
3310 "Op must be either i1 or vector of i1.");
3311 if (SI.getCondition()->getType() != Op->getType())
3312 return nullptr;
3313 if (Value *V = simplifyNestedSelectsUsingImpliedCond(SI, Op, IsAnd, DL))
3314 return createSelectInstWithUnknownProfile(
3315 Op, IsAnd ? V : ConstantInt::getTrue(Op->getType()),
3316 IsAnd ? ConstantInt::getFalse(Op->getType()) : V);
3317 return nullptr;
3318}
3319
3320// Canonicalize select with fcmp to fabs(). -0.0 makes this tricky. We need
3321// fast-math-flags (nsz) or fsub with +0.0 (not fneg) for this to work.
3322static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
3323 InstCombinerImpl &IC) {
3324 Value *CondVal = SI.getCondition();
3325
3326 bool ChangedFMF = false;
3327 for (bool Swap : {false, true}) {
3328 Value *TrueVal = SI.getTrueValue();
3329 Value *X = SI.getFalseValue();
3330 CmpPredicate Pred;
3331
3332 if (Swap)
3333 std::swap(TrueVal, X);
3334
3335 if (!match(CondVal, m_FCmp(Pred, m_Specific(X), m_AnyZeroFP())))
3336 continue;
3337
3338 // fold (X <= +/-0.0) ? (0.0 - X) : X to fabs(X), when 'Swap' is false
3339 // fold (X > +/-0.0) ? X : (0.0 - X) to fabs(X), when 'Swap' is true
3340 // Note: We require "nnan" for this fold because fcmp ignores the signbit
3341 // of NAN, but IEEE-754 specifies the signbit of NAN values with
3342 // fneg/fabs operations.
3343 if (match(TrueVal, m_FSub(m_PosZeroFP(), m_Specific(X))) &&
3344 (cast<FPMathOperator>(CondVal)->hasNoNaNs() || SI.hasNoNaNs() ||
3345 (SI.hasOneUse() && canIgnoreSignBitOfNaN(*SI.use_begin())) ||
3347 cast<Instruction>(CondVal))))) {
3348 if (!Swap && (Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)) {
3349 Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
3350 return IC.replaceInstUsesWith(SI, Fabs);
3351 }
3352 if (Swap && (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT)) {
3353 Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
3354 return IC.replaceInstUsesWith(SI, Fabs);
3355 }
3356 }
3357
3358 if (!match(TrueVal, m_FNeg(m_Specific(X))))
3359 return nullptr;
3360
3361 // Forward-propagate nnan and ninf from the fcmp to the select.
3362 // If all inputs are not those values, then the select is not either.
3363 // Note: nsz is defined differently, so it may not be correct to propagate.
3364 FastMathFlags FMF = cast<FPMathOperator>(CondVal)->getFastMathFlags();
3365 if (FMF.noNaNs() && !SI.hasNoNaNs()) {
3366 SI.setHasNoNaNs(true);
3367 ChangedFMF = true;
3368 }
3369 if (FMF.noInfs() && !SI.hasNoInfs()) {
3370 SI.setHasNoInfs(true);
3371 ChangedFMF = true;
3372 }
3373 // Forward-propagate nnan from the fneg to the select.
3374 // The nnan flag can be propagated iff fneg is selected when X is NaN.
3375 if (!SI.hasNoNaNs() && cast<FPMathOperator>(TrueVal)->hasNoNaNs() &&
3377 SI.setHasNoNaNs(true);
3378 ChangedFMF = true;
3379 }
3380
3381 // With nsz, when 'Swap' is false:
3382 // fold (X < +/-0.0) ? -X : X or (X <= +/-0.0) ? -X : X to fabs(X)
3383 // fold (X > +/-0.0) ? -X : X or (X >= +/-0.0) ? -X : X to -fabs(x)
3384 // when 'Swap' is true:
3385 // fold (X > +/-0.0) ? X : -X or (X >= +/-0.0) ? X : -X to fabs(X)
3386 // fold (X < +/-0.0) ? X : -X or (X <= +/-0.0) ? X : -X to -fabs(X)
3387 //
3388 // Note: We require "nnan" for this fold because fcmp ignores the signbit
3389 // of NAN, but IEEE-754 specifies the signbit of NAN values with
3390 // fneg/fabs operations.
3391 if (!SI.hasNoSignedZeros() &&
3392 (!SI.hasOneUse() || !canIgnoreSignBitOfZero(*SI.use_begin())))
3393 return nullptr;
3394 if (!SI.hasNoNaNs() &&
3395 (!SI.hasOneUse() || !canIgnoreSignBitOfNaN(*SI.use_begin())))
3396 return nullptr;
3397
3398 if (Swap)
3399 Pred = FCmpInst::getSwappedPredicate(Pred);
3400
3401 bool IsLTOrLE = Pred == FCmpInst::FCMP_OLT || Pred == FCmpInst::FCMP_OLE ||
3402 Pred == FCmpInst::FCMP_ULT || Pred == FCmpInst::FCMP_ULE;
3403 bool IsGTOrGE = Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_OGE ||
3404 Pred == FCmpInst::FCMP_UGT || Pred == FCmpInst::FCMP_UGE;
3405
3406 if (IsLTOrLE) {
3407 Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
3408 return IC.replaceInstUsesWith(SI, Fabs);
3409 }
3410 if (IsGTOrGE) {
3411 Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
3412 Instruction *NewFNeg = UnaryOperator::CreateFNeg(Fabs);
3413 NewFNeg->setFastMathFlags(SI.getFastMathFlags());
3414 return NewFNeg;
3415 }
3416 }
3417
3418 // Match select with (icmp slt (bitcast X to int), 0)
3419 // or (icmp sgt (bitcast X to int), -1)
3420
3421 for (bool Swap : {false, true}) {
3422 Value *TrueVal = SI.getTrueValue();
3423 Value *X = SI.getFalseValue();
3424
3425 if (Swap)
3426 std::swap(TrueVal, X);
3427
3428 CmpPredicate Pred;
3429 const APInt *C;
3430 bool TrueIfSigned;
3431 if (!match(CondVal,
3433 !isSignBitCheck(Pred, *C, TrueIfSigned))
3434 continue;
3435 if (!match(TrueVal, m_FNeg(m_Specific(X))))
3436 return nullptr;
3437 if (Swap == TrueIfSigned && !CondVal->hasOneUse() && !TrueVal->hasOneUse())
3438 return nullptr;
3439
3440 // Fold (IsNeg ? -X : X) or (!IsNeg ? X : -X) to fabs(X)
3441 // Fold (IsNeg ? X : -X) or (!IsNeg ? -X : X) to -fabs(X)
3442 Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
3443 if (Swap != TrueIfSigned)
3444 return IC.replaceInstUsesWith(SI, Fabs);
3445 return UnaryOperator::CreateFNegFMF(Fabs, &SI);
3446 }
3447
3448 return ChangedFMF ? &SI : nullptr;
3449}
3450
3451// Fold a select of an ordered fcmp using fabs of a NaN-scrubbed value:
3452// %s = select i1 (isnotnan T %x), T %x, T %y
3453// %a = call T @llvm.fabs.T(T %s)
3454// %c = fcmp <ordered-pred> T %a, %k
3455// %r = select i1 %c, T %s, T %y
3456// =>
3457// %a2 = call T @llvm.fabs.T(T %x)
3458// %c2 = fcmp <ordered-pred> T %a2, %k
3459// %r2 = select i1 %c2, T %x, T %y
3460static Instruction *
3461foldSelectOfOrderedFAbsCmpOfNaNScrubbedValue(SelectInst &SI,
3462 InstCombinerImpl &IC) {
3463 Instruction *OuterCmpI;
3464 Value *Cmp0, *Cmp1;
3465 if (!match(SI.getCondition(),
3466 m_OneUse(m_Instruction(OuterCmpI,
3467 m_FCmp(m_Value(Cmp0), m_Value(Cmp1))))))
3468 return nullptr;
3469
3470 auto *OuterCmp = cast<FCmpInst>(OuterCmpI);
3471 CmpInst::Predicate Pred = OuterCmp->getPredicate();
3472 if (!FCmpInst::isOrdered(Pred))
3473 return nullptr;
3474
3475 Value *Y = SI.getFalseValue();
3476 Value *InnerSel = SI.getTrueValue();
3477
3478 // Match a select that returns X when X is not NaN, and Y otherwise:
3479 // select (fcmp ord X, 0.0), X, Y
3480 Value *X;
3481 if (!match(InnerSel,
3483 m_AnyZeroFP())),
3484 m_Deferred(X), m_Specific(Y))))
3485 return nullptr;
3486
3487 Instruction *FAbsI;
3488 auto MatchFAbsOfInnerSel = [&](Value *V) {
3489 return match(V,
3490 m_OneUse(m_Instruction(FAbsI, m_FAbs(m_Specific(InnerSel)))));
3491 };
3492
3493 if (!MatchFAbsOfInnerSel(Cmp0)) {
3494 if (!MatchFAbsOfInnerSel(Cmp1))
3495 return nullptr;
3496
3497 std::swap(Cmp0, Cmp1);
3498 Pred = CmpInst::getSwappedPredicate(Pred);
3499 }
3500
3501 FastMathFlags FAbsFMF = FAbsI->getFastMathFlags();
3502 FastMathFlags CmpFMF = OuterCmp->getFastMathFlags();
3503
3504 FastMathFlags CommonRewriteFMF =
3505 FastMathFlags::intersectRewrite(FAbsFMF, CmpFMF);
3506
3507 // unionValue with FastMathFlags() drops all rewriter based flags
3508 FastMathFlags NewFAbsFMF =
3509 CommonRewriteFMF | FastMathFlags::unionValue(FAbsFMF, FastMathFlags());
3510 FastMathFlags NewCmpFMF =
3511 CommonRewriteFMF | FastMathFlags::unionValue(CmpFMF, FastMathFlags());
3512
3513 // When X is NaN, the old code evaluated fabs(Y), while the new code evaluates
3514 // fabs(X). Do not preserve nnan on either newly-created instruction.
3515 NewFAbsFMF.setNoNaNs(false);
3516 NewCmpFMF.setNoNaNs(false);
3517
3518 Value *NewAbs = IC.Builder.CreateFAbs(X, FMFSource(NewFAbsFMF));
3519 Value *NewCmp =
3520 IC.Builder.CreateFCmpFMF(Pred, NewAbs, Cmp1, FMFSource(NewCmpFMF));
3521 Value *NewSel = IC.Builder.CreateSelectFMF(NewCmp, X, Y, &SI);
3522 return IC.replaceInstUsesWith(SI, NewSel);
3523}
3524
3525// Match the following IR pattern:
3526// %x.lowbits = and i8 %x, %lowbitmask
3527// %x.lowbits.are.zero = icmp eq i8 %x.lowbits, 0
3528// %x.biased = add i8 %x, %bias
3529// %x.biased.highbits = and i8 %x.biased, %highbitmask
3530// %x.roundedup = select i1 %x.lowbits.are.zero, i8 %x, i8 %x.biased.highbits
3531// Define:
3532// %alignment = add i8 %lowbitmask, 1
3533// Iff 1. an %alignment is a power-of-two (aka, %lowbitmask is a low bit mask)
3534// and 2. %bias is equal to either %lowbitmask or %alignment,
3535// and 3. %highbitmask is equal to ~%lowbitmask (aka, to -%alignment)
3536// then this pattern can be transformed into:
3537// %x.offset = add i8 %x, %lowbitmask
3538// %x.roundedup = and i8 %x.offset, %highbitmask
3539static Value *
3540foldRoundUpIntegerWithPow2Alignment(SelectInst &SI,
3541 InstCombiner::BuilderTy &Builder) {
3542 Value *Cond = SI.getCondition();
3543 Value *X = SI.getTrueValue();
3544 Value *XBiasedHighBits = SI.getFalseValue();
3545
3546 CmpPredicate Pred;
3547 Value *XLowBits;
3548 if (!match(Cond, m_ICmp(Pred, m_Value(XLowBits), m_ZeroInt())) ||
3549 !ICmpInst::isEquality(Pred))
3550 return nullptr;
3551
3552 if (Pred == ICmpInst::Predicate::ICMP_NE)
3553 std::swap(X, XBiasedHighBits);
3554
3555 // FIXME: we could support non non-splats here.
3556
3557 const APInt *LowBitMaskCst;
3558 if (!match(XLowBits, m_And(m_Specific(X), m_APIntAllowPoison(LowBitMaskCst))))
3559 return nullptr;
3560
3561 // Match even if the AND and ADD are swapped.
3562 const APInt *BiasCst, *HighBitMaskCst;
3563 if (!match(XBiasedHighBits,
3565 m_APIntAllowPoison(HighBitMaskCst))) &&
3566 !match(XBiasedHighBits,
3567 m_Add(m_And(m_Specific(X), m_APIntAllowPoison(HighBitMaskCst)),
3568 m_APIntAllowPoison(BiasCst))))
3569 return nullptr;
3570
3571 if (!LowBitMaskCst->isMask())
3572 return nullptr;
3573
3574 APInt InvertedLowBitMaskCst = ~*LowBitMaskCst;
3575 if (InvertedLowBitMaskCst != *HighBitMaskCst)
3576 return nullptr;
3577
3578 APInt AlignmentCst = *LowBitMaskCst + 1;
3579
3580 if (*BiasCst != AlignmentCst && *BiasCst != *LowBitMaskCst)
3581 return nullptr;
3582
3583 if (!XBiasedHighBits->hasOneUse()) {
3584 // We can't directly return XBiasedHighBits if it is more poisonous.
3585 if (*BiasCst == *LowBitMaskCst && impliesPoison(XBiasedHighBits, X))
3586 return XBiasedHighBits;
3587 return nullptr;
3588 }
3589
3590 // FIXME: could we preserve undef's here?
3591 Type *Ty = X->getType();
3592 Value *XOffset = Builder.CreateAdd(X, ConstantInt::get(Ty, *LowBitMaskCst),
3593 X->getName() + ".biased");
3594 Value *R = Builder.CreateAnd(XOffset, ConstantInt::get(Ty, *HighBitMaskCst));
3595 R->takeName(&SI);
3596 return R;
3597}
3598
3599namespace {
3600struct DecomposedSelect {
3601 Value *Cond = nullptr;
3602 Value *TrueVal = nullptr;
3603 Value *FalseVal = nullptr;
3604};
3605} // namespace
3606
3607/// Folds patterns like:
3608/// select c2 (select c1 a b) (select c1 b a)
3609/// into:
3610/// select (xor c1 c2) b a
3611static Instruction *
3612foldSelectOfSymmetricSelect(SelectInst &OuterSelVal,
3613 InstCombiner::BuilderTy &Builder) {
3614
3615 Value *OuterCond, *InnerCond, *InnerTrueVal, *InnerFalseVal;
3616 if (!match(
3617 &OuterSelVal,
3618 m_Select(m_Value(OuterCond),
3619 m_OneUse(m_Select(m_Value(InnerCond), m_Value(InnerTrueVal),
3620 m_Value(InnerFalseVal))),
3621 m_OneUse(m_Select(m_Deferred(InnerCond),
3622 m_Deferred(InnerFalseVal),
3623 m_Deferred(InnerTrueVal))))))
3624 return nullptr;
3625
3626 if (OuterCond->getType() != InnerCond->getType())
3627 return nullptr;
3628
3629 Value *Xor = Builder.CreateXor(InnerCond, OuterCond);
3630 return SelectInst::Create(Xor, InnerFalseVal, InnerTrueVal);
3631}
3632
3633/// Look for patterns like
3634/// %outer.cond = select i1 %inner.cond, i1 %alt.cond, i1 false
3635/// %inner.sel = select i1 %inner.cond, i8 %inner.sel.t, i8 %inner.sel.f
3636/// %outer.sel = select i1 %outer.cond, i8 %outer.sel.t, i8 %inner.sel
3637/// and rewrite it as
3638/// %inner.sel = select i1 %cond.alternative, i8 %sel.outer.t, i8 %sel.inner.t
3639/// %sel.outer = select i1 %cond.inner, i8 %inner.sel, i8 %sel.inner.f
3640static Instruction *foldNestedSelects(SelectInst &OuterSelVal,
3641 InstCombiner::BuilderTy &Builder) {
3642 // We must start with a `select`.
3643 DecomposedSelect OuterSel;
3644 match(&OuterSelVal,
3645 m_Select(m_Value(OuterSel.Cond), m_Value(OuterSel.TrueVal),
3646 m_Value(OuterSel.FalseVal)));
3647
3648 // Canonicalize inversion of the outermost `select`'s condition.
3649 if (match(OuterSel.Cond, m_Not(m_Value(OuterSel.Cond))))
3650 std::swap(OuterSel.TrueVal, OuterSel.FalseVal);
3651
3652 // The condition of the outermost select must be an `and`/`or`.
3653 if (!match(OuterSel.Cond, m_c_LogicalOp(m_Value(), m_Value())))
3654 return nullptr;
3655
3656 // Depending on the logical op, inner select might be in different hand.
3657 bool IsAndVariant = match(OuterSel.Cond, m_LogicalAnd());
3658 Value *InnerSelVal = IsAndVariant ? OuterSel.FalseVal : OuterSel.TrueVal;
3659
3660 // Profitability check - avoid increasing instruction count.
3661 if (none_of(ArrayRef<Value *>({OuterSelVal.getCondition(), InnerSelVal}),
3663 return nullptr;
3664
3665 // The appropriate hand of the outermost `select` must be a select itself.
3666 DecomposedSelect InnerSel;
3667 if (!match(InnerSelVal,
3668 m_Select(m_Value(InnerSel.Cond), m_Value(InnerSel.TrueVal),
3669 m_Value(InnerSel.FalseVal))))
3670 return nullptr;
3671
3672 // Canonicalize inversion of the innermost `select`'s condition.
3673 if (match(InnerSel.Cond, m_Not(m_Value(InnerSel.Cond))))
3674 std::swap(InnerSel.TrueVal, InnerSel.FalseVal);
3675
3676 Value *AltCond = nullptr;
3677 auto matchOuterCond = [OuterSel, IsAndVariant, &AltCond](auto m_InnerCond) {
3678 // An unsimplified select condition can match both LogicalAnd and LogicalOr
3679 // (select true, true, false). Since below we assume that LogicalAnd implies
3680 // InnerSel match the FVal and vice versa for LogicalOr, we can't match the
3681 // alternative pattern here.
3682 return IsAndVariant ? match(OuterSel.Cond,
3683 m_c_LogicalAnd(m_InnerCond, m_Value(AltCond)))
3684 : match(OuterSel.Cond,
3685 m_c_LogicalOr(m_InnerCond, m_Value(AltCond)));
3686 };
3687
3688 // Finally, match the condition that was driving the outermost `select`,
3689 // it should be a logical operation between the condition that was driving
3690 // the innermost `select` (after accounting for the possible inversions
3691 // of the condition), and some other condition.
3692 if (matchOuterCond(m_Specific(InnerSel.Cond))) {
3693 // Done!
3694 } else if (Value * NotInnerCond; matchOuterCond(m_CombineAnd(
3695 m_Not(m_Specific(InnerSel.Cond)), m_Value(NotInnerCond)))) {
3696 // Done!
3697 std::swap(InnerSel.TrueVal, InnerSel.FalseVal);
3698 InnerSel.Cond = NotInnerCond;
3699 } else // Not the pattern we were looking for.
3700 return nullptr;
3701
3702 Value *SelInner = Builder.CreateSelect(
3703 AltCond, IsAndVariant ? OuterSel.TrueVal : InnerSel.FalseVal,
3704 IsAndVariant ? InnerSel.TrueVal : OuterSel.FalseVal);
3705 SelInner->takeName(InnerSelVal);
3706 return SelectInst::Create(InnerSel.Cond,
3707 IsAndVariant ? SelInner : InnerSel.TrueVal,
3708 !IsAndVariant ? SelInner : InnerSel.FalseVal);
3709}
3710
3711/// Return true if V is poison or \p Expected given that ValAssumedPoison is
3712/// already poison. For example, if ValAssumedPoison is `icmp samesign X, 10`
3713/// and V is `icmp ne X, 5`, impliesPoisonOrCond returns true.
3714static bool impliesPoisonOrCond(const Value *ValAssumedPoison, const Value *V,
3715 bool Expected, const SimplifyQuery &SQ) {
3716 if (impliesPoison(ValAssumedPoison, V))
3717 return true;
3718
3719 // Handle the case that ValAssumedPoison is `icmp samesign pred X, C1` and V
3720 // is `icmp pred X, C2`, where C1 is well-defined.
3721 if (auto *ICmp = dyn_cast<ICmpInst>(ValAssumedPoison)) {
3722 Value *LHS = ICmp->getOperand(0);
3723 const APInt *RHSC1;
3724 const APInt *RHSC2;
3725 CmpPredicate Pred;
3726 if (ICmp->hasSameSign() &&
3727 match(ICmp->getOperand(1), m_APIntForbidPoison(RHSC1)) &&
3728 match(V, m_ICmp(Pred, m_Specific(LHS), m_APIntAllowPoison(RHSC2)))) {
3729 unsigned BitWidth = RHSC1->getBitWidth();
3730 ConstantRange CRX =
3731 RHSC1->isNonNegative()
3734 : ConstantRange(APInt::getZero(BitWidth),
3735 APInt::getSignedMinValue(BitWidth));
3736 return CRX.icmp(Expected ? Pred : ICmpInst::getInverseCmpPredicate(Pred),
3737 *RHSC2);
3738 }
3739 }
3740 // For non-poison X in [0, 1], `trunc nuw X to i1` is not poison, but an
3741 // additional `nsw` flag makes it poison for X == 1.
3742 Value *A;
3743 if (match(ValAssumedPoison, m_NUWTrunc(m_Value(A))) &&
3744 !cast<TruncInst>(ValAssumedPoison)->hasNoSignedWrap() &&
3746 assert(ValAssumedPoison->getType()->isIntOrIntVectorTy(1));
3747 return computeKnownBits(
3748 A, SQ.getWithInstruction(cast<Instruction>(ValAssumedPoison)))
3749 .getMaxValue() == 1;
3750 }
3751
3752 return false;
3753}
3754
3756 Value *CondVal = SI.getCondition();
3757 Value *TrueVal = SI.getTrueValue();
3758 Value *FalseVal = SI.getFalseValue();
3759 Type *SelType = SI.getType();
3760
3761 // Avoid potential infinite loops by checking for non-constant condition.
3762 // TODO: Can we assert instead by improving canonicalizeSelectToShuffle()?
3763 // Scalar select must have simplified?
3764 if (!SelType->isIntOrIntVectorTy(1) || isa<Constant>(CondVal) ||
3765 TrueVal->getType() != CondVal->getType())
3766 return nullptr;
3767
3768 auto *One = ConstantInt::getTrue(SelType);
3769 auto *Zero = ConstantInt::getFalse(SelType);
3770 Value *A, *B, *C, *D;
3771
3772 // Folding select to and/or i1 isn't poison safe in general. impliesPoison
3773 // checks whether folding it does not convert a well-defined value into
3774 // poison.
3775 if (match(TrueVal, m_One())) {
3776 if (impliesPoisonOrCond(FalseVal, CondVal, /*Expected=*/false, SQ)) {
3777 // Change: A = select B, true, C --> A = or B, C
3778 return BinaryOperator::CreateOr(CondVal, FalseVal);
3779 }
3780
3781 if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_One(), m_Value(B)))) &&
3782 impliesPoisonOrCond(FalseVal, B, /*Expected=*/false, SQ)) {
3783 // (A || B) || C --> A || (B | C)
3784 Value *LOr = Builder.CreateLogicalOr(A, Builder.CreateOr(B, FalseVal));
3785 if (auto *I = dyn_cast<Instruction>(LOr)) {
3787 }
3788 return replaceInstUsesWith(SI, LOr);
3789 }
3790
3791 // (A && B) || (C && B) --> (A || C) && B
3792 if (match(CondVal, m_LogicalAnd(m_Value(A), m_Value(B))) &&
3793 match(FalseVal, m_LogicalAnd(m_Value(C), m_Value(D))) &&
3794 (CondVal->hasOneUse() || FalseVal->hasOneUse())) {
3795 bool CondLogicAnd = isa<SelectInst>(CondVal);
3796 bool FalseLogicAnd = isa<SelectInst>(FalseVal);
3797 auto AndFactorization = [&](Value *Common, Value *InnerCond,
3798 Value *InnerVal,
3799 bool SelFirst = false) -> Instruction * {
3800 Value *InnerSel = Builder.CreateSelectWithUnknownProfile(
3801 InnerCond, One, InnerVal, DEBUG_TYPE);
3802 if (SelFirst)
3803 std::swap(Common, InnerSel);
3804 if (FalseLogicAnd || (CondLogicAnd && Common == A))
3805 return createSelectInstWithUnknownProfile(Common, InnerSel, Zero);
3806 else
3807 return BinaryOperator::CreateAnd(Common, InnerSel);
3808 };
3809
3810 if (A == C)
3811 return AndFactorization(A, B, D);
3812 if (A == D)
3813 return AndFactorization(A, B, C);
3814 if (B == C)
3815 return AndFactorization(B, A, D);
3816 if (B == D)
3817 return AndFactorization(B, A, C, CondLogicAnd && FalseLogicAnd);
3818 }
3819 }
3820
3821 if (match(FalseVal, m_Zero())) {
3822 if (impliesPoisonOrCond(TrueVal, CondVal, /*Expected=*/true, SQ)) {
3823 // Change: A = select B, C, false --> A = and B, C
3824 return BinaryOperator::CreateAnd(CondVal, TrueVal);
3825 }
3826
3827 if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_Value(B), m_Zero()))) &&
3828 impliesPoisonOrCond(TrueVal, B, /*Expected=*/true, SQ)) {
3829 // (A && B) && C --> A && (B & C)
3830 Value *LAnd = Builder.CreateLogicalAnd(A, Builder.CreateAnd(B, TrueVal));
3831 if (auto *I = dyn_cast<Instruction>(LAnd)) {
3833 }
3834 return replaceInstUsesWith(SI, LAnd);
3835 }
3836
3837 // (A || B) && (C || B) --> (A && C) || B
3838 if (match(CondVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3839 match(TrueVal, m_LogicalOr(m_Value(C), m_Value(D))) &&
3840 (CondVal->hasOneUse() || TrueVal->hasOneUse())) {
3841 bool CondLogicOr = isa<SelectInst>(CondVal);
3842 bool TrueLogicOr = isa<SelectInst>(TrueVal);
3843 auto OrFactorization = [&](Value *Common, Value *InnerCond,
3844 Value *InnerVal,
3845 bool SelFirst = false) -> Instruction * {
3846 Value *InnerSel = Builder.CreateSelectWithUnknownProfile(
3847 InnerCond, InnerVal, Zero, DEBUG_TYPE);
3848 if (SelFirst)
3849 std::swap(Common, InnerSel);
3850 if (TrueLogicOr || (CondLogicOr && Common == A))
3851 return createSelectInstWithUnknownProfile(Common, One, InnerSel);
3852 else
3853 return BinaryOperator::CreateOr(Common, InnerSel);
3854 };
3855
3856 if (A == C)
3857 return OrFactorization(A, B, D);
3858 if (A == D)
3859 return OrFactorization(A, B, C);
3860 if (B == C)
3861 return OrFactorization(B, A, D);
3862 if (B == D)
3863 return OrFactorization(B, A, C, CondLogicOr && TrueLogicOr);
3864 }
3865 }
3866
3867 // We match the "full" 0 or 1 constant here to avoid a potential infinite
3868 // loop with vectors that may have undefined/poison elements.
3869 // select a, false, b -> select !a, b, false
3870 if (match(TrueVal, m_Specific(Zero))) {
3871 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
3872 SelectInst *NewSI = SelectInst::Create(NotCond, FalseVal, Zero, "", nullptr,
3873 /*MDFrom=*/&SI);
3874 NewSI->swapProfMetadata();
3875 return NewSI;
3876 }
3877 // select a, b, true -> select !a, true, b
3878 if (match(FalseVal, m_Specific(One))) {
3879 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
3880 SelectInst *NewSI =
3881 SelectInst::Create(NotCond, One, TrueVal, "", nullptr, /*MDFrom=*/&SI);
3882 NewSI->swapProfMetadata();
3883 return NewSI;
3884 }
3885
3886 // DeMorgan in select form: !a && !b --> !(a || b)
3887 // select !a, !b, false --> not (select a, true, b)
3888 if (match(&SI, m_LogicalAnd(m_Not(m_Value(A)), m_Not(m_Value(B)))) &&
3889 (CondVal->hasOneUse() || TrueVal->hasOneUse()) &&
3890 !match(A, m_ConstantExpr()) && !match(B, m_ConstantExpr())) {
3891 SelectInst *NewSI =
3892 cast<SelectInst>(Builder.CreateSelect(A, One, B, "", /*MDFrom=*/&SI));
3893 NewSI->swapProfMetadata();
3894 return BinaryOperator::CreateNot(NewSI);
3895 }
3896
3897 // DeMorgan in select form: !a || !b --> !(a && b)
3898 // select !a, true, !b --> not (select a, b, false)
3899 if (match(&SI, m_LogicalOr(m_Not(m_Value(A)), m_Not(m_Value(B)))) &&
3900 (CondVal->hasOneUse() || FalseVal->hasOneUse()) &&
3901 !match(A, m_ConstantExpr()) && !match(B, m_ConstantExpr())) {
3902 SelectInst *NewSI =
3903 cast<SelectInst>(Builder.CreateSelect(A, B, Zero, "", /*MDFrom=*/&SI));
3904 NewSI->swapProfMetadata();
3905 return BinaryOperator::CreateNot(NewSI);
3906 }
3907
3908 // select (select a, true, b), true, b -> select a, true, b
3909 if (match(CondVal, m_Select(m_Value(A), m_One(), m_Value(B))) &&
3910 match(TrueVal, m_One()) && match(FalseVal, m_Specific(B)))
3911 return replaceOperand(SI, 0, A);
3912 // select (select a, b, false), b, false -> select a, b, false
3913 if (match(CondVal, m_Select(m_Value(A), m_Value(B), m_Zero())) &&
3914 match(TrueVal, m_Specific(B)) && match(FalseVal, m_Zero()))
3915 return replaceOperand(SI, 0, A);
3916
3917 // ~(A & B) & (A | B) --> A ^ B
3920 return BinaryOperator::CreateXor(A, B);
3921
3922 // select (~a | c), a, b -> select a, (select c, true, b), false
3923 if (match(CondVal,
3924 m_OneUse(m_c_Or(m_Not(m_Specific(TrueVal)), m_Value(C))))) {
3925 // TODO(#183864): We could improve the profile if P(~a | c) < 0.5, which
3926 // implies strong bounds on both operands (P(a) is high, P(c) is low).
3927 Value *OrV =
3928 Builder.CreateSelectWithUnknownProfile(C, One, FalseVal, DEBUG_TYPE);
3929 return createSelectInstWithUnknownProfile(TrueVal, OrV, Zero);
3930 }
3931 // select (c & b), a, b -> select b, (select ~c, true, a), false
3932 if (match(CondVal, m_OneUse(m_c_And(m_Value(C), m_Specific(FalseVal))))) {
3933 if (Value *NotC = getFreelyInverted(C, C->hasOneUse(), &Builder)) {
3934 Value *OrV = Builder.CreateSelectWithUnknownProfile(NotC, One, TrueVal,
3935 DEBUG_TYPE);
3936 return createSelectInstWithUnknownProfile(FalseVal, OrV, Zero);
3937 }
3938 }
3939 // select (a | c), a, b -> select a, true, (select ~c, b, false)
3940 if (match(CondVal, m_OneUse(m_c_Or(m_Specific(TrueVal), m_Value(C))))) {
3941 if (Value *NotC = getFreelyInverted(C, C->hasOneUse(), &Builder)) {
3942 // TODO(#183864): We could improve the profile if P(a | c) < 0.5, which
3943 // implies strong bounds on both operands (both P(a) and P(c) are low).
3944 Value *AndV = Builder.CreateSelectWithUnknownProfile(NotC, FalseVal, Zero,
3945 DEBUG_TYPE);
3946 return createSelectInstWithUnknownProfile(TrueVal, One, AndV);
3947 }
3948 }
3949 // select (c & ~b), a, b -> select b, true, (select c, a, false)
3950 if (match(CondVal,
3951 m_OneUse(m_c_And(m_Value(C), m_Not(m_Specific(FalseVal)))))) {
3952 Value *AndV =
3953 Builder.CreateSelectWithUnknownProfile(C, TrueVal, Zero, DEBUG_TYPE);
3954 return createSelectInstWithUnknownProfile(FalseVal, One, AndV);
3955 }
3956
3957 if (match(FalseVal, m_Zero()) || match(TrueVal, m_One())) {
3958 Use *Y = nullptr;
3959 bool IsAnd = match(FalseVal, m_Zero()) ? true : false;
3960 Value *Op1 = IsAnd ? TrueVal : FalseVal;
3961 if (isCheckForZeroAndMulWithOverflow(CondVal, Op1, IsAnd, Y)) {
3962 auto *FI = new FreezeInst(*Y, (*Y)->getName() + ".fr");
3963 InsertNewInstBefore(FI, cast<Instruction>(Y->getUser())->getIterator());
3964 replaceUse(*Y, FI);
3965 return replaceInstUsesWith(SI, Op1);
3966 }
3967
3968 if (auto *V = foldBooleanAndOr(CondVal, Op1, SI, IsAnd,
3969 /*IsLogical=*/true))
3970 return replaceInstUsesWith(SI, V);
3971 }
3972
3973 // select (a || b), c, false -> select a, c, false
3974 // select c, (a || b), false -> select c, a, false
3975 // if c implies that b is false.
3976 if (match(CondVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3977 match(FalseVal, m_Zero())) {
3978 std::optional<bool> Res = isImpliedCondition(TrueVal, B, DL);
3979 if (Res && *Res == false)
3980 return replaceOperand(SI, 0, A);
3981 }
3982 if (match(TrueVal, m_LogicalOr(m_Value(A), m_Value(B))) &&
3983 match(FalseVal, m_Zero())) {
3984 std::optional<bool> Res = isImpliedCondition(CondVal, B, DL);
3985 if (Res && *Res == false)
3986 return replaceOperand(SI, 1, A);
3987 }
3988 // select c, true, (a && b) -> select c, true, a
3989 // select (a && b), true, c -> select a, true, c
3990 // if c = false implies that b = true
3991 if (match(TrueVal, m_One()) &&
3992 match(FalseVal, m_LogicalAnd(m_Value(A), m_Value(B)))) {
3993 std::optional<bool> Res = isImpliedCondition(CondVal, B, DL, false);
3994 if (Res && *Res == true)
3995 return replaceOperand(SI, 2, A);
3996 }
3997 if (match(CondVal, m_LogicalAnd(m_Value(A), m_Value(B))) &&
3998 match(TrueVal, m_One())) {
3999 std::optional<bool> Res = isImpliedCondition(FalseVal, B, DL, false);
4000 if (Res && *Res == true)
4001 return replaceOperand(SI, 0, A);
4002 }
4003
4004 if (match(TrueVal, m_One())) {
4005 // (C && A) || (!C && B) --> select C, A, B (and similar cases)
4006 if (auto *V = FoldOrOfLogicalAnds(CondVal, FalseVal)) {
4007 return V;
4008 }
4009 }
4010
4011 return nullptr;
4012}
4013
4014// Return true if we can safely remove the select instruction for std::bit_ceil
4015// pattern.
4016static bool isSafeToRemoveBitCeilSelect(ICmpInst::Predicate Pred, Value *Cond0,
4017 const APInt *Cond1, Value *CtlzOp,
4018 unsigned BitWidth,
4019 bool &ShouldDropNoWrap) {
4020 // The challenge in recognizing std::bit_ceil(X) is that the operand is used
4021 // for the CTLZ proper and select condition, each possibly with some
4022 // operation like add and sub.
4023 //
4024 // Our aim is to make sure that -ctlz & (BitWidth - 1) == 0 even when the
4025 // select instruction would select 1, which allows us to get rid of the select
4026 // instruction.
4027 //
4028 // To see if we can do so, we do some symbolic execution with ConstantRange.
4029 // Specifically, we compute the range of values that Cond0 could take when
4030 // Cond == false. Then we successively transform the range until we obtain
4031 // the range of values that CtlzOp could take.
4032 //
4033 // Conceptually, we follow the def-use chain backward from Cond0 while
4034 // transforming the range for Cond0 until we meet the common ancestor of Cond0
4035 // and CtlzOp. Then we follow the def-use chain forward until we obtain the
4036 // range for CtlzOp. That said, we only follow at most one ancestor from
4037 // Cond0. Likewise, we only follow at most one ancestor from CtrlOp.
4038
4040 CmpInst::getInversePredicate(Pred), *Cond1);
4041
4042 ShouldDropNoWrap = false;
4043
4044 // Match the operation that's used to compute CtlzOp from CommonAncestor. If
4045 // CtlzOp == CommonAncestor, return true as no operation is needed. If a
4046 // match is found, execute the operation on CR, update CR, and return true.
4047 // Otherwise, return false.
4048 auto MatchForward = [&](Value *CommonAncestor) {
4049 const APInt *C = nullptr;
4050 if (CtlzOp == CommonAncestor)
4051 return true;
4052 if (match(CtlzOp, m_Add(m_Specific(CommonAncestor), m_APInt(C)))) {
4053 ShouldDropNoWrap = true;
4054 CR = CR.add(*C);
4055 return true;
4056 }
4057 if (match(CtlzOp, m_Sub(m_APInt(C), m_Specific(CommonAncestor)))) {
4058 ShouldDropNoWrap = true;
4059 CR = ConstantRange(*C).sub(CR);
4060 return true;
4061 }
4062 if (match(CtlzOp, m_Not(m_Specific(CommonAncestor)))) {
4063 CR = CR.binaryNot();
4064 return true;
4065 }
4066 return false;
4067 };
4068
4069 const APInt *C = nullptr;
4070 Value *CommonAncestor;
4071 if (MatchForward(Cond0)) {
4072 // Cond0 is either CtlzOp or CtlzOp's parent. CR has been updated.
4073 } else if (match(Cond0, m_Add(m_Value(CommonAncestor), m_APInt(C)))) {
4074 CR = CR.sub(*C);
4075 if (!MatchForward(CommonAncestor))
4076 return false;
4077 // Cond0's parent is either CtlzOp or CtlzOp's parent. CR has been updated.
4078 } else {
4079 return false;
4080 }
4081
4082 // Return true if all the values in the range are either 0 or negative (if
4083 // treated as signed). We do so by evaluating:
4084 //
4085 // CR - 1 u>= (1 << BitWidth) - 1.
4086 APInt IntMax = APInt::getSignMask(BitWidth) - 1;
4087 CR = CR.sub(APInt(BitWidth, 1));
4088 return CR.icmp(ICmpInst::ICMP_UGE, IntMax);
4089}
4090
4091// Transform the std::bit_ceil(X) pattern like:
4092//
4093// %dec = add i32 %x, -1
4094// %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
4095// %sub = sub i32 32, %ctlz
4096// %shl = shl i32 1, %sub
4097// %ugt = icmp ugt i32 %x, 1
4098// %sel = select i1 %ugt, i32 %shl, i32 1
4099//
4100// into:
4101//
4102// %dec = add i32 %x, -1
4103// %ctlz = tail call i32 @llvm.ctlz.i32(i32 %dec, i1 false)
4104// %neg = sub i32 0, %ctlz
4105// %masked = and i32 %ctlz, 31
4106// %shl = shl i32 1, %sub
4107//
4108// Note that the select is optimized away while the shift count is masked with
4109// 31. We handle some variations of the input operand like std::bit_ceil(X +
4110// 1).
4111static Instruction *foldBitCeil(SelectInst &SI, IRBuilderBase &Builder,
4112 InstCombinerImpl &IC) {
4113 Type *SelType = SI.getType();
4114 unsigned BitWidth = SelType->getScalarSizeInBits();
4115 if (!isPowerOf2_32(BitWidth))
4116 return nullptr;
4117
4118 Value *FalseVal = SI.getFalseValue();
4119 Value *TrueVal = SI.getTrueValue();
4120 CmpPredicate Pred;
4121 const APInt *Cond1;
4122 Value *Cond0, *Ctlz, *CtlzOp;
4123 if (!match(SI.getCondition(), m_ICmp(Pred, m_Value(Cond0), m_APInt(Cond1))))
4124 return nullptr;
4125
4126 if (match(TrueVal, m_One())) {
4127 std::swap(FalseVal, TrueVal);
4128 Pred = CmpInst::getInversePredicate(Pred);
4129 }
4130
4131 bool ShouldDropNoWrap;
4132
4133 if (!match(FalseVal, m_One()) ||
4134 !match(TrueVal,
4136 m_Value(Ctlz)))))) ||
4137 !match(Ctlz, m_Ctlz(m_Value(CtlzOp), m_Value())) ||
4138 !isSafeToRemoveBitCeilSelect(Pred, Cond0, Cond1, CtlzOp, BitWidth,
4139 ShouldDropNoWrap))
4140 return nullptr;
4141
4142 if (ShouldDropNoWrap) {
4143 cast<Instruction>(CtlzOp)->setHasNoUnsignedWrap(false);
4144 cast<Instruction>(CtlzOp)->setHasNoSignedWrap(false);
4145 }
4146
4147 // Build 1 << (-CTLZ & (BitWidth-1)). The negation likely corresponds to a
4148 // single hardware instruction as opposed to BitWidth - CTLZ, where BitWidth
4149 // is an integer constant. Masking with BitWidth-1 comes free on some
4150 // hardware as part of the shift instruction.
4151
4152 // Drop range attributes and re-infer them in the next iteration.
4153 cast<Instruction>(Ctlz)->dropPoisonGeneratingAnnotations();
4155 Value *Neg = Builder.CreateNeg(Ctlz);
4156 Value *Masked =
4157 Builder.CreateAnd(Neg, ConstantInt::get(SelType, BitWidth - 1));
4158 return BinaryOperator::Create(Instruction::Shl, ConstantInt::get(SelType, 1),
4159 Masked);
4160}
4161
4162// This function tries to fold the following operations:
4163// (x < y) ? -1 : zext(x != y)
4164// (x < y) ? -1 : zext(x > y)
4165// (x > y) ? 1 : sext(x != y)
4166// (x > y) ? 1 : sext(x < y)
4167// (x == y) ? 0 : (x > y ? 1 : -1)
4168// (x == y) ? 0 : (x < y ? -1 : 1)
4169// Special case: x == C ? 0 : (x > C - 1 ? 1 : -1)
4170// Special case: x == C ? 0 : (x < C + 1 ? -1 : 1)
4171// Into ucmp/scmp(x, y), where signedness is determined by the signedness
4172// of the comparison in the original sequence.
4174 Value *TV = SI.getTrueValue();
4175 Value *FV = SI.getFalseValue();
4176
4177 CmpPredicate Pred;
4178 Value *LHS, *RHS;
4179 if (!match(SI.getCondition(), m_ICmp(Pred, m_Value(LHS), m_Value(RHS))))
4180 return nullptr;
4181
4182 if (!LHS->getType()->isIntOrIntVectorTy())
4183 return nullptr;
4184
4185 // If there is no -1, 0 or 1 at TV, then invert the select statement and try
4186 // to canonicalize to one of the forms above
4187 if (!isa<Constant>(TV)) {
4188 if (!isa<Constant>(FV))
4189 return nullptr;
4191 std::swap(TV, FV);
4192 }
4193
4195 if (Constant *C = dyn_cast<Constant>(RHS)) {
4196 auto FlippedPredAndConst =
4198 if (!FlippedPredAndConst)
4199 return nullptr;
4200 Pred = FlippedPredAndConst->first;
4201 RHS = FlippedPredAndConst->second;
4202 } else {
4203 return nullptr;
4204 }
4205 }
4206
4207 // Try to swap operands and the predicate. We need to be careful when doing
4208 // so because two of the patterns have opposite predicates, so use the
4209 // constant inside select to determine if swapping operands would be
4210 // beneficial to us.
4211 if ((ICmpInst::isGT(Pred) && match(TV, m_AllOnes())) ||
4212 (ICmpInst::isLT(Pred) && match(TV, m_One()))) {
4213 Pred = ICmpInst::getSwappedPredicate(Pred);
4214 std::swap(LHS, RHS);
4215 }
4216 bool IsSigned = ICmpInst::isSigned(Pred);
4217
4218 bool Replace = false;
4219 CmpPredicate ExtendedCmpPredicate;
4220 // (x < y) ? -1 : zext(x != y)
4221 // (x < y) ? -1 : zext(x > y)
4222 if (ICmpInst::isLT(Pred) && match(TV, m_AllOnes()) &&
4223 match(FV, m_ZExt(m_c_ICmp(ExtendedCmpPredicate, m_Specific(LHS),
4224 m_Specific(RHS)))) &&
4225 (ExtendedCmpPredicate == ICmpInst::ICMP_NE ||
4226 ICmpInst::getSwappedPredicate(ExtendedCmpPredicate) == Pred))
4227 Replace = true;
4228
4229 // (x > y) ? 1 : sext(x != y)
4230 // (x > y) ? 1 : sext(x < y)
4231 if (ICmpInst::isGT(Pred) && match(TV, m_One()) &&
4232 match(FV, m_SExt(m_c_ICmp(ExtendedCmpPredicate, m_Specific(LHS),
4233 m_Specific(RHS)))) &&
4234 (ExtendedCmpPredicate == ICmpInst::ICMP_NE ||
4235 ICmpInst::getSwappedPredicate(ExtendedCmpPredicate) == Pred))
4236 Replace = true;
4237
4238 // (x == y) ? 0 : (x > y ? 1 : -1)
4239 CmpPredicate FalseBranchSelectPredicate;
4240 const APInt *InnerTV, *InnerFV;
4241 if (Pred == ICmpInst::ICMP_EQ && match(TV, m_Zero()) &&
4242 match(FV, m_Select(m_c_ICmp(FalseBranchSelectPredicate, m_Specific(LHS),
4243 m_Specific(RHS)),
4244 m_APInt(InnerTV), m_APInt(InnerFV)))) {
4245 if (!ICmpInst::isGT(FalseBranchSelectPredicate)) {
4246 FalseBranchSelectPredicate =
4247 ICmpInst::getSwappedPredicate(FalseBranchSelectPredicate);
4248 std::swap(LHS, RHS);
4249 }
4250
4251 if (!InnerTV->isOne()) {
4252 std::swap(InnerTV, InnerFV);
4253 std::swap(LHS, RHS);
4254 }
4255
4256 if (ICmpInst::isGT(FalseBranchSelectPredicate) && InnerTV->isOne() &&
4257 InnerFV->isAllOnes()) {
4258 IsSigned = ICmpInst::isSigned(FalseBranchSelectPredicate);
4259 Replace = true;
4260 }
4261 }
4262
4263 // Special cases with constants: x == C ? 0 : (x > C-1 ? 1 : -1)
4264 if (Pred == ICmpInst::ICMP_EQ && match(TV, m_Zero())) {
4265 const APInt *C;
4266 if (match(RHS, m_APInt(C))) {
4267 CmpPredicate InnerPred;
4268 Value *InnerRHS;
4269 const APInt *InnerTV, *InnerFV;
4270 if (match(FV,
4271 m_Select(m_ICmp(InnerPred, m_Specific(LHS), m_Value(InnerRHS)),
4272 m_APInt(InnerTV), m_APInt(InnerFV)))) {
4273
4274 // x == C ? 0 : (x > C-1 ? 1 : -1)
4275 if (ICmpInst::isGT(InnerPred) && InnerTV->isOne() &&
4276 InnerFV->isAllOnes()) {
4277 IsSigned = ICmpInst::isSigned(InnerPred);
4278 bool CanSubOne = IsSigned ? !C->isMinSignedValue() : !C->isMinValue();
4279 if (CanSubOne) {
4280 APInt Cminus1 = *C - 1;
4281 if (match(InnerRHS, m_SpecificInt(Cminus1)))
4282 Replace = true;
4283 }
4284 }
4285
4286 // x == C ? 0 : (x < C+1 ? -1 : 1)
4287 if (ICmpInst::isLT(InnerPred) && InnerTV->isAllOnes() &&
4288 InnerFV->isOne()) {
4289 IsSigned = ICmpInst::isSigned(InnerPred);
4290 bool CanAddOne = IsSigned ? !C->isMaxSignedValue() : !C->isMaxValue();
4291 if (CanAddOne) {
4292 APInt Cplus1 = *C + 1;
4293 if (match(InnerRHS, m_SpecificInt(Cplus1)))
4294 Replace = true;
4295 }
4296 }
4297 }
4298 }
4299 }
4300
4301 Intrinsic::ID IID = IsSigned ? Intrinsic::scmp : Intrinsic::ucmp;
4302 if (Replace)
4303 return replaceInstUsesWith(
4304 SI, Builder.CreateIntrinsic(SI.getType(), IID, {LHS, RHS}));
4305 return nullptr;
4306}
4307
4309 const Instruction *CtxI) const {
4310 KnownFPClass Known =
4311 computeKnownFPClass(MulVal, FMF, fcNegative, SQ.getWithInstruction(CtxI));
4312
4313 return Known.isKnownNeverNaN() && Known.isKnownNeverInfinity() &&
4314 (FMF.noSignedZeros() || Known.signBitIsZeroOrNaN());
4315}
4316
4317static bool matchFMulByZeroIfResultEqZero(InstCombinerImpl &IC, Value *Cmp0,
4318 Value *Cmp1, Value *TrueVal,
4319 Value *FalseVal, Instruction &CtxI,
4320 bool SelectIsNSZ) {
4321 Value *MulRHS;
4322 if (match(Cmp1, m_PosZeroFP()) &&
4323 match(TrueVal, m_c_FMul(m_Specific(Cmp0), m_Value(MulRHS)))) {
4324 FastMathFlags FMF = cast<FPMathOperator>(TrueVal)->getFastMathFlags();
4325 // nsz must be on the select, it must be ignored on the multiply. We
4326 // need nnan and ninf on the multiply for the other value.
4327 FMF.setNoSignedZeros(SelectIsNSZ);
4328 return IC.fmulByZeroIsZero(MulRHS, FMF, &CtxI);
4329 }
4330
4331 return false;
4332}
4333
4334/// Check whether the KnownBits of a select arm may be affected by the
4335/// select condition.
4336static bool hasAffectedValue(Value *V, SmallPtrSetImpl<Value *> &Affected,
4337 unsigned Depth) {
4339 return false;
4340
4341 // Ignore the case where the select arm itself is affected. These cases
4342 // are handled more efficiently by other optimizations.
4343 if (Depth != 0 && Affected.contains(V))
4344 return true;
4345
4346 if (auto *I = dyn_cast<Instruction>(V)) {
4347 if (isa<PHINode>(I)) {
4349 return false;
4351 }
4352 return any_of(I->operands(), [&](Value *Op) {
4353 return Op->getType()->isIntOrIntVectorTy() &&
4354 hasAffectedValue(Op, Affected, Depth + 1);
4355 });
4356 }
4357
4358 return false;
4359}
4360
4361// This transformation enables the possibility of transforming fcmp + sel into
4362// a fmaxnum/fminnum intrinsic.
4363static Value *foldSelectIntoAddConstant(SelectInst &SI,
4364 InstCombiner::BuilderTy &Builder) {
4365 // Do this transformation only when select instruction gives NaN and NSZ
4366 // guarantee.
4367 auto *SIFOp = dyn_cast<FPMathOperator>(&SI);
4368 if (!SIFOp || !SIFOp->hasNoSignedZeros() || !SIFOp->hasNoNaNs())
4369 return nullptr;
4370
4371 auto TryFoldIntoAddConstant =
4372 [&Builder, &SI](CmpInst::Predicate Pred, Value *X, Value *Z,
4373 Instruction *FAdd, Constant *C, bool Swapped) -> Value * {
4374 // Only these relational predicates can be transformed into maxnum/minnum
4375 // intrinsic.
4376 if (!CmpInst::isRelational(Pred) || !match(Z, m_AnyZeroFP()))
4377 return nullptr;
4378
4380 return nullptr;
4381
4382 Value *NewSelect = Builder.CreateSelect(SI.getCondition(), Swapped ? Z : X,
4383 Swapped ? X : Z, "", &SI);
4384 NewSelect->takeName(&SI);
4385
4386 Value *NewFAdd = Builder.CreateFAdd(NewSelect, C);
4387 NewFAdd->takeName(FAdd);
4388
4389 // Propagate FastMath flags
4390 FastMathFlags SelectFMF = SI.getFastMathFlags();
4391 FastMathFlags FAddFMF = FAdd->getFastMathFlags();
4392 FastMathFlags NewFMF = FastMathFlags::intersectRewrite(SelectFMF, FAddFMF) |
4393 FastMathFlags::unionValue(SelectFMF, FAddFMF);
4394 cast<Instruction>(NewFAdd)->setFastMathFlags(NewFMF);
4395 cast<Instruction>(NewSelect)->setFastMathFlags(NewFMF);
4396
4397 return NewFAdd;
4398 };
4399
4400 // select((fcmp Pred, X, 0), (fadd X, C), C)
4401 // => fadd((select (fcmp Pred, X, 0), X, 0), C)
4402 //
4403 // Pred := OGT, OGE, OLT, OLE, UGT, UGE, ULT, and ULE
4405 Constant *C;
4406 Value *X, *Z;
4407 CmpPredicate Pred;
4408
4409 // Note: OneUse check for `Cmp` is necessary because it makes sure that other
4410 // InstCombine folds don't undo this transformation and cause an infinite
4411 // loop. Furthermore, it could also increase the operation count.
4412 if (match(&SI, m_Select(m_OneUse(m_FCmp(Pred, m_Value(X), m_Value(Z))),
4414 return TryFoldIntoAddConstant(Pred, X, Z, FAdd, C, /*Swapped=*/false);
4415
4416 if (match(&SI, m_Select(m_OneUse(m_FCmp(Pred, m_Value(X), m_Value(Z))),
4418 return TryFoldIntoAddConstant(Pred, X, Z, FAdd, C, /*Swapped=*/true);
4419
4420 return nullptr;
4421}
4422
4423static Value *foldSelectBitTest(SelectInst &Sel, Value *CondVal, Value *TrueVal,
4424 Value *FalseVal,
4425 InstCombiner::BuilderTy &Builder,
4426 const SimplifyQuery &SQ) {
4427 // If this is a vector select, we need a vector compare.
4428 Type *SelType = Sel.getType();
4429 if (SelType->isVectorTy() != CondVal->getType()->isVectorTy())
4430 return nullptr;
4431
4432 Value *V;
4433 APInt AndMask;
4434 bool CreateAnd = false;
4435 CmpPredicate Pred;
4436 Value *CmpLHS, *CmpRHS;
4437
4438 if (match(CondVal, m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS)))) {
4439 if (ICmpInst::isEquality(Pred)) {
4440 if (!match(CmpRHS, m_Zero()))
4441 return nullptr;
4442
4443 V = CmpLHS;
4444 const APInt *AndRHS;
4445 if (!match(CmpLHS, m_And(m_Value(), m_Power2(AndRHS))))
4446 return nullptr;
4447
4448 AndMask = *AndRHS;
4449 } else if (auto Res = decomposeBitTestICmp(CmpLHS, CmpRHS, Pred)) {
4450 assert(ICmpInst::isEquality(Res->Pred) && "Not equality test?");
4451 AndMask = Res->Mask;
4452 V = Res->X;
4454 AndMask &= Known.getMaxValue();
4455 if (!AndMask.isPowerOf2())
4456 return nullptr;
4457
4458 Pred = Res->Pred;
4459 CreateAnd = true;
4460 } else {
4461 return nullptr;
4462 }
4463 } else if (auto *Trunc = dyn_cast<TruncInst>(CondVal)) {
4464 V = Trunc->getOperand(0);
4465 AndMask = APInt(V->getType()->getScalarSizeInBits(), 1);
4466 Pred = ICmpInst::ICMP_NE;
4467 CreateAnd = !Trunc->hasNoUnsignedWrap();
4468 } else {
4469 return nullptr;
4470 }
4471
4472 if (Pred == ICmpInst::ICMP_NE)
4473 std::swap(TrueVal, FalseVal);
4474
4475 if (Value *X = foldSelectICmpAnd(Sel, CondVal, TrueVal, FalseVal, V, AndMask,
4476 CreateAnd, Builder))
4477 return X;
4478
4479 if (Value *X = foldSelectICmpAndBinOp(CondVal, TrueVal, FalseVal, V, AndMask,
4480 CreateAnd, Builder))
4481 return X;
4482
4483 return nullptr;
4484}
4485
4486/// This function makes the following folds:
4487/// select C, (sub 0, X), (xor X, -1)
4488/// -> sub (sext !C), X
4489/// select C, (xor X, -1), (sub 0, X)
4490/// -> sub (sext C), X
4491static Instruction *foldSelectNegNot(SelectInst &SI,
4492 InstCombiner::BuilderTy &Builder) {
4493 auto *CondVal = SI.getCondition();
4494 auto *TrueVal = SI.getTrueValue();
4495 auto *FalseVal = SI.getFalseValue();
4496 auto *SelTy = SI.getType();
4497
4498 if (!SelTy->isIntOrIntVectorTy() || SelTy->isIntOrIntVectorTy(1))
4499 return nullptr;
4500
4501 if (CondVal->getType()->isVectorTy() != SelTy->isVectorTy())
4502 return nullptr;
4503
4504 auto matchNegNot = [&](Value *Neg, Value *Not, Value *&X) -> bool {
4505 return match(Neg, m_OneUse(m_Neg(m_Value(X)))) &&
4506 match(Not, m_OneUse(m_Not(m_Specific(X))));
4507 };
4508
4509 Value *X;
4510 Value *Mask;
4511
4512 // select C, (sub 0, X), (xor X, -1) -> sub (sext !C), X
4513 if (matchNegNot(TrueVal, FalseVal, X)) {
4514 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
4515 Mask = Builder.CreateSExt(NotCond, SelTy);
4516 return BinaryOperator::CreateSub(Mask, X);
4517 }
4518
4519 // select C, (xor X, -1), (sub 0, X) -> sub (sext C), X
4520 if (matchNegNot(FalseVal, TrueVal, X)) {
4521 Mask = Builder.CreateSExt(CondVal, SelTy);
4522 return BinaryOperator::CreateSub(Mask, X);
4523 }
4524
4525 return nullptr;
4526}
4527
4528/// Fold select (A & Shift == 0 | B & Shift == 0), 0, Shift -> Shift & A & B
4529/// where Shift is known to be a power of two.
4530static Instruction *foldSelectAndOrPowerOfTwo(SelectInst &SI,
4531 InstCombiner::BuilderTy &Builder,
4532 const SimplifyQuery &SQ) {
4533 Value *Cond = SI.getCondition();
4534
4535 if (!Cond->hasOneUse())
4536 return nullptr;
4537
4538 Value *TrueVal = SI.getTrueValue();
4539 Value *FalseVal = SI.getFalseValue();
4540
4541 Value *A, *B, *Shift;
4542
4543 bool Case1 =
4544 match(TrueVal, m_Zero()) && match(FalseVal, m_Value(Shift)) &&
4546 m_c_And(m_Specific(Shift), m_Value(A)),
4547 m_Zero()),
4549 m_c_And(m_Specific(Shift), m_Value(B)),
4550 m_Zero())));
4551
4552 bool Case2 =
4553 match(FalseVal, m_Zero()) && match(TrueVal, m_Value(Shift)) &&
4555 m_c_And(m_Specific(Shift), m_Value(A)),
4556 m_Zero()),
4558 m_c_And(m_Specific(Shift), m_Value(B)),
4559 m_Zero())));
4560
4561 if ((Case1 || Case2) && isKnownToBeAPowerOfTwo(Shift, /*OrZero=*/true,
4562 SQ.getWithInstruction(&SI))) {
4563 Value *And1 = Builder.CreateAnd(Shift, A);
4564 return BinaryOperator::CreateAnd(And1, B);
4565 }
4566
4567 return nullptr;
4568}
4569
4570// Return true if no use can observe the sign of zero of the select result,
4571// looking through phis, selects and the loop back edge to the select itself.
4572static bool isSelectZeroSignInsignificant(SelectInst &SI) {
4573 // Bound the number of uses to look through to keep the compile time in
4574 // check.
4575 constexpr unsigned MaxUsesToLookThrough = 16;
4576 unsigned NumUses = 0;
4578 SmallVector<Instruction *> Worklist(1, &SI);
4579 while (!Worklist.empty()) {
4580 for (Use &U : Worklist.pop_back_val()->uses()) {
4581 if (++NumUses > MaxUsesToLookThrough)
4582 return false;
4583 auto *User = cast<Instruction>(U.getUser());
4584 if (User == &SI)
4585 continue;
4587 continue;
4589 if (Visited.insert(User).second)
4590 Worklist.push_back(User);
4591 continue;
4592 }
4593 return false;
4594 }
4595 }
4596 return true;
4597}
4598
4600 Value *CondVal = SI.getCondition();
4601 Value *TrueVal = SI.getTrueValue();
4602 Value *FalseVal = SI.getFalseValue();
4603 Type *SelType = SI.getType();
4604
4605 FastMathFlags FMF;
4606 if (auto *FPMO = dyn_cast_if_present<FPMathOperator>(&SI))
4607 FMF = FPMO->getFastMathFlags();
4608
4609 if (Value *V = simplifySelectInst(CondVal, TrueVal, FalseVal, FMF,
4610 SQ.getWithInstruction(&SI)))
4611 return replaceInstUsesWith(SI, V);
4612
4613 if (Instruction *I = canonicalizeSelectToShuffle(SI))
4614 return I;
4615
4616 if (Instruction *I = canonicalizeScalarSelectOfVecs(SI, *this))
4617 return I;
4618
4619 // Fold: select (icmp ult X, 2), X, ctpop(X) --> ctpop(X)
4620 // ctpop(0)==0 and ctpop(1)==1, so the guard is always redundant.
4621 if (match(FalseVal, m_Ctpop(m_Specific(TrueVal))) &&
4623 m_SpecificInt(2)))) {
4624 cast<Instruction>(FalseVal)->dropPoisonGeneratingAnnotations();
4626 return replaceInstUsesWith(SI, FalseVal);
4627 }
4628
4629 // If the type of select is not an integer type or if the condition and
4630 // the selection type are not both scalar nor both vector types, there is no
4631 // point in attempting to match these patterns.
4632 Type *CondType = CondVal->getType();
4633 if (!isa<Constant>(CondVal) && SelType->isIntOrIntVectorTy() &&
4634 CondType->isVectorTy() == SelType->isVectorTy()) {
4635 if (Value *S = simplifyWithOpReplaced(TrueVal, CondVal,
4636 ConstantInt::getTrue(CondType), SQ,
4637 /* AllowRefinement */ true))
4638 return replaceOperand(SI, 1, S);
4639
4640 if (Value *S = simplifyWithOpReplaced(FalseVal, CondVal,
4641 ConstantInt::getFalse(CondType), SQ,
4642 /* AllowRefinement */ true))
4643 return replaceOperand(SI, 2, S);
4644
4645 if (replaceInInstruction(TrueVal, CondVal,
4646 ConstantInt::getTrue(CondType)) ||
4647 replaceInInstruction(FalseVal, CondVal,
4648 ConstantInt::getFalse(CondType)))
4649 return &SI;
4650 }
4651
4652 if (Instruction *R = foldSelectOfBools(SI))
4653 return R;
4654
4655 // Selecting between two integer or vector splat integer constants?
4656 //
4657 // Note that we don't handle a scalar select of vectors:
4658 // select i1 %c, <2 x i8> <1, 1>, <2 x i8> <0, 0>
4659 // because that may need 3 instructions to splat the condition value:
4660 // extend, insertelement, shufflevector.
4661 //
4662 // Do not handle i1 TrueVal and FalseVal otherwise would result in
4663 // zext/sext i1 to i1.
4664 if (SelType->isIntOrIntVectorTy() && !SelType->isIntOrIntVectorTy(1) &&
4665 CondVal->getType()->isVectorTy() == SelType->isVectorTy()) {
4666 // select C, 1, 0 -> zext C to int
4667 if (match(TrueVal, m_One()) && match(FalseVal, m_Zero()))
4668 return new ZExtInst(CondVal, SelType);
4669
4670 // select C, -1, 0 -> sext C to int
4671 if (match(TrueVal, m_AllOnes()) && match(FalseVal, m_Zero()))
4672 return new SExtInst(CondVal, SelType);
4673
4674 // select C, 0, 1 -> zext !C to int
4675 if (match(TrueVal, m_Zero()) && match(FalseVal, m_One())) {
4676 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
4677 return new ZExtInst(NotCond, SelType);
4678 }
4679
4680 // select C, 0, -1 -> sext !C to int
4681 if (match(TrueVal, m_Zero()) && match(FalseVal, m_AllOnes())) {
4682 Value *NotCond = Builder.CreateNot(CondVal, "not." + CondVal->getName());
4683 return new SExtInst(NotCond, SelType);
4684 }
4685 }
4686
4687 if (Instruction *I = foldSelectNegNot(SI, Builder))
4688 return I;
4689
4690 if (Instruction *I = foldSelectAndOrPowerOfTwo(SI, Builder, SQ))
4691 return I;
4692
4693 auto *SIFPOp = dyn_cast<FPMathOperator>(&SI);
4694
4695 if (auto *FCmp = dyn_cast<FCmpInst>(CondVal)) {
4696 FCmpInst::Predicate Pred = FCmp->getPredicate();
4697 Value *Cmp0 = FCmp->getOperand(0), *Cmp1 = FCmp->getOperand(1);
4698 // Are we selecting a value based on a comparison of the two values?
4699 if ((Cmp0 == TrueVal && Cmp1 == FalseVal) ||
4700 (Cmp0 == FalseVal && Cmp1 == TrueVal)) {
4701 // Canonicalize to use ordered comparisons by swapping the select
4702 // operands.
4703 //
4704 // e.g.
4705 // (X ugt Y) ? X : Y -> (X ole Y) ? Y : X
4706 if (FCmp->hasOneUse() && FCmpInst::isUnordered(Pred)) {
4707 FCmpInst::Predicate InvPred = FCmp->getInversePredicate();
4708 Value *NewCond = Builder.CreateFCmpFMF(InvPred, Cmp0, Cmp1, FCmp,
4709 FCmp->getName() + ".inv");
4710 // Propagate ninf/nnan from fcmp to select.
4711 FastMathFlags FMF = SI.getFastMathFlags();
4712 if (FCmp->hasNoNaNs())
4713 FMF.setNoNaNs(true);
4714 if (FCmp->hasNoInfs())
4715 FMF.setNoInfs(true);
4716 Value *NewSel = Builder.CreateSelectFMF(
4717 NewCond, FalseVal, TrueVal, FMF, "",
4718 ProfcheckDisableMetadataFixes ? nullptr : &SI);
4719 if (auto *NewSI = dyn_cast<SelectInst>(NewSel))
4720 NewSI->swapProfMetadata();
4721 return replaceInstUsesWith(SI, NewSel);
4722 }
4723 }
4724
4725 if (SIFPOp) {
4726 // Fold out scale-if-equals-zero pattern.
4727 //
4728 // This pattern appears in code with denormal range checks after it's
4729 // assumed denormals are treated as zero. This drops a canonicalization.
4730
4731 // TODO: Could relax the signed zero logic. We just need to know the sign
4732 // of the result matches (fmul x, y has the same sign as x).
4733 //
4734 // TODO: Handle always-canonicalizing variant that selects some value or 1
4735 // scaling factor in the fmul visitor.
4736
4737 // TODO: Handle ldexp too
4738
4739 Value *MatchCmp0 = nullptr;
4740 Value *MatchCmp1 = nullptr;
4741
4742 // (select (fcmp [ou]eq x, 0.0), (fmul x, K), x => x
4743 // (select (fcmp [ou]ne x, 0.0), x, (fmul x, K) => x
4744 if (Pred == CmpInst::FCMP_OEQ || Pred == CmpInst::FCMP_UEQ) {
4745 MatchCmp0 = FalseVal;
4746 MatchCmp1 = TrueVal;
4747 } else if (Pred == CmpInst::FCMP_ONE || Pred == CmpInst::FCMP_UNE) {
4748 MatchCmp0 = TrueVal;
4749 MatchCmp1 = FalseVal;
4750 }
4751
4752 if (Cmp0 == MatchCmp0 &&
4753 matchFMulByZeroIfResultEqZero(*this, Cmp0, Cmp1, MatchCmp1, MatchCmp0,
4754 SI, SIFPOp->hasNoSignedZeros()))
4755 return replaceInstUsesWith(SI, Cmp0);
4756
4757 Type *EltTy = SelType->getScalarType();
4758
4759 // TODO: Generalize to any ordered / unordered compare.
4760 if ((Pred == CmpInst::FCMP_ORD || Pred == CmpInst::FCMP_UNO) &&
4761 match(Cmp1, m_PosZeroFP()) && EltTy->isIEEELikeFPTy()) {
4762 // Fold out only-canonicalize-non-nans pattern. This implements a
4763 // wrapper around llvm.canonicalize which is not required to quiet
4764 // signaling nans or preserve nan payload bits.
4765 //
4766 // %hard.canonical = call @llvm.canonicalize(%x)
4767 // %soft.canonical = fdiv 1.0, %x
4768 // %ord = fcmp ord %x, 0.0
4769 // %x.canon = select i1 %ord, %hard.canonical, %soft.canonical
4770 //
4771 // With known IEEE handling:
4772 // => %x
4773 //
4774 // With other denormal behaviors:
4775 // => llvm.canonicalize(%x)
4776 //
4777 // Note the fdiv could be any value preserving, potentially
4778 // canonicalizing floating-point operation such as fmul by 1.0. However,
4779 // since in the llvm model canonicalization is not mandatory, the fmul
4780 // would have been dropped by the time we reached here. The trick here
4781 // is to use a reciprocal fdiv. It's not a droppable no-op, as it could
4782 // return an infinity if %x were sufficiently small, but in this pattern
4783 // we're only using the output for nan values.
4784
4785 if (Pred == CmpInst::FCMP_ORD) {
4786 MatchCmp0 = TrueVal;
4787 MatchCmp1 = FalseVal;
4788 } else {
4789 MatchCmp0 = FalseVal;
4790 MatchCmp1 = TrueVal;
4791 }
4792
4793 bool RcpIfNan = match(MatchCmp1, m_FDiv(m_FPOne(), m_Specific(Cmp0)));
4794 bool CanonicalizeIfNotNan =
4795 match(MatchCmp0, m_FCanonicalize(m_Specific(Cmp0)));
4796
4797 if (RcpIfNan || CanonicalizeIfNotNan) {
4798 const fltSemantics &FPSem = EltTy->getFltSemantics();
4799 DenormalMode Mode = F.getDenormalMode(FPSem);
4800
4801 if (RcpIfNan) {
4802 if (Mode == DenormalMode::getIEEE()) {
4803 // Special case for the other select operand. Otherwise, we may
4804 // need to insert freeze on Cmp0 in the compare and select.
4805 if (CanonicalizeIfNotNan)
4806 return replaceInstUsesWith(SI, Cmp0);
4807
4808 if (isGuaranteedNotToBeUndef(Cmp0, &AC, &SI, &DT)) {
4809 // select (fcmp ord x, 0), y, (fdiv 1, x)
4810 // => select (fcmp ord x, 0), y, x
4811 //
4812 // select (fcmp uno x, 0), (fdiv 1, x), y
4813 // => select (fcmp uno x, 0), x, y
4814 replaceOperand(SI, Pred == CmpInst::FCMP_ORD ? 2 : 1, Cmp0);
4815 return &SI;
4816 }
4817
4818 auto *FrCmp0 = InsertNewInstBefore(
4819 new FreezeInst(Cmp0, Cmp0->getName() + ".fr"),
4820 FCmp->getIterator());
4821
4822 replaceOperand(*FCmp, 0, FrCmp0);
4823 return replaceOperand(SI, Pred == CmpInst::FCMP_ORD ? 2 : 1,
4824 FrCmp0);
4825 }
4826 }
4827
4828 if (CanonicalizeIfNotNan) {
4829 // IEEE handling does not have non-canonical values, so the
4830 // canonicalize can be dropped for direct replacement without
4831 // looking for the intermediate maybe-canonicalizing operation.
4832 if (Mode == DenormalMode::getIEEE()) {
4833 // select (fcmp ord x, 0), canonicalize(x), y
4834 // => select (fcmp ord x, 0), x, y
4835
4836 replaceOperand(SI, Pred == CmpInst::FCMP_ORD ? 1 : 2, Cmp0);
4837 return &SI;
4838 }
4839
4840 // If denormals may be flushed, we need to retain the canonicalize
4841 // call. This introduces a canonicalization on the nan path, which
4842 // we are not free to do as that could change the sign bit or
4843 // payload bits. We can only do this if there were a no-op like
4844 // floating-point instruction which may have changed the nan bits
4845 // anyway.
4846
4847 // Leave the dynamic mode case alone. This would introduce new
4848 // constraints if the mode may be refined later.
4849 if (RcpIfNan && (Mode.inputsAreZero() || Mode.outputsAreZero()))
4850 return replaceInstUsesWith(SI, MatchCmp0);
4851 assert(RcpIfNan || Mode != DenormalMode::getIEEE());
4852 }
4853 }
4854 }
4855 }
4856 }
4857
4858 if (SIFPOp) {
4859 // TODO: Try to forward-propagate FMF from select arms to the select.
4860
4861 auto *FCmp = dyn_cast<FCmpInst>(CondVal);
4862
4863 // Canonicalize select of FP values where NaN and -0.0 are not valid as
4864 // minnum/maxnum intrinsics.
4865 //
4866 // Note that the `nnan` flag is propagated from the comparison, not from the
4867 // select. While it's technically possible to transform a `fcmp` + `select
4868 // nnan` to a `minnum`/`maxnum` call *without* an `nnan`, that would be a
4869 // pessimization in practice. Many targets can't map `minnum`/`maxnum` to a
4870 // single instruction, and if they cannot prove the absence of NaN, must
4871 // lower it to a routine or a libcall. There are additional reasons besides
4872 // performance to avoid introducing libcalls where none existed before
4873 // (https://github.com/llvm/llvm-project/issues/54554).
4874 //
4875 // As such, we want to ensure that the generated `minnum`/`maxnum` intrinsic
4876 // has the `nnan nsz` flags, which allow it to be lowered *back* to a
4877 // fcmp+select if that's the best way to express it on the target.
4878 if (FCmp && FCmp->hasNoNaNs() &&
4879 (SIFPOp->hasNoSignedZeros() || isSelectZeroSignInsignificant(SI))) {
4880 Value *X, *Y;
4881 if (match(&SI, m_OrdOrUnordFMax(m_Value(X), m_Value(Y)))) {
4882 Value *BinIntr =
4883 Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, X, Y, &SI);
4884 if (auto *BinIntrInst = dyn_cast<Instruction>(BinIntr)) {
4885 // `ninf` must be propagated from the comparison too, rather than the
4886 // select: https://github.com/llvm/llvm-project/pull/136433
4887 BinIntrInst->setHasNoInfs(FCmp->hasNoInfs());
4888 // The `nsz` flag is a precondition, so let's ensure it's always added
4889 // to the min/max operation, even if it wasn't on the select. This
4890 // could happen if the select doesn't have `nsz`, but no use of the
4891 // result can observe the sign of zero.
4892 BinIntrInst->setHasNoSignedZeros(true);
4893 // As mentioned above, `nnan` is also a precondition, so we always set
4894 // the flag.
4895 BinIntrInst->setHasNoNaNs(true);
4896 }
4897 return replaceInstUsesWith(SI, BinIntr);
4898 }
4899
4900 if (match(&SI, m_OrdOrUnordFMin(m_Value(X), m_Value(Y)))) {
4901 Value *BinIntr =
4902 Builder.CreateBinaryIntrinsic(Intrinsic::minnum, X, Y, &SI);
4903 if (auto *BinIntrInst = dyn_cast<Instruction>(BinIntr)) {
4904 BinIntrInst->setHasNoInfs(FCmp->hasNoInfs());
4905 BinIntrInst->setHasNoSignedZeros(true);
4906 BinIntrInst->setHasNoNaNs(true);
4907 }
4908 return replaceInstUsesWith(SI, BinIntr);
4909 }
4910 }
4911 }
4912
4913 // Fold selecting to fabs.
4914 if (Instruction *Fabs = foldSelectWithFCmpToFabs(SI, *this))
4915 return Fabs;
4916
4917 if (Instruction *I = foldSelectOfOrderedFAbsCmpOfNaNScrubbedValue(SI, *this))
4918 return I;
4919
4920 // See if we are selecting two values based on a comparison of the two values.
4921 if (CmpInst *CI = dyn_cast<CmpInst>(CondVal))
4922 if (Instruction *NewSel = foldSelectValueEquivalence(SI, *CI))
4923 return NewSel;
4924
4925 if (ICmpInst *ICI = dyn_cast<ICmpInst>(CondVal))
4926 if (Instruction *Result = foldSelectInstWithICmp(SI, ICI))
4927 return Result;
4928
4929 if (Instruction *V =
4930 foldSelectICmpAndAnd(SelType, CondVal, TrueVal, FalseVal, Builder))
4931 return V;
4932
4933 if (Value *V = foldSelectBitTest(SI, CondVal, TrueVal, FalseVal, Builder, SQ))
4934 return replaceInstUsesWith(SI, V);
4935
4936 if (Instruction *Add = foldAddSubSelect(SI, Builder))
4937 return Add;
4938 if (Instruction *Add = foldOverflowingAddSubSelect(SI, Builder))
4939 return Add;
4940 if (Instruction *Or = foldSetClearBits(SI, Builder))
4941 return Or;
4942 if (Instruction *Mul = foldSelectZeroOrFixedOp(SI, *this))
4943 return Mul;
4944
4945 // Turn (select C, (op X, Y), (op X, Z)) -> (op X, (select C, Y, Z))
4946 auto *TI = dyn_cast<Instruction>(TrueVal);
4947 auto *FI = dyn_cast<Instruction>(FalseVal);
4948 if (TI && FI && TI->getOpcode() == FI->getOpcode())
4949 if (Instruction *IV = foldSelectOpOp(SI, TI, FI))
4950 return IV;
4951
4952 if (Instruction *I = foldSelectIntrinsic(SI))
4953 return I;
4954
4955 if (Instruction *I = foldSelectExtConst(SI))
4956 return I;
4957
4958 if (Instruction *I = foldSelectWithSRem(SI, *this, Builder))
4959 return I;
4960
4961 // Fold (select C, (gep Ptr, Idx), Ptr) -> (gep Ptr, (select C, Idx, 0))
4962 // Fold (select C, Ptr, (gep Ptr, Idx)) -> (gep Ptr, (select C, 0, Idx))
4963 auto SelectGepWithBase = [&](GetElementPtrInst *Gep, Value *Base,
4964 bool Swap) -> GetElementPtrInst * {
4965 Value *Ptr = Gep->getPointerOperand();
4966 if (Gep->getNumOperands() != 2 || Gep->getPointerOperand() != Base ||
4967 !Gep->hasOneUse())
4968 return nullptr;
4969 Value *Idx = Gep->getOperand(1);
4970 if (isa<VectorType>(CondVal->getType()) && !isa<VectorType>(Idx->getType()))
4971 return nullptr;
4973 Value *NewT = Idx;
4974 Value *NewF = Constant::getNullValue(Idx->getType());
4975 if (Swap)
4976 std::swap(NewT, NewF);
4977 Value *NewSI =
4978 Builder.CreateSelect(CondVal, NewT, NewF, SI.getName() + ".idx", &SI);
4979 return GetElementPtrInst::Create(ElementType, Ptr, NewSI,
4980 Gep->getNoWrapFlags());
4981 };
4982 if (auto *TrueGep = dyn_cast<GetElementPtrInst>(TrueVal))
4983 if (auto *NewGep = SelectGepWithBase(TrueGep, FalseVal, false))
4984 return NewGep;
4985 if (auto *FalseGep = dyn_cast<GetElementPtrInst>(FalseVal))
4986 if (auto *NewGep = SelectGepWithBase(FalseGep, TrueVal, true))
4987 return NewGep;
4988
4989 // See if we can fold the select into one of our operands.
4990 if (SelType->isIntOrIntVectorTy() || SelType->isFPOrFPVectorTy()) {
4991 if (Instruction *FoldI = foldSelectIntoOp(SI, TrueVal, FalseVal))
4992 return FoldI;
4993
4994 Value *LHS, *RHS;
4995 Instruction::CastOps CastOp;
4996 SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);
4997 auto SPF = SPR.Flavor;
4998 if (SPF) {
4999 Value *LHS2, *RHS2;
5000 if (SelectPatternFlavor SPF2 = matchSelectPattern(LHS, LHS2, RHS2).Flavor)
5001 if (Instruction *R = foldSPFofSPF(cast<Instruction>(LHS), SPF2, LHS2,
5002 RHS2, SI, SPF, RHS))
5003 return R;
5004 if (SelectPatternFlavor SPF2 = matchSelectPattern(RHS, LHS2, RHS2).Flavor)
5005 if (Instruction *R = foldSPFofSPF(cast<Instruction>(RHS), SPF2, LHS2,
5006 RHS2, SI, SPF, LHS))
5007 return R;
5008 }
5009
5011 // Canonicalize so that
5012 // - type casts are outside select patterns.
5013 // - float clamp is transformed to min/max pattern
5014
5015 bool IsCastNeeded = LHS->getType() != SelType;
5016 Value *CmpLHS = cast<CmpInst>(CondVal)->getOperand(0);
5017 Value *CmpRHS = cast<CmpInst>(CondVal)->getOperand(1);
5018 if (IsCastNeeded ||
5019 (LHS->getType()->isFPOrFPVectorTy() &&
5020 ((CmpLHS != LHS && CmpLHS != RHS) ||
5021 (CmpRHS != LHS && CmpRHS != RHS)))) {
5022 CmpInst::Predicate MinMaxPred = getMinMaxPred(SPF, SPR.Ordered);
5023
5024 Value *Cmp;
5025 if (CmpInst::isIntPredicate(MinMaxPred))
5026 Cmp = Builder.CreateICmp(MinMaxPred, LHS, RHS);
5027 else
5028 Cmp = Builder.CreateFCmpFMF(MinMaxPred, LHS, RHS,
5029 cast<Instruction>(SI.getCondition()));
5030
5031 Value *NewSI = Builder.CreateSelect(Cmp, LHS, RHS, SI.getName(), &SI);
5032 if (!IsCastNeeded)
5033 return replaceInstUsesWith(SI, NewSI);
5034
5035 Value *NewCast = Builder.CreateCast(CastOp, NewSI, SelType);
5036 return replaceInstUsesWith(SI, NewCast);
5037 }
5038 }
5039 }
5040
5041 // See if we can fold the select into a phi node if the condition is a select.
5042 if (auto *PN = dyn_cast<PHINode>(SI.getCondition()))
5043 if (Instruction *NV = foldOpIntoPhi(SI, PN))
5044 return NV;
5045
5046 if (SelectInst *TrueSI = dyn_cast<SelectInst>(TrueVal)) {
5047 if (TrueSI->getCondition()->getType() == CondVal->getType()) {
5048 // Fold nested selects if the inner condition can be implied by the outer
5049 // condition.
5050 if (Value *V = simplifyNestedSelectsUsingImpliedCond(
5051 *TrueSI, CondVal, /*CondIsTrue=*/true, DL))
5052 return replaceOperand(SI, 1, V);
5053
5054 // We choose this as normal form to enable folding on the And and
5055 // shortening paths for the values (this helps getUnderlyingObjects() for
5056 // example).
5057 if (TrueSI->hasOneUse()) {
5058 Value *And = nullptr, *OtherVal = nullptr;
5059 // select(C0, select(C1, a, b), b) -> select(C0&&C1, a, b)
5060 if (TrueSI->getFalseValue() == FalseVal) {
5061 And = Builder.CreateLogicalAnd(CondVal, TrueSI->getCondition(), "",
5062 &SI);
5063 OtherVal = TrueSI->getTrueValue();
5064 }
5065 // select(C0, select(C1, b, a), b) -> select(C0&&!C1, a, b)
5066 else if (TrueSI->getTrueValue() == FalseVal) {
5067 Value *InvertedCond = Builder.CreateNot(TrueSI->getCondition());
5068 And = Builder.CreateLogicalAnd(CondVal, InvertedCond, "", &SI);
5069 OtherVal = TrueSI->getFalseValue();
5070 }
5071 if (And && OtherVal) {
5072 replaceOperand(SI, 0, And);
5073 replaceOperand(SI, 1, OtherVal);
5075 return &SI;
5076 }
5077 }
5078 }
5079 }
5080 if (SelectInst *FalseSI = dyn_cast<SelectInst>(FalseVal)) {
5081 if (FalseSI->getCondition()->getType() == CondVal->getType()) {
5082 // Fold nested selects if the inner condition can be implied by the outer
5083 // condition.
5084 if (Value *V = simplifyNestedSelectsUsingImpliedCond(
5085 *FalseSI, CondVal, /*CondIsTrue=*/false, DL))
5086 return replaceOperand(SI, 2, V);
5087
5088 if (FalseSI->hasOneUse()) {
5089 Value *Or = nullptr, *OtherVal = nullptr;
5090 // select(C0, a, select(C1, a, b)) -> select(C0||C1, a, b)
5091 if (FalseSI->getTrueValue() == TrueVal) {
5092 Or = Builder.CreateLogicalOr(CondVal, FalseSI->getCondition(), "",
5093 &SI);
5094 OtherVal = FalseSI->getFalseValue();
5095 }
5096 // select(C0, a, select(C1, b, a)) -> select(C0||!C1, a, b)
5097 else if (FalseSI->getFalseValue() == TrueVal) {
5098 Value *InvertedCond = Builder.CreateNot(FalseSI->getCondition());
5099 Or = Builder.CreateLogicalOr(CondVal, InvertedCond, "", &SI);
5100 OtherVal = FalseSI->getTrueValue();
5101 }
5102 if (Or && OtherVal) {
5103 replaceOperand(SI, 0, Or);
5104 replaceOperand(SI, 2, OtherVal);
5106 return &SI;
5107 }
5108 }
5109 }
5110 }
5111
5112 // Try to simplify a binop sandwiched between 2 selects with the same
5113 // condition. This is not valid for div/rem because the select might be
5114 // preventing a division-by-zero.
5115 // TODO: A div/rem restriction is conservative; use something like
5116 // isSafeToSpeculativelyExecute().
5117 // select(C, binop(select(C, X, Y), W), Z) -> select(C, binop(X, W), Z)
5118 BinaryOperator *TrueBO;
5119 if (match(TrueVal, m_OneUse(m_BinOp(TrueBO))) && !TrueBO->isIntDivRem()) {
5120 if (auto *TrueBOSI = dyn_cast<SelectInst>(TrueBO->getOperand(0))) {
5121 if (TrueBOSI->getCondition() == CondVal) {
5122 replaceOperand(*TrueBO, 0, TrueBOSI->getTrueValue());
5123 Worklist.push(TrueBO);
5124 return &SI;
5125 }
5126 }
5127 if (auto *TrueBOSI = dyn_cast<SelectInst>(TrueBO->getOperand(1))) {
5128 if (TrueBOSI->getCondition() == CondVal) {
5129 replaceOperand(*TrueBO, 1, TrueBOSI->getTrueValue());
5130 Worklist.push(TrueBO);
5131 return &SI;
5132 }
5133 }
5134 }
5135
5136 // select(C, Z, binop(select(C, X, Y), W)) -> select(C, Z, binop(Y, W))
5137 BinaryOperator *FalseBO;
5138 if (match(FalseVal, m_OneUse(m_BinOp(FalseBO))) && !FalseBO->isIntDivRem()) {
5139 if (auto *FalseBOSI = dyn_cast<SelectInst>(FalseBO->getOperand(0))) {
5140 if (FalseBOSI->getCondition() == CondVal) {
5141 replaceOperand(*FalseBO, 0, FalseBOSI->getFalseValue());
5142 Worklist.push(FalseBO);
5143 return &SI;
5144 }
5145 }
5146 if (auto *FalseBOSI = dyn_cast<SelectInst>(FalseBO->getOperand(1))) {
5147 if (FalseBOSI->getCondition() == CondVal) {
5148 replaceOperand(*FalseBO, 1, FalseBOSI->getFalseValue());
5149 Worklist.push(FalseBO);
5150 return &SI;
5151 }
5152 }
5153 }
5154
5155 Value *NotCond;
5156 if (match(CondVal, m_Not(m_Value(NotCond))) &&
5158 replaceOperand(SI, 0, NotCond);
5159 SI.swapValues();
5160 SI.swapProfMetadata();
5161 return &SI;
5162 }
5163
5164 if (Instruction *I = foldVectorSelect(SI))
5165 return I;
5166
5167 // If we can compute the condition, there's no need for a select.
5168 // Like the above fold, we are attempting to reduce compile-time cost by
5169 // putting this fold here with limitations rather than in InstSimplify.
5170 // The motivation for this call into value tracking is to take advantage of
5171 // the assumption cache, so make sure that is populated.
5172 if (!CondVal->getType()->isVectorTy() && !AC.assumptions().empty()) {
5173 KnownBits Known(1);
5174 computeKnownBits(CondVal, Known, &SI);
5175 if (Known.One.isOne())
5176 return replaceInstUsesWith(SI, TrueVal);
5177 if (Known.Zero.isOne())
5178 return replaceInstUsesWith(SI, FalseVal);
5179 }
5180
5181 if (Instruction *BitCastSel = foldSelectCmpBitcasts(SI, Builder))
5182 return BitCastSel;
5183
5184 // Simplify selects that test the returned flag of cmpxchg instructions.
5185 if (Value *V = foldSelectCmpXchg(SI))
5186 return replaceInstUsesWith(SI, V);
5187
5188 if (Instruction *Select = foldSelectBinOpIdentity(SI, TLI, *this))
5189 return Select;
5190
5191 if (Instruction *Funnel = foldSelectFunnelShift(SI, Builder))
5192 return Funnel;
5193
5194 if (Instruction *Copysign = foldSelectToCopysign(SI, Builder))
5195 return Copysign;
5196
5197 if (Instruction *PN = foldSelectToPhi(SI, DT, Builder))
5198 return replaceInstUsesWith(SI, PN);
5199
5200 if (Value *V = foldRoundUpIntegerWithPow2Alignment(SI, Builder))
5201 return replaceInstUsesWith(SI, V);
5202
5203 if (Value *V = foldSelectIntoAddConstant(SI, Builder))
5204 return replaceInstUsesWith(SI, V);
5205
5206 // select(mask, mload(ptr,mask,0), 0) -> mload(ptr,mask,0)
5207 // Load inst is intentionally not checked for hasOneUse()
5208 if (match(FalseVal, m_Zero()) &&
5209 (match(TrueVal, m_MaskedLoad(m_Value(), m_Specific(CondVal),
5210 m_CombineOr(m_Undef(), m_Zero()))) ||
5211 match(TrueVal, m_MaskedGather(m_Value(), m_Specific(CondVal),
5212 m_CombineOr(m_Undef(), m_Zero()))))) {
5213 auto *MaskedInst = cast<IntrinsicInst>(TrueVal);
5214 if (isa<UndefValue>(MaskedInst->getArgOperand(2)))
5215 MaskedInst->setArgOperand(2, FalseVal /* Zero */);
5216 return replaceInstUsesWith(SI, MaskedInst);
5217 }
5218
5219 Value *Mask;
5220 if (match(TrueVal, m_Zero()) &&
5221 (match(FalseVal, m_MaskedLoad(m_Value(), m_Value(Mask),
5222 m_CombineOr(m_Undef(), m_Zero()))) ||
5223 match(FalseVal, m_MaskedGather(m_Value(), m_Value(Mask),
5224 m_CombineOr(m_Undef(), m_Zero())))) &&
5225 (CondVal->getType() == Mask->getType())) {
5226 // We can remove the select by ensuring the load zeros all lanes the
5227 // select would have. We determine this by proving there is no overlap
5228 // between the load and select masks.
5229 // (i.e (load_mask & select_mask) == 0 == no overlap)
5230 bool CanMergeSelectIntoLoad = false;
5231 if (Value *V = simplifyAndInst(CondVal, Mask, SQ.getWithInstruction(&SI)))
5232 CanMergeSelectIntoLoad = match(V, m_Zero());
5233
5234 if (CanMergeSelectIntoLoad) {
5235 auto *MaskedInst = cast<IntrinsicInst>(FalseVal);
5236 if (isa<UndefValue>(MaskedInst->getArgOperand(2)))
5237 MaskedInst->setArgOperand(2, TrueVal /* Zero */);
5238 return replaceInstUsesWith(SI, MaskedInst);
5239 }
5240 }
5241
5242 if (Instruction *I = foldSelectOfSymmetricSelect(SI, Builder))
5243 return I;
5244
5245 if (Instruction *I = foldNestedSelects(SI, Builder))
5246 return I;
5247
5248 // Match logical variants of the pattern,
5249 // and transform them iff that gets rid of inversions.
5250 // (~x) | y --> ~(x & (~y))
5251 // (~x) & y --> ~(x | (~y))
5253 return &SI;
5254
5255 if (Instruction *I = foldBitCeil(SI, Builder, *this))
5256 return I;
5257
5258 if (Instruction *I = foldSelectToCmp(SI))
5259 return I;
5260
5261 if (Instruction *I = foldSelectEqualityTest(SI))
5262 return I;
5263
5264 // Fold:
5265 // (select A && B, T, F) -> (select A, (select B, T, F), F)
5266 // (select A || B, T, F) -> (select A, T, (select B, T, F))
5267 // if (select B, T, F) is foldable.
5268 // TODO: preserve FMF flags
5269 auto FoldSelectWithAndOrCond = [&](bool IsAnd, Value *A,
5270 Value *B) -> Instruction * {
5271 if (Value *V = simplifySelectInst(B, TrueVal, FalseVal, FMF,
5272 SQ.getWithInstruction(&SI))) {
5273 Value *NewTrueVal = IsAnd ? V : TrueVal;
5274 Value *NewFalseVal = IsAnd ? FalseVal : V;
5275
5276 // If the True and False values don't change, then preserve the branch
5277 // metadata of the original select as the net effect of this change is to
5278 // simplify the conditional.
5279 Instruction *MDFrom = nullptr;
5280 if (NewTrueVal == TrueVal && NewFalseVal == FalseVal) {
5281 MDFrom = &SI;
5282 }
5283 return SelectInst::Create(A, NewTrueVal, NewFalseVal, "", nullptr,
5284 MDFrom);
5285 }
5286
5287 // Is (select B, T, F) a SPF?
5288 if (CondVal->hasOneUse() && SelType->isIntOrIntVectorTy()) {
5289 if (ICmpInst *Cmp = dyn_cast<ICmpInst>(B))
5290 if (Value *V = canonicalizeSPF(*Cmp, TrueVal, FalseVal, *this)) {
5291 return SelectInst::Create(
5292 A, IsAnd ? V : TrueVal, IsAnd ? FalseVal : V, "", nullptr,
5293 ProfcheckDisableMetadataFixes ? nullptr : &SI);
5294 }
5295 }
5296
5297 return nullptr;
5298 };
5299
5300 Value *LHS, *RHS;
5301 if (match(CondVal, m_And(m_Value(LHS), m_Value(RHS)))) {
5302 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS, RHS))
5303 return I;
5304 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, RHS, LHS))
5305 return I;
5306 } else if (match(CondVal, m_Or(m_Value(LHS), m_Value(RHS)))) {
5307 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS, RHS))
5308 return I;
5309 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, RHS, LHS))
5310 return I;
5311 } else {
5312 // We cannot swap the operands of logical and/or.
5313 // TODO: Can we swap the operands by inserting a freeze?
5314 if (match(CondVal, m_LogicalAnd(m_Value(LHS), m_Value(RHS)))) {
5315 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ true, LHS, RHS))
5316 return I;
5317 } else if (match(CondVal, m_LogicalOr(m_Value(LHS), m_Value(RHS)))) {
5318 if (Instruction *I = FoldSelectWithAndOrCond(/*IsAnd*/ false, LHS, RHS))
5319 return I;
5320 }
5321 }
5322
5323 // select Cond, !X, X -> xor Cond, X
5324 if (CondVal->getType() == SI.getType() && isKnownInversion(FalseVal, TrueVal))
5325 return BinaryOperator::CreateXor(CondVal, FalseVal);
5326
5327 // For vectors, this transform is only safe if the simplification does not
5328 // look through any lane-crossing operations. For now, limit to scalars only.
5329 if (SelType->isIntegerTy() &&
5330 (!isa<Constant>(TrueVal) || !isa<Constant>(FalseVal))) {
5331 // Try to simplify select arms based on KnownBits implied by the condition.
5332 CondContext CC(CondVal);
5333 findValuesAffectedByCondition(CondVal, /*IsAssume=*/false, [&](Value *V) {
5334 CC.AffectedValues.insert(V);
5335 });
5336 SimplifyQuery Q = SQ.getWithInstruction(&SI).getWithCondContext(CC);
5337 if (!CC.AffectedValues.empty()) {
5338 if (!isa<Constant>(TrueVal) &&
5339 hasAffectedValue(TrueVal, CC.AffectedValues, /*Depth=*/0)) {
5340 KnownBits Known = llvm::computeKnownBits(TrueVal, Q);
5341 if (Known.isConstant())
5342 return replaceOperand(SI, 1,
5343 ConstantInt::get(SelType, Known.getConstant()));
5344 }
5345
5346 CC.Invert = true;
5347 if (!isa<Constant>(FalseVal) &&
5348 hasAffectedValue(FalseVal, CC.AffectedValues, /*Depth=*/0)) {
5349 KnownBits Known = llvm::computeKnownBits(FalseVal, Q);
5350 if (Known.isConstant())
5351 return replaceOperand(SI, 2,
5352 ConstantInt::get(SelType, Known.getConstant()));
5353 }
5354 }
5355 }
5356
5357 // select (trunc nuw X to i1), X, Y --> select (trunc nuw X to i1), 1, Y
5358 // select (trunc nuw X to i1), Y, X --> select (trunc nuw X to i1), Y, 0
5359 // select (trunc nsw X to i1), X, Y --> select (trunc nsw X to i1), -1, Y
5360 // select (trunc nsw X to i1), Y, X --> select (trunc nsw X to i1), Y, 0
5361 Value *Trunc;
5362 if (match(CondVal, m_NUWTrunc(m_Value(Trunc))) && !isa<Constant>(Trunc)) {
5363 if (TrueVal == Trunc)
5364 return replaceOperand(SI, 1, ConstantInt::get(TrueVal->getType(), 1));
5365 if (FalseVal == Trunc)
5366 return replaceOperand(SI, 2, ConstantInt::get(FalseVal->getType(), 0));
5367 }
5368 if (match(CondVal, m_NSWTrunc(m_Value(Trunc))) && !isa<Constant>(Trunc)) {
5369 if (TrueVal == Trunc)
5370 return replaceOperand(SI, 1,
5372 if (FalseVal == Trunc)
5373 return replaceOperand(SI, 2, ConstantInt::get(FalseVal->getType(), 0));
5374 }
5375
5376 if (match(CondVal, m_Trunc(m_Value(Trunc))) && Trunc->getType() == SelType) {
5377 if (match(FalseVal, m_Zero()) && impliesPoison(TrueVal, CondVal) &&
5378 llvm::computeKnownBits(TrueVal, SQ.getWithInstruction(&SI))
5379 .countMaxActiveBits() == 1)
5380 return BinaryOperator::CreateAnd(Trunc, TrueVal);
5381
5382 if (cast<TruncInst>(CondVal)->hasNoUnsignedWrap() &&
5383 match(TrueVal, m_One()) && impliesPoison(FalseVal, CondVal) &&
5384 llvm::computeKnownBits(FalseVal, SQ.getWithInstruction(&SI))
5385 .countMaxActiveBits() == 1) {
5386 return BinaryOperator::CreateOr(Trunc, FalseVal);
5387 }
5388 }
5389
5390 Value *MaskedLoadPtr;
5391 if (match(TrueVal, m_OneUse(m_MaskedLoad(m_Value(MaskedLoadPtr),
5392 m_Specific(CondVal), m_Value())))) {
5393 auto *LoadInst = cast<IntrinsicInst>(TrueVal);
5394 // Keep the load at its original position to avoid crossing writes. The new
5395 // passthrough must therefore be available there.
5396 if (DT.dominates(FalseVal, LoadInst)) {
5397 Builder.SetInsertPoint(LoadInst);
5398 Instruction *In = Builder.CreateMaskedLoad(
5399 TrueVal->getType(), MaskedLoadPtr,
5400 LoadInst->getParamAlign(0).valueOrOne(), CondVal, FalseVal);
5401 In->setAAMetadata(LoadInst->getAAMetadata());
5402 return replaceInstUsesWith(SI, In);
5403 }
5404 }
5405
5406 // Canonicalize sign function ashr pattern: select (icmp slt X, 1), ashr X,
5407 // bitwidth-1, 1 -> scmp(X, 0)
5408 // Also handles: select (icmp sgt X, 0), 1, ashr X, bitwidth-1 -> scmp(X, 0)
5409 unsigned BitWidth = SI.getType()->getScalarSizeInBits();
5410 CmpPredicate Pred;
5411 Value *CmpLHS, *CmpRHS;
5412
5413 // Canonicalize sign function ashr patterns:
5414 // select (icmp slt X, 1), ashr X, bitwidth-1, 1 -> scmp(X, 0)
5415 // select (icmp sgt X, 0), 1, ashr X, bitwidth-1 -> scmp(X, 0)
5416 if (match(&SI, m_Select(m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS)),
5417 m_Value(TrueVal), m_Value(FalseVal))) &&
5418 ((Pred == ICmpInst::ICMP_SLT && match(CmpRHS, m_One()) &&
5419 match(TrueVal,
5420 m_AShr(m_Specific(CmpLHS), m_SpecificInt(BitWidth - 1))) &&
5421 match(FalseVal, m_One())) ||
5422 (Pred == ICmpInst::ICMP_SGT && match(CmpRHS, m_Zero()) &&
5423 match(TrueVal, m_One()) &&
5424 match(FalseVal,
5425 m_AShr(m_Specific(CmpLHS), m_SpecificInt(BitWidth - 1)))))) {
5426
5428 SI.getModule(), Intrinsic::scmp, {SI.getType(), SI.getType()});
5429 return CallInst::Create(Scmp, {CmpLHS, ConstantInt::get(SI.getType(), 0)});
5430 }
5431
5432 return nullptr;
5433}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
basic Basic Alias true
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define DEBUG_TYPE
const HexagonInstrInfo * TII
This file provides internal interfaces used to implement the InstCombine.
static Value * foldSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Try to fold a select to a min/max intrinsic.
static Value * canonicalizeSaturatedAddSigned(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
static Value * canonicalizeSaturatedAdd(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
static Instruction * foldSetClearBits(SelectInst &Sel, InstCombiner::BuilderTy &Builder)
Canonicalize a set or clear of a masked set of constant bits to select-of-constants form.
static unsigned getSelectFoldableOperands(BinaryOperator *I)
We want to turn code that looks like this: C = or A, B D = select cond, C, A into: C = select cond,...
static Value * canonicalizeSaturatedSubtract(const ICmpInst *ICI, const Value *TrueVal, const Value *FalseVal, InstCombiner::BuilderTy &Builder)
static Value * canoncalizeSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
static Value * foldAbsDiff(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
Try to match patterns with select and subtract as absolute difference.
static Instruction * foldSelectZeroOrFixedOp(SelectInst &SI, InstCombinerImpl &IC)
static Instruction * foldSelectBinOpIdentity(SelectInst &Sel, const TargetLibraryInfo &TLI, InstCombinerImpl &IC)
Replace a select operand based on an equality comparison with the identity constant of a binop.
static Value * foldSelectICmpAnd(SelectInst &Sel, Value *CondVal, Value *TrueVal, Value *FalseVal, Value *V, const APInt &AndMask, bool CreateAnd, InstCombiner::BuilderTy &Builder)
This folds: select (icmp eq (and X, C1)), TC, FC iff C1 is a power 2 and the difference between TC an...
static Value * foldSelectICmpAndZeroShl(const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, C1), 0), 0, (shl [nsw/nuw] X, C2)); iff C1 is a mask and th...
static Value * canonicalizeSaturatedSubtractSigned(const ICmpInst *ICI, const Value *TrueVal, const Value *FalseVal, InstCombiner::BuilderTy &Builder)
static Value * canonicalizeSaturatedAddUnsigned(ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
static Value * foldSelectICmpLshrAshr(const ICmpInst *IC, Value *TrueVal, Value *FalseVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp sgt x, C), lshr (X, Y), ashr (X, Y)); iff C s>= -1 (select (icmp slt x...
static bool isSelect01(const APInt &C1I, const APInt &C2I)
static Instruction * foldSelectICmpAndAnd(Type *SelType, const Value *Cond, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1) into: zext (icmp ne i32 (a...
static Value * canonicalizeSaturatedSubtractUnsigned(const ICmpInst *ICI, const Value *TrueVal, const Value *FalseVal, InstCombiner::BuilderTy &Builder)
Transform patterns such as (a > b) ?
static Value * foldSelectICmpAndBinOp(Value *CondVal, Value *TrueVal, Value *FalseVal, Value *V, const APInt &AndMask, bool CreateAnd, InstCombiner::BuilderTy &Builder)
We want to turn: (select (icmp eq (and X, C1), 0), Y, (BinOp Y, C2)) into: IF C2 u>= C1 (BinOp Y,...
This file provides the interface for the instcombine pass implementation.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
uint64_t IntrinsicInst * II
#define P(N)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
bool bitwiseIsEqual(const APFloat &RHS) const
Definition APFloat.h:1548
bool isNegative() const
Definition APFloat.h:1583
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:462
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:205
bool isMinValue() const
Determine if this is the smallest unsigned value.
Definition APInt.h:413
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
unsigned countLeadingZeros() const
Definition APInt.h:1626
unsigned logBase2() const
Definition APInt.h:1781
bool isMask(unsigned numBits) const
Definition APInt.h:484
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:401
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
bool isSignBitSet() const
Determine if sign bit of this APInt is set.
Definition APInt.h:337
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:385
bool isMaxValue() const
Determine if this is the largest unsigned value.
Definition APInt.h:395
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
An instruction that atomically checks whether a specified value is in a memory location,...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
BinaryOps getOpcode() const
Definition InstrTypes.h:409
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
This class represents a no-op cast from one type to another.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:833
bool isNonStrictPredicate() const
Definition InstrTypes.h:915
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:986
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition InstrTypes.h:956
bool isIntPredicate() const
Definition InstrTypes.h:846
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:999
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI ConstantRange binaryNot() const
Return a new range representing the possible values resulting from a binary-xor of a value in this ra...
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool isOneValue() const
Returns true if the value is one.
Definition Constants.cpp:89
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
unsigned size() const
Definition DenseMap.h:733
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Tagged union holding either a T or a Error.
Definition Error.h:485
This provides a helper for copying FMF from an instruction or setting specified flags.
Definition IRBuilder.h:93
Utility class for floating point operations which can have information about relaxed accuracy require...
Definition Operator.h:202
FastMathFlags getFastMathFlags() const
Convenience function for getting all the fast-math flags.
Definition Operator.h:291
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
static FastMathFlags intersectRewrite(FastMathFlags LHS, FastMathFlags RHS)
Intersect rewrite-based flags.
Definition FMF.h:116
bool noSignedZeros() const
Definition FMF.h:67
bool noInfs() const
Definition FMF.h:66
static FastMathFlags unionValue(FastMathFlags LHS, FastMathFlags RHS)
Union value flags.
Definition FMF.h:124
void setNoSignedZeros(bool B=true)
Definition FMF.h:84
void setNoNaNs(bool B=true)
Definition FMF.h:78
bool noNaNs() const
Definition FMF.h:65
void setNoInfs(bool B=true)
Definition FMF.h:81
This class represents a freeze function that returns random concrete value if an operand is either a ...
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Type * getSourceElementType() const
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
This instruction compares its operands according to the predicate given to the constructor.
static CmpPredicate getSwappedCmpPredicate(CmpPredicate Pred)
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
CmpPredicate getInverseCmpPredicate() const
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
static CmpPredicate getInverseCmpPredicate(CmpPredicate Pred)
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateFAdd(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Definition IRBuilder.h:1623
LLVM_ABI Value * CreateSelectFMF(Value *C, Value *True, Value *False, FMFSource FMFSource, const Twine &Name="", Instruction *MDFrom=nullptr)
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Value * CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2402
LLVM_ABI Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
Value * CreateSExt(Value *V, Type *DestTy, const Twine &Name="")
Definition IRBuilder.h:2125
Value * CreateFreeze(Value *V, const Twine &Name="")
Definition IRBuilder.h:2727
Value * CreateFAbs(Value *V, FMFSource FMFSource={}, const Twine &Name="")
Create call to the fabs intrinsic.
Definition IRBuilder.h:1012
Value * CreateFCmpFMF(CmpInst::Predicate P, Value *LHS, Value *RHS, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2502
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Definition IRBuilder.h:1817
LLVM_ABI Value * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type.
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Definition IRBuilder.h:2539
Value * CreateNot(Value *V, const Twine &Name="")
Definition IRBuilder.h:1841
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition IRBuilder.h:2113
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1557
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1409
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition IRBuilder.h:441
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
Definition IRBuilder.h:2755
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition IRBuilder.h:2099
Value * CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2406
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:179
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1609
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2484
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1826
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
Definition IRBuilder.h:1579
Instruction * foldSelectToCmp(SelectInst &SI)
bool fmulByZeroIsZero(Value *MulVal, FastMathFlags FMF, const Instruction *CtxI) const
Check if fmul MulVal, +0.0 will yield +0.0 (or signed zero is ignorable).
Instruction * foldSelectEqualityTest(SelectInst &SI)
Instruction * foldSelectValueEquivalence(SelectInst &SI, CmpInst &CI)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Instruction * foldVectorSelect(SelectInst &Sel)
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
Instruction * foldSPFofSPF(Instruction *Inner, SelectPatternFlavor SPF1, Value *A, Value *B, Instruction &Outer, SelectPatternFlavor SPF2, Value *C)
Instruction * foldSelectOpOp(SelectInst &SI, Instruction *TI, Instruction *FI)
We have (select c, TI, FI), and we know that TI and FI have the same opcode.
Instruction * foldSelectIntrinsic(SelectInst &SI)
This transforms patterns of the form: select cond, intrinsic(x, ...), intrinsic(y,...
bool replaceInInstruction(Value *V, Value *Old, Value *New, unsigned Depth=0)
Instruction * foldSelectInstWithICmp(SelectInst &SI, ICmpInst *ICI)
bool sinkNotIntoOtherHandOfLogicalOp(Instruction &I)
Instruction * foldSelectIntoOp(SelectInst &SI, Value *, Value *)
Try to fold the select into one of the operands to allow further optimization.
Instruction * FoldOrOfLogicalAnds(Value *Op0, Value *Op1)
Value * foldSelectWithConstOpToBinOp(ICmpInst *Cmp, Value *TrueVal, Value *FalseVal)
Instruction * visitSelectInst(SelectInst &SI)
Instruction * foldSelectOfBools(SelectInst &SI)
Instruction * foldSelectExtConst(SelectInst &Sel)
The core instruction combiner logic.
SimplifyQuery SQ
const DataLayout & getDataLayout() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CtxI=nullptr, unsigned Depth=0)
TargetLibraryInfo & TLI
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI)
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
const DataLayout & DL
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
AssumptionCache & AC
void addToWorklist(Instruction *I)
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
static Constant * AddOne(Constant *C)
Add one to a Constant.
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool isSameOperationAs(const Instruction *I, unsigned flags=0) const LLVM_READONLY
This function determines if the specified instruction executes the same operation as the current one.
bool isCast() const
LLVM_ABI void setHasNoSignedZeros(bool B)
Set or clear the no-signed-zeros flag on this instruction, which must be an operator which supports t...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void setHasNoNaNs(bool B)
Set or clear the no-nans flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI void swapProfMetadata()
If the instruction has "branch_weights" MD_prof metadata and the MDNode has three operands (including...
LLVM_ABI void setHasNoInfs(bool B)
Set or clear the no-infs flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
bool isIntDivRem() const
A wrapper class for inspecting calls to intrinsic functions.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
const Value * getFalseValue() const
void swapValues()
Swap the true and false values of the select instruction.
const Value * getCondition() const
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
const Value * getTrueValue() const
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
This instruction constructs a fixed permutation of two input vectors.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:258
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:222
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout,...
Definition Type.h:172
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:96
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:156
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI const Value * DoPHITranslation(const BasicBlock *CurBB, const BasicBlock *PredBB) const
Translate PHI node to its predecessor from the given basic block.
Definition Value.cpp:1137
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
iterator_range< use_iterator > uses()
Definition Value.h:382
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
Represents an op.with.overflow intrinsic.
This class represents zero extension of integer types.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
int getMinValue(MCInstrInfo const &MCII, MCInst const &MCI)
Return the minimum value of an extendable operand.
int getMaxValue(MCInstrInfo const &MCII, MCInst const &MCI)
Return the maximum value of an extendable operand.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOpc_match< LHS, RHS, false > m_BinOp(unsigned Opcode, const LHS &L, const RHS &R)
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
auto m_PosZeroFP()
Matches a floating-point positive zero.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
AllOnesConstantMatch m_AllOnes()
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
auto m_Cmp()
Matches any compare instruction and ignore it.
BinaryOp_match< cst_pred_ty< is_all_ones, false >, ValTy, Instruction::Xor, true > m_NotForbidPoison(const ValTy &V)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FMul, true > m_c_FMul(const LHS &L, const RHS &R)
Matches FMul with LHS and RHS in either order.
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FSub > m_FSub(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
CommutativeBinaryIntrinsic_match< IntrID, T0, T1 > m_c_Intrinsic(const T0 &Op0, const T1 &Op1)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
LogicalOp_match< LHS, RHS, Instruction::And > m_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R either in the form of L & R or L ?
auto m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
auto match_fn(const Pattern &P)
A match functor that can be used as a UnaryPredicate in functional algorithms like all_of.
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
cst_pred_ty< is_any_apint > m_AnyIntegralConstant()
Match an integer or vector with any integral constant.
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::FAdd > m_FAdd(const LHS &L, const RHS &R)
auto m_Ctpop(const Opnd0 &Op0)
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ap_match< APInt > m_APIntForbidPoison(const APInt *&Res)
Match APInt while forbidding poison in splat vector constants.
cst_pred_ty< is_strictlypositive > m_StrictlyPositive()
Match an integer or vector of strictly positive values.
auto m_MaskedGather(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedGather Intrinsic.
match_bind< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
auto m_Ctlz(const Opnd0 &Op0, const Opnd1 &Op1)
match_combine_or< FMaxMin_match< LHS, RHS, ofmin_pred_ty >, FMaxMin_match< LHS, RHS, ufmin_pred_ty > > m_OrdOrUnordFMin(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point minimum function.
auto m_FCanonicalize(const Opnd0 &Op0)
auto m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
cst_pred_ty< icmp_pred_with_threshold, false > m_SpecificInt_ICMP_ForbidPoison(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
auto m_c_LogicalOp(const LHS &L, const RHS &R)
Matches either L && R or L || R with LHS and RHS in either order.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, FCmpInst > m_SpecificFCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedLoad Intrinsic.
cst_pred_ty< is_maxsignedvalue > m_MaxSignedValue()
Match an integer or vector with values having all bits except for the high bit set (0x7f....
auto m_FAbs(const Opnd0 &Op0)
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
match_combine_or< FMaxMin_match< LHS, RHS, ofmax_pred_ty >, FMaxMin_match< LHS, RHS, ufmax_pred_ty > > m_OrdOrUnordFMax(const LHS &L, const RHS &R)
Match an 'ordered' or 'unordered' floating point maximum function.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap > m_NSWAdd(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
LogicalOp_match< LHS, RHS, Instruction::And, true > m_c_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FDiv > m_FDiv(const LHS &L, const RHS &R)
BinOpPred_match< LHS, RHS, is_irem_op > m_IRem(const LHS &L, const RHS &R)
Matches integer remainder operations.
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
auto m_VecReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
LogicalOp_match< LHS, RHS, Instruction::Or, true > m_c_LogicalOr(const LHS &L, const RHS &R)
Matches L || R with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, ICmpInst, true > m_c_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
auto m_Cttz(const Opnd0 &Op0, const Opnd1 &Op1)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
auto m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
Not(const Pred &P) -> Not< Pred >
ElementType
The element type of an SRV or UAV resource.
Definition DXILABI.h:68
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
@ Known
Known to have no common set bits.
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
APFloat abs(APFloat X)
Returns the absolute value of the argument.
Definition APFloat.h:1721
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI CmpInst::Predicate getMinMaxPred(SelectPatternFlavor SPF, bool Ordered=false)
Return the canonical comparison predicate for the specified minimum/maximum flavor.
LLVM_ABI bool canIgnoreSignBitOfZero(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is zero.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Constant * ConstantFoldIntrinsic(Intrinsic::ID ID, ArrayRef< Constant * > Ops, Type *Ty, const DataLayout &DL, const Function *CtxF=nullptr)
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
constexpr unsigned MaxAnalysisRecursionDepth
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:944
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
LLVM_ABI SelectPatternResult getSelectPattern(CmpInst::Predicate Pred, SelectPatternNaNBehavior NaNBehavior=SPNB_NA, bool Ordered=false)
Determine the pattern for predicate X Pred Y ? X : Y.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI bool cannotBeNegativeZero(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if we can prove that the specified FP value is never equal to -0.0.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1769
LLVM_ABI Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, FastMathFlags FMF, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
LLVM_ABI bool isKnownInversion(const Value *X, const Value *Y)
Return true iff:
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
LLVM_ABI Intrinsic::ID getMinMaxIntrinsic(SelectPatternFlavor SPF)
Convert given SPF to equivalent min/max intrinsic.
LLVM_ABI SelectPatternResult matchDecomposedSelectPattern(CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS, FastMathFlags FMF=FastMathFlags(), Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Determine the pattern that a select with the given compare as its predicate and given values as its t...
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ FAdd
Sum of floats.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
LLVM_ABI Value * simplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, const SimplifyQuery &Q, bool AllowRefinement, SmallVectorImpl< Instruction * > *DropFlags=nullptr)
See if V simplifies when its operand Op is replaced with RepOp.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isKnownNeverNaN(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not a NaN or if the floating-point vector value has...
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI std::optional< std::pair< CmpPredicate, Constant * > > getFlippedStrictnessPredicateAndConstant(CmpPredicate Pred, Constant *C)
Convert an integer comparison with a constant RHS into an equivalent form with the strictness flipped...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI bool isCheckForZeroAndMulWithOverflow(Value *Op0, Value *Op1, bool IsAnd, Use *&Y)
Match one of the patterns up to the select/logic op: Op0 = icmp ne i4 X, 0 Agg = call { i4,...
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
LLVM_ABI bool canIgnoreSignBitOfNaN(const Use &U)
Return true if the sign bit of the FP value can be ignored by the user when the value is NaN.
LLVM_ABI void findValuesAffectedByCondition(Value *Cond, bool IsAssume, function_ref< void(Value *)> InsertAffected)
Call InsertAffected on all Values whose known bits / value may be affected by the condition Cond.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
static constexpr DenormalMode getIEEE()
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
SelectPatternFlavor Flavor
bool Ordered
Only applicable if Flavor is SPF_FMINNUM or SPF_FMAXNUM.
static bool isMinOrMax(SelectPatternFlavor SPF)
When implementing this min/max pattern as fcmp; select, does the fcmp have to be ordered?
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC
const Instruction * CtxI