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; } } 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*)