[PATCH v2 24/50] helper-to-tcg: PrepareForTcgPass, demote PHI nodes
Anton Johansson via qemu development <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
PHI nodes have no clear analogue in TCG, this commits converts them to stack accesses using a built-in LLVM transformation. Signed-off-by: Anton Johansson <[email protected]> --- .../PrepareForTcgPass/PrepareForTcgPass.cpp | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/subprojects/helper-to-tcg/src/PrepareForTcgPass/PrepareForTcgPass.cpp b/subprojects/helper-to-tcg/src/PrepareForTcgPass/PrepareForTcgPass.cpp index 41f317ed0b..d8530406ad 100644 --- a/subprojects/helper-to-tcg/src/PrepareForTcgPass/PrepareForTcgPass.cpp +++ b/subprojects/helper-to-tcg/src/PrepareForTcgPass/PrepareForTcgPass.cpp @@ -20,7 +20,10 @@ #include <llvm/ADT/SCCIterator.h> #include <llvm/ADT/SmallPtrSet.h> #include <llvm/IR/Function.h> +#include <llvm/IR/InstIterator.h> +#include <llvm/IR/Instructions.h> #include <llvm/IR/Module.h> +#include <llvm/Transforms/Utils/Local.h> using namespace llvm; @@ -48,8 +51,28 @@ static void removeFunctionsWithLoops(Module &M, ModuleAnalysisManager &MAM) { } } +inline void demotePhis(Function &F) { + if (F.isDeclaration()) { + return; + } + + SmallVector<PHINode *, 10> Phis; + for (auto &I : instructions(F)) { + if (auto *Phi = dyn_cast<PHINode>(&I)) { + Phis.push_back(Phi); + } + } + + for (auto *Phi : Phis) { + DemotePHIToStack(Phi); + } +} + PreservedAnalyses PrepareForTcgPass::run(Module &M, ModuleAnalysisManager &MAM) { removeFunctionsWithLoops(M, MAM); + for (Function &F : M) { + demotePhis(F); + } return PreservedAnalyses::none(); } -- 2.52.0