https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91753
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2020-01-20
Component|middle-end |target
Ever confirmed|0 |1
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The biggest problem is set_qreg* is being used here.
This is the RTX that is produced:
(insn 38 37 39 4 (set (reg/v:XI 125 [ __o ])
(reg/v:XI 124 [ __o ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25556:9
3404 {*aarch64_movxi}
(expr_list:REG_DEAD (reg/v:XI 124 [ __o ])
(nil)))
(insn 39 38 40 4 (set (subreg:V16QI (reg/v:XI 125 [ __o ]) 0)
(reg:V16QI 134 [ _122 ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25556:9
1198 {*aarch64_simd_movv16qi}
(nil))
(insn 40 39 41 4 (set (reg/v:XI 126 [ __o ])
(reg/v:XI 125 [ __o ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25557:9
3404 {*aarch64_movxi}
(expr_list:REG_DEAD (reg/v:XI 125 [ __o ])
(nil)))
(insn 41 40 42 4 (set (subreg:V16QI (reg/v:XI 126 [ __o ]) 16)
(reg:V16QI 96 [ _6 ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25557:9
1198 {*aarch64_simd_movv16qi}
(nil))
(insn 42 41 43 4 (set (reg/v:XI 127 [ __o ])
(reg/v:XI 126 [ __o ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25558:9
3404 {*aarch64_movxi}
(expr_list:REG_DEAD (reg/v:XI 126 [ __o ])
(nil)))
(insn 43 42 44 4 (set (subreg:V16QI (reg/v:XI 127 [ __o ]) 32)
(reg:V16QI 135 [ _123 ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25558:9
1198 {*aarch64_simd_movv16qi}
(nil))
(insn 44 43 45 4 (set (reg/v:XI 128 [ __o ])
(reg/v:XI 127 [ __o ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25559:9
3404 {*aarch64_movxi}
(expr_list:REG_DEAD (reg/v:XI 127 [ __o ])
(nil)))
(insn 45 44 47 4 (set (subreg:V16QI (reg/v:XI 128 [ __o ]) 48)
(reg:V16QI 95 [ _5 ]))
"/bajas/pinskia/src/toolchain-10/marvell-tools/lib/gcc/aarch64-marvell-linux-gnu/10.0.0/include/arm_neon.h":25559:9
1198 {*aarch64_simd_movv16qi}
(nil))
Notice the move instruction inbetween. That confuses everything here.
If we had a way to generate XImode directly from 4 V16QI, and only generate one
move statement, then the register allocator would act better.