Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 0 additions & 80 deletions clang/include/clang/Sema/Sema.h
Original file line number Diff line number Diff line change
Expand Up @@ -4702,159 +4702,79 @@ class Sema final : public SemaBase {
/// Essentially, this just moves them to the current pool.
void redelayDiagnostics(sema::DelayedDiagnosticPool &pool);

void AddSYCLIntelBankBitsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
bool AnyWorkGroupSizesDiffer(const Expr *LHSXDim, const Expr *LHSYDim,
const Expr *LHSZDim, const Expr *RHSXDim,
const Expr *RHSYDim, const Expr *RHSZDim);
bool AllWorkGroupSizesSame(const Expr *LHSXDim, const Expr *LHSYDim,
const Expr *LHSZDim, const Expr *RHSXDim,
const Expr *RHSYDim, const Expr *RHSZDim);
void AddSYCLWorkGroupSizeHintAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
SYCLWorkGroupSizeHintAttr *
MergeSYCLWorkGroupSizeHintAttr(Decl *D, const SYCLWorkGroupSizeHintAttr &A);
void AddIntelReqdSubGroupSize(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
IntelReqdSubGroupSizeAttr *
MergeIntelReqdSubGroupSizeAttr(Decl *D, const IntelReqdSubGroupSizeAttr &A);
IntelNamedSubGroupSizeAttr *
MergeIntelNamedSubGroupSizeAttr(Decl *D, const IntelNamedSubGroupSizeAttr &A);
void AddSYCLIntelNumSimdWorkItemsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelNumSimdWorkItemsAttr *
MergeSYCLIntelNumSimdWorkItemsAttr(Decl *D,
const SYCLIntelNumSimdWorkItemsAttr &A);
void AddSYCLIntelESimdVectorizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelESimdVectorizeAttr *
MergeSYCLIntelESimdVectorizeAttr(Decl *D,
const SYCLIntelESimdVectorizeAttr &A);
void AddSYCLIntelSchedulerTargetFmaxMhzAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelSchedulerTargetFmaxMhzAttr *MergeSYCLIntelSchedulerTargetFmaxMhzAttr(
Decl *D, const SYCLIntelSchedulerTargetFmaxMhzAttr &A);
void AddSYCLIntelNoGlobalWorkOffsetAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelNoGlobalWorkOffsetAttr *MergeSYCLIntelNoGlobalWorkOffsetAttr(
Decl *D, const SYCLIntelNoGlobalWorkOffsetAttr &A);
void AddSYCLIntelLoopFuseAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelLoopFuseAttr *
MergeSYCLIntelLoopFuseAttr(Decl *D, const SYCLIntelLoopFuseAttr &A);
void AddSYCLIntelPrivateCopiesAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void AddSYCLIntelMaxReplicatesAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelMaxReplicatesAttr *
MergeSYCLIntelMaxReplicatesAttr(Decl *D, const SYCLIntelMaxReplicatesAttr &A);
void AddSYCLIntelForcePow2DepthAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelForcePow2DepthAttr *
MergeSYCLIntelForcePow2DepthAttr(Decl *D,
const SYCLIntelForcePow2DepthAttr &A);
void AddSYCLIntelInitiationIntervalAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelInitiationIntervalAttr *MergeSYCLIntelInitiationIntervalAttr(
Decl *D, const SYCLIntelInitiationIntervalAttr &A);

SYCLIntelMaxConcurrencyAttr *
MergeSYCLIntelMaxConcurrencyAttr(Decl *D,
const SYCLIntelMaxConcurrencyAttr &A);
void AddSYCLIntelMaxGlobalWorkDimAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelMaxGlobalWorkDimAttr *
MergeSYCLIntelMaxGlobalWorkDimAttr(Decl *D,
const SYCLIntelMaxGlobalWorkDimAttr &A);
void AddSYCLIntelMinWorkGroupsPerComputeUnitAttr(
Decl *D, const AttributeCommonInfo &CI, Expr *E);
SYCLIntelMinWorkGroupsPerComputeUnitAttr *
MergeSYCLIntelMinWorkGroupsPerComputeUnitAttr(
Decl *D, const SYCLIntelMinWorkGroupsPerComputeUnitAttr &A);
void AddSYCLIntelMaxWorkGroupsPerMultiprocessorAttr(
Decl *D, const AttributeCommonInfo &CI, Expr *E);
SYCLIntelMaxWorkGroupsPerMultiprocessorAttr *
MergeSYCLIntelMaxWorkGroupsPerMultiprocessorAttr(
Decl *D, const SYCLIntelMaxWorkGroupsPerMultiprocessorAttr &A);
void AddSYCLIntelBankWidthAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelBankWidthAttr *
MergeSYCLIntelBankWidthAttr(Decl *D, const SYCLIntelBankWidthAttr &A);
void AddSYCLIntelNumBanksAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
SYCLIntelNumBanksAttr *
MergeSYCLIntelNumBanksAttr(Decl *D, const SYCLIntelNumBanksAttr &A);
SYCLDeviceHasAttr *MergeSYCLDeviceHasAttr(Decl *D,
const SYCLDeviceHasAttr &A);
void AddSYCLDeviceHasAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
SYCLUsesAspectsAttr *MergeSYCLUsesAspectsAttr(Decl *D,
const SYCLUsesAspectsAttr &A);
void AddSYCLUsesAspectsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
bool CheckMaxAllowedWorkGroupSize(const Expr *RWGSXDim, const Expr *RWGSYDim,
const Expr *RWGSZDim, const Expr *MWGSXDim,
const Expr *MWGSYDim, const Expr *MWGSZDim);
void AddSYCLIntelMaxWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
SYCLIntelMaxWorkGroupSizeAttr *
MergeSYCLIntelMaxWorkGroupSizeAttr(Decl *D,
const SYCLIntelMaxWorkGroupSizeAttr &A);
void CheckSYCLAddIRAttributesFunctionAttrConflicts(Decl *D);
SYCLAddIRAttributesFunctionAttr *MergeSYCLAddIRAttributesFunctionAttr(
Decl *D, const SYCLAddIRAttributesFunctionAttr &A);
void AddSYCLAddIRAttributesFunctionAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
SYCLAddIRAttributesKernelParameterAttr *
MergeSYCLAddIRAttributesKernelParameterAttr(
Decl *D, const SYCLAddIRAttributesKernelParameterAttr &A);
void AddSYCLAddIRAttributesKernelParameterAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
SYCLAddIRAttributesGlobalVariableAttr *
MergeSYCLAddIRAttributesGlobalVariableAttr(
Decl *D, const SYCLAddIRAttributesGlobalVariableAttr &A);
void AddSYCLAddIRAttributesGlobalVariableAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
SYCLAddIRAnnotationsMemberAttr *
MergeSYCLAddIRAnnotationsMemberAttr(Decl *D,
const SYCLAddIRAnnotationsMemberAttr &A);
void AddSYCLAddIRAnnotationsMemberAttr(Decl *D, const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
void AddSYCLReqdWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
SYCLReqdWorkGroupSizeAttr *
MergeSYCLReqdWorkGroupSizeAttr(Decl *D, const SYCLReqdWorkGroupSizeAttr &A);

SYCLTypeAttr *MergeSYCLTypeAttr(Decl *D, const AttributeCommonInfo &CI,
SYCLTypeAttr::SYCLType TypeName);

/// Emit a diagnostic about the given attribute having a deprecated name, and
/// also emit a fixit hint to generate the new attribute name.
void DiagnoseDeprecatedAttribute(const ParsedAttr &A, StringRef NewScope,
StringRef NewName);

/// Diagnoses an attribute in the 'intelfpga' namespace and suggests using
/// the attribute in the 'intel' namespace instead.
void CheckDeprecatedSYCLAttributeSpelling(const ParsedAttr &A,
StringRef NewName = "");

/// addSYCLIntelPipeIOAttr - Adds a pipe I/O attribute to a particular
/// declaration.
void addSYCLIntelPipeIOAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ID);
SYCLIntelPipeIOAttr *MergeSYCLIntelPipeIOAttr(Decl *D,
const SYCLIntelPipeIOAttr &A);

/// AddSYCLIntelMaxConcurrencyAttr - Adds a max_concurrency attribute to a
/// particular declaration.
void AddSYCLIntelMaxConcurrencyAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);

bool CheckCountedByAttr(Scope *Scope, const FieldDecl *FD);
/// Check if IdxExpr is a valid parameter index for a function or
/// instance method D. May output an error.
Expand Down
129 changes: 129 additions & 0 deletions clang/include/clang/Sema/SemaSYCL.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/Type.h"
#include "clang/Basic/Cuda.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Sema/Ownership.h"
#include "clang/Sema/SemaBase.h"
#include "clang/Sema/SemaDiagnostic.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SetVector.h"

Expand Down Expand Up @@ -215,6 +217,27 @@ class SYCLIntegrationFooter {
void emitSpecIDName(raw_ostream &O, const VarDecl *VD);
};

// Handles max_global_work_dim.
// Returns a OneArgResult value; EqualToOne means all argument values are
// equal to one, NotEqualToOne means at least one argument value is not
// equal to one, and Unknown means that at least one of the argument values
// could not be determined.
enum class OneArgResult { Unknown, EqualToOne, NotEqualToOne };
static inline OneArgResult areAllArgsOne(const Expr *Args[], size_t Count) {
for (size_t Idx = 0; Idx < Count; ++Idx) {
const Expr *Arg = Args[Idx];
// Optional arguments are considered trivially one.
if (!Arg)
return OneArgResult::EqualToOne;
const auto *CE = dyn_cast<ConstantExpr>(Args[Idx]);
if (!CE)
return OneArgResult::Unknown;
if (CE->getResultAsAPSInt() != 1)
return OneArgResult::NotEqualToOne;
}
return OneArgResult::EqualToOne;
}

class SemaSYCL : public SemaBase {
private:
// We store SYCL Kernels here and handle separately -- which is a hack.
Expand Down Expand Up @@ -396,6 +419,112 @@ class SemaSYCL : public SemaBase {
ParsedType ParsedTy);

void handleKernelAttr(Decl *D, const ParsedAttr &AL);

static OffloadArch getOffloadArch(const TargetInfo &TI);
static bool hasDependentExpr(Expr **Exprs, const size_t ExprsSize);

/// Emit a diagnostic about the given attribute having a deprecated name, and
/// also emit a fixit hint to generate the new attribute name.
void diagnoseDeprecatedAttribute(const ParsedAttr &A, StringRef NewScope,
StringRef NewName);

/// Diagnoses an attribute in the 'intelfpga' namespace and suggests using
/// the attribute in the 'intel' namespace instead.
void checkDeprecatedSYCLAttributeSpelling(const ParsedAttr &A,
StringRef NewName = "");

bool checkValidFPGAMemoryAttributesVar(Decl *D);

bool checkWorkGroupSize(const Expr *NSWIValue, const Expr *RWGSXDim,
const Expr *RWGSYDim, const Expr *RWGSZDim);
bool checkMaxAllowedWorkGroupSize(const Expr *RWGSXDim, const Expr *RWGSYDim,
const Expr *RWGSZDim, const Expr *MWGSXDim,
const Expr *MWGSYDim, const Expr *MWGSZDim);
bool areInvalidWorkGroupSizeAttrs(const Expr *MGValue, const Expr *XDim,
const Expr *YDim, const Expr *ZDim);

// If the declaration has a SYCLIntelMaxWorkGroupSizeAttr or
// ReqdWorkGroupSizeAttr, check to see if they hold equal values
// (1, 1, 1). Returns true if diagnosed.
template <typename AttrTy>
bool checkWorkGroupSizeAttrExpr(Decl *D, const AttributeCommonInfo &AL) {
if (const auto *A = D->getAttr<AttrTy>()) {
const Expr *Args[3] = {A->getXDim(), A->getYDim(), A->getZDim()};
if (OneArgResult::NotEqualToOne == areAllArgsOne(Args, 3)) {
Diag(A->getLocation(), diag::err_sycl_x_y_z_arguments_must_be_one)
<< A << AL;
return true;
}
}
return false;
}

bool anyWorkGroupSizesDiffer(const Expr *LHSXDim, const Expr *LHSYDim,
const Expr *LHSZDim, const Expr *RHSXDim,
const Expr *RHSYDim, const Expr *RHSZDim);
bool allWorkGroupSizesSame(const Expr *LHSXDim, const Expr *LHSYDim,
const Expr *LHSZDim, const Expr *RHSXDim,
const Expr *RHSYDim, const Expr *RHSZDim);

void addSYCLIntelPipeIOAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
void addSYCLDeviceHasAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
void addSYCLUsesAspectsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
void addSYCLIntelLoopFuseAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelNumSimdWorkItemsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelSchedulerTargetFmaxMhzAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelNoGlobalWorkOffsetAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelMaxGlobalWorkDimAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelMinWorkGroupsPerComputeUnitAttr(
Decl *D, const AttributeCommonInfo &CI, Expr *E);
void addSYCLIntelMaxWorkGroupsPerMultiprocessorAttr(
Decl *D, const AttributeCommonInfo &CI, Expr *E);
void addSYCLIntelMaxConcurrencyAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelPrivateCopiesAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelMaxReplicatesAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelInitiationIntervalAttr(Decl *D,
const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelESimdVectorizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLAddIRAttributesFunctionAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
void addSYCLAddIRAttributesKernelParameterAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
void addSYCLAddIRAttributesGlobalVariableAttr(Decl *D,
const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
void addSYCLAddIRAnnotationsMemberAttr(Decl *D, const AttributeCommonInfo &CI,
MutableArrayRef<Expr *> Args);
void addSYCLWorkGroupSizeHintAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
void addSYCLReqdWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
void addSYCLIntelMaxWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *XDim, Expr *YDim, Expr *ZDim);
void addSYCLIntelForcePow2DepthAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelBankWidthAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelNumBanksAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
void addSYCLIntelBankBitsAttr(Decl *D, const AttributeCommonInfo &CI,
Expr **Exprs, unsigned Size);
void addIntelReqdSubGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI,
Expr *E);
};

} // namespace clang
Expand Down
1 change: 1 addition & 0 deletions clang/lib/Sema/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ add_clang_library(clangSema
SemaStmtAsm.cpp
SemaStmtAttr.cpp
SemaSYCL.cpp
SemaSYCLDeclAttr.cpp
SemaSwift.cpp
SemaSystemZ.cpp
SemaTemplate.cpp
Expand Down
Loading