//===-- X86FloatingPoint.cpp - FP_REG_KILL inserter -----------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the pass which inserts FP_REG_KILL instructions. // //===----------------------------------------------------------------------===// #define DEBUG_TYPE "x86-codegen" #include "X86.h" #include "X86InstrInfo.h" #include "llvm/Instructions.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/CFG.h" #include "llvm/ADT/Statistic.h" using namespace llvm; STATISTIC(NumFPKill, "Number of FP_REG_KILL instructions added"); namespace { struct FPRegKiller : public MachineFunctionPass { static char ID; FPRegKiller() : MachineFunctionPass(&ID) {} virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); AU.addPreservedID(MachineLoopInfoID); AU.addPreservedID(MachineDominatorsID); MachineFunctionPass::getAnalysisUsage(AU); } virtual bool runOnMachineFunction(MachineFunction &MF); virtual const char *getPassName() const { return "X86 FP_REG_KILL inserter"; } }; char FPRegKiller::ID = 0; } FunctionPass *llvm::createX87FPRegKillInserterPass() { return new FPRegKiller(); } /// isFPStackVReg - Return true if the specified vreg is from a fp stack /// register class. static bool isFPStackVReg(unsigned RegNo, const MachineRegisterInfo &MRI) { if (!TargetRegisterInfo::isVirtualRegister(RegNo)) return false; switch (MRI.getRegClass(RegNo)->getID()) { default: return false; case X86::RFP32RegClassID: case X86::RFP64RegClassID: case X86::RFP80RegClassID: return true; } } /// ContainsFPStackCode - Return true if the specific MBB has floating point /// stack code, and thus needs an FP_REG_KILL. static bool ContainsFPStackCode(MachineBasicBlock *MBB, const MachineRegisterInfo &MRI) { // Scan the block, looking for instructions that define fp stack vregs. for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E; ++I) { if (I->getNumOperands() == 0 || !I->getOperand(0).isReg()) continue; for (unsigned op = 0, e = I->getNumOperands(); op != e; ++op) { if (!I->getOperand(op).isReg() || !I->getOperand(op).isDef()) continue; if (isFPStackVReg(I->getOperand(op).getReg(), MRI)) return true; } } // Check PHI nodes in successor blocks. These PHI's will be lowered to have // a copy of the input value in this block, which is a definition of the // value. for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(), E = MBB->succ_end(); SI != E; ++ SI) { MachineBasicBlock *SuccBB = *SI; for (MachineBasicBlock::iterator I = SuccBB->begin(), E = SuccBB->end(); I != E; ++I) { // All PHI nodes are at the top of the block. if (!I->isPHI()) break; if (isFPStackVReg(I->getOperand(0).getReg(), MRI)) return true; } } return false; } bool FPRegKiller::runOnMachineFunction(MachineFunction &MF) { // If we are emitting FP stack code, scan the basic block to determine if this // block defines any FP values. If so, put an FP_REG_KILL instruction before // the terminator of the block. // Note that FP stack instructions are used in all modes for long double, // so we always need to do this check. // Also note that it's possible for an FP stack register to be live across // an instruction that produces multiple basic blocks (SSE CMOV) so we // must check all the generated basic blocks. // Scan all of the machine instructions in these MBBs, checking for FP // stores. (RFP32 and RFP64 will not exist in SSE mode, but RFP80 might.) // Fast-path: If nothing is using the x87 registers, we don't need to do // any scanning. const MachineRegisterInfo &MRI = MF.getRegInfo(); if (MRI.getRegClassVirtRegs(X86::RFP80RegisterClass).empty() && MRI.getRegClassVirtRegs(X86::RFP64RegisterClass).empty() && MRI.getRegClassVirtRegs(X86::RFP32RegisterClass).empty()) return false; bool Changed = false; MachineFunction::iterator MBBI = MF.begin(); MachineFunction::iterator EndMBB = MF.end(); for (; MBBI != EndMBB; ++MBBI) { MachineBasicBlock *MBB = MBBI; // If this block returns, ignore it. We don't want to insert an FP_REG_KILL // before the return. if (!MBB->empty()) { MachineBasicBlock::iterator EndI = MBB->end(); --EndI; if (EndI->getDesc().isReturn()) continue; } // If we find any FP stack code, emit the FP_REG_KILL instruction. if (ContainsFPStackCode(MBB, MRI)) { BuildMI(*MBB, MBBI->getFirstTerminator(), DebugLoc(), MF.getTarget().getInstrInfo()->get(X86::FP_REG_KILL)); ++NumFPKill; Changed = true; } } return Changed; }