[PATCH] D69953: MCP: Fixed bug with dest overlapping copy source
Tim Renouf via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 7 09:42:30 PST 2019
tpr created this revision.
Herald added subscribers: llvm-commits, hiraditya, nhaehnle, jvesely.
Herald added a project: LLVM.
In MachineCopyPropagation, when propagating the source of a copy into
the operand of a later instruction, bail if a destination overlaps the
copy source. If the instruction where the substitution is happening is
also a copy, allowing the propagation confuses the tracking mechanism.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D69953
Files:
llvm/lib/CodeGen/MachineCopyPropagation.cpp
llvm/test/CodeGen/AMDGPU/mcp-overlap-after-propagation.mir
Index: llvm/test/CodeGen/AMDGPU/mcp-overlap-after-propagation.mir
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AMDGPU/mcp-overlap-after-propagation.mir
@@ -0,0 +1,27 @@
+# RUN: llc -march=amdgcn -mcpu=gfx1010 %s -o - -run-pass machine-cp -verify-machineinstrs | FileCheck %s
+#
+# The MachineCopyPropagation bug being tested propagates s[60:67] into the copy
+# into s[56:63], and then uses s[60:67] in the following
+# IMAGE_SAMPLE_V3_V2_gfx10, even though it has just overwritten half of it.
+
+# CHECK-LABEL: name: _amdgpu_ps_main
+# CHECK-NOT: IMAGE_SAMPLE_V3_V2_gfx10 {{.*}} $sgpr60_sgpr61_sgpr62_sgpr63_sgpr64_sgpr65_sgpr66_sgpr67
+# CHECK: IMAGE_SAMPLE_V3_V2_gfx10 {{.*}} $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95
+
+---
+name: _amdgpu_ps_main
+body: |
+ bb.0:
+ successors:
+ liveins: $sgpr2, $sgpr3, $sgpr96, $sgpr97, $sgpr98, $sgpr99, $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr5, $vgpr70, $vgpr71
+
+ renamable $sgpr8_sgpr9 = S_GETPC_B64
+ renamable $sgpr8 = COPY killed renamable $sgpr2
+ renamable $sgpr60_sgpr61_sgpr62_sgpr63_sgpr64_sgpr65_sgpr66_sgpr67 = S_LOAD_DWORDX8_IMM renamable $sgpr8_sgpr9, 144, 0, 0 :: (invariant load 32, align 16, addrspace 4)
+ renamable $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 = COPY killed renamable $sgpr60_sgpr61_sgpr62_sgpr63_sgpr64_sgpr65_sgpr66_sgpr67
+ renamable $vgpr4 = IMAGE_GET_LOD_V1_V2_gfx10 renamable $vgpr70_vgpr71, renamable $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95, renamable $sgpr96_sgpr97_sgpr98_sgpr99, 2, 1, 0, 0, 0, 0, 0, 0, 0, implicit $exec
+ renamable $sgpr56_sgpr57_sgpr58_sgpr59_sgpr60_sgpr61_sgpr62_sgpr63 = COPY killed renamable $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95
+ renamable $vgpr12_vgpr13_vgpr14 = IMAGE_SAMPLE_V3_V2_gfx10 renamable $vgpr70_vgpr71, renamable $sgpr56_sgpr57_sgpr58_sgpr59_sgpr60_sgpr61_sgpr62_sgpr63, renamable $sgpr96_sgpr97_sgpr98_sgpr99, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load 12, align 16)
+ S_ENDPGM 0
+
+...
Index: llvm/lib/CodeGen/MachineCopyPropagation.cpp
===================================================================
--- llvm/lib/CodeGen/MachineCopyPropagation.cpp
+++ llvm/lib/CodeGen/MachineCopyPropagation.cpp
@@ -432,6 +432,20 @@
if (hasImplicitOverlap(MI, MOUse))
continue;
+ // Check that the instruction does not (partially) overwrite the copy
+ // source that we are about to use. The tracker mechanism cannot cope with
+ // that.
+ bool Overlap = false;
+ for (const MachineOperand &MO : MI.defs()) {
+ if ((Overlap = TRI->regsOverlap(MO.getReg(), CopySrcReg)))
+ break;
+ }
+ if (Overlap) {
+ LLVM_DEBUG(dbgs() << "MCP: Copy source overlap with dest in " << MI
+ << "\n");
+ continue;
+ }
+
if (!DebugCounter::shouldExecute(FwdCounter)) {
LLVM_DEBUG(dbgs() << "MCP: Skipping forwarding due to debug counter:\n "
<< MI);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69953.228265.patch
Type: text/x-patch
Size: 3066 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191107/b582fd45/attachment.bin>
More information about the llvm-commits
mailing list