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
This commit is contained in:
parent
aa7069aa9f
commit
aad2bccb9b
4 changed files with 93 additions and 1 deletions
|
@ -1,3 +1,10 @@
|
|||
2009-04-04 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
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 <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/8781
|
||||
|
|
|
@ -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]);
|
||||
|
|
83
gcc/testsuite/gcc.c-torture/execute/pr39501.c
Normal file
83
gcc/testsuite/gcc.c-torture/execute/pr39501.c
Normal file
|
@ -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);
|
||||
}
|
2
gcc/testsuite/gcc.c-torture/execute/pr39501.x
Normal file
2
gcc/testsuite/gcc.c-torture/execute/pr39501.x
Normal file
|
@ -0,0 +1,2 @@
|
|||
set additional_flags "-ffast-math"
|
||||
return 0
|
Loading…
Add table
Reference in a new issue