From a469acac0306069b26377240fb724f6eaa47953c Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Thu, 7 Dec 2017 22:26:19 +0000 Subject: [PATCH] Temporarily revert "[PowerPC] Allow tail calls of fastcc functions from C CallingConv functions." It is causing sanitizer failures on llvm tests in a bootstrapped compiler. No bot link since it's currently down, but following up to get the bot up. This reverts commit r319218. llvm-svn: 320106 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 15 +++++---------- .../PowerPC/duplicate-returns-for-tailcall.ll | 6 +++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index f885127e6aab..3fe9fe734993 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -4397,18 +4397,13 @@ hasSameArgumentList(const Function *CallerFn, ImmutableCallSite CS) { static bool areCallingConvEligibleForTCO_64SVR4(CallingConv::ID CallerCC, CallingConv::ID CalleeCC) { - // tail calls are possible with fastcc and ccc. - auto isTailCallableCC = [] (CallingConv::ID CC){ - return CC == CallingConv::C || CC == CallingConv::Fast; - }; - if (!isTailCallableCC(CallerCC) || !isTailCallableCC(CalleeCC)) + // Tail or Sibling call optimization (TCO/SCO) needs callee and caller to + // have the same calling convention. + if (CallerCC != CalleeCC) return false; - // We can safely tail call both fastcc and ccc callees from a c calling - // convention caller. If the caller is fastcc, we may have less stack space - // then a non-fastcc caller with the same signature so disable tail-calls in - // that case. - return CallerCC == CallingConv::C || CallerCC == CalleeCC; + // Tail or Sibling calls can be done with fastcc/ccc. + return (CallerCC == CallingConv::Fast || CallerCC == CallingConv::C); } bool diff --git a/llvm/test/CodeGen/PowerPC/duplicate-returns-for-tailcall.ll b/llvm/test/CodeGen/PowerPC/duplicate-returns-for-tailcall.ll index 9c0e77dafde6..520efd8106f4 100644 --- a/llvm/test/CodeGen/PowerPC/duplicate-returns-for-tailcall.ll +++ b/llvm/test/CodeGen/PowerPC/duplicate-returns-for-tailcall.ll @@ -42,10 +42,10 @@ if.end4: ; preds = %if.end if.then6: ; preds = %if.end4 %call7 = tail call fastcc signext i32 @call3(i32 signext %a, i32 signext %b, i32 signext %c) br label %return -; tail calling a fastcc function from a ccc function is supported. +; No duplication here because the calling convention mismatch means we won't tail-call ; CHECK_LABEL: if.then13: -; CHECK: %[[T2:[a-zA-Z0-9]+]] = tail call fastcc signext i32 @call3 -; CHECK-NEXT: ret i32 %[[T2]] +; CHECK: tail call fastcc signext i32 @call3 +; CHECK-NEXT: br return: ; preds = %if.end4, %if.then6, %if.then2, %if.then %retval.0 = phi i32 [ %call, %if.then ], [ %call3, %if.then2 ], [ %call7, %if.then6 ], [ %c, %if.end4 ]