Skip to content

Commit f3a4c1a

Browse files
committed
[AIE2] New vector custom post combiners
Optimize some vector operations (instrinsics) to COPYs
1 parent 40bd611 commit f3a4c1a

File tree

10 files changed

+696
-1
lines changed

10 files changed

+696
-1
lines changed

llvm/lib/Target/AIE/AIE2InstrInfo.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,3 +1321,87 @@ bool AIE2InstrInfo::canHoistCheapInst(const MachineInstr &MI) const {
13211321
AIE2::eSRegClass.hasSubClassEq(
13221322
MRI.getRegClass(MI.getOperand(0).getReg()));
13231323
}
1324+
1325+
std::optional<const AIEBaseInstrInfo::VConcatOpInfo>
1326+
AIE2InstrInfo::getVConcatOpInfo(const MachineInstr &MI) const {
1327+
1328+
std::optional<const AIEBaseInstrInfo::VConcatOpInfo> BaseOpInfo =
1329+
AIEBaseInstrInfo::getVConcatOpInfo(MI);
1330+
1331+
if (BaseOpInfo)
1332+
return BaseOpInfo;
1333+
1334+
if (MI.getOpcode() != TargetOpcode::G_INTRINSIC)
1335+
return std::nullopt;
1336+
1337+
const GIntrinsic &GMI = cast<const GIntrinsic>(MI);
1338+
1339+
switch (GMI.getIntrinsicID()) {
1340+
case Intrinsic::aie2_concat_I512_I256:
1341+
case Intrinsic::aie2_concat_I1024_I512:
1342+
case Intrinsic::aie2_concat_I1024_I256:
1343+
1344+
case Intrinsic::aie2_concat_bf512_bf256:
1345+
case Intrinsic::aie2_concat_bf1024_bf512:
1346+
case Intrinsic::aie2_concat_bf1024_bf256:
1347+
1348+
case Intrinsic::aie2_concat_512_256_acc:
1349+
case Intrinsic::aie2_concat_1024_512_acc:
1350+
case Intrinsic::aie2_concat_1024_256_acc:
1351+
return VConcatOpInfo{2, 1};
1352+
default:
1353+
return std::nullopt;
1354+
}
1355+
}
1356+
1357+
std::optional<const AIEBaseInstrInfo::VUpdateOpInfo>
1358+
AIE2InstrInfo::getVUpdateOpInfo(const MachineInstr &MI) const {
1359+
1360+
if (MI.getOpcode() != TargetOpcode::G_INTRINSIC)
1361+
return std::nullopt;
1362+
1363+
const GIntrinsic &GMI = cast<const GIntrinsic>(MI);
1364+
1365+
switch (GMI.getIntrinsicID()) {
1366+
case Intrinsic::aie2_upd_I512_I256:
1367+
case Intrinsic::aie2_upd_I1024_I512:
1368+
case Intrinsic::aie2_upd_I1024_I256:
1369+
1370+
case Intrinsic::aie2_upd_bf512_bf256:
1371+
case Intrinsic::aie2_upd_bf1024_bf512:
1372+
case Intrinsic::aie2_upd_bf1024_bf256:
1373+
1374+
case Intrinsic::aie2_upd_512_256_acc:
1375+
case Intrinsic::aie2_upd_1024_512_acc:
1376+
case Intrinsic::aie2_upd_1024_256_acc:
1377+
return VUpdateOpInfo{2, 3, 4};
1378+
default:
1379+
return std::nullopt;
1380+
}
1381+
}
1382+
1383+
std::optional<const AIEBaseInstrInfo::VExtractOpInfo>
1384+
AIE2InstrInfo::getVExtractOpInfo(const MachineInstr &MI) const {
1385+
1386+
if (MI.getOpcode() != TargetOpcode::G_INTRINSIC)
1387+
return std::nullopt;
1388+
1389+
const GIntrinsic &GMI = cast<const GIntrinsic>(MI);
1390+
1391+
switch (GMI.getIntrinsicID()) {
1392+
case Intrinsic::aie2_ext_I256_I512:
1393+
case Intrinsic::aie2_ext_I512_I1024:
1394+
case Intrinsic::aie2_ext_I256_I1024:
1395+
1396+
case Intrinsic::aie2_ext_bf256_bf512:
1397+
case Intrinsic::aie2_ext_bf512_bf1024:
1398+
case Intrinsic::aie2_ext_bf256_bf1024:
1399+
1400+
case Intrinsic::aie2_ext_256_512_acc:
1401+
case Intrinsic::aie2_ext_512_1024_acc:
1402+
case Intrinsic::aie2_ext_256_1024_acc:
1403+
return VExtractOpInfo{2, 3};
1404+
default:
1405+
return std::nullopt;
1406+
}
1407+
}

llvm/lib/Target/AIE/AIE2InstrInfo.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,15 @@ class AIE2InstrInfo : public AIE2GenInstrInfo {
169169

170170
bool canHoistCheapInst(const MachineInstr &MI) const override;
171171

172+
std::optional<const VConcatOpInfo>
173+
getVConcatOpInfo(const MachineInstr &MI) const override;
174+
175+
std::optional<const VUpdateOpInfo>
176+
getVUpdateOpInfo(const MachineInstr &MI) const override;
177+
178+
std::optional<const VExtractOpInfo>
179+
getVExtractOpInfo(const MachineInstr &MI) const override;
180+
172181
protected:
173182
SmallVector<AIEPseudoExpandInfo, 4>
174183
getSpillPseudoExpandInfo(const MachineInstr &MI) const override;

llvm/lib/Target/AIE/AIEBaseInstrInfo.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,3 +924,12 @@ const MIRFormatter *AIEBaseInstrInfo::getMIRFormatter() const {
924924
Formatter = std::make_unique<AIEMIRFormatter>();
925925
return Formatter.get();
926926
}
927+
928+
/// Return operand information related to vector concat instrinsic.
929+
std::optional<const AIEBaseInstrInfo::VConcatOpInfo>
930+
AIEBaseInstrInfo::getVConcatOpInfo(const MachineInstr &MI) const {
931+
932+
if (MI.getOpcode() == TargetOpcode::G_CONCAT_VECTORS)
933+
return VConcatOpInfo{1, 0};
934+
return std::nullopt;
935+
}

llvm/lib/Target/AIE/AIEBaseInstrInfo.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef LLVM_LIB_TARGET_AIE_AIEBASEINSTRRINFO_H
1616
#define LLVM_LIB_TARGET_AIE_AIEBASEINSTRRINFO_H
1717

18+
#include "AIE.h"
1819
#include "AIEMIRFormatter.h"
1920
#include "AIETiedRegOperands.h"
2021
#include "MCTargetDesc/AIEFormat.h"
@@ -379,6 +380,45 @@ struct AIEBaseInstrInfo : public TargetInstrInfo {
379380
static bool regClassMatches(const TargetRegisterClass &TRC,
380381
const TargetRegisterClass *RC, unsigned Reg);
381382

383+
struct VConcatOpInfo {
384+
// First input operand index.
385+
unsigned FirstOperand;
386+
// Number of non-register operands.
387+
unsigned NumOfNonRegOperands;
388+
};
389+
390+
/// Return operand information related to vector concat instrinsic.
391+
virtual std::optional<const VConcatOpInfo>
392+
getVConcatOpInfo(const MachineInstr &MI) const;
393+
394+
struct VUpdateOpInfo {
395+
// Vector to update operand index.
396+
unsigned Src;
397+
// Subvector to insert.
398+
unsigned SrcSubVec;
399+
// Position to insert operand index.
400+
unsigned SubVectorIndex;
401+
};
402+
403+
/// Return operand information related to vector update instrinsic.
404+
virtual std::optional<const VUpdateOpInfo>
405+
getVUpdateOpInfo(const MachineInstr &MI) const {
406+
llvm_unreachable("Target didn't implement getVUpdateOpInfo!");
407+
}
408+
409+
struct VExtractOpInfo {
410+
// Vector to update operand index.
411+
unsigned Src;
412+
// Position to extract.
413+
unsigned SubVectorIndex;
414+
};
415+
416+
/// Return operand information related to vector extract instrinsic.
417+
virtual std::optional<const VExtractOpInfo>
418+
getVExtractOpInfo(const MachineInstr &MI) const {
419+
llvm_unreachable("Target didn't implement getVExtractOpInfo!");
420+
}
421+
382422
protected:
383423
/// Expand a spill pseudo-instruction into actual target instructions. This
384424
/// will essentially split the register being handled into its sub-registers,

llvm/lib/Target/AIE/AIECombine.td

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,30 @@ def AIE2PostLegalizerGenericCombiner
7070
: GICombiner<"AIE2PostLegalizerGenericCombinerImpl", [ all_combines ]> {
7171
}
7272

73+
def combine_extract_concat_matchdata: GIDefMatchData<"Register">;
74+
def combine_extract_concat : GICombineRule<
75+
(defs root:$root, combine_extract_concat_matchdata:$matchinfo),
76+
(match (wip_match_opcode G_INTRINSIC): $root,
77+
[{ return matchExtractConcat(*${root}, MRI, (const AIEBaseInstrInfo &)B.getTII(), ${matchinfo}); }]),
78+
(apply [{ applyExtractConcat(*${root}, MRI, B, ${matchinfo}); }])
79+
>;
80+
81+
def combine_unmerge_concat_matchdata: GIDefMatchData<"std::pair<MachineInstr *, unsigned>">;
82+
def combine_unmerge_concat : GICombineRule<
83+
(defs root:$root, combine_unmerge_concat_matchdata:$matchinfo),
84+
(match (wip_match_opcode G_UNMERGE_VALUES): $root,
85+
[{ return matchUnmergeConcat(*${root}, MRI, (const AIEBaseInstrInfo &)B.getTII(), ${matchinfo}); }]),
86+
(apply [{ applyUnmergeConcat(*${root}, MRI, B, ${matchinfo}); }])
87+
>;
88+
89+
def combine_upd_to_concat_matchdata: GIDefMatchData<"std::map<unsigned, Register>">;
90+
def combine_upd_to_concat : GICombineRule<
91+
(defs root:$root, combine_upd_to_concat_matchdata:$matchinfo),
92+
(match (wip_match_opcode G_INTRINSIC): $root,
93+
[{ return matchUpdToConcat(*${root}, MRI, (const AIEBaseInstrInfo &)B.getTII(), ${matchinfo}); }]),
94+
(apply [{ applyUpdToConcat(*${root}, MRI, B, ${matchinfo}); }])
95+
>;
96+
7397
def load_store_increment_matchdata : GIDefMatchData<"AIELoadStoreCombineMatchData">;
7498
def combine_load_store_increment : GICombineRule <
7599
(defs root:$root, load_store_increment_matchdata:$matchinfo),
@@ -87,5 +111,9 @@ def combine_add_vector_elt_undef : GICombineRule <
87111

88112
def AIE2PostLegalizerCustomCombiner
89113
: GICombiner<"AIE2PostLegalizerCustomCombinerImpl", [ combine_load_store_increment,
90-
combine_add_vector_elt_undef ]> {
114+
combine_add_vector_elt_undef,
115+
combine_extract_concat,
116+
combine_unmerge_concat,
117+
combine_upd_to_concat
118+
]> {
91119
}

0 commit comments

Comments
 (0)