aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2010-01-22 10:52:01 -0800
committerRichard Henderson <rth@gcc.gnu.org>2010-01-22 10:52:01 -0800
commit002cda0a8b3a5cff63b60f2f7aaf0684729c7c02 (patch)
tree3305726401c185237a4df96747f19c0599fc7716 /gcc/tree-sra.c
parent728d406cd758c24a4e63f1e3089827fd2c470358 (diff)
downloadgcc-002cda0a8b3a5cff63b60f2f7aaf0684729c7c02.zip
gcc-002cda0a8b3a5cff63b60f2f7aaf0684729c7c02.tar.gz
gcc-002cda0a8b3a5cff63b60f2f7aaf0684729c7c02.tar.bz2
re PR tree-optimization/42833 (sra miscompiles qemu)
PR tree-opt/42833 * tree-sra.c (sra_modify_assign): Delay re-gimplification of the RHS until after generate_subtree_copies has insertted its code before the current statement. From-SVN: r156176
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r--gcc/tree-sra.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 07658bd..79c5c76 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -2533,6 +2533,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi,
bool modify_this_stmt = false;
bool force_gimple_rhs = false;
location_t loc = gimple_location (*stmt);
+ gimple_stmt_iterator orig_gsi = *gsi;
if (!gimple_assign_single_p (*stmt))
return SRA_SA_NONE;
@@ -2611,15 +2612,6 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi,
force_gimple_rhs = true;
}
}
-
- if (force_gimple_rhs)
- rhs = force_gimple_operand_gsi (gsi, rhs, true, NULL_TREE,
- true, GSI_SAME_STMT);
- if (gimple_assign_rhs1 (*stmt) != rhs)
- {
- gimple_assign_set_rhs_from_tree (gsi, rhs);
- gcc_assert (*stmt == gsi_stmt (*gsi));
- }
}
/* From this point on, the function deals with assignments in between
@@ -2721,6 +2713,18 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi,
0, 0, gsi, true, true);
}
}
+
+ /* This gimplification must be done after generate_subtree_copies, lest we
+ insert the subtree copies in the middle of the gimplified sequence. */
+ if (force_gimple_rhs)
+ rhs = force_gimple_operand_gsi (&orig_gsi, rhs, true, NULL_TREE,
+ true, GSI_SAME_STMT);
+ if (gimple_assign_rhs1 (*stmt) != rhs)
+ {
+ gimple_assign_set_rhs_from_tree (&orig_gsi, rhs);
+ gcc_assert (*stmt == gsi_stmt (orig_gsi));
+ }
+
return modify_this_stmt ? SRA_SA_PROCESSED : SRA_SA_NONE;
}