From: Chris Lattner Date: Mon, 10 Mar 2008 23:34:12 +0000 (+0000) Subject: Don't emit FP_REG_KILL into a block that just returns. Nothing X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=03fdec04d1f179f32047aa6752aa59f2674c9894;p=oota-llvm.git Don't emit FP_REG_KILL into a block that just returns. Nothing can be live out of the block anyway, so it isn't needed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48192 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 6036dcbf2e0..a4da5415883 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -550,7 +550,8 @@ void X86DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { DAG.RemoveDeadNodes(); - // Emit machine code to BB. + // Emit machine code to BB. This can change 'BB' to the last block being + // inserted into. ScheduleAndEmitDAG(DAG); // If we are emitting FP stack code, scan the basic block to determine if this @@ -566,15 +567,27 @@ void X86DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { // 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.) MachineFunction::iterator MBBI = FirstMBB; - do { + MachineFunction::iterator EndMBB = BB; ++EndMBB; + 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; + } + bool ContainsFPCode = false; - for (MachineBasicBlock::iterator I = MBBI->begin(), E = MBBI->end(); + for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); !ContainsFPCode && I != E; ++I) { if (I->getNumOperands() != 0 && I->getOperand(0).isRegister()) { const TargetRegisterClass *clas; for (unsigned op = 0, e = I->getNumOperands(); op != e; ++op) { if (I->getOperand(op).isRegister() && I->getOperand(op).isDef() && - TargetRegisterInfo::isVirtualRegister(I->getOperand(op).getReg()) && + TargetRegisterInfo::isVirtualRegister(I->getOperand(op).getReg()) && ((clas = RegInfo->getRegClass(I->getOperand(0).getReg())) == X86::RFP32RegisterClass || clas == X86::RFP64RegisterClass || @@ -608,11 +621,11 @@ void X86DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { } // Finally, if we found any FP code, emit the FP_REG_KILL instruction. if (ContainsFPCode) { - BuildMI(*MBBI, MBBI->getFirstTerminator(), + BuildMI(*MBB, MBBI->getFirstTerminator(), TM.getInstrInfo()->get(X86::FP_REG_KILL)); ++NumFPKill; } - } while (&*(MBBI++) != BB); + } } /// EmitSpecialCodeForMain - Emit any code that needs to be executed only in diff --git a/test/CodeGen/X86/2007-07-25-EpilogueBug.ll b/test/CodeGen/X86/2007-07-25-EpilogueBug.ll index f0308bd63be..ddac6ce217d 100644 --- a/test/CodeGen/X86/2007-07-25-EpilogueBug.ll +++ b/test/CodeGen/X86/2007-07-25-EpilogueBug.ll @@ -1,5 +1,7 @@ +; Verify that the addl comes before any popl. + ; RUN: llvm-as < %s | llc -mtriple=i686-pc-linux-gnu -mcpu=i386 | \ -; RUN: %prcontext ret 1 | grep FP_REG_KILL +; RUN: %prcontext ret 1 | grep popl ; PR1573 %struct.c34006f__TsB = type { i8, i32, i32, %struct.c34006f__TsB___b___XVN }