blob: d51574e9511775777e4722980c6e15ca95f7a407 [file] [log] [blame]
/* PR tree-optimization/117997 */
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-fpie" { target pie } } */
__attribute__((noipa)) unsigned char
foo (const unsigned char *data, unsigned int len)
{
__builtin_abort ();
}
__attribute__((noipa)) unsigned short
bar (const unsigned char *data, unsigned int len)
{
__builtin_abort ();
}
static unsigned char
baz (unsigned char byte, unsigned char crc)
{
unsigned int i;
crc ^= byte;
for (i = 0; i < 8; i++)
crc = (crc << 1) ^ ((crc >> 7) ? 0x07 : 0);
return crc;
}
static unsigned short
qux (unsigned char byte, unsigned short crc)
{
unsigned int i;
crc ^= byte << 8;
for (i = 0; i < 8; i++)
crc = (crc << 1) ^ ((crc >> 15) ? 0x8005 : 0);
return crc;
}
__attribute__((noipa)) int
corge (const unsigned char *data)
{
const unsigned char expected[] = {
0x00, 0x07, 0x1b, 0x48, 0xe3, 0xbc, 0x2f, 0xd8,
0x3e, 0x85, 0xa4, 0x44, 0xff, 0xd0, 0x14, 0x41,
0xb0, 0x6e, 0x73, 0x27, 0x99, 0xad, 0x28, 0xbd,
0x72, 0x16, 0x24, 0xbd, 0x6e, 0x5e, 0xc7, 0x06
};
for (int i = 0; i < 32; ++i)
if (data[i] != expected[i])
__builtin_abort ();
return 1;
}
static int
garply (const unsigned char *data, unsigned long size)
{
unsigned int i;
unsigned char crc0, crc1;
crc0 = 0;
crc1 = foo (data, 0);
if (crc1 != crc0)
return 0;
for (i = 0; i < size; i++)
{
crc0 = baz (data[i], crc0);
crc1 = foo (data, i + 1);
if (crc1 != crc0)
return 0;
}
return 1;
}
static int
freddy (const unsigned char *data, unsigned long size)
{
unsigned int i;
unsigned short crc0, crc1;
crc0 = 0;
crc1 = bar (data, 0);
if (crc1 != crc0)
return 0;
for (i = 0; i < size; i++)
{
crc0 = qux (data[i], crc0);
crc1 = bar (data, i + 1);
if (crc1 != crc0)
return 0;
}
return 1;
}
__attribute__((noipa)) int
blah (void)
{
unsigned int i;
unsigned char data[64] = { 0 };
for (i = 1; i < 64; i++)
data[i] = baz (i % 256, data[i - 1]);
if (corge (data))
return 0;
if (!garply (data, 64))
return 1;
if (!freddy (data, 64))
return 1;
return 1;
}
int
main ()
{
if (__CHAR_BIT__ == 8 && __SIZEOF_SHORT__ == 2 && blah ())
__builtin_abort ();
}