aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-fold.c22
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/pr82128.C20
4 files changed, 42 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 26a7b75..e73946b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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.
+
+2017-09-13 Richard Biener <rguenther@suse.de>
+
* tree-cfg.c (verify_gimple_assign_binary): Add verification
for WIDEN_SUM_EXPR, VEC_WIDEN_MULT_{HI,LO,EVEN,ODD}_EXPR,
VEC_PACK_{TRUNC,SAT,FIX_TRUNC}_EXPR.
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;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ed0a858..c0b0e9a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2017-09-13 Kugan Vivekanandarajah <kuganv@linaro.org>
* gcc.target/aarch64/pr63304_1.c: Remove-mno-fix-cortex-a53-843419.
diff --git a/gcc/testsuite/g++.dg/pr82128.C b/gcc/testsuite/g++.dg/pr82128.C
new file mode 100644
index 0000000..98bb27a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr82128.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-options "-O3 -fno-tree-forwprop" }
+
+class A {
+ virtual unsigned long m_fn1() const;
+ virtual int &m_fn2(unsigned long) const;
+};
+class C : A {
+public:
+ int &m_fn2(unsigned long) const;
+ unsigned long m_fn1() const;
+};
+class B {
+ void m_fn3(const A &, const int &, const C &, int &) const;
+};
+void B::m_fn3(const A &, const int &, const C &, int &) const {
+ C &a(a);
+ for (long b = 0; a.m_fn1(); b++)
+ a.m_fn2(0);
+}