From 04b03edb56633f6e77d7834022d4e49a74f3cce5 Mon Sep 17 00:00:00 2001 From: Rafael Avila de Espindola Date: Thu, 8 May 2008 22:16:59 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 10 +++++++++ gcc/testsuite/ChangeLog | 9 ++++++++ ...vect-111.c => no-trapping-math-vect-111.c} | 0 ...-11.c => no-trapping-math-vect-ifcvt-11.c} | 0 ...-12.c => no-trapping-math-vect-ifcvt-12.c} | 0 ...-13.c => no-trapping-math-vect-ifcvt-13.c} | 0 ...-14.c => no-trapping-math-vect-ifcvt-14.c} | 0 ...-15.c => no-trapping-math-vect-ifcvt-15.c} | 0 gcc/tree-complex.c | 22 +++++++++++++------ gcc/tree-eh.c | 5 ++++- gcc/tree-gimple.c | 12 +++++----- 11 files changed, 43 insertions(+), 15 deletions(-) rename gcc/testsuite/gcc.dg/vect/{vect-111.c => no-trapping-math-vect-111.c} (100%) rename gcc/testsuite/gcc.dg/vect/{vect-ifcvt-11.c => no-trapping-math-vect-ifcvt-11.c} (100%) rename gcc/testsuite/gcc.dg/vect/{vect-ifcvt-12.c => no-trapping-math-vect-ifcvt-12.c} (100%) rename gcc/testsuite/gcc.dg/vect/{vect-ifcvt-13.c => no-trapping-math-vect-ifcvt-13.c} (100%) rename gcc/testsuite/gcc.dg/vect/{vect-ifcvt-14.c => no-trapping-math-vect-ifcvt-14.c} (100%) rename gcc/testsuite/gcc.dg/vect/{vect-ifcvt-15.c => no-trapping-math-vect-ifcvt-15.c} (100%) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb7ee2ec286..7d0a3afacaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-05-08 Rafael Espindola + + * 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 * read-rtl.c (join_c_conditions): Return the first string if the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff5d2cc92ff..9e3a1f148a9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2008-05-08 Rafael Espindola + + * 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 * 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-111.c rename to 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c rename to 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c rename to 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c rename to 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c rename to 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 similarity index 100% rename from gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c rename to 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 4703e78d22d..8d680dfa6bf 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 06e4b5a9d07..9428e38c54e 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 433c294039b..101dfd17c2b 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; -- 2.30.2