diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-12-11 20:07:25 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-12-11 20:07:25 +0000 |
commit | 6de678815c12ca5110a134be6426acfc163682c9 (patch) | |
tree | ae7e1adbad207f673e1ac21cfe13389c4ef9dfd6 /llvm/unittests/Analysis/TBAATest.cpp | |
parent | 3336f681e3f548e082d363b848edaeb3e0fcb644 (diff) | |
download | bcm5719-llvm-6de678815c12ca5110a134be6426acfc163682c9.tar.gz bcm5719-llvm-6de678815c12ca5110a134be6426acfc163682c9.zip |
[TBAA] Don't generate invalid TBAA when merging nodes
Summary:
Fix a corner case in `MDNode::getMostGenericTBAA` where we can sometimes
generate invalid TBAA metadata.
Reviewers: chandlerc, hfinkel, mehdi_amini, manmanren
Subscribers: mcrosier, llvm-commits
Differential Revision: https://reviews.llvm.org/D26635
llvm-svn: 289403
Diffstat (limited to 'llvm/unittests/Analysis/TBAATest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/TBAATest.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/llvm/unittests/Analysis/TBAATest.cpp b/llvm/unittests/Analysis/TBAATest.cpp index 98899dd553d..3a1d2f43563 100644 --- a/llvm/unittests/Analysis/TBAATest.cpp +++ b/llvm/unittests/Analysis/TBAATest.cpp @@ -22,20 +22,19 @@ namespace llvm { namespace { -class OldTBAATest : public testing::Test { +class TBAATest : public testing::Test { protected: - OldTBAATest() : M("MixedTBAATest", C), MD(C) {} + TBAATest() : M("TBAATest", 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. - +static StoreInst *getFunctionWithSingleStore(Module *M, StringRef Name) { + auto &C = M->getContext(); FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), {}); - auto *F = cast<Function>(M.getOrInsertFunction("f", FTy)); + auto *F = cast<Function>(M->getOrInsertFunction(Name, FTy)); auto *BB = BasicBlock::Create(C, "entry", F); auto *IntType = Type::getInt32Ty(C); auto *PtrType = Type::getInt32PtrTy(C); @@ -43,6 +42,14 @@ TEST_F(OldTBAATest, checkVerifierBehavior) { ConstantPointerNull::get(PtrType), BB); ReturnInst::Create(C, nullptr, BB); + return SI; +} + +TEST_F(TBAATest, checkVerifierBehaviorForOldTBAA) { + auto *SI = getFunctionWithSingleStore(&M, "f1"); + auto *F = SI->getFunction(); + + // C++ unit test case to avoid going through the auto upgrade logic. auto *RootMD = MD.createTBAARoot("Simple C/C++ TBAA"); auto *MD1 = MD.createTBAANode("omnipotent char", RootMD); auto *MD2 = MD.createTBAANode("int", MD1); @@ -59,5 +66,26 @@ TEST_F(OldTBAATest, checkVerifierBehavior) { .startswith(ExpectedFailureMsg)); } +TEST_F(TBAATest, checkTBAAMerging) { + auto *SI = getFunctionWithSingleStore(&M, "f2"); + auto *F = SI->getFunction(); + + auto *RootMD = MD.createTBAARoot("tbaa-root"); + auto *MD1 = MD.createTBAANode("scalar-a", RootMD); + auto *StructTag1 = MD.createTBAAStructTagNode(MD1, MD1, 0); + auto *MD2 = MD.createTBAANode("scalar-b", RootMD); + auto *StructTag2 = MD.createTBAAStructTagNode(MD2, MD2, 0); + + auto *GenericMD = MDNode::getMostGenericTBAA(StructTag1, StructTag2); + + EXPECT_EQ(GenericMD, nullptr); + + // Despite GenericMD being nullptr, we expect the setMetadata call to be well + // defined and produce a well-formed function. + SI->setMetadata(LLVMContext::MD_tbaa, GenericMD); + + EXPECT_TRUE(!verifyFunction(*F)); +} + } // end anonymous namspace } // end llvm namespace |