aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRafael Avila de Espindola <espindola@google.com>2008-05-08 22:16:59 +0000
committerRafael Espindola <espindola@gcc.gnu.org>2008-05-08 22:16:59 +0000
commit04b03edb56633f6e77d7834022d4e49a74f3cce5 (patch)
tree465e7779ecfa60e33ba35e94156083288329e034 /gcc
parent96c92f4763242fbf74d70ca52dc5ebecc3c0ce95 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog9
-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.c22
-rw-r--r--gcc/tree-eh.c5
-rw-r--r--gcc/tree-gimple.c12
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;