* tree-complex.c (expand_complex_div_wide): Don't create CONDs that
authorespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 22:16:59 +0000 (22:16 +0000)
committerespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 22:16:59 +0000 (22:16 +0000)
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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@135093 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-111.c [moved from gcc/testsuite/gcc.dg/vect/vect-111.c with 100% similarity]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c [moved from gcc/testsuite/gcc.dg/vect/vect-ifcvt-11.c with 100% similarity]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c [moved from gcc/testsuite/gcc.dg/vect/vect-ifcvt-12.c with 100% similarity]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c [moved from gcc/testsuite/gcc.dg/vect/vect-ifcvt-14.c with 100% similarity]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c [moved from gcc/testsuite/gcc.dg/vect/vect-ifcvt-13.c with 100% similarity]
gcc/testsuite/gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c [moved from gcc/testsuite/gcc.dg/vect/vect-ifcvt-15.c with 100% similarity]
gcc/tree-complex.c
gcc/tree-eh.c
gcc/tree-gimple.c

index cb7ee2e..7d0a3af 100644 (file)
@@ -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
index ff5d2cc..9e3a1f1 100644 (file)
@@ -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
index 4703e78..8d680df 100644 (file)
@@ -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)
        {
index 06e4b5a..9428e38 100644 (file)
@@ -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;
index 433c294..101dfd1 100644 (file)
@@ -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;