From e07eb7e7868508ab9d4a8df48f3f918047a5b7eb Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Mon, 5 May 2025 14:13:34 -0700 Subject: [PATCH] [SDAG] Merge memcpy and memcpy.inline lowering paths This is a follow up to c0a264e, but note that there is a functional difference here: the root changes for the memcpy.inline case. This difference appears to have been accidental, but I kept this back to facility separate review in case there's something I'm missing here. --- .../SelectionDAG/SelectionDAGBuilder.cpp | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 744a0fa572b0c..97ce20b973204 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -6461,33 +6461,14 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, RegName, getValue(RegValue))); return; } - case Intrinsic::memcpy: { - const auto &MCI = cast(I); - SDValue Op1 = getValue(I.getArgOperand(0)); - SDValue Op2 = getValue(I.getArgOperand(1)); - SDValue Op3 = getValue(I.getArgOperand(2)); - // @llvm.memcpy defines 0 and 1 to both mean no alignment. - Align DstAlign = MCI.getDestAlign().valueOrOne(); - Align SrcAlign = MCI.getSourceAlign().valueOrOne(); - Align Alignment = std::min(DstAlign, SrcAlign); - bool isVol = MCI.isVolatile(); - // FIXME: Support passing different dest/src alignments to the memcpy DAG - // node. - SDValue Root = isVol ? getRoot() : getMemoryRoot(); - SDValue MC = DAG.getMemcpy(Root, sdl, Op1, Op2, Op3, Alignment, isVol, - /* AlwaysInline */ false, &I, std::nullopt, - MachinePointerInfo(I.getArgOperand(0)), - MachinePointerInfo(I.getArgOperand(1)), - I.getAAMetadata(), BatchAA); - updateDAGForMaybeTailCall(MC); - return; - } + case Intrinsic::memcpy: case Intrinsic::memcpy_inline: { const auto &MCI = cast(I); SDValue Dst = getValue(I.getArgOperand(0)); SDValue Src = getValue(I.getArgOperand(1)); SDValue Size = getValue(I.getArgOperand(2)); - assert(isa(Size) && "memcpy_inline needs constant size"); + assert((!MCI.isForceInlined() || isa(Size)) && + "memcpy_inline needs constant size"); // @llvm.memcpy.inline defines 0 and 1 to both mean no alignment. Align DstAlign = MCI.getDestAlign().valueOrOne(); Align SrcAlign = MCI.getSourceAlign().valueOrOne(); @@ -6495,8 +6476,9 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, bool isVol = MCI.isVolatile(); // FIXME: Support passing different dest/src alignments to the memcpy DAG // node. - SDValue MC = DAG.getMemcpy(getRoot(), sdl, Dst, Src, Size, Alignment, isVol, - /* AlwaysInline */ true, &I, std::nullopt, + SDValue Root = isVol ? getRoot() : getMemoryRoot(); + SDValue MC = DAG.getMemcpy(Root, sdl, Dst, Src, Size, Alignment, isVol, + MCI.isForceInlined(), &I, std::nullopt, MachinePointerInfo(I.getArgOperand(0)), MachinePointerInfo(I.getArgOperand(1)), I.getAAMetadata(), BatchAA);