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