1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[VirtRegMap] Fix for PR17825. Do not ignore noreturn definitions when setting

isPhysRegUsed if the unwind information is required.
Indeed, the runtime may need a correct stack to be able to unwind the call.

llvm-svn: 194271
This commit is contained in:
Quentin Colombet 2013-11-08 18:14:17 +00:00
parent 23f9645b7b
commit 6833715219
2 changed files with 21 additions and 5 deletions

View File

@ -285,7 +285,11 @@ void VirtRegRewriter::rewrite() {
if (!MO.isGlobal())
continue;
const Function *Func = dyn_cast<Function>(MO.getGlobal());
if (!Func || !Func->hasFnAttribute(Attribute::NoReturn))
if (!Func || !Func->hasFnAttribute(Attribute::NoReturn) ||
// We need to keep correct unwind information
// even if the function will not return, since the
// runtime may need it.
!Func->hasFnAttribute(Attribute::NoUnwind))
continue;
NoReturnInsts.insert(MI);
break;

View File

@ -2,8 +2,7 @@
; Test case from PR16882.
target triple = "thumbv7s-apple-ios"
; Function Attrs: noreturn
define i32 @test1() #0 {
define i32 @test1() {
; CHECK-LABEL: @test1
; CHECK-NOT: push
entry:
@ -11,7 +10,7 @@ entry:
unreachable
}
; Function Attrs: noreturn
; Function Attrs: noreturn nounwind
declare void @overflow() #0
define i32 @test2(i32 %x, i32 %y) {
@ -35,4 +34,17 @@ if.end: ; preds = %entry
ret i32 %conv2
}
attributes #0 = { noreturn }
; Test case for PR17825.
define i32 @test3() {
; CHECK-LABEL: @test3
; CHECK: push
entry:
tail call void @overflow_with_unwind() #1
unreachable
}
; Function Attrs: noreturn
declare void @overflow_with_unwind() #1
attributes #0 = { noreturn nounwind }
attributes #1 = { noreturn }