On Fri, Jun 27, 2014 at 4:13 AM, Jeff Law <l...@redhat.com> wrote:
> On 06/26/14 02:44, Bin.Cheng wrote:
>>
>> Hi,
>> I ran into PR60947, in which GCC understands the return value of
>> memset is the first argument passed in, according to standard, then
>> does optimization like below:
>>      mov    ip, sp
>>      stmfd    sp!, {r4, r5, r6, r7, r8, r9, r10, fp, ip, lr, pc}
>>      sub    fp, ip, #4
>>      sub    sp, sp, #20
>>      ldr    r8, [r0, #112]
>>      add    r3, r8, #232
>>      add    r4, r8, #328
>> .L1064:
>>      mov    r0, r3
>>      mov    r1, #255
>>      mov    r2, #8
>>      bl    memset
>>      add    r3, r0, #32   <----X
>>      cmp    r3, r4
>>      bne    .L1064
>>
>> For X insn, GCC takes advantage of standard by using the returned r0
>> directly.
>>
>> My question is, is it always safe for GCC to do such optimization?  Do
>> we have an option to disable such standard dependent optimization?
>
> Others have already answered this question.
>
> FWIW, I just locally added the capability to track equivalences between the
> destination argument to the various mem* str* functions and their return
> value in DOM.  It triggers, but not terribly often.  I'll be looking to see
> if the additional equivalences actually enable any optimizations before
> going through the full bootstrap and test.
>
> It doesn't help your testcase though since optimizer weakness you're showing
> is much later in the optimization pipeline.  I wonder if you could model
> this as an implicit copy in IRA and try to encourage IRA to tie the hard reg
> output from memset to the pseudo.
Thanks for pointing me the direction.  I shall have a look at it.

Thanks,
bin
>
>
> jeff
>
>

Reply via email to