Skip to content

Commit d4af658

Browse files
committed
[RISCV] Support multiple memory operands in expandRV32ZdinxStore.
TailMerge can create stores with multiple memory operands. We need to split all of them instead of assuming there is only one.
1 parent f10441a commit d4af658

File tree

2 files changed

+53
-16
lines changed

2 files changed

+53
-16
lines changed

llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,15 @@ bool RISCVExpandPseudo::expandRV32ZdinxStore(MachineBasicBlock &MBB,
341341
.addImm(MBBI->getOperand(2).getImm() + 4);
342342
}
343343

344-
if (!MBBI->memoperands_empty()) {
345-
assert(MBBI->hasOneMemOperand() && "Expected mem operand");
346-
MachineMemOperand *OldMMO = MBBI->memoperands().front();
347-
MachineFunction *MF = MBB.getParent();
348-
MachineMemOperand *MMOLo = MF->getMachineMemOperand(OldMMO, 0, 4);
349-
MachineMemOperand *MMOHi = MF->getMachineMemOperand(OldMMO, 4, 4);
350-
MIBLo.setMemRefs(MMOLo);
351-
MIBHi.setMemRefs(MMOHi);
344+
MachineFunction *MF = MBB.getParent();
345+
SmallVector<MachineMemOperand *> NewLoMMOs;
346+
SmallVector<MachineMemOperand *> NewHiMMOs;
347+
for (const MachineMemOperand *MMO : MBBI->memoperands()) {
348+
NewLoMMOs.push_back(MF->getMachineMemOperand(MMO, 0, 4));
349+
NewHiMMOs.push_back(MF->getMachineMemOperand(MMO, 4, 4));
352350
}
351+
MIBLo.setMemRefs(NewLoMMOs);
352+
MIBHi.setMemRefs(NewHiMMOs);
353353

354354
MBBI->eraseFromParent();
355355
return true;
@@ -401,15 +401,15 @@ bool RISCVExpandPseudo::expandRV32ZdinxLoad(MachineBasicBlock &MBB,
401401
.add(MBBI->getOperand(2));
402402
}
403403

404-
if (!MBBI->memoperands_empty()) {
405-
assert(MBBI->hasOneMemOperand() && "Expected mem operand");
406-
MachineMemOperand *OldMMO = MBBI->memoperands().front();
407-
MachineFunction *MF = MBB.getParent();
408-
MachineMemOperand *MMOLo = MF->getMachineMemOperand(OldMMO, 0, 4);
409-
MachineMemOperand *MMOHi = MF->getMachineMemOperand(OldMMO, 4, 4);
410-
MIBLo.setMemRefs(MMOLo);
411-
MIBHi.setMemRefs(MMOHi);
404+
MachineFunction *MF = MBB.getParent();
405+
SmallVector<MachineMemOperand *> NewLoMMOs;
406+
SmallVector<MachineMemOperand *> NewHiMMOs;
407+
for (const MachineMemOperand *MMO : MBBI->memoperands()) {
408+
NewLoMMOs.push_back(MF->getMachineMemOperand(MMO, 0, 4));
409+
NewHiMMOs.push_back(MF->getMachineMemOperand(MMO, 4, 4));
412410
}
411+
MIBLo.setMemRefs(NewLoMMOs);
412+
MIBHi.setMemRefs(NewHiMMOs);
413413

414414
MBBI->eraseFromParent();
415415
return true;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=riscv32 -mattr=+zdinx | FileCheck %s
3+
4+
; This test previously asserted because TailMerge created a PseudoRV32ZdinxSD
5+
; with 2 memoperands which RISCVExpandPseudo could not handle.
6+
7+
define i32 @foo(double %x, ptr %y, i64 %0, i64 %1, i1 %cmp6.not, ptr %arrayidx13, ptr %arrayidx20) {
8+
; CHECK-LABEL: foo:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: andi a0, a7, 1
11+
; CHECK-NEXT: beqz a0, .LBB0_2
12+
; CHECK-NEXT: # %bb.1: # %if.else
13+
; CHECK-NEXT: lw a0, 4(sp)
14+
; CHECK-NEXT: j .LBB0_3
15+
; CHECK-NEXT: .LBB0_2: # %if.then7
16+
; CHECK-NEXT: lw a0, 0(sp)
17+
; CHECK-NEXT: .LBB0_3: # %common.ret
18+
; CHECK-NEXT: fcvt.d.w a2, zero
19+
; CHECK-NEXT: sw a2, 0(a0)
20+
; CHECK-NEXT: sw a3, 4(a0)
21+
; CHECK-NEXT: li a0, 0
22+
; CHECK-NEXT: ret
23+
entry:
24+
br i1 %cmp6.not, label %if.else, label %if.then7
25+
26+
common.ret: ; preds = %if.else, %if.then7
27+
ret i32 0
28+
29+
if.then7: ; preds = %entry
30+
store double 0.000000e+00, ptr %arrayidx13, align 8
31+
br label %common.ret
32+
33+
if.else: ; preds = %entry
34+
store double 0.000000e+00, ptr %arrayidx20, align 8
35+
br label %common.ret
36+
}
37+

0 commit comments

Comments
 (0)