Skip to content

Commit 6c3097d

Browse files
committed
[InstCombine] Handle FMF in SimplifyDemandedUseFPClass
1 parent e94b6c3 commit 6c3097d

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,9 +1959,11 @@ static Constant *getFPClassConstant(Type *Ty, FPClassTest Mask) {
19591959
}
19601960
}
19611961

1962-
Value *InstCombinerImpl::SimplifyDemandedUseFPClass(
1963-
Value *V, const FPClassTest DemandedMask, KnownFPClass &Known,
1964-
unsigned Depth, Instruction *CxtI) {
1962+
Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
1963+
FPClassTest DemandedMask,
1964+
KnownFPClass &Known,
1965+
unsigned Depth,
1966+
Instruction *CxtI) {
19651967
assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
19661968
Type *VTy = V->getType();
19671969

@@ -1985,7 +1987,12 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(
19851987
if (!I->hasOneUse())
19861988
return nullptr;
19871989

1988-
// TODO: Should account for nofpclass/FastMathFlags on current instruction
1990+
if (auto *FPOp = dyn_cast<FPMathOperator>(I)) {
1991+
if (FPOp->hasNoNaNs())
1992+
DemandedMask &= ~fcNan;
1993+
if (FPOp->hasNoInfs())
1994+
DemandedMask &= ~fcInf;
1995+
}
19891996
switch (I->getOpcode()) {
19901997
case Instruction::FNeg: {
19911998
if (SimplifyDemandedFPClass(I, 0, llvm::fneg(DemandedMask), Known,

llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,8 @@ define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives_copysig
693693
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_nopositives_copysign_nnan_flag(float %x, float %unknown.sign) {
694694
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_nopositives_copysign_nnan_flag
695695
; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
696-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan float @llvm.copysign.f32(float [[X]], float [[UNKNOWN_SIGN]])
696+
; CHECK-NEXT: [[TMP1:%.*]] = call nnan float @llvm.fabs.f32(float [[X]])
697+
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg nnan float [[TMP1]]
697698
; CHECK-NEXT: ret float [[COPYSIGN]]
698699
;
699700
%copysign = call nnan float @llvm.copysign.f32(float %x, float %unknown.sign)
@@ -727,7 +728,7 @@ define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_nonegatives_copysig
727728
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_nonegatives_copysign_nnan_flag(float %x, float %unknown.sign) {
728729
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_nonegatives_copysign_nnan_flag
729730
; CHECK-SAME: (float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
730-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan float @llvm.copysign.f32(float [[X]], float [[UNKNOWN_SIGN]])
731+
; CHECK-NEXT: [[COPYSIGN:%.*]] = call nnan float @llvm.fabs.f32(float [[X]])
731732
; CHECK-NEXT: ret float [[COPYSIGN]]
732733
;
733734
%copysign = call nnan float @llvm.copysign.f32(float %x, float %unknown.sign)

0 commit comments

Comments
 (0)