Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
TAS-OPT
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
5
Issues
5
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Guruprasad Hegde
TAS-OPT
Commits
1bc08f1a
Commit
1bc08f1a
authored
Oct 23, 2019
by
guruhegde
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
LoopSplitter - add adapter block
Adapter block = [collector + distributor]
parent
654e7871
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
68 additions
and
5 deletions
+68
-5
src/LoopSplitter.cpp
src/LoopSplitter.cpp
+63
-3
src/LoopSplitter.h
src/LoopSplitter.h
+5
-2
No files found.
src/LoopSplitter.cpp
View file @
1bc08f1a
...
...
@@ -4,6 +4,8 @@
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/STLExtras.h>
#include <llvm/IR/CFG.h>
#include <llvm/IR/Dominators.h>
#include <llvm/IR/IRBuilder.h>
#include <iostream>
...
...
@@ -15,19 +17,77 @@ using namespace llvm;
namespace
tas
{
bool
addPrefetchCallForPointers
(
Function
*
F
,
Stats
&
stat
)
{
void
LoopSplitter
::
addAdapterBasicBlocks
(
Instruction
*
SP
)
{
auto
TopHalf
=
SP
->
getParent
();
auto
BottomHalf
=
TopHalf
->
splitBasicBlock
(
SP
->
getNextNode
());
auto
CollectBB
=
BasicBlock
::
Create
(
F
->
getContext
(),
"collector"
,
F
,
BottomHalf
);
auto
DistBB
=
BasicBlock
::
Create
(
F
->
getContext
(),
"distributor"
,
F
,
BottomHalf
);
BranchInst
::
Create
(
DistBB
,
CollectBB
);
setSuccessor
(
TopHalf
,
CollectBB
);
LoopSplitEdgeBlocks
.
push_back
(
CollectBB
);
// General case: Find all edges from basic blocks above tophalf and connect it to
// CollectBB, use switch Inst
IRBuilder
<>
Builder
(
&
F
->
getEntryBlock
().
front
());
auto
BrTargetAlloca
=
Builder
.
CreateAlloca
(
Builder
.
getInt32Ty
());
Builder
.
SetInsertPoint
(
DistBB
);
auto
BrVal
=
Builder
.
CreateLoad
(
BrTargetAlloca
);
auto
SwitchI
=
Builder
.
CreateSwitch
(
BrVal
,
BottomHalf
);
// XXX We assume now CFG we have is the one after block predication transformation.
SmallVector
<
BasicBlock
*
,
4
>
DivergeBlocks
;
SmallVector
<
std
::
pair
<
Value
*
,
BasicBlock
*>
,
4
>
TargetBlocks
;
DivergeBlocks
.
push_back
(
TopHalf
->
getUniquePredecessor
());
for
(
auto
&
DivergeBB
:
DivergeBlocks
)
{
auto
TermI
=
cast
<
BranchInst
>
(
DivergeBB
->
getTerminator
());
auto
Cond
=
TermI
->
getCondition
();
Builder
.
SetInsertPoint
(
TermI
);
auto
TgtBB
=
TermI
->
getSuccessor
(
1
);
auto
TgtBBVal
=
BBToId
[
TgtBB
];
Builder
.
CreateStore
(
TgtBBVal
,
BrTargetAlloca
);
TermI
->
setSuccessor
(
1
,
CollectBB
);
SwitchI
->
addCase
(
TgtBBVal
,
TgtBB
);
}
}
bool
LoopSplitter
::
prepareForLoopSplit
(
Function
*
F
,
Stats
&
stat
)
{
auto
AnnotatedVars
=
detectExpPtrVars
(
F
);
auto
VarUsePoints
=
detectExpPtrUses
(
AnnotatedVars
);
// Add unique id to each basic block
unsigned
i
=
0
;
IRBuilder
<>
Builder
(
F
->
getContext
());
for_each
(
*
F
,
[
&
]
(
const
auto
&
BB
)
{
BBToId
.
insert
(
std
::
make_pair
(
&
BB
,
Builder
.
getInt32
(
++
i
)));
});
for_each
(
VarUsePoints
,
[
&
]
(
auto
&
VarUse
)
{
addAdapterBasicBlocks
(
VarUse
);
});
for_each
(
VarUsePoints
,
[
&
]
(
auto
&
VarUse
)
{
insertLLVMPrefetchIntrinsic
(
F
,
VarUse
);
});
stat
.
AnnotatedVarsSize
=
AnnotatedVars
.
size
();
stat
.
VarUsePointsSize
=
VarUsePoints
.
size
();
return
VarUsePoints
.
size
()
!=
0
;
}
bool
LoopSplitter
::
run
()
{
Stats
stat
;
addPrefetchCallForPointers
(
F
,
stat
);
bool
changed
=
prepareForLoopSplit
(
F
,
stat
);
if
(
!
changed
)
return
false
;
// If no loops, we are done.
if
(
LI
->
begin
()
==
LI
->
end
())
return
false
;
// XXX Assume only one loop for now.
auto
L0
=
*
LI
->
begin
();
//assert (L0->getLoopPreheader() && "Loop doesn't have preheader!");
return
true
;
}
...
...
src/LoopSplitter.h
View file @
1bc08f1a
...
...
@@ -4,6 +4,7 @@
#include <string>
#include <llvm/ADT/SmallVector.h>
#include <llvm/IR/Constants.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Value.h>
...
...
@@ -34,14 +35,16 @@ class LoopSplitter {
llvm
::
LoopInfo
*
LI
;
Stats
stat
;
// Statistics
llvm
::
DenseMap
<
const
llvm
::
BasicBlock
*
,
llvm
::
ConstantInt
*>
BBToId
;
llvm
::
SmallVector
<
llvm
::
BasicBlock
*
,
4
>
LoopSplitEdgeBlocks
;
bool
prepareForLoopSplit
(
llvm
::
Function
*
F
,
Stats
&
stat
);
public:
LoopSplitter
(
llvm
::
Function
*
F_
,
llvm
::
LoopInfo
*
LI_
)
:
F
(
F_
),
LI
(
LI_
)
{}
bool
run
();
Stats
&
getStats
()
{
return
stat
;
}
void
addAdapterBasicBlocks
(
llvm
::
Instruction
*
SP
);
};
}
// tas namespace
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment