[PATCH] D52067: [inline Cost] Don't mark function accessing varargs as non-inlinable

Sameer AbuAsal via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 19 19:12:16 PDT 2018


sabuasal updated this revision to Diff 166212.
sabuasal marked 2 inline comments as done.
sabuasal added a comment.

- Simplified the test case.
- Added it to inline-varargs instead of having it in a separate file.


https://reviews.llvm.org/D52067

Files:
  lib/Analysis/InlineCost.cpp
  test/Transforms/Inline/inline-varargs.ll


Index: test/Transforms/Inline/inline-varargs.ll
===================================================================
--- test/Transforms/Inline/inline-varargs.ll
+++ test/Transforms/Inline/inline-varargs.ll
@@ -4,6 +4,7 @@
 declare void @ext_method(i8*, i32)
 declare signext i16 @vararg_fn(...) #0
 declare "cc 9" void @vararg_fn_cc9(i8* %p, ...)
+%struct.__va_list = type { i8* }
 
 define linkonce_odr void @thunk(i8* %this, ...) {
   %this_adj = getelementptr i8, i8* %this, i32 4
@@ -84,6 +85,37 @@
 ; CHECK: %res1 = call i32 (...) @varg_accessed(i32 10)
 ; CHECK-NEXT: %res2 = call i32 (...) @varg_accessed_alwaysinline(i32 15)
 
+define void @caller_with_vastart(i8* noalias nocapture readnone %args, ...) local_unnamed_addr #0 {
+entry:
+  %ap = alloca %struct.__va_list, align 4
+  %ap2 = alloca %struct.__va_list, align 4
+  %0 = bitcast %struct.__va_list* %ap to i8*
+  %1 = bitcast %struct.__va_list* %ap to i8*
+  call void @llvm.va_start(i8* nonnull %0)
+  call fastcc void @callee_with_vaend(%struct.__va_list* nonnull %ap)
+  call void @llvm.va_start(i8* nonnull %1)
+  call fastcc void @callee_with_vaend_alwaysinline(%struct.__va_list* nonnull %ap2)
+  ret void
+}
+
+define internal fastcc void @callee_with_vaend_alwaysinline(%struct.__va_list* %a) unnamed_addr alwaysinline {
+entry:
+  %0 = bitcast %struct.__va_list* %a to i8*
+  tail call void @llvm.va_end(i8* %0)
+  ret void
+}
+
+define internal fastcc void @callee_with_vaend(%struct.__va_list* %a) unnamed_addr {
+entry:
+  %0 = bitcast %struct.__va_list* %a to i8*
+  tail call void @llvm.va_end(i8* %0)
+  ret void
+}
+
+; CHECK-LABEL: @caller_with_vastart
+; CHECK-NOT: @callee_with_vaend
+; CHECK-NOT: @callee_with_vaend_alwaysinline
+
 declare void @llvm.va_start(i8*)
 declare void @llvm.va_end(i8*)
 
Index: lib/Analysis/InlineCost.cpp
===================================================================
--- lib/Analysis/InlineCost.cpp
+++ lib/Analysis/InlineCost.cpp
@@ -1239,7 +1239,6 @@
         HasUninlineableIntrinsic = true;
         return false;
       case Intrinsic::vastart:
-      case Intrinsic::vaend:
         UsesVarArgs = true;
         return false;
       }
@@ -2081,7 +2080,6 @@
         case llvm::Intrinsic::localescape:
         // Disallow inlining of functions that access VarArgs.
         case llvm::Intrinsic::vastart:
-        case llvm::Intrinsic::vaend:
           return false;
         }
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52067.166212.patch
Type: text/x-patch
Size: 2414 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180920/95fc0011/attachment.bin>


More information about the llvm-commits mailing list