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