diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-12-06 22:00:49 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-12-06 22:00:49 +0100 |
commit | 5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1 (patch) | |
tree | 2a2ba30b1649b37aeaba96d866e10ceb2cd88d90 /gcc/tree-ssa-reassoc.c | |
parent | a3698dfc4a6ef95db7db76ca81266ed2630071a1 (diff) | |
download | gcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.zip gcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.tar.gz gcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.tar.bz2 |
re PR tree-optimization/59388 (ICE on valid code at -O1 and above on x86_64-linux-gnu)
PR tree-optimization/59388
* tree-ssa-reassoc.c (update_range_test): If op == range->exp,
gimplify tem after stmt rather than before it.
* gcc.c-torture/execute/pr59388.c: New test.
From-SVN: r205761
Diffstat (limited to 'gcc/tree-ssa-reassoc.c')
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 7145559..ba6c3c7 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -2072,9 +2072,19 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange, tem = fold_convert_loc (loc, optype, tem); gsi = gsi_for_stmt (stmt); - tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, - GSI_SAME_STMT); - for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi)) + /* 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) + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false, + GSI_CONTINUE_LINKING); + else + { + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true, + GSI_SAME_STMT); + gsi_prev (&gsi); + } + for (; !gsi_end_p (gsi); gsi_prev (&gsi)) if (gimple_uid (gsi_stmt (gsi))) break; else |