diff options
author | Dan Gohman <gohman@apple.com> | 2010-11-16 21:02:37 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-11-16 21:02:37 +0000 |
commit | 8b67c720f2e69b9793efd20b341e84a93c628433 (patch) | |
tree | 108ea70817cdf71607930ee52539c57b893b2f94 /llvm/lib/CodeGen/ExpandPseudos.cpp | |
parent | f89a56c74b3526d965acb1225ec4f482aeb93e6e (diff) | |
download | bcm5719-llvm-8b67c720f2e69b9793efd20b341e84a93c628433.tar.gz bcm5719-llvm-8b67c720f2e69b9793efd20b341e84a93c628433.zip |
Split pseudo-instruction expansion into a separate pass, to make it
easier to debug, and to avoid complications when the CFG changes
in the middle of the instruction selection process.
llvm-svn: 119382
Diffstat (limited to 'llvm/lib/CodeGen/ExpandPseudos.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ExpandPseudos.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/ExpandPseudos.cpp b/llvm/lib/CodeGen/ExpandPseudos.cpp new file mode 100644 index 00000000000..4f9e8ad2ae0 --- /dev/null +++ b/llvm/lib/CodeGen/ExpandPseudos.cpp @@ -0,0 +1,84 @@ +//===-- llvm/CodeGen/ExpandPseudos.cpp --------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Expand Psuedo-instructions produced by ISel. These is usually to allow +// the expansion to contain control flow, such as a conditional move +// implemented with a conditional branch and a phi, or an atomic operation +// implemented with a loop. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "expand-pseudos" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/Target/TargetLowering.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Support/Debug.h" +using namespace llvm; + +namespace { + class ExpandPseudos : public MachineFunctionPass { + public: + static char ID; // Pass identification, replacement for typeid + ExpandPseudos() : MachineFunctionPass(ID) {} + + private: + virtual bool runOnMachineFunction(MachineFunction &MF); + + const char *getPassName() const { + return "Expand CodeGen Pseudo-instructions"; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + MachineFunctionPass::getAnalysisUsage(AU); + } + }; +} // end anonymous namespace + +char ExpandPseudos::ID = 0; +INITIALIZE_PASS_BEGIN(ExpandPseudos, "expand-pseudos", + "Expand CodeGen Psueod-instructions", false, false) +INITIALIZE_PASS_END(ExpandPseudos, "expand-pseudos", + "Expand CodeGen Psueod-instructions", false, false) + +FunctionPass *llvm::createExpandPseudosPass() { + return new ExpandPseudos(); +} + +bool ExpandPseudos::runOnMachineFunction(MachineFunction &MF) { + bool Changed = false; + const TargetLowering *TLI = MF.getTarget().getTargetLowering(); + + // Iterate through each instruction in the function, looking for pseudos. + for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { + MachineBasicBlock *MBB = I; + for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); + MBBI != MBBE; ) { + MachineInstr *MI = MBBI++; + + // If MI is a pseudo, expand it. + const TargetInstrDesc &TID = MI->getDesc(); + if (TID.usesCustomInsertionHook()) { + Changed = true; + MachineBasicBlock *NewMBB = + TLI->EmitInstrWithCustomInserter(MI, MBB); + // The expansion may involve new basic blocks. + if (NewMBB != MBB) { + MBB = NewMBB; + I = NewMBB; + MBBI = NewMBB->begin(); + MBBE = NewMBB->end(); + } + } + } + } + + return Changed; +} |