[llvm] [AMDGPU][SILoadStoreOptimizer] Fix lds address operand offset (PR #176816)
Mikael Holmen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 26 05:08:45 PST 2026
================
@@ -2226,20 +2258,35 @@ void SILoadStoreOptimizer::updateBaseAndOffset(MachineInstr &MI,
TII->getNamedOperand(MI, AMDGPU::OpName::offset)->setImm(NewOffset);
}
-std::optional<int32_t>
-SILoadStoreOptimizer::extractConstOffset(const MachineOperand &Op) const {
- if (Op.isImm())
- return Op.getImm();
+// Helper to extract a 64-bit constant offset from a V_ADD_U64_e64 instruction.
+// Returns true if successful, populating Addr with base register info and
+// offset.
+bool SILoadStoreOptimizer::processBaseWithConstOffset64(
+ MachineInstr *AddDef, const MachineOperand &Base, MemAddress &Addr) const {
+ if (!Base.isReg())
+ return false;
- if (!Op.isReg())
- return std::nullopt;
+ MachineOperand *Src0 = TII->getNamedOperand(*AddDef, AMDGPU::OpName::src0);
+ MachineOperand *Src1 = TII->getNamedOperand(*AddDef, AMDGPU::OpName::src1);
- MachineInstr *Def = MRI->getUniqueVRegDef(Op.getReg());
- if (!Def || Def->getOpcode() != AMDGPU::S_MOV_B32 ||
- !Def->getOperand(1).isImm())
- return std::nullopt;
+ const MachineOperand *BaseOp = nullptr;
+
+ auto Offset = TII->getImmOrMaterializedImm(*Src1);
+
+ if (Offset) {
+ BaseOp = Src0;
+ Addr.Offset = *Offset;
+ } else {
+ // Both or neither are constants - can't handle this pattern
+ return false;
+ }
- return Def->getOperand(1).getImm();
+ // Now extract the base register (which should be a 64-bit VGPR).
+ MachineInstr *BaseDef = MRI->getVRegDef(BaseOp->getReg());
----------------
mikaelholmen wrote:
BaseDef is unused when building without asserts.
https://github.com/llvm/llvm-project/pull/176816
More information about the llvm-commits
mailing list