[llvm] [Analysis] Avoid running transform passes that have just been run (PR #112092)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 18 15:23:53 PST 2024
================
@@ -0,0 +1,51 @@
+//===- LastRunTrackingAnalysis.cpp - Avoid running redundant pass -*- 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 an analysis pass to track a set of passes that have been run, so that
+// we can avoid running a pass again if there is no change since the last run of
+// the pass.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/LastRunTrackingAnalysis.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Support/CommandLine.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "last-run-tracking"
+STATISTIC(NumSkippedPasses, "Number of skipped passes");
+STATISTIC(NumLRTQueries, "Number of LastRunTracking queries");
+
+static cl::opt<bool>
+ DisableLastRunTracking("disable-last-run-tracking", cl::Hidden,
+ cl::desc("Disable last run tracking"),
+ cl::init(false));
+
+bool LastRunTrackingInfo::shouldSkipImpl(PassID ID, OptionPtr Ptr) const {
+ if (DisableLastRunTracking)
+ return false;
+ ++NumLRTQueries;
+ auto Iter = TrackedPasses.find(ID);
+ if (Iter == TrackedPasses.end())
+ return false;
+ if (!Iter->second || Iter->second(Ptr)) {
----------------
pguo-cn wrote:
I might hit a bug with `updateImpl` & `shouldSkipImpl`. Given such calling sequence:
1. In one run of `InstCombinePass::run`, calls `LRT.update(&ID, /*Changed=*/true);`
1.1 `updateImpl(ID, Changed, CompatibilityCheckFn{});`
1.2 The `TrackedPasses` is cleared, then `TrackedPasses[ID]` set with a null function pointer
2. In next run of `InstCombinePass::run`, checking `LRT.shouldSkip(&ID)`
2.1 `shouldSkipImpl(ID, nullptr)`
2.2 we reaches `if (!Iter->second || Iter->second(Ptr))`, and since `Iter->second` is a null pointer, we return true and skipped the next run of inst combine pass while it shouldn't since the previous run changed the IR.
4.
https://github.com/llvm/llvm-project/pull/112092
More information about the llvm-commits
mailing list