public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/65956] New: [5/6 Regression] Another ARM overaligned arg passing issue
@ 2015-04-30 21:17 jakub at gcc dot gnu.org
  2015-04-30 21:17 ` [Bug target/65956] " jakub at gcc dot gnu.org
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2015-04-30 21:17 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 65956
           Summary: [5/6 Regression] Another ARM overaligned arg passing
                    issue
           Product: gcc
           Version: 5.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

The following testcase is miscompiled at -O2 on armhfp, starting with r221348,
and in this case r221795 didn't fix it.  Just hope it is the same thing that
breaks armhfp profiledbootstrap.  The difference on the testcase is just:
        mov     r0, r5
-       ldr     r1, [sp, #24]
+       ldr     r2, [sp, #24]
        bl      fn1
which means that we pass the second argument to fn1 in a wrong register,
supposedly because the type is void * aligned to long long alignment.

struct A { char *a; int b; long long c; };
char v[3];

__attribute__((noinline, noclone)) void
fn1 (char *x, char *y)
{
  if (x != &v[1] || y != &v[2])
    __builtin_abort ();
  v[1]++;
}

__attribute__((noinline, noclone)) int
fn2 (char *x)
{
  asm volatile ("" : "+g" (x) : : "memory");
  return x == &v[0];
}

__attribute__((noinline, noclone)) void
fn3 (const char *x)
{
  if (x[0] != 0)
    __builtin_abort ();
}

static struct A
foo (const char *x, struct A y, struct A z)
{
  struct A r = { 0, 0, 0 };
  if (y.b && z.b)
    {
      if (fn2 (y.a) && fn2 (z.a))
        switch (x[0])
          {
          case '|':
            break;
          default:
            fn3 (x);
          }
      fn1 (y.a, z.a);
    }
  return r;
}

__attribute__((noinline, noclone)) int
bar (int x, struct A *y)
{
  switch (x)
    {
    case 219:
      foo ("+", y[-2], y[0]);
    case 220:
      foo ("-", y[-2], y[0]);
    }
}

int
main ()
{
  struct A a[3] = { { &v[1], 1, 1LL }, { &v[0], 0, 0LL }, { &v[2], 2, 2LL } };
  bar (220, a + 2);
  if (v[1] != 1)
    __builtin_abort ();
  return 0;
}


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-07-06 17:38 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-30 21:17 [Bug target/65956] New: [5/6 Regression] Another ARM overaligned arg passing issue jakub at gcc dot gnu.org
2015-04-30 21:17 ` [Bug target/65956] " jakub at gcc dot gnu.org
2015-04-30 23:12 ` jakub at gcc dot gnu.org
2015-05-11  8:16 ` jakub at gcc dot gnu.org
2015-06-01 12:06 ` jakub at gcc dot gnu.org
2015-07-06 16:58 ` alalaw01 at gcc dot gnu.org
2015-07-06 17:06 ` alalaw01 at gcc dot gnu.org
2015-07-06 17:32 ` alalaw01 at gcc dot gnu.org
2015-07-06 17:38 ` alalaw01 at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).