[llvm-commits] [llvm] r153832 - in /llvm/trunk: lib/Transforms/IPO/InlineAlways.cpp test/Transforms/Inline/always-inline.ll

Chandler Carruth chandlerc at gmail.com
Sun Apr 1 03:21:05 PDT 2012


Author: chandlerc
Date: Sun Apr  1 05:21:05 2012
New Revision: 153832

URL: http://llvm.org/viewvc/llvm-project?rev=153832&view=rev
Log:
Fix a pretty scary bug I introduced into the always inliner with
a single missing character. Somehow, this had gone untested. I've added
tests for returns-twice logic specifically with the always-inliner that
would have caught this, and fixed the bug.

Thanks to Matt for the careful review and spotting this!!! =D

Modified:
    llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp
    llvm/trunk/test/Transforms/Inline/always-inline.ll

Modified: llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp?rev=153832&r1=153831&r2=153832&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/InlineAlways.cpp Sun Apr  1 05:21:05 2012
@@ -83,7 +83,7 @@
 
       // Disallow calls which expose returns-twice to a function not previously
       // attributed as such.
-      if (ReturnsTwice && CS.isCall() &&
+      if (!ReturnsTwice && CS.isCall() &&
           cast<CallInst>(CS.getInstruction())->canReturnTwice())
         return false;
     }

Modified: llvm/trunk/test/Transforms/Inline/always-inline.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/always-inline.ll?rev=153832&r1=153831&r2=153832&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/Inline/always-inline.ll (original)
+++ llvm/trunk/test/Transforms/Inline/always-inline.ll Sun Apr  1 05:21:05 2012
@@ -40,3 +40,41 @@
   call void @inner2( i32 %N )
   ret void
 }
+
+declare i32 @a() returns_twice
+declare i32 @b() returns_twice
+
+define i32 @inner3() alwaysinline {
+entry:
+  %call = call i32 @a() returns_twice
+  %add = add nsw i32 1, %call
+  ret i32 %add
+}
+define i32 @outer3() {
+entry:
+; CHECK: @outer3
+; CHECK-NOT: call i32 @a
+; CHECK: ret
+
+  %call = call i32 @inner3()
+  %add = add nsw i32 1, %call
+  ret i32 %add
+}
+
+define i32 @inner4() alwaysinline returns_twice {
+entry:
+  %call = call i32 @b() returns_twice
+  %add = add nsw i32 1, %call
+  ret i32 %add
+}
+
+define i32 @outer4() {
+entry:
+; CHECK: @outer4
+; CHECK: call i32 @b()
+; CHECK: ret
+
+  %call = call i32 @inner4() returns_twice
+  %add = add nsw i32 1, %call
+  ret i32 %add
+}





More information about the llvm-commits mailing list