mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-24 20:30:06 +00:00
Consider address spaces for hashing and CSEing DAG nodes. Otherwise two loads from different x86 segments but the same address would get CSEd
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160987 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b7e22efa2b
commit
32ecfb4158
@ -403,6 +403,7 @@ static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
|
||||
ID.AddPointer(GA->getGlobal());
|
||||
ID.AddInteger(GA->getOffset());
|
||||
ID.AddInteger(GA->getTargetFlags());
|
||||
ID.AddInteger(GA->getAddressSpace());
|
||||
break;
|
||||
}
|
||||
case ISD::BasicBlock:
|
||||
@ -442,12 +443,14 @@ static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
|
||||
const LoadSDNode *LD = cast<LoadSDNode>(N);
|
||||
ID.AddInteger(LD->getMemoryVT().getRawBits());
|
||||
ID.AddInteger(LD->getRawSubclassData());
|
||||
ID.AddInteger(LD->getPointerInfo().getAddrSpace());
|
||||
break;
|
||||
}
|
||||
case ISD::STORE: {
|
||||
const StoreSDNode *ST = cast<StoreSDNode>(N);
|
||||
ID.AddInteger(ST->getMemoryVT().getRawBits());
|
||||
ID.AddInteger(ST->getRawSubclassData());
|
||||
ID.AddInteger(ST->getPointerInfo().getAddrSpace());
|
||||
break;
|
||||
}
|
||||
case ISD::ATOMIC_CMP_SWAP:
|
||||
@ -467,6 +470,12 @@ static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
|
||||
const AtomicSDNode *AT = cast<AtomicSDNode>(N);
|
||||
ID.AddInteger(AT->getMemoryVT().getRawBits());
|
||||
ID.AddInteger(AT->getRawSubclassData());
|
||||
ID.AddInteger(AT->getPointerInfo().getAddrSpace());
|
||||
break;
|
||||
}
|
||||
case ISD::PREFETCH: {
|
||||
const MemSDNode *PF = cast<MemSDNode>(N);
|
||||
ID.AddInteger(PF->getPointerInfo().getAddrSpace());
|
||||
break;
|
||||
}
|
||||
case ISD::VECTOR_SHUFFLE: {
|
||||
@ -483,6 +492,10 @@ static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
|
||||
break;
|
||||
}
|
||||
} // end switch (N->getOpcode())
|
||||
|
||||
// Target specific memory nodes could also have address spaces to check.
|
||||
if (N->isTargetMemoryOpcode())
|
||||
ID.AddInteger(cast<MemSDNode>(N)->getPointerInfo().getAddrSpace());
|
||||
}
|
||||
|
||||
/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
|
||||
@ -1100,6 +1113,7 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV, DebugLoc DL,
|
||||
ID.AddPointer(GV);
|
||||
ID.AddInteger(Offset);
|
||||
ID.AddInteger(TargetFlags);
|
||||
ID.AddInteger(GV->getType()->getAddressSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
return SDValue(E, 0);
|
||||
@ -3901,6 +3915,7 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
|
||||
ID.AddInteger(MemVT.getRawBits());
|
||||
SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 4);
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<AtomicSDNode>(E)->refineAlignment(MMO);
|
||||
@ -3973,6 +3988,7 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
|
||||
ID.AddInteger(MemVT.getRawBits());
|
||||
SDValue Ops[] = {Chain, Ptr, Val};
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 3);
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<AtomicSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4029,6 +4045,7 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
|
||||
ID.AddInteger(MemVT.getRawBits());
|
||||
SDValue Ops[] = {Chain, Ptr};
|
||||
AddNodeIDNode(ID, Opcode, VTs, Ops, 2);
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void* IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<AtomicSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4106,6 +4123,7 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
|
||||
if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, Opcode, VTList, Ops, NumOps);
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4225,6 +4243,7 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile(),
|
||||
MMO->isNonTemporal(),
|
||||
MMO->isInvariant()));
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<LoadSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4314,6 +4333,7 @@ SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
ID.AddInteger(VT.getRawBits());
|
||||
ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(),
|
||||
MMO->isNonTemporal(), MMO->isInvariant()));
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4381,6 +4401,7 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
|
||||
ID.AddInteger(SVT.getRawBits());
|
||||
ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile(),
|
||||
MMO->isNonTemporal(), MMO->isInvariant()));
|
||||
ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) {
|
||||
cast<StoreSDNode>(E)->refineAlignment(MMO);
|
||||
@ -4405,6 +4426,7 @@ SelectionDAG::getIndexedStore(SDValue OrigStore, DebugLoc dl, SDValue Base,
|
||||
AddNodeIDNode(ID, ISD::STORE, VTs, Ops, 4);
|
||||
ID.AddInteger(ST->getMemoryVT().getRawBits());
|
||||
ID.AddInteger(ST->getRawSubclassData());
|
||||
ID.AddInteger(ST->getPointerInfo().getAddrSpace());
|
||||
void *IP = 0;
|
||||
if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||
return SDValue(E, 0);
|
||||
|
@ -55,4 +55,20 @@ entry:
|
||||
; X64: ret
|
||||
}
|
||||
|
||||
; The two loads here both look identical to selection DAG, except for their
|
||||
; address spaces. Make sure they aren't CSE'd.
|
||||
define i32 @test_no_cse() nounwind readonly {
|
||||
entry:
|
||||
%tmp = load i32* addrspace(256)* getelementptr (i32* addrspace(256)* inttoptr (i32 72 to i32* addrspace(256)*), i32 31) ; <i32*> [#uses=1]
|
||||
%tmp1 = load i32* %tmp ; <i32> [#uses=1]
|
||||
%tmp2 = load i32* addrspace(257)* getelementptr (i32* addrspace(257)* inttoptr (i32 72 to i32* addrspace(257)*), i32 31) ; <i32*> [#uses=1]
|
||||
%tmp3 = load i32* %tmp2 ; <i32> [#uses=1]
|
||||
%tmp4 = add i32 %tmp1, %tmp3
|
||||
ret i32 %tmp4
|
||||
}
|
||||
; X32: test_no_cse:
|
||||
; X32: movl %gs:196
|
||||
; X32: movl %fs:196
|
||||
; X32: ret
|
||||
|
||||
declare <4 x i32> @llvm.x86.sse41.pmovsxwd(<8 x i16>) nounwind readnone
|
||||
|
Loading…
Reference in New Issue
Block a user