mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-10 22:43:46 +00:00
![Oleg Ranevskyy](/assets/img/avatar_default.png)
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251123 91177308-0d34-0410-b5e6-96231b3b80d8
18 lines
461 B
LLVM
18 lines
461 B
LLVM
; 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
|
|
}
|