/* PR rtl-optimization/51933 */ static signed char v1; static unsigned char v2[256], v3[256]; __attribute__((noclone, noinline)) void foo (void) { #if defined(__s390__) && !defined(__zarch__) /* S/390 31 bit cannot deal with more than one literal pool reference per insn. */ asm volatile ("" : : "g" (&v1) : "memory"); asm volatile ("" : : "g" (&v2[0])); asm volatile ("" : : "g" (&v3[0])); #else asm volatile ("" : : "g" (&v1), "g" (&v2[0]), "g" (&v3[0]) : "memory"); #endif } __attribute__((noclone, noinline)) int bar (const int x, const unsigned short *y, char *z) { int i; unsigned short u; if (!v1) foo (); for (i = 0; i < x; i++) { u = y[i]; z[i] = u < 0x0100 ? v2[u] : v3[u & 0xff]; } z[x] = '\0'; return x; } int main (void) { char buf[18]; unsigned short s[18]; unsigned char c[18] = "abcdefghijklmnopq"; int i; for (i = 0; i < 256; i++) { v2[i] = i; v3[i] = i + 1; } for (i = 0; i < 18; i++) s[i] = c[i]; s[5] |= 0x600; s[6] |= 0x500; s[11] |= 0x2000; s[15] |= 0x500; foo (); if (bar (17, s, buf) != 17 || __builtin_memcmp (buf, "abcdeghhijkmmnoqq", 18) != 0) __builtin_abort (); return 0; }