//===--- EphemeralValuesCache.cpp -----------------------------------------===// // // 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/EphemeralValuesCache.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/AsmParser/Parser.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Support/SourceMgr.h" #include "gmock/gmock-matchers.h" #include "gtest/gtest.h" using namespace llvm; namespace { struct EphemeralValuesCacheTest : public testing::Test { LLVMContext Ctx; std::unique_ptr M; void parseIR(const char *Assembly) { SMDiagnostic Error; M = parseAssemblyString(Assembly, Error, Ctx); if (!M) Error.print("EphemeralValuesCacheTest", errs()); } }; TEST_F(EphemeralValuesCacheTest, basic) { parseIR(R"IR( declare void @llvm.assume(i1) define void @foo(i8 %arg0, i8 %arg1) { %c0 = icmp eq i8 %arg0, 0 call void @llvm.assume(i1 %c0) call void @foo(i8 %arg0, i8 %arg1) %c1 = icmp eq i8 %arg1, 0 call void @llvm.assume(i1 %c1) ret void } )IR"); Function *F = M->getFunction("foo"); auto *BB = &*F->begin(); AssumptionCache AC(*F); EphemeralValuesCache EVC(*F, AC); auto It = BB->begin(); auto *C0 = &*It++; auto *Assume0 = &*It++; [[maybe_unused]] auto *NotEph = &*It++; auto *C1 = &*It++; auto *Assume1 = &*It++; [[maybe_unused]] auto *Ret = &*It++; // Check emphemeral values. EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0, C1, Assume1)); // Clear the cache and try again. EVC.clear(); EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0, C1, Assume1)); // Modify the IR, clear cache and recompute. Assume1->eraseFromParent(); C1->eraseFromParent(); EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0, C1, Assume1)); EVC.clear(); EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0)); } } // namespace