1/* PR tree-optimization/51581 */ 2/* { dg-require-effective-target int32plus } */ 3 4extern void abort (void); 5 6#define N 4096 7int a[N], c[N]; 8unsigned int b[N], d[N]; 9 10__attribute__((noinline, noclone)) void 11f1 (void) 12{ 13 int i; 14 for (i = 0; i < N; i++) 15 c[i] = a[i] % 3; 16} 17 18__attribute__((noinline, noclone)) void 19f2 (void) 20{ 21 int i; 22 for (i = 0; i < N; i++) 23 d[i] = b[i] % 3; 24} 25 26__attribute__((noinline, noclone)) void 27f3 (void) 28{ 29 int i; 30 for (i = 0; i < N; i++) 31 c[i] = a[i] % 18; 32} 33 34__attribute__((noinline, noclone)) void 35f4 (void) 36{ 37 int i; 38 for (i = 0; i < N; i++) 39 d[i] = b[i] % 18; 40} 41 42__attribute__((noinline, noclone)) void 43f5 (void) 44{ 45 int i; 46 for (i = 0; i < N; i++) 47 c[i] = a[i] % 19; 48} 49 50__attribute__((noinline, noclone)) void 51f6 (void) 52{ 53 int i; 54 for (i = 0; i < N; i++) 55 d[i] = b[i] % 19; 56} 57 58#if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8 59__attribute__((noinline, noclone)) void 60f7 (void) 61{ 62 int i; 63 for (i = 0; i < N; i++) 64 { 65 int x = (int) ((unsigned long long) (a[i] * 0x55555556LL) >> 32) - (a[i] >> 31); 66 c[i] = a[i] - x * 3; 67 } 68} 69 70__attribute__((noinline, noclone)) void 71f8 (void) 72{ 73 int i; 74 for (i = 0; i < N; i++) 75 { 76 unsigned int x = ((unsigned int) ((b[i] * 0xaaaaaaabULL) >> 32) >> 1); 77 d[i] = b[i] - x * 3; 78 } 79} 80 81__attribute__((noinline, noclone)) void 82f9 (void) 83{ 84 int i; 85 for (i = 0; i < N; i++) 86 { 87 int x = (((int) ((unsigned long long) (a[i] * 0x38e38e39LL) >> 32)) >> 2) - (a[i] >> 31); 88 c[i] = a[i] - x * 18; 89 } 90} 91 92__attribute__((noinline, noclone)) void 93f10 (void) 94{ 95 int i; 96 for (i = 0; i < N; i++) 97 { 98 unsigned int x = (unsigned int) ((b[i] * 0x38e38e39ULL) >> 32) >> 2; 99 d[i] = b[i] - x * 18; 100 } 101} 102 103__attribute__((noinline, noclone)) void 104f11 (void) 105{ 106 int i; 107 for (i = 0; i < N; i++) 108 { 109 int x = (((int) ((unsigned long long) (a[i] * 0x6bca1af3LL) >> 32)) >> 3) - (a[i] >> 31); 110 c[i] = a[i] - x * 19; 111 } 112} 113 114__attribute__((noinline, noclone)) void 115f12 (void) 116{ 117 int i; 118 for (i = 0; i < N; i++) 119 { 120 unsigned int tmp = (b[i] * 0xaf286bcbULL) >> 32; 121 unsigned int x = (((b[i] - tmp) >> 1) + tmp) >> 4; 122 d[i] = b[i] - x * 19; 123 } 124} 125#endif 126 127int 128main () 129{ 130 int i; 131 for (i = 0; i < N; i++) 132 { 133 asm (""); 134 a[i] = i - N / 2; 135 b[i] = i; 136 } 137 a[0] = -__INT_MAX__ - 1; 138 a[1] = -__INT_MAX__; 139 a[N - 1] = __INT_MAX__; 140 b[N - 1] = ~0; 141 f1 (); 142 f2 (); 143 for (i = 0; i < N; i++) 144 if (c[i] != a[i] % 3 || d[i] != b[i] % 3) 145 abort (); 146 f3 (); 147 f4 (); 148 for (i = 0; i < N; i++) 149 if (c[i] != a[i] % 18 || d[i] != b[i] % 18) 150 abort (); 151 f5 (); 152 f6 (); 153 for (i = 0; i < N; i++) 154 if (c[i] != a[i] % 19 || d[i] != b[i] % 19) 155 abort (); 156#if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8 157 f7 (); 158 f8 (); 159 for (i = 0; i < N; i++) 160 if (c[i] != a[i] % 3 || d[i] != b[i] % 3) 161 abort (); 162 f9 (); 163 f10 (); 164 for (i = 0; i < N; i++) 165 if (c[i] != a[i] % 18 || d[i] != b[i] % 18) 166 abort (); 167 f11 (); 168 f12 (); 169 for (i = 0; i < N; i++) 170 if (c[i] != a[i] % 19 || d[i] != b[i] % 19) 171 abort (); 172#endif 173 return 0; 174} 175