This is an archive of the discontinued LLVM Phabricator instance.

Do not insert a tail call when returning multiple values on X86
ClosedPublic

Authored by loladiro on Aug 18 2014, 10:48 PM.

Details

Summary

This fixes http://llvm.org/bugs/show_bug.cgi?id=19530. The problem is that X86ISelLowering erroneously thought the third call was eligible for tail call elimination. It would have been if it's return value was actually the one returned by the calling function, but here that is not the case and additional values are being returned.

Diff Detail

Repository
rL LLVM

Event Timeline

loladiro updated this revision to Diff 12645.Aug 18 2014, 10:48 PM
loladiro retitled this revision from to Do not insert a tail call when returning multiple values on X86.
loladiro updated this object.
loladiro edited the test plan for this revision. (Show Details)
loladiro set the repository for this revision to rL LLVM.
loladiro added a subscriber: Unknown Object (MLST).

+; RUN: llc < %s -mcpu=core2 | FileCheck %s

You might want to use -mtriple just to be sure.

+; See PR19530
+declare double @llvm.powi.f64(double %Val, i32 %power)
+define <3 x double> @julia_foo17589(i64) {
+top:
+ %1 = trunc i64 %0 to i32
+ %2 = call double @llvm.powi.f64(double 1.000000e+00, i32 %1)
+; CHECK: callq powidf2
+ %3 = insertelement <3 x double> undef, double %2, i32 0
+ %4 = call double @llvm.powi.f64(double 2.000000e+00, i32 %1)
+; CHECK: callq
powidf2
+ %5 = insertelement <3 x double> %3, double %4, i32 1
+ %6 = call double @llvm.powi.f64(double 3.000000e+00, i32 %1)
+; CHECK: callq __powidf2
+ %7 = insertelement <3 x double> %5, double %6, i32 2
+; CHECK-NOT: TAILCALL
+ ret <3 x double> %7
+}

The test can be a bit simple without the trunc and and easier to read
by using named instructions:

declare double @llvm.powi.f64(double, i32)

define <3 x double> @julia_foo17589(i32 %arg) {

%tmp1 = call double @llvm.powi.f64(double 1.000000e+00, i32 %arg)
%tmp2 = insertelement <3 x double> undef, double %tmp1, i32 0
%tmp3 = call double @llvm.powi.f64(double 2.000000e+00, i32 %arg)
%tmp4 = insertelement <3 x double> %tmp2, double %tmp3, i32 1
%tmp5 = call double @llvm.powi.f64(double 3.000000e+00, i32 %arg)
%tmp6 = insertelement <3 x double> %tmp4, double %tmp5, i32 2
ret <3 x double> %tmp6

}

\ No newline at end of file

please add one :-)

loladiro updated this revision to Diff 12681.Aug 19 2014, 1:35 PM

Updated the test case based on comments.

rafael accepted this revision.Aug 20 2014, 9:52 AM
rafael added a reviewer: rafael.

LGTM

This revision is now accepted and ready to land.Aug 20 2014, 9:52 AM
loladiro closed this revision.Aug 20 2014, 12:09 PM
loladiro updated this revision to Diff 12710.

Closed by commit rL216117 (authored by kfischer).