[PATCH] D145400: [unittests] add callbr AliasAnalysisTest case

Nick Desaulniers via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 6 10:19:23 PST 2023


nickdesaulniers created this revision.
Herald added a subscriber: jeroen.dobbelaere.
Herald added a project: All.
nickdesaulniers requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Demonstrate that AA can determine that callbr inputs don't alias with
globals. See also: https://reviews.llvm.org/D144927

To run test:
$ pushd llvm/build; ninja AnalysisTests; popd
$ ./llvm/build/unittests/Analysis/AnalysisTests \

  --gtest_filter=AliasAnalysisTest.CallBr


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145400

Files:
  llvm/unittests/Analysis/AliasAnalysisTest.cpp


Index: llvm/unittests/Analysis/AliasAnalysisTest.cpp
===================================================================
--- llvm/unittests/Analysis/AliasAnalysisTest.cpp
+++ llvm/unittests/Analysis/AliasAnalysisTest.cpp
@@ -364,6 +364,48 @@
   EXPECT_EQ(AR, AliasResult::PartialAlias);
   EXPECT_EQ(-1, AR.getOffset());
 }
+TEST_F(AliasAnalysisTest, CallBr) {
+  LLVMContext C;
+  SMDiagnostic Err;
+  std::unique_ptr<Module> M = parseAssemblyString(R"(
+ at y = global i32 0
+ at x = global i32 0
+define i32 @foo4() {
+entry:
+  callbr void asm "", "=*m,!i"(ptr elementtype(i32) @x)
+  to label %a [label %b]
+
+a:                                  ; preds = %entry
+  %z = load i32, ptr @y
+  ret i32 %z
+
+b:                                        ; preds = %entry
+  %w = load i32, ptr @y
+  ret i32 %w
+}
+)", Err, C);
+  if (!M)
+    Err.print("CallBr", errs());
+
+  Function *F = M->getFunction("foo4");
+  const auto Loc1 = MemoryLocation::get(getInstructionByName(*F, "z"));
+  const auto Loc2 = MemoryLocation::get(getInstructionByName(*F, "w"));
+  auto &AA = getAAResults(*F);
+  auto AR = AA.alias(Loc1, Loc2);
+  EXPECT_EQ(AR, AliasResult::MustAlias);
+
+  CallBrInst *CBR;
+  for (BasicBlock &BB : *F)
+    for (Instruction &I : BB)
+      if (isa<CallBrInst>(I))
+        CBR = cast<CallBrInst>(&I);
+
+  const auto Loc3 = MemoryLocation::getForArgument(CBR, 0, nullptr);
+  AR = AA.alias(Loc1, Loc3);
+  EXPECT_EQ(AR, AliasResult::NoAlias);
+  AR = AA.alias(Loc2, Loc3);
+  EXPECT_EQ(AR, AliasResult::NoAlias);
+}
 class AAPassInfraTest : public testing::Test {
 protected:
   LLVMContext C;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D145400.502697.patch
Type: text/x-patch
Size: 1605 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230306/e72c4b24/attachment.bin>


More information about the llvm-commits mailing list