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
407418private:
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