Skip to content

Commit 3f4468f

Browse files
authored
[RISCV] Teach expandRV32ZdinxStore to handle memoperand not being present. (llvm#113981)
I received a report that the outliner drops memoperands and causes this code to crash. Handle this by only copying the memoperand if it exists. Similar for expandRV32ZdinxLoad
1 parent d3b9855 commit 3f4468f

File tree

1 file changed

+47
-42
lines changed

1 file changed

+47
-42
lines changed

llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -320,34 +320,37 @@ bool RISCVExpandPseudo::expandRV32ZdinxStore(MachineBasicBlock &MBB,
320320
Register Hi =
321321
TRI->getSubReg(MBBI->getOperand(0).getReg(), RISCV::sub_gpr_odd);
322322

323-
assert(MBBI->hasOneMemOperand() && "Expected mem operand");
324-
MachineMemOperand *OldMMO = MBBI->memoperands().front();
325-
MachineFunction *MF = MBB.getParent();
326-
MachineMemOperand *MMOLo = MF->getMachineMemOperand(OldMMO, 0, 4);
327-
MachineMemOperand *MMOHi = MF->getMachineMemOperand(OldMMO, 4, 4);
328-
329-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
330-
.addReg(Lo, getKillRegState(MBBI->getOperand(0).isKill()))
331-
.addReg(MBBI->getOperand(1).getReg())
332-
.add(MBBI->getOperand(2))
333-
.setMemRefs(MMOLo);
323+
auto MIBLo = BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
324+
.addReg(Lo, getKillRegState(MBBI->getOperand(0).isKill()))
325+
.addReg(MBBI->getOperand(1).getReg())
326+
.add(MBBI->getOperand(2));
334327

328+
MachineInstrBuilder MIBHi;
335329
if (MBBI->getOperand(2).isGlobal() || MBBI->getOperand(2).isCPI()) {
336330
assert(MBBI->getOperand(2).getOffset() % 8 == 0);
337331
MBBI->getOperand(2).setOffset(MBBI->getOperand(2).getOffset() + 4);
338-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
339-
.addReg(Hi, getKillRegState(MBBI->getOperand(0).isKill()))
340-
.add(MBBI->getOperand(1))
341-
.add(MBBI->getOperand(2))
342-
.setMemRefs(MMOHi);
332+
MIBHi = BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
333+
.addReg(Hi, getKillRegState(MBBI->getOperand(0).isKill()))
334+
.add(MBBI->getOperand(1))
335+
.add(MBBI->getOperand(2));
343336
} else {
344337
assert(isInt<12>(MBBI->getOperand(2).getImm() + 4));
345-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
346-
.addReg(Hi, getKillRegState(MBBI->getOperand(0).isKill()))
347-
.add(MBBI->getOperand(1))
348-
.addImm(MBBI->getOperand(2).getImm() + 4)
349-
.setMemRefs(MMOHi);
338+
MIBHi = BuildMI(MBB, MBBI, DL, TII->get(RISCV::SW))
339+
.addReg(Hi, getKillRegState(MBBI->getOperand(0).isKill()))
340+
.add(MBBI->getOperand(1))
341+
.addImm(MBBI->getOperand(2).getImm() + 4);
342+
}
343+
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);
350352
}
353+
351354
MBBI->eraseFromParent();
352355
return true;
353356
}
@@ -364,46 +367,48 @@ bool RISCVExpandPseudo::expandRV32ZdinxLoad(MachineBasicBlock &MBB,
364367
Register Hi =
365368
TRI->getSubReg(MBBI->getOperand(0).getReg(), RISCV::sub_gpr_odd);
366369

367-
assert(MBBI->hasOneMemOperand() && "Expected mem operand");
368-
MachineMemOperand *OldMMO = MBBI->memoperands().front();
369-
MachineFunction *MF = MBB.getParent();
370-
MachineMemOperand *MMOLo = MF->getMachineMemOperand(OldMMO, 0, 4);
371-
MachineMemOperand *MMOHi = MF->getMachineMemOperand(OldMMO, 4, 4);
370+
MachineInstrBuilder MIBLo, MIBHi;
372371

373372
// If the register of operand 1 is equal to the Lo register, then swap the
374373
// order of loading the Lo and Hi statements.
375374
bool IsOp1EqualToLo = Lo == MBBI->getOperand(1).getReg();
376375
// Order: Lo, Hi
377376
if (!IsOp1EqualToLo) {
378-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Lo)
379-
.addReg(MBBI->getOperand(1).getReg())
380-
.add(MBBI->getOperand(2))
381-
.setMemRefs(MMOLo);
377+
MIBLo = BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Lo)
378+
.addReg(MBBI->getOperand(1).getReg())
379+
.add(MBBI->getOperand(2));
382380
}
383381

384382
if (MBBI->getOperand(2).isGlobal() || MBBI->getOperand(2).isCPI()) {
385383
auto Offset = MBBI->getOperand(2).getOffset();
386384
assert(Offset % 8 == 0);
387385
MBBI->getOperand(2).setOffset(Offset + 4);
388-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Hi)
389-
.addReg(MBBI->getOperand(1).getReg())
390-
.add(MBBI->getOperand(2))
391-
.setMemRefs(MMOHi);
386+
MIBHi = BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Hi)
387+
.addReg(MBBI->getOperand(1).getReg())
388+
.add(MBBI->getOperand(2));
392389
MBBI->getOperand(2).setOffset(Offset);
393390
} else {
394391
assert(isInt<12>(MBBI->getOperand(2).getImm() + 4));
395-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Hi)
396-
.addReg(MBBI->getOperand(1).getReg())
397-
.addImm(MBBI->getOperand(2).getImm() + 4)
398-
.setMemRefs(MMOHi);
392+
MIBHi = BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Hi)
393+
.addReg(MBBI->getOperand(1).getReg())
394+
.addImm(MBBI->getOperand(2).getImm() + 4);
399395
}
400396

401397
// Order: Hi, Lo
402398
if (IsOp1EqualToLo) {
403-
BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Lo)
404-
.addReg(MBBI->getOperand(1).getReg())
405-
.add(MBBI->getOperand(2))
406-
.setMemRefs(MMOLo);
399+
MIBLo = BuildMI(MBB, MBBI, DL, TII->get(RISCV::LW), Lo)
400+
.addReg(MBBI->getOperand(1).getReg())
401+
.add(MBBI->getOperand(2));
402+
}
403+
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);
407412
}
408413

409414
MBBI->eraseFromParent();

0 commit comments

Comments
 (0)