123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //===-- llvm/CodeGen/ExpandISelPseudos.cpp ----------------------*- C++ -*-===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // Expand Pseudo-instructions produced by ISel. These are 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.
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/CodeGen/Passes.h"
- #include "llvm/CodeGen/MachineFunction.h"
- #include "llvm/CodeGen/MachineFunctionPass.h"
- #include "llvm/Support/Debug.h"
- #include "llvm/Target/TargetLowering.h"
- #include "llvm/Target/TargetSubtargetInfo.h"
- using namespace llvm;
- #define DEBUG_TYPE "expand-isel-pseudos"
- namespace {
- class ExpandISelPseudos : public MachineFunctionPass {
- public:
- static char ID; // Pass identification, replacement for typeid
- ExpandISelPseudos() : MachineFunctionPass(ID) {}
- private:
- bool runOnMachineFunction(MachineFunction &MF) override;
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- MachineFunctionPass::getAnalysisUsage(AU);
- }
- };
- } // end anonymous namespace
- char ExpandISelPseudos::ID = 0;
- char &llvm::ExpandISelPseudosID = ExpandISelPseudos::ID;
- INITIALIZE_PASS(ExpandISelPseudos, "expand-isel-pseudos",
- "Expand ISel Pseudo-instructions", false, false)
- bool ExpandISelPseudos::runOnMachineFunction(MachineFunction &MF) {
- bool Changed = false;
- const TargetLowering *TLI = MF.getSubtarget().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.
- if (MI->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;
- }
|