Files
TheRock/compiler/amd-llvm/llvm/unittests/Analysis/LastRunTrackingAnalysisTest.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

118 lines
3.9 KiB
C++

//===--- LastRunTrackingAnalysisTest.cpp - LastRunTrackingAnalysis tests---===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/LastRunTrackingAnalysis.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Passes/PassBuilder.h"
#include "gtest/gtest.h"
namespace {
using namespace llvm;
class LastRunTrackingAnalysisTest : public testing::Test {
protected:
LLVMContext C;
Module M;
PassBuilder PB;
LoopAnalysisManager LAM;
FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM;
ModulePassManager MPM;
ModuleAnalysisManager MAM;
LastRunTrackingAnalysisTest() : M("LastRunTrackingAnalysisTest", C) {
PB.registerModuleAnalyses(MAM);
PB.registerCGSCCAnalyses(CGAM);
PB.registerFunctionAnalyses(FAM);
PB.registerLoopAnalyses(LAM);
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
}
};
struct PassOption final {
uint32_t Threshold;
/// Assume that this pass doesn't make changes with threshold A if we already
/// know it doesn't make changes with a larger threshold B.
bool isCompatibleWith(const PassOption &LastOpt) const {
return Threshold <= LastOpt.Threshold;
}
};
class ModuleNoopPass : public OptionalPassInfoMixin<ModuleNoopPass> {
uint32_t &ExecutedBitMap;
uint32_t RunID;
void *PassID;
bool ShouldChange;
std::optional<PassOption> Option;
bool shouldSkip(LastRunTrackingInfo &LRT) {
if (Option.has_value())
return LRT.shouldSkip(PassID, *Option);
return LRT.shouldSkip(PassID);
}
void update(LastRunTrackingInfo &LRT) {
if (Option.has_value())
return LRT.update(PassID, ShouldChange, *Option);
return LRT.update(PassID, ShouldChange);
}
public:
explicit ModuleNoopPass(uint32_t &ExecutedBitMapRef, uint32_t RunIDVal,
void *PassIDVal, bool ShouldChangeVal,
std::optional<PassOption> OptionVal = std::nullopt)
: ExecutedBitMap(ExecutedBitMapRef), RunID(RunIDVal), PassID(PassIDVal),
ShouldChange(ShouldChangeVal), Option(OptionVal) {}
PreservedAnalyses run(Module &F, ModuleAnalysisManager &AM) {
auto &LRT = AM.getResult<LastRunTrackingAnalysis>(F);
if (shouldSkip(LRT)) {
EXPECT_FALSE(ShouldChange) << "This pass is incorrectly skipped.";
return PreservedAnalyses::all();
}
ExecutedBitMap |= 1U << RunID;
update(LRT);
PreservedAnalyses PA;
PA.preserve<LastRunTrackingAnalysis>();
return PA;
}
};
static char PassA, PassB;
TEST_F(LastRunTrackingAnalysisTest, SkipTest) {
uint32_t BitMap = 0;
// Executed. This is first run of PassA.
MPM.addPass(ModuleNoopPass(BitMap, 0, &PassA, true));
// Skipped since PassA has just been executed.
MPM.addPass(ModuleNoopPass(BitMap, 1, &PassA, false));
// Skipped since PassA has just been executed.
MPM.addPass(ModuleNoopPass(BitMap, 2, &PassA, false));
// Executed. This is first run of PassB.
MPM.addPass(ModuleNoopPass(BitMap, 3, &PassB, false, PassOption{2}));
// Skipped. PassB doesn't make changes with lower threshold.
MPM.addPass(ModuleNoopPass(BitMap, 4, &PassB, false, PassOption{1}));
// Executed. PassB may make changes with higher threshold.
MPM.addPass(ModuleNoopPass(BitMap, 5, &PassB, false, PassOption{3}));
// Skipped. We don't make changes since last run of PassA.
MPM.addPass(ModuleNoopPass(BitMap, 6, &PassA, false));
// Executed. PassB may make changes with higher threshold.
MPM.addPass(ModuleNoopPass(BitMap, 7, &PassB, true, PassOption{4}));
// Executed. This module has been modified by PassB.
MPM.addPass(ModuleNoopPass(BitMap, 8, &PassA, false));
MPM.run(M, MAM);
ASSERT_EQ(BitMap, 0b110101001U);
}
} // namespace