[llvm] [SandboxVec][Scheduler] Boilerplate and initial implementation. (PR #112449)
Sriraman Tallam via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 17 16:20:45 PDT 2024
================
@@ -0,0 +1,124 @@
+//===- Scheduler.h ----------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This is the bottom-up list scheduler used by the vectorizer. It is used for
+// checking the legality of vectorization and for scheduling instructions in
+// such a way that makes vectorization possible, if legal.
+//
+// The legality check is performed by `trySchedule(Instrs)`, which will try to
+// schedule the IR until all instructions in `Instrs` can be scheduled together
+// back-to-back. If this fails then it is illegal to vectorize `Instrs`.
+//
+// Internally the scheduler uses the vectorizer-specific DependencyGraph class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_SCHEDULER_H
+#define LLVM_TRANSFORMS_VECTORIZE_SANDBOXVECTORIZER_SCHEDULER_H
+
+#include "llvm/SandboxIR/Instruction.h"
+#include "llvm/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.h"
+#include <queue>
+
+namespace llvm::sandboxir {
+
+class PriorityCmp {
+public:
+ bool operator()(const DGNode *N1, const DGNode *N2) {
+ // TODO: This should be a hierarchical comparator.
+ return N1->getInstruction()->comesBefore(N2->getInstruction());
+ }
+};
+
+/// The list holding nodes that are ready to schedule. Used by the scheduler.
+class ReadyListContainer {
+ PriorityCmp Cmp;
+ /// Control/Other dependencies are not modeled by the DAG to save memory.
+ /// These have to be modeled in the ready list for correctness.
+ /// This means that the list will hold back nodes that need to meet such
+ /// unmodeled dependencies.
+ std::priority_queue<DGNode *, std::vector<DGNode *>, PriorityCmp> List;
+
+public:
+ ReadyListContainer() : List(Cmp) {}
+ void insert(DGNode *N) { List.push(N); }
+ DGNode *pop() {
+ auto *Back = List.top();
+ List.pop();
+ return Back;
+ }
+ bool empty() const { return List.empty(); }
+#ifndef NDEBUG
+ void dump(raw_ostream &OS) const;
+ LLVM_DUMP_METHOD void dump() const;
+#endif // NDEBUG
+};
----------------
tmsri wrote:
ReadyListContainer just reads like a wrapper around priority_queue. Do you really need it, why not just use the priority_queue?
https://github.com/llvm/llvm-project/pull/112449
More information about the llvm-commits
mailing list