| /* 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 (); |
| } |