Skip to content

Commit de5ed1a

Browse files
committed
fixup! Filter out some of the INSERT_SUBREG users
1 parent 9b74e9e commit de5ed1a

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,34 @@ static bool isTupleInsertInstr(const MachineInstr &MI,
14531453
}
14541454
}
14551455

1456+
static bool isSegmentedStoreInstr(const MachineInstr &MI) {
1457+
const RISCVVPseudosTable::PseudoInfo *RVV =
1458+
RISCVVPseudosTable::getPseudoInfo(MI.getOpcode());
1459+
if (!RVV)
1460+
return false;
1461+
switch (RVV->BaseInstr) {
1462+
case VSSEG_CASES(8):
1463+
case VSSSEG_CASES(8):
1464+
case VSUXSEG_CASES(8):
1465+
case VSOXSEG_CASES(8):
1466+
case VSSEG_CASES(16):
1467+
case VSSSEG_CASES(16):
1468+
case VSUXSEG_CASES(16):
1469+
case VSOXSEG_CASES(16):
1470+
case VSSEG_CASES(32):
1471+
case VSSSEG_CASES(32):
1472+
case VSUXSEG_CASES(32):
1473+
case VSOXSEG_CASES(32):
1474+
case VSSEG_CASES(64):
1475+
case VSSSEG_CASES(64):
1476+
case VSUXSEG_CASES(64):
1477+
case VSOXSEG_CASES(64):
1478+
return true;
1479+
default:
1480+
return false;
1481+
}
1482+
}
1483+
14561484
std::optional<MachineOperand>
14571485
RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
14581486
std::optional<MachineOperand> CommonVL;
@@ -1475,8 +1503,13 @@ RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
14751503

14761504
if (isTupleInsertInstr(UserMI, *MRI)) {
14771505
LLVM_DEBUG(dbgs().indent(4) << "Peeking through uses of INSERT_SUBREG\n");
1478-
Worklist.insert_range(llvm::make_pointer_range(
1479-
MRI->use_operands(UserMI.getOperand(0).getReg())));
1506+
for (MachineOperand &UseOp :
1507+
MRI->use_operands(UserMI.getOperand(0).getReg())) {
1508+
const MachineInstr &CandidateMI = *UseOp.getParent();
1509+
if (CandidateMI.getOpcode() == RISCV::INSERT_SUBREG ||
1510+
isSegmentedStoreInstr(CandidateMI))
1511+
Worklist.insert(&UseOp);
1512+
}
14801513
continue;
14811514
}
14821515

llvm/test/CodeGen/RISCV/rvv/vl-opt.mir

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,3 +661,35 @@ body: |
661661
%y:vrnov0, %vl:gprnox0 = PseudoVLE8FF_V_M1_MASK $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
662662
PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
663663
...
664+
---
665+
name: insert_subreg_bitcast_no_peekthru
666+
body: |
667+
bb.0:
668+
liveins: $v8, $v9, $v10
669+
670+
; We should not peekthrough an INSERT_SUBREG if its user is not a segmented store or another INSERT_SUBREG.
671+
; CHECK-LABEL: name: insert_subreg_bitcast_no_peekthru
672+
; CHECK: liveins: $v8, $v9, $v10
673+
; CHECK-NEXT: {{ $}}
674+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vr = COPY $v8
675+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vr = COPY $v9
676+
; CHECK-NEXT: [[PseudoVADD_VV_M1_:%[0-9]+]]:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 3 /* ta, ma */
677+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:vr = COPY $v10
678+
; CHECK-NEXT: [[DEF:%[0-9]+]]:vrn4m1 = IMPLICIT_DEF
679+
; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrn4m1 = INSERT_SUBREG [[DEF]], [[COPY]], %subreg.sub_vrm1_0
680+
; CHECK-NEXT: [[INSERT_SUBREG1:%[0-9]+]]:vrn4m1 = INSERT_SUBREG [[INSERT_SUBREG]], [[COPY1]], %subreg.sub_vrm1_1
681+
; CHECK-NEXT: [[INSERT_SUBREG2:%[0-9]+]]:vrn4m1 = INSERT_SUBREG [[INSERT_SUBREG1]], [[PseudoVADD_VV_M1_]], %subreg.sub_vrm1_2
682+
; CHECK-NEXT: [[INSERT_SUBREG3:%[0-9]+]]:vrn4m1 = INSERT_SUBREG [[INSERT_SUBREG2]], [[COPY2]], %subreg.sub_vrm1_3
683+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:vrm4 = COPY [[INSERT_SUBREG3]]
684+
; CHECK-NEXT: PseudoVSE32_V_M4 [[COPY3]], $noreg, 1, 5 /* e32 */
685+
%0:vr = COPY $v8
686+
%1:vr = COPY $v9
687+
%2:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 3 /* ta, ma */
688+
%3:vr = COPY $v10
689+
%6:vrn4m1 = IMPLICIT_DEF
690+
%5:vrn4m1 = INSERT_SUBREG %6, %0, %subreg.sub_vrm1_0
691+
%7:vrn4m1 = INSERT_SUBREG %5, %1, %subreg.sub_vrm1_1
692+
%8:vrn4m1 = INSERT_SUBREG %7, %2, %subreg.sub_vrm1_2
693+
%9:vrn4m1 = INSERT_SUBREG %8, %3, %subreg.sub_vrm1_3
694+
%10:vrm4 = COPY %9
695+
PseudoVSE32_V_M4 %10:vrm4, $noreg, 1, 5 /* e32 */

0 commit comments

Comments
 (0)