1218885Sdim//===-- llvm/CodeGen/ExpandISelPseudos.cpp ----------------------*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10221345Sdim// Expand Pseudo-instructions produced by ISel. These are usually to allow 11218885Sdim// the expansion to contain control flow, such as a conditional move 12218885Sdim// implemented with a conditional branch and a phi, or an atomic operation 13218885Sdim// implemented with a loop. 14218885Sdim// 15218885Sdim//===----------------------------------------------------------------------===// 16218885Sdim 17218885Sdim#define DEBUG_TYPE "expand-isel-pseudos" 18249423Sdim#include "llvm/CodeGen/Passes.h" 19218885Sdim#include "llvm/CodeGen/MachineFunction.h" 20218885Sdim#include "llvm/CodeGen/MachineFunctionPass.h" 21249423Sdim#include "llvm/Support/Debug.h" 22218885Sdim#include "llvm/Target/TargetLowering.h" 23218885Sdim#include "llvm/Target/TargetMachine.h" 24218885Sdimusing namespace llvm; 25218885Sdim 26218885Sdimnamespace { 27218885Sdim class ExpandISelPseudos : public MachineFunctionPass { 28218885Sdim public: 29218885Sdim static char ID; // Pass identification, replacement for typeid 30218885Sdim ExpandISelPseudos() : MachineFunctionPass(ID) {} 31218885Sdim 32218885Sdim private: 33218885Sdim virtual bool runOnMachineFunction(MachineFunction &MF); 34218885Sdim 35218885Sdim virtual void getAnalysisUsage(AnalysisUsage &AU) const { 36218885Sdim MachineFunctionPass::getAnalysisUsage(AU); 37218885Sdim } 38218885Sdim }; 39218885Sdim} // end anonymous namespace 40218885Sdim 41218885Sdimchar ExpandISelPseudos::ID = 0; 42234353Sdimchar &llvm::ExpandISelPseudosID = ExpandISelPseudos::ID; 43218885SdimINITIALIZE_PASS(ExpandISelPseudos, "expand-isel-pseudos", 44234353Sdim "Expand ISel Pseudo-instructions", false, false) 45218885Sdim 46218885Sdimbool ExpandISelPseudos::runOnMachineFunction(MachineFunction &MF) { 47218885Sdim bool Changed = false; 48218885Sdim const TargetLowering *TLI = MF.getTarget().getTargetLowering(); 49218885Sdim 50218885Sdim // Iterate through each instruction in the function, looking for pseudos. 51218885Sdim for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 52218885Sdim MachineBasicBlock *MBB = I; 53218885Sdim for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); 54218885Sdim MBBI != MBBE; ) { 55218885Sdim MachineInstr *MI = MBBI++; 56218885Sdim 57218885Sdim // If MI is a pseudo, expand it. 58234353Sdim if (MI->usesCustomInsertionHook()) { 59218885Sdim Changed = true; 60218885Sdim MachineBasicBlock *NewMBB = 61218885Sdim TLI->EmitInstrWithCustomInserter(MI, MBB); 62218885Sdim // The expansion may involve new basic blocks. 63218885Sdim if (NewMBB != MBB) { 64218885Sdim MBB = NewMBB; 65218885Sdim I = NewMBB; 66218885Sdim MBBI = NewMBB->begin(); 67218885Sdim MBBE = NewMBB->end(); 68218885Sdim } 69218885Sdim } 70218885Sdim } 71218885Sdim } 72218885Sdim 73218885Sdim return Changed; 74218885Sdim} 75