modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/postmod-1.c (about) 1 #define DECLARE_ARRAY(A) array##A[0x10] 2 #define DECLARE_COUNTER(A) counter##A = 0 3 #define DECLARE_POINTER(A) *pointer##A = array##A + x 4 /* Create a loop that allows post-modification of pointerA, followed by 5 a use of the post-modified address. */ 6 #define BEFORE(A) counter##A += *pointer##A, pointer##A += 3 7 #define AFTER(A) counter##A += pointer##A[x] 8 9 /* Set up the arrays so that one iteration of the loop sets the counter 10 to 3.0f. */ 11 #define INIT_ARRAY(A) array##A[1] = 1.0f, array##A[5] = 2.0f 12 13 /* Check that the loop worked correctly for all values. */ 14 #define CHECK_ARRAY(A) exit_code |= (counter##A != 3.0f) 15 16 /* Having 6 copies triggered the bug for ARM and Thumb. */ 17 #define MANY(A) A (0), A (1), A (2), A (3), A (4), A (5) 18 19 /* Each addendA should be allocated a register. */ 20 #define INIT_VOLATILE(A) addend##A = vol 21 #define ADD_VOLATILE(A) vol += addend##A 22 23 /* Having 5 copies triggered the bug for ARM and Thumb. */ 24 #define MANY2(A) A (0), A (1), A (2), A (3), A (4) 25 26 float MANY (DECLARE_ARRAY); 27 float MANY (DECLARE_COUNTER); 28 29 volatile int stop = 1; 30 volatile int vol; 31 32 void __attribute__((noinline)) 33 foo (int x) 34 { 35 float MANY (DECLARE_POINTER); 36 int i; 37 38 do 39 { 40 MANY (BEFORE); 41 MANY (AFTER); 42 /* Create an inner loop that should ensure the code above 43 has registers free for reload inheritance. */ 44 { 45 int MANY2 (INIT_VOLATILE); 46 for (i = 0; i < 10; i++) 47 MANY2 (ADD_VOLATILE); 48 } 49 } 50 while (!stop); 51 } 52 53 int 54 main (void) 55 { 56 int exit_code = 0; 57 58 MANY (INIT_ARRAY); 59 foo (1); 60 MANY (CHECK_ARRAY); 61 return exit_code; 62 }