aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp')
-rw-r--r--llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
index fecc83a821f4..a324deb4e48f 100644
--- a/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMergeBaseOffset.cpp
@@ -385,7 +385,9 @@ bool RISCVMergeBaseOffsetOpt::foldIntoMemoryOps(MachineInstr &Hi,
return false;
case RISCV::LB:
case RISCV::LH:
+ case RISCV::LH_INX:
case RISCV::LW:
+ case RISCV::LW_INX:
case RISCV::LBU:
case RISCV::LHU:
case RISCV::LWU:
@@ -395,7 +397,9 @@ bool RISCVMergeBaseOffsetOpt::foldIntoMemoryOps(MachineInstr &Hi,
case RISCV::FLD:
case RISCV::SB:
case RISCV::SH:
+ case RISCV::SH_INX:
case RISCV::SW:
+ case RISCV::SW_INX:
case RISCV::SD:
case RISCV::FSH:
case RISCV::FSW:
@@ -429,8 +433,16 @@ bool RISCVMergeBaseOffsetOpt::foldIntoMemoryOps(MachineInstr &Hi,
NumOps = Flags.getNumOperandRegisters();
// Memory constraints have two operands.
- if (NumOps != 2 || !Flags.isMemKind())
+ if (NumOps != 2 || !Flags.isMemKind()) {
+ // If the register is used by something other than a memory contraint,
+ // we should not fold.
+ for (unsigned J = 0; J < NumOps; ++J) {
+ const MachineOperand &MO = UseMI.getOperand(I + 1 + J);
+ if (MO.isReg() && MO.getReg() == DestReg)
+ return false;
+ }
continue;
+ }
// We can't do this for constraint A because AMO instructions don't have
// an immediate offset field.