diff options
| -rw-r--r-- | llvm/include/llvm/ADT/APFloat.h | 5 | ||||
| -rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/Transforms/ConstProp/fma.ll | 37 |
3 files changed, 20 insertions, 32 deletions
diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h index a9648d35cf5..1c496973379 100644 --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -192,6 +192,11 @@ struct APFloatBase { /// IEEE-754R 7: Default exception handling. /// /// opUnderflow or opOverflow are always returned or-ed with opInexact. + /// + /// APFloat models this behavior specified by IEEE-754: + /// "For operations producing results in floating-point format, the default + /// result of an operation that signals the invalid operation exception + /// shall be a quiet NaN." enum opStatus { opOK = 0x00, opInvalidOp = 0x01, diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 51521955e13..9c926167ca0 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -2243,13 +2243,9 @@ static Constant *ConstantFoldScalarCall3(StringRef Name, case Intrinsic::fma: case Intrinsic::fmuladd: { APFloat V = Op1->getValueAPF(); - APFloat::opStatus s = V.fusedMultiplyAdd(Op2->getValueAPF(), - Op3->getValueAPF(), - APFloat::rmNearestTiesToEven); - if (s != APFloat::opInvalidOp) - return ConstantFP::get(Ty->getContext(), V); - - return nullptr; + V.fusedMultiplyAdd(Op2->getValueAPF(), Op3->getValueAPF(), + APFloat::rmNearestTiesToEven); + return ConstantFP::get(Ty->getContext(), V); } } } diff --git a/llvm/test/Transforms/ConstProp/fma.ll b/llvm/test/Transforms/ConstProp/fma.ll index 7428676ac8d..9119548a91a 100644 --- a/llvm/test/Transforms/ConstProp/fma.ll +++ b/llvm/test/Transforms/ConstProp/fma.ll @@ -129,8 +129,7 @@ define double @test_Inf_4() { define double @inf_product_opposite_inf_addend_1() { ; CHECK-LABEL: @inf_product_opposite_inf_addend_1( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 7.000000e+00, double 0xFFF0000000000000, double 0x7FF0000000000000) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0x7FF0000000000000) ret double %1 @@ -140,8 +139,7 @@ define double @inf_product_opposite_inf_addend_1() { define double @inf_product_opposite_inf_addend_2() { ; CHECK-LABEL: @inf_product_opposite_inf_addend_2( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 7.000000e+00, double 0x7FF0000000000000, double 0xFFF0000000000000) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0xFFF0000000000000) ret double %1 @@ -151,8 +149,7 @@ define double @inf_product_opposite_inf_addend_2() { define double @inf_product_opposite_inf_addend_3() { ; CHECK-LABEL: @inf_product_opposite_inf_addend_3( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0xFFF0000000000000, double 4.200000e+01, double 0x7FF0000000000000) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 42.0, double 0x7FF0000000000000) ret double %1 @@ -162,8 +159,7 @@ define double @inf_product_opposite_inf_addend_3() { define double @inf_product_opposite_inf_addend_4() { ; CHECK-LABEL: @inf_product_opposite_inf_addend_4( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0x7FF0000000000000, double 4.200000e+01, double 0xFFF0000000000000) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 42.0, double 0xFFF0000000000000) ret double %1 @@ -173,8 +169,7 @@ define double @inf_product_opposite_inf_addend_4() { define double @inf_times_zero_1() { ; CHECK-LABEL: @inf_times_zero_1( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0.000000e+00, double 0xFFF0000000000000, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0.0, double 0xFFF0000000000000, double 42.0) ret double %1 @@ -184,8 +179,7 @@ define double @inf_times_zero_1() { define double @inf_times_zero_2() { ; CHECK-LABEL: @inf_times_zero_2( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0.000000e+00, double 0x7FF0000000000000, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0.0, double 0x7FF0000000000000, double 42.0) ret double %1 @@ -195,8 +189,7 @@ define double @inf_times_zero_2() { define double @inf_times_zero_3() { ; CHECK-LABEL: @inf_times_zero_3( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0xFFF0000000000000, double 0.000000e+00, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 0.0, double 42.0) ret double %1 @@ -206,8 +199,7 @@ define double @inf_times_zero_3() { define double @inf_times_zero_4() { ; CHECK-LABEL: @inf_times_zero_4( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0x7FF0000000000000, double 0.000000e+00, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 0.0, double 42.0) ret double %1 @@ -217,8 +209,7 @@ define double @inf_times_zero_4() { define double @inf_times_zero_5() { ; CHECK-LABEL: @inf_times_zero_5( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double -0.000000e+00, double 0xFFF0000000000000, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double -0.0, double 0xFFF0000000000000, double 42.0) ret double %1 @@ -228,8 +219,7 @@ define double @inf_times_zero_5() { define double @inf_times_zero_6() { ; CHECK-LABEL: @inf_times_zero_6( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double -0.000000e+00, double 0x7FF0000000000000, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double -0.0, double 0x7FF0000000000000, double 42.0) ret double %1 @@ -239,8 +229,7 @@ define double @inf_times_zero_6() { define double @inf_times_zero_7() { ; CHECK-LABEL: @inf_times_zero_7( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0xFFF0000000000000, double -0.000000e+00, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double -0.0, double 42.0) ret double %1 @@ -250,10 +239,8 @@ define double @inf_times_zero_7() { define double @inf_times_zero_8() { ; CHECK-LABEL: @inf_times_zero_8( -; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fma.f64(double 0x7FF0000000000000, double -0.000000e+00, double 4.200000e+01) -; CHECK-NEXT: ret double [[TMP1]] +; CHECK-NEXT: ret double 0x7FF8000000000000 ; %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double -0.0, double 42.0) ret double %1 } - |

