On 07/27/2011 10:00 AM, Georg-Johann Lay wrote:
> Richard Henderson wrote:
>>> +;; "*ashluqihiqi3.mem"
>>> +;; "*ashlsqihiqi3.mem"
>>> +(define_insn_and_split "*ashl<extend_prefix>qihiqi3.mem"
>>> +  [(set (match_operand:QI 0 "memory_operand" "=m")
>>> +        (subreg:QI (ashift:HI (any_extend:HI (match_operand:QI 1 
>>> "register_operand" "r"))
>>> +                              (match_operand:QI 2 "register_operand" "r"))
>>> +                   0))]
>>> +  "!reload_completed"
>>> +  { gcc_unreachable(); }
>>
>> Surely this isn't necessary.  Why would you ever be matching a memory output?
>>
>>> +(define_insn_and_split "*ashlhiqi3"
>>> +  [(set (match_operand:QI 0 "nonimmediate_operand" "=r")
>>> +        (subreg:QI (ashift:HI (match_operand:HI 1 "register_operand" "0")
>>> +                              (match_operand:QI 2 "register_operand" "r")) 
>>> 0))]
>>> +  "!reload_completed"
>>> +  { gcc_unreachable(); }
>>
>> Likewise.
>>
>> But the first pattern and the peep2 look good.
>>
> 
> It's that what combine comes up with, and combine is not smart enough
> to find a split point between the mem and the subreg.  I don't know
> enough of combine, maybe it's because can_create_pseudo_p is false
> during combine, combine has no spare reg.  A combine-split won't
> help as it needs a pseudo/spare reg.

Hmm.  Perhaps.  Have you a test case for this?



r~

Reply via email to