https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122808
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|Missing CSE in array |Missing rtl PRE/GCSE in
|element addressing |array element addressing
Last reconfirmed| |2025-11-22
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Confirmed.
This looks like a GCSE failure on x86_64 at least.
We start out with:
```
(insn 8 4 10 2 (set (reg:DI 103 [ index ])
(sign_extend:DI (reg/v:SI 100 [ index ]))) "/app/example.c":11:25 188
{*extendsidi2_rex64}
(nil))
(insn 10 8 11 2 (parallel [
(set (reg:DI 106)
(ashift:DI (reg:DI 103 [ index ])
(const_int 1 [0x1])))
(clobber (reg:CC 17 flags))
]) "/app/example.c":11:25 1123 {*ashldi3_1}
(expr_list:REG_DEAD (reg:DI 105 [ index ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil))))
...
(insn 33 31 35 4 (set (reg:DI 119 [ index ])
(sign_extend:DI (reg/v:SI 100 [ index ]))) "/app/example.c":13:24 188
{*extendsidi2_rex64}
(expr_list:REG_DEAD (reg/v:SI 100 [ index ])
(nil)))
(insn 35 33 36 4 (parallel [
(set (reg:DI 122)
(ashift:DI (reg:DI 119 [ index ])
(const_int 1 [0x1])))
(clobber (reg:CC 17 flags))
]) "/app/example.c":13:24 1123 {*ashldi3_1}
(expr_list:REG_DEAD (reg:DI 121 [ index ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil))))
```
We replace insns 8 and 33 with a mov and insert:
```
(insn 8 4 48 2 (set (reg:DI 127 [ index ])
(sign_extend:DI (reg/v:SI 100 [ index ]))) "<source>":11:25 188
{*extendsidi2_rex64}
(nil))
```
But insn 35 and 10 are also redundant with each other.