From aad2bccb9b17ca771009135da32d71ee9e1a83d1 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Sat, 4 Apr 2009 10:37:10 +0000 Subject: [PATCH] re PR target/39501 (-O -ffinite-math-only gets min(x,y) optimization wrong for soft-float on arm-*-gnueabi) PR target/39501 * arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT. * testsuite/gcc.c-torture/execute/pr39501.c: New file. * testsuite/gcc.c-torture/execute/pr39501.x: New file. From-SVN: r145534 --- gcc/ChangeLog | 7 +++ gcc/config/arm/arm.md | 2 +- gcc/testsuite/gcc.c-torture/execute/pr39501.c | 83 +++++++++++++++++++++++++++ gcc/testsuite/gcc.c-torture/execute/pr39501.x | 2 + 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr39501.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr39501.x diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 69fbfd5..223ebaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-04-04 Richard Earnshaw + + PR target/39501 + * arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT. + * testsuite/gcc.c-torture/execute/pr39501.c: New file. + * testsuite/gcc.c-torture/execute/pr39501.x: New file. + 2009-04-04 Richard Guenther PR tree-optimization/8781 diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 3128094..ff217e0 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -8260,7 +8260,7 @@ (if_then_else:SF (match_operand 1 "arm_comparison_operator" "") (match_operand:SF 2 "s_register_operand" "") (match_operand:SF 3 "nonmemory_operand" "")))] - "TARGET_32BIT" + "TARGET_32BIT && TARGET_HARD_FLOAT" " { enum rtx_code code = GET_CODE (operands[1]); diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.c b/gcc/testsuite/gcc.c-torture/execute/pr39501.c new file mode 100644 index 0000000..3749d6e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr39501.c @@ -0,0 +1,83 @@ +/* { dg-options "-ffast-math" } */ +#define min1(a,b) ((a) < (b) ? (a) : (b)) +#define max1(a,b) ((a) > (b) ? (a) : (b)) + +#define min2(a,b) ((a) <= (b) ? (a) : (b)) +#define max2(a,b) ((a) >= (b) ? (a) : (b)) + +#define F(type,n) \ + type __attribute__((noinline)) type##_##n(type a, type b) \ + { \ + return n(a, b); \ + } + +F(float,min1) +F(float,min2) +F(float,max1) +F(float,max2) + +F(double,min1) +F(double,min2) +F(double,max1) +F(double,max2) + +int main() +{ + if (float_min1(0.f, -1.f) != -1.f) abort(); + if (float_min1(-1.f, 0.f) != -1.f) abort(); + if (float_min1(0.f, 1.f) != 0.f) abort(); + if (float_min1(1.f, 0.f) != 0.f) abort(); + if (float_min1(-1.f, 1.f) != -1.f) abort(); + if (float_min1(1.f, -1.f) != -1.f) abort(); + + if (float_max1(0.f, -1.f) != 0.f) abort(); + if (float_max1(-1.f, 0.f) != 0.f) abort(); + if (float_max1(0.f, 1.f) != 1.f) abort(); + if (float_max1(1.f, 0.f) != 1.f) abort(); + if (float_max1(-1.f, 1.f) != 1.f) abort(); + if (float_max1(1.f, -1.f) != 1.f) abort(); + + if (float_min2(0.f, -1.f) != -1.f) abort(); + if (float_min2(-1.f, 0.f) != -1.f) abort(); + if (float_min2(0.f, 1.f) != 0.f) abort(); + if (float_min2(1.f, 0.f) != 0.f) abort(); + if (float_min2(-1.f, 1.f) != -1.f) abort(); + if (float_min2(1.f, -1.f) != -1.f) abort(); + + if (float_max2(0.f, -1.f) != 0.f) abort(); + if (float_max2(-1.f, 0.f) != 0.f) abort(); + if (float_max2(0.f, 1.f) != 1.f) abort(); + if (float_max2(1.f, 0.f) != 1.f) abort(); + if (float_max2(-1.f, 1.f) != 1.f) abort(); + if (float_max2(1.f, -1.f) != 1.f) abort(); + + if (double_min1(0., -1.) != -1.) abort(); + if (double_min1(-1., 0.) != -1.) abort(); + if (double_min1(0., 1.) != 0.) abort(); + if (double_min1(1., 0.) != 0.) abort(); + if (double_min1(-1., 1.) != -1.) abort(); + if (double_min1(1., -1.) != -1.) abort(); + + if (double_max1(0., -1.) != 0.) abort(); + if (double_max1(-1., 0.) != 0.) abort(); + if (double_max1(0., 1.) != 1.) abort(); + if (double_max1(1., 0.) != 1.) abort(); + if (double_max1(-1., 1.) != 1.) abort(); + if (double_max1(1., -1.) != 1.) abort(); + + if (double_min2(0., -1.) != -1.) abort(); + if (double_min2(-1., 0.) != -1.) abort(); + if (double_min2(0., 1.) != 0.) abort(); + if (double_min2(1., 0.) != 0.) abort(); + if (double_min2(-1., 1.) != -1.) abort(); + if (double_min2(1., -1.) != -1.) abort(); + + if (double_max2(0., -1.) != 0.) abort(); + if (double_max2(-1., 0.) != 0.) abort(); + if (double_max2(0., 1.) != 1.) abort(); + if (double_max2(1., 0.) != 1.) abort(); + if (double_max2(-1., 1.) != 1.) abort(); + if (double_max2(1., -1.) != 1.) abort(); + + exit(0); +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.x b/gcc/testsuite/gcc.c-torture/execute/pr39501.x new file mode 100644 index 0000000..72527d7 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr39501.x @@ -0,0 +1,2 @@ +set additional_flags "-ffast-math" +return 0 -- 2.7.4