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