re PR tree-optimization/84235 (Miscompilation of floating point code by dom2)

PR tree-optimization/84235
	* tree-ssa-scopedtables.c
	(avail_exprs_stack::simplify_binary_operation): Fir MINUS_EXPR, punt
	if the subtraction is performed in floating point type where NaNs are
	honored.  For *DIV_EXPR, punt for ALL_FRACT_MODE_Ps where we can't
	build 1.  Formatting fix.

	* gcc.c-torture/execute/ieee/pr84235.c: New test.

From-SVN: r257437
This commit is contained in:
Jakub Jelinek 2018-02-07 09:29:58 +01:00 committed by Jakub Jelinek
parent 84c71bb8ec
commit 40ff1a2d1d
4 changed files with 38 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2018-02-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/84235
* tree-ssa-scopedtables.c
(avail_exprs_stack::simplify_binary_operation): Fir MINUS_EXPR, punt
if the subtraction is performed in floating point type where NaNs are
honored. For *DIV_EXPR, punt for ALL_FRACT_MODE_Ps where we can't
build 1. Formatting fix.
2018-02-06 Jakub Jelinek <jakub@redhat.com>
PR target/84146

View File

@ -1,3 +1,8 @@
2018-02-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/84235
* gcc.c-torture/execute/ieee/pr84235.c: New test.
2018-02-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR testsuite/84243

View File

@ -0,0 +1,11 @@
/* PR tree-optimization/84235 */
int
main ()
{
double d = 1.0 / 0.0;
_Bool b = d == d && (d - d) != (d - d);
if (!b)
__builtin_abort ();
return 0;
}

View File

@ -182,8 +182,15 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
case BIT_AND_EXPR:
return gimple_assign_rhs1 (stmt);
case BIT_XOR_EXPR:
case MINUS_EXPR:
/* This is unsafe for certain floats even in non-IEEE
formats. In IEEE, it is unsafe because it does
wrong for NaNs. */
if (FLOAT_TYPE_P (result_type)
&& HONOR_NANS (result_type))
break;
/* FALLTHRU */
case BIT_XOR_EXPR:
case TRUNC_MOD_EXPR:
case CEIL_MOD_EXPR:
case FLOOR_MOD_EXPR:
@ -195,6 +202,9 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
case EXACT_DIV_EXPR:
/* Avoid _Fract types where we can't build 1. */
if (ALL_FRACT_MODE_P (TYPE_MODE (result_type)))
break;
return build_one_cst (result_type);
default:
@ -204,8 +214,8 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
break;
}
default:
break;
default:
break;
}
}
}