[llvm] 7e92935 - [RISCV] Set how many bytes load from or store to stack slot
Jim Lin via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 9 18:25:37 PST 2023
Author: Jim Lin
Date: 2023-03-10T10:14:59+08:00
New Revision: 7e9293572d332b812eb1e521f0a75a4e7034abbf
URL: https://github.com/llvm/llvm-project/commit/7e9293572d332b812eb1e521f0a75a4e7034abbf
DIFF: https://github.com/llvm/llvm-project/commit/7e9293572d332b812eb1e521f0a75a4e7034abbf.diff
LOG: [RISCV] Set how many bytes load from or store to stack slot
Refer from: https://reviews.llvm.org/D44782
After https://reviews.llvm.org/D130302, LW+SEXT.B can be folded into LB
as partially reload stack slot. This gains incorrect optimization result
from `StackSlotColoring` without given the number of bytes exactly load
from stack. LB+SW are mis-interpreted as fully reload/restore from stack
slot without the sign-extension. SW would be considered as a redundant store.
The testcase is copied from llvm/test/CodeGen/X86/pr30821.mir.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D145471
Added:
Modified:
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.h
llvm/test/CodeGen/RISCV/stack-slot-coloring.mir
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 7d060ad77186f..3bb50c08bee04 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -78,20 +78,28 @@ MCInst RISCVInstrInfo::getNop() const {
}
unsigned RISCVInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
- int &FrameIndex) const {
+ int &FrameIndex,
+ unsigned &MemBytes) const {
switch (MI.getOpcode()) {
default:
return 0;
case RISCV::LB:
case RISCV::LBU:
+ MemBytes = 1;
+ break;
case RISCV::LH:
case RISCV::LHU:
case RISCV::FLH:
+ MemBytes = 2;
+ break;
case RISCV::LW:
case RISCV::FLW:
case RISCV::LWU:
+ MemBytes = 4;
+ break;
case RISCV::LD:
case RISCV::FLD:
+ MemBytes = 8;
break;
}
@@ -105,17 +113,25 @@ unsigned RISCVInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
}
unsigned RISCVInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
- int &FrameIndex) const {
+ int &FrameIndex,
+ unsigned &MemBytes) const {
switch (MI.getOpcode()) {
default:
return 0;
case RISCV::SB:
+ MemBytes = 1;
+ break;
case RISCV::SH:
- case RISCV::SW:
case RISCV::FSH:
+ MemBytes = 2;
+ break;
+ case RISCV::SW:
case RISCV::FSW:
+ MemBytes = 4;
+ break;
case RISCV::SD:
case RISCV::FSD:
+ MemBytes = 8;
break;
}
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
index 515a0071b2b62..f0f5fd14922ff 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
@@ -49,10 +49,10 @@ class RISCVInstrInfo : public RISCVGenInstrInfo {
MCInst getNop() const override;
const MCInstrDesc &getBrCond(RISCVCC::CondCode CC) const;
- unsigned isLoadFromStackSlot(const MachineInstr &MI,
- int &FrameIndex) const override;
- unsigned isStoreToStackSlot(const MachineInstr &MI,
- int &FrameIndex) const override;
+ unsigned isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex,
+ unsigned &MemBytes) const override;
+ unsigned isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex,
+ unsigned &MemBytes) const override;
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg,
diff --git a/llvm/test/CodeGen/RISCV/stack-slot-coloring.mir b/llvm/test/CodeGen/RISCV/stack-slot-coloring.mir
index bb89758c785b1..1fb2b7685bafb 100644
--- a/llvm/test/CodeGen/RISCV/stack-slot-coloring.mir
+++ b/llvm/test/CodeGen/RISCV/stack-slot-coloring.mir
@@ -94,10 +94,14 @@ body: |
; CHECK-NEXT: $x27 = LW %stack.0.a, 0 :: (volatile dereferenceable load (s32) from %ir.a)
; CHECK-NEXT: renamable $x1 = LW %stack.0.a, 0 :: (volatile dereferenceable load (s32) from %ir.a)
; CHECK-NEXT: SW killed renamable $x1, %stack.1, 0 :: (store (s32) into %stack.1)
+ ; CHECK-NEXT: renamable $x1 = LB %stack.0.a, 0 :: (volatile dereferenceable load (s8) from %ir.a)
+ ; CHECK-NEXT: SW killed renamable $x1, %stack.0.a, 0 :: (volatile store (s32) into %ir.a)
; CHECK-NEXT: renamable $x1 = LW %stack.1, 0 :: (load (s32) from %stack.1)
; CHECK-NEXT: SW killed renamable $x1, %stack.0.a, 0 :: (volatile store (s32) into %ir.a)
; CHECK-NEXT: renamable $x1 = LW %stack.0.a, 0 :: (volatile dereferenceable load (s32) from %ir.a)
; CHECK-NEXT: SW killed renamable $x1, %stack.1, 0 :: (store (s32) into %stack.1)
+ ; CHECK-NEXT: renamable $x1 = LB %stack.0.a, 0 :: (volatile dereferenceable load (s8) from %ir.a)
+ ; CHECK-NEXT: SW killed renamable $x1, %stack.0.a, 0 :: (volatile store (s32) into %ir.a)
; CHECK-NEXT: renamable $x1 = LW %stack.1, 0 :: (load (s32) from %stack.1)
; CHECK-NEXT: SW killed renamable $x1, %stack.0.a, 0 :: (volatile store (s32) into %ir.a)
; CHECK-NEXT: SW $x10, %stack.0.a, 0 :: (volatile store (s32) into %ir.a)
More information about the llvm-commits
mailing list