summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ADT/APFloat.h5
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp10
-rw-r--r--llvm/test/Transforms/ConstProp/fma.ll37
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
}
-
OpenPOWER on IntegriCloud