https://gcc.gnu.org/g:34e1e5e33ec3eb475c0c8278800b6fc246a86763
commit r16-1613-g34e1e5e33ec3eb475c0c8278800b6fc246a86763 Author: Jeff Law <j...@ventanamicro.com> Date: Sun Jun 22 12:06:08 2025 -0600 [committed][PR rtl-optimization/120550] Drop REG_EQUAL note after ext-dce transformation This bug was found by Edwin's fuzzing efforts on RISC-V, though it likely affects other targets. In simplest terms when ext-dce converts an extension into a (possibly simplified) subreg copy it may make an attached REG_EQUAL note invalid. In the case Edwin found the note was an extension, but I don't think that would necessarily always be the case. The note could have other forms which potentially need invalidation. So the safest thing to do is just remove any attached REG_EQUAL or REG_EQUIV note. Note adjusting Edwin's testcase in the obvious way to avoid having to interpret printf output for pass/fail status makes the bug go latent. That's why no testcase is included with this patch. Bootstrapped and regression tested on x86_64. Obviously also verified it fixes the testcase Edwin filed. This is a good candidate for cherry-picking to the gcc-15 release branch after simmering on the trunk a bit. PR rtl-optimization/120550 gcc/ * ext-dce.cc (ext_dce_try_optimize_insn): Drop REG_EQUAL/REG_EQUIV notes on modified insns. Diff: --- gcc/ext-dce.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc index aa80c0483d61..b1d5ee4b36c4 100644 --- a/gcc/ext-dce.cc +++ b/gcc/ext-dce.cc @@ -442,6 +442,11 @@ ext_dce_try_optimize_insn (rtx_insn *insn, rtx set) print_rtl_single (dump_file, new_pattern); fprintf (dump_file, "\n"); } + + /* INSN may have a REG_EQUAL note indicating that the value was + sign or zero extended. That note is no longer valid since we've + just removed the extension. Just wipe the notes. */ + remove_reg_equal_equiv_notes (insn, true); } else {