Meinersbur updated this revision to Diff 230670.
Meinersbur added a comment.
- Remove some leftovers
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D70572/new/
https://reviews.llvm.org/D70572
Files:
clang/include/clang/Serialization/ASTBitCodes.h
clang/include/clang/Serialization/ASTReader.h
clang/include/clang/Serialization/ASTWriter.h
clang/lib/AST/StmtProfile.cpp
clang/lib/Serialization/ASTReader.cpp
clang/lib/Serialization/ASTReaderStmt.cpp
clang/lib/Serialization/ASTWriter.cpp
clang/lib/Serialization/ASTWriterStmt.cpp
clang/test/PCH/transform-interleave.cpp
clang/test/PCH/transform-unroll.cpp
clang/test/PCH/transform-unrollandjam.cpp
clang/test/PCH/transform-vectorize.cpp
Index: clang/test/PCH/transform-vectorize.cpp
===================================================================
--- /dev/null
+++ clang/test/PCH/transform-vectorize.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -emit-pch -o %t.pch %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -include-pch %t.pch %s -ast-dump-all -o - | FileCheck %s
+
+#ifndef HEADER
+#define HEADER
+
+void vectorize_heuristic(int n) {
+#pragma clang transform vectorize
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported vectorize_heuristic
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: ForStmt
+
+
+void vectorize_width(int n) {
+#pragma clang transform vectorize width(4)
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported vectorize_width
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: WidthClause
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
+// CHECK-NEXT: ForStmt
+
+#endif /* HEADER */
Index: clang/test/PCH/transform-unrollandjam.cpp
===================================================================
--- /dev/null
+++ clang/test/PCH/transform-unrollandjam.cpp
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -emit-pch -o %t.pch %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -include-pch %t.pch %s -ast-dump-all -o - | FileCheck %s
+
+#ifndef HEADER
+#define HEADER
+
+void unrollandjam_heuristic(int n) {
+#pragma clang transform unrollandjam
+ for (int i = 0; i < n; i+=1)
+ for (int j = 0; j < n; j+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unrollandjam_heuristic
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: ForStmt
+
+
+void unrollandjam_partial(int n) {
+#pragma clang transform unrollandjam partial(4)
+ for (int i = 0; i < n; i+=1)
+ for (int j = 0; j < n; j+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unrollandjam_partial
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
+// CHECK-NEXT: ForStmt
+
+#endif /* HEADER */
Index: clang/test/PCH/transform-unroll.cpp
===================================================================
--- /dev/null
+++ clang/test/PCH/transform-unroll.cpp
@@ -0,0 +1,85 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -emit-pch -o %t.pch %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -include-pch %t.pch %s -ast-dump-all -o - | FileCheck %s
+
+#ifndef HEADER
+#define HEADER
+
+void unroll_heuristic(int n) {
+#pragma clang transform unroll
+ for (int i = 0; i < 4; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unroll_heuristic
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: ForStmt
+
+
+void unroll_full(int n) {
+#pragma clang transform unroll full
+ for (int i = 0; i < 4; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unroll_full
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: FullClause
+// CHECK-NEXT: ForStmt
+
+
+void unroll_partial(int n) {
+#pragma clang transform unroll partial(4)
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unroll_partial
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
+// CHECK-NEXT: ForStmt
+
+
+template<int FACTOR>
+void unroll_template_function(int n) {
+#pragma clang transform unroll partial(FACTOR)
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported unroll_template_function
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: DeclRefExpr {{.*}} 'FACTOR' 'int'
+// CHECK-NEXT: ForStmt
+
+
+template void unroll_template_function<5>(int);
+// CHECK-LABEL: FunctionDecl {{.*}} imported unroll_template_function
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: SubstNonTypeTemplateParmExpr
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 5
+// CHECK-NEXT: ForStmt
+
+
+template<int FACTOR>
+struct Unroll {
+ void unroll_template_method(int n) {
+#pragma clang transform unroll partial(FACTOR)
+ for (int i = 0; i < n; i+=1)
+ ;
+ }
+};
+// CHECK-LABEL: CXXMethodDecl {{.*}} imported unroll_template_method
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: DeclRefExpr {{.*}} 'FACTOR' 'int'
+// CHECK-NEXT: ForStmt
+
+
+template struct Unroll<6>;
+// CHECK-LABEL: CXXMethodDecl {{.*}} imported unroll_template_method
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: PartialClause
+// CHECK-NEXT: SubstNonTypeTemplateParmExpr
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 6
+// CHECK-NEXT: ForStmt
+
+#endif /* HEADER */
Index: clang/test/PCH/transform-interleave.cpp
===================================================================
--- /dev/null
+++ clang/test/PCH/transform-interleave.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -emit-pch -o %t.pch %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexperimental-transform-pragma -include-pch %t.pch %s -ast-dump-all -o - | FileCheck %s
+
+#ifndef HEADER
+#define HEADER
+
+void interleave_heuristic(int n) {
+#pragma clang transform interleave
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported interleave_heuristic
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: ForStmt
+
+
+void interleave_factor(int n) {
+#pragma clang transform interleave factor(4)
+ for (int i = 0; i < n; i+=1)
+ ;
+}
+// CHECK-LABEL: FunctionDecl {{.*}} imported interleave_factor
+// CHECK: TransformExecutableDirective
+// CHECK-NEXT: FactorClause
+// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 4
+// CHECK-NEXT: ForStmt
+
+#endif /* HEADER */
Index: clang/lib/Serialization/ASTWriterStmt.cpp
===================================================================
--- clang/lib/Serialization/ASTWriterStmt.cpp
+++ clang/lib/Serialization/ASTWriterStmt.cpp
@@ -1959,7 +1959,16 @@
void ASTStmtWriter::VisitTransformExecutableDirective(
TransformExecutableDirective *D) {
- llvm_unreachable("not implemented");
+ Code = serialization::STMT_TRANSFORM_EXECUTABLE_DIRECTIVE;
+ VisitStmt(D);
+ Record.push_back(D->getNumClauses());
+
+ Record.AddSourceRange(D->getRange());
+ TransformClauseWriter ClauseWriter(Record);
+ for (auto C : D->clauses())
+ ClauseWriter.writeClause(C);
+
+ Record.AddStmt(D->getAssociated());
}
//===----------------------------------------------------------------------===//
Index: clang/lib/Serialization/ASTWriter.cpp
===================================================================
--- clang/lib/Serialization/ASTWriter.cpp
+++ clang/lib/Serialization/ASTWriter.cpp
@@ -7127,3 +7127,29 @@
Record.AddSourceLocation(C->getLParenLoc());
Record.AddSourceLocation(C->getAtomicDefaultMemOrderKindKwLoc());
}
+
+void TransformClauseWriter::writeClause(const TransformClause *C) {
+ Record.push_back(C->getKind());
+ Record.AddSourceRange(C->getRange());
+ Visit(C);
+}
+
+//===----------------------------------------------------------------------===//
+// TransformClause Serialization
+//===----------------------------------------------------------------------===//
+
+void TransformClauseWriter::VisitFullClause(const FullClause *C) {
+ // The full clause has no arguments.
+}
+
+void TransformClauseWriter::VisitPartialClause(const PartialClause *C) {
+ Record.AddStmt(C->getFactor());
+}
+
+void TransformClauseWriter::VisitWidthClause(const WidthClause *C) {
+ Record.AddStmt(C->getWidth());
+}
+
+void TransformClauseWriter::VisitFactorClause(const FactorClause *C) {
+ Record.AddStmt(C->getFactor());
+}
Index: clang/lib/Serialization/ASTReaderStmt.cpp
===================================================================
--- clang/lib/Serialization/ASTReaderStmt.cpp
+++ clang/lib/Serialization/ASTReaderStmt.cpp
@@ -2014,7 +2014,22 @@
void ASTStmtReader::VisitTransformExecutableDirective(
TransformExecutableDirective *D) {
- llvm_unreachable("not implemented");
+ VisitStmt(D);
+ unsigned NumClauses = Record.readInt();
+ assert(D->getNumClauses() == NumClauses);
+ // The binary layout up to here is also assumed by
+ // ASTReader::ReadStmtFromStream and must be kept in-sync.
+
+ D->setRange(ReadSourceRange());
+
+ SmallVector<TransformClause *, 8> Clauses;
+ Clauses.reserve(NumClauses);
+ TransformClauseReader ClauseReader(Record);
+ for (unsigned i = 0; i < NumClauses; ++i)
+ Clauses.push_back(ClauseReader.readClause());
+ D->setClauses(Clauses);
+
+ D->setAssociated(Record.readSubStmt());
}
//===----------------------------------------------------------------------===//
@@ -3272,6 +3287,11 @@
break;
}
+ case STMT_TRANSFORM_EXECUTABLE_DIRECTIVE:
+ S = TransformExecutableDirective::createEmpty(
+ Context, Record[ASTStmtReader::NumStmtFields]);
+ break;
+
case EXPR_CXX_OPERATOR_CALL:
S = CXXOperatorCallExpr::CreateEmpty(
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
Index: clang/lib/Serialization/ASTReader.cpp
===================================================================
--- clang/lib/Serialization/ASTReader.cpp
+++ clang/lib/Serialization/ASTReader.cpp
@@ -13244,3 +13244,40 @@
}
C->setComponents(Components, ListSizes);
}
+
+//===----------------------------------------------------------------------===//
+// TransformClauseReader implementation
+//===----------------------------------------------------------------------===//
+
+TransformClause *TransformClauseReader::readClause() {
+ uint64_t Kind = Record.readInt();
+ SourceRange Range = Record.readSourceRange();
+
+ switch (Kind) {
+#define TRANSFORM_CLAUSE(Keyword, Name) \
+ case TransformClause::Kind::Name##Kind: \
+ return read##Name##Clause(Range);
+#include "clang/AST/TransformClauseKinds.def"
+ default:
+ llvm_unreachable("Unknown transform clause kind");
+ }
+}
+
+FullClause *TransformClauseReader::readFullClause(SourceRange Range) {
+ return FullClause::create(Context, Range);
+}
+
+PartialClause *TransformClauseReader::readPartialClause(SourceRange Range) {
+ Expr *Factor = Record.readExpr();
+ return PartialClause::create(Context, Range, Factor);
+}
+
+WidthClause *TransformClauseReader::readWidthClause(SourceRange Range) {
+ Expr *Width = Record.readExpr();
+ return WidthClause::create(Context, Range, Width);
+}
+
+FactorClause *TransformClauseReader::readFactorClause(SourceRange Range) {
+ Expr *Factor = Record.readExpr();
+ return FactorClause::create(Context, Range, Factor);
+}
Index: clang/lib/AST/StmtProfile.cpp
===================================================================
--- clang/lib/AST/StmtProfile.cpp
+++ clang/lib/AST/StmtProfile.cpp
@@ -771,9 +771,45 @@
}
}
+namespace {
+class TransformClauseProfiler
+ : public ConstTransformClauseVisitor<TransformClauseProfiler> {
+ StmtProfiler *Profiler;
+
+public:
+ TransformClauseProfiler(StmtProfiler *P) : Profiler(P) {}
+
+#define TRANSFORM_CLAUSE(Keyword, Name) \
+ void Visit##Name##Clause(const Name##Clause *);
+#include "clang/AST/TransformClauseKinds.def"
+};
+
+void TransformClauseProfiler::VisitFullClause(const FullClause *C) {
+ // The full clause has no arguments.
+}
+
+void TransformClauseProfiler::VisitPartialClause(const PartialClause *C) {
+ Profiler->VisitExpr(C->getFactor());
+}
+
+void TransformClauseProfiler::VisitWidthClause(const WidthClause *C) {
+ Profiler->VisitExpr(C->getWidth());
+}
+
+void TransformClauseProfiler::VisitFactorClause(const FactorClause *C) {
+ Profiler->VisitExpr(C->getFactor());
+}
+} // namespace
+
void StmtProfiler::VisitTransformExecutableDirective(
const TransformExecutableDirective *S) {
VisitStmt(S);
+ TransformClauseProfiler P(this);
+ for (TransformClause *C : S->clauses()) {
+ if (!C)
+ continue;
+ P.Visit(C);
+ }
}
void
Index: clang/include/clang/Serialization/ASTWriter.h
===================================================================
--- clang/include/clang/Serialization/ASTWriter.h
+++ clang/include/clang/Serialization/ASTWriter.h
@@ -19,6 +19,7 @@
#include "clang/AST/DeclarationName.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/OpenMPClause.h"
+#include "clang/AST/StmtTransform.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
@@ -1013,6 +1014,24 @@
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
};
+class TransformClauseWriter
+ : public ConstTransformClauseVisitor<TransformClauseWriter> {
+ ASTRecordWriter &Record;
+
+public:
+ TransformClauseWriter(ASTRecordWriter &Record) : Record(Record) {}
+
+ void writeClause(const TransformClause *C);
+
+#define TRANSFORM_CLAUSE(Keyword, Name) \
+ void Visit##Name##Clause(const Name##Clause *);
+#include "clang/AST/TransformClauseKinds.def"
+
+ void VisitTransformClause(const TransformClause *C) {
+ llvm_unreachable("Serialization of this clause not implemented");
+ }
+};
+
} // namespace clang
#endif // LLVM_CLANG_SERIALIZATION_ASTWRITER_H
Index: clang/include/clang/Serialization/ASTReader.h
===================================================================
--- clang/include/clang/Serialization/ASTReader.h
+++ clang/include/clang/Serialization/ASTReader.h
@@ -2719,6 +2719,21 @@
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
};
+class TransformClauseReader {
+ ASTRecordReader &Record;
+ ASTContext &Context;
+
+public:
+ TransformClauseReader(ASTRecordReader &Record)
+ : Record(Record), Context(Record.getContext()) {}
+
+ TransformClause *readClause();
+
+#define TRANSFORM_CLAUSE(Keyword, Name) \
+ Name##Clause *read##Name##Clause(SourceRange);
+#include "clang/AST/TransformClauseKinds.def"
+};
+
} // namespace clang
#endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H
Index: clang/include/clang/Serialization/ASTBitCodes.h
===================================================================
--- clang/include/clang/Serialization/ASTBitCodes.h
+++ clang/include/clang/Serialization/ASTBitCodes.h
@@ -1939,6 +1939,9 @@
STMT_SEH_FINALLY, // SEHFinallyStmt
STMT_SEH_TRY, // SEHTryStmt
+ // Code transformation directives.
+ STMT_TRANSFORM_EXECUTABLE_DIRECTIVE, // TransformExecutableDirective
+
// OpenMP directives
STMT_OMP_PARALLEL_DIRECTIVE,
STMT_OMP_SIMD_DIRECTIVE,
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits