I'm getting the following error.

claire:~/claire/gnu/b-sparc/gcc$ ./cc1 -da -O2 -quiet foo.c
foo.c: In function `foo':
foo.c:9: error: inconsistent operand constraints in an `asm'

The problem is store motion is "deleting" one of the asm volatile stores by
changing it to a store to a pseudo.  grep for "Removing redundant" in
foo.c.08.gcse.

I realize asm volatiles are optimized more these days than in the 2.x days.
I guess one can debate how far one wants to take things as far as making
asm volatile's optimizable, but this case doesn't feel like it should be
optimizable.

p.s. yes, the asm is wrong for sparc. I just picked something simple for
illustration.

void
foo (int t, int* mp)
{
    int x = 42;
    int* mp2 = mp;

    if (t == 2)
    {
        asm volatile ("store %1,%0" : "=m" (*(int*) mp) : "r" (x));
        asm volatile ("store %1,%0" : "=m" (*(int*) mp2) : "r" (x));
    }

    if (t == 3)
    {
        *mp = 43;
        *mp = 43;
    }
}

-- 
           Summary: store motion deletion of redundant stores doesn't
                    consider asm volatiles
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dje at transmeta dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: sparc-sun-solaris2


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

Reply via email to