Skip to content

Commit 7016d65

Browse files
Implemented review comments:
Added a few more comments, renamed variables, etc Signed-off-by: Elizabeth Andrews <[email protected]>
1 parent bb48b0f commit 7016d65

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,8 @@ class KernelObjVisitor {
851851
std::initializer_list<int>{(handlers.enterArray(), 0)...};
852852
for (int64_t Count = 0; Count < ElemCount; Count++) {
853853
VisitElement(nullptr, FD, ET, handlers...);
854-
(void)std::initializer_list<int>{(handlers.nextElement(ET, Count), 0)...};
854+
(void)std::initializer_list<int>{
855+
(handlers.nextElement(ET, Count + 1), 0)...};
855856
}
856857
(void)std::initializer_list<int>{
857858
(handlers.leaveArray(FD, ET, ElemCount), 0)...};
@@ -1748,9 +1749,9 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
17481749
return Dims;
17491750
}
17501751

1751-
int64_t getArrayIndex(int i) {
1752+
int64_t getArrayIndex(int Idx) {
17521753
ArraySubscriptExpr *LastArrayRef =
1753-
cast<ArraySubscriptExpr>(MemberExprBases[i]);
1754+
cast<ArraySubscriptExpr>(MemberExprBases[Idx]);
17541755
Expr *LastIdx = LastArrayRef->getIdx();
17551756
llvm::APSInt Result;
17561757
SemaRef.VerifyIntegerConstantExpression(LastIdx, &Result);
@@ -1775,12 +1776,17 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
17751776
// a[0][0][1], the top of stack entries are ArraySubscriptExpressions for
17761777
// indices 0,0 and 1, with 1 on top.
17771778
int Dims = getDims();
1778-
int NIndex = MemberExprBases.size() - 1 - (Dims - 1);
1779+
1780+
// MemberExprBasesIdx is used to get the index of each dimension, in correct
1781+
// order, from MemberExprBases. For example for a[0][0][1], getArrayIndex
1782+
// will return 0, 0 and then 1.
1783+
int MemberExprBasesIdx = (MemberExprBases.size() - 1) - (Dims - 1);
17791784
for (int i = 0; i < Dims; ++i) {
17801785
InitializedEntity NewEntity = InitializedEntity::InitializeElement(
1781-
SemaRef.getASTContext(), getArrayIndex(NIndex), InitEntities.back());
1786+
SemaRef.getASTContext(), getArrayIndex(MemberExprBasesIdx),
1787+
InitEntities.back());
17821788
InitEntities.push_back(NewEntity);
1783-
++NIndex;
1789+
++MemberExprBasesIdx;
17841790
}
17851791

17861792
InitializationKind InitKind =
@@ -1802,6 +1808,14 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
18021808
Expr *ILE = new (SemaRef.getASTContext())
18031809
InitListExpr(SemaRef.getASTContext(), SourceLocation(), ArrayInitExprs,
18041810
SourceLocation());
1811+
1812+
// We need to find the type of the element for which we are generating the
1813+
// InitListExpr. For example, for a multi-dimensional array say a[2][3][2],
1814+
// the types for InitListExpr of the array and its 'sub-arrays' are -
1815+
// int [2][3][2], int [3][2] and int [2]. This loop is used to obtain this
1816+
// information from MemberExprBases. MemberExprBases holds
1817+
// ArraySubscriptExprs and the top of stack shows how far we have descended
1818+
// down the array. getDims() calculates this depth.
18051819
QualType ILEType = FD->getType();
18061820
for (int i = getDims(); i > 1; i--) {
18071821
const ConstantArrayType *CAT =
@@ -2104,7 +2118,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
21042118
class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
21052119
SYCLIntegrationHeader &Header;
21062120
int64_t CurOffset = 0;
2107-
llvm::SmallVector<size_t, 16> ArrayBases;
2121+
llvm::SmallVector<size_t, 16> ArrayBaseOffsets;
21082122
int StructDepth = 0;
21092123

21102124
void addParam(const FieldDecl *FD, QualType ArgTy,
@@ -2252,19 +2266,19 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
22522266
}
22532267

22542268
bool enterArray() final {
2255-
ArrayBases.push_back(CurOffset);
2269+
ArrayBaseOffsets.push_back(CurOffset);
22562270
return true;
22572271
}
22582272

22592273
bool nextElement(QualType ET, int64_t Index) final {
22602274
int64_t Size = SemaRef.getASTContext().getTypeSizeInChars(ET).getQuantity();
2261-
CurOffset = ArrayBases.back() + Size * (Index + 1);
2275+
CurOffset = ArrayBaseOffsets.back() + Size * (Index);
22622276
return true;
22632277
}
22642278

22652279
bool leaveArray(FieldDecl *, QualType ET, int64_t) final {
2266-
CurOffset = ArrayBases.back();
2267-
ArrayBases.pop_back();
2280+
CurOffset = ArrayBaseOffsets.back();
2281+
ArrayBaseOffsets.pop_back();
22682282
return true;
22692283
}
22702284
using SyclKernelFieldHandler::enterStruct;

0 commit comments

Comments
 (0)