From: Richard Guenther Date: Fri, 13 Apr 2012 12:22:16 +0000 (+0000) Subject: re PR tree-optimization/52969 (ICE in in get_expr_operands, at tree-ssa-operands... X-Git-Tag: misc/gccgo-go1_1_2~3515 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=95df37bf8bded356f45539ecaa8bff3078d9cf86;p=thirdparty%2Fgcc.git re PR tree-optimization/52969 (ICE in in get_expr_operands, at tree-ssa-operands.c:1035 with -ftree-loop-if-convert-stores) 2012-04-13 Richard Guenther PR tree-optimization/52969 * tree-if-conv.c (predicate_mem_writes): Properly gimplify the condition for the COND_EXPR and handle predicate negation by swapping the COND_EXPR arms. * gcc.dg/torture/pr52969.c: New testcase. From-SVN: r186416 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c42ce67354ae..7eee86a9dccd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-04-13 Richard Guenther + + PR tree-optimization/52969 + * tree-if-conv.c (predicate_mem_writes): Properly gimplify + the condition for the COND_EXPR and handle predicate negation + by swapping the COND_EXPR arms. + 2012-04-13 Nick Clifton * config/rl78/rl78.c (rl78_devirt_pass): Remove use of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9abfbd3bded3..f93259258af3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-04-13 Richard Guenther + + PR tree-optimization/52969 + * gcc.dg/torture/pr52969.c: New testcase. + 2012-04-13 Richard Guenther PR c/52549 diff --git a/gcc/testsuite/gcc.dg/torture/pr52969.c b/gcc/testsuite/gcc.dg/torture/pr52969.c new file mode 100644 index 000000000000..05331d93f34e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr52969.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-ftree-loop-if-convert-stores" } */ + +int a, b; +float xsum[100]; +void foo (float *cluster) +{ + int j; + for (; a ; ++j) { + xsum[j] = cluster[j]; + if (xsum[j] > 0) + xsum[j] = 0; + } + if (xsum[0]) + b = 0; +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 55616d57667d..c86a4aa55bb8 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -1543,11 +1543,19 @@ predicate_mem_writes (loop_p loop) gimple_stmt_iterator gsi; basic_block bb = ifc_bbs[i]; tree cond = bb_predicate (bb); + bool swap; gimple stmt; if (is_true_predicate (cond)) continue; + swap = false; + if (TREE_CODE (cond) == TRUTH_NOT_EXPR) + { + swap = true; + cond = TREE_OPERAND (cond, 0); + } + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) if ((stmt = gsi_stmt (gsi)) && gimple_assign_single_p (stmt) @@ -1559,6 +1567,15 @@ predicate_mem_writes (loop_p loop) lhs = ifc_temp_var (type, unshare_expr (lhs), &gsi); rhs = ifc_temp_var (type, unshare_expr (rhs), &gsi); + if (swap) + { + tree tem = lhs; + lhs = rhs; + rhs = tem; + } + cond = force_gimple_operand_gsi_1 (&gsi, unshare_expr (cond), + is_gimple_condexpr, NULL_TREE, + true, GSI_SAME_STMT); rhs = build3 (COND_EXPR, type, unshare_expr (cond), rhs, lhs); gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi)); update_stmt (stmt);