diff options
author | Richard Biener <rguenther@suse.de> | 2017-09-13 08:13:03 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-09-13 08:13:03 +0000 |
commit | 2da6996c61125da38e0e9e8182ca2a623e03de63 (patch) | |
tree | 85968996243f9eb29194674f04443ee99447c9c1 /gcc/gimple-fold.c | |
parent | 5a41741f0c311c5d4bca85292116f67ec7a2a60f (diff) | |
download | gcc-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.c | 22 |
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; } } |