patch-r262261-llvm-r199014-sparc.diff revision 269012
1Pull in r199014 from upstream llvm trunk (by Venkatraman Govindaraju): 2 3 [Sparc] Bundle instruction with delay slow and its filler. Now, we can use -verify-machineinstrs with SPARC backend. 4 5Introduced here: http://svnweb.freebsd.org/changeset/base/262261 6 7Index: lib/Target/Sparc/DelaySlotFiller.cpp 8=================================================================== 9--- lib/Target/Sparc/DelaySlotFiller.cpp 10+++ lib/Target/Sparc/DelaySlotFiller.cpp 11@@ -19,6 +19,7 @@ 12 #include "llvm/ADT/Statistic.h" 13 #include "llvm/CodeGen/MachineFunctionPass.h" 14 #include "llvm/CodeGen/MachineInstrBuilder.h" 15+#include "llvm/CodeGen/MachineRegisterInfo.h" 16 #include "llvm/Support/CommandLine.h" 17 #include "llvm/Target/TargetInstrInfo.h" 18 #include "llvm/Target/TargetMachine.h" 19@@ -55,6 +56,11 @@ namespace { 20 bool runOnMachineBasicBlock(MachineBasicBlock &MBB); 21 bool runOnMachineFunction(MachineFunction &F) { 22 bool Changed = false; 23+ 24+ // This pass invalidates liveness information when it reorders 25+ // instructions to fill delay slot. 26+ F.getRegInfo().invalidateLiveness(); 27+ 28 for (MachineFunction::iterator FI = F.begin(), FE = F.end(); 29 FI != FE; ++FI) 30 Changed |= runOnMachineBasicBlock(*FI); 31@@ -61,9 +67,6 @@ namespace { 32 return Changed; 33 } 34 35- bool isDelayFiller(MachineBasicBlock &MBB, 36- MachineBasicBlock::iterator candidate); 37- 38 void insertCallDefsUses(MachineBasicBlock::iterator MI, 39 SmallSet<unsigned, 32>& RegDefs, 40 SmallSet<unsigned, 32>& RegUses); 41@@ -152,6 +155,10 @@ bool Filler::runOnMachineBasicBlock(MachineBasicBl 42 assert (J != MBB.end() && "MI needs a delay instruction."); 43 BuildMI(MBB, ++J, MI->getDebugLoc(), 44 TII->get(SP::UNIMP)).addImm(structSize); 45+ // Bundle the delay filler and unimp with the instruction. 46+ MIBundleBuilder(MBB, MachineBasicBlock::iterator(MI), J); 47+ } else { 48+ MIBundleBuilder(MBB, MachineBasicBlock::iterator(MI), I); 49 } 50 } 51 return Changed; 52@@ -209,7 +216,7 @@ Filler::findDelayInstr(MachineBasicBlock &MBB, 53 || I->isInlineAsm() 54 || I->isLabel() 55 || I->hasDelaySlot() 56- || isDelayFiller(MBB, I)) 57+ || I->isBundledWithSucc()) 58 break; 59 60 if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) { 61@@ -332,18 +339,6 @@ bool Filler::IsRegInSet(SmallSet<unsigned, 32>& Re 62 return false; 63 } 64 65-// return true if the candidate is a delay filler. 66-bool Filler::isDelayFiller(MachineBasicBlock &MBB, 67- MachineBasicBlock::iterator candidate) 68-{ 69- if (candidate == MBB.begin()) 70- return false; 71- if (candidate->getOpcode() == SP::UNIMP) 72- return true; 73- --candidate; 74- return candidate->hasDelaySlot(); 75-} 76- 77 bool Filler::needsUnimp(MachineBasicBlock::iterator I, unsigned &StructSize) 78 { 79 if (!I->isCall()) 80@@ -484,10 +479,10 @@ bool Filler::tryCombineRestoreWithPrevInst(Machine 81 && MBBI->getOperand(1).getReg() == SP::G0 82 && MBBI->getOperand(2).getReg() == SP::G0); 83 84- MachineBasicBlock::iterator PrevInst = MBBI; --PrevInst; 85+ MachineBasicBlock::iterator PrevInst = llvm::prior(MBBI); 86 87- // It cannot combine with a delay filler. 88- if (isDelayFiller(MBB, PrevInst)) 89+ // It cannot be combined with a bundled instruction. 90+ if (PrevInst->isBundledWithSucc()) 91 return false; 92 93 const TargetInstrInfo *TII = TM.getInstrInfo(); 94Index: lib/Target/Sparc/SparcAsmPrinter.cpp 95=================================================================== 96--- lib/Target/Sparc/SparcAsmPrinter.cpp 97+++ lib/Target/Sparc/SparcAsmPrinter.cpp 98@@ -184,7 +184,6 @@ static void LowerGETPCXAndEmitMCInsts(const Machin 99 100 void SparcAsmPrinter::EmitInstruction(const MachineInstr *MI) 101 { 102- MCInst TmpInst; 103 104 switch (MI->getOpcode()) { 105 default: break; 106@@ -195,8 +194,13 @@ void SparcAsmPrinter::EmitInstruction(const Machin 107 LowerGETPCXAndEmitMCInsts(MI, OutStreamer, OutContext); 108 return; 109 } 110- LowerSparcMachineInstrToMCInst(MI, TmpInst, *this); 111- OutStreamer.EmitInstruction(TmpInst); 112+ MachineBasicBlock::const_instr_iterator I = MI; 113+ MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end(); 114+ do { 115+ MCInst TmpInst; 116+ LowerSparcMachineInstrToMCInst(I, TmpInst, *this); 117+ OutStreamer.EmitInstruction(TmpInst); 118+ } while ((++I != E) && I->isInsideBundle()); // Delay slot check. 119 } 120 121 void SparcAsmPrinter::EmitFunctionBodyStart() { 122Index: test/CodeGen/SPARC/2011-01-19-DelaySlot.ll 123=================================================================== 124--- test/CodeGen/SPARC/2011-01-19-DelaySlot.ll 125+++ test/CodeGen/SPARC/2011-01-19-DelaySlot.ll 126@@ -1,5 +1,5 @@ 127-;RUN: llc -march=sparc < %s | FileCheck %s 128-;RUN: llc -march=sparc -O0 < %s | FileCheck %s -check-prefix=UNOPT 129+;RUN: llc -march=sparc < %s -verify-machineinstrs | FileCheck %s 130+;RUN: llc -march=sparc -O0 < %s -verify-machineinstrs | FileCheck %s -check-prefix=UNOPT 131 132 133 define i32 @test(i32 %a) nounwind { 134