Skip to content

Commit 1ef5773

Browse files
fixup! Directly run the shuffle vector analysis code
1 parent 35500c6 commit 1ef5773

File tree

6 files changed

+198
-256
lines changed

6 files changed

+198
-256
lines changed

llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -594,12 +594,9 @@ class CombinerHelper {
594594

595595
/// Combine extracts of two different arrays into one build vector into a
596596
/// shuffle vector.
597-
bool matchCombineExtractToShuffle(
598-
MachineInstr &MI, SmallVectorImpl<std::pair<Register, int>> &MatchInfo,
599-
std::pair<Register, Register> &VectorRegisters);
600-
void applyCombineExtractToShuffle(
601-
MachineInstr &MI, SmallVectorImpl<std::pair<Register, int>> &MatchInfo,
602-
std::pair<Register, Register> &VectorRegisters);
597+
bool
598+
matchCombineExtractToShuffle(MachineInstr &MI, SmallVectorImpl<Register> &Ops,
599+
std::pair<Register, Register> &VectorRegisters);
603600

604601
bool matchExtractAllEltsFromBuildVector(
605602
MachineInstr &MI,

llvm/include/llvm/Target/GlobalISel/Combine.td

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -905,15 +905,15 @@ def extract_vec_elt_build_vec : GICombineRule<
905905
[{ return Helper.matchExtractVecEltBuildVec(*${root}, ${matchinfo}); }]),
906906
(apply [{ Helper.applyExtractVecEltBuildVec(*${root}, ${matchinfo}); }])>;
907907

908-
def extract_vector_register_to_id_mapping_matchinfo :
909-
GIDefMatchData<"SmallVector<std::pair<Register, int>>">;
908+
def extract_vector_register_sources_matchinfo :
909+
GIDefMatchData<"SmallVector<Register>">;
910910
def vector_reg_pair_matchinfo :
911911
GIDefMatchData<"std::pair<Register, Register>">;
912912
def extract_vector_element_build_vector_to_shuffle_vector : GICombineRule<
913-
(defs root:$root, extract_vector_register_to_id_mapping_matchinfo:$matchinfo, vector_reg_pair_matchinfo:$regpair),
913+
(defs root:$root, extract_vector_register_sources_matchinfo:$matchinfo, vector_reg_pair_matchinfo:$regpair),
914914
(match (wip_match_opcode G_BUILD_VECTOR):$root,
915915
[{ return Helper.matchCombineExtractToShuffle(*${root}, ${matchinfo}, ${regpair}); }]),
916-
(apply [{ Helper.applyCombineExtractToShuffle(*${root}, ${matchinfo}, ${regpair}); }])>;
916+
(apply [{ Helper.applyCombineShuffleVector(*${root}, ${matchinfo}); }])>;
917917

918918
// Fold away full elt extracts from a build_vector.
919919
def extract_all_elts_from_build_vector_matchinfo :
@@ -926,8 +926,8 @@ def extract_all_elts_from_build_vector : GICombineRule<
926926

927927
def extract_vec_elt_combines : GICombineGroup<[
928928
extract_vec_elt_build_vec,
929-
extract_all_elts_from_build_vector,
930-
extract_vector_element_build_vector_to_shuffle_vector]>;
929+
extract_vector_element_build_vector_to_shuffle_vector,
930+
extract_all_elts_from_build_vector]>;
931931

932932
def funnel_shift_from_or_shift : GICombineRule<
933933
(defs root:$root, build_fn_matchinfo:$info),

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4225,9 +4225,12 @@ void CombinerHelper::applyExtractVecEltBuildVec(MachineInstr &MI,
42254225
}
42264226

42274227
bool CombinerHelper::matchCombineExtractToShuffle(
4228-
MachineInstr &MI, SmallVectorImpl<std::pair<Register, int>> &VecIndexPair,
4228+
MachineInstr &MI, SmallVectorImpl<Register> &Ops,
42294229
std::pair<Register, Register> &VectorRegisters) {
42304230
const GBuildVector *Build = cast<GBuildVector>(&MI);
4231+
const unsigned SrcNumElts =
4232+
MRI.getType(MI.getOperand(0).getReg()).getNumElements();
4233+
42314234
// This combine tries to find all the build vectors whose source elements
42324235
// all originate from a G_EXTRACT_VECTOR_ELT from one or two donor vectors.
42334236
// One example where this may happen is for AI chips where there are a lot
@@ -4245,24 +4248,29 @@ bool CombinerHelper::matchCombineExtractToShuffle(
42454248
// replace with:
42464249
// %vector = G_SHUFFLE_VECTOR %donor1, %donor2, shufflemask(0, 1, 2, 3)
42474250
SmallSetVector<Register, 2> RegisterVector;
4251+
SmallVector<int, 32> VectorMask;
42484252
const unsigned NumElements = Build->getNumSources();
42494253
for (unsigned Index = 0; Index < NumElements; Index++) {
42504254
Register SrcReg = peekThroughBitcast(Build->getSourceReg(Index), MRI);
42514255
auto *ExtractInstr = getOpcodeDef<GExtractVectorElement>(SrcReg, MRI);
42524256
if (!ExtractInstr)
42534257
return false;
42544258

4259+
RegisterVector.insert(ExtractInstr->getVectorReg());
4260+
42554261
// For shufflemasks we need to know exactly what index to place each element
42564262
// so if it this build vector doesn't use exclusively constants than we
42574263
// can't replace with a shufflevector
42584264
auto Cst = getIConstantVRegVal(ExtractInstr->getIndexReg(), MRI);
42594265
if (!Cst)
42604266
return false;
4267+
42614268
unsigned Idx = Cst->getZExtValue();
4269+
if (ExtractInstr->getVectorReg() != RegisterVector.front()) {
4270+
Idx += SrcNumElts;
4271+
}
42624272

4263-
Register VectorReg = ExtractInstr->getVectorReg();
4264-
RegisterVector.insert(VectorReg);
4265-
VecIndexPair.emplace_back(std::make_pair(VectorReg, Idx));
4273+
VectorMask.emplace_back(Idx);
42664274
}
42674275

42684276
// Create a pair so that we don't need to look for them later. This code is
@@ -4273,44 +4281,17 @@ bool CombinerHelper::matchCombineExtractToShuffle(
42734281
std::make_pair(RegisterVector.front(), RegisterVector.back());
42744282

42754283
// We check that they're the same type before running. We can also grow the
4276-
// smaller one to the target size, but there isn't an elegant way to do that
4277-
// until we have a good lowering for G_EXTRACT_SUBVECTOR.
4284+
// smaller one tro the target size, but there isn't an elegant way to do that
4285+
// until we have a good lowerng for G_EXTRACT_SUBVECTOR.
4286+
// Apparently if they are the same, they don't necessary have the same type?
42784287
if (MRI.getType(VectorRegisters.first) != MRI.getType(VectorRegisters.second))
42794288
return false;
42804289

4281-
return RegisterVector.size() <= 2;
4282-
}
4283-
4284-
void CombinerHelper::applyCombineExtractToShuffle(
4285-
MachineInstr &MI, SmallVectorImpl<std::pair<Register, int>> &MatchInfo,
4286-
std::pair<Register, Register> &VectorRegisters) {
4287-
assert(MI.getOpcode() == TargetOpcode::G_BUILD_VECTOR);
4288-
4289-
const Register FirstRegister = VectorRegisters.first;
4290-
const LLT FirstRegisterType = MRI.getType(FirstRegister);
4291-
const unsigned VectorSize = FirstRegisterType.getNumElements();
4292-
SmallVector<int, 32> ShuffleMask;
4293-
for (auto &Pair : MatchInfo) {
4294-
const Register VectorReg = Pair.first;
4295-
int Idx = Pair.second;
4296-
4297-
if (VectorReg != VectorRegisters.first) {
4298-
Idx += VectorSize;
4299-
}
4300-
ShuffleMask.emplace_back(Idx);
4301-
}
4302-
4303-
// We could reuse the same vector register and shuffle them both together
4304-
// but it is nicer for later optimizations to explicitly make it undef.
4305-
const GBuildVector *BuildVector = cast<GBuildVector>(&MI);
4306-
Register SecondRegister = VectorRegisters.second;
4307-
if (FirstRegister == SecondRegister) {
4308-
SecondRegister = Builder.buildUndef(FirstRegisterType).getReg(0);
4309-
}
4290+
if (RegisterVector.size() > 2)
4291+
return false;
43104292

4311-
Builder.buildShuffleVector(BuildVector->getOperand(0), FirstRegister,
4312-
SecondRegister, ShuffleMask);
4313-
MI.eraseFromParent();
4293+
return analysePatternVectorMask(MI, Ops, MI.getOperand(0).getReg(),
4294+
VectorRegisters, VectorMask);
43144295
}
43154296

43164297
bool CombinerHelper::matchExtractAllEltsFromBuildVector(

0 commit comments

Comments
 (0)