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