@@ -851,7 +851,7 @@ class KernelObjVisitor {
851
851
std::initializer_list<int >{(handlers.enterArray (), 0 )...};
852
852
for (int64_t Count = 0 ; Count < ElemCount; Count++) {
853
853
VisitElement (nullptr , FD, ET, handlers...);
854
- (void )std::initializer_list<int >{(handlers.nextElement (ET), 0 )...};
854
+ (void )std::initializer_list<int >{(handlers.nextElement (ET, Count ), 0 )...};
855
855
}
856
856
(void )std::initializer_list<int >{
857
857
(handlers.leaveArray (FD, ET, ElemCount), 0 )...};
@@ -1108,7 +1108,7 @@ class SyclKernelFieldHandler {
1108
1108
virtual bool enterField (const CXXRecordDecl *, FieldDecl *) { return true ; }
1109
1109
virtual bool leaveField (const CXXRecordDecl *, FieldDecl *) { return true ; }
1110
1110
virtual bool enterArray () { return true ; }
1111
- virtual bool nextElement (QualType) { return true ; }
1111
+ virtual bool nextElement (QualType, int64_t ) { return true ; }
1112
1112
virtual bool leaveArray (FieldDecl *, QualType, int64_t ) { return true ; }
1113
1113
1114
1114
virtual ~SyclKernelFieldHandler () = default ;
@@ -1626,7 +1626,6 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1626
1626
InitializedEntity VarEntity;
1627
1627
const CXXRecordDecl *KernelObj;
1628
1628
llvm::SmallVector<Expr *, 16 > MemberExprBases;
1629
- uint64_t ArrayIndex;
1630
1629
FunctionDecl *KernelCallerFunc;
1631
1630
1632
1631
// Using the statements/init expressions that we've created, this generates
@@ -1761,27 +1760,29 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1761
1760
void createExprForScalarElement (FieldDecl *FD) {
1762
1761
llvm::SmallVector<InitializedEntity, 4 > InitEntities;
1763
1762
1764
- InitializedEntity MemberEntity =
1765
- InitializedEntity::InitializeMember (FD, &VarEntity);
1766
- InitializedEntity Entity = InitializedEntity::InitializeElement (
1767
- SemaRef.getASTContext (), ArrayIndex, MemberEntity);
1768
- InitEntities.push_back (Entity);
1769
1763
// For multi-dimensional arrays, an initialized entity needs to be
1770
1764
// generated for each 'dimension'. For example, the initialized entity
1771
1765
// for s.array[x][y][z] is constructed using initialized entities for
1772
1766
// s.array[x][y], s.array[x] and s.array. InitEntities is used to maintain
1773
- // this. MemberExprBases is used to get the array index for 'current
1774
- // dimension'.
1775
- for (int i = MemberExprBases.size () - 2 ; i >= 0 ; --i) {
1776
- if (!isa<ArraySubscriptExpr>(MemberExprBases[i]))
1777
- break ;
1767
+ // this.
1768
+ InitializedEntity Entity =
1769
+ InitializedEntity::InitializeMember (FD, &VarEntity);
1770
+ InitEntities.push_back (Entity);
1771
+
1772
+ // Calculate dimension using ArraySubscriptExpressions in MemberExprBases.
1773
+ // Each dimension has an ArraySubscriptExpression (maintains index)
1774
+ // in MemberExprBases. For example, if we are currently handling element
1775
+ // a[0][0][1], the top of stack entries are ArraySubscriptExpressions for
1776
+ // indices 0,0 and 1, with 1 on top.
1777
+ int Dims = getDims ();
1778
+ int NIndex = MemberExprBases.size () - 1 - (Dims - 1 );
1779
+ for (int i = 0 ; i < Dims; ++i) {
1778
1780
InitializedEntity NewEntity = InitializedEntity::InitializeElement (
1779
- SemaRef.getASTContext (), getArrayIndex (i ), InitEntities.back ());
1781
+ SemaRef.getASTContext (), getArrayIndex (NIndex ), InitEntities.back ());
1780
1782
InitEntities.push_back (NewEntity);
1783
+ ++NIndex;
1781
1784
}
1782
1785
1783
- ArrayIndex++;
1784
-
1785
1786
InitializationKind InitKind =
1786
1787
InitializationKind::CreateCopy (SourceLocation (), SourceLocation ());
1787
1788
Expr *DRE = createInitExpr (FD);
@@ -2067,14 +2068,14 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2067
2068
ExprResult ElementBase = SemaRef.CreateBuiltinArraySubscriptExpr (
2068
2069
ArrayBase, SourceLocation (), IndexExpr.get (), SourceLocation ());
2069
2070
MemberExprBases.push_back (ElementBase.get ());
2070
- ArrayIndex = 0 ;
2071
2071
return true ;
2072
2072
}
2073
2073
2074
- bool nextElement (QualType ET) final {
2074
+ bool nextElement (QualType ET, int64_t ) final {
2075
2075
// Top of MemberExprBases holds ArraySubscriptExpression of element
2076
- // we just finished processing.
2077
- int64_t nextIndex = getArrayIndex ((MemberExprBases.size () - 1 )) + 1 ;
2076
+ // we just handled, or the Array base for the dimension we are
2077
+ // currently visiting.
2078
+ int64_t nextIndex = getArrayIndex (MemberExprBases.size () - 1 ) + 1 ;
2078
2079
MemberExprBases.pop_back ();
2079
2080
Expr *ArrayBase = MemberExprBases.back ();
2080
2081
ExprResult IndexExpr =
@@ -2103,6 +2104,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2103
2104
class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
2104
2105
SYCLIntegrationHeader &Header;
2105
2106
int64_t CurOffset = 0 ;
2107
+ llvm::SmallVector<size_t , 16 > ArrayBases;
2106
2108
int StructDepth = 0 ;
2107
2109
2108
2110
void addParam (const FieldDecl *FD, QualType ArgTy,
@@ -2249,18 +2251,20 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
2249
2251
return true ;
2250
2252
}
2251
2253
2252
- bool nextElement (QualType ET ) final {
2253
- CurOffset += SemaRef. getASTContext (). getTypeSizeInChars (ET). getQuantity ( );
2254
+ bool enterArray ( ) final {
2255
+ ArrayBases. push_back (CurOffset );
2254
2256
return true ;
2255
2257
}
2256
2258
2257
- bool leaveArray (FieldDecl *, QualType ET, int64_t Count) final {
2258
- int64_t ArraySize =
2259
- SemaRef.getASTContext ().getTypeSizeInChars (ET).getQuantity ();
2260
- if (!ET->isArrayType ()) {
2261
- ArraySize *= Count;
2262
- }
2263
- CurOffset -= ArraySize;
2259
+ bool nextElement (QualType ET, int64_t Index) final {
2260
+ int64_t Size = SemaRef.getASTContext ().getTypeSizeInChars (ET).getQuantity ();
2261
+ CurOffset = ArrayBases.back () + Size * (Index + 1 );
2262
+ return true ;
2263
+ }
2264
+
2265
+ bool leaveArray (FieldDecl *, QualType ET, int64_t ) final {
2266
+ CurOffset = ArrayBases.back ();
2267
+ ArrayBases.pop_back ();
2264
2268
return true ;
2265
2269
}
2266
2270
using SyclKernelFieldHandler::enterStruct;
0 commit comments