aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-09-13 08:13:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-09-13 08:13:03 +0000
commit2da6996c61125da38e0e9e8182ca2a623e03de63 (patch)
tree85968996243f9eb29194674f04443ee99447c9c1 /gcc/gimple-fold.c
parent5a41741f0c311c5d4bca85292116f67ec7a2a60f (diff)
downloadgcc-2da6996c61125da38e0e9e8182ca2a623e03de63.zip
gcc-2da6996c61125da38e0e9e8182ca2a623e03de63.tar.gz
gcc-2da6996c61125da38e0e9e8182ca2a623e03de63.tar.bz2
re PR tree-optimization/82128 (ICE on valid code)
2017-09-13 Richard Biener <rguenther@suse.de> PR middle-end/82128 * gimple-fold.c (gimple_fold_call): Update SSA name in-place to default-def to avoid breaking iterator update with the weird interaction with cgraph_update_edges_for_call_stmt_node. * g++.dg/pr82128.C: New testcase. From-SVN: r252062
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index a1dce4c..0ec2256 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -3862,24 +3862,18 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
tree fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
gimple *new_stmt = gimple_build_call (fndecl, 0);
gimple_set_location (new_stmt, gimple_location (stmt));
+ /* If the call had a SSA name as lhs morph that into
+ an uninitialized value. */
if (lhs && TREE_CODE (lhs) == SSA_NAME)
{
tree var = create_tmp_var (TREE_TYPE (lhs));
- tree def = get_or_create_ssa_default_def (cfun, var);
-
- /* To satisfy condition for
- cgraph_update_edges_for_call_stmt_node,
- we need to preserve GIMPLE_CALL statement
- at position of GSI iterator. */
- update_call_from_tree (gsi, def);
- gsi_insert_before (gsi, new_stmt, GSI_NEW_STMT);
- }
- else
- {
- gimple_set_vuse (new_stmt, gimple_vuse (stmt));
- gimple_set_vdef (new_stmt, gimple_vdef (stmt));
- gsi_replace (gsi, new_stmt, false);
+ SET_SSA_NAME_VAR_OR_IDENTIFIER (lhs, var);
+ SSA_NAME_DEF_STMT (lhs) = gimple_build_nop ();
+ set_ssa_default_def (cfun, var, lhs);
}
+ gimple_set_vuse (new_stmt, gimple_vuse (stmt));
+ gimple_set_vdef (new_stmt, gimple_vdef (stmt));
+ gsi_replace (gsi, new_stmt, false);
return true;
}
}