Skip to content

Commit 608ee3a

Browse files
committed
[SYCL] Introduce IntegerExprArgument
New attribute argument class is intended to provide functionality to evaluate and cache value of ExprArgument which holds an integer value Updated IntelReqdSubGroupSizeAttr to use new argument type
1 parent 8a35cf0 commit 608ee3a

File tree

3 files changed

+38
-19
lines changed

3 files changed

+38
-19
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ class IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>;
174174
class IntArgument<string name, bit opt = 0> : Argument<name, opt>;
175175
class StringArgument<string name, bit opt = 0> : Argument<name, opt>;
176176
class ExprArgument<string name, bit opt = 0> : Argument<name, opt>;
177+
class IntegerExprArgument<string name, int undef = 0, bit opt = 0>
178+
: ExprArgument<name, opt> {
179+
int UndefValue = undef;
180+
}
177181
class DeclArgument<DeclNode kind, string name, bit opt = 0, bit fake = 0>
178182
: Argument<name, opt, fake> {
179183
DeclNode Kind = kind;
@@ -1289,28 +1293,11 @@ def LoopUnrollHint : InheritableAttr {
12891293

12901294
def IntelReqdSubGroupSize: InheritableAttr {
12911295
let Spellings = [GNU<"intel_reqd_sub_group_size">, CXX11<"cl", "intel_reqd_sub_group_size">];
1292-
let Args = [ExprArgument<"SubGroupSizeExpr">];
1296+
let Args = [IntegerExprArgument<"SubGroupSize", /* UndefValue = */ 0>];
12931297
let Subjects = SubjectList<[Function, CXXMethod], ErrorDiag>;
12941298
let Documentation = [IntelReqdSubGroupSizeDocs];
12951299
let LangOpts = [OpenCL, SYCLIsDevice, SYCLIsHost];
12961300
let PragmaAttributeSupport = 0;
1297-
let AdditionalMembers = [{
1298-
private:
1299-
int SubGroupSize = 0;
1300-
1301-
public:
1302-
int getSubGroupSizeEvaluated(ASTContext &Ctx) {
1303-
if (SubGroupSize != 0)
1304-
return SubGroupSize;
1305-
llvm::APSInt Val(32);
1306-
bool Succeedded =
1307-
this->getSubGroupSizeExpr()->isIntegerConstantExpr(Val, Ctx);
1308-
assert(Succeedded && "expression must be constant integer");
1309-
SubGroupSize = Val.getSExtValue();
1310-
assert(SubGroupSize >= 0 && "invalid value of the attribute");
1311-
return SubGroupSize;
1312-
}
1313-
}];
13141301
}
13151302

13161303
// This attribute is both a type attribute, and a declaration attribute (for

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ static void instantiateIntelReqdSubGroupSizeAttr(
547547
// The SubGroupSize expression is a constant expression.
548548
EnterExpressionEvaluationContext Unevaluated(
549549
S, Sema::ExpressionEvaluationContext::ConstantEvaluated);
550-
ExprResult Result = S.SubstExpr(Attr->getSubGroupSizeExpr(), TemplateArgs);
550+
ExprResult Result = S.SubstExpr(Attr->getSubGroupSize(), TemplateArgs);
551551
if (!Result.isInvalid())
552552
S.addIntelReqdSubGroupSizeAttr(New, *Attr, Result.getAs<Expr>());
553553
}

clang/utils/TableGen/ClangAttrEmitter.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,36 @@ namespace {
11611161
void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
11621162
};
11631163

1164+
class IntegerExprArgument : public ExprArgument {
1165+
private:
1166+
int UndefValue;
1167+
1168+
public:
1169+
IntegerExprArgument(const Record &Arg, StringRef Attr)
1170+
: ExprArgument(Arg, Attr),
1171+
UndefValue(Arg.getValueAsInt("UndefValue")) {}
1172+
1173+
void writeAccessors(raw_ostream &OS) const override {
1174+
OS << " " << getType() << " get" << getUpperName() << "() const {\n";
1175+
OS << " return " << getLowerName() << ";\n";
1176+
OS << " }\n";
1177+
OS << "private:\n";
1178+
OS << " int " << getLowerName() << "Value = " << UndefValue << ";\n";
1179+
OS << "public:\n";
1180+
OS << " int get" << getUpperName() << "Evaluated(ASTContext &Ctx) {\n";
1181+
OS << " if (" << getLowerName() << "Value != " << UndefValue << ")\n";
1182+
OS << " return " << getLowerName() << "Value;\n";
1183+
OS << " llvm::APSInt Val(32);\n";
1184+
OS << " bool Succeedded = " << getLowerName()
1185+
<< "->isIntegerConstantExpr(Val, Ctx);\n";
1186+
OS << " assert(Succeedded && \"expression must be constant "
1187+
"integer\");\n";
1188+
OS << " " << getLowerName() << "Value = Val.getSExtValue();\n";
1189+
OS << " return " << getLowerName() << "Value;\n";
1190+
OS << " }";
1191+
}
1192+
};
1193+
11641194
class VariadicExprArgument : public VariadicArgument {
11651195
public:
11661196
VariadicExprArgument(const Record &Arg, StringRef Attr)
@@ -1299,6 +1329,8 @@ createArgument(const Record &Arg, StringRef Attr,
12991329
Ptr = std::make_unique<EnumArgument>(Arg, Attr);
13001330
else if (ArgName == "ExprArgument")
13011331
Ptr = std::make_unique<ExprArgument>(Arg, Attr);
1332+
else if (ArgName == "IntegerExprArgument")
1333+
Ptr = std::make_unique<IntegerExprArgument>(Arg, Attr);
13021334
else if (ArgName == "DeclArgument")
13031335
Ptr = std::make_unique<SimpleArgument>(
13041336
Arg, Attr, (Arg.getValueAsDef("Kind")->getName() + "Decl *").str());

0 commit comments

Comments
 (0)