mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-02 19:42:59 +00:00
70 lines
1.1 KiB
C
70 lines
1.1 KiB
C
/* PR target/11087
|
|
This testcase was miscompiled on ppc64, because basic_induction_var called
|
|
convert_modes, yet did not expect it to emit any new instructions.
|
|
Those were emitted at the end of the function and destroyed during life
|
|
analysis, while the program used uninitialized pseudos created by
|
|
convert_modes. */
|
|
|
|
struct A
|
|
{
|
|
unsigned short a1;
|
|
unsigned long a2;
|
|
};
|
|
|
|
struct B
|
|
{
|
|
int b1, b2, b3, b4, b5;
|
|
};
|
|
|
|
struct C
|
|
{
|
|
struct B c1[1];
|
|
int c2, c3;
|
|
};
|
|
|
|
static
|
|
int foo (int x)
|
|
{
|
|
return x < 0 ? -x : x;
|
|
}
|
|
|
|
int bar (struct C *x, struct A *y)
|
|
{
|
|
int a = x->c3;
|
|
const int b = y->a1 >> 9;
|
|
const unsigned long c = y->a2;
|
|
int d = a;
|
|
unsigned long e, f;
|
|
|
|
f = foo (c - x->c1[d].b4);
|
|
do
|
|
{
|
|
if (d <= 0)
|
|
d = x->c2;
|
|
d--;
|
|
|
|
e = foo (c-x->c1[d].b4);
|
|
if (e < f)
|
|
a = d;
|
|
}
|
|
while (d != x->c3);
|
|
x->c1[a].b4 = c + b;
|
|
return a;
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
struct A a;
|
|
struct C b;
|
|
int c;
|
|
|
|
a.a1 = 512;
|
|
a.a2 = 4242;
|
|
__builtin_memset (&b, 0, sizeof (b));
|
|
b.c1[0].b3 = 424242;
|
|
b.c2 = 1;
|
|
c = bar (&b, &a);
|
|
return 0;
|
|
}
|