mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
d5ca7458b9
Replace the `ident_t` handling in Clang with the methods offered by the OMPIRBuilder. This cuts down on the clang code as well as the differences between the two, making further transitions easier. Tests have changed but there should not be a real functional change. The most interesting difference is probably that we stop generating local ident_t allocations for now and just use globals. Given that this happens only with debug info, the location part of the `ident_t` is probably bigger than the test anyway. As the location part is already a global, we can avoid the allocation, memcpy, and store in favor of a constant global that is slightly bigger. This can be revisited if there are complications. Reviewed By: ABataev Differential Revision: https://reviews.llvm.org/D80735
224 lines
9.3 KiB
LLVM
224 lines
9.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
|
|
; RUN: opt -openmpopt -S < %s | FileCheck %s
|
|
; RUN: opt -passes=openmpopt -S < %s | FileCheck %s
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
%struct.ident_t = type { i32, i32, i32, i32, i8* }
|
|
|
|
@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
|
|
@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
|
|
@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
|
|
@.str0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
|
|
@.str1 = private unnamed_addr constant [23 x i8] c";file001;loc0001;0;0;;\00", align 1
|
|
@.str2 = private unnamed_addr constant [23 x i8] c";file002;loc0002;0;0;;\00", align 1
|
|
|
|
; UTC_ARGS: --disable
|
|
; 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
|
|
; 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
|
|
; 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
|
|
; CHECK-DAG: @.str0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
|
|
; CHECK-DAG: @.str1 = private unnamed_addr constant [23 x i8] c";file001;loc0001;0;0;;\00", align 1
|
|
; CHECK-DAG: @.str2 = private unnamed_addr constant [23 x i8] c";file002;loc0002;0;0;;\00", align 1
|
|
; CHECK-DAG: @3 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str0, i32 0, i32 0) }, align 8
|
|
; UTC_ARGS: --enable
|
|
|
|
|
|
declare i32 @__kmpc_global_thread_num(%struct.ident_t*)
|
|
declare void @useI32(i32)
|
|
|
|
define void @external(i1 %c) {
|
|
; CHECK-LABEL: define {{[^@]+}}@external
|
|
; CHECK-SAME: (i1 [[C:%.*]])
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[C2:%.*]] = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[E:%.*]]
|
|
; CHECK: t:
|
|
; CHECK-NEXT: call void @internal(i32 [[C2]], i32 [[C2]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[C2]])
|
|
; CHECK-NEXT: br label [[M:%.*]]
|
|
; CHECK: e:
|
|
; CHECK-NEXT: call void @internal(i32 [[C2]], i32 [[C2]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[C2]])
|
|
; CHECK-NEXT: br label [[M]]
|
|
; CHECK: m:
|
|
; CHECK-NEXT: call void @internal(i32 0, i32 [[C2]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[C2]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br i1 %c, label %t, label %e
|
|
t:
|
|
%c0 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @internal(i32 %c0, i32 %c0)
|
|
call void @useI32(i32 %c0)
|
|
br label %m
|
|
e:
|
|
%c1 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @internal(i32 %c1, i32 %c1)
|
|
call void @useI32(i32 %c1)
|
|
br label %m
|
|
m:
|
|
%c2 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @internal(i32 0, i32 %c2)
|
|
call void @useI32(i32 %c2)
|
|
ret void
|
|
}
|
|
|
|
define internal void @internal(i32 %not_gtid, i32 %gtid) {
|
|
; CHECK-LABEL: define {{[^@]+}}@internal
|
|
; CHECK-SAME: (i32 [[NOT_GTID:%.*]], i32 [[GTID:%.*]])
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[GTID]], [[GTID]]
|
|
; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[E:%.*]]
|
|
; CHECK: t:
|
|
; CHECK-NEXT: call void @useI32(i32 [[GTID]])
|
|
; CHECK-NEXT: call void @external(i1 [[C]])
|
|
; CHECK-NEXT: br label [[M:%.*]]
|
|
; CHECK: e:
|
|
; CHECK-NEXT: call void @useI32(i32 [[GTID]])
|
|
; CHECK-NEXT: br label [[M]]
|
|
; CHECK: m:
|
|
; CHECK-NEXT: call void @useI32(i32 [[GTID]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%cc = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
%c = icmp eq i32 %cc, %gtid
|
|
br i1 %c, label %t, label %e
|
|
t:
|
|
%c0 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @useI32(i32 %c0)
|
|
call void @external(i1 %c)
|
|
br label %m
|
|
e:
|
|
%c1 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @useI32(i32 %c1)
|
|
br label %m
|
|
m:
|
|
%c2 = tail call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @0)
|
|
call void @useI32(i32 %c2)
|
|
ret void
|
|
}
|
|
|
|
|
|
define void @local_and_global_gtid_calls() {
|
|
; CHECK-LABEL: define {{[^@]+}}@local_and_global_gtid_calls()
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TID5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @3)
|
|
; CHECK-NEXT: [[DOTKMPC_LOC_ADDR:%.*]] = alloca [[STRUCT_IDENT_T:%.*]], align 8
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%.kmpc_loc.addr = alloca %struct.ident_t, align 8
|
|
%tid0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr)
|
|
%tid1 = call i32 @__kmpc_global_thread_num(%struct.ident_t* @1)
|
|
%tid2 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr)
|
|
call void @useI32(i32 %tid0)
|
|
call void @useI32(i32 %tid1)
|
|
call void @useI32(i32 %tid2)
|
|
%tid3 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr)
|
|
%tid4 = call i32 @__kmpc_global_thread_num(%struct.ident_t* @2)
|
|
%tid5 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr)
|
|
call void @useI32(i32 %tid3)
|
|
call void @useI32(i32 %tid4)
|
|
call void @useI32(i32 %tid5)
|
|
ret void
|
|
}
|
|
|
|
define void @local_gtid_calls_only() {
|
|
; CHECK-LABEL: define {{[^@]+}}@local_gtid_calls_only()
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TID5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @3)
|
|
; CHECK-NEXT: [[DOTKMPC_LOC_ADDR1:%.*]] = alloca [[STRUCT_IDENT_T:%.*]], align 8
|
|
; CHECK-NEXT: [[DOTKMPC_LOC_ADDR2:%.*]] = alloca [[STRUCT_IDENT_T]], align 8
|
|
; CHECK-NEXT: [[DOTKMPC_LOC_ADDR3:%.*]] = alloca [[STRUCT_IDENT_T]], align 8
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%.kmpc_loc.addr1 = alloca %struct.ident_t, align 8
|
|
%.kmpc_loc.addr2 = alloca %struct.ident_t, align 8
|
|
%.kmpc_loc.addr3 = alloca %struct.ident_t, align 8
|
|
%tid0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr1)
|
|
%tid1 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr2)
|
|
%tid2 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr3)
|
|
call void @useI32(i32 %tid0)
|
|
call void @useI32(i32 %tid1)
|
|
call void @useI32(i32 %tid2)
|
|
%tid3 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr1)
|
|
%tid4 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr2)
|
|
%tid5 = call i32 @__kmpc_global_thread_num(%struct.ident_t* %.kmpc_loc.addr3)
|
|
call void @useI32(i32 %tid3)
|
|
call void @useI32(i32 %tid4)
|
|
call void @useI32(i32 %tid5)
|
|
ret void
|
|
}
|
|
|
|
declare i32 @omp_get_level()
|
|
define void @local_and_global_glvl_calls() {
|
|
; CHECK-LABEL: define {{[^@]+}}@local_and_global_glvl_calls()
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TID5:%.*]] = call i32 @omp_get_level()
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%tid0 = call i32 @omp_get_level()
|
|
%tid1 = call i32 @omp_get_level()
|
|
%tid2 = call i32 @omp_get_level()
|
|
call void @useI32(i32 %tid0)
|
|
call void @useI32(i32 %tid1)
|
|
call void @useI32(i32 %tid2)
|
|
%tid3 = call i32 @omp_get_level()
|
|
%tid4 = call i32 @omp_get_level()
|
|
%tid5 = call i32 @omp_get_level()
|
|
call void @useI32(i32 %tid3)
|
|
call void @useI32(i32 %tid4)
|
|
call void @useI32(i32 %tid5)
|
|
ret void
|
|
}
|
|
|
|
define void @local_glvl_calls_only() {
|
|
; CHECK-LABEL: define {{[^@]+}}@local_glvl_calls_only()
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TID5:%.*]] = call i32 @omp_get_level()
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: call void @useI32(i32 [[TID5]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%tid0 = call i32 @omp_get_level()
|
|
%tid1 = call i32 @omp_get_level()
|
|
%tid2 = call i32 @omp_get_level()
|
|
call void @useI32(i32 %tid0)
|
|
call void @useI32(i32 %tid1)
|
|
call void @useI32(i32 %tid2)
|
|
%tid3 = call i32 @omp_get_level()
|
|
%tid4 = call i32 @omp_get_level()
|
|
%tid5 = call i32 @omp_get_level()
|
|
call void @useI32(i32 %tid3)
|
|
call void @useI32(i32 %tid4)
|
|
call void @useI32(i32 %tid5)
|
|
ret void
|
|
}
|