Hello. Following patch fixes the ICE as it defensively finds the right place where a new STMT should be inserted.
Patch bootstraps on x86_64-linux-gnu and no new regression is introduced. Ready for trunk? Thanks, Martin
>From de9f966a20cf08721dc8bdb83144b07f72e6cc59 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 18 May 2016 13:21:36 +0200 Subject: [PATCH] Fix PR tree-optimization/71170 gcc/ChangeLog: 2016-05-18 Martin Liska <mli...@suse.cz> * tree-ssa-reassoc.c (rewrite_expr_tree): Insert a new gimple stmt if we would use a SSA_NAME before its definition. --- gcc/tree-ssa-reassoc.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 3b5f36b..a8fd889 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -3813,7 +3813,8 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, some redundant operations, so unless we are just swapping the arguments or unless there is no change at all (then we just return lhs), force creation of a new SSA_NAME. */ - if (changed || ((rhs1 != oe2->op || rhs2 != oe1->op) && opindex)) + if (changed || ((rhs1 != oe2->op || rhs2 != oe1->op) && opindex) + || find_insert_point (stmt, oe1->op, oe2->op) != stmt) { gimple *insert_point = find_insert_point (stmt, oe1->op, oe2->op); @@ -3830,8 +3831,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, } else { - gcc_checking_assert (find_insert_point (stmt, oe1->op, oe2->op) - == stmt); gimple_assign_set_rhs1 (stmt, oe1->op); gimple_assign_set_rhs2 (stmt, oe2->op); update_stmt (stmt); @@ -3876,7 +3875,7 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, Otherwise ensure the old lhs SSA_NAME is not reused and create a new stmt as well, so that any debug stmts will be properly adjusted. */ - if (changed) + if (changed || find_insert_point (stmt, new_rhs1, oe->op) != stmt) { gimple_stmt_iterator gsi = gsi_for_stmt (stmt); unsigned int uid = gimple_uid (stmt); @@ -3894,8 +3893,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, } else { - gcc_checking_assert (find_insert_point (stmt, new_rhs1, oe->op) - == stmt); gimple_assign_set_rhs1 (stmt, new_rhs1); gimple_assign_set_rhs2 (stmt, oe->op); update_stmt (stmt); -- 2.8.2