xref: /llvm-project/llvm/test/Transforms/OpenMP/parallel_level_fold.ll (revision 07ed8187acc31ac3f4779da452864a29d48799ac)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2; RUN: opt -S -passes=openmp-opt < %s | FileCheck %s
3target triple = "nvptx64"
4
5%struct.KernelEnvironmentTy = type { %struct.ConfigurationEnvironmentTy, ptr, ptr }
6%struct.ConfigurationEnvironmentTy = type { i8, i8, i8, i32, i32, i32, i32, i32, i32 }
7
8@G = external global i16
9@none_spmd_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
10@spmd_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
11@parallel_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
12
13;.
14; CHECK: @G = external global i16
15; CHECK: @none_spmd_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
16; CHECK: @spmd_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 0, i8 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
17; CHECK: @parallel_kernel_environment = local_unnamed_addr constant %struct.KernelEnvironmentTy { %struct.ConfigurationEnvironmentTy { i8 0, i8 1, i8 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 }, ptr null, ptr null }
18;.
19define weak ptx_kernel void @none_spmd() "kernel" {
20; CHECK-LABEL: define {{[^@]+}}@none_spmd
21; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
22; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(ptr @none_spmd_kernel_environment, ptr null)
23; CHECK-NEXT:    call void @none_spmd_helper()
24; CHECK-NEXT:    call void @mixed_helper()
25; CHECK-NEXT:    call void @__kmpc_target_deinit()
26; CHECK-NEXT:    ret void
27;
28  %i = call i32 @__kmpc_target_init(ptr @none_spmd_kernel_environment, ptr null)
29  call void @none_spmd_helper()
30  call void @mixed_helper()
31  call void @__kmpc_target_deinit()
32  ret void
33}
34
35define weak ptx_kernel void @spmd() "kernel" {
36; CHECK-LABEL: define {{[^@]+}}@spmd
37; CHECK-SAME: () #[[ATTR0]] {
38; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(ptr @spmd_kernel_environment, ptr null)
39; CHECK-NEXT:    call void @spmd_helper()
40; CHECK-NEXT:    call void @mixed_helper()
41; CHECK-NEXT:    call void @__kmpc_target_deinit()
42; CHECK-NEXT:    ret void
43;
44  %i = call i32 @__kmpc_target_init(ptr @spmd_kernel_environment, ptr null)
45  call void @spmd_helper()
46  call void @mixed_helper()
47  call void @__kmpc_target_deinit()
48  ret void
49}
50
51define weak ptx_kernel void @parallel() "kernel" {
52; CHECK-LABEL: define {{[^@]+}}@parallel
53; CHECK-SAME: () #[[ATTR0]] {
54; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(ptr @parallel_kernel_environment, ptr null)
55; CHECK-NEXT:    call void @spmd_helper()
56; CHECK-NEXT:    call void @__kmpc_parallel_51(ptr null, i32 0, i32 0, i32 0, i32 0, ptr null, ptr null, ptr null, i64 0)
57; CHECK-NEXT:    call void @__kmpc_target_deinit()
58; CHECK-NEXT:    ret void
59;
60  %i = call i32 @__kmpc_target_init(ptr @parallel_kernel_environment, ptr null)
61  call void @spmd_helper()
62  call void @__kmpc_parallel_51(ptr null, i32 0, i32 0, i32 0, i32 0, ptr null, ptr null, ptr null, i64 0)
63  call void @__kmpc_target_deinit()
64  ret void
65}
66
67define internal void @mixed_helper() {
68; CHECK-LABEL: define {{[^@]+}}@mixed_helper() {
69; CHECK-NEXT:    [[LEVEL:%.*]] = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
70; CHECK-NEXT:    store i16 [[LEVEL]], ptr @G, align 2
71; CHECK-NEXT:    ret void
72;
73  %level = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
74  store i16 %level, ptr @G
75  ret void
76}
77
78define internal void @none_spmd_helper() {
79; CHECK-LABEL: define {{[^@]+}}@none_spmd_helper() {
80; CHECK-NEXT:    [[LEVEL12:%.*]] = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
81; CHECK-NEXT:    [[C:%.*]] = icmp eq i16 [[LEVEL12]], 0
82; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
83; CHECK:       t:
84; CHECK-NEXT:    call void @foo()
85; CHECK-NEXT:    ret void
86; CHECK:       f:
87; CHECK-NEXT:    call void @bar()
88; CHECK-NEXT:    ret void
89;
90  %level12 = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
91  %c = icmp eq i16 %level12, 0
92  br i1 %c, label %t, label %f
93t:
94  call void @foo()
95  ret void
96f:
97  call void @bar()
98  ret void
99}
100
101define internal void @spmd_helper() {
102; CHECK-LABEL: define {{[^@]+}}@spmd_helper() {
103; CHECK-NEXT:    store i8 1, ptr @G, align 2
104; CHECK-NEXT:    ret void
105;
106  %level = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
107  store i16 %level, ptr @G
108  ret void
109}
110
111define internal void @__kmpc_parallel_51(ptr, i32, i32, i32, i32, ptr, ptr, ptr, i64) {
112; CHECK-LABEL: define {{[^@]+}}@__kmpc_parallel_51
113; CHECK-SAME: (ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]], ptr [[TMP5:%.*]], ptr [[TMP6:%.*]], ptr [[TMP7:%.*]], i64 [[TMP8:%.*]]) #[[ATTR1:[0-9]+]] {
114; CHECK-NEXT:    call void @parallel_helper()
115; CHECK-NEXT:    ret void
116;
117  call void @parallel_helper()
118  ret void
119}
120
121define internal void @parallel_helper() {
122; CHECK-LABEL: define {{[^@]+}}@parallel_helper() {
123; CHECK-NEXT:    [[LEVEL:%.*]] = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
124; CHECK-NEXT:    store i16 [[LEVEL]], ptr @G, align 2
125; CHECK-NEXT:    ret void
126;
127  %level = call zeroext i16 @__kmpc_parallel_level(ptr null, i32 0)
128  store i16 %level, ptr @G
129  ret void
130}
131
132declare void @foo()
133declare void @bar()
134declare zeroext i16 @__kmpc_parallel_level(ptr, i32)
135declare i32 @__kmpc_target_init(ptr, ptr) #1
136declare void @__kmpc_target_deinit() #1
137
138!llvm.module.flags = !{!0, !1}
139
140!0 = !{i32 7, !"openmp", i32 50}
141!1 = !{i32 7, !"openmp-device", i32 50}
142;.
143; CHECK: attributes #[[ATTR0]] = { "kernel" }
144; CHECK: attributes #[[ATTR1]] = { alwaysinline }
145;.
146; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50}
147; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
148;.
149