[llvm-branch-commits] [llvm] InstCombine: Support basic phis in SimplifyDemandedFPClass (PR #184124)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Mar 2 05:54:39 PST 2026
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/184124
Some complex function edge case epilogs are only handled under
some control flow paths (e.g. lgamma and erfcinv).
>From 0c40fd05fdb6cebdecdccc58ab3920b82d4a904a Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 2 Mar 2026 14:35:13 +0100
Subject: [PATCH] InstCombine: Support basic phis in SimplifyDemandedFPClass
Some complex function edge case epilogs are only handled under
some control flow paths (e.g. lgamma and erfcinv).
---
.../InstCombine/InstCombineInternal.h | 2 +-
.../InstCombineSimplifyDemanded.cpp | 144 +++++++++++++-----
.../InstCombine/InstructionCombining.cpp | 3 +-
.../simplify-demanded-fpclass-phi.ll | 57 +++----
.../InstCombine/simplify-demanded-fpclass.ll | 8 +-
5 files changed, 128 insertions(+), 86 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
index 053a3a2b85b36..fd9f0675a3239 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
@@ -606,7 +606,7 @@ class LLVM_LIBRARY_VISIBILITY InstCombinerImpl final
bool SimplifyDemandedFPClass(Instruction *I, unsigned Op,
FPClassTest DemandedMask, KnownFPClass &Known,
- unsigned Depth = 0);
+ const SimplifyQuery &Q, unsigned Depth = 0);
bool SimplifyDemandedInstructionFPClass(Instruction &Inst);
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 456d39ecc30cb..5550d2ccdf351 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2281,7 +2281,8 @@ simplifyDemandedFPClassMinMax(KnownFPClass &Known, Intrinsic::ID IID,
static Value *
simplifyDemandedUseFPClassFPTrunc(InstCombinerImpl &IC, Instruction &I,
FastMathFlags FMF, FPClassTest DemandedMask,
- KnownFPClass &Known, unsigned Depth) {
+ KnownFPClass &Known, const SimplifyQuery &SQ,
+ unsigned Depth) {
FPClassTest SrcDemandedMask = DemandedMask;
if (DemandedMask & fcNan)
@@ -2305,7 +2306,8 @@ simplifyDemandedUseFPClassFPTrunc(InstCombinerImpl &IC, Instruction &I,
SrcDemandedMask |= fcNegNormal;
KnownFPClass KnownSrc;
- if (IC.SimplifyDemandedFPClass(&I, 0, SrcDemandedMask, KnownSrc, Depth + 1))
+ if (IC.SimplifyDemandedFPClass(&I, 0, SrcDemandedMask, KnownSrc, SQ,
+ Depth + 1))
return &I;
Known = KnownFPClass::fptrunc(KnownSrc);
@@ -2341,7 +2343,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
KnownFPClass KnownSrc;
if (SimplifyDemandedFPClass(cast<Instruction>(FNegSrc), 0,
llvm::unknown_sign(DemandedMask), KnownSrc,
- Depth + 1))
+ SQ, Depth + 1))
return I;
FastMathFlags FabsFMF = cast<FPMathOperator>(FNegSrc)->getFastMathFlags();
@@ -2370,7 +2372,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
break;
}
- if (SimplifyDemandedFPClass(I, 0, llvm::fneg(DemandedMask), Known,
+ if (SimplifyDemandedFPClass(I, 0, llvm::fneg(DemandedMask), Known, SQ,
Depth + 1))
return I;
Known.fneg();
@@ -2418,7 +2420,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
if (DemandedMask & fcNegInf)
SrcDemandedMask |= fcNegNormal;
- if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
+ Depth + 1))
return I;
Known = KnownFPClass::fadd_self(KnownLHS, Mode);
@@ -2433,8 +2436,10 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
if (DemandedMask & fcInf)
SrcDemandedMask |= fcInf;
- if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, Depth + 1) ||
- SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, SQ,
+ Depth + 1) ||
+ SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
+ Depth + 1))
return I;
Type *EltTy = VTy->getScalarType();
@@ -2508,7 +2513,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
if (X == Y &&
isGuaranteedNotToBeUndef(X, SQ.AC, SQ.CxtI, SQ.DT, Depth + 1)) {
- if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ,
+ Depth + 1))
return I;
Type *EltTy = VTy->getScalarType();
@@ -2538,8 +2544,9 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
return nullptr;
}
- if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, Depth + 1) ||
- SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, SQ,
+ Depth + 1) ||
+ SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, SQ, Depth + 1))
return I;
if (FMF.noInfs()) {
@@ -2721,8 +2728,9 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
KnownFPClass KnownLHS, KnownRHS;
- if (SimplifyDemandedFPClass(I, 0, LHSDemandedMask, KnownLHS, Depth + 1) ||
- SimplifyDemandedFPClass(I, 1, RHSDemandedMask, KnownRHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, LHSDemandedMask, KnownLHS, SQ,
+ Depth + 1) ||
+ SimplifyDemandedFPClass(I, 1, RHSDemandedMask, KnownRHS, SQ, Depth + 1))
return I;
// nsz [+-]0 / x -> 0
@@ -2782,7 +2790,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
case Instruction::FPTrunc:
return simplifyDemandedUseFPClassFPTrunc(*this, *I, FMF, DemandedMask,
- Known, Depth);
+ Known, SQ, Depth);
case Instruction::FPExt: {
FPClassTest SrcDemandedMask = DemandedMask;
if (DemandedMask & fcNan)
@@ -2795,7 +2803,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
SrcDemandedMask |= fcPosSubnormal;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ, Depth + 1))
return I;
const fltSemantics &DstTy = VTy->getScalarType()->getFltSemantics();
@@ -2815,7 +2823,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
case Intrinsic::fabs: {
KnownFPClass KnownSrc;
if (SimplifyDemandedFPClass(I, 0, llvm::inverse_fabs(DemandedMask),
- KnownSrc, Depth + 1))
+ KnownSrc, SQ, Depth + 1))
return I;
if (Value *Simplified = simplifyDemandedFPClassFabs(
@@ -2825,14 +2833,14 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
break;
}
case Intrinsic::arithmetic_fence:
- if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, SQ, Depth + 1))
return I;
break;
case Intrinsic::copysign: {
// Flip on more potentially demanded classes
const FPClassTest DemandedMaskAnySign = llvm::unknown_sign(DemandedMask);
KnownFPClass KnownMag;
- if (SimplifyDemandedFPClass(CI, 0, DemandedMaskAnySign, KnownMag,
+ if (SimplifyDemandedFPClass(CI, 0, DemandedMaskAnySign, KnownMag, SQ,
Depth + 1))
return I;
@@ -2894,9 +2902,9 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
if (CI->getArgOperand(0) == CI->getArgOperand(1) &&
isGuaranteedNotToBeUndef(CI->getArgOperand(0), SQ.AC, SQ.CxtI, SQ.DT,
Depth + 1)) {
- if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc[0],
+ if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc[0], SQ,
Depth + 1) ||
- SimplifyDemandedFPClass(CI, 2, SrcDemandedMask, KnownSrc[2],
+ SimplifyDemandedFPClass(CI, 2, SrcDemandedMask, KnownSrc[2], SQ,
Depth + 1))
return I;
@@ -2906,7 +2914,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
} else {
for (int OpIdx = 0; OpIdx != 3; ++OpIdx) {
if (SimplifyDemandedFPClass(CI, OpIdx, SrcDemandedMask,
- KnownSrc[OpIdx], Depth + 1))
+ KnownSrc[OpIdx], SQ, Depth + 1))
return CI;
}
@@ -2935,9 +2943,10 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
: fcAllFlags;
KnownFPClass KnownLHS, KnownRHS;
- if (SimplifyDemandedFPClass(CI, 1, SrcDemandedMask, KnownRHS,
+ if (SimplifyDemandedFPClass(CI, 1, SrcDemandedMask, KnownRHS, SQ,
Depth + 1) ||
- SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownLHS, SQ,
+ Depth + 1))
return I;
Value *Simplified =
@@ -3036,7 +3045,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
// TODO: This could really make use of KnownFPClass of specific value
// range, (i.e., close enough to 1)
- if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ,
+ Depth + 1))
return I;
// exp(+/-0) = 1
@@ -3113,7 +3123,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
DemandedSrcMask |= fcPosNormal;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, SQ,
+ Depth + 1))
return I;
Known = KnownFPClass::log(KnownSrc, Mode);
@@ -3134,7 +3145,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
DemandedSrcMask |= fcPosSubnormal;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, DemandedSrcMask, KnownSrc, SQ,
+ Depth + 1))
return I;
// Infer the source cannot be negative if the result cannot be nan.
@@ -3192,7 +3204,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
SrcDemandedMask |= fcNegFinite;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc, SQ,
+ Depth + 1))
return CI;
Type *EltTy = VTy->getScalarType();
@@ -3227,7 +3240,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
DemandedSrcMask |= fcPosSubnormal | fcPosNormal;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(CI, 0, DemandedSrcMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(CI, 0, DemandedSrcMask, KnownSrc, SQ,
+ Depth + 1))
return I;
// Note: Possibly dropping snan quiet.
@@ -3287,7 +3301,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
case Intrinsic::fptrunc_round:
return simplifyDemandedUseFPClassFPTrunc(*this, *CI, FMF, DemandedMask,
- Known, Depth);
+ Known, SQ, Depth);
case Intrinsic::canonicalize: {
Type *EltTy = VTy->getScalarType();
@@ -3324,7 +3338,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
KnownFPClass KnownSrc;
// Simplify upstream operations before trying to simplify this call.
- if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownSrc, SQ,
+ Depth + 1))
return I;
// Perform the canonicalization to see if this folded to a constant.
@@ -3366,8 +3381,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
case Instruction::Select: {
KnownFPClass KnownLHS, KnownRHS;
- if (SimplifyDemandedFPClass(I, 2, DemandedMask, KnownRHS, Depth + 1) ||
- SimplifyDemandedFPClass(I, 1, DemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 2, DemandedMask, KnownRHS, SQ, Depth + 1) ||
+ SimplifyDemandedFPClass(I, 1, DemandedMask, KnownLHS, SQ, Depth + 1))
return I;
if (KnownLHS.isKnownNever(DemandedMask))
@@ -3385,15 +3400,16 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
case Instruction::ExtractElement: {
// TODO: Handle demanded element mask
- if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 0, DemandedMask, Known, SQ, Depth + 1))
return I;
Known.knownNot(~DemandedMask);
break;
}
case Instruction::InsertElement: {
KnownFPClass KnownInserted, KnownVec;
- if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownInserted, Depth + 1) ||
- SimplifyDemandedFPClass(I, 0, DemandedMask, KnownVec, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownInserted, SQ,
+ Depth + 1) ||
+ SimplifyDemandedFPClass(I, 0, DemandedMask, KnownVec, SQ, Depth + 1))
return I;
// TODO: Use demanded elements logic from computeKnownFPClass
@@ -3403,8 +3419,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
}
case Instruction::ShuffleVector: {
KnownFPClass KnownLHS, KnownRHS;
- if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownRHS, Depth + 1) ||
- SimplifyDemandedFPClass(I, 0, DemandedMask, KnownLHS, Depth + 1))
+ if (SimplifyDemandedFPClass(I, 1, DemandedMask, KnownRHS, SQ, Depth + 1) ||
+ SimplifyDemandedFPClass(I, 0, DemandedMask, KnownLHS, SQ, Depth + 1))
return I;
// TODO: This is overly conservative and should consider demanded elements,
@@ -3413,6 +3429,50 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
Known.knownNot(~DemandedMask);
break;
}
+ case Instruction::PHI: {
+ const unsigned PhiRecursionLimit = MaxAnalysisRecursionDepth - 2;
+ if (Depth >= PhiRecursionLimit)
+ break;
+
+ PHINode *P = cast<PHINode>(I);
+ SimplifyQuery ContextSQ = SQ.getWithoutCondContext();
+
+ bool First = true;
+ bool Changed = false;
+ for (unsigned I = 0, E = P->getNumIncomingValues(); I != E; ++I) {
+ // TODO: Better support for self recursive phi
+ if (P->getIncomingValue(I) == P)
+ continue;
+
+ BasicBlock *PredBB = P->getIncomingBlock(I);
+ const Instruction *CtxI = PredBB->getTerminator();
+
+ // Attempt to simplify all incoming edges at a time. If we simplify one
+ // incoming edge, the phi may fold away, losing information on a later
+ // visit.
+ KnownFPClass KnownSrc;
+ if (SimplifyDemandedFPClass(
+ P, P->getOperandNumForIncomingValue(I), DemandedMask, KnownSrc,
+ ContextSQ.getWithInstruction(CtxI), Depth + 1)) {
+ // Fixup the other block references to the simplified value.
+ P->setIncomingValueForBlock(PredBB, P->getIncomingValue(I));
+ Changed = true;
+ }
+
+ if (First) {
+ Known = KnownSrc;
+ First = false;
+ } else {
+ Known |= KnownSrc;
+ }
+ }
+
+ if (Changed)
+ return P;
+
+ Known.knownNot(~DemandedMask);
+ break;
+ }
case Instruction::ExtractValue: {
Value *ExtractSrc;
if (match(I, m_ExtractValue<0>(m_OneUse(m_Value(ExtractSrc))))) {
@@ -3433,7 +3493,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
SrcDemandedMask |= fcNegInf;
KnownFPClass KnownSrc;
- if (SimplifyDemandedFPClass(II, 0, SrcDemandedMask, KnownSrc,
+ if (SimplifyDemandedFPClass(II, 0, SrcDemandedMask, KnownSrc, SQ,
Depth + 1))
return I;
@@ -3610,6 +3670,7 @@ Value *InstCombinerImpl::SimplifyMultipleUseDemandedFPClass(
bool InstCombinerImpl::SimplifyDemandedFPClass(Instruction *I, unsigned OpNo,
FPClassTest DemandedMask,
KnownFPClass &Known,
+ const SimplifyQuery &SQ,
unsigned Depth) {
Use &U = I->getOperandUse(OpNo);
Value *V = U.get();
@@ -3626,7 +3687,7 @@ bool InstCombinerImpl::SimplifyDemandedFPClass(Instruction *I, unsigned OpNo,
Instruction *VInst = dyn_cast<Instruction>(V);
if (!VInst) {
// Handle constants and arguments
- Known = computeKnownFPClass(V, fcAllFlags, SQ.getWithInstruction(I), Depth);
+ Known = computeKnownFPClass(V, fcAllFlags, SQ, Depth);
Known.knownNot(~DemandedMask);
if (Known.KnownFPClasses == fcNone) {
@@ -3659,13 +3720,12 @@ bool InstCombinerImpl::SimplifyDemandedFPClass(Instruction *I, unsigned OpNo,
if (VInst->hasOneUse()) {
// If the instruction has one use, we can directly simplify it.
- NewVal = SimplifyDemandedUseFPClass(VInst, DemandedMask, Known,
- SQ.getWithInstruction(I), Depth);
+ NewVal = SimplifyDemandedUseFPClass(VInst, DemandedMask, Known, SQ, Depth);
} else {
// If there are multiple uses of this instruction, then we can simplify
// VInst to some other value, but not modify the instruction.
- NewVal = SimplifyMultipleUseDemandedFPClass(
- VInst, DemandedMask, Known, SQ.getWithInstruction(I), Depth);
+ NewVal = SimplifyMultipleUseDemandedFPClass(VInst, DemandedMask, Known, SQ,
+ Depth);
}
if (!NewVal)
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index e5c750fc6b130..64558754774e1 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -4186,7 +4186,8 @@ Instruction *InstCombinerImpl::visitReturnInst(ReturnInst &RI) {
return nullptr;
KnownFPClass KnownClass;
- if (SimplifyDemandedFPClass(&RI, 0, ~ReturnClass, KnownClass))
+ if (SimplifyDemandedFPClass(&RI, 0, ~ReturnClass, KnownClass,
+ SQ.getWithInstruction(&RI)))
return &RI;
return nullptr;
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-phi.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-phi.ll
index a064d8b65a457..367a5db8e8ed6 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-phi.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-phi.ll
@@ -9,10 +9,9 @@ define nofpclass(nan) half @ret_phi_if_ret_0(i1 %cond1, i1 %cond2, half %unknown
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br i1 [[COND1]], label %[[IF:.*]], label %[[RET:.*]]
; CHECK: [[IF]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT]], %[[IF]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[UNKNOWN]], %[[IF]] ], [ 0xH0000, %[[ENTRY]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -58,7 +57,7 @@ define nofpclass(inf norm sub zero) half @ret_phi_only_nan(i1 %cond1, i1 %cond2,
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT]], %[[IF]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT]], %[[IF]] ], [ poison, %[[ENTRY]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -79,10 +78,9 @@ define nofpclass(nan) half @ret_phi_if_ret_1(i1 %cond1, i1 %cond2, half %unknown
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br i1 [[COND1]], label %[[IF:.*]], label %[[RET:.*]]
; CHECK: [[IF]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ 0xH0000, %[[ENTRY]] ], [ [[SELECT]], %[[IF]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ 0xH0000, %[[ENTRY]] ], [ [[UNKNOWN]], %[[IF]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -102,7 +100,6 @@ define nofpclass(nan) half @ret_repeated_switch_pred(i8 %switch.cond, i1 %cond2,
; CHECK-LABEL: define nofpclass(nan) half @ret_repeated_switch_pred(
; CHECK-SAME: i8 [[SWITCH_COND:%.*]], i1 [[COND2:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: switch i8 [[SWITCH_COND]], label %[[DEFAULT:.*]] [
; CHECK-NEXT: i8 0, label %[[RET:.*]]
; CHECK-NEXT: i8 1, label %[[RET]]
@@ -113,7 +110,7 @@ define nofpclass(nan) half @ret_repeated_switch_pred(i8 %switch.cond, i1 %cond2,
; CHECK: [[DEFAULT]]:
; CHECK-NEXT: unreachable
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ 0xH0000, %[[IF]] ], [ [[SELECT]], %[[ENTRY]] ], [ [[SELECT]], %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ 0xH0000, %[[IF]] ], [ [[UNKNOWN]], %[[ENTRY]] ], [ [[UNKNOWN]], %[[ENTRY]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -142,10 +139,9 @@ define nofpclass(nan) half @ret_phi_chain(i1 %cond1, i1 %cond2, i1 %cond3, half
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br i1 [[COND1]], label %[[IF0:.*]], label %[[IF1:.*]]
; CHECK: [[IF0]]:
-; CHECK-NEXT: [[SELECT0:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: br i1 [[COND2]], label %[[IF1]], label %[[RET:.*]]
; CHECK: [[IF1]]:
-; CHECK-NEXT: [[PHI0:%.*]] = phi half [ [[SELECT0]], %[[IF0]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI0:%.*]] = phi half [ [[UNKNOWN]], %[[IF0]] ], [ 0xH0000, %[[ENTRY]] ]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
; CHECK-NEXT: [[PHI1:%.*]] = phi half [ [[PHI0]], %[[IF1]] ], [ 0xH0000, %[[IF0]] ]
@@ -172,10 +168,9 @@ define nofpclass(nan) half @basic_loop_break_entry_block(i1 %cond1, i1 %cond2, h
; CHECK-LABEL: define nofpclass(nan) half @basic_loop_break_entry_block(
; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]], half [[UNKNOWN:%.*]], ptr [[P0:%.*]], ptr [[P1:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ [[SELECT]], %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ [[UNKNOWN]], %[[ENTRY]] ]
; CHECK-NEXT: [[LOAD]] = load half, ptr [[P1]], align 2
; CHECK-NEXT: [[BREAK_COND:%.*]] = load i1, ptr [[P0]], align 1
; CHECK-NEXT: br i1 [[BREAK_COND]], label %[[RET:.*]], label %[[LOOP]]
@@ -202,9 +197,8 @@ define nofpclass(nan) half @basic_loop_break_mid_loop(i1 %cond1, i1 %cond2, half
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT:%.*]], %[[LOOP]] ], [ 0xH0000, %[[ENTRY]] ]
-; CHECK-NEXT: [[LOAD:%.*]] = load half, ptr [[P1]], align 2
-; CHECK-NEXT: [[SELECT]] = select i1 [[COND2]], half 0xH7E00, half [[LOAD]]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[LOAD]] = load half, ptr [[P1]], align 2
; CHECK-NEXT: [[BREAK_COND:%.*]] = load i1, ptr [[P0]], align 1
; CHECK-NEXT: br i1 [[BREAK_COND]], label %[[RET:.*]], label %[[LOOP]]
; CHECK: [[RET]]:
@@ -230,9 +224,8 @@ define nofpclass(inf) half @recurrence(i1 %select.cond, half %unknown, ptr %p0,
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT:%.*]], %[[LOOP]] ], [ 0xH0000, %[[ENTRY]] ]
-; CHECK-NEXT: [[LOAD:%.*]] = load half, ptr [[P1]], align 2
-; CHECK-NEXT: [[SELECT]] = select i1 [[SELECT_COND]], half 0xH7C00, half [[LOAD]]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[LOAD]] = load half, ptr [[P1]], align 2
; CHECK-NEXT: [[BREAK_COND:%.*]] = load i1, ptr [[P0]], align 1
; CHECK-NEXT: br i1 [[BREAK_COND]], label %[[RET:.*]], label %[[LOOP]]
; CHECK: [[RET]]:
@@ -259,10 +252,9 @@ define nofpclass(nan) half @path_dependent(i1 %select.cond, half %unknown, half
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[X]], 0xH0000
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[IF:.*]], label %[[RET:.*]]
; CHECK: [[IF]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[SELECT_COND]], half [[X]], half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT]], %[[IF]] ], [ 0xH0000, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[UNKNOWN]], %[[IF]] ], [ 0xH0000, %[[ENTRY]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -312,13 +304,12 @@ define nofpclass(nan) half @diamond_same_select(i1 %select.cond, half %unknown,
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[X]], 0xH0000
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[IF:.*]], label %[[ELSE:.*]]
; CHECK: [[IF]]:
-; CHECK-NEXT: [[SELECT0:%.*]] = select i1 [[SELECT_COND]], half [[X]], half [[UNKNOWN]]
; CHECK-NEXT: br label %[[ENDIF:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[SELECT_COND]], half [[X]], half [[UNKNOWN]]
; CHECK-NEXT: br label %[[ENDIF]]
; CHECK: [[ENDIF]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[SELECT0]], %[[IF]] ], [ [[SELECT1]], %[[ELSE]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[UNKNOWN]], %[[IF]] ], [ [[SELECT1]], %[[ELSE]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -344,7 +335,7 @@ define nofpclass(nan) half @remove_nan_start_value(ptr %p0, ptr %p1) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ 0xH7E00, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ poison, %[[ENTRY]] ]
; CHECK-NEXT: [[LOAD]] = load half, ptr [[P1]], align 2
; CHECK-NEXT: [[BREAK_COND:%.*]] = load i1, ptr [[P0]], align 1
; CHECK-NEXT: br i1 [[BREAK_COND]], label %[[RET:.*]], label %[[LOOP]]
@@ -399,7 +390,7 @@ define nofpclass(nan) half @loop_break_if_nan(ptr %p0) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ 0xH7E00, %[[ENTRY]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD:%.*]], %[[LOOP]] ], [ poison, %[[ENTRY]] ]
; CHECK-NEXT: [[LOAD]] = load half, ptr [[P0]], align 2
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[LOAD]], 0xH0000
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[RET:.*]], label %[[LOOP]]
@@ -448,16 +439,13 @@ ret:
define nofpclass(nan) half @ret_loop_under_if_phi(half %unknown, i1 %cond, i1 %cond2, ptr %p0, ptr %p1) {
; CHECK-LABEL: define nofpclass(nan) half @ret_loop_under_if_phi(
; CHECK-SAME: half [[UNKNOWN:%.*]], i1 [[COND:%.*]], i1 [[COND2:%.*]], ptr [[P0:%.*]], ptr [[P1:%.*]]) {
-; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP:.*]], label %[[RET:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[LOOP_PHI:%.*]] = phi half [ [[LOOP_SELECT:%.*]], %[[LOOP]] ], [ 0xH7E00, %[[ENTRY]] ]
-; CHECK-NEXT: [[LOOP_SELECT]] = select i1 [[COND2]], half 0xH7E00, half [[UNKNOWN]]
; CHECK-NEXT: [[LOOP_COND:%.*]] = load i1, ptr [[P1]], align 1
; CHECK-NEXT: br i1 [[LOOP_COND]], label %[[RET]], label %[[LOOP]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[OUTER_PHI:%.*]] = phi half [ 0xH7E00, %[[ENTRY]] ], [ [[LOOP_PHI]], %[[LOOP]] ]
-; CHECK-NEXT: ret half [[OUTER_PHI]]
+; CHECK-NEXT: ret half [[UNKNOWN]]
;
entry:
%entry.select = select i1 %cond2, half 0xH7E00, half %unknown
@@ -481,10 +469,9 @@ define nofpclass(nan) half @assume_in_loop(half %assumed.nan.in.loop, half %unkn
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: br i1 [[COND]], label %[[LOOP:.*]], label %[[RET:.*]]
; CHECK: [[LOOP]]:
-; CHECK-NEXT: [[LOOP_PHI:%.*]] = phi half [ [[LOOP_SELECT:%.*]], %[[LOOP]] ], [ [[ASSUMED_NAN_IN_LOOP]], %[[ENTRY]] ]
+; CHECK-NEXT: [[LOOP_PHI:%.*]] = phi half [ [[UNKNOWN]], %[[LOOP]] ], [ [[ASSUMED_NAN_IN_LOOP]], %[[ENTRY]] ]
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[ASSUMED_NAN_IN_LOOP]], 0xH0000
; CHECK-NEXT: call void @llvm.assume(i1 [[IS_NAN]])
-; CHECK-NEXT: [[LOOP_SELECT]] = select i1 [[COND2]], half [[ASSUMED_NAN_IN_LOOP]], half [[UNKNOWN]]
; CHECK-NEXT: [[LOOP_COND:%.*]] = load i1, ptr [[P1]], align 1
; CHECK-NEXT: br i1 [[LOOP_COND]], label %[[RET]], label %[[LOOP]]
; CHECK: [[RET]]:
@@ -515,10 +502,9 @@ define nofpclass(nan) half @ret_phi_nan_check(half %checked.if.nan, half %unknow
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[CHECKED_IF_NAN]], 0xH0000
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[IF_NAN:.*]], label %[[RET:.*]]
; CHECK: [[IF_NAN]]:
-; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[CHECKED_IF_NAN]], half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[CHECKED_IF_NAN]], %[[ENTRY]] ], [ [[SELECT]], %[[IF_NAN]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[CHECKED_IF_NAN]], %[[ENTRY]] ], [ [[UNKNOWN]], %[[IF_NAN]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -542,7 +528,6 @@ define nofpclass(nan inf) half @edge_case_if_chain(half %x, i1 %cond, ptr %p0, p
; CHECK-NEXT: br i1 [[IS_INF]], label %[[IS_INF:.*]], label %[[ELSE:.*]]
; CHECK: [[IS_INF]]:
; CHECK-NEXT: [[LOAD0:%.*]] = load half, ptr [[P0]], align 2
-; CHECK-NEXT: [[VAL0:%.*]] = select i1 [[COND]], half [[X]], half [[LOAD0]]
; CHECK-NEXT: br label %[[RET:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[X]], 0xH0000
@@ -551,10 +536,9 @@ define nofpclass(nan inf) half @edge_case_if_chain(half %x, i1 %cond, ptr %p0, p
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[IS_NAN:.*]], label %[[RET]]
; CHECK: [[IS_NAN]]:
; CHECK-NEXT: [[LOAD2:%.*]] = load half, ptr [[P2]], align 2
-; CHECK-NEXT: [[VAL2:%.*]] = select i1 [[COND]], half [[X]], half [[LOAD2]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[VAL0]], %[[IS_INF]] ], [ [[VAL1]], %[[ELSE]] ], [ [[VAL2]], %[[IS_NAN]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[LOAD0]], %[[IS_INF]] ], [ [[VAL1]], %[[ELSE]] ], [ [[LOAD2]], %[[IS_NAN]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
@@ -591,10 +575,9 @@ define nofpclass(nan) half @evaluate_phi_input_at_incoming_edge(half %known.nan.
; CHECK-NEXT: [[IS_NAN:%.*]] = fcmp uno half [[KNOWN_NAN_IN_BRANCH]], 0xH0000
; CHECK-NEXT: br i1 [[IS_NAN]], label %[[IS_NAN:.*]], label %[[RET:.*]]
; CHECK: [[IS_NAN]]:
-; CHECK-NEXT: [[ENTRY_SELECT:%.*]] = select i1 [[COND]], half [[KNOWN_NAN_IN_BRANCH]], half [[UNKNOWN]]
; CHECK-NEXT: br label %[[RET]]
; CHECK: [[RET]]:
-; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[KNOWN_NAN_IN_BRANCH]], %[[ENTRY]] ], [ [[ENTRY_SELECT]], %[[IS_NAN]] ]
+; CHECK-NEXT: [[PHI:%.*]] = phi half [ [[KNOWN_NAN_IN_BRANCH]], %[[ENTRY]] ], [ [[UNKNOWN]], %[[IS_NAN]] ]
; CHECK-NEXT: ret half [[PHI]]
;
entry:
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
index 6be1c0df2e74c..9af5d02b4df28 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
@@ -1721,8 +1721,7 @@ define nofpclass(inf) float @ret_nofpclass_inf__simple_phi_inf_or_unknown(i1 %co
; CHECK: bb0:
; CHECK-NEXT: br label [[RET]]
; CHECK: ret:
-; CHECK-NEXT: [[PHI:%.*]] = phi float [ 0x7FF0000000000000, [[ENTRY:%.*]] ], [ [[X]], [[BB0]] ]
-; CHECK-NEXT: ret float [[PHI]]
+; CHECK-NEXT: ret float [[X]]
;
entry:
br i1 %cond, label %bb0, label %ret
@@ -1747,7 +1746,7 @@ define nofpclass(inf) float @ret_nofpclass_inf__phi_0(i1 %cond0, float %unknown)
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[COND0]], label [[LOOP:%.*]], label [[RET:%.*]]
; CHECK: loop:
-; CHECK-NEXT: [[PHI_LOOP:%.*]] = phi float [ 0x7FF0000000000000, [[ENTRY:%.*]] ], [ [[LOOP_FUNC:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[PHI_LOOP:%.*]] = phi float [ poison, [[ENTRY:%.*]] ], [ [[LOOP_FUNC:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[LOOP_FUNC]] = call nofpclass(nan) float @loop.func()
; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @loop.cond()
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[RET]], label [[LOOP]]
@@ -1829,11 +1828,10 @@ define nofpclass(inf) float @ret_nofpclass_inf__phi_switch_repeated_predecessor(
; CHECK-NEXT: i32 1, label [[LOOP]]
; CHECK-NEXT: ]
; CHECK: loop:
-; CHECK-NEXT: [[PHI_LOOP:%.*]] = phi float [ 0x7FF0000000000000, [[ENTRY:%.*]] ], [ 0x7FF0000000000000, [[ENTRY]] ], [ [[UNKNOWN]], [[LOOP]] ]
; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @loop.cond()
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[RET]], label [[LOOP]]
; CHECK: ret:
-; CHECK-NEXT: [[PHI_RET:%.*]] = phi float [ 0.000000e+00, [[ENTRY]] ], [ [[PHI_LOOP]], [[LOOP]] ]
+; CHECK-NEXT: [[PHI_RET:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[UNKNOWN]], [[LOOP]] ]
; CHECK-NEXT: ret float [[PHI_RET]]
;
entry:
More information about the llvm-branch-commits
mailing list