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

Quentin Colombet qcolombet at apple.com
Fri Nov 8 10:14:17 PST 2013


Author: qcolombet
Date: Fri Nov  8 12:14:17 2013
New Revision: 194271

URL: http://llvm.org/viewvc/llvm-project?rev=194271&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/CodeGen/VirtRegMap.cpp
    llvm/trunk/test/CodeGen/ARM/noreturn.ll

Modified: llvm/trunk/lib/CodeGen/VirtRegMap.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegMap.cpp?rev=194271&r1=194270&r2=194271&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/VirtRegMap.cpp (original)
+++ llvm/trunk/lib/CodeGen/VirtRegMap.cpp Fri Nov  8 12:14:17 2013
@@ -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;

Modified: llvm/trunk/test/CodeGen/ARM/noreturn.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/noreturn.ll?rev=194271&r1=194270&r2=194271&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/noreturn.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/noreturn.ll Fri Nov  8 12:14:17 2013
@@ -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:
   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 }





More information about the llvm-commits mailing list