1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals --include-generated-funcs 2; RUN: opt -S -passes='openmp-opt' < %s | FileCheck %s 3; RUN: opt -passes=openmp-opt -pass-remarks=openmp-opt -disable-output < %s 2>&1 | FileCheck %s -check-prefix=CHECK-REMARKS 4target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64" 5target triple = "nvptx64" 6 7; CHECK-REMARKS: remark: replace_globalization.c:5:7: Replaced globalized variable with 16 bytes of shared memory 8; CHECK-REMARKS: remark: replace_globalization.c:5:14: Replaced globalized variable with 4 bytes of shared memory 9; CHECK-REMARKS-NOT: 6 bytes 10 11%struct.ident_t = type { i32, i32, i32, i32, i8* } 12 13@S = external local_unnamed_addr global i8* 14@0 = private unnamed_addr constant [113 x i8] c";llvm/test/Transforms/OpenMP/custom_state_machines_remarks.c;__omp_offloading_2a_d80d3d_test_fallback_l11;11;1;;\00", align 1 15@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([113 x i8], [113 x i8]* @0, i32 0, i32 0) }, align 8 16 17 18define dso_local void @foo() { 19entry: 20 %c = call i32 @__kmpc_target_init(%struct.ident_t* @1, i8 1, i1 true, i1 true) 21 %x = call i8* @__kmpc_alloc_shared(i64 4) 22 call void @unknown_no_openmp() 23 %x_on_stack = bitcast i8* %x to i32* 24 %0 = bitcast i32* %x_on_stack to i8* 25 call void @use(i8* %0) 26 call void @__kmpc_free_shared(i8* %x, i64 4) 27 call void @__kmpc_target_deinit(%struct.ident_t* @1, i8 1, i1 true) 28 ret void 29} 30 31define void @bar() { 32 %c = call i32 @__kmpc_target_init(%struct.ident_t* @1, i8 1, i1 true, i1 true) 33 call void @unknown_no_openmp() 34 call void @baz() 35 call void @qux() 36 call void @negative_qux_spmd() 37 call void @__kmpc_target_deinit(%struct.ident_t* @1, i8 1, i1 true) 38 ret void 39} 40 41define internal void @baz() { 42entry: 43 %call = call i32 @__kmpc_target_init(%struct.ident_t* nonnull @1, i8 1, i1 false, i1 true) 44 call void @unknown_no_openmp() 45 %cmp = icmp eq i32 %call, -1 46 br i1 %cmp, label %master, label %exit 47master: 48 %x = call i8* @__kmpc_alloc_shared(i64 16), !dbg !11 49 %x_on_stack = bitcast i8* %x to [4 x i32]* 50 %0 = bitcast [4 x i32]* %x_on_stack to i8* 51 call void @use(i8* %0) 52 call void @__kmpc_free_shared(i8* %x, i64 16) 53 br label %exit 54exit: 55 ret void 56} 57 58define internal void @qux() { 59entry: 60 %call = call i32 @__kmpc_target_init(%struct.ident_t* nonnull @1, i8 1, i1 true, i1 true) 61 call void @unknown_no_openmp() 62 %0 = icmp eq i32 %call, -1 63 br i1 %0, label %master, label %exit 64master: 65 %y = call i8* @__kmpc_alloc_shared(i64 4), !dbg !12 66 %y_on_stack = bitcast i8* %y to [4 x i32]* 67 %1 = bitcast [4 x i32]* %y_on_stack to i8* 68 call void @use(i8* %1) 69 call void @__kmpc_free_shared(i8* %y, i64 4) 70 br label %exit 71exit: 72 ret void 73} 74 75define internal void @negative_qux_spmd() { 76entry: 77 %call = call i32 @__kmpc_target_init(%struct.ident_t* nonnull @1, i8 2, i1 true, i1 true) 78 call void @unknown_no_openmp() 79 %0 = icmp eq i32 %call, -1 80 br i1 %0, label %master, label %exit 81master: 82 %y = call i8* @__kmpc_alloc_shared(i64 24), !dbg !12 83 %y_on_stack = bitcast i8* %y to [6 x i32]* 84 %1 = bitcast [6 x i32]* %y_on_stack to i8* 85 call void @use(i8* %1) 86 call void @__kmpc_free_shared(i8* %y, i64 24) 87 br label %exit 88exit: 89 ret void 90} 91 92 93define void @use(i8* %x) { 94entry: 95 store i8* %x, i8** @S 96 ret void 97} 98 99declare i8* @__kmpc_alloc_shared(i64) 100 101declare void @__kmpc_free_shared(i8*, i64) 102 103declare i32 @llvm.nvvm.read.ptx.sreg.tid.x() 104 105declare i32 @llvm.nvvm.read.ptx.sreg.ntid.x() 106 107declare i32 @llvm.nvvm.read.ptx.sreg.warpsize() 108 109declare i32 @__kmpc_target_init(%struct.ident_t*, i8, i1, i1) 110 111declare void @__kmpc_target_deinit(%struct.ident_t*, i8, i1) 112 113declare void @unknown_no_openmp() "llvm.assume"="omp_no_openmp" 114 115!llvm.dbg.cu = !{!0} 116!llvm.module.flags = !{!3, !4, !5, !6} 117!nvvm.annotations = !{!7, !8} 118 119!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) 120!1 = !DIFile(filename: "replace_globalization.c", directory: "/tmp/replace_globalization.c") 121!2 = !{} 122!3 = !{i32 2, !"Debug Info Version", i32 3} 123!4 = !{i32 1, !"wchar_size", i32 4} 124!5 = !{i32 7, !"openmp", i32 50} 125!6 = !{i32 7, !"openmp-device", i32 50} 126!7 = !{void ()* @foo, !"kernel", i32 1} 127!8 = !{void ()* @bar, !"kernel", i32 1} 128!9 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !10, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2) 129!10 = !DISubroutineType(types: !2) 130!11 = !DILocation(line: 5, column: 7, scope: !9) 131!12 = !DILocation(line: 5, column: 14, scope: !9) 132;. 133; CHECK: @[[S:[a-zA-Z0-9_$"\\.-]+]] = external local_unnamed_addr global i8* 134; CHECK: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [113 x i8] c" 135; CHECK: @[[GLOB1:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([113 x i8], [113 x i8]* @[[GLOB0]], i32 0, i32 0) }, align 8 136; CHECK: @[[X:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [16 x i8] undef, align 32 137; CHECK: @[[Y:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global [4 x i8] undef, align 32 138;. 139; CHECK-LABEL: define {{[^@]+}}@foo() { 140; CHECK-NEXT: entry: 141; CHECK-NEXT: [[C:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i8 1, i1 false, i1 true) 142; CHECK-NEXT: [[X:%.*]] = call i8* @__kmpc_alloc_shared(i64 4) #[[ATTR4:[0-9]+]] 143; CHECK-NEXT: call void @unknown_no_openmp() 144; CHECK-NEXT: call void @use.internalized(i8* nofree writeonly [[X]]) #[[ATTR5:[0-9]+]] 145; CHECK-NEXT: call void @__kmpc_free_shared(i8* [[X]], i64 4) #[[ATTR4]] 146; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i8 1, i1 true) 147; CHECK-NEXT: ret void 148; 149; 150; CHECK-LABEL: define {{[^@]+}}@bar() { 151; CHECK-NEXT: [[C:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i8 1, i1 true, i1 true) 152; CHECK-NEXT: call void @unknown_no_openmp() 153; CHECK-NEXT: call void @baz() 154; CHECK-NEXT: call void @qux() 155; CHECK-NEXT: call void @negative_qux_spmd() 156; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i8 1, i1 true) 157; CHECK-NEXT: ret void 158; 159; 160; CHECK-LABEL: define {{[^@]+}}@baz() { 161; CHECK-NEXT: entry: 162; CHECK-NEXT: [[CALL:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* noundef nonnull @[[GLOB1]], i8 noundef 1, i1 noundef false, i1 noundef true) 163; CHECK-NEXT: call void @unknown_no_openmp() 164; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], -1 165; CHECK-NEXT: br i1 [[CMP]], label [[MASTER:%.*]], label [[EXIT:%.*]] 166; CHECK: master: 167; CHECK-NEXT: call void @use.internalized(i8* nofree writeonly addrspacecast (i8 addrspace(3)* getelementptr inbounds ([16 x i8], [16 x i8] addrspace(3)* @x, i32 0, i32 0) to i8*)) #[[ATTR5]] 168; CHECK-NEXT: br label [[EXIT]] 169; CHECK: exit: 170; CHECK-NEXT: ret void 171; 172; 173; CHECK-LABEL: define {{[^@]+}}@qux() { 174; CHECK-NEXT: entry: 175; CHECK-NEXT: [[CALL:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* noundef nonnull @[[GLOB1]], i8 noundef 1, i1 noundef true, i1 noundef true) 176; CHECK-NEXT: call void @unknown_no_openmp() 177; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[CALL]], -1 178; CHECK-NEXT: br i1 [[TMP0]], label [[MASTER:%.*]], label [[EXIT:%.*]] 179; CHECK: master: 180; CHECK-NEXT: call void @use.internalized(i8* nofree writeonly addrspacecast (i8 addrspace(3)* getelementptr inbounds ([4 x i8], [4 x i8] addrspace(3)* @y, i32 0, i32 0) to i8*)) #[[ATTR5]] 181; CHECK-NEXT: br label [[EXIT]] 182; CHECK: exit: 183; CHECK-NEXT: ret void 184; 185; 186; CHECK-LABEL: define {{[^@]+}}@negative_qux_spmd() { 187; CHECK-NEXT: entry: 188; CHECK-NEXT: [[CALL:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* noundef nonnull @[[GLOB1]], i8 noundef 2, i1 noundef true, i1 noundef true) 189; CHECK-NEXT: call void @unknown_no_openmp() 190; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[CALL]], -1 191; CHECK-NEXT: br i1 [[TMP0]], label [[MASTER:%.*]], label [[EXIT:%.*]] 192; CHECK: master: 193; CHECK-NEXT: [[Y:%.*]] = call i8* @__kmpc_alloc_shared(i64 noundef 24) #[[ATTR4]], !dbg [[DBG9:![0-9]+]] 194; CHECK-NEXT: call void @use.internalized(i8* nofree writeonly [[Y]]) #[[ATTR5]] 195; CHECK-NEXT: call void @__kmpc_free_shared(i8* [[Y]], i64 noundef 24) #[[ATTR4]] 196; CHECK-NEXT: br label [[EXIT]] 197; CHECK: exit: 198; CHECK-NEXT: ret void 199; 200; 201; CHECK: Function Attrs: nofree nosync nounwind willreturn writeonly 202; CHECK-LABEL: define {{[^@]+}}@use.internalized 203; CHECK-SAME: (i8* nofree writeonly [[X:%.*]]) #[[ATTR0:[0-9]+]] { 204; CHECK-NEXT: entry: 205; CHECK-NEXT: store i8* [[X]], i8** @S, align 8 206; CHECK-NEXT: ret void 207; 208; 209; CHECK-LABEL: define {{[^@]+}}@use 210; CHECK-SAME: (i8* [[X:%.*]]) { 211; CHECK-NEXT: entry: 212; CHECK-NEXT: store i8* [[X]], i8** @S, align 8 213; CHECK-NEXT: ret void 214; 215;. 216; CHECK: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn writeonly } 217; CHECK: attributes #[[ATTR1:[0-9]+]] = { nosync nounwind } 218; CHECK: attributes #[[ATTR2:[0-9]+]] = { nounwind readnone } 219; CHECK: attributes #[[ATTR3:[0-9]+]] = { "llvm.assume"="omp_no_openmp" } 220; CHECK: attributes #[[ATTR4]] = { nounwind } 221; CHECK: attributes #[[ATTR5]] = { nounwind writeonly } 222;. 223; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 12.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) 224; CHECK: [[META1:![0-9]+]] = !DIFile(filename: "replace_globalization.c", directory: "/tmp/replace_globalization.c") 225; CHECK: [[META2:![0-9]+]] = !{} 226; CHECK: [[META3:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3} 227; CHECK: [[META4:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} 228; CHECK: [[META5:![0-9]+]] = !{i32 7, !"openmp", i32 50} 229; CHECK: [[META6:![0-9]+]] = !{i32 7, !"openmp-device", i32 50} 230; CHECK: [[META7:![0-9]+]] = !{void ()* @foo, !"kernel", i32 1} 231; CHECK: [[META8:![0-9]+]] = !{void ()* @bar, !"kernel", i32 1} 232; CHECK: [[DBG9]] = !DILocation(line: 5, column: 14, scope: !10) 233; CHECK: [[META10:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2) 234; CHECK: [[META11:![0-9]+]] = !DISubroutineType(types: !2) 235;. 236