diff options
author | Rafael Avila de Espindola <espindola@google.com> | 2008-05-08 22:16:59 +0000 |
---|---|---|
committer | Rafael Espindola <espindola@gcc.gnu.org> | 2008-05-08 22:16:59 +0000 |
commit | 04b03edb56633f6e77d7834022d4e49a74f3cce5 (patch) | |
tree | 465e7779ecfa60e33ba35e94156083288329e034 /gcc | |
parent | 96c92f4763242fbf74d70ca52dc5ebecc3c0ce95 (diff) | |
download | gcc-04b03edb56633f6e77d7834022d4e49a74f3cce5.zip gcc-04b03edb56633f6e77d7834022d4e49a74f3cce5.tar.gz gcc-04b03edb56633f6e77d7834022d4e49a74f3cce5.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c (renamed from gcc/testsuite/gcc.dg/vect/vect-111.c) | 0 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c (renamed from gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c) | 0 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c (renamed from gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c) | 0 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c (renamed from gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c) | 0 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c (renamed from gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c) | 0 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c (renamed from gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c) | 0 | ||||
-rw-r--r-- | gcc/tree-complex.c | 22 | ||||
-rw-r--r-- | gcc/tree-eh.c | 5 | ||||
-rw-r--r-- | gcc/tree-gimple.c | 12 |
11 files changed, 43 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb7ee2e..7d0a3af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff5d2cc..9e3a1f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +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 diff --git a/gcc/testsuite/gcc.dg/vect/vect-111.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c index 413c7ef..413c7ef 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-111.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c index 560b5bc..560b5bc 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c index 5f132b8..5f132b8 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c index a5a5936..a5a5936 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c index a5a5936..a5a5936 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c index 67d7ebe..67d7ebe 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c +++ b/gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index 4703e78..8d680df 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -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) { diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 06e4b5a..9428e38 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -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; diff --git a/gcc/tree-gimple.c b/gcc/tree-gimple.c index 433c294..101dfd1 100644 --- a/gcc/tree-gimple.c +++ b/gcc/tree-gimple.c @@ -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; |