[llvm] 1b80ccb - [mlgo][regalloc] Handle training case when no regalloc happens.

Mircea Trofin via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 6 13:57:31 PST 2023


Author: Mircea Trofin
Date: 2023-02-06T13:57:16-08:00
New Revision: 1b80ccba0f9bb86eabeeb0c32876eae2088eafb8

URL: https://github.com/llvm/llvm-project/commit/1b80ccba0f9bb86eabeeb0c32876eae2088eafb8
DIFF: https://github.com/llvm/llvm-project/commit/1b80ccba0f9bb86eabeeb0c32876eae2088eafb8.diff

LOG: [mlgo][regalloc] Handle training case when no regalloc happens.

There's an early-exit case for regalloc when we don't even get a chance
to ask for an advisor (priority or eviction), and switch the context.
Then, when we want to log the reward for that function (==the one with
the early exit case), we hit the error case where the function's name
doesn't match the last-seen context.

There are a few possible fixes, one would be to just switch context when
output-ing the reward, which would be correct. This patch opts for the
alternative where we check any loging happened in the first place - just
to re-validate that no function would have been regaloc-ed without first
log-ing its reward.

Differential Revision: https://reviews.llvm.org/D143359

Added: 
    llvm/test/CodeGen/MLRegalloc/empty-log.ll

Modified: 
    llvm/include/llvm/Analysis/Utils/TrainingLogger.h
    llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp
    llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/Utils/TrainingLogger.h b/llvm/include/llvm/Analysis/Utils/TrainingLogger.h
index ef6018914d34a..57a1637f59b5c 100644
--- a/llvm/include/llvm/Analysis/Utils/TrainingLogger.h
+++ b/llvm/include/llvm/Analysis/Utils/TrainingLogger.h
@@ -121,8 +121,14 @@ class Logger final {
 
   const std::string &currentContext() const { return CurrentContext; }
 
+  /// Check if there is at least an observation for `currentContext()`.
   bool hasObservationInProgress() const {
-    return ObservationIDs.find(CurrentContext) != ObservationIDs.end();
+    return hasAnyObservationForContext(CurrentContext);
+  }
+
+  /// Check if there is at least an observation for the context `Ctx`.
+  bool hasAnyObservationForContext(StringRef Ctx) const {
+    return ObservationIDs.find(Ctx) != ObservationIDs.end();
   }
 
   template <typename T> void logReward(T Value) {

diff  --git a/llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp
index 0064e85df3348..b36a86aa1b924 100644
--- a/llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp
+++ b/llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp
@@ -474,7 +474,7 @@ class DevelopmentModeEvictionAdvisorAnalysis final
 
   void logRewardIfNeeded(const MachineFunction &MF,
                          llvm::function_ref<float()> GetReward) override {
-    if (!Log)
+    if (!Log || !Log->hasAnyObservationForContext(MF.getName()))
       return;
     // The function pass manager would run all the function passes for a
     // function, so we assume the last context belongs to this function. If

diff  --git a/llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp b/llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp
index 7a5345ea31217..422781593a9c6 100644
--- a/llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp
+++ b/llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp
@@ -197,7 +197,7 @@ class DevelopmentModePriorityAdvisorAnalysis final
 
   void logRewardIfNeeded(const MachineFunction &MF,
                          llvm::function_ref<float()> GetReward) override {
-    if (!Log)
+    if (!Log || !Log->hasAnyObservationForContext(MF.getName()))
       return;
     // The function pass manager would run all the function passes for a
     // function, so we assume the last context belongs to this function. If

diff  --git a/llvm/test/CodeGen/MLRegalloc/empty-log.ll b/llvm/test/CodeGen/MLRegalloc/empty-log.ll
new file mode 100644
index 0000000000000..951a8f6e30317
--- /dev/null
+++ b/llvm/test/CodeGen/MLRegalloc/empty-log.ll
@@ -0,0 +1,33 @@
+; REQUIRES: have_tflite
+; REQUIRES: x86_64-linux
+;
+; Check that we can log more than 1 function.
+;
+; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-advisor=development \
+; RUN:   -regalloc-training-log=%t1 < %s
+; RUN: FileCheck --input-file %t1 %s
+
+; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-priority-advisor=development \
+; RUN:   -regalloc-priority-training-log=%t2 < %s
+; RUN: FileCheck --input-file %t2 %s
+
+declare void @f();
+
+define void @f1(i64 %lhs, i64 %rhs, i64* %addr) {
+  ret void
+}
+
+define void @f2(i64 %lhs, i64 %rhs, i64* %addr) {
+  %sum = add i64 %lhs, %rhs
+  call void @f();
+  store i64 %sum, i64* %addr
+  ret void
+}
+
+define void @f3(i64 %lhs, i64 %rhs, i64* %addr) {
+  ret void
+}
+
+; CHECK-NOT:  {"context":"f1"}
+; CHECK:      {"context":"f2"}
+; CHECK-NOT:  {"context":"f3"}


        


More information about the llvm-commits mailing list