diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-02-14 09:23:18 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-02-14 09:23:18 +0100 |
commit | 952e216e5a092b5072894b3889f18bc5f76dcf72 (patch) | |
tree | 6fd332fa48a75bfd4ee308da8c22deaa0c1fea37 /gcc | |
parent | b671235f7970e38b26c8940f752b5d57441f225b (diff) | |
download | gcc-952e216e5a092b5072894b3889f18bc5f76dcf72.zip gcc-952e216e5a092b5072894b3889f18bc5f76dcf72.tar.gz gcc-952e216e5a092b5072894b3889f18bc5f76dcf72.tar.bz2 |
re PR tree-optimization/62209 (ICE with LTO on valid code on x86_64-linux-gnu)
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.
From-SVN: r220706
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 32 |
2 files changed, 35 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ca43bfd..75c1865 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-02-14 Jakub Jelinek <jakub@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. + 2015-02-13 Jeff Law <law@redhat.com> PR bootstrap/65060 diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 9952222..ce37053 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2177,10 +2177,18 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, 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, @@ -2188,16 +2196,32 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, } 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; |