summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Analysis/TBAATest.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-12-11 20:07:25 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-12-11 20:07:25 +0000
commit6de678815c12ca5110a134be6426acfc163682c9 (patch)
treeae7e1adbad207f673e1ac21cfe13389c4ef9dfd6 /llvm/unittests/Analysis/TBAATest.cpp
parent3336f681e3f548e082d363b848edaeb3e0fcb644 (diff)
downloadbcm5719-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.cpp40
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
OpenPOWER on IntegriCloud