@@ -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-
10781051bool 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
11081085void 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 ();
0 commit comments