blob: 8b1f6c58740da3775d4cb05c34d1c85bf09b1c75 [file] [edit]
// RUN: %libomp-compile -fopenmp-version=60 && %libomp-run \
// RUN: | FileCheck %s --match-full-lines
// A reverse consumed by fuse keeps its pre-inits: its loop init runs even for
// a zero-trip loop, and runtime bounds are captured.
#ifndef HEADER
#define HEADER
#include <stdio.h>
#include <stdlib.h>
static void test_in_range_reverse_zero_trip(int n) {
int i = 77, j = 88;
#pragma omp fuse
{
for (i = 0; i < 5; i++)
;
#pragma omp reverse
for (j = 0; j < n; j++)
;
}
printf("in_range_zero: i=%d j=%d\n", i, j);
}
static void test_out_of_range_reverse_zero_trip(int n) {
int i = 77, j = 88, k = 99;
#pragma omp fuse looprange(1, 2)
{
for (i = 0; i < 5; i++)
;
for (j = 0; j < 6; j++)
;
#pragma omp reverse
for (k = 0; k < n; k++)
;
}
printf("out_of_range_zero: i=%d j=%d k=%d\n", i, j, k);
}
static void test_out_of_range_reverse_captured_step(int start, int end,
int step) {
int i = -1, j = -1, k = -1;
#pragma omp fuse looprange(1, 2)
{
for (i = 0; i < 4; i++)
;
for (j = 0; j < 6; j++)
;
#pragma omp reverse
for (k = start; k < end; k += step)
;
}
printf("out_of_range_step: i=%d j=%d k=%d\n", i, j, k);
}
static void test_in_range_reverse_captured_bound(int n) {
int i = -1, j = -1;
#pragma omp fuse
{
for (i = 0; i < 10; i++)
;
#pragma omp reverse
for (j = 0; j < n + 1; j++)
;
}
printf("captured_bound n=%d: i=%d j=%d\n", n, i, j);
}
int main(void) {
test_in_range_reverse_zero_trip(0);
test_out_of_range_reverse_zero_trip(0);
test_out_of_range_reverse_captured_step(1, 10, 2);
test_in_range_reverse_captured_bound(7);
test_in_range_reverse_captured_bound(-1);
return EXIT_SUCCESS;
}
#endif
// CHECK: in_range_zero: i=5 j=0
// CHECK-NEXT: out_of_range_zero: i=5 j=6 k=0
// CHECK-NEXT: out_of_range_step: i=4 j=6 k=11
// CHECK-NEXT: captured_bound n=7: i=10 j=8
// CHECK-NEXT: captured_bound n=-1: i=10 j=0