[llvm] r251123 - [ARM CodeGen] @llvm.debugtrap call may be removed when restoring callee saved registers
Oleg Ranevskyy via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 23 10:17:59 PDT 2015
Author: oleg
Date: Fri Oct 23 12:17:59 2015
New Revision: 251123
URL: http://llvm.org/viewvc/llvm-project?rev=251123&view=rev
Log:
[ARM CodeGen] @llvm.debugtrap call may be removed when restoring callee saved registers
Summary:
When ARMFrameLowering::emitPopInst generates a "pop" instruction to restore the callee saved registers, it checks if the LR register is among them. If so, the function may decide to remove the basic block's terminator and replace it with a "pop" to the PC register instead of LR.
This leads to a problem when the block's terminator is preceded by a "llvm.debugtrap" call. The MI iterator points to the trap in such a case, which is also a terminator. If the function decides to restore LR to PC, it erroneously removes the trap.
Reviewers: asl, rengolin
Subscribers: aemerson, jfb, rengolin, dschuff, llvm-commits
Differential Revision: http://reviews.llvm.org/D13672
Added:
llvm/trunk/test/CodeGen/ARM/debugtrap.ll
Modified:
llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp
Modified: llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp?rev=251123&r1=251122&r2=251123&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMFrameLowering.cpp Fri Oct 23 12:17:59 2015
@@ -968,12 +968,16 @@ void ARMFrameLowering::emitPopInst(Machi
DebugLoc DL;
bool isTailCall = false;
bool isInterrupt = false;
+ bool isTrap = false;
if (MBB.end() != MI) {
DL = MI->getDebugLoc();
unsigned RetOpcode = MI->getOpcode();
isTailCall = (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNri);
isInterrupt =
RetOpcode == ARM::SUBS_PC_LR || RetOpcode == ARM::t2SUBS_PC_LR;
+ isTrap =
+ RetOpcode == ARM::TRAP || RetOpcode == ARM::TRAPNaCl ||
+ RetOpcode == ARM::tTRAP;
}
SmallVector<unsigned, 4> Regs;
@@ -990,7 +994,7 @@ void ARMFrameLowering::emitPopInst(Machi
continue;
if (Reg == ARM::LR && !isTailCall && !isVarArg && !isInterrupt &&
- STI.hasV5TOps()) {
+ !isTrap && STI.hasV5TOps()) {
if (MBB.succ_empty()) {
Reg = ARM::PC;
DeleteRet = true;
Added: llvm/trunk/test/CodeGen/ARM/debugtrap.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debugtrap.ll?rev=251123&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/debugtrap.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/debugtrap.ll Fri Oct 23 12:17:59 2015
@@ -0,0 +1,17 @@
+; This test ensures the @llvm.debugtrap() call is not removed when generating
+; the 'pop' instruction to restore the callee saved registers on ARM.
+
+; RUN: llc < %s -mtriple=armv7 -O0 -filetype=asm | FileCheck %s
+
+declare void @llvm.debugtrap() nounwind
+declare void @foo() nounwind
+
+define void @test() nounwind {
+entry:
+ ; CHECK: bl foo
+ ; CHECK-NEXT: pop
+ ; CHECK-NEXT: trap
+ call void @foo()
+ call void @llvm.debugtrap()
+ ret void
+}
More information about the llvm-commits
mailing list