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.

Reply via email to