summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-04 14:37:23 +0000
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-04 14:37:23 +0000
commit90b356513caca9c4a5faec602f2275cc1ec1ac1f (patch)
treea919dee0dec5ee35dd918a7ace0394d63a37c89c
parentddcd5265b3bfdeaade59784d28ab2f7724d24344 (diff)
downloadgcc-90b356513caca9c4a5faec602f2275cc1ec1ac1f.tar.gz
gcc:
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
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/dojump.c37
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr18308.c13
-rw-r--r--gcc/tree-if-conv.c21
5 files changed, 73 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 721feff1c4b..5d83e223b04 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dojump.c b/gcc/dojump.c
index 0dc826bbefc..650e51aeb14 100644
--- a/gcc/dojump.c
+++ b/gcc/dojump.c
@@ -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);
+ }
}
/* Given a comparison expression EXP for values too wide to be compared
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5e8dc70baee..c376fce25a9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..b71f08ede2c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr18308.c
@@ -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();
+}
+
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 36e9c758b53..40859226784 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -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);