[llvm] b9c78de - [Hexagon] Add more debugging options and dumps to HVC
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Wed May 24 06:06:45 PDT 2023
Author: Krzysztof Parzyszek
Date: 2023-05-24T06:06:25-07:00
New Revision: b9c78deba3eda6137b2a0d2373ffe52279918679
URL: https://github.com/llvm/llvm-project/commit/b9c78deba3eda6137b2a0d2373ffe52279918679
DIFF: https://github.com/llvm/llvm-project/commit/b9c78deba3eda6137b2a0d2373ffe52279918679.diff
LOG: [Hexagon] Add more debugging options and dumps to HVC
Added:
Modified:
llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
llvm/test/CodeGen/Hexagon/autohvx/vector-align-store.ll
llvm/test/CodeGen/Hexagon/autohvx/vector-align-tbaa.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
index 7e4651627d65..294674c3ad19 100644
--- a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
@@ -58,7 +58,15 @@
using namespace llvm;
namespace {
-cl::opt<bool> AlignFullHvxStores("hvc-align-full-hvx-stores", cl::Hidden);
+cl::opt<bool> DumpModule("hvc-dump-module", cl::Hidden);
+cl::opt<bool> VAEnabled("hvc-va", cl::Hidden, cl::init(true)); // Align
+cl::opt<bool> VIEnabled("hvc-vi", cl::Hidden, cl::init(true)); // Idioms
+cl::opt<bool> VADoFullStores("hvc-va-full-stores", cl::Hidden);
+
+cl::opt<unsigned> VAGroupCountLimit("hvc-va-group-count-limit", cl::Hidden,
+ cl::init(~0));
+cl::opt<unsigned> VAGroupSizeLimit("hvc-va-group-size-limit", cl::Hidden,
+ cl::init(~0));
class HexagonVectorCombine {
public:
@@ -223,6 +231,7 @@ class AlignVectors {
struct MoveGroup {
MoveGroup(const AddrInfo &AI, Instruction *B, bool Hvx, bool Load)
: Base(B), Main{AI.Inst}, Clones{}, IsHvx(Hvx), IsLoad(Load) {}
+ MoveGroup() = default;
Instruction *Base; // Base instruction of the parent address group.
InstList Main; // Main group of instructions.
InstList Deps; // List of dependencies.
@@ -374,6 +383,12 @@ raw_ostream &operator<<(raw_ostream &OS, const AlignVectors::MoveGroup &MG) {
OS << "Deps\n";
for (Instruction *I : MG.Deps)
OS << " " << *I << '\n';
+ OS << "Clones\n";
+ for (auto [K, V] : MG.Clones) {
+ OS << " ";
+ K->printAsOperand(OS, false);
+ OS << "\t-> " << *V << '\n';
+ }
return OS;
}
@@ -929,9 +944,14 @@ auto AlignVectors::createLoadGroups(const AddrList &Group) const -> MoveList {
// Form load groups.
// To avoid complications with moving code across basic blocks, only form
// groups that are contained within a single basic block.
+ unsigned SizeLimit = VAGroupSizeLimit;
+ if (SizeLimit == 0)
+ return {};
auto tryAddTo = [&](const AddrInfo &Info, MoveGroup &Move) {
assert(!Move.Main.empty() && "Move group should have non-empty Main");
+ if (Move.Main.size() >= SizeLimit)
+ return false;
// Don't mix HVX and non-HVX instructions.
if (Move.IsHvx != isHvx(Info))
return false;
@@ -979,9 +999,14 @@ auto AlignVectors::createStoreGroups(const AddrList &Group) const -> MoveList {
// Form store groups.
// To avoid complications with moving code across basic blocks, only form
// groups that are contained within a single basic block.
+ unsigned SizeLimit = VAGroupSizeLimit;
+ if (SizeLimit == 0)
+ return {};
auto tryAddTo = [&](const AddrInfo &Info, MoveGroup &Move) {
assert(!Move.Main.empty() && "Move group should have non-empty Main");
+ if (Move.Main.size() >= SizeLimit)
+ return false;
// For stores with return values we'd have to collect downward depenencies.
// There are no such stores that we handle at the moment, so omit that.
assert(Info.Inst->getType()->isVoidTy() &&
@@ -1021,7 +1046,7 @@ auto AlignVectors::createStoreGroups(const AddrList &Group) const -> MoveList {
// Erase groups where every store is a full HVX vector. The reason is that
// aligning predicated stores generates complex code that may be less
// efficient than a sequence of unaligned vector stores.
- if (!AlignFullHvxStores) {
+ if (!VADoFullStores) {
erase_if(StoreGroups, [this](const MoveGroup &G) {
return G.IsHvx && llvm::all_of(G.Main, [this](Instruction *S) {
auto MaybeInfo = this->getAddrInfo(*S);
@@ -1511,8 +1536,8 @@ auto AlignVectors::realignGroup(const MoveGroup &Move) const -> bool {
auto AlignVectors::makeTestIfUnaligned(IRBuilderBase &Builder, Value *AlignVal,
int Alignment) const -> Value * {
auto *AlignTy = AlignVal->getType();
- Value *And =
- Builder.CreateAnd(AlignVal, ConstantInt::get(AlignTy, Alignment - 1));
+ Value *And = Builder.CreateAnd(
+ AlignVal, ConstantInt::get(AlignTy, Alignment - 1), "and");
Value *Zero = ConstantInt::get(AlignTy, 0);
return Builder.CreateICmpNE(And, Zero, "isz");
}
@@ -1527,7 +1552,8 @@ auto AlignVectors::isSectorTy(Type *Ty) const -> bool {
}
auto AlignVectors::run() -> bool {
- LLVM_DEBUG(dbgs() << "Running HVC::AlignVectors\n");
+ LLVM_DEBUG(dbgs() << "Running HVC::AlignVectors on " << HVC.F.getName()
+ << '\n');
if (!createAddressGroups())
return false;
@@ -1556,6 +1582,20 @@ auto AlignVectors::run() -> bool {
dbgs() << G << "\n";
});
+ // Cumulative limit on the number of groups.
+ unsigned CountLimit = VAGroupCountLimit;
+ if (CountLimit == 0)
+ return false;
+
+ if (LoadGroups.size() > CountLimit) {
+ LoadGroups.resize(CountLimit);
+ StoreGroups.clear();
+ } else {
+ unsigned StoreLimit = CountLimit - LoadGroups.size();
+ if (StoreGroups.size() > StoreLimit)
+ StoreGroups.resize(StoreLimit);
+ }
+
for (auto &M : LoadGroups)
Changed |= moveTogether(M);
for (auto &M : StoreGroups)
@@ -2115,13 +2155,22 @@ auto HvxIdioms::run() -> bool {
// --- End HvxIdioms
auto HexagonVectorCombine::run() -> bool {
- if (!HST.useHVXOps())
- return false;
+ if (DumpModule)
+ dbgs() << "Module before HexagonVectorCombine\n" << *F.getParent();
bool Changed = false;
- Changed |= AlignVectors(*this).run();
- Changed |= HvxIdioms(*this).run();
+ if (HST.useHVXOps()) {
+ if (VAEnabled)
+ Changed |= AlignVectors(*this).run();
+ if (VIEnabled)
+ Changed |= HvxIdioms(*this).run();
+ }
+ if (DumpModule) {
+ dbgs() << "Module " << (Changed ? "(modified)" : "(unchanged)")
+ << " after HexagonVectorCombine\n"
+ << *F.getParent();
+ }
return Changed;
}
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/vector-align-store.ll b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-store.ll
index 9d10551a6d01..876b02befe19 100644
--- a/llvm/test/CodeGen/Hexagon/autohvx/vector-align-store.ll
+++ b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-store.ll
@@ -1,4 +1,4 @@
-; RUN: llc -march=hexagon -hvc-align-full-hvx-stores < %s | FileCheck %s
+; RUN: llc -march=hexagon -hvc-va-full-stores < %s | FileCheck %s
; Make sure we generate 3 aligned stores.
; CHECK: vmem({{.*}}) =
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/vector-align-tbaa.ll b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-tbaa.ll
index a931d14620a5..333ecc14e473 100644
--- a/llvm/test/CodeGen/Hexagon/autohvx/vector-align-tbaa.ll
+++ b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-tbaa.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -mtriple=hexagon -S -hexagon-vc -instcombine -hvc-align-full-hvx-stores < %s | FileCheck %s
+; RUN: opt -mtriple=hexagon -S -hexagon-vc -instcombine -hvc-va-full-stores < %s | FileCheck %s
; Check that Hexagon Vector Combine propagates (TBAA) metadata to the
; generated output. (Use instcombine to clean the output up a bit.)
More information about the llvm-commits
mailing list