From: David Miller <da...@davemloft.net>
Date: Fri, 04 Sep 2015 11:30:26 -0700 (PDT)

> From: Segher Boessenkool <seg...@kernel.crashing.org>
> Date: Fri, 4 Sep 2015 06:46:04 -0500
> 
>> On Thu, Sep 03, 2015 at 11:19:43PM -0700, David Miller wrote:
>>> The paradoxical subreg restriction in general_operand() is only
>>> enforced when reload_completed is true, which will not be the
>>> case while LRA is working.
>> 
>> This one?
>> 
>> #ifdef INSN_SCHEDULING
>>       /* On machines that have insn scheduling, we want all memory
>>       reference to be explicit, so outlaw paradoxical SUBREGs.
>>       However, we must allow them after reload so that they can
>>       get cleaned up by cleanup_subreg_operands.  */
>>       if (!reload_completed && MEM_P (sub)
>>        && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
>>      return 0;
>> #endif
>> 
>> I think you misread that.  Also doc/rtl.texi makes pretty clear that
>> you really shouldn't see subregs of mem.  So where does it come from?
> 
> I see what you are saying, I'll take a look into this.

It looks like it is created in LRA itself, initially LRA is looking
at:

(insn 1100 1099 1101 14 (set (reg:SI 3376)
        (ior:SI (subreg:SI (reg:QI 287) 0)
            (subreg:SI (reg:QI 289) 0))) x.c:104 234 {iorsi3}
     (expr_list:REG_DEAD (reg:QI 289)
        (expr_list:REG_DEAD (reg:QI 287)
            (nil))))

in curr_insn_transform(), and emits the move:

        (set (reg:SI 13423) (subreg:SI (reg:QI 287) 0))

Later the reg inside of this subreg appears to get transformed into
an on-stack MEM.

(insn 18631 1099 1100 14 (set (reg:SI 13423)
        (subreg:SI (mem/c:QI (plus:SI (reg/f:SI 101 %sfp)
                    (const_int -14269 [0xffffffffffffc843])) [0 %sfp+-14269 S1 
A8]) 0)) x.c:104 63 {*movsi_insn}
     (expr_list:REG_DEAD (reg:QI 287)
        (nil)))

I suppose perhaps I need to make the input_operand predicate more
strict on sparc.  So I'll look into that now.

Reply via email to