[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