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