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