https://gcc.gnu.org/g:fba8ef7b727a9d3769accf7eb226af4577b738cb
commit r17-5666-gfba8ef7b727a9d3769accf7eb226af4577b738cb Author: Richard Biener <[email protected]> Date: Wed Oct 28 10:27:42 2026 +0100 tree-optimization/128236 - avoid moving abnormal defs in rewriting complex loads The following avoids abnormals when we attempt to rewrite a complex load to component loads in forwprop because we are moving the def. PR tree-optimization/128236 * tree-ssa-forwprop.cc (pass_forwprop::execute): Avoid moving abnormal defs when rewriting complex loads. * gcc.dg/torture/pr128236.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/torture/pr128236.c | 16 ++++++++++++++++ gcc/tree-ssa-forwprop.cc | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr128236.c b/gcc/testsuite/gcc.dg/torture/pr128236.c new file mode 100644 index 000000000000..7e69f09df6e2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr128236.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target indirect_jumps } */ + +#include <setjmp.h> + +jmp_buf jb; +void use (double); +void g (_Complex double *p) +{ + double r = 0; + _Complex double c = *p; + setjmp (jb); + use (r); + r = __real__ c; + use (r); +} diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc index 88f69e12ed19..b526c85ef34d 100644 --- a/gcc/tree-ssa-forwprop.cc +++ b/gcc/tree-ssa-forwprop.cc @@ -6898,7 +6898,10 @@ pass_forwprop::execute (function *fun) if (!is_gimple_assign (use_stmt) || (gimple_assign_rhs_code (use_stmt) != REALPART_EXPR && gimple_assign_rhs_code (use_stmt) != IMAGPART_EXPR) - || TREE_OPERAND (gimple_assign_rhs1 (use_stmt), 0) != lhs) + || TREE_OPERAND (gimple_assign_rhs1 (use_stmt), 0) != lhs + /* We are moving the def, so avoid abnormals. */ + || SSA_NAME_OCCURS_IN_ABNORMAL_PHI + (gimple_assign_lhs (use_stmt))) { rewrite = false; break;
