1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes 2; RUN: opt -openmp-opt-cgscc -S < %s | FileCheck %s 3; RUN: opt -passes=openmp-opt-cgscc -S < %s | FileCheck %s 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 5 6%struct.ident_t = type { i32, i32, i32, i32, i8* } 7 8@0 = private unnamed_addr constant %struct.ident_t { i32 0, i32 34, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str0, i32 0, i32 0) }, align 8 9@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str1, i32 0, i32 0) }, align 8 10@2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str2, i32 0, i32 0) }, align 8 11@.str0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 12@.str1 = private unnamed_addr constant [23 x i8] c";file001;loc0001;0;0;;\00", align 1 13@.str2 = private unnamed_addr constant [23 x i8] c";file002;loc0002;0;0;;\00", align 1 14 15; UTC_ARGS: --disable 16; CHECK-DAG: @0 = private unnamed_addr constant %struct.ident_t { i32 0, i32 34, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str0, i32 0, i32 0) }, align 8 17; CHECK-DAG: @1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str1, i32 0, i32 0) }, align 8 18; CHECK-DAG: @2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str2, i32 0, i32 0) }, align 8 19; CHECK-DAG: @.str0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 20; CHECK-DAG: @.str1 = private unnamed_addr constant [23 x i8] c";file001;loc0001;0;0;;\00", align 1 21; CHECK-DAG: @.str2 = private unnamed_addr constant [23 x i8] c";file002;loc0002;0;0;;\00", align 1 22; UTC_ARGS: --enable 23 24 25declare i32 @__kmpc_global_thread_num(%struct.ident_t*) 26declare void @useI32(i32) 27 28define void @external(i1 %c) { 29; CHECK-LABEL: define {{[^@]+}}@external 30; CHECK-SAME: (i1 [[C:%.*]]) { 31; CHECK-NEXT: entry: 32; CHECK-NEXT: [[C2:%.*]] = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @[[GLOB0:[0-9]+]]) 33; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[E:%.*]] 34; CHECK: t: 35; CHECK-NEXT: call void @internal(i32 [[C2]], i32 [[C2]]) 36; CHECK-NEXT: call void @useI32(i32 [[C2]]) 37; CHECK-NEXT: br label [[M:%.*]] 38; CHECK: e: 39; CHECK-NEXT: call void @internal(i32 [[C2]], i32 [[C2]]) 40; CHECK-NEXT: call void @useI32(i32 [[C2]]) 41; CHECK-NEXT: br label [[M]] 42; CHECK: m: 43; CHECK-NEXT: call void @internal(i32 0, i32 [[C2]]) 44; CHECK-NEXT: call void @useI32(i32 [[C2]]) 45; CHECK-NEXT: ret void 46; 47entry: 48 br i1 %c, label %t, label %e 49t: 50 %c0 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 51 call void @internal(i32 %c0, i32 %c0) 52 call void @useI32(i32 %c0) 53 br label %m 54e: 55 %c1 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 56 call void @internal(i32 %c1, i32 %c1) 57 call void @useI32(i32 %c1) 58 br label %m 59m: 60 %c2 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 61 call void @internal(i32 0, i32 %c2) 62 call void @useI32(i32 %c2) 63 ret void 64} 65 66define internal void @internal(i32 %not_gtid, i32 %gtid) { 67; CHECK-LABEL: define {{[^@]+}}@internal 68; CHECK-SAME: (i32 [[NOT_GTID:%.*]], i32 [[GTID:%.*]]) { 69; CHECK-NEXT: entry: 70; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[GTID]], [[GTID]] 71; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[E:%.*]] 72; CHECK: t: 73; CHECK-NEXT: call void @useI32(i32 [[GTID]]) 74; CHECK-NEXT: call void @external(i1 [[C]]) 75; CHECK-NEXT: br label [[M:%.*]] 76; CHECK: e: 77; CHECK-NEXT: call void @useI32(i32 [[GTID]]) 78; CHECK-NEXT: br label [[M]] 79; CHECK: m: 80; CHECK-NEXT: call void @useI32(i32 [[GTID]]) 81; CHECK-NEXT: ret void 82; 83entry: 84 %cc = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 85 %c = icmp eq i32 %cc, %gtid 86 br i1 %c, label %t, label %e 87t: 88 %c0 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 89 call void @useI32(i32 %c0) 90 call void @external(i1 %c) 91 br label %m 92e: 93 %c1 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 94 call void @useI32(i32 %c1) 95 br label %m 96m: 97 %c2 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0) 98 call void @useI32(i32 %c2) 99 ret void 100} 101 102 103define void @local_and_global_gtid_calls() { 104; CHECK-LABEL: define {{[^@]+}}@local_and_global_gtid_calls() { 105; CHECK-NEXT: entry: 106; CHECK-NEXT: [[TID5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]) 107; CHECK-NEXT: [[DOTKMPC_LOC_ADDR:%.*]] = alloca [[STRUCT_IDENT_T:%.*]], align 8 108; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 109; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 110; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 111; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 112; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 113; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 114; CHECK-NEXT: ret void 115; 116entry: 117 %.kmpc_loc.addr = alloca %struct.ident_t, align 8 118 %tid0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr) 119 %tid1 = call i32 @__kmpc_global_thread_num(%struct.ident_t* @1) 120 %tid2 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr) 121 call void @useI32(i32 %tid0) 122 call void @useI32(i32 %tid1) 123 call void @useI32(i32 %tid2) 124 %tid3 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr) 125 %tid4 = call i32 @__kmpc_global_thread_num(%struct.ident_t* @2) 126 %tid5 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr) 127 call void @useI32(i32 %tid3) 128 call void @useI32(i32 %tid4) 129 call void @useI32(i32 %tid5) 130 ret void 131} 132 133define void @local_gtid_calls_only() { 134; CHECK-LABEL: define {{[^@]+}}@local_gtid_calls_only() { 135; CHECK-NEXT: entry: 136; CHECK-NEXT: [[TID5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3]]) 137; CHECK-NEXT: [[DOTKMPC_LOC_ADDR1:%.*]] = alloca [[STRUCT_IDENT_T:%.*]], align 8 138; CHECK-NEXT: [[DOTKMPC_LOC_ADDR2:%.*]] = alloca [[STRUCT_IDENT_T]], align 8 139; CHECK-NEXT: [[DOTKMPC_LOC_ADDR3:%.*]] = alloca [[STRUCT_IDENT_T]], align 8 140; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 141; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 142; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 143; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 144; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 145; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 146; CHECK-NEXT: ret void 147; 148entry: 149 %.kmpc_loc.addr1 = alloca %struct.ident_t, align 8 150 %.kmpc_loc.addr2 = alloca %struct.ident_t, align 8 151 %.kmpc_loc.addr3 = alloca %struct.ident_t, align 8 152 %tid0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr1) 153 %tid1 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr2) 154 %tid2 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr3) 155 call void @useI32(i32 %tid0) 156 call void @useI32(i32 %tid1) 157 call void @useI32(i32 %tid2) 158 %tid3 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr1) 159 %tid4 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr2) 160 %tid5 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr3) 161 call void @useI32(i32 %tid3) 162 call void @useI32(i32 %tid4) 163 call void @useI32(i32 %tid5) 164 ret void 165} 166 167declare i32 @omp_get_level() 168define void @local_and_global_glvl_calls() { 169; CHECK-LABEL: define {{[^@]+}}@local_and_global_glvl_calls() { 170; CHECK-NEXT: entry: 171; CHECK-NEXT: [[TID5:%.*]] = call i32 @omp_get_level() 172; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 173; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 174; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 175; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 176; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 177; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 178; CHECK-NEXT: ret void 179; 180entry: 181 %tid0 = call i32 @omp_get_level() 182 %tid1 = call i32 @omp_get_level() 183 %tid2 = call i32 @omp_get_level() 184 call void @useI32(i32 %tid0) 185 call void @useI32(i32 %tid1) 186 call void @useI32(i32 %tid2) 187 %tid3 = call i32 @omp_get_level() 188 %tid4 = call i32 @omp_get_level() 189 %tid5 = call i32 @omp_get_level() 190 call void @useI32(i32 %tid3) 191 call void @useI32(i32 %tid4) 192 call void @useI32(i32 %tid5) 193 ret void 194} 195 196define void @local_glvl_calls_only() { 197; CHECK-LABEL: define {{[^@]+}}@local_glvl_calls_only() { 198; CHECK-NEXT: entry: 199; CHECK-NEXT: [[TID5:%.*]] = call i32 @omp_get_level() 200; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 201; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 202; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 203; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 204; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 205; CHECK-NEXT: call void @useI32(i32 [[TID5]]) 206; CHECK-NEXT: ret void 207; 208entry: 209 %tid0 = call i32 @omp_get_level() 210 %tid1 = call i32 @omp_get_level() 211 %tid2 = call i32 @omp_get_level() 212 call void @useI32(i32 %tid0) 213 call void @useI32(i32 %tid1) 214 call void @useI32(i32 %tid2) 215 %tid3 = call i32 @omp_get_level() 216 %tid4 = call i32 @omp_get_level() 217 %tid5 = call i32 @omp_get_level() 218 call void @useI32(i32 %tid3) 219 call void @useI32(i32 %tid4) 220 call void @useI32(i32 %tid5) 221 ret void 222} 223 224!llvm.module.flags = !{!0} 225 226!0 = !{i32 7, !"openmp", i32 50} 227