reassoc: Test rank biasing

Add both positive and negative tests.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/reassoc-46.c: New test.
	* gcc.dg/tree-ssa/reassoc-46.h: Common code for new tests.
	* gcc.dg/tree-ssa/reassoc-47.c: New test.
	* gcc.dg/tree-ssa/reassoc-48.c: New test.
	* gcc.dg/tree-ssa/reassoc-49.c: New test.
	* gcc.dg/tree-ssa/reassoc-50.c: New test.
	* gcc.dg/tree-ssa/reassoc-51.c: New test.
This commit is contained in:
Ilya Leoshkevich 2021-09-14 21:31:31 +02:00
parent c32f7df917
commit 92cdd338fd
7 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#include "reassoc-46.h"
/* Check that the loop accumulator is added last. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 1 "optimized" } } */

View File

@ -0,0 +1,33 @@
#define M 1024
unsigned int arr1[M];
unsigned int arr2[M];
volatile unsigned int sink;
unsigned int
test (void)
{
unsigned int sum = 0;
for (int i = 0; i < M; i++)
{
#ifdef MODIFY
/* Modify the loop accumulator using a chain of operations - this should
not affect its rank biasing. */
sum |= 1;
sum ^= 2;
#endif
#ifdef STORE
/* Save the loop accumulator into a global variable - this should not
affect its rank biasing. */
sink = sum;
#endif
#ifdef USE
/* Add a tricky use of the loop accumulator - this should prevent its
rank biasing. */
i = (i + sum) % M;
#endif
/* Use addends with different ranks. */
sum += arr1[i];
sum += arr2[((i ^ 1) + 1) % M];
}
return sum;
}

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#define MODIFY
#include "reassoc-46.h"
/* Check that if the loop accumulator is saved into a global variable, it's
still added last. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 1 "optimized" } } */

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#define STORE
#include "reassoc-46.h"
/* Check that if the loop accumulator is modified using a chain of operations
other than addition, its new value is still added last. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 1 "optimized" } } */

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#define MODIFY
#define STORE
#include "reassoc-46.h"
/* Check that if the loop accumulator is both modified using a chain of
operations other than addition and stored into a global variable, its new
value is still added last. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 1 "optimized" } } */

View File

@ -0,0 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#define MODIFY
#define USE
#include "reassoc-46.h"
/* Check that if the loop accumulator has multiple uses inside the loop, it's
not forced to the end of the reassociation chain. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 2 "optimized" } } */

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized -ftree-vectorize" } */
#define MODIFY
#define STORE
#define USE
#include "reassoc-46.h"
/* Check that if the loop accumulator has multiple uses inside the loop, it's
not forced to the end of the reassociation chain. */
/* { dg-final { scan-tree-dump-times {(?:vect_)?sum_[\d._]+ = (?:(?:vect_)?_[\d._]+ \+ (?:vect_)?sum_[\d._]+|(?:vect_)?sum_[\d._]+ \+ (?:vect_)?_[\d._]+)} 2 "optimized" } } */