Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -478,6 +478,7 @@ ID.AddInteger(LD->getMemoryVT().getRawBits()); ID.AddInteger(LD->getRawSubclassData()); ID.AddInteger(LD->getPointerInfo().getAddrSpace()); + ID.AddInteger(LD->getMemOperand()->getFlags()); break; } case ISD::STORE: { @@ -485,6 +486,7 @@ ID.AddInteger(ST->getMemoryVT().getRawBits()); ID.AddInteger(ST->getRawSubclassData()); ID.AddInteger(ST->getPointerInfo().getAddrSpace()); + ID.AddInteger(ST->getMemOperand()->getFlags()); break; } case ISD::ATOMIC_CMP_SWAP: @@ -506,11 +508,13 @@ ID.AddInteger(AT->getMemoryVT().getRawBits()); ID.AddInteger(AT->getRawSubclassData()); ID.AddInteger(AT->getPointerInfo().getAddrSpace()); + ID.AddInteger(AT->getMemOperand()->getFlags()); break; } case ISD::PREFETCH: { const MemSDNode *PF = cast(N); ID.AddInteger(PF->getPointerInfo().getAddrSpace()); + ID.AddInteger(PF->getMemOperand()->getFlags()); break; } case ISD::VECTOR_SHUFFLE: { @@ -531,8 +535,10 @@ } // end switch (N->getOpcode()) // Target specific memory nodes could also have address spaces to check. - if (N->isTargetMemoryOpcode()) + if (N->isTargetMemoryOpcode()) { ID.AddInteger(cast(N)->getPointerInfo().getAddrSpace()); + ID.AddInteger(cast(N)->getMemOperand()->getFlags()); + } } /// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID @@ -5571,6 +5577,7 @@ ID.AddInteger(MemVT.getRawBits()); AddNodeIDNode(ID, Opcode, VTList, Ops); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void* IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -5742,6 +5749,7 @@ FoldingSetNodeID ID; AddNodeIDNode(ID, Opcode, VTList, Ops); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -5857,6 +5865,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -5957,6 +5966,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, ISD::UNINDEXED, false, VT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -6022,6 +6032,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, ISD::UNINDEXED, true, SVT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -6048,6 +6059,7 @@ ID.AddInteger(ST->getMemoryVT().getRawBits()); ID.AddInteger(ST->getRawSubclassData()); ID.AddInteger(ST->getPointerInfo().getAddrSpace()); + ID.AddInteger(ST->getMemOperand()->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) return SDValue(E, 0); @@ -6074,6 +6086,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, ExtTy, isExpanding, MemVT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -6103,6 +6116,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, IsTruncating, IsCompressing, MemVT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -6128,6 +6142,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, VT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); @@ -6163,6 +6178,7 @@ ID.AddInteger(getSyntheticNodeSubclassData( dl.getIROrder(), VTs, VT, MMO)); ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); + ID.AddInteger((uint32_t)MMO->getFlags()); void *IP = nullptr; if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) { cast(E)->refineAlignment(MMO); Index: test/CodeGen/PowerPC/MMO-Flags-Assertion.ll =================================================================== --- /dev/null +++ test/CodeGen/PowerPC/MMO-Flags-Assertion.ll @@ -0,0 +1,38 @@ +; RUN: llc < %s -mtriple powerpc64le-unknown-linux-gnu + +; void llvm::MachineMemOperand::refineAlignment(const llvm::MachineMemOperand*): +; Assertion `MMO->getFlags() == getFlags() && "Flags mismatch !"' failed. + +declare void @_Z3fn11F(%class.F* byval align 8) local_unnamed_addr +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) +declare signext i32 @_ZN1F11isGlobalRegEv(%class.F*) local_unnamed_addr +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) +declare void @_Z10EmitLValuev(%class.F* sret) local_unnamed_addr +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) + +%class.F = type { i32, i64, i8, [64 x i8], i8, i32* } + +define signext i32 @_Z29EmitOMPAtomicSimpleUpdateExpr1F(%class.F* byval align 8 %p1) local_unnamed_addr { +entry: + call void @_Z3fn11F(%class.F* byval nonnull align 8 %p1) + %call = call signext i32 @_ZN1F11isGlobalRegEv(%class.F* nonnull %p1) + ret i32 %call +} + +define void @_Z3fn2v() local_unnamed_addr { +entry: + %agg.tmp1 = alloca %class.F, align 8 + %XLValue = alloca %class.F, align 8 + %0 = bitcast %class.F* %XLValue to i8* + call void @llvm.lifetime.start.p0i8(i64 96, i8* nonnull %0) + call void @_Z10EmitLValuev(%class.F* nonnull sret %XLValue) + %1 = bitcast %class.F* %agg.tmp1 to i8* + call void @llvm.lifetime.start.p0i8(i64 96, i8* nonnull %1) + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %1, i8* nonnull %0, i64 96, i32 8, i1 false) + call void @_Z3fn11F(%class.F* byval nonnull align 8 %XLValue) + %call.i = call signext i32 @_ZN1F11isGlobalRegEv(%class.F* nonnull %agg.tmp1) + call void @llvm.lifetime.end.p0i8(i64 96, i8* nonnull %1) + call void @llvm.lifetime.end.p0i8(i64 96, i8* nonnull %0) + ret void +} +