[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