ClobberRegister(Reg);
}
- // Remember Def is defined by the copy.
- for (MCSubRegIterator SR(Def, TRI, /*IncludeSelf=*/true); SR.isValid();
- ++SR) {
- CopyMap[*SR] = MI;
- AvailCopyMap[*SR] = MI;
- }
+ if (!MI->getOperand(0).isDead() && !MI->getOperand(1).isUndef()) {
+ // Remember Def is defined by the copy.
+ for (MCSubRegIterator SR(Def, TRI, /*IncludeSelf=*/true); SR.isValid();
+ ++SR) {
+ CopyMap[*SR] = MI;
+ AvailCopyMap[*SR] = MI;
+ }
- // Remember source that's copied to Def. Once it's clobbered, then
- // it's no longer available for copy propagation.
- RegList &DestList = SrcMap[Src];
- if (!is_contained(DestList, Def))
- DestList.push_back(Def);
+ // Remember source that's copied to Def. Once it's clobbered, then
+ // it's no longer available for copy propagation.
+ RegList &DestList = SrcMap[Src];
+ if (!is_contained(DestList, Def))
+ DestList.push_back(Def);
+ }
continue;
}
--- /dev/null
+# RUN: llc -o - %s -march=amdgcn -mcpu=fiji -run-pass=machine-cp -verify-machineinstrs | FileCheck -check-prefix=GCN %s
+
+# GCN-LABEL: dead_copy
+# GCN: bb.0
+# GCN-NOT: dead %vgpr5 = COPY undef %vgpr11, implicit %exec
+# GCN: %vgpr5 = COPY %vgpr11, implicit %exec
+
+---
+name: dead_copy
+
+body: |
+
+ bb.0:
+ liveins: %vgpr11, %sgpr0, %sgpr1, %vgpr6, %vgpr7, %vgpr4
+
+ dead %vgpr5 = COPY undef %vgpr11, implicit %exec
+
+ %vgpr5 = COPY %vgpr11, implicit %exec
+
+ %sgpr14 = S_ADD_U32 %sgpr0, target-flags(amdgpu-gotprel) 1136, implicit-def %scc
+ %sgpr15 = S_ADDC_U32 %sgpr1, target-flags(amdgpu-gotprel32-lo) 0, implicit-def dead %scc, implicit %scc
+
+ %vgpr10 = COPY killed %sgpr14, implicit %exec
+ %vgpr11 = COPY killed %sgpr15, implicit %exec
+
+ FLAT_STORE_DWORDX4 %vgpr10_vgpr11, %vgpr4_vgpr5_vgpr6_vgpr7, 0, 0, 0, implicit %exec, implicit %flat_scr
+...