Commit 8ea9d0c7 by Paolo Bonzini Committed by Paolo Bonzini

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
parent 8c427b58
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> 2005-01-04 Ira Rosen <irar@il.ibm.com>
* tree-vectorizer.c (vect_analyze_offset_expr): Test for * tree-vectorizer.c (vect_analyze_offset_expr): Test for
......
/* Convert tree expression to rtl instructions, for GNU compiler. /* Convert tree expression to rtl instructions, for GNU compiler.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 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. This file is part of GCC.
...@@ -164,6 +164,7 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -164,6 +164,7 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
int i; int i;
tree type; tree type;
enum machine_mode mode; enum machine_mode mode;
rtx drop_through_label = 0;
switch (code) switch (code)
{ {
...@@ -293,10 +294,29 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -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); do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
break; 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_ANDIF_EXPR:
case TRUTH_ORIF_EXPR: case TRUTH_ORIF_EXPR:
case COMPOUND_EXPR: case COMPOUND_EXPR:
case COND_EXPR:
/* Lowered by gimplify.c. */ /* Lowered by gimplify.c. */
gcc_unreachable (); gcc_unreachable ();
...@@ -478,7 +498,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -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 op0 = save_expr (TREE_OPERAND (exp, 0));
tree op1 = save_expr (TREE_OPERAND (exp, 1)); tree op1 = save_expr (TREE_OPERAND (exp, 1));
tree cmp0, cmp1; tree cmp0, cmp1;
rtx drop_through_label = 0;
/* If the target doesn't support combined unordered /* If the target doesn't support combined unordered
compares, decompose into two comparisons. */ compares, decompose into two comparisons. */
...@@ -489,12 +508,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -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)); cmp1 = fold (build2 (tcode2, TREE_TYPE (exp), op0, op1));
do_jump (cmp0, 0, if_true_label); do_jump (cmp0, 0, if_true_label);
do_jump (cmp1, if_false_label, 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; break;
...@@ -568,6 +581,12 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label) ...@@ -568,6 +581,12 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
if_false_label, 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 /* Given a comparison expression EXP for values too wide to be compared
......
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> 2005-01-04 Andreas Jaeger <aj@suse.de>
* gcc.target/i386/amd64-abi-1.c: Only run as 64-bit tests. * gcc.target/i386/amd64-abi-1.c: Only run as 64-bit tests.
......
/* { 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();
}
/* If-conversion for vectorizer. /* 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> Contributed by Devang Patel <dpatel@apple.com>
This file is part of GCC. This file is part of GCC.
...@@ -639,10 +639,23 @@ add_to_dst_predicate_list (struct loop * loop, basic_block bb, ...@@ -639,10 +639,23 @@ add_to_dst_predicate_list (struct loop * loop, basic_block bb,
new_cond = unshare_expr (cond); new_cond = unshare_expr (cond);
else 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 */ /* new_cond == prev_cond AND cond */
tree tmp = build (TRUTH_AND_EXPR, boolean_type_node, tmp = build (TRUTH_AND_EXPR, boolean_type_node,
unshare_expr (prev_cond), cond); unshare_expr (prev_cond), cond);
tmp_stmt = ifc_temp_var (boolean_type_node, tmp); tmp_stmt = ifc_temp_var (boolean_type_node, tmp);
bsi_insert_before (bsi, tmp_stmt, BSI_SAME_STMT); bsi_insert_before (bsi, tmp_stmt, BSI_SAME_STMT);
new_cond = TREE_OPERAND (tmp_stmt, 0); new_cond = TREE_OPERAND (tmp_stmt, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment