Skip to content

Commit 2908fc0

Browse files
committed
[OpenMP] Use irbuilder as default for masked and master construct
Use irbuilder as default and remove redundant Clang codegen for masked construct and master construct. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D100874
1 parent 6da3503 commit 2908fc0

File tree

3 files changed

+111
-146
lines changed

3 files changed

+111
-146
lines changed

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 35 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4030,82 +4030,56 @@ static void emitMaster(CodeGenFunction &CGF, const OMPExecutableDirective &S) {
40304030
}
40314031

40324032
void CodeGenFunction::EmitOMPMasterDirective(const OMPMasterDirective &S) {
4033-
if (CGM.getLangOpts().OpenMPIRBuilder) {
4034-
llvm::OpenMPIRBuilder &OMPBuilder = CGM.getOpenMPRuntime().getOMPBuilder();
4035-
using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
4036-
4037-
const Stmt *MasterRegionBodyStmt = S.getAssociatedStmt();
4033+
llvm::OpenMPIRBuilder &OMPBuilder = CGM.getOpenMPRuntime().getOMPBuilder();
4034+
using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
40384035

4039-
auto FiniCB = [this](InsertPointTy IP) {
4040-
OMPBuilderCBHelpers::FinalizeOMPRegion(*this, IP);
4041-
};
4036+
const Stmt *MasterRegionBodyStmt = S.getAssociatedStmt();
40424037

4043-
auto BodyGenCB = [MasterRegionBodyStmt, this](InsertPointTy AllocaIP,
4044-
InsertPointTy CodeGenIP,
4045-
llvm::BasicBlock &FiniBB) {
4046-
OMPBuilderCBHelpers::InlinedRegionBodyRAII IRB(*this, AllocaIP, FiniBB);
4047-
OMPBuilderCBHelpers::EmitOMPRegionBody(*this, MasterRegionBodyStmt,
4048-
CodeGenIP, FiniBB);
4049-
};
4038+
auto FiniCB = [this](InsertPointTy IP) {
4039+
OMPBuilderCBHelpers::FinalizeOMPRegion(*this, IP);
4040+
};
40504041

4051-
LexicalScope Scope(*this, S.getSourceRange());
4052-
EmitStopPoint(&S);
4053-
Builder.restoreIP(OMPBuilder.createMaster(Builder, BodyGenCB, FiniCB));
4042+
auto BodyGenCB = [MasterRegionBodyStmt, this](InsertPointTy AllocaIP,
4043+
InsertPointTy CodeGenIP,
4044+
llvm::BasicBlock &FiniBB) {
4045+
OMPBuilderCBHelpers::InlinedRegionBodyRAII IRB(*this, AllocaIP, FiniBB);
4046+
OMPBuilderCBHelpers::EmitOMPRegionBody(*this, MasterRegionBodyStmt,
4047+
CodeGenIP, FiniBB);
4048+
};
40544049

4055-
return;
4056-
}
40574050
LexicalScope Scope(*this, S.getSourceRange());
40584051
EmitStopPoint(&S);
4059-
emitMaster(*this, S);
4060-
}
4061-
4062-
static void emitMasked(CodeGenFunction &CGF, const OMPExecutableDirective &S) {
4063-
auto &&CodeGen = [&S](CodeGenFunction &CGF, PrePostActionTy &Action) {
4064-
Action.Enter(CGF);
4065-
CGF.EmitStmt(S.getRawStmt());
4066-
};
4067-
Expr *Filter = nullptr;
4068-
if (const auto *FilterClause = S.getSingleClause<OMPFilterClause>())
4069-
Filter = FilterClause->getThreadID();
4070-
CGF.CGM.getOpenMPRuntime().emitMaskedRegion(CGF, CodeGen, S.getBeginLoc(),
4071-
Filter);
4052+
Builder.restoreIP(OMPBuilder.createMaster(Builder, BodyGenCB, FiniCB));
40724053
}
40734054

40744055
void CodeGenFunction::EmitOMPMaskedDirective(const OMPMaskedDirective &S) {
4075-
if (CGM.getLangOpts().OpenMPIRBuilder) {
4076-
llvm::OpenMPIRBuilder &OMPBuilder = CGM.getOpenMPRuntime().getOMPBuilder();
4077-
using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
4078-
4079-
const Stmt *MaskedRegionBodyStmt = S.getAssociatedStmt();
4080-
const Expr *Filter = nullptr;
4081-
if (const auto *FilterClause = S.getSingleClause<OMPFilterClause>())
4082-
Filter = FilterClause->getThreadID();
4083-
llvm::Value *FilterVal = Filter
4084-
? EmitScalarExpr(Filter, CGM.Int32Ty)
4085-
: llvm::ConstantInt::get(CGM.Int32Ty, /*V=*/0);
4056+
llvm::OpenMPIRBuilder &OMPBuilder = CGM.getOpenMPRuntime().getOMPBuilder();
4057+
using InsertPointTy = llvm::OpenMPIRBuilder::InsertPointTy;
40864058

4087-
auto FiniCB = [this](InsertPointTy IP) {
4088-
OMPBuilderCBHelpers::FinalizeOMPRegion(*this, IP);
4089-
};
4059+
const Stmt *MaskedRegionBodyStmt = S.getAssociatedStmt();
4060+
const Expr *Filter = nullptr;
4061+
if (const auto *FilterClause = S.getSingleClause<OMPFilterClause>())
4062+
Filter = FilterClause->getThreadID();
4063+
llvm::Value *FilterVal = Filter
4064+
? EmitScalarExpr(Filter, CGM.Int32Ty)
4065+
: llvm::ConstantInt::get(CGM.Int32Ty, /*V=*/0);
40904066

4091-
auto BodyGenCB = [MaskedRegionBodyStmt, this](InsertPointTy AllocaIP,
4092-
InsertPointTy CodeGenIP,
4093-
llvm::BasicBlock &FiniBB) {
4094-
OMPBuilderCBHelpers::InlinedRegionBodyRAII IRB(*this, AllocaIP, FiniBB);
4095-
OMPBuilderCBHelpers::EmitOMPRegionBody(*this, MaskedRegionBodyStmt,
4096-
CodeGenIP, FiniBB);
4097-
};
4067+
auto FiniCB = [this](InsertPointTy IP) {
4068+
OMPBuilderCBHelpers::FinalizeOMPRegion(*this, IP);
4069+
};
40984070

4099-
LexicalScope Scope(*this, S.getSourceRange());
4100-
EmitStopPoint(&S);
4101-
Builder.restoreIP(
4102-
OMPBuilder.createMasked(Builder, BodyGenCB, FiniCB, FilterVal));
4071+
auto BodyGenCB = [MaskedRegionBodyStmt, this](InsertPointTy AllocaIP,
4072+
InsertPointTy CodeGenIP,
4073+
llvm::BasicBlock &FiniBB) {
4074+
OMPBuilderCBHelpers::InlinedRegionBodyRAII IRB(*this, AllocaIP, FiniBB);
4075+
OMPBuilderCBHelpers::EmitOMPRegionBody(*this, MaskedRegionBodyStmt,
4076+
CodeGenIP, FiniBB);
4077+
};
41034078

4104-
return;
4105-
}
41064079
LexicalScope Scope(*this, S.getSourceRange());
41074080
EmitStopPoint(&S);
4108-
emitMasked(*this, S);
4081+
Builder.restoreIP(
4082+
OMPBuilder.createMasked(Builder, BodyGenCB, FiniCB, FilterVal));
41094083
}
41104084

41114085
void CodeGenFunction::EmitOMPCriticalDirective(const OMPCriticalDirective &S) {

clang/test/OpenMP/masked_codegen.cpp

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,NORMAL
1+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
22
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
3-
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,NORMAL
3+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
44
// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=51 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
5-
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER
6-
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
7-
// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER
85

96
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
107
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
@@ -15,68 +12,66 @@
1512
#ifndef HEADER
1613
#define HEADER
1714

18-
// ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* }
15+
// CHECK: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* }
1916

20-
// ALL: define {{.*}}void [[FOO:@.+]]()
17+
// CHECK: define {{.*}}void [[FOO:@.+]]()
2118

2219
void foo() { extern void mayThrow(); mayThrow(); }
2320

24-
// ALL-LABEL: @main
21+
// CHECK-LABEL: @main
2522
// TERM_DEBUG-LABEL: @main
2623
int main() {
27-
// ALL: [[A_ADDR:%.+]] = alloca i8
24+
// CHECK: [[A_ADDR:%.+]] = alloca i8
2825
char a;
2926

30-
// ALL: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
31-
// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 0)
32-
// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
33-
// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
34-
// ALL: [[THEN]]
35-
// ALL-NEXT: store i8 2, i8* [[A_ADDR]]
36-
// ALL-NEXT: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
37-
// ALL-NEXT: br label {{%?}}[[EXIT]]
38-
// ALL: [[EXIT]]
27+
// CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
28+
// CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 0)
29+
// CHECK-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
30+
// CHECK-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
31+
// CHECK: [[THEN]]
32+
// CHECK-NEXT: store i8 2, i8* [[A_ADDR]]
33+
// CHECK-NEXT: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
34+
// CHECK-NEXT: br label {{%?}}[[EXIT]]
35+
// CHECK: [[EXIT]]
3936
#pragma omp masked
4037
a = 2;
41-
// IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
42-
// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 2)
43-
// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
44-
// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
45-
// ALL: [[THEN]]
46-
// IRBUILDER-NEXT: call {{.*}}void [[FOO]]()
47-
// NORMAL-NEXT: invoke {{.*}}void [[FOO]]()
48-
// ALL: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
49-
// ALL-NEXT: br label {{%?}}[[EXIT]]
50-
// ALL: [[EXIT]]
38+
// CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
39+
// CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 2)
40+
// CHECK-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
41+
// CHECK-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
42+
// CHECK: [[THEN]]
43+
// CHECK-NEXT: call {{.*}}void [[FOO]]()
44+
// CHECK: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
45+
// CHECK-NEXT: br label {{%?}}[[EXIT]]
46+
// CHECK: [[EXIT]]
5147
#pragma omp masked filter(2)
5248
foo();
53-
// ALL: store i32 9, i32* [[X:.+]],
54-
// ALL: [[X_VAL:%.+]] = load i32, i32* [[X]]
55-
// IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
56-
// ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 [[X_VAL]])
57-
// ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
58-
// ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
59-
// ALL: [[THEN]]
60-
// IRBUILDER-NEXT: call {{.*}}void [[FOO]]()
61-
// NORMAL-NEXT: invoke {{.*}}void [[FOO]]()
62-
// ALL: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
63-
// ALL-NEXT: br label {{%?}}[[EXIT]]
64-
// ALL: [[EXIT]]
49+
// CHECK: store i32 9, i32* [[X:.+]],
50+
// CHECK: [[X_VAL:%.+]] = load i32, i32* [[X]]
51+
// CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
52+
// CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 [[X_VAL]])
53+
// CHECK-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
54+
// CHECK-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
55+
// CHECK: [[THEN]]
56+
// CHECK-NEXT: call {{.*}}void [[FOO]]()
57+
// CHECK: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
58+
// CHECK-NEXT: br label {{%?}}[[EXIT]]
59+
// CHECK: [[EXIT]]
6560
int x = 9;
6661
#pragma omp masked filter(x)
6762
foo();
68-
// ALL-NOT: call i32 @__kmpc_masked
69-
// ALL-NOT: call void @__kmpc_end_masked
63+
// CHECK-NOT: call i32 @__kmpc_masked
64+
// CHECK-NOT: call void @__kmpc_end_masked
7065
return a;
7166
}
7267

73-
// ALL-LABEL: lambda_masked
68+
// CHECK-LABEL: lambda_masked
7469
// TERM_DEBUG-LABEL: lambda_masked
7570
void lambda_masked(int a, int b) {
7671
auto l = [=]() {
7772
#pragma omp masked
7873
{
79-
// ALL: call i32 @__kmpc_masked(
74+
// CHECK: call i32 @__kmpc_masked(
8075
int c = a + b;
8176
}
8277
};
@@ -87,7 +82,7 @@ void lambda_masked(int a, int b) {
8782
#pragma omp parallel
8883
#pragma omp masked filter(1)
8984
{
90-
// ALL: call i32 @__kmpc_masked(
85+
// CHECK: call i32 @__kmpc_masked(
9186
int c = a + b;
9287
}
9388
};
@@ -99,20 +94,20 @@ void lambda_masked(int a, int b) {
9994
#pragma omp parallel
10095
#pragma omp masked filter(yy)
10196
{
102-
// ALL: call i32 @__kmpc_masked(
97+
// CHECK: call i32 @__kmpc_masked(
10398
int c = a + b;
10499
}
105100
};
106101

107102
l2(y);
108103
}
109104

110-
// ALL-LABEL: parallel_masked
105+
// CHECK-LABEL: parallel_masked
111106
// TERM_DEBUG-LABEL: parallel_masked
112107
void parallel_masked() {
113108
#pragma omp parallel
114109
#pragma omp masked filter(1)
115-
// TERM_DEBUG-NOT: __kmpc_global_thread_num
110+
// TERM_DEBUG: __kmpc_global_thread_num
116111
// TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
117112
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
118113
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
@@ -126,7 +121,7 @@ void parallel_masked() {
126121
int x;
127122
#pragma omp parallel
128123
#pragma omp masked filter(x)
129-
// TERM_DEBUG-NOT: __kmpc_global_thread_num
124+
// TERM_DEBUG: __kmpc_global_thread_num
130125
// TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
131126
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
132127
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],

0 commit comments

Comments
 (0)