mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-31 10:34:17 +00:00
Make the non-temporal bit "significant" in MemSDNodes so they aren't
CSE'd or otherwise combined with temporal MemSDNodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96505 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
de12e4351c
commit
1157f791c9
@ -1595,8 +1595,10 @@ public:
|
|||||||
return SubclassData;
|
return SubclassData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We access subclass data here so that we can check consistency
|
||||||
|
// with MachineMemOperand information.
|
||||||
bool isVolatile() const { return (SubclassData >> 5) & 1; }
|
bool isVolatile() const { return (SubclassData >> 5) & 1; }
|
||||||
bool isNonTemporal() const { return MMO->isNonTemporal(); }
|
bool isNonTemporal() const { return (SubclassData >> 6) & 1; }
|
||||||
|
|
||||||
/// Returns the SrcValue and offset that describes the location of the access
|
/// Returns the SrcValue and offset that describes the location of the access
|
||||||
const Value *getSrcValue() const { return MMO->getValue(); }
|
const Value *getSrcValue() const { return MMO->getValue(); }
|
||||||
|
@ -468,18 +468,20 @@ static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// encodeMemSDNodeFlags - Generic routine for computing a value for use in
|
/// encodeMemSDNodeFlags - Generic routine for computing a value for use in
|
||||||
/// the CSE map that carries volatility, indexing mode, and
|
/// the CSE map that carries volatility, temporalness, indexing mode, and
|
||||||
/// extension/truncation information.
|
/// extension/truncation information.
|
||||||
///
|
///
|
||||||
static inline unsigned
|
static inline unsigned
|
||||||
encodeMemSDNodeFlags(int ConvType, ISD::MemIndexedMode AM, bool isVolatile) {
|
encodeMemSDNodeFlags(int ConvType, ISD::MemIndexedMode AM, bool isVolatile,
|
||||||
|
bool isNonTemporal) {
|
||||||
assert((ConvType & 3) == ConvType &&
|
assert((ConvType & 3) == ConvType &&
|
||||||
"ConvType may not require more than 2 bits!");
|
"ConvType may not require more than 2 bits!");
|
||||||
assert((AM & 7) == AM &&
|
assert((AM & 7) == AM &&
|
||||||
"AM may not require more than 3 bits!");
|
"AM may not require more than 3 bits!");
|
||||||
return ConvType |
|
return ConvType |
|
||||||
(AM << 2) |
|
(AM << 2) |
|
||||||
(isVolatile << 5);
|
(isVolatile << 5) |
|
||||||
|
(isNonTemporal << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -3845,7 +3847,8 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
|
|||||||
FoldingSetNodeID ID;
|
FoldingSetNodeID ID;
|
||||||
AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
|
AddNodeIDNode(ID, ISD::LOAD, VTs, Ops, 3);
|
||||||
ID.AddInteger(MemVT.getRawBits());
|
ID.AddInteger(MemVT.getRawBits());
|
||||||
ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile()));
|
ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile(),
|
||||||
|
MMO->isNonTemporal()));
|
||||||
void *IP = 0;
|
void *IP = 0;
|
||||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||||
cast<LoadSDNode>(E)->refineAlignment(MMO);
|
cast<LoadSDNode>(E)->refineAlignment(MMO);
|
||||||
@ -3926,7 +3929,8 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
|||||||
FoldingSetNodeID ID;
|
FoldingSetNodeID ID;
|
||||||
AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
|
AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
|
||||||
ID.AddInteger(VT.getRawBits());
|
ID.AddInteger(VT.getRawBits());
|
||||||
ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile()));
|
ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(),
|
||||||
|
MMO->isNonTemporal()));
|
||||||
void *IP = 0;
|
void *IP = 0;
|
||||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||||
@ -3989,7 +3993,8 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
|||||||
FoldingSetNodeID ID;
|
FoldingSetNodeID ID;
|
||||||
AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
|
AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
|
||||||
ID.AddInteger(SVT.getRawBits());
|
ID.AddInteger(SVT.getRawBits());
|
||||||
ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile()));
|
ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile(),
|
||||||
|
MMO->isNonTemporal()));
|
||||||
void *IP = 0;
|
void *IP = 0;
|
||||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||||
@ -5293,8 +5298,11 @@ GlobalAddressSDNode::GlobalAddressSDNode(unsigned Opc, const GlobalValue *GA,
|
|||||||
MemSDNode::MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT memvt,
|
MemSDNode::MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs, EVT memvt,
|
||||||
MachineMemOperand *mmo)
|
MachineMemOperand *mmo)
|
||||||
: SDNode(Opc, dl, VTs), MemoryVT(memvt), MMO(mmo) {
|
: SDNode(Opc, dl, VTs), MemoryVT(memvt), MMO(mmo) {
|
||||||
SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile());
|
SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(),
|
||||||
|
MMO->isNonTemporal());
|
||||||
assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
|
assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
|
||||||
|
assert(isNonTemporal() == MMO->isNonTemporal() &&
|
||||||
|
"Non-temporal encoding error!");
|
||||||
assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
|
assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5303,7 +5311,8 @@ MemSDNode::MemSDNode(unsigned Opc, DebugLoc dl, SDVTList VTs,
|
|||||||
MachineMemOperand *mmo)
|
MachineMemOperand *mmo)
|
||||||
: SDNode(Opc, dl, VTs, Ops, NumOps),
|
: SDNode(Opc, dl, VTs, Ops, NumOps),
|
||||||
MemoryVT(memvt), MMO(mmo) {
|
MemoryVT(memvt), MMO(mmo) {
|
||||||
SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile());
|
SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(),
|
||||||
|
MMO->isNonTemporal());
|
||||||
assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
|
assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!");
|
||||||
assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
|
assert(memvt.getStoreSize() == MMO->getSize() && "Size mismatch!");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user