@@ -24,6 +24,11 @@ namespace mca {
2424
2525const unsigned WriteRef::INVALID_IID = std::numeric_limits<unsigned >::max();
2626
27+ static std::function<bool (MCPhysReg)>
28+ isNonArtificial (const MCRegisterInfo &MRI) {
29+ return [&MRI](MCPhysReg R) { return !MRI.isArtificial (R); };
30+ }
31+
2732WriteRef::WriteRef (unsigned SourceIndex, WriteState *WS)
2833 : IID(SourceIndex), WriteBackCycle(), WriteResID(), RegisterID(),
2934 Write(WS) {}
@@ -282,7 +287,8 @@ void RegisterFile::addRegisterWrite(WriteRef Write,
282287 MCPhysReg ZeroRegisterID =
283288 WS.clearsSuperRegisters () ? RegID : WS.getRegisterID ();
284289 ZeroRegisters.setBitVal (ZeroRegisterID, IsWriteZero);
285- for (MCPhysReg I : MRI.subregs (ZeroRegisterID))
290+ for (MCPhysReg I :
291+ make_filter_range (MRI.subregs (ZeroRegisterID), isNonArtificial (MRI)))
286292 ZeroRegisters.setBitVal (I, IsWriteZero);
287293
288294 // If this move has been eliminated, then method tryEliminateMoveOrSwap should
@@ -304,7 +310,8 @@ void RegisterFile::addRegisterWrite(WriteRef Write,
304310 // Update the mapping for register RegID including its sub-registers.
305311 RegisterMappings[RegID].first = Write;
306312 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))) {
308315 RegisterMappings[I].first = Write;
309316 RegisterMappings[I].second .AliasRegID = 0U ;
310317 }
@@ -472,7 +479,8 @@ bool RegisterFile::tryEliminateMoveOrSwap(MutableArrayRef<WriteState> Writes,
472479 AliasedReg = RMAlias.AliasRegID ;
473480
474481 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)))
476484 RegisterMappings[I].second .AliasRegID = AliasedReg;
477485
478486 if (ZeroRegisters[RS.getRegisterID ()]) {
0 commit comments