[llvm] r286291 - [TBAA] Drop support for "old style" scalar TBAA tags
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 8 12:46:01 PST 2016
Author: sanjoy
Date: Tue Nov 8 14:46:01 2016
New Revision: 286291
URL: http://llvm.org/viewvc/llvm-project?rev=286291&view=rev
Log:
[TBAA] Drop support for "old style" scalar TBAA tags
Summary:
We've had support for auto upgrading old style scalar TBAA access
metadata tags into the "new" struct path aware TBAA metadata for 3 years
now. The only way to actually generate old style TBAA was explicitly
through the IRBuilder API. I think this is a good time for dropping
support for old style scalar TBAA.
I'm not removing support for textual or bitcode upgrade -- if you have
IR with the old style scalar TBAA tags that go through the AsmParser orf
the bitcode parser before LLVM sees them, they will keep working as
usual.
Note:
%val = load i32, i32* %ptr, !tbaa !N
!N = < scalar tbaa node >
is equivalent to
%val = load i32, i32* %ptr, !tbaa !M
!N = < scalar tbaa node >
!M = !{!N, !N, 0}
Reviewers: manmanren, chandlerc, sunfish
Subscribers: mcrosier, llvm-commits, mgorny
Differential Revision: https://reviews.llvm.org/D26229
Added:
llvm/trunk/unittests/Analysis/TBAATest.cpp
Removed:
llvm/trunk/unittests/Analysis/MixedTBAATest.cpp
Modified:
llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/unittests/Analysis/CMakeLists.txt
Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=286291&r1=286290&r2=286291&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Tue Nov 8 14:46:01 2016
@@ -417,15 +417,14 @@ MDNode *MDNode::getMostGenericTBAA(MDNod
return A;
// For struct-path aware TBAA, we use the access type of the tag.
- bool StructPath = isStructPathTBAA(A) && isStructPathTBAA(B);
- if (StructPath) {
- A = cast_or_null<MDNode>(MutableTBAAStructTagNode(A).getAccessType());
- if (!A)
- return nullptr;
- B = cast_or_null<MDNode>(MutableTBAAStructTagNode(B).getAccessType());
- if (!B)
- return nullptr;
- }
+ assert(isStructPathTBAA(A) && isStructPathTBAA(B) &&
+ "Auto upgrade should have taken care of this!");
+ A = cast_or_null<MDNode>(MutableTBAAStructTagNode(A).getAccessType());
+ if (!A)
+ return nullptr;
+ B = cast_or_null<MDNode>(MutableTBAAStructTagNode(B).getAccessType());
+ if (!B)
+ return nullptr;
SmallSetVector<MDNode *, 4> PathA;
MutableTBAANode TA(A);
@@ -457,8 +456,6 @@ MDNode *MDNode::getMostGenericTBAA(MDNod
--IA;
--IB;
}
- if (!StructPath)
- return Ret;
if (!Ret)
return nullptr;
@@ -492,52 +489,8 @@ void Instruction::getAAMetadata(AAMDNode
/// Aliases - Test whether the type represented by A may alias the
/// type represented by B.
bool TypeBasedAAResult::Aliases(const MDNode *A, const MDNode *B) const {
- // Make sure that both MDNodes are struct-path aware.
- if (isStructPathTBAA(A) && isStructPathTBAA(B))
- return PathAliases(A, B);
-
- // Keep track of the root node for A and B.
- TBAANode RootA, RootB;
-
- // Climb the tree from A to see if we reach B.
- for (TBAANode T(A);;) {
- if (T.getNode() == B)
- // B is an ancestor of A.
- return true;
-
- RootA = T;
- T = T.getParent();
- if (!T.getNode())
- break;
- }
-
- // Climb the tree from B to see if we reach A.
- for (TBAANode T(B);;) {
- if (T.getNode() == A)
- // A is an ancestor of B.
- return true;
-
- RootB = T;
- T = T.getParent();
- if (!T.getNode())
- break;
- }
-
- // Neither node is an ancestor of the other.
-
- // If they have different roots, they're part of different potentially
- // unrelated type systems, so we must be conservative.
- if (RootA.getNode() != RootB.getNode())
- return true;
-
- // If they have the same root, then we've proved there's no alias.
- return false;
-}
-
-/// Test whether the struct-path tag represented by A may alias the
-/// struct-path tag represented by B.
-bool TypeBasedAAResult::PathAliases(const MDNode *A, const MDNode *B) const {
- // Verify that both input nodes are struct-path aware.
+ // Verify that both input nodes are struct-path aware. Auto-upgrade should
+ // have taken care of this.
assert(isStructPathTBAA(A) && "MDNode A is not struct-path aware.");
assert(isStructPathTBAA(B) && "MDNode B is not struct-path aware.");
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=286291&r1=286290&r2=286291&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Tue Nov 8 14:46:01 2016
@@ -391,6 +391,7 @@ private:
void visitBasicBlock(BasicBlock &BB);
void visitRangeMetadata(Instruction& I, MDNode* Range, Type* Ty);
void visitDereferenceableMetadata(Instruction& I, MDNode* MD);
+ void visitTBAAMetadata(Instruction &I, MDNode *MD);
template <class Ty> bool isValidMetadataArray(const MDTuple &N);
#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) void visit##CLASS(const CLASS &N);
@@ -3658,6 +3659,15 @@ void Verifier::visitDereferenceableMetad
"dereferenceable_or_null metadata value must be an i64!", &I);
}
+void Verifier::visitTBAAMetadata(Instruction &I, MDNode *MD) {
+ bool IsStructPathTBAA =
+ isa<MDNode>(MD->getOperand(0)) && MD->getNumOperands() >= 3;
+
+ Assert(IsStructPathTBAA,
+ "Old-style TBAA is no longer allowed, use struct-path TBAA instead",
+ &I);
+}
+
/// verifyInstruction - Verify that an instruction is well formed.
///
void Verifier::visitInstruction(Instruction &I) {
@@ -3793,6 +3803,9 @@ void Verifier::visitInstruction(Instruct
if (MDNode *MD = I.getMetadata(LLVMContext::MD_dereferenceable_or_null))
visitDereferenceableMetadata(I, MD);
+ if (MDNode *MD = I.getMetadata(LLVMContext::MD_tbaa))
+ visitTBAAMetadata(I, MD);
+
if (MDNode *AlignMD = I.getMetadata(LLVMContext::MD_align)) {
Assert(I.getType()->isPointerTy(), "align applies only to pointer types",
&I);
Modified: llvm/trunk/unittests/Analysis/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/CMakeLists.txt?rev=286291&r1=286290&r2=286291&view=diff
==============================================================================
--- llvm/trunk/unittests/Analysis/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Analysis/CMakeLists.txt Tue Nov 8 14:46:01 2016
@@ -14,7 +14,7 @@ add_llvm_unittest(AnalysisTests
LazyCallGraphTest.cpp
LoopPassManagerTest.cpp
ScalarEvolutionTest.cpp
- MixedTBAATest.cpp
+ TBAATest.cpp
ValueTrackingTest.cpp
UnrollAnalyzer.cpp
)
Removed: llvm/trunk/unittests/Analysis/MixedTBAATest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/MixedTBAATest.cpp?rev=286290&view=auto
==============================================================================
--- llvm/trunk/unittests/Analysis/MixedTBAATest.cpp (original)
+++ llvm/trunk/unittests/Analysis/MixedTBAATest.cpp (removed)
@@ -1,79 +0,0 @@
-//===--- MixedTBAATest.cpp - Mixed TBAA unit tests ------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
-#include "llvm/Analysis/AliasAnalysisEvaluator.h"
-#include "llvm/Analysis/Passes.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/LLVMContext.h"
-#include "llvm/IR/MDBuilder.h"
-#include "llvm/IR/Module.h"
-#include "llvm/IR/LegacyPassManager.h"
-#include "llvm/Support/CommandLine.h"
-#include "gtest/gtest.h"
-
-namespace llvm {
-namespace {
-
-class MixedTBAATest : public testing::Test {
-protected:
- MixedTBAATest() : M("MixedTBAATest", C), MD(C) {}
-
- LLVMContext C;
- Module M;
- MDBuilder MD;
- legacy::PassManager PM;
-};
-
-TEST_F(MixedTBAATest, MixedTBAA) {
- // Setup function.
- FunctionType *FTy = FunctionType::get(Type::getVoidTy(C),
- std::vector<Type *>(), false);
- auto *F = cast<Function>(M.getOrInsertFunction("f", FTy));
- auto *BB = BasicBlock::Create(C, "entry", F);
- auto IntType = Type::getInt32Ty(C);
- auto PtrType = Type::getInt32PtrTy(C);
- auto *Value = ConstantInt::get(IntType, 42);
- auto *Addr = ConstantPointerNull::get(PtrType);
-
- auto *Store1 = new StoreInst(Value, Addr, BB);
- auto *Store2 = new StoreInst(Value, Addr, BB);
- ReturnInst::Create(C, nullptr, BB);
-
- // New TBAA metadata
- {
- auto RootMD = MD.createTBAARoot("Simple C/C++ TBAA");
- auto MD1 = MD.createTBAAScalarTypeNode("omnipotent char", RootMD);
- auto MD2 = MD.createTBAAScalarTypeNode("int", MD1);
- auto MD3 = MD.createTBAAStructTagNode(MD2, MD2, 0);
- Store2->setMetadata(LLVMContext::MD_tbaa, MD3);
- }
-
- // Old TBAA metadata
- {
- auto RootMD = MD.createTBAARoot("Simple C/C++ TBAA");
- auto MD1 = MD.createTBAANode("omnipotent char", RootMD);
- auto MD2 = MD.createTBAANode("int", MD1);
- Store1->setMetadata(LLVMContext::MD_tbaa, MD2);
- }
-
- // Run the TBAA eval pass on a mixture of path-aware and non-path-aware TBAA.
- // The order of the metadata (path-aware vs non-path-aware) is important,
- // because the AA eval pass only runs one test per store-pair.
- const char* args[] = { "MixedTBAATest", "-evaluate-aa-metadata" };
- cl::ParseCommandLineOptions(sizeof(args) / sizeof(const char*), args);
- PM.add(createTypeBasedAAWrapperPass());
- PM.add(createAAEvalPass());
- PM.run(M);
-}
-
-} // end anonymous namspace
-} // end llvm namespace
-
Added: llvm/trunk/unittests/Analysis/TBAATest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/TBAATest.cpp?rev=286291&view=auto
==============================================================================
--- llvm/trunk/unittests/Analysis/TBAATest.cpp (added)
+++ llvm/trunk/unittests/Analysis/TBAATest.cpp Tue Nov 8 14:46:01 2016
@@ -0,0 +1,63 @@
+//===--- TBAATest.cpp - Mixed TBAA unit tests -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/AliasAnalysisEvaluator.h"
+#include "llvm/Analysis/Passes.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/MDBuilder.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/IR/Verifier.h"
+#include "llvm/Support/CommandLine.h"
+#include "gtest/gtest.h"
+
+namespace llvm {
+namespace {
+
+class OldTBAATest : public testing::Test {
+protected:
+ OldTBAATest() : M("MixedTBAATest", C), MD(C) {}
+
+ LLVMContext C;
+ Module M;
+ MDBuilder MD;
+};
+
+TEST_F(OldTBAATest, checkVerifierBehavior) {
+ // C++ unit test case to avoid going through the auto upgrade logic.
+
+ FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), {});
+ auto *F = cast<Function>(M.getOrInsertFunction("f", FTy));
+ auto *BB = BasicBlock::Create(C, "entry", F);
+ auto *IntType = Type::getInt32Ty(C);
+ auto *PtrType = Type::getInt32PtrTy(C);
+ auto *SI = new StoreInst(ConstantInt::get(IntType, 42),
+ ConstantPointerNull::get(PtrType), BB);
+ ReturnInst::Create(C, nullptr, BB);
+
+ auto *RootMD = MD.createTBAARoot("Simple C/C++ TBAA");
+ auto *MD1 = MD.createTBAANode("omnipotent char", RootMD);
+ auto *MD2 = MD.createTBAANode("int", MD1);
+ SI->setMetadata(LLVMContext::MD_tbaa, MD2);
+
+ SmallVector<char, 0> ErrorMsg;
+ raw_svector_ostream Outs(ErrorMsg);
+
+ StringRef ExpectedFailureMsg(
+ "Old-style TBAA is no longer allowed, use struct-path TBAA instead");
+
+ EXPECT_TRUE(verifyFunction(*F, &Outs));
+ EXPECT_TRUE(StringRef(ErrorMsg.begin(), ErrorMsg.size())
+ .startswith(ExpectedFailureMsg));
+}
+
+} // end anonymous namspace
+} // end llvm namespace
More information about the llvm-commits
mailing list