@@ -312,10 +312,19 @@ bool RISCVExpandPseudo::expandRV32ZdinxStore(MachineBasicBlock &MBB,
312
312
TRI->getSubReg (MBBI->getOperand (0 ).getReg (), RISCV::sub_gpr_even);
313
313
Register Hi =
314
314
TRI->getSubReg (MBBI->getOperand (0 ).getReg (), RISCV::sub_gpr_odd);
315
+
316
+ assert (MBBI->hasOneMemOperand () && " Expected mem operand" );
317
+ MachineMemOperand *OldMMO = MBBI->memoperands ().front ();
318
+ MachineFunction *MF = MBB.getParent ();
319
+ MachineMemOperand *MMOLo = MF->getMachineMemOperand (OldMMO, 0 , 4 );
320
+ MachineMemOperand *MMOHi = MF->getMachineMemOperand (OldMMO, 4 , 4 );
321
+
315
322
BuildMI (MBB, MBBI, DL, TII->get (RISCV::SW))
316
323
.addReg (Lo, getKillRegState (MBBI->getOperand (0 ).isKill ()))
317
324
.addReg (MBBI->getOperand (1 ).getReg ())
318
- .add (MBBI->getOperand (2 ));
325
+ .add (MBBI->getOperand (2 ))
326
+ .setMemRefs (MMOLo);
327
+
319
328
if (MBBI->getOperand (2 ).isGlobal () || MBBI->getOperand (2 ).isCPI ()) {
320
329
// FIXME: Zdinx RV32 can not work on unaligned memory.
321
330
assert (!STI->hasFastUnalignedAccess ());
@@ -325,13 +334,15 @@ bool RISCVExpandPseudo::expandRV32ZdinxStore(MachineBasicBlock &MBB,
325
334
BuildMI (MBB, MBBI, DL, TII->get (RISCV::SW))
326
335
.addReg (Hi, getKillRegState (MBBI->getOperand (0 ).isKill ()))
327
336
.add (MBBI->getOperand (1 ))
328
- .add (MBBI->getOperand (2 ));
337
+ .add (MBBI->getOperand (2 ))
338
+ .setMemRefs (MMOHi);
329
339
} else {
330
340
assert (isInt<12 >(MBBI->getOperand (2 ).getImm () + 4 ));
331
341
BuildMI (MBB, MBBI, DL, TII->get (RISCV::SW))
332
342
.addReg (Hi, getKillRegState (MBBI->getOperand (0 ).isKill ()))
333
343
.add (MBBI->getOperand (1 ))
334
- .addImm (MBBI->getOperand (2 ).getImm () + 4 );
344
+ .addImm (MBBI->getOperand (2 ).getImm () + 4 )
345
+ .setMemRefs (MMOHi);
335
346
}
336
347
MBBI->eraseFromParent ();
337
348
return true ;
@@ -349,14 +360,21 @@ bool RISCVExpandPseudo::expandRV32ZdinxLoad(MachineBasicBlock &MBB,
349
360
Register Hi =
350
361
TRI->getSubReg (MBBI->getOperand (0 ).getReg (), RISCV::sub_gpr_odd);
351
362
363
+ assert (MBBI->hasOneMemOperand () && " Expected mem operand" );
364
+ MachineMemOperand *OldMMO = MBBI->memoperands ().front ();
365
+ MachineFunction *MF = MBB.getParent ();
366
+ MachineMemOperand *MMOLo = MF->getMachineMemOperand (OldMMO, 0 , 4 );
367
+ MachineMemOperand *MMOHi = MF->getMachineMemOperand (OldMMO, 4 , 4 );
368
+
352
369
// If the register of operand 1 is equal to the Lo register, then swap the
353
370
// order of loading the Lo and Hi statements.
354
371
bool IsOp1EqualToLo = Lo == MBBI->getOperand (1 ).getReg ();
355
372
// Order: Lo, Hi
356
373
if (!IsOp1EqualToLo) {
357
374
BuildMI (MBB, MBBI, DL, TII->get (RISCV::LW), Lo)
358
375
.addReg (MBBI->getOperand (1 ).getReg ())
359
- .add (MBBI->getOperand (2 ));
376
+ .add (MBBI->getOperand (2 ))
377
+ .setMemRefs (MMOLo);
360
378
}
361
379
362
380
if (MBBI->getOperand (2 ).isGlobal () || MBBI->getOperand (2 ).isCPI ()) {
@@ -365,20 +383,23 @@ bool RISCVExpandPseudo::expandRV32ZdinxLoad(MachineBasicBlock &MBB,
365
383
MBBI->getOperand (2 ).setOffset (Offset + 4 );
366
384
BuildMI (MBB, MBBI, DL, TII->get (RISCV::LW), Hi)
367
385
.addReg (MBBI->getOperand (1 ).getReg ())
368
- .add (MBBI->getOperand (2 ));
386
+ .add (MBBI->getOperand (2 ))
387
+ .setMemRefs (MMOHi);
369
388
MBBI->getOperand (2 ).setOffset (Offset);
370
389
} else {
371
390
assert (isInt<12 >(MBBI->getOperand (2 ).getImm () + 4 ));
372
391
BuildMI (MBB, MBBI, DL, TII->get (RISCV::LW), Hi)
373
392
.addReg (MBBI->getOperand (1 ).getReg ())
374
- .addImm (MBBI->getOperand (2 ).getImm () + 4 );
393
+ .addImm (MBBI->getOperand (2 ).getImm () + 4 )
394
+ .setMemRefs (MMOHi);
375
395
}
376
396
377
397
// Order: Hi, Lo
378
398
if (IsOp1EqualToLo) {
379
399
BuildMI (MBB, MBBI, DL, TII->get (RISCV::LW), Lo)
380
400
.addReg (MBBI->getOperand (1 ).getReg ())
381
- .add (MBBI->getOperand (2 ));
401
+ .add (MBBI->getOperand (2 ))
402
+ .setMemRefs (MMOLo);
382
403
}
383
404
384
405
MBBI->eraseFromParent ();
0 commit comments