re PR tree-optimization/18308 (ICE in do_jump, at dojump.c:274)

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.

Co-Authored-By: Devang Patel <dpatel@apple.com>

From-SVN: r92895
This commit is contained in:
Paolo Bonzini 2005-01-04 14:37:23 +00:00 committed by Paolo Bonzini
parent 8c427b58d1
commit 8ea9d0c7c9
5 changed files with 73 additions and 13 deletions

View 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

View 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);
}
}
/* Given a comparison expression EXP for values too wide to be compared

View 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.

View File

@ -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();
}

View 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);