ExpandISelPseudos.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===-- llvm/CodeGen/ExpandISelPseudos.cpp ----------------------*- C++ -*-===// 2e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 3e62c1185bee05facc25d1d725434f517261d308bChris Lattner// The LLVM Compiler Infrastructure 4e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 5e62c1185bee05facc25d1d725434f517261d308bChris Lattner// This file is distributed under the University of Illinois Open Source 6e62c1185bee05facc25d1d725434f517261d308bChris Lattner// License. See LICENSE.TXT for details. 7e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 8e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 9e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 10e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Expand Pseudo-instructions produced by ISel. These are usually to allow 11e62c1185bee05facc25d1d725434f517261d308bChris Lattner// the expansion to contain control flow, such as a conditional move 12e62c1185bee05facc25d1d725434f517261d308bChris Lattner// implemented with a conditional branch and a phi, or an atomic operation 13e62c1185bee05facc25d1d725434f517261d308bChris Lattner// implemented with a loop. 14e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 15e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 16e62c1185bee05facc25d1d725434f517261d308bChris Lattner 17e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/CodeGen/Passes.h" 18e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/CodeGen/MachineFunction.h" 19e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h" 20e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/Support/Debug.h" 21e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/Target/TargetLowering.h" 22e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "llvm/Target/TargetMachine.h" 23a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerusing namespace llvm; 24e62c1185bee05facc25d1d725434f517261d308bChris Lattner 25e62c1185bee05facc25d1d725434f517261d308bChris Lattner#define DEBUG_TYPE "expand-isel-pseudos" 26e62c1185bee05facc25d1d725434f517261d308bChris Lattner 27e62c1185bee05facc25d1d725434f517261d308bChris Lattnernamespace { 28e62c1185bee05facc25d1d725434f517261d308bChris Lattner class ExpandISelPseudos : public MachineFunctionPass { 29e62c1185bee05facc25d1d725434f517261d308bChris Lattner public: 30e62c1185bee05facc25d1d725434f517261d308bChris Lattner static char ID; // Pass identification, replacement for typeid 31e62c1185bee05facc25d1d725434f517261d308bChris Lattner ExpandISelPseudos() : MachineFunctionPass(ID) {} 32e62c1185bee05facc25d1d725434f517261d308bChris Lattner 33e62c1185bee05facc25d1d725434f517261d308bChris Lattner private: 34e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool runOnMachineFunction(MachineFunction &MF) override; 35e62c1185bee05facc25d1d725434f517261d308bChris Lattner 36e62c1185bee05facc25d1d725434f517261d308bChris Lattner void getAnalysisUsage(AnalysisUsage &AU) const override { 37e62c1185bee05facc25d1d725434f517261d308bChris Lattner MachineFunctionPass::getAnalysisUsage(AU); 38e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 39e62c1185bee05facc25d1d725434f517261d308bChris Lattner }; 40e62c1185bee05facc25d1d725434f517261d308bChris Lattner} // end anonymous namespace 41e62c1185bee05facc25d1d725434f517261d308bChris Lattner 42a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerchar ExpandISelPseudos::ID = 0; 43e62c1185bee05facc25d1d725434f517261d308bChris Lattnerchar &llvm::ExpandISelPseudosID = ExpandISelPseudos::ID; 44e62c1185bee05facc25d1d725434f517261d308bChris LattnerINITIALIZE_PASS(ExpandISelPseudos, "expand-isel-pseudos", 45e62c1185bee05facc25d1d725434f517261d308bChris Lattner "Expand ISel Pseudo-instructions", false, false) 46e62c1185bee05facc25d1d725434f517261d308bChris Lattner 47e62c1185bee05facc25d1d725434f517261d308bChris Lattnerbool ExpandISelPseudos::runOnMachineFunction(MachineFunction &MF) { 48e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool Changed = false; 49e62c1185bee05facc25d1d725434f517261d308bChris Lattner const TargetLowering *TLI = MF.getTarget().getTargetLowering(); 50e62c1185bee05facc25d1d725434f517261d308bChris Lattner 51e62c1185bee05facc25d1d725434f517261d308bChris Lattner // Iterate through each instruction in the function, looking for pseudos. 52e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 5307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner MachineBasicBlock *MBB = I; 5407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); 5507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner MBBI != MBBE; ) { 56e62c1185bee05facc25d1d725434f517261d308bChris Lattner MachineInstr *MI = MBBI++; 57e62c1185bee05facc25d1d725434f517261d308bChris Lattner 58e62c1185bee05facc25d1d725434f517261d308bChris Lattner // If MI is a pseudo, expand it. 59e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (MI->usesCustomInsertionHook()) { 60e62c1185bee05facc25d1d725434f517261d308bChris Lattner Changed = true; 61e62c1185bee05facc25d1d725434f517261d308bChris Lattner MachineBasicBlock *NewMBB = 62e62c1185bee05facc25d1d725434f517261d308bChris Lattner TLI->EmitInstrWithCustomInserter(MI, MBB); 63e62c1185bee05facc25d1d725434f517261d308bChris Lattner // The expansion may involve new basic blocks. 64e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (NewMBB != MBB) { 65e62c1185bee05facc25d1d725434f517261d308bChris Lattner MBB = NewMBB; 6607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner I = NewMBB; 6707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner MBBI = NewMBB->begin(); 6807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner MBBE = NewMBB->end(); 69e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 70e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 71e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 72e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 73e62c1185bee05facc25d1d725434f517261d308bChris Lattner 74e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Changed; 75e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 76e62c1185bee05facc25d1d725434f517261d308bChris Lattner