@@ -24,6 +24,11 @@ namespace mca {
24
24
25
25
const unsigned WriteRef::INVALID_IID = std::numeric_limits<unsigned >::max();
26
26
27
+ static std::function<bool (MCPhysReg)>
28
+ isNonArtificial (const MCRegisterInfo &MRI) {
29
+ return [&MRI](MCPhysReg R) { return !MRI.isArtificial (R); };
30
+ }
31
+
27
32
WriteRef::WriteRef (unsigned SourceIndex, WriteState *WS)
28
33
: IID(SourceIndex), WriteBackCycle(), WriteResID(), RegisterID(),
29
34
Write(WS) {}
@@ -282,7 +287,8 @@ void RegisterFile::addRegisterWrite(WriteRef Write,
282
287
MCPhysReg ZeroRegisterID =
283
288
WS.clearsSuperRegisters () ? RegID : WS.getRegisterID ();
284
289
ZeroRegisters.setBitVal (ZeroRegisterID, IsWriteZero);
285
- for (MCPhysReg I : MRI.subregs (ZeroRegisterID))
290
+ for (MCPhysReg I :
291
+ make_filter_range (MRI.subregs (ZeroRegisterID), isNonArtificial (MRI)))
286
292
ZeroRegisters.setBitVal (I, IsWriteZero);
287
293
288
294
// If this move has been eliminated, then method tryEliminateMoveOrSwap should
@@ -304,7 +310,8 @@ void RegisterFile::addRegisterWrite(WriteRef Write,
304
310
// Update the mapping for register RegID including its sub-registers.
305
311
RegisterMappings[RegID].first = Write;
306
312
RegisterMappings[RegID].second .AliasRegID = 0U ;
307
- for (MCPhysReg I : MRI.subregs (RegID)) {
313
+ for (MCPhysReg I :
314
+ make_filter_range (MRI.subregs (RegID), isNonArtificial (MRI))) {
308
315
RegisterMappings[I].first = Write;
309
316
RegisterMappings[I].second .AliasRegID = 0U ;
310
317
}
@@ -472,7 +479,8 @@ bool RegisterFile::tryEliminateMoveOrSwap(MutableArrayRef<WriteState> Writes,
472
479
AliasedReg = RMAlias.AliasRegID ;
473
480
474
481
RegisterMappings[AliasReg].second .AliasRegID = AliasedReg;
475
- for (MCPhysReg I : MRI.subregs (AliasReg))
482
+ for (MCPhysReg I :
483
+ make_filter_range (MRI.subregs (AliasReg), isNonArtificial (MRI)))
476
484
RegisterMappings[I].second .AliasRegID = AliasedReg;
477
485
478
486
if (ZeroRegisters[RS.getRegisterID ()]) {
0 commit comments