Mercurial > hg > CbC > CbC_llvm
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; |