diff options
author | Florian Hahn <florian.hahn@arm.com> | 2018-01-06 20:56:27 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2018-01-06 20:56:27 +0000 |
commit | a82eef2363c7b179ea0a343534c99dd192c7c6fd (patch) | |
tree | 03d05a3678bbdd0fca730741fa960a4404849554 | |
parent | de10e6e064e822f6d6bc0d25339b499af21d6be9 (diff) | |
download | bcm5719-llvm-a82eef2363c7b179ea0a343534c99dd192c7c6fd.tar.gz bcm5719-llvm-a82eef2363c7b179ea0a343534c99dd192c7c6fd.zip |
[InlineFunction] Preserve calling convention when forwarding VarArgs.
Reviewers: efriedma, rnk, davide
Reviewed By: rnk, davide
Differential Revision: https://reviews.llvm.org/D41556
llvm-svn: 321943
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 1 | ||||
-rw-r--r-- | llvm/test/Transforms/Inline/inline-varargs.ll | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 5574a3d2687..a96f78ea003 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1860,6 +1860,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, Params, "", CI); NewCI->setDebugLoc(CI->getDebugLoc()); NewCI->setAttributes(Attrs); + NewCI->setCallingConv(CI->getCallingConv()); CI->replaceAllUsesWith(NewCI); CI->eraseFromParent(); CI = NewCI; diff --git a/llvm/test/Transforms/Inline/inline-varargs.ll b/llvm/test/Transforms/Inline/inline-varargs.ll index b46821a992a..215f4007b73 100644 --- a/llvm/test/Transforms/Inline/inline-varargs.ll +++ b/llvm/test/Transforms/Inline/inline-varargs.ll @@ -3,6 +3,7 @@ declare void @ext_method(i8*, i32) declare signext i16 @vararg_fn(...) #0 +declare "cc 9" void @vararg_fn_cc9(i8* %p, ...) define linkonce_odr void @thunk(i8* %this, ...) { %this_adj = getelementptr i8, i8* %this, i32 4 @@ -41,6 +42,18 @@ define void @test_caller_3(i8* %p, i8* %q) { ; CHECK-LABEL: define void @test_caller_3 ; CHECK: call signext i16 (...) @vararg_fn() +define void @test_preserve_cc(i8* %p, ...) { + musttail call "cc 9" void (i8*, ...) @vararg_fn_cc9(i8* %p, ...) + ret void +} + +define void @test_caller_preserve_cc(i8* %p, i8* %q) { + call void (i8*, ...) @test_preserve_cc(i8* %p, i8* %q) + ret void +} +; CHECK-LABEL: define void @test_caller_preserve_cc +; CHECK: call "cc 9" void (i8*, ...) @vararg_fn_cc9(i8* %p, i8* %q) + define internal i32 @varg_accessed(...) { entry: %vargs = alloca i8*, align 8 |