https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93997

--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
Before my patch, the compiler generated this IR:

#(insn 42 291 43 2 (set (strict_low_part (mem/c:HI (plus:SI (reg/f:SI 6 bp)
#                    (const_int -40 [0xffffffffffffffd8])) [5 %sfp+-16 S2
A128]))
#        (reg:HI 1 dx [orig:91 _14 ] [91])) "vector-scalar.c":9:17 83
{*movstricthi_1}
#     (nil))
        movw    %dx, -40(%ebp)  # 42    [c=4 l=4]  *movstricthi_1/0

This is strict_low_part of a memory operand, which isn't valid according to
docs:

'(strict_low_part (subreg:M (reg:N R) 0))'
     This expression code is used in only one context: as the
     destination operand of a 'set' expression.  In addition, the
     operand of this expression must be a non-paradoxical 'subreg'
     expression.

     The presence of 'strict_low_part' says that the part of the
     register which is meaningful in mode N, but is not part of mode M,
     is not to be altered.  Normally, an assignment to such a subreg is
     allowed to have undefined effects on the rest of the register when
     M is smaller than 'REGMODE_NATURAL_SIZE (N)'.

After the patch, we have:

(insn 42 41 43 2 (set (strict_low_part (subreg:HI (reg:TI 135) 0))
        (reg:HI 91 [ _14 ])) "vector-scalar.c":9:17 83 {*movstricthi_1}
     (nil))

but TImode is not valid for general regs.

Probably we have to reject TImode in case of 32bit targets from the expander.

Reply via email to