[PATCH] D23207: If-conversion incorrectly calculates liveness of redefined registers
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 11 11:50:00 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL278383: If-conversion incorrectly calculates liveness of redefined registers (authored by kparzysz).
Changed prior to commit:
https://reviews.llvm.org/D23207?vs=66955&id=67721#toc
Repository:
rL LLVM
https://reviews.llvm.org/D23207
Files:
llvm/trunk/lib/CodeGen/IfConversion.cpp
llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir
Index: llvm/trunk/lib/CodeGen/IfConversion.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/IfConversion.cpp
+++ llvm/trunk/lib/CodeGen/IfConversion.cpp
@@ -1689,10 +1689,15 @@
// Remove the conditional branch from entry to the blocks.
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
- // Initialize liveins to the first BB. These are potentially redefined by
- // predicated instructions.
+ // Initialize the Redefs:
+ // - BB2 live-in regs need implicit uses before being redefined by BB1
+ // instructions.
+ // - BB1 live-out regs need implicit uses before being redefined by BB2
+ // instructions. We start with BB1 live-ins so we have the live-out regs
+ // after tracking the BB1 instructions.
Redefs.init(TRI);
Redefs.addLiveIns(*BBI1->BB);
+ Redefs.addLiveIns(*BBI2->BB);
// Remove the duplicated instructions at the beginnings of both paths.
// Skip dbg_value instructions
Index: llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir
===================================================================
--- llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir
+++ llvm/trunk/test/CodeGen/Hexagon/ifcvt-impuse-livein.mir
@@ -0,0 +1,43 @@
+# RUN: llc -march=hexagon -run-pass if-converter %s -o - | FileCheck %s
+
+# Make sure that the necessary implicit uses are added to predicated
+# instructions.
+
+# CHECK-LABEL: name: foo
+
+--- |
+ define void @foo() {
+ ret void
+ }
+...
+
+---
+name: foo
+tracksRegLiveness: true
+allVRegsAllocated: true
+body: |
+ bb.0:
+ successors: %bb.1, %bb.2
+ liveins: %r0, %r2, %p1
+ J2_jumpf %p1, %bb.1, implicit-def %pc
+ J2_jump %bb.2, implicit-def %pc
+ bb.1:
+ successors: %bb.3
+ liveins: %r2
+ %r0 = A2_tfrsi 2
+ J2_jump %bb.3, implicit-def %pc
+ bb.2:
+ successors: %bb.3
+ liveins: %r0
+ ; Even though r2 was not live on entry to this block, it was live across
+ ; block bb.1 in the original diamond. After if-conversion, the diamond
+ ; became a single block, and so r2 is now live on entry to the instructions
+ ; originating from bb.2.
+ ; CHECK: %r2 = C2_cmoveit %p1, 1, implicit %r2
+ %r2 = A2_tfrsi 1
+ bb.3:
+ liveins: %r0, %r2
+ %r0 = A2_add %r0, %r2
+ J2_jumpr %r31, implicit-def %pc
+...
+
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23207.67721.patch
Type: text/x-patch
Size: 2337 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160811/114c578c/attachment.bin>
More information about the llvm-commits
mailing list