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.
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.
--- /dev/null
+// { 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();
+ }
+}
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);