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