
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
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-pc-windows-msvc18.0.0 -std=c++11 -fms-compatibility-version=18 -fms-extensions -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
|
|
|
// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple x86_64-pc-windows-msvc18.0.0 -std=c++11 -fms-compatibility-version=18 -fms-extensions -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
|
|
|
|
// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
|
|
// expected-no-diagnostics
|
|
|
|
void foo();
|
|
void bar();
|
|
|
|
struct Test {
|
|
static void main() {
|
|
int failed = 0;
|
|
int j = 2;
|
|
|
|
#pragma omp parallel
|
|
{
|
|
int local_j = 3;
|
|
#pragma omp single copyprivate(local_j)
|
|
{
|
|
local_j = 4;
|
|
}
|
|
|
|
// Assure reports a data race, but value written to "j"
|
|
// should always be the same.
|
|
j = local_j;
|
|
}
|
|
|
|
}
|
|
};
|
|
|
|
// CHECK-LABEL: @main
|
|
int main() {
|
|
// CHECK: call void @{{.+}}main
|
|
Test::main();
|
|
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* {{.*}}@1, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*))
|
|
#pragma omp parallel
|
|
{
|
|
try {
|
|
foo();
|
|
} catch (int t) {
|
|
#pragma omp critical
|
|
{
|
|
bar();
|
|
};
|
|
}
|
|
};
|
|
// CHECK: ret i32 0
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: define internal void [[OUTLINED]](
|
|
// CHECK: invoke void @{{.+}}foo
|
|
// CHECK: [[CATCHSWITCH:%.+]] = catchswitch within none
|
|
// CHECK: [[CATCHPAD:%.+]] = catchpad within [[CATCHSWITCH]]
|
|
// CHECK: call void @__kmpc_critical(%struct.ident_t* {{.*}}@1, i32 [[GID:%.+]],
|
|
// CHECK: invoke void @{{.+}}bar
|
|
// CHECK: call void @__kmpc_end_critical(%struct.ident_t* {{.*}}@1, i32 [[GID]],
|
|
// CHECK: catchret from [[CATCHPAD]] to
|
|
// CHECK: cleanuppad within [[CATCHPAD]] []
|
|
// CHECK-NEXT: call void @__kmpc_end_critical(%struct.ident_t* {{.*}}@1, i32 [[GID]],
|
|
// CHECK-NEXT: cleanupret from {{.*}} unwind label %[[CATCHTERM:[^ ]+]]
|
|
// CHECK: cleanuppad within none []
|
|
// CHECK-NEXT: call void @"?terminate@@YAXXZ"() #{{[0-9]+}} [ "funclet"(token %{{.*}}) ]
|
|
// CHECK-NEXT: unreachable
|
|
// CHECK: [[CATCHTERM]]
|
|
// CHECK-NEXT: cleanuppad within [[CATCHPAD]] []
|
|
// CHECK-NEXT: call void @"?terminate@@YAXXZ"() #{{[0-9]+}} [ "funclet"(token %{{.*}}) ]
|
|
// CHECK-NEXT: unreachable
|