1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature 2; RUN: opt -S -passes='openmp-opt' < %s | FileCheck %s 3; ModuleID = 'single_threaded_exeuction.c' 4 5%struct.ident_t = type { i32, i32, i32, i32, i8* } 6 7@0 = private unnamed_addr constant [1 x i8] c"\00", align 1 8@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @0, i32 0, i32 0) }, align 8 9 10define void @kernel() { 11; CHECK-LABEL: define {{[^@]+}}@kernel() { 12; CHECK-NEXT: [[CALL:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* nonnull @[[GLOB1:[0-9]+]], i1 false, i1 false, i1 false) 13; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], -1 14; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 15; CHECK: if.then: 16; CHECK-NEXT: call void @foo() 17; CHECK-NEXT: br label [[IF_END:%.*]] 18; CHECK: if.else: 19; CHECK-NEXT: call void @bar() 20; CHECK-NEXT: br label [[IF_END]] 21; CHECK: if.end: 22; CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 true) 23; CHECK-NEXT: ret void 24; 25 %call = call i32 @__kmpc_target_init(%struct.ident_t* nonnull @1, i1 false, i1 false, i1 false) 26 %cmp = icmp eq i32 %call, -1 27 br i1 %cmp, label %if.then, label %if.else 28if.then: 29 call void @foo() 30 br label %if.end 31if.else: 32 call void @bar() 33 br label %if.end 34if.end: 35 call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 true) 36 ret void 37} 38 39; Function Attrs: noinline 40define internal void @foo() { 41; CHECK-LABEL: define {{[^@]+}}@foo() { 42; CHECK-NEXT: entry: 43; CHECK-NEXT: [[TID:%.*]] = call i32 @__kmpc_get_hardware_thread_id() 44; CHECK-NEXT: br label [[IF_THEN:%.*]] 45; CHECK: if.then: 46; CHECK-NEXT: call void @baz() 47; CHECK-NEXT: br label [[IF_END:%.*]] 48; CHECK: if.end: 49; CHECK-NEXT: ret void 50; 51entry: 52 %tid = call i32 @__kmpc_get_hardware_thread_id(); 53 %ismain = call signext i8 @__kmpc_is_generic_main_thread_id(i32 %tid) 54 %pred = icmp eq i8 %ismain, 1 55 br i1 %pred, label %if.then, label %if.end 56 57if.then: 58 call void @baz() 59 br label %if.end 60 61if.end: 62 ret void 63} 64 65; Function Attrs: noinline 66define internal void @bar() { 67; CHECK-LABEL: define {{[^@]+}}@bar() { 68; CHECK-NEXT: entry: 69; CHECK-NEXT: [[TID:%.*]] = call i32 @__kmpc_get_hardware_thread_id() 70; CHECK-NEXT: [[ISMAIN:%.*]] = call signext i8 @__kmpc_is_generic_main_thread_id(i32 [[TID]]) 71; CHECK-NEXT: [[PRED:%.*]] = icmp eq i8 [[ISMAIN]], 1 72; CHECK-NEXT: br i1 [[PRED]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 73; CHECK: if.then: 74; CHECK-NEXT: call void @baz() 75; CHECK-NEXT: br label [[IF_END]] 76; CHECK: if.end: 77; CHECK-NEXT: ret void 78; 79entry: 80 %tid = call i32 @__kmpc_get_hardware_thread_id(); 81 %ismain = call signext i8 @__kmpc_is_generic_main_thread_id(i32 %tid) 82 %pred = icmp eq i8 %ismain, 1 83 br i1 %pred, label %if.then, label %if.end 84 85if.then: 86 call void @baz() 87 br label %if.end 88 89if.end: 90 ret void 91} 92 93declare void @baz() 94 95declare i8 @__kmpc_is_generic_main_thread_id(i32) 96 97declare i32 @__kmpc_get_hardware_thread_id() 98 99declare i32 @__kmpc_target_init(%struct.ident_t*, i1, i1, i1) 100 101declare void @__kmpc_target_deinit(%struct.ident_t*, i1, i1) 102 103!llvm.dbg.cu = !{!0} 104!llvm.module.flags = !{!3, !4, !5, !6} 105!nvvm.annotations = !{!7} 106 107!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None) 108!1 = !DIFile(filename: "fold_generic_main_thread.c", directory: "/tmp/fold_generic_main_thread.c") 109!2 = !{} 110!3 = !{i32 2, !"Debug Info Version", i32 3} 111!4 = !{i32 1, !"wchar_size", i32 4} 112!5 = !{i32 7, !"openmp", i32 50} 113!6 = !{i32 7, !"openmp-device", i32 50} 114!7 = !{void ()* @kernel, !"kernel", i32 1} 115