[PATCH] Do not insert a tail call when returning multiple values on X86
Keno Fischer
kfischer at college.harvard.edu
Mon Aug 18 22:48:19 PDT 2014
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.
http://reviews.llvm.org/D4968
Files:
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/tailcall-multiret.ll
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -2052,6 +2052,13 @@
UI != UE; ++UI) {
if (UI->getOpcode() != X86ISD::RET_FLAG)
return false;
+ // If we are returning more than one value, we can definitely
+ // not make a tail call see PR19530
+ if (UI->getNumOperands() > 4)
+ return false;
+ if (UI->getNumOperands() == 4 &&
+ UI->getOperand(UI->getNumOperands()-1).getValueType() != MVT::Glue)
+ return false;
HasRet = true;
}
Index: test/CodeGen/X86/tailcall-multiret.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/tailcall-multiret.ll
@@ -0,0 +1,18 @@
+; RUN: llc < %s -mcpu=core2 | FileCheck %s
+; 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
+}
\ No newline at end of file
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4968.12645.patch
Type: text/x-patch
Size: 1537 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140819/d5816971/attachment.bin>
More information about the llvm-commits
mailing list