http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50749

--- Comment #8 from Oleg Endo <oleg.e...@t-online.de> 2011-11-28 22:31:44 UTC 
---
(In reply to comment #7)
> The problem is that SH target can't do those simple array accesses
> well at QI/HImode because of the lack of displacement addressing
> for those modes.

In these particular cases, this is true.  Even if there was a working QI/HImode
displacement addressing, it would most likely result in worse code compared to
post-inc / pre-dec addressing opportunities, because of register pressure on
R0.  Apart from that there is no displacement addressing for FPU loads/stores,
which also misses some opportunities:

float test_func_5 (float* p, int c)
{
  float r = 0;
  do
  {
    r += *p++;
    r += *p++;
    r += *p++;
  } while (--c);
  return r;
}

Compiled with -Os -m4-single:

    fldi0    fr0
.L11:
    mov    r4,r1
    fmov.s    @r1+,fr1
    dt    r5
    fadd    fr1,fr0
    fmov.s    @r1,fr1
    mov    r4,r1
    add    #8,r1
    add    #12,r4
    fadd    fr1,fr0
    fmov.s    @r1,fr1
    bf/s    .L11
    fadd    fr1,fr0
    rts    
    nop


..could be:
    fldi0    fr0
.L11:
    fmov.s    @r4+,fr1
    dt    r5
    fadd    fr1,fr0
    fmov.s    @r4+,fr1
    fadd    fr1,fr0
    fmov.s    @r4+,fr1
    bf/s    .L11
    fadd    fr1,fr0
    rts    
    nop


Specifying -fno-tree-forwprop doesn't seem to have any effect on these cases.

Reply via email to