Skip to content

Commit

Permalink
[mlgo][regalloc] Handle training case when no regalloc happens.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
mtrofin committed Feb 6, 2023
1 parent cb5e48d commit 1b80ccb
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 3 deletions.
8 changes: 7 additions & 1 deletion llvm/include/llvm/Analysis/Utils/TrainingLogger.h
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/MLRegallocEvictAdvisor.cpp
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/MLRegallocPriorityAdvisor.cpp
Expand Up @@ -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
Expand Down
33 changes: 33 additions & 0 deletions 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"}

0 comments on commit 1b80ccb

Please sign in to comment.