aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2025-04-21 16:33:04 -0700
committerAndrew Pinski <quic_apinski@quicinc.com>2025-05-14 07:52:01 -0700
commit398c6ddf1e81ba0cfd14a600ff8ceb4611fc8cf6 (patch)
tree832ac888f2fb2c573fe365df6d02731c3d3dbbce /gcc
parent6d2342f5e855358bc8e9a1320b2fddc97d4b4bac (diff)
downloadgcc-398c6ddf1e81ba0cfd14a600ff8ceb4611fc8cf6.zip
gcc-398c6ddf1e81ba0cfd14a600ff8ceb4611fc8cf6.tar.gz
gcc-398c6ddf1e81ba0cfd14a600ff8ceb4611fc8cf6.tar.bz2
forwprop: Move around the marking bb for eh to after the local non-fold_stmt optimizations
When moving the optimize_memcpy_to_memset optimization to forwprop from fold_stmt, the marking of the bb to purge for eh cleanup was not happening for the local optimizations but only after the fold_stmt, this causes g++.dg/torture/except-2.C to fail. So this patch moves the marking of the bbs for cleanups after the local forwprop optimizations instead of before. There was already code to add to to_purge after forward_propagate_into_comparison and removes that as it is now redundant. gcc/ChangeLog: * tree-ssa-forwprop.cc (pass_forwprop::execute): Move marking of to_purge bb and marking of fixup statements to after the local optimizations. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-forwprop.cc24
1 files changed, 12 insertions, 12 deletions
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index bcdec1a..4ec5b6a 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -4497,6 +4497,8 @@ pass_forwprop::execute (function *fun)
}
}
}
+ if (substituted_p)
+ update_stmt (stmt);
if (substituted_p
&& is_gimple_assign (stmt)
&& gimple_assign_rhs_code (stmt) == ADDR_EXPR)
@@ -4536,17 +4538,7 @@ pass_forwprop::execute (function *fun)
&& !SSA_NAME_IS_DEFAULT_DEF (use))
bitmap_set_bit (simple_dce_worklist,
SSA_NAME_VERSION (use));
- }
-
- if (changed || substituted_p)
- {
- if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
- bitmap_set_bit (to_purge, bb->index);
- if (!was_noreturn
- && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
- to_fixup.safe_push (stmt);
update_stmt (stmt);
- substituted_p = false;
}
switch (gimple_code (stmt))
@@ -4560,8 +4552,6 @@ pass_forwprop::execute (function *fun)
{
int did_something;
did_something = forward_propagate_into_comparison (&gsi);
- if (maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (gsi)))
- bitmap_set_bit (to_purge, bb->index);
if (did_something == 2)
cfg_changed = true;
changed |= did_something != 0;
@@ -4613,6 +4603,16 @@ pass_forwprop::execute (function *fun)
default:;
}
+ if (changed || substituted_p)
+ {
+ substituted_p = false;
+ stmt = gsi_stmt (gsi);
+ if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
+ bitmap_set_bit (to_purge, bb->index);
+ if (!was_noreturn
+ && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
+ to_fixup.safe_push (stmt);
+ }
if (changed)
{
/* If the stmt changed then re-visit it and the statements