Skip to content

Commit debaf4b

Browse files
committed
GlobalISel: Fix double count of offset for irregular vector breakdowns
Fixes cases with odd vectors that break into multiple requested size pieces. llvm-svn: 354280
1 parent fff6282 commit debaf4b

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,6 @@ LegalizerHelper::fewerElementsVectorBasic(MachineInstr &MI, unsigned TypeIdx,
15961596
unsigned PartInsertReg = MRI.createGenericVirtualRegister(DstTy);
15971597
MIRBuilder.buildInsert(PartInsertReg, AccumDstReg, PartDstReg, Offset);
15981598
AccumDstReg = PartInsertReg;
1599-
Offset += NarrowSize;
16001599
}
16011600

16021601
// Handle the remaining element sized leftover piece.

llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,4 +547,52 @@ TEST_F(GISelMITest, WidenUSUBO) {
547547
// Check
548548
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
549549
}
550+
551+
TEST_F(GISelMITest, FewerElementsAnd) {
552+
if (!TM)
553+
return;
554+
555+
const LLT V2S32 = LLT::vector(2, 32);
556+
const LLT V5S32 = LLT::vector(5, 32);
557+
558+
// Declare your legalization info
559+
DefineLegalizerInfo(A, {
560+
getActionDefinitionsBuilder(G_AND)
561+
.legalFor({s32});
562+
});
563+
564+
auto Op0 = B.buildUndef(V5S32);
565+
auto Op1 = B.buildUndef(V5S32);
566+
auto And = B.buildAnd(V5S32, Op0, Op1);
567+
568+
AInfo Info(MF->getSubtarget());
569+
DummyGISelObserver Observer;
570+
LegalizerHelper Helper(*MF, Info, Observer, B);
571+
EXPECT_TRUE(Helper.fewerElementsVector(*And, 0, V2S32) ==
572+
LegalizerHelper::LegalizeResult::Legalized);
573+
574+
auto CheckStr = R"(
575+
CHECK: [[IMP_DEF0:%[0-9]+]]:_(<5 x s32>) = G_IMPLICIT_DEF
576+
CHECK: [[IMP_DEF1:%[0-9]+]]:_(<5 x s32>) = G_IMPLICIT_DEF
577+
CHECK: [[IMP_DEF2:%[0-9]+]]:_(<5 x s32>) = G_IMPLICIT_DEF
578+
CHECK: [[EXTRACT0:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[IMP_DEF0]]:_(<5 x s32>), 0
579+
CHECK: [[EXTRACT1:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[IMP_DEF1]]:_(<5 x s32>), 0
580+
CHECK: [[AND0:%[0-9]+]]:_(<2 x s32>) = G_AND [[EXTRACT0]]:_, [[EXTRACT1]]:_
581+
CHECK: [[INSERT0:%[0-9]+]]:_(<5 x s32>) = G_INSERT [[IMP_DEF2]]:_, [[AND0]]:_(<2 x s32>), 0
582+
583+
CHECK: [[EXTRACT2:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[IMP_DEF0]]:_(<5 x s32>), 64
584+
CHECK: [[EXTRACT3:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[IMP_DEF1]]:_(<5 x s32>), 64
585+
CHECK: [[AND1:%[0-9]+]]:_(<2 x s32>) = G_AND [[EXTRACT2]]:_, [[EXTRACT3]]:_
586+
CHECK: [[INSERT1:%[0-9]+]]:_(<5 x s32>) = G_INSERT [[INSERT0]]:_, [[AND1]]:_(<2 x s32>), 64
587+
588+
CHECK: [[EXTRACT4:%[0-9]+]]:_(s32) = G_EXTRACT [[IMP_DEF0]]:_(<5 x s32>), 128
589+
CHECK: [[EXTRACT5:%[0-9]+]]:_(s32) = G_EXTRACT [[IMP_DEF1]]:_(<5 x s32>), 128
590+
CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[EXTRACT4]]:_, [[EXTRACT5]]:_
591+
CHECK: [[INSERT2:%[0-9]+]]:_(<5 x s32>) = G_INSERT [[INSERT1]]:_, [[AND2]]:_(s32), 128
592+
)";
593+
594+
// Check
595+
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
596+
}
597+
550598
} // namespace

0 commit comments

Comments
 (0)