Skip to content

Commit d1bd94a

Browse files
[AIE2] Replace 8x8->8x8 tranpose shuffle vector with vshuffle
1 parent 302563b commit d1bd94a

File tree

4 files changed

+305
-167
lines changed

4 files changed

+305
-167
lines changed

Diff for: llvm/lib/Target/AIE/AIE2PostLegalizerCustomCombiner.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
2222
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
2323
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
24+
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
25+
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
2426
#include "llvm/CodeGen/MachineDominators.h"
2527
#include "llvm/InitializePasses.h"
2628

Diff for: llvm/lib/Target/AIE/AIE2PreLegalizerCombiner.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,51 @@ CombinerHelper::GeneratorType sectionGenerator(const int32_t From,
178178

179179
bool AIE2PreLegalizerCombinerImpl::tryCombineShuffleVector(
180180
MachineInstr &MI) const {
181+
const Register DstReg = MI.getOperand(0).getReg();
182+
const LLT DstTy = MRI.getType(DstReg);
183+
const LLT SrcTy = MRI.getType(MI.getOperand(1).getReg());
184+
const unsigned DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1;
185+
const unsigned SrcNumElts = SrcTy.isVector() ? SrcTy.getNumElements() : 1;
186+
MachineIRBuilder MIB(MI);
187+
MachineRegisterInfo &MRI = *MIB.getMRI();
188+
181189
if (Helper.tryCombineShuffleVector(MI))
182190
return true;
183191

192+
const LLT V64S8 = LLT::fixed_vector(64, 8);
193+
CombinerHelper::GeneratorType FourPartitions =
194+
sectionGenerator(0, DstNumElts, 4, 1);
195+
if (Helper.matchCombineShuffleVector(MI, FourPartitions, DstNumElts)) {
196+
if (DstTy != V64S8)
197+
return false;
198+
199+
const Register Src1 = MI.getOperand(1).getReg();
200+
const Register Src2 = MI.getOperand(2).getReg();
201+
const Register ShuffleModeReg =
202+
MRI.createGenericVirtualRegister(LLT::scalar(32));
203+
204+
// This combiner only cares about the lower bits, so we can pad the
205+
// vector to cover the case where two separate vectors are shuffled.
206+
// together
207+
MIB.buildConstant(ShuffleModeReg, 35);
208+
209+
if (SrcTy == V64S8) {
210+
MIB.buildInstr(AIE2::G_AIE_VSHUFFLE, {DstReg},
211+
{Src1, Src2, ShuffleModeReg});
212+
} else {
213+
// We reuse the same register since we ignore the high part of the vector
214+
const Register TmpRegister = MRI.createGenericVirtualRegister(V64S8);
215+
MIB.buildConcatVectors(TmpRegister, {Src1, Src2});
216+
MIB.buildInstr(AIE2::G_AIE_VSHUFFLE, {DstReg},
217+
{TmpRegister, TmpRegister, ShuffleModeReg});
218+
}
219+
220+
MI.eraseFromParent();
221+
return true;
222+
}
184223
return false;
185224
}
225+
186226
bool AIE2PreLegalizerCombinerImpl::tryCombineAll(MachineInstr &MI) const {
187227
if (tryCombineAllImpl(MI))
188228
return true;

Diff for: llvm/lib/Target/AIE/AIEInstrGISel.td

+6
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ def G_AIE_BROADCAST_VECTOR : AIEGenericInstruction {
9696
let hasSideEffects = false;
9797
}
9898

99+
def G_AIE_VSHUFFLE : AIEGenericInstruction {
100+
let OutOperandList = (outs type0:$dst);
101+
let InOperandList = (ins type0:$src1, type0:$src2, type1:$mode);
102+
let hasSideEffects = false;
103+
}
104+
99105
// Create a larger vector by padding undefined values in the high bits
100106
def G_AIE_PAD_VECTOR_UNDEF : AIEGenericInstruction {
101107
let OutOperandList = (outs type0:$dst);

0 commit comments

Comments
 (0)