mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
Change basic block linking order to get better results (still not perfect)
This commit is contained in:
parent
d5f7de4a2e
commit
9bdfd59b6f
1 changed files with 14 additions and 22 deletions
|
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
#include <llvm/IR/IRBuilder.h>
|
#include <llvm/IR/IRBuilder.h>
|
||||||
#include <llvm/IR/CFG.h>
|
#include <llvm/IR/CFG.h>
|
||||||
|
#include <llvm/ADT/PostOrderIterator.h>
|
||||||
|
//#include <llvm/Transforms/Scalar.h>
|
||||||
|
|
||||||
#include <libevmface/Instruction.h>
|
#include <libevmface/Instruction.h>
|
||||||
|
|
||||||
|
|
@ -901,36 +903,26 @@ void Compiler::linkBasicBlocks()
|
||||||
auto phi = llvm::cast<llvm::PHINode>(instIt);
|
auto phi = llvm::cast<llvm::PHINode>(instIt);
|
||||||
for (auto predIt = llvm::pred_begin(_llbb); predIt != llvm::pred_end(_llbb); ++predIt)
|
for (auto predIt = llvm::pred_begin(_llbb); predIt != llvm::pred_end(_llbb); ++predIt)
|
||||||
{
|
{
|
||||||
|
// TODO: In case entry block is reached - report error
|
||||||
auto& predBB = findBasicBlock(*predIt);
|
auto& predBB = findBasicBlock(*predIt);
|
||||||
// assert(valueIdx < predBB.getStack().size()); // TODO: Report error
|
auto value = predBB.getStack().get(valueIdx);
|
||||||
phi->addIncoming(predBB.getStack().get(valueIdx), predBB);
|
phi->addIncoming(value, predBB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Link basic blocks
|
|
||||||
for (auto&& p : basicBlocks)
|
// TODO: It is crappy visiting of basic blocks.
|
||||||
|
llvm::SmallPtrSet<llvm::BasicBlock*, 32> visitSet;
|
||||||
|
for (auto&& bb : basicBlocks) // TODO: External loop is to visit unreable blocks that can also have phi nodes
|
||||||
{
|
{
|
||||||
BasicBlock& bb = p.second;
|
for (auto it = llvm::po_ext_begin(bb.second.llvm(), visitSet),
|
||||||
completePhiNodes(bb.llvm());
|
end = llvm::po_ext_end(bb.second.llvm(), visitSet); it != end; ++it)
|
||||||
}
|
|
||||||
completePhiNodes(m_jumpTableBlock->llvm());
|
|
||||||
/*
|
|
||||||
llvm::BasicBlock* llvmBB = bb.llvm();
|
|
||||||
|
|
||||||
size_t valueIdx = 0;
|
|
||||||
auto firstNonPhi = llvmBB->getFirstNonPHI();
|
|
||||||
for (auto instIt = llvmBB->begin(); &*instIt != firstNonPhi; ++instIt, ++valueIdx)
|
|
||||||
{
|
{
|
||||||
auto phi = llvm::cast<llvm::PHINode>(instIt);
|
std::cerr << it->getName().str() << std::endl;
|
||||||
for (auto predIt = llvm::pred_begin(llvmBB); predIt != llvm::pred_end(llvmBB); ++predIt)
|
completePhiNodes(*it);
|
||||||
{
|
|
||||||
auto& predBB = findBasicBlock(*predIt);
|
|
||||||
assert(valueIdx < predBB.getStack().size()); // TODO: Report error
|
|
||||||
phi->addIncoming(predBB.getStack().get(valueIdx), predBB);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue