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.
Details
Diff Detail
Event Timeline
+; 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 :-)