From 8ad88f129cc489fc3076f399fd9c1bebc6e28bf1 Mon Sep 17 00:00:00 2001 From: Joshua Cao Date: Sun, 13 Nov 2022 22:24:15 -0500 Subject: [PATCH] Do not write a comma when varargs is the only argument Fixes https://github.com/llvm/llvm-project/issues/56544 AsmWriter always writes ", ..." when a tail call has a varargs argument. This patch only writes the ", " when there is an argument before the varargs argument. I did not write a dedicated test this for this change, but I modified an existing test that will test for a regression. Reviewed By: avogelsgesang Differential Revision: https://reviews.llvm.org/D137893 Signed-off-by: Adrian Vogelsgesang --- llvm/lib/IR/AsmWriter.cpp | 8 +++++--- llvm/test/Transforms/Inline/inline-brunch-funnel.ll | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index d49b8710..22e12b2 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -4140,7 +4140,6 @@ void AssemblyWriter::printInstruction(const Instruction &I) { // If possible, print out the short form of the call instruction. We can // only do this if the first argument is a pointer to a nonvararg function, // and if the return type is not a pointer to a function. - // Out << ' '; TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out); Out << ' '; @@ -4156,8 +4155,11 @@ void AssemblyWriter::printInstruction(const Instruction &I) { // is only to aid readability, musttail calls forward varargs by default. if (CI->isMustTailCall() && CI->getParent() && CI->getParent()->getParent() && - CI->getParent()->getParent()->isVarArg()) - Out << ", ..."; + CI->getParent()->getParent()->isVarArg()) { + if (CI->arg_size() > 0) + Out << ", "; + Out << "..."; + } Out << ')'; if (PAL.hasFnAttrs()) diff --git a/llvm/test/Transforms/Inline/inline-brunch-funnel.ll b/llvm/test/Transforms/Inline/inline-brunch-funnel.ll index 54c6600..567abc6 100644 --- a/llvm/test/Transforms/Inline/inline-brunch-funnel.ll +++ b/llvm/test/Transforms/Inline/inline-brunch-funnel.ll @@ -9,27 +9,27 @@ declare void @llvm.icall.branch.funnel(...) ; CHECK-LABEL: define void @fn_musttail( define void @fn_musttail() { call void (...) @bf_musttail() - ; CHECK: call void (...) @bf_musttail( + ; CHECK: call void (...) @bf_musttail() ret void } ; CHECK-LABEL: define internal void @bf_musttail( define internal void @bf_musttail(...) { musttail call void (...) @llvm.icall.branch.funnel(...) - ; CHECK: musttail call void (...) @llvm.icall.branch.funnel( + ; CHECK: musttail call void (...) @llvm.icall.branch.funnel(...) ret void } ; CHECK-LABEL: define void @fn_musttail_always( define void @fn_musttail_always() { call void (...) @bf_musttail_always() - ; CHECK: call void (...) @bf_musttail_always( + ; CHECK: call void (...) @bf_musttail_always() ret void } ; CHECK-LABEL: define internal void @bf_musttail_always( define internal void @bf_musttail_always(...) alwaysinline { musttail call void (...) @llvm.icall.branch.funnel(...) - ; CHECK: musttail call void (...) @llvm.icall.branch.funnel( + ; CHECK: musttail call void (...) @llvm.icall.branch.funnel(...) ret void } -- 2.7.4