https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116398
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|[15 Regression] |[15 Regression]
|gcc.target/aarch64/ashltidi |gcc.target/aarch64/ashltidi
|si.c fails |si.c fails since r15-268
CC| |jakub at gcc dot gnu.org
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This changed with r15-268-g9dbff9c05520a74e6cd337578f27b56c941f64f3
Trying 6 -> 12:
6: r105:DI=sign_extend(r113:SI)
REG_DEAD r113:SI
12: r110:DI=r105:DI>>0xb
Failed to match this instruction:
(parallel [
(set (reg:DI 110 [ _3+8 ])
(sign_extract:DI (subreg:DI (reg:SI 113) 0)
(const_int 21 [0x15])
(const_int 11 [0xb])))
(set (reg:DI 105 [ data ])
(sign_extend:DI (reg:SI 113)))
])
Failed to match this instruction:
(parallel [
(set (reg:DI 110 [ _3+8 ])
(sign_extract:DI (subreg:DI (reg:SI 113) 0)
(const_int 21 [0x15])
(const_int 11 [0xb])))
(set (reg:DI 105 [ data ])
(sign_extend:DI (reg:SI 113)))
])
Successfully matched this instruction:
(set (reg:DI 105 [ data ])
(sign_extend:DI (reg:SI 113)))
Successfully matched this instruction:
(set (reg:DI 110 [ _3+8 ])
(sign_extract:DI (subreg:DI (reg:SI 113) 0)
(const_int 21 [0x15])
(const_int 11 [0xb])))
allowing combination of insns 6 and 12
original costs 4 + 4 = 8
replacement costs 4 + 4 = 8
-modifying insn i2 6: r105:DI=sign_extend(r113:SI)
-deferring rescan insn with uid = 6.
-modifying insn i3 12: r110:DI=sign_extract(r113:SI#0,0x15,0xb)
- REG_DEAD r113:SI
-deferring rescan insn with uid = 12.
+i2 didn't change, not doing this
between the 2 versions.
r105 (i.e. the sign extend result) is used not just in the >> 11 shift, but
also in the
<< 53 shift. And if we "combine" aka simplify the right shift of sign_extend
into the same
sign_extend and sign_extract of the sign_extend argument, the sign_extend
becomes single use
and it can be combined into the left shift; and given that << 53 shifts more
than 31 bits,
all the upper bits from sign_extend are irrelevant.
So, either this should be done in some other pass as well, or perhaps there
could be
define_insn_and_split with the sign_extract and sign_extend which splits
immediately after
combine?