comparison llvm/unittests/Analysis/AliasAnalysisTest.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 79ff65ed7e25
children 1f2b6ac9f198
comparison
equal deleted inserted replaced
232:70dce7da266c 236:c4bab56944e8
72 72
73 namespace { 73 namespace {
74 /// A test customizable AA result. It merely accepts a callback to run whenever 74 /// A test customizable AA result. It merely accepts a callback to run whenever
75 /// it receives an alias query. Useful for testing that a particular AA result 75 /// it receives an alias query. Useful for testing that a particular AA result
76 /// is reached. 76 /// is reached.
77 struct TestCustomAAResult : AAResultBase<TestCustomAAResult> { 77 struct TestCustomAAResult : AAResultBase {
78 friend AAResultBase<TestCustomAAResult>;
79
80 std::function<void()> CB; 78 std::function<void()> CB;
81 79
82 explicit TestCustomAAResult(std::function<void()> CB) 80 explicit TestCustomAAResult(std::function<void()> CB)
83 : AAResultBase(), CB(std::move(CB)) {} 81 : AAResultBase(), CB(std::move(CB)) {}
84 TestCustomAAResult(TestCustomAAResult &&Arg) 82 TestCustomAAResult(TestCustomAAResult &&Arg)
331 const auto AR = AA.alias(Loc1, Loc2); 329 const auto AR = AA.alias(Loc1, Loc2);
332 EXPECT_EQ(AR, AliasResult::PartialAlias); 330 EXPECT_EQ(AR, AliasResult::PartialAlias);
333 EXPECT_EQ(4, AR.getOffset()); 331 EXPECT_EQ(4, AR.getOffset());
334 } 332 }
335 333
334 // Check that swapping the order of parameters to `AA.alias()` changes offset
335 // sign and that the sign is such that FirstLoc + Offset == SecondLoc.
336 TEST_F(AliasAnalysisTest, PartialAliasOffsetSign) {
337 LLVMContext C;
338 SMDiagnostic Err;
339 std::unique_ptr<Module> M = parseAssemblyString(R"(
340 define void @f(i64* %p) {
341 %L1 = load i64, i64* %p
342 %p.i8 = bitcast i64* %p to i8*
343 %q = getelementptr i8, i8* %p.i8, i32 1
344 %L2 = load i8, i8* %q
345 ret void
346 }
347 )",
348 Err, C);
349
350 if (!M)
351 Err.print("PartialAliasOffsetSign", errs());
352
353 Function *F = M->getFunction("f");
354 const auto Loc1 = MemoryLocation::get(getInstructionByName(*F, "L1"));
355 const auto Loc2 = MemoryLocation::get(getInstructionByName(*F, "L2"));
356
357 auto &AA = getAAResults(*F);
358
359 auto AR = AA.alias(Loc1, Loc2);
360 EXPECT_EQ(AR, AliasResult::PartialAlias);
361 EXPECT_EQ(1, AR.getOffset());
362
363 AR = AA.alias(Loc2, Loc1);
364 EXPECT_EQ(AR, AliasResult::PartialAlias);
365 EXPECT_EQ(-1, AR.getOffset());
366 }
336 class AAPassInfraTest : public testing::Test { 367 class AAPassInfraTest : public testing::Test {
337 protected: 368 protected:
338 LLVMContext C; 369 LLVMContext C;
339 SMDiagnostic Err; 370 SMDiagnostic Err;
340 std::unique_ptr<Module> M; 371 std::unique_ptr<Module> M;