[llvm] [RDF] Fix cover check when linking refs to defs (PR #113888)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 28 07:07:15 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-hexagon
Author: Yashas Andaluri (yandalur)
<details>
<summary>Changes</summary>
During RDF graph construction, linkRefUp method links a register ref to its upward reaching defs until all RegUnits of the ref have been covered by defs.
However, when a sub-register def covers some, but not all, of the RegUnits of a previous super-register def, a super-register ref is not linked to the super-register def.
This can result in certain super register defs being dead code eliminated.
This patch fixes the cover check for a register ref. A def must be skipped only when all RegUnits of that def have already been covered by a previously seen def.
---
Full diff: https://github.com/llvm/llvm-project/pull/113888.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/RDFGraph.cpp (+6-8)
- (added) llvm/test/CodeGen/Hexagon/rdf-dce-double-cover.mir (+53)
``````````diff
diff --git a/llvm/lib/CodeGen/RDFGraph.cpp b/llvm/lib/CodeGen/RDFGraph.cpp
index bb10b83b256fc4..6995c0eec0b3e3 100644
--- a/llvm/lib/CodeGen/RDFGraph.cpp
+++ b/llvm/lib/CodeGen/RDFGraph.cpp
@@ -1516,15 +1516,13 @@ void DataFlowGraph::linkRefUp(Instr IA, NodeAddr<T> TA, DefStack &DS) {
for (auto I = DS.top(), E = DS.bottom(); I != E; I.down()) {
RegisterRef QR = I->Addr->getRegRef(*this);
- // Skip all defs that are aliased to any of the defs that we have already
- // seen. If this completes a cover of RR, stop the stack traversal.
- bool Alias = Defs.hasAliasOf(QR);
- bool Cover = Defs.insert(QR).hasCoverOf(RR);
- if (Alias) {
- if (Cover)
- break;
+ // Skip all defs that we have already seen.
+ // If this completes a cover of RR, stop the stack traversal.
+ bool Seen = Defs.hasCoverOf(QR);
+ if (Seen)
continue;
- }
+
+ bool Cover = Defs.insert(QR).hasCoverOf(RR);
// The reaching def.
Def RDA = *I;
diff --git a/llvm/test/CodeGen/Hexagon/rdf-dce-double-cover.mir b/llvm/test/CodeGen/Hexagon/rdf-dce-double-cover.mir
new file mode 100644
index 00000000000000..3f3362b194eb62
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/rdf-dce-double-cover.mir
@@ -0,0 +1,53 @@
+# RUN: llc -march=hexagon -run-pass hexagon-rdf-opt -verify-machineinstrs %s -o - | FileCheck %s
+
+# Check that the L2_loadrd_io load from stack to $d6
+# register, in bb.0, is not considered as dead code by RDF
+# $d6 is used in A2_minp instruction in bb.1
+
+#CHECK-LABEL: bb.0
+#CHECK: renamable $d6 = L2_loadrd_io %stack.{{[0-9]+}}, 0
+
+--- |
+
+ define dso_local i32 @fred(ptr %a) local_unnamed_addr {
+ ret i32 0
+ }
+
+...
+---
+name: fred
+tracksRegLiveness: true
+stack:
+ - { id: 0, name: '', type: spill-slot, offset: 0, size: 8, alignment: 8,
+ stack-id: default, callee-saved-register: '', callee-saved-restored: true,
+ debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
+
+body: |
+ bb.0:
+ successors: %bb.1, %bb.2
+ liveins: $d3:0x0000000000000003, $r5, $r8
+
+ renamable $p0 = C2_cmpgtui renamable $r8, 1
+ renamable $r8 = A2_addi killed renamable $r8, -1
+ renamable $d6 = L2_loadrd_io %stack.0, 0 :: (load (s64) from %stack.0)
+ renamable $r12, renamable $r5 = L2_loadri_pi killed renamable $r5, 4 :: (load (s32) from %ir.a)
+ J2_loop0r %bb.1, killed renamable $r8, implicit-def $lc0, implicit-def $sa0, implicit-def $usr
+ J2_jumpf killed renamable $p0, %bb.2, implicit-def $pc
+ J2_jump %bb.1, implicit-def $pc
+
+ bb.1:
+ successors: %bb.2, %bb.1
+ liveins: $d3:0x0000000000000003, $d6:0x0000000000000003, $r5
+
+ renamable $d3 = A2_minp killed renamable $d3, renamable $d6
+ renamable $r12, renamable $r5 = L2_loadri_pi killed renamable $r5, 4 :: (load (s32) from %ir.a + 4)
+ ENDLOOP0 %bb.1, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0
+ J2_jump %bb.2, implicit-def $pc
+
+ bb.2:
+ liveins: $d3:0x0000000000000003, $d6:0x0000000000000003
+
+ renamable $r0 = A2_tfr renamable $r6
+ J2_jumpr $r31, implicit-def $pc, implicit $r0
+...
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/113888
More information about the llvm-commits
mailing list