forked from OSchip/llvm-project
[OPENMP50]Add codegen support for array shaping expression in depend
clauses. Implemented codegen for array shaping operation in depend clauses. The begin of the expression is the pointer itself, while the size of the dependence data is the mukltiplacation of all dimensions in the array shaping expression.
This commit is contained in:
parent
81194bfeea
commit
7842e7ebbf
|
@ -5363,11 +5363,29 @@ std::pair<llvm::Value *, Address> CGOpenMPRuntime::emitDependClause(
|
||||||
if (Dependencies[I].first == OMPC_DEPEND_depobj)
|
if (Dependencies[I].first == OMPC_DEPEND_depobj)
|
||||||
continue;
|
continue;
|
||||||
const Expr *E = Dependencies[I].second;
|
const Expr *E = Dependencies[I].second;
|
||||||
LValue Addr = CGF.EmitLValue(E);
|
const auto *OASE = dyn_cast<OMPArrayShapingExpr>(E);
|
||||||
|
LValue Addr;
|
||||||
|
if (OASE) {
|
||||||
|
const Expr *Base = OASE->getBase()->IgnoreParenImpCasts();
|
||||||
|
Addr =
|
||||||
|
CGF.EmitLoadOfPointerLValue(CGF.EmitLValue(Base).getAddress(CGF),
|
||||||
|
Base->getType()->castAs<PointerType>());
|
||||||
|
} else {
|
||||||
|
Addr = CGF.EmitLValue(E);
|
||||||
|
}
|
||||||
llvm::Value *Size;
|
llvm::Value *Size;
|
||||||
QualType Ty = E->getType();
|
QualType Ty = E->getType();
|
||||||
if (const auto *ASE =
|
if (OASE) {
|
||||||
dyn_cast<OMPArraySectionExpr>(E->IgnoreParenImpCasts())) {
|
Size = llvm::ConstantInt::get(CGF.SizeTy,/*V=*/1);
|
||||||
|
for (const Expr *SE : OASE->getDimensions()) {
|
||||||
|
llvm::Value *Sz = CGF.EmitScalarExpr(SE);
|
||||||
|
Sz = CGF.EmitScalarConversion(Sz, SE->getType(),
|
||||||
|
CGF.getContext().getSizeType(),
|
||||||
|
SE->getExprLoc());
|
||||||
|
Size = CGF.Builder.CreateNUWMul(Size, Sz);
|
||||||
|
}
|
||||||
|
} else if (const auto *ASE =
|
||||||
|
dyn_cast<OMPArraySectionExpr>(E->IgnoreParenImpCasts())) {
|
||||||
LValue UpAddrLVal =
|
LValue UpAddrLVal =
|
||||||
CGF.EmitOMPArraySectionExpr(ASE, /*IsLowerBound=*/false);
|
CGF.EmitOMPArraySectionExpr(ASE, /*IsLowerBound=*/false);
|
||||||
llvm::Value *UpAddr = CGF.Builder.CreateConstGEP1_32(
|
llvm::Value *UpAddr = CGF.Builder.CreateConstGEP1_32(
|
||||||
|
|
|
@ -17,17 +17,20 @@ void foo() {}
|
||||||
template <class T>
|
template <class T>
|
||||||
T tmain(T argc) {
|
T tmain(T argc) {
|
||||||
static T a;
|
static T a;
|
||||||
#pragma omp depobj(a) depend(in:argc)
|
int *b;
|
||||||
|
#pragma omp depobj(a) depend(in:argc, ([4][*b][4])b)
|
||||||
#pragma omp depobj(argc) destroy
|
#pragma omp depobj(argc) destroy
|
||||||
#pragma omp depobj(argc) update(inout)
|
#pragma omp depobj(argc) update(inout)
|
||||||
return argc;
|
return argc;
|
||||||
}
|
}
|
||||||
// CHECK: static T a;
|
// CHECK: static T a;
|
||||||
// CHECK-NEXT: #pragma omp depobj (a) depend(in : argc){{$}}
|
// CHECK-NEXT: int *b;
|
||||||
|
// CHECK-NEXT: #pragma omp depobj (a) depend(in : argc,([4][*b][4])b){{$}}
|
||||||
// CHECK-NEXT: #pragma omp depobj (argc) destroy{{$}}
|
// CHECK-NEXT: #pragma omp depobj (argc) destroy{{$}}
|
||||||
// CHECK-NEXT: #pragma omp depobj (argc) update(inout){{$}}
|
// CHECK-NEXT: #pragma omp depobj (argc) update(inout){{$}}
|
||||||
// CHECK: static void *a;
|
// CHECK: static void *a;
|
||||||
// CHECK-NEXT: #pragma omp depobj (a) depend(in : argc){{$}}
|
// CHECK-NEXT: int *b;
|
||||||
|
// CHECK-NEXT: #pragma omp depobj (a) depend(in : argc,([4][*b][4])b){{$}}
|
||||||
// CHECK-NEXT: #pragma omp depobj (argc) destroy{{$}}
|
// CHECK-NEXT: #pragma omp depobj (argc) destroy{{$}}
|
||||||
// CHECK-NEXT: #pragma omp depobj (argc) update(inout){{$}}
|
// CHECK-NEXT: #pragma omp depobj (argc) update(inout){{$}}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ template <class T>
|
||||||
T tmain(T argc) {
|
T tmain(T argc) {
|
||||||
static T a;
|
static T a;
|
||||||
void *argv;
|
void *argv;
|
||||||
#pragma omp depobj(a) depend(in:argv)
|
#pragma omp depobj(a) depend(in:argv, ([3][*(int*)argv][4])argv)
|
||||||
#pragma omp depobj(argc) destroy
|
#pragma omp depobj(argc) destroy
|
||||||
#pragma omp depobj(argc) update(inout)
|
#pragma omp depobj(argc) update(inout)
|
||||||
return argc;
|
return argc;
|
||||||
|
@ -87,19 +87,30 @@ int main(int argc, char **argv) {
|
||||||
// CHECK-LABEL: tmain
|
// CHECK-LABEL: tmain
|
||||||
// CHECK: [[ARGC_ADDR:%.+]] = alloca i8*,
|
// CHECK: [[ARGC_ADDR:%.+]] = alloca i8*,
|
||||||
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
|
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
|
||||||
// CHECK: [[DEP_ADDR_VOID:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 48, i8* null)
|
// CHECK: [[DEP_ADDR_VOID:%.+]] = call i8* @__kmpc_alloc(i32 [[GTID]], i64 72, i8* null)
|
||||||
// CHECK: [[DEP_ADDR:%.+]] = bitcast i8* [[DEP_ADDR_VOID]] to [2 x %struct.kmp_depend_info]*
|
// CHECK: [[DEP_ADDR:%.+]] = bitcast i8* [[DEP_ADDR_VOID]] to [3 x %struct.kmp_depend_info]*
|
||||||
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0
|
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||||
// CHECK: [[SZ_BASE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
// CHECK: [[SZ_BASE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||||
// CHECK: store i64 1, i64* [[SZ_BASE]],
|
// CHECK: store i64 2, i64* [[SZ_BASE]],
|
||||||
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1
|
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1
|
||||||
// CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
// CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||||
// CHECK: store i64 %{{.+}}, i64* [[ADDR]],
|
// CHECK: store i64 %{{.+}}, i64* [[ADDR]],
|
||||||
// CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1
|
// CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1
|
||||||
// CHECK: store i64 8, i64* [[SZ_ADDR]],
|
// CHECK: store i64 8, i64* [[SZ_ADDR]],
|
||||||
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2
|
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2
|
||||||
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||||
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1
|
// CHECK: [[SHAPE_ADDR:%.+]] = load i8*, i8** [[ARGV_ADDR:%.+]],
|
||||||
|
// CHECK: [[SZ1:%.+]] = mul nuw i64 3, %{{.+}}
|
||||||
|
// CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], 4
|
||||||
|
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 2
|
||||||
|
// CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||||
|
// CHECK: [[SHAPE:%.+]] = ptrtoint i8* [[SHAPE_ADDR]] to i64
|
||||||
|
// CHECK: store i64 [[SHAPE]], i64* [[ADDR]],
|
||||||
|
// CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1
|
||||||
|
// CHECK: store i64 [[SZ]], i64* [[SZ_ADDR]],
|
||||||
|
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2
|
||||||
|
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||||
|
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 1
|
||||||
// CHECK: [[DEP:%.+]] = bitcast %struct.kmp_depend_info* [[BASE_ADDR]] to i8*
|
// CHECK: [[DEP:%.+]] = bitcast %struct.kmp_depend_info* [[BASE_ADDR]] to i8*
|
||||||
// CHECK: store i8* [[DEP]], i8** [[TMAIN_A]],
|
// CHECK: store i8* [[DEP]], i8** [[TMAIN_A]],
|
||||||
// CHECK: [[ARGC:%.+]] = load i8*, i8** [[ARGC_ADDR]],
|
// CHECK: [[ARGC:%.+]] = load i8*, i8** [[ARGC_ADDR]],
|
||||||
|
|
|
@ -19,7 +19,7 @@ void foo();
|
||||||
int main() {
|
int main() {
|
||||||
omp_depend_t d, x;
|
omp_depend_t d, x;
|
||||||
omp_event_handle_t evt;
|
omp_event_handle_t evt;
|
||||||
int a;
|
int a, *b;
|
||||||
// CHECK: [[D_ADDR:%.+]] = alloca i8*,
|
// CHECK: [[D_ADDR:%.+]] = alloca i8*,
|
||||||
// CHECK: [[X_ADDR:%.+]] = alloca i8*,
|
// CHECK: [[X_ADDR:%.+]] = alloca i8*,
|
||||||
// CHECK: [[EVT_ADDR:%.+]] = alloca i64,
|
// CHECK: [[EVT_ADDR:%.+]] = alloca i64,
|
||||||
|
@ -42,7 +42,7 @@ int main() {
|
||||||
// CHECK: [[X_DEP_BASE_SIZE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[X_DEP_BASE]], i{{.+}} 0, i{{.+}} 0
|
// CHECK: [[X_DEP_BASE_SIZE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[X_DEP_BASE]], i{{.+}} 0, i{{.+}} 0
|
||||||
// CHECK: [[SIZE2:%.+]] = load i64, i64* [[X_DEP_BASE_SIZE]],
|
// CHECK: [[SIZE2:%.+]] = load i64, i64* [[X_DEP_BASE_SIZE]],
|
||||||
// CHECK: [[SIZE3:%.+]] = add nuw i64 [[SIZE]], [[SIZE2]]
|
// CHECK: [[SIZE3:%.+]] = add nuw i64 [[SIZE]], [[SIZE2]]
|
||||||
// CHECK: [[SIZE:%.+]] = add nuw i64 [[SIZE3]], 1
|
// CHECK: [[SIZE:%.+]] = add nuw i64 [[SIZE3]], 2
|
||||||
// CHECK: [[SIZE32:%.+]] = trunc i64 [[SIZE]] to i32
|
// CHECK: [[SIZE32:%.+]] = trunc i64 [[SIZE]] to i32
|
||||||
// CHECK: [[SIZE64:%.+]] = zext i32 [[SIZE32]] to i64
|
// CHECK: [[SIZE64:%.+]] = zext i32 [[SIZE32]] to i64
|
||||||
// CHECK: [[SV:%.+]] = call i8* @llvm.stacksave()
|
// CHECK: [[SV:%.+]] = call i8* @llvm.stacksave()
|
||||||
|
@ -56,11 +56,26 @@ int main() {
|
||||||
// CHECK: store i64 4, i64* [[SIZE_ADDR]],
|
// CHECK: store i64 4, i64* [[SIZE_ADDR]],
|
||||||
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 2
|
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 2
|
||||||
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||||
// CHECK: [[VLA_D:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 1
|
// CHECK: [[B_ADDR:%.+]] = load i32*, i32** %{{.+}},
|
||||||
|
// CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
|
||||||
|
// CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64
|
||||||
|
// CHECK: [[SZ1:%.+]] = mul nuw i64 3, [[A_CAST]]
|
||||||
|
// CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
|
||||||
|
// CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64
|
||||||
|
// CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], [[A_CAST]]
|
||||||
|
// CHECK: [[VLA1:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 1
|
||||||
|
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 0
|
||||||
|
// CHECK: [[B_ADDR_CAST:%.+]] = ptrtoint i32* [[B_ADDR]] to i64
|
||||||
|
// CHECK: store i64 [[B_ADDR_CAST]], i64* [[BASE_ADDR]],
|
||||||
|
// CHECK: [[SIZE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 1
|
||||||
|
// CHECK: store i64 [[SZ]], i64* [[SIZE_ADDR]],
|
||||||
|
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 2
|
||||||
|
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||||
|
// CHECK: [[VLA_D:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 2
|
||||||
// CHECK: [[D_SIZE:%.+]] = mul nuw i64 24, [[SIZE1]]
|
// CHECK: [[D_SIZE:%.+]] = mul nuw i64 24, [[SIZE1]]
|
||||||
// CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_D]] to i8*
|
// CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_D]] to i8*
|
||||||
// CHECK: [[SRC:%.+]] = bitcast %struct.kmp_depend_info* [[D_DEP]] to i8*
|
// CHECK: [[SRC:%.+]] = bitcast %struct.kmp_depend_info* [[D_DEP]] to i8*
|
||||||
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[DEST]], i8* align 8 [[SRC]], i64 [[D_SIZE]], i1 false)
|
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align {{.+}} [[DEST]], i8* align {{.+}} [[SRC]], i64 [[D_SIZE]], i1 false)
|
||||||
// CHECK: [[VLA_X:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA_D]], i64 [[SIZE1]]
|
// CHECK: [[VLA_X:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA_D]], i64 [[SIZE1]]
|
||||||
// CHECK: [[X_SIZE:%.+]] = mul nuw i64 24, [[SIZE2]]
|
// CHECK: [[X_SIZE:%.+]] = mul nuw i64 24, [[SIZE2]]
|
||||||
// CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_X]] to i8*
|
// CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_X]] to i8*
|
||||||
|
@ -70,7 +85,7 @@ int main() {
|
||||||
// CHECK: call i32 @__kmpc_omp_task_with_deps(%struct.ident_t* @{{.+}}, i32 [[GTID]], i8* [[ALLOC]], i32 [[SIZE32]], i8* [[BC]], i32 0, i8* null)
|
// CHECK: call i32 @__kmpc_omp_task_with_deps(%struct.ident_t* @{{.+}}, i32 [[GTID]], i8* [[ALLOC]], i32 [[SIZE32]], i8* [[BC]], i32 0, i8* null)
|
||||||
// CHECK: [[SV:%.+]] = load i8*, i8** [[SV_ADDR]],
|
// CHECK: [[SV:%.+]] = load i8*, i8** [[SV_ADDR]],
|
||||||
// CHECK: call void @llvm.stackrestore(i8* [[SV]])
|
// CHECK: call void @llvm.stackrestore(i8* [[SV]])
|
||||||
#pragma omp task depend(in: a) depend(depobj: d, x) detach(evt)
|
#pragma omp task depend(in: a, ([3][a][a])b) depend(depobj: d, x) detach(evt)
|
||||||
{
|
{
|
||||||
#pragma omp taskgroup
|
#pragma omp taskgroup
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue