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