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> 2008-05-08 Richard Sandiford <rsandifo@nildram.co.uk>
* read-rtl.c (join_c_conditions): Return the first string if the * 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> 2008-05-08 David Daney <ddaney@avtrex.com>
* lib/target-supports.exp (check_effective_target_sync_int_long): Add * 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, ...@@ -1047,22 +1047,30 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
tree ar, tree ai, tree br, tree bi, tree ar, tree ai, tree br, tree bi,
enum tree_code code) 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; basic_block bb_cond, bb_true, bb_false, bb_join;
/* Examine |br| < |bi|, and branch. */ /* Examine |br| < |bi|, and branch. */
t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br); t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br);
t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi); t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi);
cond = fold_build2 (LT_EXPR, boolean_type_node, t1, t2); compare = fold_build2 (LT_EXPR, boolean_type_node, t1, t2);
STRIP_NOPS (cond); STRIP_NOPS (compare);
bb_cond = bb_true = bb_false = bb_join = NULL; bb_cond = bb_true = bb_false = bb_join = NULL;
rr = ri = tr = ti = NULL; rr = ri = tr = ti = NULL;
if (!TREE_CONSTANT (cond)) if (!TREE_CONSTANT (compare))
{ {
edge e; 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); bsi_insert_before (bsi, cond, BSI_SAME_STMT);
/* Split the original block, and create the TRUE and FALSE blocks. */ /* 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, ...@@ -1098,7 +1106,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
ti = (ai * ratio) - ar; ti = (ai * ratio) - ar;
tr = tr / div; tr = tr / div;
ti = ti / div; */ ti = ti / div; */
if (bb_true || integer_nonzerop (cond)) if (bb_true || integer_nonzerop (compare))
{ {
if (bb_true) if (bb_true)
{ {
...@@ -1137,7 +1145,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type, ...@@ -1137,7 +1145,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
ti = b - (a * ratio); ti = b - (a * ratio);
tr = tr / div; tr = tr / div;
ti = ti / div; */ ti = ti / div; */
if (bb_false || integer_zerop (cond)) if (bb_false || integer_zerop (compare))
{ {
if (bb_false) if (bb_false)
{ {
......
...@@ -1896,6 +1896,9 @@ tree_could_trap_p (tree expr) ...@@ -1896,6 +1896,9 @@ tree_could_trap_p (tree expr)
|| TREE_CODE_CLASS (code) == tcc_binary) || TREE_CODE_CLASS (code) == tcc_binary)
{ {
t = TREE_TYPE (expr); t = TREE_TYPE (expr);
if (COMPARISON_CLASS_P (expr))
fp_operation = FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
else
fp_operation = FLOAT_TYPE_P (t); fp_operation = FLOAT_TYPE_P (t);
if (fp_operation) if (fp_operation)
{ {
......
...@@ -155,7 +155,10 @@ is_gimple_lvalue (tree t) ...@@ -155,7 +155,10 @@ is_gimple_lvalue (tree t)
bool bool
is_gimple_condexpr (tree t) 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. */ /* Return true if T is something whose address can be taken. */
...@@ -648,12 +651,7 @@ canonicalize_cond_expr_cond (tree t) ...@@ -648,12 +651,7 @@ canonicalize_cond_expr_cond (tree t)
TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1)); TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1));
} }
/* A valid conditional for a COND_EXPR is either a gimple value if (is_gimple_condexpr (t))
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))))
return t; return t;
return NULL_TREE; 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