tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Reorganize so that it picks...
authorJeff Law <law@redhat.com>
Fri, 14 May 2004 17:51:05 +0000 (11:51 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 14 May 2004 17:51:05 +0000 (11:51 -0600)
        * tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Reorganize
        so that it picks up more opportunities to eliminate ABS expressions
        or turn them into negations.

        * gcc.dg/tree-ssa/20040514-2.c: New test.

From-SVN: r81853

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c [new file with mode: 0644]
gcc/tree-ssa-dom.c

index 67de341..844500d 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-14  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Reorganize
+       so that it picks up more opportunities to eliminate ABS expressions
+       or turn them into negations.
+
 2004-05-14  Steven Bosscher  <stevenb@suse.de>
 
        * passes.c (rest_of_handle_null_pointer): Remove.
index 6269855..77a80ba 100644 (file)
@@ -1,3 +1,7 @@
+2004-05-14  Jeff Law  <law@redhat.com>
+
+       * gcc.dg/tree-ssa/20040514-2.c: New test.
+
 2004-05-14  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * gfortran.fortran-torture/compile/noncontinuation_1.f90: Rename
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c b/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c
new file mode 100644 (file)
index 0000000..b651ae3
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-dom3" } */
+int
+foo2 (distance, i, j)
+     int distance;
+     int i, j;
+{
+ int t = distance;
+ if (t <= 0)
+   t = ((t) >= 0 ? (t)  : -(t));
+ return t;
+}
+
+/* There should be no ABS_EXPR.  */
+/* { dg-final { scan-tree-dump-times "ABS_EXPR " 0 "dom3"} } */
index ed47ea6..89f4c6a 100644 (file)
@@ -1826,7 +1826,7 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
 
          if (! dummy_cond)
            {
-             dummy_cond = build (LT_EXPR, boolean_type_node,
+             dummy_cond = build (LE_EXPR, boolean_type_node,
                                  op, integer_zero_node);
              dummy_cond = build (COND_EXPR, void_type_node,
                                  dummy_cond, NULL, NULL);
@@ -1834,7 +1834,7 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
            }
          else
            {
-             TREE_SET_CODE (TREE_OPERAND (dummy_cond, 0), LT_EXPR);
+             TREE_SET_CODE (TREE_OPERAND (dummy_cond, 0), LE_EXPR);
              TREE_OPERAND (TREE_OPERAND (dummy_cond, 0), 0) = op;
              TREE_OPERAND (TREE_OPERAND (dummy_cond, 0), 1)
                = convert (type, integer_zero_node);
@@ -1842,6 +1842,26 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
          val = simplify_cond_and_lookup_avail_expr (dummy_cond,
                                                     &bd->avail_exprs,
                                                     NULL, false);
+
+         if (!val)
+           {
+             TREE_SET_CODE (TREE_OPERAND (dummy_cond, 0), GE_EXPR);
+             TREE_OPERAND (TREE_OPERAND (dummy_cond, 0), 0) = op;
+             TREE_OPERAND (TREE_OPERAND (dummy_cond, 0), 1)
+               = convert (type, integer_zero_node);
+
+             val = simplify_cond_and_lookup_avail_expr (dummy_cond,
+                                                        &bd->avail_exprs,
+                                                        NULL, false);
+
+             if (val)
+               {
+                 if (integer_zerop (val))
+                   val = integer_one_node;
+                 else if (integer_onep (val))
+                   val = integer_zero_node;
+               }
+           }
        }
 
       if (val