FinalizeISel.cpp revision 360784
1//===-- llvm/CodeGen/FinalizeISel.cpp ---------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9/// This pass expands Pseudo-instructions produced by ISel, fixes register 10/// reservations and may do machine frame information adjustments. 11/// The pseudo instructions are used to allow the expansion to contain control 12/// flow, such as a conditional move implemented with a conditional branch and a 13/// phi, or an atomic operation implemented with a loop. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/CodeGen/MachineFunction.h" 18#include "llvm/CodeGen/MachineFunctionPass.h" 19#include "llvm/CodeGen/Passes.h" 20#include "llvm/CodeGen/TargetLowering.h" 21#include "llvm/CodeGen/TargetSubtargetInfo.h" 22#include "llvm/InitializePasses.h" 23#include "llvm/Support/Debug.h" 24using namespace llvm; 25 26#define DEBUG_TYPE "finalize-isel" 27 28namespace { 29 class FinalizeISel : public MachineFunctionPass { 30 public: 31 static char ID; // Pass identification, replacement for typeid 32 FinalizeISel() : MachineFunctionPass(ID) {} 33 34 private: 35 bool runOnMachineFunction(MachineFunction &MF) override; 36 37 void getAnalysisUsage(AnalysisUsage &AU) const override { 38 MachineFunctionPass::getAnalysisUsage(AU); 39 } 40 }; 41} // end anonymous namespace 42 43char FinalizeISel::ID = 0; 44char &llvm::FinalizeISelID = FinalizeISel::ID; 45INITIALIZE_PASS(FinalizeISel, DEBUG_TYPE, 46 "Finalize ISel and expand pseudo-instructions", false, false) 47 48bool FinalizeISel::runOnMachineFunction(MachineFunction &MF) { 49 bool Changed = false; 50 const TargetLowering *TLI = MF.getSubtarget().getTargetLowering(); 51 52 // Iterate through each instruction in the function, looking for pseudos. 53 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 54 MachineBasicBlock *MBB = &*I; 55 for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); 56 MBBI != MBBE; ) { 57 MachineInstr &MI = *MBBI++; 58 59 // If MI is a pseudo, expand it. 60 if (MI.usesCustomInsertionHook()) { 61 Changed = true; 62 MachineBasicBlock *NewMBB = TLI->EmitInstrWithCustomInserter(MI, MBB); 63 // The expansion may involve new basic blocks. 64 if (NewMBB != MBB) { 65 MBB = NewMBB; 66 I = NewMBB->getIterator(); 67 MBBI = NewMBB->begin(); 68 MBBE = NewMBB->end(); 69 } 70 } 71 } 72 } 73 74 TLI->finalizeLowering(MF); 75 76 return Changed; 77} 78