The following fixes an omission in find_or_generate_expression to
check for SSA_NAME_OCCURS_IN_ABNORMAL_PHI as already done in
create_expression_by_pieces.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/123602
* tree-ssa-pre.cc (find_or_generate_expression): Do not
generate references to abnormal SSA names.
* g++.dg/torture/pr123603.C: New testcase.
---
gcc/testsuite/g++.dg/torture/pr123603.C | 20 ++++++++++++++++++++
gcc/tree-ssa-pre.cc | 7 ++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/torture/pr123603.C
diff --git a/gcc/testsuite/g++.dg/torture/pr123603.C
b/gcc/testsuite/g++.dg/torture/pr123603.C
new file mode 100644
index 00000000000..f971a82177c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr123603.C
@@ -0,0 +1,20 @@
+// { dg-do compile }
+
+void _setjmp();
+void a() __attribute__((__noreturn__));
+struct b {
+ b(int c) {
+ if (c)
+ a();
+ }
+ ~b();
+};
+int d;
+void l(long);
+void e() {
+ b a(d);
+ for (int f = 0; f < 10 ; ++f) {
+ l(f - 1);
+ _setjmp();
+ }
+}
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index 9853be167d4..6a5f1287fac 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -2768,7 +2768,12 @@ find_or_generate_expression (basic_block block, tree op,
gimple_seq *stmts)
if (leader)
{
if (leader->kind == NAME)
- return PRE_EXPR_NAME (leader);
+ {
+ tree name = PRE_EXPR_NAME (leader);
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
+ return NULL_TREE;
+ return name;
+ }
else if (leader->kind == CONSTANT)
return PRE_EXPR_CONSTANT (leader);
--
2.51.0