From eaa8af93228c1e1bce078d66605db83b26eda8e5 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 30 May 2020 20:28:36 -0400 Subject: [PATCH] GlobalISel: Add helper for constructing load from offset --- llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h | 8 ++++++++ llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index 0252a32..ae28d72 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -804,6 +804,14 @@ public: MachineInstrBuilder buildLoadInstr(unsigned Opcode, const DstOp &Res, const SrcOp &Addr, MachineMemOperand &MMO); + /// Helper to create a load from a constant offset given a base address. Load + /// the type of \p Dst from \p Offset from the given base address and memory + /// operand. + MachineInstrBuilder buildLoadFromOffset(const DstOp &Dst, + const SrcOp &BasePtr, + MachineMemOperand &BaseMMO, + int64_t Offset); + /// Build and insert `G_STORE Val, Addr, MMO`. /// /// Stores the value \p Val to \p Addr. diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 6e53ec2..4236fdd 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -376,6 +376,23 @@ MachineInstrBuilder MachineIRBuilder::buildLoadInstr(unsigned Opcode, return MIB; } +MachineInstrBuilder MachineIRBuilder::buildLoadFromOffset( + const DstOp &Dst, const SrcOp &BasePtr, + MachineMemOperand &BaseMMO, int64_t Offset) { + LLT LoadTy = Dst.getLLTTy(*getMRI()); + MachineMemOperand *OffsetMMO = + getMF().getMachineMemOperand(&BaseMMO, Offset, LoadTy.getSizeInBytes()); + + if (Offset == 0) // This may be a size or type changing load. + return buildLoad(Dst, BasePtr, *OffsetMMO); + + LLT PtrTy = BasePtr.getLLTTy(*getMRI()); + LLT OffsetTy = LLT::scalar(PtrTy.getSizeInBits()); + auto ConstOffset = buildConstant(OffsetTy, Offset); + auto Ptr = buildPtrAdd(PtrTy, BasePtr, ConstOffset); + return buildLoad(Dst, Ptr, *OffsetMMO); +} + MachineInstrBuilder MachineIRBuilder::buildStore(const SrcOp &Val, const SrcOp &Addr, MachineMemOperand &MMO) { -- 2.7.4