From 8ea9d0c7c932328745976c01943afafaa8c729ee Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 4 Jan 2005 14:37:23 +0000 Subject: [PATCH] re PR tree-optimization/18308 (ICE in do_jump, at dojump.c:274) gcc: 2005-01-04 Paolo Bonzini Devang Patel 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 * gcc.dg/vect/pr18308.c: New testcase. Co-Authored-By: Devang Patel From-SVN: r92895 --- gcc/ChangeLog | 10 ++++++++ gcc/dojump.c | 37 ++++++++++++++++++++++------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/vect/pr18308.c | 13 ++++++++++ gcc/tree-if-conv.c | 21 ++++++++++++---- 5 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr18308.c 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 + Devang Patel + + 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 * 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 + + PR tree-optimization/18308 + * gcc.dg/vect/pr18308.c: New testcase. + 2005-01-04 Andreas Jaeger * 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 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);