mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 06:00:28 +00:00
Remove IsLittleEndian from TargetLowering and redirect to DataLayout
Summary: This change is part of a series of commits dedicated to have a single DataLayout during compilation by using always the one owned by the module. Reviewers: echristo Subscribers: llvm-commits, rafael, yaron.keren Differential Revision: http://reviews.llvm.org/D11017 From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241655 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
564bfad782
commit
7bcdaa6978
@ -163,8 +163,6 @@ public:
|
||||
const TargetMachine &getTargetMachine() const { return TM; }
|
||||
const DataLayout *getDataLayout() const { return TM.getDataLayout(); }
|
||||
|
||||
bool isBigEndian() const { return !IsLittleEndian; }
|
||||
bool isLittleEndian() const { return IsLittleEndian; }
|
||||
virtual bool useSoftFloat() const { return false; }
|
||||
|
||||
/// Return the pointer type for the given address space, defaults to
|
||||
@ -818,8 +816,8 @@ public:
|
||||
/// When splitting a value of the specified type into parts, does the Lo
|
||||
/// or Hi part come first? This usually follows the endianness, except
|
||||
/// for ppcf128, where the Hi part always comes first.
|
||||
bool hasBigEndianPartOrdering(EVT VT) const {
|
||||
return isBigEndian() || VT == MVT::ppcf128;
|
||||
bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const {
|
||||
return DL.isBigEndian() || VT == MVT::ppcf128;
|
||||
}
|
||||
|
||||
/// If true, the target has custom DAG combine transformations that it can
|
||||
@ -1734,9 +1732,6 @@ public:
|
||||
private:
|
||||
const TargetMachine &TM;
|
||||
|
||||
/// True if this is a little endian target.
|
||||
bool IsLittleEndian;
|
||||
|
||||
/// Tells the code generator not to expand operations into sequences that use
|
||||
/// the select operations if possible.
|
||||
bool SelectIsExpensive;
|
||||
|
@ -7150,8 +7150,8 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
|
||||
// Do not change the width of a volatile load.
|
||||
!cast<LoadSDNode>(N0)->isVolatile() &&
|
||||
// Do not remove the cast if the types differ in endian layout.
|
||||
TLI.hasBigEndianPartOrdering(N0.getValueType()) ==
|
||||
TLI.hasBigEndianPartOrdering(VT) &&
|
||||
TLI.hasBigEndianPartOrdering(N0.getValueType(), DAG.getDataLayout()) ==
|
||||
TLI.hasBigEndianPartOrdering(VT, DAG.getDataLayout()) &&
|
||||
(!LegalOperations || TLI.isOperationLegal(ISD::LOAD, VT)) &&
|
||||
TLI.isLoadBitCastBeneficial(N0.getValueType(), VT)) {
|
||||
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
|
||||
|
@ -60,18 +60,20 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
|
||||
return;
|
||||
case TargetLowering::TypeExpandInteger:
|
||||
case TargetLowering::TypeExpandFloat:
|
||||
case TargetLowering::TypeExpandFloat: {
|
||||
auto &DL = DAG.getDataLayout();
|
||||
// Convert the expanded pieces of the input.
|
||||
GetExpandedOp(InOp, Lo, Hi);
|
||||
if (TLI.hasBigEndianPartOrdering(InVT) !=
|
||||
TLI.hasBigEndianPartOrdering(OutVT))
|
||||
if (TLI.hasBigEndianPartOrdering(InVT, DL) !=
|
||||
TLI.hasBigEndianPartOrdering(OutVT, DL))
|
||||
std::swap(Lo, Hi);
|
||||
Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
|
||||
Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
|
||||
return;
|
||||
}
|
||||
case TargetLowering::TypeSplitVector:
|
||||
GetSplitVector(InOp, Lo, Hi);
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT))
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
|
||||
Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
|
||||
@ -88,7 +90,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
EVT LoVT, HiVT;
|
||||
std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(InVT);
|
||||
std::tie(Lo, Hi) = DAG.SplitVector(InOp, dl, LoVT, HiVT);
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT))
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
|
||||
Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
|
||||
@ -181,7 +183,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
false, false, MinAlign(Alignment, IncrementSize));
|
||||
|
||||
// Handle endianness of the load.
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT))
|
||||
if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
}
|
||||
|
||||
@ -281,7 +283,7 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
|
||||
Hi.getValue(1));
|
||||
|
||||
// Handle endianness of the load.
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT))
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
|
||||
// Modified the chain - switch anything that used the old chain to use
|
||||
@ -301,7 +303,7 @@ void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, N->getOperand(2), 0);
|
||||
|
||||
// Handle endianness of the load.
|
||||
if (TLI.hasBigEndianPartOrdering(OVT))
|
||||
if (TLI.hasBigEndianPartOrdering(OVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
|
||||
// Modified the chain - switch anything that used the old chain to use
|
||||
@ -480,7 +482,7 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
|
||||
SDValue Lo, Hi;
|
||||
GetExpandedOp(St->getValue(), Lo, Hi);
|
||||
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT))
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getPointerInfo(),
|
||||
|
@ -177,7 +177,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,
|
||||
SDValue Lo, Hi;
|
||||
Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
|
||||
Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]);
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT))
|
||||
if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))
|
||||
std::swap(Lo, Hi);
|
||||
Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);
|
||||
} else {
|
||||
|
@ -750,7 +750,6 @@ TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm) : TM(tm) {
|
||||
initActions();
|
||||
|
||||
// Perform these initializations only once.
|
||||
IsLittleEndian = getDataLayout()->isLittleEndian();
|
||||
MaxStoresPerMemset = MaxStoresPerMemcpy = MaxStoresPerMemmove = 8;
|
||||
MaxStoresPerMemsetOptSize = MaxStoresPerMemcpyOptSize
|
||||
= MaxStoresPerMemmoveOptSize = 4;
|
||||
|
@ -4158,7 +4158,7 @@ static SDValue ExpandBITCAST(SDNode *N, SelectionDAG &DAG) {
|
||||
// Turn f64->i64 into VMOVRRD.
|
||||
if (DstVT == MVT::i64 && TLI.isTypeLegal(SrcVT)) {
|
||||
SDValue Cvt;
|
||||
if (TLI.isBigEndian() && SrcVT.isVector() &&
|
||||
if (DAG.getDataLayout().isBigEndian() && SrcVT.isVector() &&
|
||||
SrcVT.getVectorNumElements() > 1)
|
||||
Cvt = DAG.getNode(ARMISD::VMOVRRD, dl,
|
||||
DAG.getVTList(MVT::i32, MVT::i32),
|
||||
@ -4725,7 +4725,7 @@ static SDValue isNEONModifiedImm(uint64_t SplatBits, uint64_t SplatUndef,
|
||||
ImmMask <<= 1;
|
||||
}
|
||||
|
||||
if (DAG.getTargetLoweringInfo().isBigEndian())
|
||||
if (DAG.getDataLayout().isBigEndian())
|
||||
// swap higher and lower 32 bit word
|
||||
Imm = ((Imm & 0xf) << 4) | ((Imm & 0xf0) >> 4);
|
||||
|
||||
@ -5863,7 +5863,7 @@ static bool isExtendedBUILD_VECTOR(SDNode *N, SelectionDAG &DAG,
|
||||
if (BVN->getValueType(0) != MVT::v4i32 ||
|
||||
BVN->getOpcode() != ISD::BUILD_VECTOR)
|
||||
return false;
|
||||
unsigned LoElt = DAG.getTargetLoweringInfo().isBigEndian() ? 1 : 0;
|
||||
unsigned LoElt = DAG.getDataLayout().isBigEndian() ? 1 : 0;
|
||||
unsigned HiElt = 1 - LoElt;
|
||||
ConstantSDNode *Lo0 = dyn_cast<ConstantSDNode>(BVN->getOperand(LoElt));
|
||||
ConstantSDNode *Hi0 = dyn_cast<ConstantSDNode>(BVN->getOperand(HiElt));
|
||||
@ -6008,7 +6008,7 @@ static SDValue SkipExtensionForVMULL(SDNode *N, SelectionDAG &DAG) {
|
||||
SDNode *BVN = N->getOperand(0).getNode();
|
||||
assert(BVN->getOpcode() == ISD::BUILD_VECTOR &&
|
||||
BVN->getValueType(0) == MVT::v4i32 && "expected v4i32 BUILD_VECTOR");
|
||||
unsigned LowElt = DAG.getTargetLoweringInfo().isBigEndian() ? 1 : 0;
|
||||
unsigned LowElt = DAG.getDataLayout().isBigEndian() ? 1 : 0;
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, SDLoc(N), MVT::v2i32,
|
||||
BVN->getOperand(LowElt), BVN->getOperand(LowElt+2));
|
||||
}
|
||||
@ -8676,7 +8676,7 @@ static SDValue PerformVMOVRRDCombine(SDNode *N,
|
||||
std::min(4U, LD->getAlignment() / 2));
|
||||
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(LD, 1), NewLD2.getValue(1));
|
||||
if (DCI.DAG.getTargetLoweringInfo().isBigEndian())
|
||||
if (DCI.DAG.getDataLayout().isBigEndian())
|
||||
std::swap (NewLD1, NewLD2);
|
||||
SDValue Result = DCI.CombineTo(N, NewLD1, NewLD2);
|
||||
return Result;
|
||||
@ -9307,7 +9307,9 @@ static SDValue PerformSTORECombine(SDNode *N,
|
||||
SDValue WideVec = DAG.getNode(ISD::BITCAST, DL, WideVecVT, StVal);
|
||||
SmallVector<int, 8> ShuffleVec(NumElems * SizeRatio, -1);
|
||||
for (unsigned i = 0; i < NumElems; ++i)
|
||||
ShuffleVec[i] = TLI.isBigEndian() ? (i+1) * SizeRatio - 1 : i * SizeRatio;
|
||||
ShuffleVec[i] = DAG.getDataLayout().isBigEndian()
|
||||
? (i + 1) * SizeRatio - 1
|
||||
: i * SizeRatio;
|
||||
|
||||
// Can't shuffle using an illegal type.
|
||||
if (!TLI.isTypeLegal(WideVecVT)) return SDValue();
|
||||
@ -9362,7 +9364,7 @@ static SDValue PerformSTORECombine(SDNode *N,
|
||||
if (StVal.getNode()->getOpcode() == ARMISD::VMOVDRR &&
|
||||
StVal.getNode()->hasOneUse()) {
|
||||
SelectionDAG &DAG = DCI.DAG;
|
||||
bool isBigEndian = DAG.getTargetLoweringInfo().isBigEndian();
|
||||
bool isBigEndian = DAG.getDataLayout().isBigEndian();
|
||||
SDLoc DL(St);
|
||||
SDValue BasePtr = St->getBasePtr();
|
||||
SDValue NewST1 = DAG.getStore(St->getChain(), DL,
|
||||
@ -10073,7 +10075,7 @@ bool ARMTargetLowering::allowsMisalignedMemoryAccesses(EVT VT,
|
||||
// For any little-endian targets with neon, we can support unaligned ld/st
|
||||
// of D and Q (e.g. {D0,D1}) registers by using vld1.i8/vst1.i8.
|
||||
// A big-endian target may also explicitly support unaligned accesses
|
||||
if (Subtarget->hasNEON() && (AllowsUnaligned || isLittleEndian())) {
|
||||
if (Subtarget->hasNEON() && (AllowsUnaligned || Subtarget->isLittle())) {
|
||||
if (Fast)
|
||||
*Fast = true;
|
||||
return true;
|
||||
|
@ -306,8 +306,8 @@ def HasSlowVDUP32 : Predicate<"Subtarget->isSwift()">;
|
||||
def UseVMOVSR : Predicate<"Subtarget->isCortexA9() || !Subtarget->useNEONForSinglePrecisionFP()">;
|
||||
def DontUseVMOVSR : Predicate<"!Subtarget->isCortexA9() && Subtarget->useNEONForSinglePrecisionFP()">;
|
||||
|
||||
def IsLE : Predicate<"getTargetLowering()->isLittleEndian()">;
|
||||
def IsBE : Predicate<"getTargetLowering()->isBigEndian()">;
|
||||
def IsLE : Predicate<"MF->getDataLayout().isLittleEndian()">;
|
||||
def IsBE : Predicate<"MF->getDataLayout().isBigEndian()">;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ARM Flag Definitions.
|
||||
|
Loading…
Reference in New Issue
Block a user