From feb279ef4cbaa7f83355fa44387e981b986f3435 Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Mon, 11 Nov 2019 14:24:58 +0300 Subject: [PATCH 1/6] [SYCL] Enable template parameter support for ii and max_concurrency attributes Signed-off-by: Viktoria Maksimova --- clang/include/clang/Basic/Attr.td | 6 +- clang/include/clang/Sema/Sema.h | 3 + clang/lib/CodeGen/CGLoopInfo.cpp | 5 +- clang/lib/Sema/SemaStmtAttr.cpp | 87 ++++++++++++--------- clang/lib/Sema/SemaTemplateInstantiate.cpp | 26 ++++++ clang/test/CodeGenSYCL/intel-fpga-loops.cpp | 24 ++++++ clang/test/SemaSYCL/intel-fpga-loops.cpp | 38 ++++++++- 7 files changed, 146 insertions(+), 43 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 77d8abd8201a9..3aff4f0a95889 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1550,8 +1550,9 @@ def SYCLIntelFPGAIVDep : Attr { def SYCLIntelFPGAII : Attr { let Spellings = [CXX11<"intelfpga","ii">]; - let Args = [IntArgument<"Interval">]; + let Args = [ExprArgument<"IntervalExpr">, UnsignedArgument<"IntervalValue">]; let LangOpts = [SYCLIsDevice, SYCLIsHost]; + let HasCustomTypeTransform = 1; let AdditionalMembers = [{ static const char *getName() { return "ii"; @@ -1562,8 +1563,9 @@ def SYCLIntelFPGAII : Attr { def SYCLIntelFPGAMaxConcurrency : Attr { let Spellings = [CXX11<"intelfpga","max_concurrency">]; - let Args = [IntArgument<"NThreads">]; + let Args = [ExprArgument<"NThreadsExpr">, UnsignedArgument<"NThreadsValue">]; let LangOpts = [SYCLIsDevice, SYCLIsHost]; + let HasCustomTypeTransform = 1; let AdditionalMembers = [{ static const char *getName() { return "max_concurrency"; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 3383d1953789d..7b40dade64ba8 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -1659,6 +1659,9 @@ class Sema { SYCLIntelFPGAIVDepAttr * BuildSYCLIntelFPGAIVDepAttr(const AttributeCommonInfo &CI, Expr *Expr1, Expr *Expr2); + template + FPGALoopAttrT *BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, + Expr *E); bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc); diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp index 77b67c4440b5f..6c0ddc196320b 100644 --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -895,14 +895,15 @@ void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx, } if (IntelFPGAII) { - unsigned ValueInt = IntelFPGAII->getInterval(); + unsigned ValueInt = IntelFPGAII->getIntervalValue(); if (ValueInt > 0) setSYCLIInterval(ValueInt); } if (IntelFPGAMaxConcurrency) { setSYCLMaxConcurrencyEnable(); - setSYCLMaxConcurrencyNThreads(IntelFPGAMaxConcurrency->getNThreads()); + setSYCLMaxConcurrencyNThreads( + IntelFPGAMaxConcurrency->getNThreadsValue()); } } diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 53761762869a5..5845e3b0006c2 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -74,8 +74,7 @@ static Attr *handleSuppressAttr(Sema &S, Stmt *St, const ParsedAttr &A, } template -static Attr *handleIntelFPGALoopAttr(Sema &S, Stmt *St, const ParsedAttr &A) { - +static Attr *handleIntelFPGALoopAttr(Sema &S, const ParsedAttr &A) { if(S.LangOpts.SYCLIsHost) return nullptr; @@ -93,39 +92,7 @@ static Attr *handleIntelFPGALoopAttr(Sema &S, Stmt *St, const ParsedAttr &A) { } } - unsigned SafeInterval = 0; - - if (NumArgs == 1) { - Expr *E = A.getArgAsExpr(0); - llvm::APSInt ArgVal(32); - - if (!E->isIntegerConstantExpr(ArgVal, S.Context)) { - S.Diag(A.getLoc(), diag::err_attribute_argument_type) - << A << AANT_ArgumentIntegerConstant << E->getSourceRange(); - return nullptr; - } - - int Val = ArgVal.getSExtValue(); - - if (A.getKind() != ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency) { - if (Val <= 0) { - S.Diag(A.getRange().getBegin(), - diag::warn_attribute_requires_positive_integer) - << A << /* positive */ 0; - return nullptr; - } - } else { - if (Val < 0) { - S.Diag(A.getRange().getBegin(), - diag::warn_attribute_requires_positive_integer) - << A << /* non-negative */ 1; - return nullptr; - } - } - SafeInterval = Val; - } - - return FPGALoopAttrT::CreateImplicit(S.Context, SafeInterval); + return S.BuildSYCLIntelFPGALoopAttr(A, A.getArgAsExpr(0)); } static bool checkSYCLIntelFPGAIVDepSafeLen(Sema &S, llvm::APSInt &Value, @@ -207,6 +174,52 @@ Sema::BuildSYCLIntelFPGAIVDepAttr(const AttributeCommonInfo &CI, Expr *Expr1, SYCLIntelFPGAIVDepAttr(Context, CI, SafeLenExpr, ArrayExpr, SafelenValue); } +template +FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, + Expr *E) { + + unsigned SafeInterval = 0; + Expr *SafeExpr = nullptr; + if (E->isInstantiationDependent()) { + SafeExpr = E; + } else { + llvm::APSInt ArgVal(32); + + if (!E->isIntegerConstantExpr(ArgVal, getASTContext())) { + Diag(E->getExprLoc(), diag::err_attribute_argument_type) + << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency + ? "'max_concurrency'" + : "'ii'") + << AANT_ArgumentIntegerConstant << E->getSourceRange(); + return nullptr; + } + + int Val = ArgVal.getSExtValue(); + + if (A.getParsedKind() != ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency) { + if (Val <= 0) { + Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) + << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency + ? "'max_concurrency'" + : "'ii'") + << /* positive */ 0; + return nullptr; + } + } else { + if (Val < 0) { + Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) + << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency + ? "'max_concurrency'" + : "'ii'") + << /* non-negative */ 1; + return nullptr; + } + } + SafeInterval = Val; + } + + return new (Context) FPGALoopAttrT(Context, A, SafeExpr, SafeInterval); +} // Filters out any attributes from the list that are either not the specified // type, or whose function isDependent returns true. template @@ -611,9 +624,9 @@ static Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const ParsedAttr &A, case ParsedAttr::AT_SYCLIntelFPGAIVDep: return handleIntelFPGAIVDepAttr(S, A); case ParsedAttr::AT_SYCLIntelFPGAII: - return handleIntelFPGALoopAttr(S, St, A); + return handleIntelFPGALoopAttr(S, A); case ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency: - return handleIntelFPGALoopAttr(S, St, A); + return handleIntelFPGALoopAttr(S, A); case ParsedAttr::AT_OpenCLUnrollHint: return handleLoopUnrollHint(S, St, A, Range); case ParsedAttr::AT_LoopUnrollHint: diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index cbc74716da540..7c356ad199cfd 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -952,6 +952,11 @@ namespace { const LoopHintAttr *TransformLoopHintAttr(const LoopHintAttr *LH); const SYCLIntelFPGAIVDepAttr * TransformSYCLIntelFPGAIVDepAttr(const SYCLIntelFPGAIVDepAttr *IV); + const SYCLIntelFPGAIIAttr * + TransformSYCLIntelFPGAIIAttr(const SYCLIntelFPGAIIAttr *II); + const SYCLIntelFPGAMaxConcurrencyAttr * + TransformSYCLIntelFPGAMaxConcurrencyAttr( + const SYCLIntelFPGAMaxConcurrencyAttr *MC); ExprResult TransformPredefinedExpr(PredefinedExpr *E); ExprResult TransformDeclRefExpr(DeclRefExpr *E); @@ -1356,6 +1361,27 @@ TemplateInstantiator::TransformSYCLIntelFPGAIVDepAttr( return getSema().BuildSYCLIntelFPGAIVDepAttr(*IVDep, Expr1, Expr2); } +const SYCLIntelFPGAIIAttr *TemplateInstantiator::TransformSYCLIntelFPGAIIAttr( + const SYCLIntelFPGAIIAttr *II) { + Expr *TransformedExpr = + II->getIntervalExpr() + ? getDerived().TransformExpr(II->getIntervalExpr()).get() + : nullptr; + return getSema().BuildSYCLIntelFPGALoopAttr( + *II, TransformedExpr); +} + +const SYCLIntelFPGAMaxConcurrencyAttr * +TemplateInstantiator::TransformSYCLIntelFPGAMaxConcurrencyAttr( + const SYCLIntelFPGAMaxConcurrencyAttr *MC) { + Expr *TransformedExpr = + MC->getNThreadsExpr() + ? getDerived().TransformExpr(MC->getNThreadsExpr()).get() + : nullptr; + return getSema().BuildSYCLIntelFPGALoopAttr( + *MC, TransformedExpr); +} + ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef( NonTypeTemplateParmDecl *parm, SourceLocation loc, diff --git a/clang/test/CodeGenSYCL/intel-fpga-loops.cpp b/clang/test/CodeGenSYCL/intel-fpga-loops.cpp index 2f22c539ff114..576333e6112e6 100644 --- a/clang/test/CodeGenSYCL/intel-fpga-loops.cpp +++ b/clang/test/CodeGenSYCL/intel-fpga-loops.cpp @@ -2,6 +2,8 @@ // CHECK: br label %for.cond, !llvm.loop ![[MD_A:[0-9]+]] // CHECK: br label %for.cond, !llvm.loop ![[MD_B:[0-9]+]] +// CHECK: br label %for.cond, !llvm.loop ![[MD_C:[0-9]+]] +// CHECK: br label %for.cond, !llvm.loop ![[MD_D:[0-9]+]] // CHECK: ![[MD_A]] = distinct !{![[MD_A]], ![[MD_ii:[0-9]+]]} // CHECK-NEXT: ![[MD_ii]] = !{!"llvm.loop.ii.count", i32 2} @@ -21,6 +23,26 @@ void zoo() { a[i] = 0; } +// CHECK: ![[MD_C]] = distinct !{![[MD_C]], ![[MD_ii_2:[0-9]+]]} +// CHECK-NEXT: ![[MD_ii_2]] = !{!"llvm.loop.ii.count", i32 4} +template +void boo() { + int a[10]; + [[intelfpga::ii(A)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; +} + +// CHECK: ![[MD_D]] = distinct !{![[MD_D]], ![[MD_max_concurrency_2:[0-9]+]]} +// CHECK-NEXT: ![[MD_max_concurrency_2]] = !{!"llvm.loop.max_concurrency.count", i32 0} +template +void foo() { + int a[10]; + [[intelfpga::max_concurrency(B)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; +} + template __attribute__((sycl_kernel)) void kernel_single_task(Func kernelFunc) { kernelFunc(); @@ -30,6 +52,8 @@ int main() { kernel_single_task([]() { goo(); zoo(); + boo<4>(); + foo<0>(); }); return 0; } diff --git a/clang/test/SemaSYCL/intel-fpga-loops.cpp b/clang/test/SemaSYCL/intel-fpga-loops.cpp index d94007bc05e92..d3e923b5994ec 100644 --- a/clang/test/SemaSYCL/intel-fpga-loops.cpp +++ b/clang/test/SemaSYCL/intel-fpga-loops.cpp @@ -65,11 +65,11 @@ void goo() { [[intelfpga::ivdep(0)]] for (int i = 0; i != 10; ++i) a[i] = 0; - // expected-warning@+1 {{'ii' attribute requires a positive integral compile time constant expression - attribute ignored}} + // expected-error@+1 {{'ii' attribute requires a positive integral compile time constant expression}} [[intelfpga::ii(0)]] for (int i = 0; i != 10; ++i) a[i] = 0; - // expected-warning@+1 {{'max_concurrency' attribute requires a non-negative integral compile time constant expression - attribute ignored}} + // expected-error@+1 {{'max_concurrency' attribute requires a non-negative integral compile time constant expression}} [[intelfpga::max_concurrency(-1)]] for (int i = 0; i != 10; ++i) a[i] = 0; @@ -229,6 +229,36 @@ void ivdep_dependent() { }; } +template +void ii_dependent() { + int a[10]; + // expected-error@+1 {{'ii' attribute requires a positive integral compile time constant expression}} + [[intelfpga::ii(C)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; + + // expected-error@+1 {{duplicate Intel FPGA loop attribute 'ii'}} + [[intelfpga::ii(A)]] + [[intelfpga::ii(B)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; +} + +template +void max_concurrency_dependent() { + int a[10]; + // expected-error@+1 {{'max_concurrency' attribute requires a non-negative integral compile time constant expression}} + [[intelfpga::max_concurrency(C)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; + + // expected-error@+1 {{duplicate Intel FPGA loop attribute 'max_concurrency'}} + [[intelfpga::max_concurrency(A)]] + [[intelfpga::max_concurrency(B)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; +} + template __attribute__((sycl_kernel)) void kernel_single_task(Func kernelFunc) { kernelFunc(); @@ -244,6 +274,10 @@ int main() { //expected-note@-1 +{{in instantiation of function template specialization}} ivdep_dependent<2, 4, -1>(); //expected-note@-1 +{{in instantiation of function template specialization}} + ii_dependent<2, 4, -1>(); + //expected-note@-1 +{{in instantiation of function template specialization}} + max_concurrency_dependent<1, 4, -2>(); + //expected-note@-1 +{{in instantiation of function template specialization}} }); return 0; } From 99756da485d2431ab3340d5029d0a3b193526d01 Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Mon, 11 Nov 2019 16:05:47 +0300 Subject: [PATCH 2/6] Remove redundant code Signed-off-by: Viktoria Maksimova --- clang/lib/Sema/SemaStmtAttr.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 5845e3b0006c2..4c53472fec027 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -196,22 +196,16 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, int Val = ArgVal.getSExtValue(); - if (A.getParsedKind() != ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency) { + if (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAII) { if (Val <= 0) { Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) - << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency - ? "'max_concurrency'" - : "'ii'") - << /* positive */ 0; + << "'ii'" << /* positive */ 0; return nullptr; } } else { if (Val < 0) { Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) - << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency - ? "'max_concurrency'" - : "'ii'") - << /* non-negative */ 1; + << "'max_concurrency'" << /* non-negative */ 1; return nullptr; } } From 61beb09875f4de2bda5bac965340c1ff46d72b9c Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Mon, 11 Nov 2019 17:46:19 +0300 Subject: [PATCH 3/6] Improvements Signed-off-by: Viktoria Maksimova --- clang/lib/Sema/SemaStmtAttr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 4c53472fec027..c796a22e70a88 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -187,9 +187,9 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, if (!E->isIntegerConstantExpr(ArgVal, getASTContext())) { Diag(E->getExprLoc(), diag::err_attribute_argument_type) - << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency - ? "'max_concurrency'" - : "'ii'") + << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAII + ? "'ii'" + : "'max_concurrency'") << AANT_ArgumentIntegerConstant << E->getSourceRange(); return nullptr; } @@ -202,7 +202,7 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, << "'ii'" << /* positive */ 0; return nullptr; } - } else { + } else { /* AT_SYCLIntelFPGAMaxConcurrency */ if (Val < 0) { Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) << "'max_concurrency'" << /* non-negative */ 1; From de0cbe53ef1006906068466168ef3607cd0f6131 Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Mon, 18 Nov 2019 14:12:40 +0300 Subject: [PATCH 4/6] More improvements Signed-off-by: Viktoria Maksimova --- clang/lib/Sema/SemaStmtAttr.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index c796a22e70a88..7aacc61faa8fe 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -187,10 +187,8 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, if (!E->isIntegerConstantExpr(ArgVal, getASTContext())) { Diag(E->getExprLoc(), diag::err_attribute_argument_type) - << (A.getParsedKind() == ParsedAttr::AT_SYCLIntelFPGAII - ? "'ii'" - : "'max_concurrency'") - << AANT_ArgumentIntegerConstant << E->getSourceRange(); + << A.getAttrName() << AANT_ArgumentIntegerConstant + << E->getSourceRange(); return nullptr; } @@ -202,12 +200,15 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, << "'ii'" << /* positive */ 0; return nullptr; } - } else { /* AT_SYCLIntelFPGAMaxConcurrency */ + } else if (A.getParsedKind() == + ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency) { if (Val < 0) { Diag(E->getExprLoc(), diag::err_attribute_requires_positive_integer) << "'max_concurrency'" << /* non-negative */ 1; return nullptr; } + } else { + llvm_unreachable("wrong sycl fpga loop attr"); } SafeInterval = Val; } From 06fbe7102609150312eaea053fcc9ad623087f52 Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Wed, 20 Nov 2019 16:07:44 +0300 Subject: [PATCH 5/6] Rework attribute value handling Signed-off-by: Viktoria Maksimova --- clang/include/clang/Basic/Attr.td | 4 ++-- clang/lib/CodeGen/CGLoopInfo.cpp | 24 +++++++++++++++------ clang/lib/Sema/SemaStmtAttr.cpp | 13 +++++------ clang/test/CodeGenSYCL/intel-fpga-loops.cpp | 16 ++++++++++++-- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 3aff4f0a95889..62e6e80804ec4 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1550,7 +1550,7 @@ def SYCLIntelFPGAIVDep : Attr { def SYCLIntelFPGAII : Attr { let Spellings = [CXX11<"intelfpga","ii">]; - let Args = [ExprArgument<"IntervalExpr">, UnsignedArgument<"IntervalValue">]; + let Args = [ExprArgument<"IntervalExpr">]; let LangOpts = [SYCLIsDevice, SYCLIsHost]; let HasCustomTypeTransform = 1; let AdditionalMembers = [{ @@ -1563,7 +1563,7 @@ def SYCLIntelFPGAII : Attr { def SYCLIntelFPGAMaxConcurrency : Attr { let Spellings = [CXX11<"intelfpga","max_concurrency">]; - let Args = [ExprArgument<"NThreadsExpr">, UnsignedArgument<"NThreadsValue">]; + let Args = [ExprArgument<"NThreadsExpr">]; let LangOpts = [SYCLIsDevice, SYCLIsHost]; let HasCustomTypeTransform = 1; let AdditionalMembers = [{ diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp index 6c0ddc196320b..a6913aa72a7d0 100644 --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -895,15 +895,27 @@ void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx, } if (IntelFPGAII) { - unsigned ValueInt = IntelFPGAII->getIntervalValue(); - if (ValueInt > 0) - setSYCLIInterval(ValueInt); + unsigned ValueInt = 0; + if (auto *E = IntelFPGAII->getIntervalExpr()) { + llvm::APSInt ArgVal(32); + if (E->isIntegerConstantExpr(ArgVal, Ctx)) { + ValueInt = ArgVal.getSExtValue(); + if (ValueInt > 0) + setSYCLIInterval(ValueInt); + } + } } if (IntelFPGAMaxConcurrency) { - setSYCLMaxConcurrencyEnable(); - setSYCLMaxConcurrencyNThreads( - IntelFPGAMaxConcurrency->getNThreadsValue()); + unsigned ValueInt = 0; + if (auto *E = IntelFPGAMaxConcurrency->getNThreadsExpr()) { + llvm::APSInt ArgVal(32); + if (E->isIntegerConstantExpr(ArgVal, Ctx)) { + ValueInt = ArgVal.getSExtValue(); + setSYCLMaxConcurrencyEnable(); + setSYCLMaxConcurrencyNThreads(ValueInt); + } + } } } diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 7aacc61faa8fe..df12ffa45b2bb 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -177,12 +177,10 @@ Sema::BuildSYCLIntelFPGAIVDepAttr(const AttributeCommonInfo &CI, Expr *Expr1, template FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, Expr *E) { + if (!E) + return nullptr; - unsigned SafeInterval = 0; - Expr *SafeExpr = nullptr; - if (E->isInstantiationDependent()) { - SafeExpr = E; - } else { + if (!E->isInstantiationDependent()) { llvm::APSInt ArgVal(32); if (!E->isIntegerConstantExpr(ArgVal, getASTContext())) { @@ -208,12 +206,11 @@ FPGALoopAttrT *Sema::BuildSYCLIntelFPGALoopAttr(const AttributeCommonInfo &A, return nullptr; } } else { - llvm_unreachable("wrong sycl fpga loop attr"); + llvm_unreachable("unknown sycl fpga loop attr"); } - SafeInterval = Val; } - return new (Context) FPGALoopAttrT(Context, A, SafeExpr, SafeInterval); + return new (Context) FPGALoopAttrT(Context, A, E); } // Filters out any attributes from the list that are either not the specified // type, or whose function isDependent returns true. diff --git a/clang/test/CodeGenSYCL/intel-fpga-loops.cpp b/clang/test/CodeGenSYCL/intel-fpga-loops.cpp index 576333e6112e6..e86a0f5a41d70 100644 --- a/clang/test/CodeGenSYCL/intel-fpga-loops.cpp +++ b/clang/test/CodeGenSYCL/intel-fpga-loops.cpp @@ -3,7 +3,9 @@ // CHECK: br label %for.cond, !llvm.loop ![[MD_A:[0-9]+]] // CHECK: br label %for.cond, !llvm.loop ![[MD_B:[0-9]+]] // CHECK: br label %for.cond, !llvm.loop ![[MD_C:[0-9]+]] -// CHECK: br label %for.cond, !llvm.loop ![[MD_D:[0-9]+]] +// CHECK: br label %for.cond2, !llvm.loop ![[MD_D:[0-9]+]] +// CHECK: br label %for.cond, !llvm.loop ![[MD_E:[0-9]+]] +// CHECK: br label %for.cond2, !llvm.loop ![[MD_F:[0-9]+]] // CHECK: ![[MD_A]] = distinct !{![[MD_A]], ![[MD_ii:[0-9]+]]} // CHECK-NEXT: ![[MD_ii]] = !{!"llvm.loop.ii.count", i32 2} @@ -31,9 +33,14 @@ void boo() { [[intelfpga::ii(A)]] for (int i = 0; i != 10; ++i) a[i] = 0; + // CHECK: ![[MD_D]] = distinct !{![[MD_D]], ![[MD_ii_3:[0-9]+]]} + // CHECK-NEXT: ![[MD_ii_3]] = !{!"llvm.loop.ii.count", i32 8} + [[intelfpga::ii(8)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; } -// CHECK: ![[MD_D]] = distinct !{![[MD_D]], ![[MD_max_concurrency_2:[0-9]+]]} +// CHECK: ![[MD_E]] = distinct !{![[MD_E]], ![[MD_max_concurrency_2:[0-9]+]]} // CHECK-NEXT: ![[MD_max_concurrency_2]] = !{!"llvm.loop.max_concurrency.count", i32 0} template void foo() { @@ -41,6 +48,11 @@ void foo() { [[intelfpga::max_concurrency(B)]] for (int i = 0; i != 10; ++i) a[i] = 0; + // CHECK: ![[MD_F]] = distinct !{![[MD_F]], ![[MD_max_concurrency_3:[0-9]+]]} + // CHECK-NEXT: ![[MD_max_concurrency_3]] = !{!"llvm.loop.max_concurrency.count", i32 4} + [[intelfpga::max_concurrency(4)]] + for (int i = 0; i != 10; ++i) + a[i] = 0; } template From 4688edafd8a5423cbcffe5977d6c054157fda4f6 Mon Sep 17 00:00:00 2001 From: Viktoria Maksimova Date: Wed, 20 Nov 2019 18:43:06 +0300 Subject: [PATCH 6/6] Apply suggestions Signed-off-by: Viktoria Maksimova --- clang/lib/CodeGen/CGLoopInfo.cpp | 32 ++++++++++------------ clang/lib/Sema/SemaTemplateInstantiate.cpp | 8 ++---- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp index a6913aa72a7d0..e1f06d5bcb103 100644 --- a/clang/lib/CodeGen/CGLoopInfo.cpp +++ b/clang/lib/CodeGen/CGLoopInfo.cpp @@ -895,27 +895,23 @@ void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx, } if (IntelFPGAII) { - unsigned ValueInt = 0; - if (auto *E = IntelFPGAII->getIntervalExpr()) { - llvm::APSInt ArgVal(32); - if (E->isIntegerConstantExpr(ArgVal, Ctx)) { - ValueInt = ArgVal.getSExtValue(); - if (ValueInt > 0) - setSYCLIInterval(ValueInt); - } - } + llvm::APSInt ArgVal(32); + bool IsValid = + IntelFPGAII->getIntervalExpr()->isIntegerConstantExpr(ArgVal, Ctx); + assert(IsValid && "Not an integer constant expression"); + (void)IsValid; + setSYCLIInterval(ArgVal.getSExtValue()); } if (IntelFPGAMaxConcurrency) { - unsigned ValueInt = 0; - if (auto *E = IntelFPGAMaxConcurrency->getNThreadsExpr()) { - llvm::APSInt ArgVal(32); - if (E->isIntegerConstantExpr(ArgVal, Ctx)) { - ValueInt = ArgVal.getSExtValue(); - setSYCLMaxConcurrencyEnable(); - setSYCLMaxConcurrencyNThreads(ValueInt); - } - } + llvm::APSInt ArgVal(32); + bool IsValid = + IntelFPGAMaxConcurrency->getNThreadsExpr()->isIntegerConstantExpr( + ArgVal, Ctx); + assert(IsValid && "Not an integer constant expression"); + (void)IsValid; + setSYCLMaxConcurrencyEnable(); + setSYCLMaxConcurrencyNThreads(ArgVal.getSExtValue()); } } diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 7c356ad199cfd..a67ce648e4057 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1364,9 +1364,7 @@ TemplateInstantiator::TransformSYCLIntelFPGAIVDepAttr( const SYCLIntelFPGAIIAttr *TemplateInstantiator::TransformSYCLIntelFPGAIIAttr( const SYCLIntelFPGAIIAttr *II) { Expr *TransformedExpr = - II->getIntervalExpr() - ? getDerived().TransformExpr(II->getIntervalExpr()).get() - : nullptr; + getDerived().TransformExpr(II->getIntervalExpr()).get(); return getSema().BuildSYCLIntelFPGALoopAttr( *II, TransformedExpr); } @@ -1375,9 +1373,7 @@ const SYCLIntelFPGAMaxConcurrencyAttr * TemplateInstantiator::TransformSYCLIntelFPGAMaxConcurrencyAttr( const SYCLIntelFPGAMaxConcurrencyAttr *MC) { Expr *TransformedExpr = - MC->getNThreadsExpr() - ? getDerived().TransformExpr(MC->getNThreadsExpr()).get() - : nullptr; + getDerived().TransformExpr(MC->getNThreadsExpr()).get(); return getSema().BuildSYCLIntelFPGALoopAttr( *MC, TransformedExpr); }