[llvm] [RISCV][llvm] Refactor unpackFromMemLoc to use convertLocVTToValVT (PR #175969)
Brandon Wu via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 14 07:54:33 PST 2026
https://github.com/4vtomat updated https://github.com/llvm/llvm-project/pull/175969
>From 12305b389a95539ec527ac0e93b8f6773b2fcc90 Mon Sep 17 00:00:00 2001
From: Brandon Wu <brandon.wu at sifive.com>
Date: Wed, 14 Jan 2026 07:34:59 -0800
Subject: [PATCH] [RISCV][llvm] Refactor unpackFromMemLoc to use
convertLocVTToValVT
Simplify unpackFromMemLoc to use convertLocVTToValVT for handling
LocInfo conversions, making it consistent with unpackFromRegLoc.
---
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 35 +++++++--------------
1 file changed, 11 insertions(+), 24 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index a6babaf329043..f982ccdf17bad 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -23710,36 +23710,23 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
// The caller is responsible for loading the full value if the argument is
// passed with CCValAssign::Indirect.
static SDValue unpackFromMemLoc(SelectionDAG &DAG, SDValue Chain,
- const CCValAssign &VA, const SDLoc &DL) {
+ const CCValAssign &VA, const SDLoc &DL,
+ const RISCVTargetLowering &TLI) {
MachineFunction &MF = DAG.getMachineFunction();
MachineFrameInfo &MFI = MF.getFrameInfo();
EVT LocVT = VA.getLocVT();
- EVT ValVT = VA.getValVT();
EVT PtrVT = MVT::getIntegerVT(DAG.getDataLayout().getPointerSizeInBits(0));
- if (VA.getLocInfo() == CCValAssign::Indirect) {
- // When the value is a scalable vector, we save the pointer which points to
- // the scalable vector value in the stack. The ValVT will be the pointer
- // type, instead of the scalable vector type.
- ValVT = LocVT;
- }
- int FI = MFI.CreateFixedObject(ValVT.getStoreSize(), VA.getLocMemOffset(),
+ int FI = MFI.CreateFixedObject(LocVT.getStoreSize(), VA.getLocMemOffset(),
/*IsImmutable=*/true);
SDValue FIN = DAG.getFrameIndex(FI, PtrVT);
- SDValue Val;
+ SDValue Val = DAG.getLoad(
+ LocVT, DL, Chain, FIN,
+ MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI));
- ISD::LoadExtType ExtType = ISD::NON_EXTLOAD;
- switch (VA.getLocInfo()) {
- default:
- llvm_unreachable("Unexpected CCValAssign::LocInfo");
- case CCValAssign::Full:
- case CCValAssign::Indirect:
- case CCValAssign::BCvt:
- break;
- }
- Val = DAG.getExtLoad(
- ExtType, DL, LocVT, Chain, FIN,
- MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), ValVT);
- return Val;
+ if (VA.getLocInfo() == CCValAssign::Indirect)
+ return Val;
+
+ return convertLocVTToValVT(DAG, Val, VA, DL, TLI.getSubtarget());
}
static SDValue unpackF64OnRV32DSoftABI(SelectionDAG &DAG, SDValue Chain,
@@ -23887,7 +23874,7 @@ SDValue RISCVTargetLowering::LowerFormalArguments(
} else if (VA.isRegLoc())
ArgValue = unpackFromRegLoc(DAG, Chain, VA, DL, Ins[InsIdx], *this);
else
- ArgValue = unpackFromMemLoc(DAG, Chain, VA, DL);
+ ArgValue = unpackFromMemLoc(DAG, Chain, VA, DL, *this);
if (VA.getLocInfo() == CCValAssign::Indirect) {
// If the original argument was split and passed by reference (e.g. i128
More information about the llvm-commits
mailing list