blob: f5c5eeccbb8d1888633d01460402eb17213df945 [file] [log] [blame]
/* 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;
}