[llvm] [SystemZ] Don't lower float/double ATOMIC_[LOAD|STORE] to [LOAD|STORE] (PR #75879)
Ulrich Weigand via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 13 13:17:42 PDT 2024
================
@@ -1742,7 +1758,35 @@ void SystemZDAGToDAGISel::Select(SDNode *Node) {
}
break;
}
+
+ case ISD::ATOMIC_STORE: {
+ auto *AtomOp = cast<AtomicSDNode>(Node);
+ // Replace the atomic_store with a regular store and select it. This is
+ // ok since we know all store instructions <= 8 bytes are atomic, and the
+ // 16 byte case is already handled during lowering.
+ StoreSDNode *St = cast<StoreSDNode>(CurDAG->getTruncStore(
+ AtomOp->getChain(), SDLoc(AtomOp), AtomOp->getVal(),
+ AtomOp->getBasePtr(), AtomOp->getMemoryVT(), AtomOp->getMemOperand()));
+ assert(St->getMemOperand()->isAtomic() && "Broken MMO.");
+ SDNode *Chain = St;
+ // We have to enforce sequential consistency by performing a
+ // serialization operation after the store.
+ if (AtomOp->getSuccessOrdering() == AtomicOrdering::SequentiallyConsistent)
+ Chain = CurDAG->getMachineNode(SystemZ::Serialize, SDLoc(AtomOp),
+ MVT::Other, SDValue(Chain, 0));
+ ReplaceNode(Node, Chain);
+ SelectCode(St);
+ return;
}
+ }
+
+#ifndef NDEBUG
----------------
uweigand wrote:
I don't think we need that - nodes that are invalid that way already should just not be matched, right?
https://github.com/llvm/llvm-project/pull/75879
More information about the llvm-commits
mailing list