diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-06-16 18:49:08 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-06-16 18:49:08 +0000 |
commit | 5d28cb204f9f61e343fa63d7eb5f503786e56672 (patch) | |
tree | cdeaf59565da89dc25b14296e12144c605582883 | |
parent | 4be3f263c77b94815b8d094e94d55adb3f3637a7 (diff) | |
download | bcm5719-llvm-5d28cb204f9f61e343fa63d7eb5f503786e56672.tar.gz bcm5719-llvm-5d28cb204f9f61e343fa63d7eb5f503786e56672.zip |
GNU as refuses to assemble "pop {}" instruction. Do not emit such
(this is the case when we have thumb vararg function with single
callee-saved register, which is handled separately).
llvm-svn: 73529
-rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.cpp | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/vargs2.ll | 2 |
2 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.cpp b/llvm/lib/Target/ARM/ARMInstrInfo.cpp index 4b0dbb5dacd..d19fb8eea87 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMInstrInfo.cpp @@ -697,7 +697,6 @@ restoreCalleeSavedRegisters(MachineBasicBlock &MBB, bool isVarArg = AFI->getVarArgsRegSaveSize() > 0; MachineInstr *PopMI = MF.CreateMachineInstr(get(ARM::tPOP),MI->getDebugLoc()); - MBB.insert(MI, PopMI); for (unsigned i = CSI.size(); i != 0; --i) { unsigned Reg = CSI[i-1].getReg(); if (Reg == ARM::LR) { @@ -706,10 +705,15 @@ restoreCalleeSavedRegisters(MachineBasicBlock &MBB, continue; Reg = ARM::PC; PopMI->setDesc(get(ARM::tPOP_RET)); - MBB.erase(MI); + MI = MBB.erase(MI); } PopMI->addOperand(MachineOperand::CreateReg(Reg, true)); } + + // It's illegal to emit pop instruction without operands. + if (PopMI->getNumOperands() > 0) + MBB.insert(MI, PopMI); + return true; } diff --git a/llvm/test/CodeGen/ARM/vargs2.ll b/llvm/test/CodeGen/ARM/vargs2.ll index fb0b8d8ef7c..56169100fc7 100644 --- a/llvm/test/CodeGen/ARM/vargs2.ll +++ b/llvm/test/CodeGen/ARM/vargs2.ll @@ -1,6 +1,6 @@ ; RUN: llvm-as < %s | llc -march=thumb ; RUN: llvm-as < %s | llc -march=thumb | \ -; RUN: grep pop | count 2 +; RUN: grep pop | count 1 @str = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=1] |