[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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194271 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Quentin Colombet 2013-11-08 18:14:17 +00:00
parent 071a4f1a66
commit f0c6ab6f00
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 }