Ping
> -----Original Message----- > From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches- > ow...@gcc.gnu.org] On Behalf Of Tamar Christina > Sent: Monday, March 5, 2018 16:52 > To: gcc-patches@gcc.gnu.org > Cc: nd <n...@arm.com>; Ramana Radhakrishnan > <ramana.radhakrish...@arm.com>; Richard Earnshaw > <richard.earns...@arm.com>; ni...@redhat.com; Kyrylo Tkachov > <kyrylo.tkac...@arm.com> > Subject: [PATCH][GCC][ARM] Fix can_change_mode_class for big-endian > > Hi All, > > Taking the subreg of a vector mode on big-endian may result in an infinite > recursion and eventually a segfault once we run out of stack space. > > As an example, taking a subreg of V4HF to SImode we end up in the following > loop on big-endian: > > #861 0x00000000008462e9 in operand_subword_force src/gcc/gcc/emit- > rtl.c:1787 > #862 0x0000000000882a90 in emit_move_multi_word > src/gcc/gcc/expr.c:3621 > #863 0x000000000087eea1 in emit_move_insn_1 src/gcc/gcc/expr.c:3698 > #864 0x000000000087f350 in emit_move_insn src/gcc/gcc/expr.c:3757 > #865 0x000000000085e326 in copy_to_reg src/gcc/gcc/explow.c:603 > #866 0x00000000008462e9 in operand_subword_force src/gcc/gcc/emit- > rtl.c:1787 > > The reason is that operand_subword_force will always fail. When the value is > in a register that can't be accessed as a multi word the code tries to create > a > new psuedo register and emit the value to it. Eventually you end up in > simplify_gen_subreg which calls validate_subreg. > > validate_subreg will however always fail because of the > REG_CAN_CHANGE_MODE_P check. > > On little endian this check always returns true. On big-endian this check is > supposed to prevent values that have a size larger than word size, due to > those being stored in VFP registers. > > However we are only interested in a subreg of the vector mode, so we > should be checking the unit size, not the size of the entire mode. Doing this > fixes the problem. > > Regtested on armeb-none-eabi and no regressions. > Bootstrapped on arm-none-linux-gnueabihf and no issues. > > Ok for trunk? and for backport to GCC 7? > > Thanks, > Tamar > > gcc/ > 2018-03-05 Tamar Christina <tamar.christ...@arm.com> > > PR target/84711 > * config/arm/arm.c (arm_can_change_mode_class): Use > GET_MODE_UNIT_SIZE > instead of GET_MODE_SIZE when comparing Units. > > gcc/testsuite/ > 2018-03-05 Tamar Christina <tamar.christ...@arm.com> > > PR target/84711 > * gcc.target/arm/big-endian-subreg.c: New. > > --