Commit 04b03edb by Rafael Avila de Espindola Committed by Rafael Espindola

tree-complex.c (expand_complex_div_wide): Don't create CONDs that trap.

	* tree-complex.c (expand_complex_div_wide): Don't create CONDs that
	trap.
	* tree-gimple.c (is_gimple_condexpr): Check that the expression doesn't
	trap and that both operands are gimple values.
	(canonicalize_cond_expr_cond): Use is_gimple_condexpr.
	* gcc/tree-eh.c (tree_could_trap_p): Correctly detect if a comparison
	is a fp operation.

	* gcc/testsuite/gcc.dg/vect/vect-111.c: Rename to no-trapping-math-vect-111.c
	* gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c: Rename to no-trapping-math-vect-ifcvt-11.c
	* gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c: Rename to no-trapping-math-vect-ifcvt-12.c
	* gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c: Rename to no-trapping-math-vect-ifcvt-13.c
	* gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c: Rename to no-trapping-math-vect-ifcvt-14.c
	* gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c: Rename to no-trapping-math-vect-ifcvt-15.c

From-SVN: r135093
parent 96c92f47
2008-05-08 Rafael Espindola <espindola@google.com>
* tree-complex.c (expand_complex_div_wide): Don't create CONDs that
trap.
* tree-gimple.c (is_gimple_condexpr): Check that the expression doesn't
trap and that both operands are gimple values.
(canonicalize_cond_expr_cond): Use is_gimple_condexpr.
* gcc/tree-eh.c (tree_could_trap_p): Correctly detect if a comparison
is a fp operation.
2008-05-08 Richard Sandiford <rsandifo@nildram.co.uk>
* read-rtl.c (join_c_conditions): Return the first string if the
......
2008-05-08 Rafael Espindola <espindola@google.com>
* gcc.dg/vect/vect-111.c: Rename to no-trapping-math-vect-111.c
* gcc.dg/vect/vect-ifcvt-11.c: Rename to no-trapping-math-vect-ifcvt-11.c
* gcc.dg/vect/vect-ifcvt-12.c: Rename to no-trapping-math-vect-ifcvt-12.c
* gcc.dg/vect/vect-ifcvt-13.c: Rename to no-trapping-math-vect-ifcvt-13.c
* gcc.dg/vect/vect-ifcvt-14.c: Rename to no-trapping-math-vect-ifcvt-14.c
* gcc.dg/vect/vect-ifcvt-15.c: Rename to no-trapping-math-vect-ifcvt-15.c
2008-05-08 David Daney <ddaney@avtrex.com>
* lib/target-supports.exp (check_effective_target_sync_int_long): Add
......@@ -1047,22 +1047,30 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
tree ar, tree ai, tree br, tree bi,
enum tree_code code)
{
tree rr, ri, ratio, div, t1, t2, tr, ti, cond;
tree rr, ri, ratio, div, t1, t2, tr, ti, compare;
basic_block bb_cond, bb_true, bb_false, bb_join;
/* Examine |br| < |bi|, and branch. */
t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br);
t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi);
cond = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
STRIP_NOPS (cond);
compare = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
STRIP_NOPS (compare);
bb_cond = bb_true = bb_false = bb_join = NULL;
rr = ri = tr = ti = NULL;
if (!TREE_CONSTANT (cond))
if (!TREE_CONSTANT (compare))
{
edge e;
tree cond, tmp;
cond = build3 (COND_EXPR, void_type_node, cond, NULL_TREE, NULL_TREE);
tmp = create_tmp_var (boolean_type_node, NULL);
cond = build_gimple_modify_stmt (tmp, compare);
if (gimple_in_ssa_p (cfun))
tmp = make_ssa_name (tmp, cond);
GIMPLE_STMT_OPERAND (cond, 0) = tmp;
bsi_insert_before (bsi, cond, BSI_SAME_STMT);
cond = build3 (COND_EXPR, void_type_node, tmp, NULL_TREE, NULL_TREE);
bsi_insert_before (bsi, cond, BSI_SAME_STMT);
/* Split the original block, and create the TRUE and FALSE blocks. */
......@@ -1098,7 +1106,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
ti = (ai * ratio) - ar;
tr = tr / div;
ti = ti / div; */
if (bb_true || integer_nonzerop (cond))
if (bb_true || integer_nonzerop (compare))
{
if (bb_true)
{
......@@ -1137,7 +1145,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
ti = b - (a * ratio);
tr = tr / div;
ti = ti / div; */
if (bb_false || integer_zerop (cond))
if (bb_false || integer_zerop (compare))
{
if (bb_false)
{
......
......@@ -1896,7 +1896,10 @@ tree_could_trap_p (tree expr)
|| TREE_CODE_CLASS (code) == tcc_binary)
{
t = TREE_TYPE (expr);
fp_operation = FLOAT_TYPE_P (t);
if (COMPARISON_CLASS_P (expr))
fp_operation = FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
else
fp_operation = FLOAT_TYPE_P (t);
if (fp_operation)
{
honor_nans = flag_trapping_math && !flag_finite_math_only;
......
......@@ -155,7 +155,10 @@ is_gimple_lvalue (tree t)
bool
is_gimple_condexpr (tree t)
{
return (is_gimple_val (t) || COMPARISON_CLASS_P (t));
return (is_gimple_val (t) || (COMPARISON_CLASS_P (t)
&& !tree_could_trap_p (t)
&& is_gimple_val (TREE_OPERAND (t, 0))
&& is_gimple_val (TREE_OPERAND (t, 1))));
}
/* Return true if T is something whose address can be taken. */
......@@ -648,12 +651,7 @@ canonicalize_cond_expr_cond (tree t)
TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
}
/* A valid conditional for a COND_EXPR is either a gimple value
or a comparison with two gimple value operands. */
if (is_gimple_val (t)
|| (COMPARISON_CLASS_P (t)
&& is_gimple_val (TREE_OPERAND (t, 0))
&& is_gimple_val (TREE_OPERAND (t, 1))))
if (is_gimple_condexpr (t))
return t;
return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment