On Mon, Mar 14, 2011 at 11:25 AM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > A reload patch that I posted in January: > > http://gcc.gnu.org/ml/gcc-patches/2011-01/msg00548.html > > turned out to be related to PR 47166, so Bernd committed a combined fix: > > > http://gcc.gnu.org/ml/gcc-patches/2011-01/msg01620.htmlhttp://gcc.gnu.org/ml/gcc-patches/2011-01/msg01620.html > > Is it OK to commit the testcase from the first patch to 4.5 and 4.6?
Sure. Thanks, Richard. > Thanks, > Richard > > > gcc/testsuite/ > PR rtl-optimization/47166 > * gcc.c-torture/execute/postmod-1.c: New test. > > Index: gcc/testsuite/gcc.c-torture/execute/postmod-1.c > =================================================================== > --- /dev/null 2010-12-14 12:47:12.274544604 +0000 > +++ gcc/testsuite/gcc.c-torture/execute/postmod-1.c 2011-01-10 > 13:52:05.000000000 +0000 > @@ -0,0 +1,62 @@ > +#define DECLARE_ARRAY(A) array##A[0x10] > +#define DECLARE_COUNTER(A) counter##A = 0 > +#define DECLARE_POINTER(A) *pointer##A = array##A + x > +/* Create a loop that allows post-modification of pointerA, followed by > + a use of the post-modified address. */ > +#define BEFORE(A) counter##A += *pointer##A, pointer##A += 3 > +#define AFTER(A) counter##A += pointer##A[x] > + > +/* Set up the arrays so that one iteration of the loop sets the counter > + to 3.0f. */ > +#define INIT_ARRAY(A) array##A[1] = 1.0f, array##A[5] = 2.0f > + > +/* Check that the loop worked correctly for all values. */ > +#define CHECK_ARRAY(A) exit_code |= (counter##A != 3.0f) > + > +/* Having 6 copies triggered the bug for ARM and Thumb. */ > +#define MANY(A) A (0), A (1), A (2), A (3), A (4), A (5) > + > +/* Each addendA should be allocated a register. */ > +#define INIT_VOLATILE(A) addend##A = vol > +#define ADD_VOLATILE(A) vol += addend##A > + > +/* Having 5 copies triggered the bug for ARM and Thumb. */ > +#define MANY2(A) A (0), A (1), A (2), A (3), A (4) > + > +float MANY (DECLARE_ARRAY); > +float MANY (DECLARE_COUNTER); > + > +volatile int stop = 1; > +volatile int vol; > + > +void __attribute__((noinline)) > +foo (int x) > +{ > + float MANY (DECLARE_POINTER); > + int i; > + > + do > + { > + MANY (BEFORE); > + MANY (AFTER); > + /* Create an inner loop that should ensure the code above > + has registers free for reload inheritance. */ > + { > + int MANY2 (INIT_VOLATILE); > + for (i = 0; i < 10; i++) > + MANY2 (ADD_VOLATILE); > + } > + } > + while (!stop); > +} > + > +int > +main (void) > +{ > + int exit_code = 0; > + > + MANY (INIT_ARRAY); > + foo (1); > + MANY (CHECK_ARRAY); > + return exit_code; > +} >