On Mon, Mar 14, 2011 at 11:25 AM, Richard Sandiford
<[email protected]> 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;
> +}
>