[llvm] r203577 - ARM: honour -f{no-,}optimize-sibling-calls

Saleem Abdulrasool compnerd at compnerd.org
Tue Mar 11 08:09:54 PDT 2014


Author: compnerd
Date: Tue Mar 11 10:09:54 2014
New Revision: 203577

URL: http://llvm.org/viewvc/llvm-project?rev=203577&view=rev
Log:
ARM: honour -f{no-,}optimize-sibling-calls

Use the options in the ARMISelLowering to control whether tail calls are
optimised or not.  Previously, this option was entirely ignored on the ARM
target and only honoured on x86.

This option is mostly useful in profiling scenarios.  The default remains that
tail call optimisations will be applied.

Added:
    llvm/trunk/test/CodeGen/ARM/tail-call.ll
Modified:
    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=203577&r1=203576&r2=203577&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Tue Mar 11 10:09:54 2014
@@ -1439,9 +1439,11 @@ ARMTargetLowering::LowerCall(TargetLower
   bool isStructRet    = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
   bool isThisReturn   = false;
   bool isSibCall      = false;
+
   // Disable tail calls if they're not supported.
-  if (!Subtarget->supportsTailCall())
+  if (!Subtarget->supportsTailCall() || MF.getTarget().Options.DisableTailCalls)
     isTailCall = false;
+
   if (isTailCall) {
     // Check if it's really possible to do a tail call.
     isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv,
@@ -2273,7 +2275,7 @@ bool ARMTargetLowering::mayBeEmittedAsTa
   if (!Subtarget->supportsTailCall())
     return false;
 
-  if (!CI->isTailCall())
+  if (!CI->isTailCall() || getTargetMachine().Options.DisableTailCalls)
     return false;
 
   return !Subtarget->isThumb1Only();

Added: llvm/trunk/test/CodeGen/ARM/tail-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/tail-call.ll?rev=203577&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/tail-call.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/tail-call.ll Tue Mar 11 10:09:54 2014
@@ -0,0 +1,21 @@
+; RUN: llc -mtriple armv7 -O0 -o - < %s | FileCheck %s -check-prefix CHECK-TAIL
+; RUN: llc -mtriple armv7 -O0 -disable-tail-calls -o - < %s \
+; RUN:   | FileCheck %s -check-prefix CHECK-NO-TAIL
+
+declare i32 @callee(i32 %i)
+
+define i32 @caller(i32 %i) {
+entry:
+  %r = tail call i32 @callee(i32 %i)
+  ret i32 %r
+}
+
+; CHECK-LABEL: caller
+; CHECK-TAIL: b callee
+
+; CHECK-LABEL: caller
+; CHECK-NO-TAIL: push {lr}
+; CHECK-NO-TAIL: bl callee
+; CHECK-NO-TAIL: pop {lr}
+; CHECK-NO-TAIL: bx lr
+





More information about the llvm-commits mailing list