Skip to content

Commit

Permalink
Remove DisableTailCalls from TargetOptions and the code in resetTarge…
Browse files Browse the repository at this point in the history
…tOptions

that was resetting it.

Remove the uses of DisableTailCalls in subclasses of TargetLowering and use
the value of function attribute "disable-tail-calls" instead. Also,
unconditionally add pass TailCallElim to the pipeline and check the function
attribute at the start of runOnFunction to disable the pass on a per-function
basis. 
 
This is part of the work to remove TargetMachine::resetTargetOptions, and since
DisableTailCalls was the last non-fast-math option that was being reset in that
function, we should be able to remove the function entirely after the work to
propagate IR-level fast-math flags to DAG nodes is completed.

Out-of-tree users should remove the uses of DisableTailCalls and make changes
to attach attribute "disable-tail-calls"="true" or "false" to the functions in
the IR.

rdar://problem/13752163

Differential Revision: http://reviews.llvm.org/D10099

llvm-svn: 239427
  • Loading branch information
ahatanaka committed Jun 9, 2015
1 parent 262a4c4 commit d9699bc
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 17 deletions.
7 changes: 6 additions & 1 deletion llvm/include/llvm/CodeGen/CommandFlags.h
Expand Up @@ -16,6 +16,7 @@
#ifndef LLVM_CODEGEN_COMMANDFLAGS_H
#define LLVM_CODEGEN_COMMANDFLAGS_H

#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/MCTargetOptionsCommandFlags.h"
#include "llvm//MC/SubtargetFeature.h"
Expand Down Expand Up @@ -247,7 +248,6 @@ static inline TargetOptions InitTargetOptionsFromCodeGenFlags() {
Options.FloatABIType = FloatABIForCalls;
Options.NoZerosInBSS = DontPlaceZerosInBSS;
Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
Options.DisableTailCalls = DisableTailCalls;
Options.StackAlignmentOverride = OverrideStackAlignment;
Options.TrapFuncName = TrapFuncName;
Options.PositionIndependentExecutable = EnablePIE;
Expand Down Expand Up @@ -315,6 +315,11 @@ static inline void setFunctionAttributes(StringRef CPU, StringRef Features,
"no-frame-pointer-elim",
DisableFPElim ? "true" : "false");

if (DisableTailCalls.getNumOccurrences() > 0)
NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex,
"disable-tail-calls",
toStringRef(DisableTailCalls));

// Let NewAttrs override Attrs.
NewAttrs = Attrs.addAttributes(Ctx, AttributeSet::FunctionIndex, NewAttrs);
F.setAttributes(NewAttrs);
Expand Down
7 changes: 1 addition & 6 deletions llvm/include/llvm/Target/TargetOptions.h
Expand Up @@ -67,7 +67,7 @@ namespace llvm {
HonorSignDependentRoundingFPMathOption(false),
NoZerosInBSS(false),
GuaranteedTailCallOpt(false),
DisableTailCalls(false), StackAlignmentOverride(0),
StackAlignmentOverride(0),
EnableFastISel(false), PositionIndependentExecutable(false),
UseInitArray(false), DisableIntegratedAS(false),
CompressDebugSections(false), FunctionSections(false),
Expand Down Expand Up @@ -137,10 +137,6 @@ namespace llvm {
/// as their parent function, etc.), using an alternate ABI if necessary.
unsigned GuaranteedTailCallOpt : 1;

/// DisableTailCalls - This flag controls whether we will use tail calls.
/// Disabling them may be useful to maintain a correct call stack.
unsigned DisableTailCalls : 1;

/// StackAlignmentOverride - Override default stack alignment for target.
unsigned StackAlignmentOverride;

Expand Down Expand Up @@ -236,7 +232,6 @@ inline bool operator==(const TargetOptions &LHS,
ARE_EQUAL(HonorSignDependentRoundingFPMathOption) &&
ARE_EQUAL(NoZerosInBSS) &&
ARE_EQUAL(GuaranteedTailCallOpt) &&
ARE_EQUAL(DisableTailCalls) &&
ARE_EQUAL(StackAlignmentOverride) &&
ARE_EQUAL(EnableFastISel) &&
ARE_EQUAL(PositionIndependentExecutable) &&
Expand Down
7 changes: 5 additions & 2 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Expand Up @@ -1483,9 +1483,10 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
bool isStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
bool isThisReturn = false;
bool isSibCall = false;
auto Attr = MF.getFunction()->getFnAttribute("disable-tail-calls");

// Disable tail calls if they're not supported.
if (!Subtarget->supportsTailCall() || MF.getTarget().Options.DisableTailCalls)
if (!Subtarget->supportsTailCall() || Attr.getValueAsString() == "true")
isTailCall = false;

if (isTailCall) {
Expand Down Expand Up @@ -2375,7 +2376,9 @@ bool ARMTargetLowering::mayBeEmittedAsTailCall(CallInst *CI) const {
if (!Subtarget->supportsTailCall())
return false;

if (!CI->isTailCall() || getTargetMachine().Options.DisableTailCalls)
auto Attr =
CI->getParent()->getParent()->getFnAttribute("disable-tail-calls");
if (!CI->isTailCall() || Attr.getValueAsString() == "true")
return false;

return !Subtarget->isThumb1Only();
Expand Down
7 changes: 5 additions & 2 deletions llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
Expand Up @@ -397,7 +397,9 @@ HexagonTargetLowering::LowerReturn(SDValue Chain,

bool HexagonTargetLowering::mayBeEmittedAsTailCall(CallInst *CI) const {
// If either no tail call or told not to tail call at all, don't.
if (!CI->isTailCall() || HTM.Options.DisableTailCalls)
auto Attr =
CI->getParent()->getParent()->getFnAttribute("disable-tail-calls");
if (!CI->isTailCall() || Attr.getValueAsString() == "true")
return false;

return true;
Expand Down Expand Up @@ -486,7 +488,8 @@ HexagonTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
else
CCInfo.AnalyzeCallOperands(Outs, CC_Hexagon);

if (DAG.getTarget().Options.DisableTailCalls)
auto Attr = MF.getFunction()->getFnAttribute("disable-tail-calls");
if (Attr.getValueAsString() == "true")
isTailCall = false;

if (isTailCall) {
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/Target/TargetMachine.cpp
Expand Up @@ -70,7 +70,6 @@ void TargetMachine::resetTargetOptions(const Function &F) const {
RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");
RESET_OPTION(NoInfsFPMath, "no-infs-fp-math");
RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");
RESET_OPTION(DisableTailCalls, "disable-tail-calls");
}

/// getRelocationModel - Returns the code generation relocation model. The
Expand Down
7 changes: 5 additions & 2 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -2233,7 +2233,9 @@ static bool IsCCallConvention(CallingConv::ID CC) {
}

bool X86TargetLowering::mayBeEmittedAsTailCall(CallInst *CI) const {
if (!CI->isTailCall() || getTargetMachine().Options.DisableTailCalls)
auto Attr =
CI->getParent()->getParent()->getFnAttribute("disable-tail-calls");
if (!CI->isTailCall() || Attr.getValueAsString() == "true")
return false;

CallSite CS(CI);
Expand Down Expand Up @@ -2762,8 +2764,9 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
StructReturnType SR = callIsStructReturn(Outs);
bool IsSibcall = false;
X86MachineFunctionInfo *X86Info = MF.getInfo<X86MachineFunctionInfo>();
auto Attr = MF.getFunction()->getFnAttribute("disable-tail-calls");

if (MF.getTarget().Options.DisableTailCalls)
if (Attr.getValueAsString() == "true")
isTailCall = false;

if (Subtarget->isPICStyleGOT() &&
Expand Down
4 changes: 1 addition & 3 deletions llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
Expand Up @@ -94,7 +94,6 @@ PassManagerBuilder::PassManagerBuilder() {
SizeLevel = 0;
LibraryInfo = nullptr;
Inliner = nullptr;
DisableTailCalls = false;
DisableUnitAtATime = false;
DisableUnrollLoops = false;
BBVectorize = RunBBVectorization;
Expand Down Expand Up @@ -238,8 +237,7 @@ void PassManagerBuilder::populateModulePassManager(
MPM.add(createInstructionCombiningPass()); // Combine silly seq's
addExtensionsToPM(EP_Peephole, MPM);

if (!DisableTailCalls)
MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
MPM.add(createReassociatePass()); // Reassociate expressions
// Rotate Loop - disable header duplication at -Oz
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp
Expand Up @@ -158,6 +158,9 @@ bool TailCallElim::runOnFunction(Function &F) {
if (skipOptnoneFunction(F))
return false;

if (F.getFnAttribute("disable-tail-calls").getValueAsString() == "true")
return false;

bool AllCallsAreTailCalls = false;
bool Modified = markTails(F, AllCallsAreTailCalls);
if (AllCallsAreTailCalls)
Expand Down
40 changes: 40 additions & 0 deletions llvm/test/CodeGen/ARM/disable-tail-calls.ll
@@ -0,0 +1,40 @@
; RUN: llc < %s -march arm | FileCheck %s --check-prefix=NO-OPTION
; RUN: llc < %s -march arm -disable-tail-calls | FileCheck %s --check-prefix=DISABLE-TRUE
; RUN: llc < %s -march arm -disable-tail-calls=false | FileCheck %s --check-prefix=DISABLE-FALSE

; Check that command line option "-disable-tail-calls" overrides function
; attribute "disable-tail-calls".

; NO-OPTION-LABEL: {{\_?}}func_attr
; NO-OPTION: bl {{\_?}}callee

; DISABLE-FALSE-LABEL: {{\_?}}func_attr
; DISABLE-FALSE: b {{\_?}}callee

; DISABLE-TRUE-LABEL: {{\_?}}func_attr
; DISABLE-TRUE: bl {{\_?}}callee

define i32 @func_attr(i32 %a) #0 {
entry:
%call = tail call i32 @callee(i32 %a)
ret i32 %call
}

; NO-OPTION-LABEL: {{\_?}}func_noattr
; NO-OPTION: b {{\_?}}callee

; DISABLE-FALSE-LABEL: {{\_?}}func_noattr
; DISABLE-FALSE: b {{\_?}}callee

; DISABLE-TRUE-LABEL: {{\_?}}func_noattr
; DISABLE-TRUE: bl {{\_?}}callee

define i32 @func_noattr(i32 %a) {
entry:
%call = tail call i32 @callee(i32 %a)
ret i32 %call
}

declare i32 @callee(i32)

attributes #0 = { "disable-tail-calls"="true" }
40 changes: 40 additions & 0 deletions llvm/test/CodeGen/X86/disable-tail-calls.ll
@@ -0,0 +1,40 @@
; RUN: llc < %s -march x86-64 | FileCheck %s --check-prefix=NO-OPTION
; RUN: llc < %s -march x86-64 -disable-tail-calls | FileCheck %s --check-prefix=DISABLE-TRUE
; RUN: llc < %s -march x86-64 -disable-tail-calls=false | FileCheck %s --check-prefix=DISABLE-FALSE

; Check that command line option "-disable-tail-calls" overrides function
; attribute "disable-tail-calls".

; NO-OPTION-LABEL: {{\_?}}func_attr
; NO-OPTION: callq {{\_?}}callee

; DISABLE-FALSE-LABEL: {{\_?}}func_attr
; DISABLE-FALSE: jmp {{\_?}}callee

; DISABLE-TRUE-LABEL: {{\_?}}func_attr
; DISABLE-TRUE: callq {{\_?}}callee

define i32 @func_attr(i32 %a) #0 {
entry:
%call = tail call i32 @callee(i32 %a)
ret i32 %call
}

; NO-OPTION-LABEL: {{\_?}}func_noattr
; NO-OPTION: jmp {{\_?}}callee

; DISABLE-FALSE-LABEL: {{\_?}}func_noattr
; DISABLE-FALSE: jmp {{\_?}}callee

; DISABLE-TRUE-LABEL: {{\_?}}func_noattr
; DISABLE-TRUE: callq {{\_?}}callee

define i32 @func_noattr(i32 %a) {
entry:
%call = tail call i32 @callee(i32 %a)
ret i32 %call
}

declare i32 @callee(i32)

attributes #0 = { "disable-tail-calls"="true" }

0 comments on commit d9699bc

Please sign in to comment.