forked from OSchip/llvm-project
[OPENMP] Improved code for generating debug info + generation of all OpenMP regions in termination scope
Patch adds proper generation of debug info for all OpenMP regions. Also, all OpenMP regions are generated in a termination scope, because standard does not allow to throw exceptions out of structured blocks, associated with the OpenMP regions Differential Revision: http://reviews.llvm.org/D7935 llvm-svn: 231757
This commit is contained in:
parent
81ad639ed3
commit
36bf011e83
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "CGOpenMPRuntime.h"
|
||||
#include "CodeGenFunction.h"
|
||||
#include "CGCleanup.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/StmtOpenMP.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
|
@ -1047,9 +1048,16 @@ InlinedOpenMPRegionRAII::InlinedOpenMPRegionRAII(
|
|||
CodeGenFunction &CGF, const OMPExecutableDirective &D)
|
||||
: CGF(CGF) {
|
||||
CGF.CapturedStmtInfo = new CGOpenMPInlinedRegionInfo(D, CGF.CapturedStmtInfo);
|
||||
// 1.2.2 OpenMP Language Terminology
|
||||
// Structured block - An executable statement with a single entry at the
|
||||
// top and a single exit at the bottom.
|
||||
// The point of exit cannot be a branch out of the structured block.
|
||||
// longjmp() and throw() must not violate the entry/exit criteria.
|
||||
CGF.EHStack.pushTerminate();
|
||||
}
|
||||
|
||||
InlinedOpenMPRegionRAII::~InlinedOpenMPRegionRAII() {
|
||||
CGF.EHStack.popTerminate();
|
||||
auto *OldCSI =
|
||||
cast<CGOpenMPInlinedRegionInfo>(CGF.CapturedStmtInfo)->getOldCSI();
|
||||
delete CGF.CapturedStmtInfo;
|
||||
|
|
|
@ -2186,6 +2186,8 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedStmt &S) {
|
|||
llvm::Function::Create(FuncLLVMTy, llvm::GlobalValue::InternalLinkage,
|
||||
CapturedStmtInfo->getHelperName(), &CGM.getModule());
|
||||
CGM.SetInternalFunctionAttributes(CD, F, FuncInfo);
|
||||
if (CD->isNothrow())
|
||||
F->addFnAttr(llvm::Attribute::NoUnwind);
|
||||
|
||||
// Generate the function.
|
||||
StartFunction(CD, Ctx.VoidTy, F, FuncInfo, Args,
|
||||
|
|
|
@ -23,6 +23,20 @@ using namespace CodeGen;
|
|||
//===----------------------------------------------------------------------===//
|
||||
// OpenMP Directive Emission
|
||||
//===----------------------------------------------------------------------===//
|
||||
namespace {
|
||||
/// \brief RAII for inlined OpenMP regions (like 'omp for', 'omp simd', 'omp
|
||||
/// critical' etc.). Helps to generate proper debug info and provides correct
|
||||
/// code generation for such constructs.
|
||||
class InlinedOpenMPRegionScopeRAII {
|
||||
InlinedOpenMPRegionRAII Region;
|
||||
CodeGenFunction::LexicalScope DirectiveScope;
|
||||
|
||||
public:
|
||||
InlinedOpenMPRegionScopeRAII(CodeGenFunction &CGF,
|
||||
const OMPExecutableDirective &D)
|
||||
: Region(CGF, D), DirectiveScope(CGF, D.getSourceRange()) {}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
/// \brief Emits code for OpenMP 'if' clause using specified \a CodeGen
|
||||
/// function. Here is the logic:
|
||||
|
@ -417,12 +431,7 @@ void CodeGenFunction::EmitOMPSimdDirective(const OMPSimdDirective &S) {
|
|||
}
|
||||
}
|
||||
|
||||
InlinedOpenMPRegionRAII Region(*this, S);
|
||||
RunCleanupsScope DirectiveScope(*this);
|
||||
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin());
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
|
||||
// Emit the loop iteration variable.
|
||||
const Expr *IVExpr = S.getIterationVariable();
|
||||
|
@ -466,9 +475,6 @@ void CodeGenFunction::EmitOMPSimdDirective(const OMPSimdDirective &S) {
|
|||
}
|
||||
EmitOMPSimdFinal(S);
|
||||
}
|
||||
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPForOuterLoop(OpenMPScheduleClauseKind ScheduleKind,
|
||||
|
@ -650,20 +656,13 @@ void CodeGenFunction::EmitOMPWorksharingLoop(const OMPLoopDirective &S) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPForDirective(const OMPForDirective &S) {
|
||||
InlinedOpenMPRegionRAII Region(*this, S);
|
||||
RunCleanupsScope DirectiveScope(*this);
|
||||
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin());
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
|
||||
EmitOMPWorksharingLoop(S);
|
||||
|
||||
// Emit an implicit barrier at the end.
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(),
|
||||
/*IsExplicit*/ false);
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPForSimdDirective(const OMPForSimdDirective &) {
|
||||
|
@ -680,8 +679,7 @@ void CodeGenFunction::EmitOMPSectionDirective(const OMPSectionDirective &) {
|
|||
|
||||
void CodeGenFunction::EmitOMPSingleDirective(const OMPSingleDirective &S) {
|
||||
CGM.getOpenMPRuntime().emitSingleRegion(*this, [&]() -> void {
|
||||
InlinedOpenMPRegionRAII Region(*this, S);
|
||||
RunCleanupsScope Scope(*this);
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
EnsureInsertPoint();
|
||||
}, S.getLocStart());
|
||||
|
@ -689,8 +687,7 @@ void CodeGenFunction::EmitOMPSingleDirective(const OMPSingleDirective &S) {
|
|||
|
||||
void CodeGenFunction::EmitOMPMasterDirective(const OMPMasterDirective &S) {
|
||||
CGM.getOpenMPRuntime().emitMasterRegion(*this, [&]() -> void {
|
||||
InlinedOpenMPRegionRAII Region(*this, S);
|
||||
RunCleanupsScope Scope(*this);
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
EnsureInsertPoint();
|
||||
}, S.getLocStart());
|
||||
|
@ -699,8 +696,7 @@ void CodeGenFunction::EmitOMPMasterDirective(const OMPMasterDirective &S) {
|
|||
void CodeGenFunction::EmitOMPCriticalDirective(const OMPCriticalDirective &S) {
|
||||
CGM.getOpenMPRuntime().emitCriticalRegion(
|
||||
*this, S.getDirectiveName().getAsString(), [&]() -> void {
|
||||
InlinedOpenMPRegionRAII Region(*this, S);
|
||||
RunCleanupsScope Scope(*this);
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
EnsureInsertPoint();
|
||||
}, S.getLocStart());
|
||||
|
@ -898,6 +894,7 @@ void CodeGenFunction::EmitOMPAtomicDirective(const OMPAtomicDirective &S) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
InlinedOpenMPRegionScopeRAII Region(*this, S);
|
||||
EmitOMPAtomicExpr(*this, Kind, IsSeqCst, S.getX(), S.getV(), S.getExpr(),
|
||||
S.getLocStart());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
// expected-no-diagnostics
|
||||
|
||||
int a;
|
||||
int &foo() { return a; }
|
||||
|
||||
// TERM_DEBUG-LABEL: parallel_atomic
|
||||
void parallel_atomic() {
|
||||
#pragma omp parallel
|
||||
{
|
||||
#pragma omp atomic read
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: invoke {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG: load atomic i32, i32* @{{.+}} monotonic, {{.*}}!dbg [[READ_LOC:![0-9]+]]
|
||||
foo() = a;
|
||||
#pragma omp atomic write
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: invoke {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: store atomic i32 {{%.+}}, i32* @{{.+}} monotonic, {{.*}}!dbg [[WRITE_LOC:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
a = foo();
|
||||
}
|
||||
}
|
||||
// TERM_DEBUG-DAG: [[READ_LOC]] = !MDLocation(line: 11,
|
||||
// TERM_DEBUG-DAG: [[WRITE_LOC]] = !MDLocation(line: 17,
|
|
@ -1,6 +1,7 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -15,6 +16,7 @@
|
|||
void foo() {}
|
||||
|
||||
// CHECK-LABEL: @main
|
||||
// TERM_DEBUG-LABEL: @main
|
||||
int main() {
|
||||
// CHECK: [[A_ADDR:%.+]] = alloca i8
|
||||
char a;
|
||||
|
@ -26,8 +28,8 @@ int main() {
|
|||
#pragma omp critical
|
||||
a = 2;
|
||||
// CHECK: call void @__kmpc_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]])
|
||||
// CHECK-NEXT: call void [[FOO]]()
|
||||
// CHECK-NEXT: call void @__kmpc_end_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]])
|
||||
// CHECK-NEXT: invoke void [[FOO]]()
|
||||
// CHECK: call void @__kmpc_end_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]])
|
||||
#pragma omp critical(the_name)
|
||||
foo();
|
||||
// CHECK-NOT: call void @__kmpc_critical
|
||||
|
@ -35,13 +37,22 @@ int main() {
|
|||
return a;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: parallel_critical
|
||||
void parallel_critical(float *a) {
|
||||
// CHECK-LABEL: parallel_critical
|
||||
// TERM_DEBUG-LABEL: parallel_critical
|
||||
void parallel_critical() {
|
||||
#pragma omp parallel
|
||||
#pragma omp critical
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
for (unsigned i = 131071; i <= 2147483647; i += 127)
|
||||
a[i] += i;
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_critical({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_end_critical({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
foo();
|
||||
}
|
||||
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !MDLocation(line: 44,
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !MDLocation(line: 44,
|
||||
#endif
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -g -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
//
|
||||
// expected-no-diagnostics
|
||||
#ifndef HEADER
|
||||
|
@ -146,13 +147,28 @@ void static_chunked(float *a, float *b, float *c, float *d) {
|
|||
// CHECK: ret void
|
||||
}
|
||||
|
||||
// TERM_DEBUG-LABEL: foo
|
||||
int foo() {return 0;};
|
||||
|
||||
// TERM_DEBUG-LABEL: parallel_for
|
||||
void parallel_for(float *a) {
|
||||
#pragma omp parallel
|
||||
#pragma omp for schedule(static, 5)
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_for_static_init_4u({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke i32 {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_for_static_fini({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: call {{.+}} @__kmpc_cancel_barrier({{.+}}), !dbg [[DBG_LOC_CANCEL:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
for (unsigned i = 131071; i <= 2147483647; i += 127)
|
||||
a[i] += i;
|
||||
a[i] += foo();
|
||||
}
|
||||
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !MDLocation(line: 156,
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !MDLocation(line: 156,
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_CANCEL]] = !MDLocation(line: 156,
|
||||
#endif // HEADER
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -13,6 +14,7 @@
|
|||
void foo() {}
|
||||
|
||||
// CHECK-LABEL: @main
|
||||
// TERM_DEBUG-LABEL: @main
|
||||
int main() {
|
||||
// CHECK: [[A_ADDR:%.+]] = alloca i8
|
||||
char a;
|
||||
|
@ -32,8 +34,8 @@ int main() {
|
|||
// CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
|
||||
// CHECK: [[THEN]]
|
||||
// CHECK-NEXT: call void [[FOO]]()
|
||||
// CHECK-NEXT: call void @__kmpc_end_master([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: invoke void [[FOO]]()
|
||||
// CHECK: call void @__kmpc_end_master([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: br label {{%?}}[[EXIT]]
|
||||
// CHECK: [[EXIT]]
|
||||
#pragma omp master
|
||||
|
@ -43,13 +45,23 @@ int main() {
|
|||
return a;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: parallel_master
|
||||
void parallel_master(float *a) {
|
||||
// CHECK-LABEL: parallel_master
|
||||
// TERM_DEBUG-LABEL: parallel_master
|
||||
void parallel_master() {
|
||||
#pragma omp parallel
|
||||
#pragma omp master
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
for (unsigned i = 131071; i <= 2147483647; i += 127)
|
||||
a[i] += i;
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call i32 @__kmpc_master({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_end_master({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
foo();
|
||||
}
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !MDLocation(line: 52,
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !MDLocation(line: 52,
|
||||
|
||||
#endif
|
||||
|
|
|
@ -62,6 +62,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK-DEBUG-NEXT: }
|
||||
|
||||
// CHECK-LABEL: define internal void @.omp_outlined.(i32* %.global_tid., i32* %.bound_tid., %struct.anon* %__context)
|
||||
// CHECK: #[[FN_ATTRS:[0-9]+]]
|
||||
// CHECK: [[CONTEXT_ADDR:%.+]] = alloca %struct.anon*
|
||||
// CHECK: store %struct.anon* %__context, %struct.anon** [[CONTEXT_ADDR]]
|
||||
// CHECK: [[CONTEXT_PTR:%.+]] = load %struct.anon*, %struct.anon** [[CONTEXT_ADDR]]
|
||||
|
@ -74,6 +75,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK-NEXT: unreachable
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-DEBUG-LABEL: define internal void @.omp_outlined.(i32* %.global_tid., i32* %.bound_tid., %struct.anon* %__context)
|
||||
// CHECK-DEBUG: #[[FN_ATTRS:[0-9]+]]
|
||||
// CHECK-DEBUG: [[CONTEXT_ADDR:%.+]] = alloca %struct.anon*
|
||||
// CHECK-DEBUG: store %struct.anon* %__context, %struct.anon** [[CONTEXT_ADDR]]
|
||||
// CHECK-DEBUG: [[CONTEXT_PTR:%.+]] = load %struct.anon*, %struct.anon** [[CONTEXT_ADDR]]
|
||||
|
@ -142,4 +144,7 @@ int main (int argc, char **argv) {
|
|||
// CHECK: define linkonce_odr void [[FOO1]](i8** %argc)
|
||||
// CHECK-DEBUG: define linkonce_odr void [[FOO1]](i8** %argc)
|
||||
|
||||
// CHECK: attributes #[[FN_ATTRS]] = {{.+}} nounwind
|
||||
// CHECK-DEBUG: attributes #[[FN_ATTRS]] = {{.+}} nounwind
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -g -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
//
|
||||
// expected-no-diagnostics
|
||||
#ifndef HEADER
|
||||
|
@ -261,8 +262,8 @@ void iter_simple(IterDouble ia, IterDouble ib, IterDouble ic) {
|
|||
//
|
||||
// CHECK: store i32 0, i32* [[IT_OMP_IV:%[^,]+]]
|
||||
// Calculate number of iterations before the loop body.
|
||||
// CHECK: [[DIFF1:%.+]] = call {{.*}}i32 @{{.*}}IterDouble{{.*}}
|
||||
// CHECK-NEXT: [[DIFF2:%.+]] = sub nsw i32 [[DIFF1]], 1
|
||||
// CHECK: [[DIFF1:%.+]] = invoke {{.*}}i32 @{{.*}}IterDouble{{.*}}
|
||||
// CHECK: [[DIFF2:%.+]] = sub nsw i32 [[DIFF1]], 1
|
||||
// CHECK-NEXT: [[DIFF3:%.+]] = add nsw i32 [[DIFF2]], 1
|
||||
// CHECK-NEXT: [[DIFF4:%.+]] = sdiv i32 [[DIFF3]], 1
|
||||
// CHECK-NEXT: [[DIFF5:%.+]] = sub nsw i32 [[DIFF4]], 1
|
||||
|
@ -279,12 +280,12 @@ void iter_simple(IterDouble ia, IterDouble ib, IterDouble ic) {
|
|||
// Start of body: calculate i from index:
|
||||
// CHECK: [[IV1:%.+]] = load i32, i32* [[IT_OMP_IV]]{{.+}}!llvm.mem.parallel_loop_access ![[ITER_LOOP_ID]]
|
||||
// Call of operator+ (i, IV).
|
||||
// CHECK: {{%.+}} = call {{.+}} @{{.*}}IterDouble{{.*}}!llvm.mem.parallel_loop_access ![[ITER_LOOP_ID]]
|
||||
// CHECK: {{%.+}} = invoke {{.+}} @{{.*}}IterDouble{{.*}}
|
||||
// ... loop body ...
|
||||
*i = *ic * 0.5;
|
||||
// Float multiply and save result.
|
||||
// CHECK: [[MULR:%.+]] = fmul double {{%.+}}, 5.000000e-01
|
||||
// CHECK-NEXT: call {{.+}} @{{.*}}IterDouble{{.*}}
|
||||
// CHECK-NEXT: invoke {{.+}} @{{.*}}IterDouble{{.*}}
|
||||
// CHECK: store double [[MULR:%.+]], double* [[RESULT_ADDR:%.+]], !llvm.mem.parallel_loop_access ![[ITER_LOOP_ID]]
|
||||
++ic;
|
||||
//
|
||||
|
@ -403,13 +404,23 @@ void widened(float *a, float *b, float *c, float *d) {
|
|||
// CHECK: ret void
|
||||
}
|
||||
|
||||
// TERM_DEBUG-LABEL: bar
|
||||
int bar() {return 0;};
|
||||
|
||||
// TERM_DEBUG-LABEL: parallel_simd
|
||||
void parallel_simd(float *a) {
|
||||
#pragma omp parallel
|
||||
#pragma omp simd
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: invoke i32 {{.*}}bar{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
for (unsigned i = 131071; i <= 2147483647; i += 127)
|
||||
a[i] += i;
|
||||
a[i] += bar();
|
||||
}
|
||||
|
||||
// TERM_DEBUG: !{{[0-9]+}} = !MDLocation(line: 413,
|
||||
#endif // HEADER
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp=libiomp5 -fexceptions -fcxx-exceptions -gline-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
|
@ -13,6 +14,7 @@
|
|||
void foo() {}
|
||||
|
||||
// CHECK-LABEL: @main
|
||||
// TERM_DEBUG-LABEL: @main
|
||||
int main() {
|
||||
// CHECK: [[A_ADDR:%.+]] = alloca i8
|
||||
char a;
|
||||
|
@ -32,8 +34,8 @@ int main() {
|
|||
// CHECK-NEXT: [[IS_SINGLE:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK-NEXT: br i1 [[IS_SINGLE]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
|
||||
// CHECK: [[THEN]]
|
||||
// CHECK-NEXT: call void [[FOO]]()
|
||||
// CHECK-NEXT: call void @__kmpc_end_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: invoke void [[FOO]]()
|
||||
// CHECK: call void @__kmpc_end_single([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
|
||||
// CHECK-NEXT: br label {{%?}}[[EXIT]]
|
||||
// CHECK: [[EXIT]]
|
||||
#pragma omp single
|
||||
|
@ -43,13 +45,23 @@ int main() {
|
|||
return a;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: parallel_single
|
||||
void parallel_single(float *a) {
|
||||
// CHECK-LABEL: parallel_single
|
||||
// TERM_DEBUG-LABEL: parallel_single
|
||||
void parallel_single() {
|
||||
#pragma omp parallel
|
||||
#pragma omp single
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
for (unsigned i = 131071; i <= 2147483647; i += 127)
|
||||
a[i] += i;
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call i32 @__kmpc_single({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_end_single({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
|
||||
// TERM_DEBUG: [[TERM_LPAD]]:
|
||||
// TERM_DEBUG: call void @__clang_call_terminate
|
||||
// TERM_DEBUG: unreachable
|
||||
foo();
|
||||
}
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_START]] = !MDLocation(line: 52,
|
||||
// TERM_DEBUG-DAG: [[DBG_LOC_END]] = !MDLocation(line: 52,
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue