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

--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> ---
I've just tried the following example on the AMS branch:

float fun (float* x)
{
  return x[0] + x[1] + x[2] + x[3];
}

no AMS:
        mov     r4,r1
        add     #4,r1
        fmov.s  @r4,fr0
        fmov.s  @r1,fr1
        mov     r4,r1
        add     #8,r1
        fadd    fr1,fr0
        fmov.s  @r1,fr1
        add     #12,r4
        fadd    fr1,fr0
        fmov.s  @r4,fr1
        rts     
        fadd    fr1,fr0

AMS:
        fmov.s  @r4+,fr0
        fmov.s  @r4+,fr1
        fadd    fr1,fr0     << load dependency stall
        fmov.s  @r4+,fr1
        fadd    fr1,fr0     << load dependency stall
        fmov.s  @r4,fr1
        rts     
        fadd    fr1,fr0

AMS + sched1:
        fmov.s  @r4+,fr0
        fmov.s  @r4+,fr1
        fmov.s  @r4+,fr2
        fadd    fr1,fr0    << no stall
        fmov.s  @r4,fr1
        fadd    fr2,fr0    << no stall
        rts     
        fadd    fr1,fr0

The sched1 code seems better and it might make sense to enable sched1 after
AMS.

In sh.c there is ...

      else if (flag_exceptions)
        {
          if (flag_schedule_insns && global_options_set.x_flag_schedule_insns)
            warning (0, "ignoring -fschedule-insns because of exception "
                        "handling bug");
          flag_schedule_insns = 0;
        }

... which makes it impossible to enable sched1 for C++ code unless exceptions
are disabled.  Kaz, do you know whether this is still an issue?

Reply via email to