fix bug for AllocaInst that are wrapped in a PR
This commit is contained in:
parent
622835aa5e
commit
7e029ba1d5
|
@ -319,6 +319,7 @@ void handle_local_variable_intra_warp(std::vector<ParallelRegion> PRs,
|
||||||
// we should handle allocation generated by PHI
|
// we should handle allocation generated by PHI
|
||||||
{
|
{
|
||||||
std::vector<llvm::Instruction *> instruction_to_fix;
|
std::vector<llvm::Instruction *> instruction_to_fix;
|
||||||
|
std::vector<llvm::AllocaInst *> instruction_to_move;
|
||||||
auto F = PRs[0].start_block->getParent();
|
auto F = PRs[0].start_block->getParent();
|
||||||
for (auto bb = F->begin(); bb != F->end(); bb++) {
|
for (auto bb = F->begin(); bb != F->end(); bb++) {
|
||||||
for (auto ii = bb->begin(); ii != bb->end(); ii++) {
|
for (auto ii = bb->begin(); ii != bb->end(); ii++) {
|
||||||
|
@ -343,6 +344,7 @@ void handle_local_variable_intra_warp(std::vector<ParallelRegion> PRs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (allStoreNonDivergence) {
|
if (allStoreNonDivergence) {
|
||||||
|
instruction_to_move.push_back(alloc);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Do not duplicate var used outside PRs
|
// Do not duplicate var used outside PRs
|
||||||
|
@ -366,6 +368,8 @@ void handle_local_variable_intra_warp(std::vector<ParallelRegion> PRs,
|
||||||
}
|
}
|
||||||
if (!used_in_non_PR) {
|
if (!used_in_non_PR) {
|
||||||
instruction_to_fix.push_back(alloc);
|
instruction_to_fix.push_back(alloc);
|
||||||
|
} else {
|
||||||
|
instruction_to_move.push_back(alloc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -373,6 +377,18 @@ void handle_local_variable_intra_warp(std::vector<ParallelRegion> PRs,
|
||||||
for (auto inst : instruction_to_fix) {
|
for (auto inst : instruction_to_fix) {
|
||||||
AddContextSaveRestore(inst, intra_warp_loop);
|
AddContextSaveRestore(inst, intra_warp_loop);
|
||||||
}
|
}
|
||||||
|
for (auto alloc : instruction_to_move) {
|
||||||
|
// need to move all allocInst to the entry basic block
|
||||||
|
IRBuilder<> builder(&*(alloc->getParent()
|
||||||
|
->getParent()
|
||||||
|
->getEntryBlock()
|
||||||
|
.getFirstInsertionPt()));
|
||||||
|
auto newAllocInst =
|
||||||
|
builder.CreateAlloca(alloc->getType()->getElementType(),
|
||||||
|
alloc->getArraySize(), alloc->getName());
|
||||||
|
alloc->replaceAllUsesWith(newAllocInst);
|
||||||
|
alloc->removeFromParent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto parallel_regions : PRs) {
|
for (auto parallel_regions : PRs) {
|
||||||
|
|
Loading…
Reference in New Issue