OSDN Git Service

gcc:
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Jan 2005 14:37:23 +0000 (14:37 +0000)
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Jan 2005 14:37:23 +0000 (14:37 +0000)
2005-01-04  Paolo Bonzini  <bonzini@gnu.org>
    Devang Patel  <dpatel@apple.com>

PR tree-optimization/18308

* tree-if-conv.c (add_to_dst_predicate_list): Gimplify
the operands before creating a new expression.
* dojump.c (do_jump): Make drop_through_label available
for all cases.  Add expansion of COND_EXPR.

gcc/testsuite:
2005-01-04  Paolo Bonzini  <bonzini@gnu.org>

* gcc.dg/vect/pr18308.c: New testcase.

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

gcc/ChangeLog
gcc/dojump.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr18308.c [new file with mode: 0644]
gcc/tree-if-conv.c

index 721feff..5d83e22 100644 (file)
@@ -1,3 +1,13 @@
+2005-01-04  Paolo Bonzini  <bonzini@gnu.org>
+           Devang Patel  <dpatel@apple.com>
+
+       PR tree-optimization/18308
+
+       * tree-if-conv.c (add_to_dst_predicate_list): Gimplify
+       the operands before creating a new expression.
+       * dojump.c (do_jump): Make drop_through_label available
+       for all cases.  Add expansion of COND_EXPR.
+
 2005-01-04  Ira Rosen  <irar@il.ibm.com>
 
        * tree-vectorizer.c (vect_analyze_offset_expr): Test for
index 0dc826b..650e51a 100644 (file)
@@ -1,6 +1,6 @@
 /* Convert tree expression to rtl instructions, for GNU compiler.
    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -164,6 +164,7 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
   int i;
   tree type;
   enum machine_mode mode;
+  rtx drop_through_label = 0;
 
   switch (code)
     {
@@ -293,10 +294,29 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
       do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
       break;
 
+    case COND_EXPR:
+      {
+       rtx label1 = gen_label_rtx ();
+       if (!if_true_label || !if_false_label)
+         {
+           drop_through_label = gen_label_rtx ();
+           if (!if_true_label)
+             if_true_label = drop_through_label;
+           if (!if_false_label)
+             if_false_label = drop_through_label;
+         }
+
+        do_pending_stack_adjust ();
+        do_jump (TREE_OPERAND (exp, 0), label1, NULL_RTX);
+        do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label);
+        emit_label (label1);
+        do_jump (TREE_OPERAND (exp, 2), if_false_label, if_true_label);
+       break;
+      }
+
     case TRUTH_ANDIF_EXPR:
     case TRUTH_ORIF_EXPR:
     case COMPOUND_EXPR:
-    case COND_EXPR:
       /* Lowered by gimplify.c.  */
       gcc_unreachable ();
 
@@ -478,7 +498,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
             tree op0 = save_expr (TREE_OPERAND (exp, 0));
             tree op1 = save_expr (TREE_OPERAND (exp, 1));
             tree cmp0, cmp1;
-           rtx drop_through_label = 0;
 
             /* If the target doesn't support combined unordered
                compares, decompose into two comparisons.  */
@@ -489,12 +508,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
             cmp1 = fold (build2 (tcode2, TREE_TYPE (exp), op0, op1));
            do_jump (cmp0, 0, if_true_label);
            do_jump (cmp1, if_false_label, if_true_label);
-
-           if (drop_through_label)
-             {
-               do_pending_stack_adjust ();
-               emit_label (drop_through_label);
-             }
           }
       }
       break;
@@ -568,6 +581,12 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
                                   if_false_label, if_true_label);
        }
     }
+
+  if (drop_through_label)
+    {
+      do_pending_stack_adjust ();
+      emit_label (drop_through_label);
+    }
 }
 \f
 /* Given a comparison expression EXP for values too wide to be compared
index 5e8dc70..c376fce 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-04  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR tree-optimization/18308
+       * gcc.dg/vect/pr18308.c: New testcase.
+
 2005-01-04  Andreas Jaeger  <aj@suse.de>
 
        * gcc.target/i386/amd64-abi-1.c: Only run as 64-bit tests.
diff --git a/gcc/testsuite/gcc.dg/vect/pr18308.c b/gcc/testsuite/gcc.dg/vect/pr18308.c
new file mode 100644 (file)
index 0000000..b71f08e
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vectorize -funroll-loops" } */
+void foo();
+
+void bar(int j)
+{
+  int i, k=0;
+  for (i = 0; i < 2; ++i)
+    if (j) k = 2;
+
+  if (k) foo();
+}
+
index 36e9c75..4085922 100644 (file)
@@ -1,5 +1,5 @@
 /* If-conversion for vectorizer.
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
    Contributed by Devang Patel <dpatel@apple.com>
 
 This file is part of GCC.
@@ -639,10 +639,23 @@ add_to_dst_predicate_list (struct loop * loop, basic_block bb,
     new_cond = unshare_expr (cond);
   else
     {
-      tree tmp_stmt;
+      tree tmp;
+      tree tmp_stmt = NULL_TREE;
+      tree tmp_stmts1 = NULL_TREE;
+      tree tmp_stmts2 = NULL_TREE;
+      prev_cond = force_gimple_operand (unshare_expr (prev_cond),
+                                       &tmp_stmts1, true, NULL);
+      if (tmp_stmts1)
+        bsi_insert_before (bsi, tmp_stmts1, BSI_SAME_STMT);
+
+      cond = force_gimple_operand (unshare_expr (cond),
+                                  &tmp_stmts2, true, NULL);
+      if (tmp_stmts2)
+        bsi_insert_before (bsi, tmp_stmts2, BSI_SAME_STMT);
+
       /* new_cond == prev_cond AND cond */
-      tree tmp = build (TRUTH_AND_EXPR, boolean_type_node,
-                       unshare_expr (prev_cond), cond);
+      tmp = build (TRUTH_AND_EXPR, boolean_type_node,
+                  unshare_expr (prev_cond), cond);
       tmp_stmt = ifc_temp_var (boolean_type_node, tmp);
       bsi_insert_before (bsi, tmp_stmt, BSI_SAME_STMT);
       new_cond = TREE_OPERAND (tmp_stmt, 0);