aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-into-ssa.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-01-10 13:42:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-01-10 13:42:27 +0000
commitffc5b2bbcd49e24c1806c0530aba553722e7285a (patch)
tree175f48afc706316523c882c46a4f905378769977 /gcc/tree-into-ssa.c
parente9772e16b39885fb70f6e3651a0b98d6de8655c3 (diff)
downloadgcc-ffc5b2bbcd49e24c1806c0530aba553722e7285a.zip
gcc-ffc5b2bbcd49e24c1806c0530aba553722e7285a.tar.gz
gcc-ffc5b2bbcd49e24c1806c0530aba553722e7285a.tar.bz2
re PR bootstrap/55792 (Bad memory access with profiledbootstrap and LTO)
2013-01-10 Richard Biener <rguenther@suse.de> PR bootstrap/55792 * tree-into-ssa.c (rewrite_add_phi_arguments): Do not set locations for virtual PHI arguments. (rewrite_update_phi_arguments): Likewise. From-SVN: r195084
Diffstat (limited to 'gcc/tree-into-ssa.c')
-rw-r--r--gcc/tree-into-ssa.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 2a38989..8f93b47 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -1355,13 +1355,18 @@ rewrite_add_phi_arguments (basic_block bb)
for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi);
gsi_next (&gsi))
{
- tree currdef;
- gimple stmt;
+ tree currdef, res;
+ location_t loc;
phi = gsi_stmt (gsi);
- currdef = get_reaching_def (SSA_NAME_VAR (gimple_phi_result (phi)));
- stmt = SSA_NAME_DEF_STMT (currdef);
- add_phi_arg (phi, currdef, e, gimple_location (stmt));
+ res = gimple_phi_result (phi);
+ currdef = get_reaching_def (SSA_NAME_VAR (res));
+ /* Virtual operand PHI args do not need a location. */
+ if (virtual_operand_p (res))
+ loc = UNKNOWN_LOCATION;
+ else
+ loc = gimple_location (SSA_NAME_DEF_STMT (currdef));
+ add_phi_arg (phi, currdef, e, loc);
}
}
}
@@ -2018,20 +2023,26 @@ rewrite_update_phi_arguments (basic_block bb)
/* Update the argument if there is a reaching def. */
if (reaching_def)
{
- gimple stmt;
source_location locus;
int arg_i = PHI_ARG_INDEX_FROM_USE (arg_p);
SET_USE (arg_p, reaching_def);
- stmt = SSA_NAME_DEF_STMT (reaching_def);
- /* Single element PHI nodes behave like copies, so get the
- location from the phi argument. */
- if (gimple_code (stmt) == GIMPLE_PHI &&
- gimple_phi_num_args (stmt) == 1)
- locus = gimple_phi_arg_location (stmt, 0);
+ /* Virtual operands do not need a location. */
+ if (virtual_operand_p (reaching_def))
+ locus = UNKNOWN_LOCATION;
else
- locus = gimple_location (stmt);
+ {
+ gimple stmt = SSA_NAME_DEF_STMT (reaching_def);
+
+ /* Single element PHI nodes behave like copies, so get the
+ location from the phi argument. */
+ if (gimple_code (stmt) == GIMPLE_PHI
+ && gimple_phi_num_args (stmt) == 1)
+ locus = gimple_phi_arg_location (stmt, 0);
+ else
+ locus = gimple_location (stmt);
+ }
gimple_phi_arg_set_location (phi, arg_i, locus);
}