LLVM OpenMP
nested-fuse-finals.c
Go to the documentation of this file.
1// RUN: %libomp-compile -fopenmp-version=60 && %libomp-run \
2// RUN: | FileCheck %s --match-full-lines
3
4// Loop variables after nested fuse constructs hold their loop-exit values
5// (OpenMP 6.0): the inner fuse's finalization runs right after its fused loop,
6// both when it follows and when it precedes the outer fused range.
7
8#ifndef HEADER
9#define HEADER
10
11#include <stdio.h>
12#include <stdlib.h>
13
14static void test_nested_fuse_post(void) {
15 int i = -1, j = -1, k = -1, l = -1, m = -1;
16#pragma omp fuse looprange(1, 2)
17 {
18 for (i = 0; i < 4; i++)
19 ;
20 for (j = 0; j < 6; j++)
21 ;
22#pragma omp fuse looprange(1, 2)
23 {
24 for (k = 0; k < 8; k++)
25 ;
26 for (l = 0; l < 12; l++)
27 ;
28 for (m = 0; m < 5; m++)
29 ;
30 }
31 }
32 printf("post: i=%d j=%d k=%d l=%d m=%d\n", i, j, k, l, m);
33}
34
35static void test_nested_fuse_pre_read(void) {
36 int i = -1, j = -1, k = -1, l = -1, m = -1;
37 int count = 0;
38#pragma omp fuse looprange(3, 2)
39 {
40#pragma omp fuse looprange(1, 2)
41 {
42 for (i = 0; i < 10; i++)
43 ;
44 for (j = 0; j < 15; j++)
45 ;
46 // Reads i: must observe its loop-exit value.
47 for (k = 0; k < i; k++)
48 count++;
49 }
50 for (l = 0; l < 4; l++)
51 ;
52 for (m = 0; m < 6; m++)
53 ;
54 }
55 printf("pre: count=%d i=%d j=%d k=%d l=%d m=%d\n", count, i, j, k, l, m);
56}
57
58// split inside fuse is not supported yet; split follows the fuse here.
59static void test_fuse_then_split(void) {
60 int i = -1, j = -1, k = -1;
61#pragma omp fuse looprange(1, 2)
62 {
63 for (i = 0; i < 4; i++)
64 ;
65 for (j = 0; j < 6; j++)
66 ;
67 }
68#pragma omp split counts(3, omp_fill)
69 for (k = 0; k < 10; k++)
70 ;
71 printf("split: i=%d j=%d k=%d\n", i, j, k);
72}
73
74int main(void) {
78 return EXIT_SUCCESS;
79}
80#endif
81
82// CHECK: post: i=4 j=6 k=8 l=12 m=5
83// CHECK-NEXT: pre: count=10 i=10 j=15 k=10 l=4 m=6
84// CHECK-NEXT: split: i=4 j=6 k=10
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t count
#define i
Definition kmp_stub.cpp:88
static void test_nested_fuse_post(void)
static void test_fuse_then_split(void)
int main(void)
static void test_nested_fuse_pre_read(void)