Skip to content

Commit 95f7e91

Browse files
committed
Revert "[AIE2P] Do not materalize assertEXT within VEXTBCST pattern"
This reverts commit 8716101.
1 parent d7af1d7 commit 95f7e91

File tree

5 files changed

+36
-65
lines changed

5 files changed

+36
-65
lines changed

llvm/lib/Target/AIE/AIECombine.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ def combine_globalval_offset : GICombineRule<
4242
(apply [{ applyGlobalValOffset(*${root}, MRI, B, Observer, ${matchinfo});}])
4343
>;
4444

45-
def combine_extract_vector_elt_and_zsa_ext_matchdata: GIDefMatchData<"std::pair<MachineInstr *, std::pair<bool, bool>>">;
45+
def combine_extract_vector_elt_and_zsa_ext_matchdata: GIDefMatchData<"std::pair<MachineInstr *, bool>">;
4646
def combine_extract_vector_elt_and_zsa_ext : GICombineRule<
4747
(defs root:$root, combine_extract_vector_elt_and_zsa_ext_matchdata:$matchinfo),
4848
(match (wip_match_opcode G_EXTRACT_VECTOR_ELT): $root,
49-
[{ return matchExtractVecEltAndExt(*${root}, MRI, (const AIEBaseInstrInfo &)B.getTII(), ${matchinfo}); }]),
49+
[{ return matchExtractVecEltAndExt(*${root}, MRI, ${matchinfo}); }]),
5050
(apply [{ applyExtractVecEltAndExt(*${root}, MRI, B, ${matchinfo}); }])
5151
>;
5252

llvm/lib/Target/AIE/AIECombinerHelper.cpp

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,56 +1048,33 @@ void llvm::applyGlobalValOffset(MachineInstr &MI, MachineRegisterInfo &MRI,
10481048
B.buildConstant(LLT::scalar(20), -static_cast<int64_t>(Offset)));
10491049
}
10501050

1051-
namespace {
1052-
bool feedsAnyExtBcstUse(MachineInstr &MI, MachineRegisterInfo &MRI,
1053-
const AIEBaseInstrInfo &TII) {
1054-
assert(MI.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT);
1055-
1056-
auto IsSingleNonDbgUse = [&MRI](MachineInstr &MI,
1057-
unsigned UseMIOpcode) -> MachineInstr * {
1058-
const Register Dst = MI.getOperand(0).getReg();
1059-
if (!MRI.hasOneNonDBGUse(Dst))
1060-
return nullptr;
1061-
1062-
MachineInstr *UseMI = &*MRI.use_nodbg_instructions(Dst).begin();
1063-
if (UseMI->getOpcode() != UseMIOpcode)
1064-
return nullptr;
1065-
return UseMI;
1066-
};
1067-
1068-
auto *AnyExtMI = IsSingleNonDbgUse(MI, TargetOpcode::G_ANYEXT);
1069-
if (!AnyExtMI)
1070-
return false;
1071-
1072-
auto *BcstMI =
1073-
IsSingleNonDbgUse(*AnyExtMI, TII.getGenericBroadcastVectorOpcode());
1074-
return BcstMI;
1075-
}
1076-
} // namespace
1077-
10781051
bool llvm::matchExtractVecEltAndExt(
1079-
MachineInstr &MI, MachineRegisterInfo &MRI, const AIEBaseInstrInfo &TII,
1080-
std::pair<MachineInstr *, std::pair<bool, bool>> &MatchInfo) {
1052+
MachineInstr &MI, MachineRegisterInfo &MRI,
1053+
std::pair<MachineInstr *, bool> &MatchInfo) {
1054+
10811055
assert(MI.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT &&
10821056
"Expected a extract_vector_elt");
10831057
Register DstReg = MI.getOperand(0).getReg();
1058+
const LLT S8 = LLT::scalar(8);
1059+
const LLT S16 = LLT::scalar(16);
10841060
LLT SrcVecTy = MRI.getType(MI.getOperand(1).getReg());
10851061
// Extracts from vectors <= 64-bits are lowered to bit-arithmetic in
10861062
// legalization
10871063
if (SrcVecTy.getSizeInBits() <= 64)
10881064
return false;
1065+
LLT SrcEltTy = SrcVecTy.getElementType();
1066+
if (SrcEltTy != S8 && SrcEltTy != S16)
1067+
return false;
10891068
if (!MRI.hasOneNonDBGUse(DstReg))
10901069
return false;
1091-
1092-
const bool BuildAssert = !feedsAnyExtBcstUse(MI, MRI, TII);
10931070
MachineInstr *ExtMI = &*MRI.use_instr_nodbg_begin(DstReg);
10941071
switch (ExtMI->getOpcode()) {
10951072
case TargetOpcode::G_ANYEXT:
10961073
case TargetOpcode::G_SEXT:
1097-
MatchInfo = std::make_pair(ExtMI, std::make_pair(/*SEXT=*/1, BuildAssert));
1074+
MatchInfo = std::make_pair(ExtMI, 1);
10981075
return true;
10991076
case TargetOpcode::G_ZEXT:
1100-
MatchInfo = std::make_pair(ExtMI, std::make_pair(/*SEXT=*/0, BuildAssert));
1077+
MatchInfo = std::make_pair(ExtMI, 0);
11011078
return true;
11021079
default:
11031080
return false;
@@ -1107,11 +1084,9 @@ bool llvm::matchExtractVecEltAndExt(
11071084

11081085
void llvm::applyExtractVecEltAndExt(
11091086
MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
1110-
std::pair<MachineInstr *, std::pair<bool, bool>> &MatchInfo) {
1087+
std::pair<MachineInstr *, bool> &MatchInfo) {
11111088
B.setInstrAndDebugLoc(MI);
1112-
auto [MatchMI, BoolPair] = MatchInfo;
1113-
auto [IsSignedExt, BuildAssert] = BoolPair;
1114-
1089+
auto [MatchMI, IsSignedExt] = MatchInfo;
11151090
const Register ExtractDstReg = MI.getOperand(0).getReg();
11161091
const LLT ExtractDstTy = MRI.getType(ExtractDstReg);
11171092
const Register ExtendDstReg = MatchMI->getOperand(0).getReg();
@@ -1122,23 +1097,19 @@ void llvm::applyExtractVecEltAndExt(
11221097
const AIEBaseInstrInfo &AIETII = (const AIEBaseInstrInfo &)B.getTII();
11231098
const unsigned Opcode =
11241099
AIETII.getGenericExtractVectorEltOpcode(/*sign ext*/ IsSignedExt);
1125-
1126-
const Register ExtractElt32BitDst =
1127-
BuildAssert ? MRI.createGenericVirtualRegister(S32) : ExtendDstReg;
1100+
const Register ExtractElt32BitDst = MRI.createGenericVirtualRegister(S32);
11281101
B.buildInstr(Opcode, {ExtractElt32BitDst}, {SrcReg0, SrcReg1});
11291102

1130-
if (BuildAssert) {
1131-
const unsigned AssertOpcode =
1132-
IsSignedExt ? TargetOpcode::G_ASSERT_SEXT : TargetOpcode::G_ASSERT_ZEXT;
1133-
if (ExtendDstTy == LLT::scalar(32)) {
1134-
B.buildAssertInstr(AssertOpcode, ExtendDstReg, ExtractElt32BitDst,
1135-
ExtractDstTy.getSizeInBits());
1136-
} else {
1137-
const Register Assert32BitDst = MRI.createGenericVirtualRegister(S32);
1138-
B.buildAssertInstr(AssertOpcode, Assert32BitDst, ExtractElt32BitDst,
1139-
ExtractDstTy.getSizeInBits());
1140-
B.buildExtOrTrunc(MatchMI->getOpcode(), ExtendDstReg, Assert32BitDst);
1141-
}
1103+
const unsigned AssertOpcode =
1104+
IsSignedExt ? TargetOpcode::G_ASSERT_SEXT : TargetOpcode::G_ASSERT_ZEXT;
1105+
if (ExtendDstTy == LLT::scalar(32)) {
1106+
B.buildAssertInstr(AssertOpcode, ExtendDstReg, ExtractElt32BitDst,
1107+
ExtractDstTy.getSizeInBits());
1108+
} else {
1109+
const Register Assert32BitDst = MRI.createGenericVirtualRegister(S32);
1110+
B.buildAssertInstr(AssertOpcode, Assert32BitDst, ExtractElt32BitDst,
1111+
ExtractDstTy.getSizeInBits());
1112+
B.buildExtOrTrunc(MatchMI->getOpcode(), ExtendDstReg, Assert32BitDst);
11421113
}
11431114

11441115
MI.eraseFromParent();

llvm/lib/Target/AIE/AIECombinerHelper.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,11 @@ bool canAdvanceOp(MachineInstr &MemI, MachineInstr &Dest,
156156
MachineInstr *getDefIgnoringCopiesAndBitcasts(Register Reg,
157157
const MachineRegisterInfo &MRI);
158158

159-
bool matchExtractVecEltAndExt(
160-
MachineInstr &MI, MachineRegisterInfo &MRI, const AIEBaseInstrInfo &TII,
161-
std::pair<MachineInstr *, std::pair<bool, bool>> &MatchInfo);
162-
void applyExtractVecEltAndExt(
163-
MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
164-
std::pair<MachineInstr *, std::pair<bool, bool>> &MatchInfo);
159+
bool matchExtractVecEltAndExt(MachineInstr &MI, MachineRegisterInfo &MRI,
160+
std::pair<MachineInstr *, bool> &MatchInfo);
161+
void applyExtractVecEltAndExt(MachineInstr &MI, MachineRegisterInfo &MRI,
162+
MachineIRBuilder &B,
163+
std::pair<MachineInstr *, bool> &MatchInfo);
165164

166165
bool matchSplatVector(MachineInstr &MI, MachineRegisterInfo &MRI,
167166
std::pair<Register, Register> &MatchInfo);

llvm/test/CodeGen/AIE/GlobalISel/prelegalizercombiner-shuffle-vector.mir

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,8 @@ body: |
445445
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
446446
; CHECK-NEXT: [[AIE_PAD_VECTOR_UNDEF:%[0-9]+]]:_(<32 x s16>) = G_AIE_PAD_VECTOR_UNDEF [[COPY]](<16 x s16>)
447447
; CHECK-NEXT: [[AIE_SEXT_EXTRACT_VECTOR_ELT:%[0-9]+]]:_(s32) = G_AIE_SEXT_EXTRACT_VECTOR_ELT [[AIE_PAD_VECTOR_UNDEF]](<32 x s16>), [[C]](s32)
448-
; CHECK-NEXT: [[AIE_BROADCAST_VECTOR:%[0-9]+]]:_(<32 x s16>) = G_AIE_BROADCAST_VECTOR [[AIE_SEXT_EXTRACT_VECTOR_ELT]](s32)
448+
; CHECK-NEXT: [[ASSERT_SEXT:%[0-9]+]]:_(s32) = G_ASSERT_SEXT [[AIE_SEXT_EXTRACT_VECTOR_ELT]], 16
449+
; CHECK-NEXT: [[AIE_BROADCAST_VECTOR:%[0-9]+]]:_(<32 x s16>) = G_AIE_BROADCAST_VECTOR [[ASSERT_SEXT]](s32)
449450
; CHECK-NEXT: [[AIE_UNPAD_VECTOR:%[0-9]+]]:_(<16 x s16>) = G_AIE_UNPAD_VECTOR [[AIE_BROADCAST_VECTOR]](<32 x s16>)
450451
; CHECK-NEXT: PseudoRET implicit $lr, implicit [[AIE_UNPAD_VECTOR]](<16 x s16>)
451452
%0:_(<16 x s16>) = COPY $wl0

llvm/test/CodeGen/AIE/aie2p/shufflevec.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,11 @@ entry:
234234
define <16 x i16> @test_shuffle_vector_to_extract_broadcast_s16(<16 x i16> noundef %a, <16 x i16> noundef %b) {
235235
; CHECK-LABEL: test_shuffle_vector_to_extract_broadcast_s16:
236236
; CHECK: // %bb.0: // %entry
237-
; CHECK-NEXT: ret lr
238-
; CHECK-NEXT: nop // Delay Slot 5
239-
; CHECK-NEXT: nop // Delay Slot 4
237+
; CHECK-NEXT: nopa ; nopb ; nops ; ret lr; nopm ; nopv
238+
; CHECK-NEXT: nopx // Delay Slot 5
239+
; CHECK-NEXT: vextract.16 r0, x2, #2, vaddsign1 // Delay Slot 4
240240
; CHECK-NEXT: nop // Delay Slot 3
241-
; CHECK-NEXT: vextbcst.16 x0, x2, #2 // Delay Slot 2
241+
; CHECK-NEXT: vbcst.16 x0, r0 // Delay Slot 2
242242
; CHECK-NEXT: nop // Delay Slot 1
243243
entry:
244244
%shuffle = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>

0 commit comments

Comments
 (0)