[PATCH] D36224: [CodeGen} Correctly replace subregister uses when processing tied operands

Bjorn Pettersson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 21 04:32:12 PDT 2018


bjope updated this revision to Diff 166447.
bjope added a comment.

Addning a hand-crafted reproducer for Hexagon.


Repository:
  rL LLVM

https://reviews.llvm.org/D36224

Files:
  lib/CodeGen/TwoAddressInstructionPass.cpp
  test/CodeGen/Hexagon/two-addr-tied-subregs.mir


Index: test/CodeGen/Hexagon/two-addr-tied-subregs.mir
===================================================================
--- /dev/null
+++ test/CodeGen/Hexagon/two-addr-tied-subregs.mir
@@ -0,0 +1,50 @@
+# RUN: llc -march hexagon -run-pass twoaddressinstruction -o - %s | FileCheck %s
+
+###############################################################################
+
+---
+name:            test1
+tracksRegLiveness: true
+body:             |
+  bb.0.entry:
+    liveins: $d0
+
+    %0:doubleregs = COPY killed $d0
+    %1:intregs = S2_lsr_i_r_acc %0.isub_lo, %0.isub_lo, 16
+
+...
+
+# Verify that both uses if %0.isub_lo are replaced here.
+# (we used to get %1:intregs = S2_lsr_i_r_acc %1, %1.isub_lo, 16)
+#
+# CHECK-LABEL: name:            test1
+# CHECK:  bb.0.entry:
+# CHECK:      %0:doubleregs = COPY killed $d0
+# CHECK-NEXT: %1:intregs = COPY %0.isub_lo
+# CHECK-NEXT: %1:intregs = S2_lsr_i_r_acc %1, %1, 16
+
+
+###############################################################################
+
+---
+name:            test2
+tracksRegLiveness: true
+body:             |
+  bb.0.entry:
+    liveins: $d0
+
+    %0:doubleregs = COPY killed $d0
+    %1:intregs = S2_lsr_i_r_acc %0.isub_lo, %0.isub_hi, 16
+
+...
+
+# Verify that the use of %0.isub_hi isn't replaced here.
+# (we used to get %1:intregs = S2_lsr_i_r_acc %1, %1.isub_hi, 16)
+#
+# CHECK-LABEL: name:            test2
+# CHECK:  bb.0.entry:
+# CHECK:      %0:doubleregs = COPY killed $d0
+# CHECK-NEXT: %1:intregs = COPY %0.isub_lo
+# CHECK-NEXT: %1:intregs = S2_lsr_i_r_acc %1, %0.isub_hi, 16
+
+###############################################################################
Index: lib/CodeGen/TwoAddressInstructionPass.cpp
===================================================================
--- lib/CodeGen/TwoAddressInstructionPass.cpp
+++ lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -1611,14 +1611,14 @@
     if (!IsEarlyClobber) {
       // Replace other (un-tied) uses of regB with LastCopiedReg.
       for (MachineOperand &MO : MI->operands()) {
-        if (MO.isReg() && MO.getReg() == RegB &&
+        if (MO.isReg() && MO.getReg() == RegB && MO.getSubReg() == SubRegB &&
             MO.isUse()) {
           if (MO.isKill()) {
             MO.setIsKill(false);
             RemovedKillFlag = true;
           }
           MO.setReg(LastCopiedReg);
-          MO.setSubReg(MO.getSubReg());
+          MO.setSubReg(0);
         }
       }
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36224.166447.patch
Type: text/x-patch
Size: 2433 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180921/859b6708/attachment.bin>


More information about the llvm-commits mailing list