[PATCH] D94167: [ARM][GISel] Treat calls as variadic even if only fixed arguments provided
Oliver Stannard (Linaro) via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 6 04:18:20 PST 2021
ostannard created this revision.
ostannard added a reviewer: rovka.
Herald added subscribers: danielkiss, hiraditya, kristof.beyls.
ostannard requested review of this revision.
Herald added a project: LLVM.
For the ARM hard-float calling convention, calls to variadic functions need to be treated differently, even if only the fixed arguments are provided.
This fixes GCC-C-execute-pr68390 in the test-suite, which is failing on the ARM GlobaISel bot.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D94167
Files:
llvm/lib/Target/ARM/ARMCallLowering.cpp
llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll
Index: llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll
===================================================================
--- llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll
+++ llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll
@@ -59,6 +59,27 @@
ret float %r
}
+define arm_aapcs_vfpcc float @test_call_to_varargs_with_floats_fixed_args_only(float %a, double %b) {
+; CHECK-LABEL: name: test_call_to_varargs_with_floats_fixed_args_only
+; CHECK-DAG: [[AVREG:%[0-9]+]]:_(s32) = COPY $s0
+; CHECK-DAG: [[BVREG:%[0-9]+]]:_(s64) = COPY $d1
+; CHECK: ADJCALLSTACKDOWN 0, 0, 14 /* CC::al */, $noreg, implicit-def $sp, implicit $sp
+; CHECK-DAG: $r0 = COPY [[AVREG]]
+; CHECK-DAG: [[B1:%[0-9]+]]:_(s32), [[B2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[BVREG]](s64)
+; CHECK-DAG: $r2 = COPY [[B1]]
+; CHECK-DAG: $r3 = COPY [[B2]]
+; ARM: BL @float_varargs_target, csr_aapcs, implicit-def $lr, implicit $sp, implicit $r0, implicit $r2, implicit $r3, implicit-def $r0
+; THUMB: tBL 14 /* CC::al */, $noreg, @float_varargs_target, csr_aapcs, implicit-def $lr, implicit $sp, implicit $r0, implicit $r2, implicit $r3, implicit-def $r0
+; CHECK: [[RVREG:%[0-9]+]]:_(s32) = COPY $r0
+; CHECK: ADJCALLSTACKUP 0, 0, 14 /* CC::al */, $noreg, implicit-def $sp, implicit $sp
+; CHECK: $s0 = COPY [[RVREG]]
+; ARM: BX_RET 14 /* CC::al */, $noreg, implicit $s0
+; THUMB: tBX_RET 14 /* CC::al */, $noreg, implicit $s0
+entry:
+ %r = notail call arm_aapcs_vfpcc float(float, double, ...) @float_varargs_target(float %a, double %b)
+ ret float %r
+}
+
define arm_aapcs_vfpcc float @test_indirect_call_to_varargs(float (float, double, ...) *%fptr, float %a, double %b) {
; CHECK-LABEL: name: test_indirect_call_to_varargs
; CHECK-DAG: [[FPTRVREG:%[0-9]+]]:gpr(p0) = COPY $r0
Index: llvm/lib/Target/ARM/ARMCallLowering.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMCallLowering.cpp
+++ llvm/lib/Target/ARM/ARMCallLowering.cpp
@@ -538,22 +538,18 @@
MIB.addRegMask(TRI->getCallPreservedMask(MF, Info.CallConv));
- bool IsVarArg = false;
SmallVector<ArgInfo, 8> ArgInfos;
for (auto Arg : Info.OrigArgs) {
if (!isSupportedType(DL, TLI, Arg.Ty))
return false;
- if (!Arg.IsFixed)
- IsVarArg = true;
-
if (Arg.Flags[0].isByVal())
return false;
splitToValueTypes(Arg, ArgInfos, MF);
}
- auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, IsVarArg);
+ auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, Info.IsVarArg);
ARMOutgoingValueHandler ArgHandler(MIRBuilder, MRI, MIB, ArgAssignFn);
if (!handleAssignments(MIRBuilder, ArgInfos, ArgHandler))
return false;
@@ -567,7 +563,7 @@
ArgInfos.clear();
splitToValueTypes(Info.OrigRet, ArgInfos, MF);
- auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, IsVarArg);
+ auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, Info.IsVarArg);
CallReturnHandler RetHandler(MIRBuilder, MRI, MIB, RetAssignFn);
if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler))
return false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94167.314855.patch
Type: text/x-patch
Size: 3126 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210106/00416b14/attachment.bin>
More information about the llvm-commits
mailing list