Skip to content

Commit b7ceda3

Browse files
authored
MachineCombiner: Partially fix losing subregister indexes (#141661)
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 90b4b86 commit b7ceda3

File tree

3 files changed

+85
-4
lines changed

3 files changed

+85
-4
lines changed

llvm/lib/CodeGen/TargetInstrInfo.cpp

Lines changed: 11 additions & 4 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())
@@ -1350,6 +1353,7 @@ void TargetInstrInfo::reassociateOps(
13501353
// recycling RegB because the MachineCombiner's computation of the critical
13511354
// path requires a new register definition rather than an existing one.
13521355
Register NewVR = MRI.createVirtualRegister(RC);
1356+
unsigned SubRegNewVR = 0;
13531357
InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
13541358

13551359
auto [NewRootOpc, NewPrevOpc] = getReassociationOpcodes(Pattern, Root, Prev);
@@ -1362,6 +1366,7 @@ void TargetInstrInfo::reassociateOps(
13621366

13631367
if (SwapPrevOperands) {
13641368
std::swap(RegX, RegY);
1369+
std::swap(SubRegX, SubRegY);
13651370
std::swap(KillX, KillY);
13661371
}
13671372

@@ -1414,16 +1419,17 @@ void TargetInstrInfo::reassociateOps(
14141419
if (Idx == 0)
14151420
continue;
14161421
if (Idx == PrevFirstOpIdx)
1417-
MIB1.addReg(RegX, getKillRegState(KillX));
1422+
MIB1.addReg(RegX, getKillRegState(KillX), SubRegX);
14181423
else if (Idx == PrevSecondOpIdx)
1419-
MIB1.addReg(RegY, getKillRegState(KillY));
1424+
MIB1.addReg(RegY, getKillRegState(KillY), SubRegY);
14201425
else
14211426
MIB1.add(MO);
14221427
}
14231428
MIB1.copyImplicitOps(Prev);
14241429

14251430
if (SwapRootOperands) {
14261431
std::swap(RegA, NewVR);
1432+
std::swap(SubRegA, SubRegNewVR);
14271433
std::swap(KillA, KillNewVR);
14281434
}
14291435

@@ -1435,9 +1441,9 @@ void TargetInstrInfo::reassociateOps(
14351441
if (Idx == 0)
14361442
continue;
14371443
if (Idx == RootFirstOpIdx)
1438-
MIB2 = MIB2.addReg(RegA, getKillRegState(KillA));
1444+
MIB2 = MIB2.addReg(RegA, getKillRegState(KillA), SubRegA);
14391445
else if (Idx == RootSecondOpIdx)
1440-
MIB2 = MIB2.addReg(NewVR, getKillRegState(KillNewVR));
1446+
MIB2 = MIB2.addReg(NewVR, getKillRegState(KillNewVR), SubRegNewVR);
14411447
else
14421448
MIB2 = MIB2.add(MO);
14431449
}
@@ -1525,6 +1531,7 @@ void TargetInstrInfo::genAlternativeCodeSequence(
15251531
if (IndexedReg.index() == 0)
15261532
continue;
15271533

1534+
// FIXME: Losing subregisters
15281535
MachineInstr *Instr = MRI.getUniqueVRegDef(IndexedReg.value());
15291536
MachineInstrBuilder MIB;
15301537
Register AccReg;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
2+
# RUN: llc -mtriple=aarch64-gnu-linux -mcpu=neoverse-n2 -run-pass=machine-combiner -o - %s | FileCheck %s
3+
4+
# Make sure machine combiner doesn't drop subregister indexes.
5+
6+
---
7+
name: reassociate_adds2_reassoc
8+
tracksRegLiveness: true
9+
body: |
10+
bb.0:
11+
liveins: $q0, $q1, $q2, $q3
12+
13+
; CHECK-LABEL: name: reassociate_adds2_reassoc
14+
; CHECK: liveins: $q0, $q1, $q2, $q3
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
17+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1
18+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr128 = COPY $q2
19+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr128 = COPY $q3
20+
; CHECK-NEXT: [[FADDSrr:%[0-9]+]]:fpr32 = nsz reassoc nofpexcept FADDSrr [[COPY]].ssub, [[COPY1]].ssub, implicit $fpcr
21+
; CHECK-NEXT: [[FADDSrr1:%[0-9]+]]:fpr32 = nsz reassoc nofpexcept FADDSrr [[COPY2]].ssub, [[COPY3]].ssub, implicit $fpcr
22+
; CHECK-NEXT: [[FADDSrr2:%[0-9]+]]:fpr32 = nsz reassoc nofpexcept FADDSrr killed [[FADDSrr1]], killed [[FADDSrr]], implicit $fpcr
23+
; CHECK-NEXT: $s0 = COPY [[FADDSrr2]]
24+
; CHECK-NEXT: RET_ReallyLR implicit $s0
25+
%0:fpr128 = COPY $q0
26+
%1:fpr128 = COPY $q1
27+
%2:fpr128 = COPY $q2
28+
%3:fpr128 = COPY $q3
29+
%4:fpr32 = nsz reassoc nofpexcept FADDSrr %0.ssub, %1.ssub, implicit $fpcr
30+
%5:fpr32 = nsz reassoc nofpexcept FADDSrr %2.ssub, killed %4, implicit $fpcr
31+
%6:fpr32 = nsz reassoc nofpexcept FADDSrr killed %5, %3.ssub, implicit $fpcr
32+
$s0 = COPY %6
33+
RET_ReallyLR implicit $s0
34+
35+
...
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)