
Allow non-constants in the `sizes` clause such as ``` #pragma omp tile sizes(a) for (int i = 0; i < n; ++i) ``` This is permitted since tile was introduced in [OpenMP 5.1](https://www.openmp.org/spec-html/5.1/openmpsu53.html#x78-860002.11.9). It is possible to sneak-in negative numbers at runtime as in ``` int a = -1; #pragma omp tile sizes(a) ``` Even though it is not well-formed, it should still result in every loop iteration to be executed exactly once, an invariant of the tile construct that we should ensure. `ParseOpenMPExprListClause` is extracted-out to be reused by the `permutation` clause of the `interchange` construct. Some care was put into ensuring correct behavior in template contexts.
101 lines
2.2 KiB
C++
101 lines
2.2 KiB
C++
// RUN: %libomp-cxx-compile-and-run | FileCheck %s --match-full-lines
|
|
|
|
#ifndef HEADER
|
|
#define HEADER
|
|
|
|
#include <cstdlib>
|
|
#include <cstdio>
|
|
|
|
int main() {
|
|
printf("do\n");
|
|
#pragma omp parallel for collapse(3) num_threads(1)
|
|
for (int i = 0; i < 3; ++i)
|
|
#pragma omp tile sizes(3, 3)
|
|
for (int j = 0; j < 4; ++j)
|
|
for (int k = 0; k < 5; ++k)
|
|
printf("i=%d j=%d k=%d\n", i, j, k);
|
|
printf("done\n");
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
#endif /* HEADER */
|
|
|
|
// CHECK: do
|
|
|
|
// Full tile
|
|
// CHECK-NEXT: i=0 j=0 k=0
|
|
// CHECK-NEXT: i=0 j=0 k=1
|
|
// CHECK-NEXT: i=0 j=0 k=2
|
|
// CHECK-NEXT: i=0 j=1 k=0
|
|
// CHECK-NEXT: i=0 j=1 k=1
|
|
// CHECK-NEXT: i=0 j=1 k=2
|
|
// CHECK-NEXT: i=0 j=2 k=0
|
|
// CHECK-NEXT: i=0 j=2 k=1
|
|
// CHECK-NEXT: i=0 j=2 k=2
|
|
|
|
// Partial tile
|
|
// CHECK-NEXT: i=0 j=0 k=3
|
|
// CHECK-NEXT: i=0 j=0 k=4
|
|
// CHECK-NEXT: i=0 j=1 k=3
|
|
// CHECK-NEXT: i=0 j=1 k=4
|
|
// CHECK-NEXT: i=0 j=2 k=3
|
|
// CHECK-NEXT: i=0 j=2 k=4
|
|
|
|
// Partial tile
|
|
// CHECK-NEXT: i=0 j=3 k=0
|
|
// CHECK-NEXT: i=0 j=3 k=1
|
|
// CHECK-NEXT: i=0 j=3 k=2
|
|
|
|
// Partial tile
|
|
// CHECK-NEXT: i=0 j=3 k=3
|
|
// CHECK-NEXT: i=0 j=3 k=4
|
|
|
|
// Full tile
|
|
// CHECK-NEXT: i=1 j=0 k=0
|
|
// CHECK-NEXT: i=1 j=0 k=1
|
|
// CHECK-NEXT: i=1 j=0 k=2
|
|
// CHECK-NEXT: i=1 j=1 k=0
|
|
// CHECK-NEXT: i=1 j=1 k=1
|
|
// CHECK-NEXT: i=1 j=1 k=2
|
|
// CHECK-NEXT: i=1 j=2 k=0
|
|
// CHECK-NEXT: i=1 j=2 k=1
|
|
// CHECK-NEXT: i=1 j=2 k=2
|
|
|
|
// Partial tiles
|
|
// CHECK-NEXT: i=1 j=0 k=3
|
|
// CHECK-NEXT: i=1 j=0 k=4
|
|
// CHECK-NEXT: i=1 j=1 k=3
|
|
// CHECK-NEXT: i=1 j=1 k=4
|
|
// CHECK-NEXT: i=1 j=2 k=3
|
|
// CHECK-NEXT: i=1 j=2 k=4
|
|
// CHECK-NEXT: i=1 j=3 k=0
|
|
// CHECK-NEXT: i=1 j=3 k=1
|
|
// CHECK-NEXT: i=1 j=3 k=2
|
|
// CHECK-NEXT: i=1 j=3 k=3
|
|
// CHECK-NEXT: i=1 j=3 k=4
|
|
|
|
// Full tile
|
|
// CHECK-NEXT: i=2 j=0 k=0
|
|
// CHECK-NEXT: i=2 j=0 k=1
|
|
// CHECK-NEXT: i=2 j=0 k=2
|
|
// CHECK-NEXT: i=2 j=1 k=0
|
|
// CHECK-NEXT: i=2 j=1 k=1
|
|
// CHECK-NEXT: i=2 j=1 k=2
|
|
// CHECK-NEXT: i=2 j=2 k=0
|
|
// CHECK-NEXT: i=2 j=2 k=1
|
|
// CHECK-NEXT: i=2 j=2 k=2
|
|
|
|
// Partial tiles
|
|
// CHECK-NEXT: i=2 j=0 k=3
|
|
// CHECK-NEXT: i=2 j=0 k=4
|
|
// CHECK-NEXT: i=2 j=1 k=3
|
|
// CHECK-NEXT: i=2 j=1 k=4
|
|
// CHECK-NEXT: i=2 j=2 k=3
|
|
// CHECK-NEXT: i=2 j=2 k=4
|
|
// CHECK-NEXT: i=2 j=3 k=0
|
|
// CHECK-NEXT: i=2 j=3 k=1
|
|
// CHECK-NEXT: i=2 j=3 k=2
|
|
// CHECK-NEXT: i=2 j=3 k=3
|
|
// CHECK-NEXT: i=2 j=3 k=4
|
|
// CHECK-NEXT: done
|