Skip to content

Commit ee9783c

Browse files
committed
Insert header in correct location
1 parent 719b9ba commit ee9783c

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

lib/Transform/Clang/LoopDistribution.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
#include "tsar/Support/GlobalOptions.h"
4242
#include "tsar/Unparse/Utils.h"
4343
#include <clang/AST/RecursiveASTVisitor.h>
44+
#include <clang/Basic/SourceLocation.h>
4445
#include <clang/Basic/SourceManager.h>
46+
#include <clang/Lex/Lexer.h>
4547
#include <llvm/ADT/Optional.h>
4648
#include <llvm/InitializePasses.h>
4749
#include <llvm/IR/Dominators.h>
@@ -127,7 +129,8 @@ class ASTVisitor : public RecursiveASTVisitor<ASTVisitor> {
127129
mGlobalOptions = &Pass.getAnalysis<GlobalOptionsImmutableWrapper>()
128130
.getOptions();
129131
mRewriter = &TransformationContext.getRewriter();
130-
mSourceManager = &TransformationContext.getRewriter().getSourceMgr();
132+
mSourceManager = &mRewriter->getSourceMgr();
133+
mLangOptions = &mRewriter->getLangOpts();
131134
mASTContext = &TransformationContext.getContext();
132135
auto& SocketInfo = Pass.getAnalysis<AnalysisSocketImmutableWrapper>().get();
133136
auto& Socket = SocketInfo.getActive()->second;
@@ -279,6 +282,7 @@ class ASTVisitor : public RecursiveASTVisitor<ASTVisitor> {
279282
return getLoopSplits(Loop, DependencyReads, DependencyWrites);
280283
}
281284

285+
//TODO: Remove last write if exists
282286
SplitInstructionVector getLoopSplits(
283287
Loop *Loop, const DependencyInstructionVector &Reads,
284288
const DependencyInstructionVector &Writes) const {
@@ -356,17 +360,11 @@ class ASTVisitor : public RecursiveASTVisitor<ASTVisitor> {
356360

357361
dbgs() << LoopHeaderSplitter.getValue() << "\n";
358362
for (auto *Split : Splits) {
359-
const auto &ExpressionMatcherItr = mExpressionMatcher->find<IR>(Split);
360-
if (ExpressionMatcherItr == mExpressionMatcher->end()) {
361-
LLVM_DEBUG(dbgs() << "Store instruction can't be bound to AST node: ";
362-
Split->dump(););
363-
continue;
363+
const auto SplitLocation = getSplitSourceLocation(Split);
364+
if (SplitLocation.hasValue()) {
365+
mRewriter->InsertTextAfterToken(SplitLocation.getValue(),
366+
LoopHeaderSplitter.getValue());
364367
}
365-
const auto &SplitStatement = ExpressionMatcherItr->get<AST>();
366-
SplitStatement.dump(dbgs(), *mASTContext);
367-
// TODO: Incorrect location
368-
mRewriter->InsertText(SplitStatement.getSourceRange().getEnd(),
369-
LoopHeaderSplitter.getValue(), true, true);
370368
}
371369
}
372370

@@ -403,6 +401,19 @@ class ASTVisitor : public RecursiveASTVisitor<ASTVisitor> {
403401

404402
return std::string(BeginData, EndData);
405403
}
404+
405+
Optional<SourceLocation> getSplitSourceLocation(Instruction *Split) const {
406+
const auto &ExpressionMatcherItr = mExpressionMatcher->find<IR>(Split);
407+
if (ExpressionMatcherItr == mExpressionMatcher->end()) {
408+
LLVM_DEBUG(dbgs() << "Store instruction can't be bound to AST node: ";
409+
Split->dump(););
410+
return None;
411+
}
412+
413+
const auto &SplitStatement = ExpressionMatcherItr->get<AST>();
414+
return Lexer::getLocForEndOfToken(SplitStatement.getSourceRange().getEnd(),
415+
0, *mSourceManager, *mLangOptions);
416+
}
406417

407418
private:
408419
DFRegionInfo *mDFRegion;
@@ -417,6 +428,7 @@ class ASTVisitor : public RecursiveASTVisitor<ASTVisitor> {
417428
const GlobalOptions *mGlobalOptions;
418429
Rewriter *mRewriter;
419430
const SourceManager *mSourceManager;
431+
const LangOptions *mLangOptions;
420432
const ASTContext *mASTContext;
421433
DIAliasTree *mDIAliasTree;
422434
DIDependencInfo *mDIDependency;

0 commit comments

Comments
 (0)