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.