mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-04 05:31:51 +00:00
Sink a function that refers to the SelectionDAG into that library in the
one file where it is called as a static function. Nuke the declaration and the definition in lib/CodeGen, along with the include of SelectionDAG.h from this file. There is no dependency edge from lib/CodeGen to lib/CodeGen/SelectionDAG, so it isn't valid for a routine in lib/CodeGen to reference the DAG. There is a dependency from lib/CodeGen/SelectionDAG on lib/CodeGen. This breaks one violation of this layering. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171842 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ef24963cbc
commit
40b2c32475
@ -89,9 +89,6 @@ ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred);
|
|||||||
bool isInTailCallPosition(ImmutableCallSite CS, Attribute CalleeRetAttr,
|
bool isInTailCallPosition(ImmutableCallSite CS, Attribute CalleeRetAttr,
|
||||||
const TargetLowering &TLI);
|
const TargetLowering &TLI);
|
||||||
|
|
||||||
bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node,
|
|
||||||
SDValue &Chain, const TargetLowering &TLI);
|
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "llvm/CodeGen/Analysis.h"
|
#include "llvm/CodeGen/Analysis.h"
|
||||||
#include "llvm/Analysis/ValueTracking.h"
|
#include "llvm/Analysis/ValueTracking.h"
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
#include "llvm/CodeGen/SelectionDAG.h"
|
|
||||||
#include "llvm/IR/DataLayout.h"
|
#include "llvm/IR/DataLayout.h"
|
||||||
#include "llvm/IR/DerivedTypes.h"
|
#include "llvm/IR/DerivedTypes.h"
|
||||||
#include "llvm/IR/Function.h"
|
#include "llvm/IR/Function.h"
|
||||||
@ -348,23 +347,3 @@ bool llvm::isInTailCallPosition(ImmutableCallSite CS, Attribute CalleeRetAttr,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llvm::isInTailCallPosition(SelectionDAG &DAG, SDNode *Node,
|
|
||||||
SDValue &Chain, const TargetLowering &TLI) {
|
|
||||||
const Function *F = DAG.getMachineFunction().getFunction();
|
|
||||||
|
|
||||||
// Conservatively require the attributes of the call to match those of
|
|
||||||
// the return. Ignore noalias because it doesn't affect the call sequence.
|
|
||||||
Attribute CallerRetAttr = F->getAttributes().getRetAttributes();
|
|
||||||
if (AttrBuilder(CallerRetAttr)
|
|
||||||
.removeAttribute(Attribute::NoAlias).hasAttributes())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// It's not safe to eliminate the sign / zero extension of the return value.
|
|
||||||
if (CallerRetAttr.hasAttribute(Attribute::ZExt) ||
|
|
||||||
CallerRetAttr.hasAttribute(Attribute::SExt))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Check if the only use is a function return node.
|
|
||||||
return TLI.isUsedByReturnOnly(Node, Chain);
|
|
||||||
}
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "llvm/IR/Constants.h"
|
#include "llvm/IR/Constants.h"
|
||||||
#include "llvm/IR/DataLayout.h"
|
#include "llvm/IR/DataLayout.h"
|
||||||
#include "llvm/IR/DerivedTypes.h"
|
#include "llvm/IR/DerivedTypes.h"
|
||||||
|
#include "llvm/IR/Function.h"
|
||||||
#include "llvm/IR/LLVMContext.h"
|
#include "llvm/IR/LLVMContext.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
@ -1840,6 +1841,26 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
|
|||||||
return ExpandVectorBuildThroughStack(Node);
|
return ExpandVectorBuildThroughStack(Node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node,
|
||||||
|
SDValue &Chain, const TargetLowering &TLI) {
|
||||||
|
const Function *F = DAG.getMachineFunction().getFunction();
|
||||||
|
|
||||||
|
// Conservatively require the attributes of the call to match those of
|
||||||
|
// the return. Ignore noalias because it doesn't affect the call sequence.
|
||||||
|
Attribute CallerRetAttr = F->getAttributes().getRetAttributes();
|
||||||
|
if (AttrBuilder(CallerRetAttr)
|
||||||
|
.removeAttribute(Attribute::NoAlias).hasAttributes())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// It's not safe to eliminate the sign / zero extension of the return value.
|
||||||
|
if (CallerRetAttr.hasAttribute(Attribute::ZExt) ||
|
||||||
|
CallerRetAttr.hasAttribute(Attribute::SExt))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Check if the only use is a function return node.
|
||||||
|
return TLI.isUsedByReturnOnly(Node, Chain);
|
||||||
|
}
|
||||||
|
|
||||||
// ExpandLibCall - Expand a node into a call to a libcall. If the result value
|
// ExpandLibCall - Expand a node into a call to a libcall. If the result value
|
||||||
// does not fit into a register, return the lo part and set the hi part to the
|
// does not fit into a register, return the lo part and set the hi part to the
|
||||||
// by-reg argument. If it does fit into a single register, return the result
|
// by-reg argument. If it does fit into a single register, return the result
|
||||||
|
Loading…
x
Reference in New Issue
Block a user