[llvm] b28eebf - [RDF] Fix cover check when linking refs to defs (#113888)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 10:38:39 PST 2024
Author: Yashas Andaluri
Date: 2024-11-19T12:38:36-06:00
New Revision: b28eebf9264a6b6843b15d4e17be70604f3e4ad8
URL: https://github.com/llvm/llvm-project/commit/b28eebf9264a6b6843b15d4e17be70604f3e4ad8
DIFF: https://github.com/llvm/llvm-project/commit/b28eebf9264a6b6843b15d4e17be70604f3e4ad8.diff
LOG: [RDF] Fix cover check when linking refs to defs (#113888)
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.
Added:
llvm/test/CodeGen/Hexagon/rdf-dce-double-cover.mir
Modified:
llvm/lib/CodeGen/RDFGraph.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/RDFGraph.cpp b/llvm/lib/CodeGen/RDFGraph.cpp
index 2077da3cc7c5ac..483e61db788f46 100644
--- a/llvm/lib/CodeGen/RDFGraph.cpp
+++ b/llvm/lib/CodeGen/RDFGraph.cpp
@@ -1515,15 +1515,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
+...
+
More information about the llvm-commits
mailing list