Skip to content

Commit 42e0402

Browse files
committed
MachineCombiner: Partially fix losing subregister indexes
This fixes verifier errors in this test after earlier passes start introducing more subregister uses. This probably isn't adequately tested but I know nothing about this pass.
1 parent 0e639ae commit 42e0402

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

llvm/lib/CodeGen/TargetInstrInfo.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,9 +1330,12 @@ void TargetInstrInfo::reassociateOps(
13301330
MachineOperand &OpC = Root.getOperand(0);
13311331

13321332
Register RegA = OpA.getReg();
1333+
unsigned SubRegA = OpA.getSubReg();
13331334
Register RegB = OpB.getReg();
13341335
Register RegX = OpX.getReg();
1336+
unsigned SubRegX = OpX.getSubReg();
13351337
Register RegY = OpY.getReg();
1338+
unsigned SubRegY = OpY.getSubReg();
13361339
Register RegC = OpC.getReg();
13371340

13381341
if (RegA.isVirtual())
@@ -1362,6 +1365,7 @@ void TargetInstrInfo::reassociateOps(
13621365

13631366
if (SwapPrevOperands) {
13641367
std::swap(RegX, RegY);
1368+
std::swap(SubRegX, SubRegY);
13651369
std::swap(KillX, KillY);
13661370
}
13671371

@@ -1414,9 +1418,9 @@ void TargetInstrInfo::reassociateOps(
14141418
if (Idx == 0)
14151419
continue;
14161420
if (Idx == PrevFirstOpIdx)
1417-
MIB1.addReg(RegX, getKillRegState(KillX));
1421+
MIB1.addReg(RegX, getKillRegState(KillX), SubRegX);
14181422
else if (Idx == PrevSecondOpIdx)
1419-
MIB1.addReg(RegY, getKillRegState(KillY));
1423+
MIB1.addReg(RegY, getKillRegState(KillY), SubRegY);
14201424
else
14211425
MIB1.add(MO);
14221426
}
@@ -1435,7 +1439,7 @@ void TargetInstrInfo::reassociateOps(
14351439
if (Idx == 0)
14361440
continue;
14371441
if (Idx == RootFirstOpIdx)
1438-
MIB2 = MIB2.addReg(RegA, getKillRegState(KillA));
1442+
MIB2 = MIB2.addReg(RegA, getKillRegState(KillA), SubRegA);
14391443
else if (Idx == RootSecondOpIdx)
14401444
MIB2 = MIB2.addReg(NewVR, getKillRegState(KillNewVR));
14411445
else
@@ -1525,6 +1529,7 @@ void TargetInstrInfo::genAlternativeCodeSequence(
15251529
if (IndexedReg.index() == 0)
15261530
continue;
15271531

1532+
// FIXME: Losing subregisters
15281533
MachineInstr *Instr = MRI.getUniqueVRegDef(IndexedReg.value());
15291534
MachineInstrBuilder MIB;
15301535
Register AccReg;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs -run-pass=machine-combiner -o - %s | FileCheck %s
3+
4+
# Make sure the verifier doesn't fail due to dropping subregister
5+
# uses.
6+
7+
---
8+
name: machine_combiner_subreg_verifier_error
9+
tracksRegLiveness: true
10+
isSSA: true
11+
body: |
12+
bb.0:
13+
liveins: $v8m4, $v12m4
14+
15+
; CHECK-LABEL: name: machine_combiner_subreg_verifier_error
16+
; CHECK: liveins: $v8m4, $v12m4
17+
; CHECK-NEXT: {{ $}}
18+
; CHECK-NEXT: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF
19+
; CHECK-NEXT: [[DEF1:%[0-9]+]]:gprnox0 = IMPLICIT_DEF
20+
; CHECK-NEXT: [[DEF2:%[0-9]+]]:vrm8 = IMPLICIT_DEF
21+
; CHECK-NEXT: [[DEF3:%[0-9]+]]:vr = IMPLICIT_DEF
22+
; CHECK-NEXT: [[DEF4:%[0-9]+]]:vrm2 = IMPLICIT_DEF
23+
; CHECK-NEXT: [[DEF5:%[0-9]+]]:vr = IMPLICIT_DEF
24+
; CHECK-NEXT: [[PseudoVSLIDEDOWN_VI_M8_:%[0-9]+]]:vrm8 = PseudoVSLIDEDOWN_VI_M8 $noreg, [[DEF2]], 26, 2, 5 /* e32 */, 3 /* ta, ma */
25+
; CHECK-NEXT: [[PseudoVADD_VV_MF2_:%[0-9]+]]:vr = PseudoVADD_VV_MF2 $noreg, [[DEF2]].sub_vrm1_0, killed [[DEF3]], 2, 5 /* e32 */, 1 /* ta, mu */
26+
; CHECK-NEXT: [[PseudoVADD_VV_MF2_1:%[0-9]+]]:vr = PseudoVADD_VV_MF2 $noreg, [[PseudoVSLIDEDOWN_VI_M8_]].sub_vrm1_0, killed [[PseudoVADD_VV_MF2_]], 2, 5 /* e32 */, 1 /* ta, mu */
27+
; CHECK-NEXT: PseudoRET implicit $v8
28+
%0:vrm4 = IMPLICIT_DEF
29+
%1:gprnox0 = IMPLICIT_DEF
30+
%2:vrm8 = IMPLICIT_DEF
31+
%3:vr = IMPLICIT_DEF
32+
%4:vrm2 = IMPLICIT_DEF
33+
%5:vr = IMPLICIT_DEF
34+
%6:vrm8 = PseudoVSLIDEDOWN_VI_M8 $noreg, %2, 26, 2, 5 /* e32 */, 3 /* ta, ma */
35+
%7:vr = PseudoVADD_VV_MF2 $noreg, %6.sub_vrm1_0, %2.sub_vrm1_0, 2, 5 /* e32 */, 1 /* ta, mu */
36+
%8:vr = PseudoVADD_VV_MF2 $noreg, killed %7, killed %3, 2, 5 /* e32 */, 1 /* ta, mu */
37+
PseudoRET implicit $v8
38+
39+
...

0 commit comments

Comments
 (0)