68 lines
1.0 KiB
C
68 lines
1.0 KiB
C
/* PR target/65956 */
|
|
|
|
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;
|
|
}
|