Hi! With LTO and -O0 initial compilation, -O1 linking we at some point used to add stmts normal after a PHI, which is invalid. This patch fixes that by inserting after labels instead. No testcase provided, as the issue is latent anyway and I don't know how to write lto testcases that use different options initially from linking options.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2015-02-13 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/62209 * tree-ssa-reassoc.c (update_range_test): If stmt is a PHI and op == range->exp, insert seq and gimplified code after labels instead of after the phi. --- gcc/tree-ssa-reassoc.c.jj 2015-02-13 15:02:03.000000000 +0100 +++ gcc/tree-ssa-reassoc.c 2015-02-13 16:52:05.113232491 +0100 @@ -2160,10 +2160,18 @@ update_range_test (struct range_entry *r tem = fold_convert_loc (loc, optype, tem); gsi = gsi_for_stmt (stmt); + unsigned int uid = gimple_uid (stmt); /* In rare cases range->exp can be equal to lhs of stmt. In that case we have to insert after the stmt rather then before - it. */ - if (op == range->exp) + it. If stmt is a PHI, insert it at the start of the basic block. */ + if (op != range->exp) + { + gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, + GSI_SAME_STMT); + gsi_prev (&gsi); + } + else if (gimple_code (stmt) != GIMPLE_PHI) { gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING); tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false, @@ -2171,16 +2179,32 @@ update_range_test (struct range_entry *r } else { + gsi = gsi_after_labels (gimple_bb (stmt)); + if (!gsi_end_p (gsi)) + uid = gimple_uid (gsi_stmt (gsi)); + else + { + gsi = gsi_start_bb (gimple_bb (stmt)); + uid = 1; + while (!gsi_end_p (gsi)) + { + uid = gimple_uid (gsi_stmt (gsi)); + gsi_next (&gsi); + } + } gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, GSI_SAME_STMT); - gsi_prev (&gsi); + if (gsi_end_p (gsi)) + gsi = gsi_last_bb (gimple_bb (stmt)); + else + gsi_prev (&gsi); } for (; !gsi_end_p (gsi); gsi_prev (&gsi)) if (gimple_uid (gsi_stmt (gsi))) break; else - gimple_set_uid (gsi_stmt (gsi), gimple_uid (stmt)); + gimple_set_uid (gsi_stmt (gsi), uid); oe->op = tem; range->exp = exp; Jakub