Skip to content

Commit 851d349

Browse files
author
Raúl Peñacoba Veigas
committed
Fix dependencies over arrays of pointers. See more.
What it happens is that we stop walking up de subexprs when we find a pointer in consecutive array section expr. and subscript exprs, but we don't in between array section exprs. and subscript exprs. This case is: int *array[10]: in(array[2][3]) Closes llvm#160
1 parent 267c8b7 commit 851d349

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

clang/lib/CodeGen/CGOmpSsRuntime.cpp

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -411,22 +411,26 @@ class OSSExprInfoGathering
411411
// Get the inner expr
412412
const Expr *TmpE = E;
413413
// First come OSSArraySection
414+
bool FoundPointer = false;
414415
while (const OSSArraySectionExpr *ASE = dyn_cast<OSSArraySectionExpr>(TmpE->IgnoreParenImpCasts())) {
415416
// Stop in the innermost ArrayToPointerDecay
416417
TmpE = ASE->getBase();
417-
// If we see a Pointer we must to add one dimension and done
418+
// If we see a Pointer we must add one dimension and done
418419
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
419420
AddDimStartEnd();
421+
FoundPointer = true;
420422
break;
421423
}
422424
}
423-
while (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(TmpE->IgnoreParenImpCasts())) {
424-
// Stop in the innermost ArrayToPointerDecay
425-
TmpE = ASE->getBase();
426-
// If we see a Pointer we must to add one dimension and done
427-
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
428-
AddDimStartEnd();
429-
break;
425+
if (!FoundPointer) {
426+
while (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(TmpE->IgnoreParenImpCasts())) {
427+
// Stop in the innermost ArrayToPointerDecay
428+
TmpE = ASE->getBase();
429+
// If we see a Pointer we must add one dimension and done
430+
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
431+
AddDimStartEnd();
432+
break;
433+
}
430434
}
431435
}
432436
RetTypes.insert(RetTypes.begin(), TmpE->getType());
@@ -645,6 +649,7 @@ class OSSDependVisitor
645649
// Get the inner expr
646650
const Expr *TmpE = E;
647651
// First come OSSArraySection
652+
bool FoundPointer = false;
648653
while (const OSSArraySectionExpr *ASE = dyn_cast<OSSArraySectionExpr>(TmpE->IgnoreParenImpCasts())) {
649654
// Stop in the innermost ArrayToPointerDecay
650655
TmpE = ASE->getBase();
@@ -709,22 +714,25 @@ class OSSDependVisitor
709714
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
710715
assert(LengthUpper && "Sema should have forbidden unspecified sizes in pointers");
711716
Dims.push_back(CGF.Builder.CreateSExt(CGF.EmitScalarExpr(LengthUpper), OSSArgTy));
717+
FoundPointer = true;
712718
break;
713719
}
714720
}
715-
while (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(TmpE->IgnoreParenImpCasts())) {
716-
// Stop in the innermost ArrayToPointerDecay
717-
TmpE = ASE->getBase();
718-
// Add indexes
719-
llvm::Value *Idx = CGF.EmitScalarExpr(ASE->getIdx());
720-
Idx = CGF.Builder.CreateSExt(Idx, OSSArgTy);
721-
llvm::Value *IdxEnd = CGF.Builder.CreateAdd(Idx, llvm::ConstantInt::getSigned(OSSArgTy, 1));
722-
Starts.push_back(Idx);
723-
Ends.push_back(IdxEnd);
724-
// If we see a Pointer we must to add one dimension and done
725-
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
726-
Dims.push_back(llvm::ConstantInt::getSigned(OSSArgTy, 1));
727-
break;
721+
if (!FoundPointer) {
722+
while (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(TmpE->IgnoreParenImpCasts())) {
723+
// Stop in the innermost ArrayToPointerDecay
724+
TmpE = ASE->getBase();
725+
// Add indexes
726+
llvm::Value *Idx = CGF.EmitScalarExpr(ASE->getIdx());
727+
Idx = CGF.Builder.CreateSExt(Idx, OSSArgTy);
728+
llvm::Value *IdxEnd = CGF.Builder.CreateAdd(Idx, llvm::ConstantInt::getSigned(OSSArgTy, 1));
729+
Starts.push_back(Idx);
730+
Ends.push_back(IdxEnd);
731+
// If we see a Pointer we must to add one dimension and done
732+
if (TmpE->IgnoreParenImpCasts()->getType()->isPointerType()) {
733+
Dims.push_back(llvm::ConstantInt::getSigned(OSSArgTy, 1));
734+
break;
735+
}
728736
}
729737
}
730738

clang/test/OmpSs/IR/task_depend_array_section.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,3 +623,28 @@ void bar() {
623623
// CHECK-NEXT: %7 = load %struct._depend_unpack_t.24, %struct._depend_unpack_t.24* %retval, align 8
624624
// CHECK-NEXT: ret %struct._depend_unpack_t.24 %7
625625
// CHECK-NEXT: }
626+
627+
void foo1() {
628+
int *array[10];
629+
#pragma oss task in(array[2][3])
630+
{}
631+
}
632+
633+
// CHECK: define internal %struct._depend_unpack_t.25 @compute_dep.26([10 x i32*]* %array)
634+
// CHECK: entry:
635+
// CHECK-NEXT: %retval = alloca %struct._depend_unpack_t.25, align 8
636+
// CHECK-NEXT: %array.addr = alloca [10 x i32*]*, align 8
637+
// CHECK-NEXT: store [10 x i32*]* %array, [10 x i32*]** %array.addr, align 8
638+
// CHECK-NEXT: %arrayidx = getelementptr inbounds [10 x i32*], [10 x i32*]* %array, i64 0, i64 2
639+
// CHECK-NEXT: %0 = load i32*, i32** %arrayidx, align 16
640+
// CHECK-NEXT: %1 = getelementptr inbounds %struct._depend_unpack_t.25, %struct._depend_unpack_t.25* %retval, i32 0, i32 0
641+
// CHECK-NEXT: store i32* %0, i32** %1, align 8
642+
// CHECK-NEXT: %2 = getelementptr inbounds %struct._depend_unpack_t.25, %struct._depend_unpack_t.25* %retval, i32 0, i32 1
643+
// CHECK-NEXT: store i64 4, i64* %2, align 8
644+
// CHECK-NEXT: %3 = getelementptr inbounds %struct._depend_unpack_t.25, %struct._depend_unpack_t.25* %retval, i32 0, i32 2
645+
// CHECK-NEXT: store i64 12, i64* %3, align 8
646+
// CHECK-NEXT: %4 = getelementptr inbounds %struct._depend_unpack_t.25, %struct._depend_unpack_t.25* %retval, i32 0, i32 3
647+
// CHECK-NEXT: store i64 16, i64* %4, align 8
648+
// CHECK-NEXT: %5 = load %struct._depend_unpack_t.25, %struct._depend_unpack_t.25* %retval, align 8
649+
// CHECK-NEXT: ret %struct._depend_unpack_t.25 %5
650+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)