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.ident_t = type { i32, i32, i32, i32, i8* } 6 7@no_spmd_exec_mode = weak constant i8 1 8@spmd_exec_mode = weak constant i8 0 9@parallel_exec_mode = weak constant i8 0 10@G = external global i8 11@llvm.compiler.used = appending global [3 x i8*] [i8* @no_spmd_exec_mode, i8* @spmd_exec_mode, i8* @parallel_exec_mode], section "llvm.metadata" 12 13;. 14; CHECK: @[[NO_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 1 15; CHECK: @[[SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0 16; CHECK: @[[PARALLEL_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0 17; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external global i8 18; CHECK: @[[LLVM_COMPILER_USED:[a-zA-Z0-9_$"\\.-]+]] = appending global [3 x i8*] [i8* @no_spmd_exec_mode, i8* @spmd_exec_mode, i8* @parallel_exec_mode], section "llvm.metadata" 19;. 20define weak void @none_spmd() { 21; CHECK-LABEL: define {{[^@]+}}@none_spmd() { 22; CHECK-NEXT: [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false) 23; CHECK-NEXT: call void @none_spmd_helper() 24; CHECK-NEXT: call void @mixed_helper() 25; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false) 26; CHECK-NEXT: ret void 27; 28 %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false) 29 call void @none_spmd_helper() 30 call void @mixed_helper() 31 call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false) 32 ret void 33} 34 35define weak void @spmd() { 36; CHECK-LABEL: define {{[^@]+}}@spmd() { 37; CHECK-NEXT: [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false) 38; CHECK-NEXT: call void @spmd_helper() 39; CHECK-NEXT: call void @mixed_helper() 40; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false) 41; CHECK-NEXT: ret void 42; 43 %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false) 44 call void @spmd_helper() 45 call void @mixed_helper() 46 call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false) 47 ret void 48} 49 50define weak void @parallel() { 51; CHECK-LABEL: define {{[^@]+}}@parallel() { 52; CHECK-NEXT: [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* align 536870912 null, i1 true, i1 false, i1 false) 53; CHECK-NEXT: call void @spmd_helper() 54; CHECK-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* noalias noundef align 536870912 null, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0, i8* noalias noundef align 536870912 null, i8* noalias noundef align 536870912 null, i8** noalias noundef align 536870912 null, i64 noundef 0) 55; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false) 56; CHECK-NEXT: ret void 57; 58 %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false) 59 call void @spmd_helper() 60 call void @__kmpc_parallel_51(%struct.ident_t* null, i32 0, i32 0, i32 0, i32 0, i8* null, i8* null, i8** null, i64 0) 61 call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false) 62 ret void 63} 64 65define internal void @mixed_helper() { 66; CHECK-LABEL: define {{[^@]+}}@mixed_helper() { 67; CHECK-NEXT: [[LEVEL:%.*]] = call i8 @__kmpc_parallel_level() 68; CHECK-NEXT: store i8 [[LEVEL]], i8* @G, align 1 69; CHECK-NEXT: ret void 70; 71 %level = call i8 @__kmpc_parallel_level() 72 store i8 %level, i8* @G 73 ret void 74} 75 76define internal void @none_spmd_helper() { 77; CHECK-LABEL: define {{[^@]+}}@none_spmd_helper() { 78; CHECK-NEXT: [[LEVEL12:%.*]] = call i8 @__kmpc_parallel_level() 79; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[LEVEL12]], 0 80; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] 81; CHECK: t: 82; CHECK-NEXT: call void @foo() 83; CHECK-NEXT: ret void 84; CHECK: f: 85; CHECK-NEXT: call void @bar() 86; CHECK-NEXT: ret void 87; 88 %level12 = call i8 @__kmpc_parallel_level() 89 %c = icmp eq i8 %level12, 0 90 br i1 %c, label %t, label %f 91t: 92 call void @foo() 93 ret void 94f: 95 call void @bar() 96 ret void 97} 98 99define internal void @spmd_helper() { 100; CHECK-LABEL: define {{[^@]+}}@spmd_helper() { 101; CHECK-NEXT: store i8 1, i8* @G, align 1 102; CHECK-NEXT: ret void 103; 104 %level = call i8 @__kmpc_parallel_level() 105 store i8 %level, i8* @G 106 ret void 107} 108 109define internal void @__kmpc_parallel_51(%struct.ident_t*, i32, i32, i32, i32, i8*, i8*, i8**, i64) { 110; CHECK-LABEL: define {{[^@]+}}@__kmpc_parallel_51 111; CHECK-SAME: (%struct.ident_t* noalias nocapture nofree readnone align 536870912 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]], i8* noalias nocapture nofree readnone align 536870912 [[TMP5:%.*]], i8* noalias nocapture nofree readnone align 536870912 [[TMP6:%.*]], i8** noalias nocapture nofree readnone align 536870912 [[TMP7:%.*]], i64 [[TMP8:%.*]]) { 112; CHECK-NEXT: call void @parallel_helper() 113; CHECK-NEXT: ret void 114; 115 call void @parallel_helper() 116 ret void 117} 118 119define internal void @parallel_helper() { 120; CHECK-LABEL: define {{[^@]+}}@parallel_helper() { 121; CHECK-NEXT: [[LEVEL:%.*]] = call i8 @__kmpc_parallel_level() 122; CHECK-NEXT: store i8 [[LEVEL]], i8* @G, align 1 123; CHECK-NEXT: ret void 124; 125 %level = call i8 @__kmpc_parallel_level() 126 store i8 %level, i8* @G 127 ret void 128} 129 130declare void @foo() 131declare void @bar() 132declare i8 @__kmpc_parallel_level() 133declare i32 @__kmpc_target_init(%struct.ident_t*, i1 zeroext, i1 zeroext, i1 zeroext) #1 134declare void @__kmpc_target_deinit(%struct.ident_t* nocapture readnone, i1 zeroext, i1 zeroext) #1 135 136!llvm.module.flags = !{!0, !1} 137!nvvm.annotations = !{!2, !3, !4} 138 139!0 = !{i32 7, !"openmp", i32 50} 140!1 = !{i32 7, !"openmp-device", i32 50} 141!2 = !{void ()* @none_spmd, !"kernel", i32 1} 142!3 = !{void ()* @spmd, !"kernel", i32 1} 143!4 = !{void ()* @parallel, !"kernel", i32 1} 144;. 145; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50} 146; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp-device", i32 50} 147; CHECK: [[META2:![0-9]+]] = !{void ()* @none_spmd, !"kernel", i32 1} 148; CHECK: [[META3:![0-9]+]] = !{void ()* @spmd, !"kernel", i32 1} 149; CHECK: [[META4:![0-9]+]] = !{void ()* @parallel, !"kernel", i32 1} 150;. 151