1f4a2713aSLionel Sambuc //===- llvm/unittests/MDBuilderTest.cpp - MDBuilder unit tests ------------===//
2f4a2713aSLionel Sambuc //
3f4a2713aSLionel Sambuc // The LLVM Compiler Infrastructure
4f4a2713aSLionel Sambuc //
5f4a2713aSLionel Sambuc // This file is distributed under the University of Illinois Open Source
6f4a2713aSLionel Sambuc // License. See LICENSE.TXT for details.
7f4a2713aSLionel Sambuc //
8f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===//
9f4a2713aSLionel Sambuc
10f4a2713aSLionel Sambuc #include "llvm/IR/MDBuilder.h"
11f4a2713aSLionel Sambuc #include "llvm/IR/IRBuilder.h"
12*0a6a1f1dSLionel Sambuc #include "llvm/IR/Metadata.h"
13f4a2713aSLionel Sambuc #include "llvm/IR/Operator.h"
14f4a2713aSLionel Sambuc #include "gtest/gtest.h"
15f4a2713aSLionel Sambuc
16f4a2713aSLionel Sambuc using namespace llvm;
17f4a2713aSLionel Sambuc
18f4a2713aSLionel Sambuc namespace {
19f4a2713aSLionel Sambuc
20f4a2713aSLionel Sambuc class MDBuilderTest : public testing::Test {
21f4a2713aSLionel Sambuc protected:
22f4a2713aSLionel Sambuc LLVMContext Context;
23f4a2713aSLionel Sambuc };
24f4a2713aSLionel Sambuc
TEST_F(MDBuilderTest,createString)25f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createString) {
26f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
27f4a2713aSLionel Sambuc MDString *Str0 = MDHelper.createString("");
28f4a2713aSLionel Sambuc MDString *Str1 = MDHelper.createString("string");
29f4a2713aSLionel Sambuc EXPECT_EQ(Str0->getString(), StringRef(""));
30f4a2713aSLionel Sambuc EXPECT_EQ(Str1->getString(), StringRef("string"));
31f4a2713aSLionel Sambuc }
TEST_F(MDBuilderTest,createFPMath)32f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createFPMath) {
33f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
34f4a2713aSLionel Sambuc MDNode *MD0 = MDHelper.createFPMath(0.0);
35f4a2713aSLionel Sambuc MDNode *MD1 = MDHelper.createFPMath(1.0);
36*0a6a1f1dSLionel Sambuc EXPECT_EQ(MD0, (MDNode *)nullptr);
37*0a6a1f1dSLionel Sambuc EXPECT_NE(MD1, (MDNode *)nullptr);
38f4a2713aSLionel Sambuc EXPECT_EQ(MD1->getNumOperands(), 1U);
39*0a6a1f1dSLionel Sambuc Metadata *Op = MD1->getOperand(0);
40*0a6a1f1dSLionel Sambuc EXPECT_TRUE(mdconst::hasa<ConstantFP>(Op));
41*0a6a1f1dSLionel Sambuc ConstantFP *Val = mdconst::extract<ConstantFP>(Op);
42*0a6a1f1dSLionel Sambuc EXPECT_TRUE(Val->getType()->isFloatingPointTy());
43f4a2713aSLionel Sambuc EXPECT_TRUE(Val->isExactlyValue(1.0));
44f4a2713aSLionel Sambuc }
TEST_F(MDBuilderTest,createRangeMetadata)45f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createRangeMetadata) {
46f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
47f4a2713aSLionel Sambuc APInt A(8, 1), B(8, 2);
48f4a2713aSLionel Sambuc MDNode *R0 = MDHelper.createRange(A, A);
49f4a2713aSLionel Sambuc MDNode *R1 = MDHelper.createRange(A, B);
50*0a6a1f1dSLionel Sambuc EXPECT_EQ(R0, (MDNode *)nullptr);
51*0a6a1f1dSLionel Sambuc EXPECT_NE(R1, (MDNode *)nullptr);
52f4a2713aSLionel Sambuc EXPECT_EQ(R1->getNumOperands(), 2U);
53*0a6a1f1dSLionel Sambuc EXPECT_TRUE(mdconst::hasa<ConstantInt>(R1->getOperand(0)));
54*0a6a1f1dSLionel Sambuc EXPECT_TRUE(mdconst::hasa<ConstantInt>(R1->getOperand(1)));
55*0a6a1f1dSLionel Sambuc ConstantInt *C0 = mdconst::extract<ConstantInt>(R1->getOperand(0));
56*0a6a1f1dSLionel Sambuc ConstantInt *C1 = mdconst::extract<ConstantInt>(R1->getOperand(1));
57f4a2713aSLionel Sambuc EXPECT_EQ(C0->getValue(), A);
58f4a2713aSLionel Sambuc EXPECT_EQ(C1->getValue(), B);
59f4a2713aSLionel Sambuc }
TEST_F(MDBuilderTest,createAnonymousTBAARoot)60f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createAnonymousTBAARoot) {
61f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
62f4a2713aSLionel Sambuc MDNode *R0 = MDHelper.createAnonymousTBAARoot();
63f4a2713aSLionel Sambuc MDNode *R1 = MDHelper.createAnonymousTBAARoot();
64f4a2713aSLionel Sambuc EXPECT_NE(R0, R1);
65f4a2713aSLionel Sambuc EXPECT_GE(R0->getNumOperands(), 1U);
66f4a2713aSLionel Sambuc EXPECT_GE(R1->getNumOperands(), 1U);
67f4a2713aSLionel Sambuc EXPECT_EQ(R0->getOperand(0), R0);
68f4a2713aSLionel Sambuc EXPECT_EQ(R1->getOperand(0), R1);
69*0a6a1f1dSLionel Sambuc EXPECT_TRUE(R0->getNumOperands() == 1 || R0->getOperand(1) == nullptr);
70*0a6a1f1dSLionel Sambuc EXPECT_TRUE(R1->getNumOperands() == 1 || R1->getOperand(1) == nullptr);
71f4a2713aSLionel Sambuc }
TEST_F(MDBuilderTest,createTBAARoot)72f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createTBAARoot) {
73f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
74f4a2713aSLionel Sambuc MDNode *R0 = MDHelper.createTBAARoot("Root");
75f4a2713aSLionel Sambuc MDNode *R1 = MDHelper.createTBAARoot("Root");
76f4a2713aSLionel Sambuc EXPECT_EQ(R0, R1);
77f4a2713aSLionel Sambuc EXPECT_GE(R0->getNumOperands(), 1U);
78f4a2713aSLionel Sambuc EXPECT_TRUE(isa<MDString>(R0->getOperand(0)));
79f4a2713aSLionel Sambuc EXPECT_EQ(cast<MDString>(R0->getOperand(0))->getString(), "Root");
80*0a6a1f1dSLionel Sambuc EXPECT_TRUE(R0->getNumOperands() == 1 || R0->getOperand(1) == nullptr);
81f4a2713aSLionel Sambuc }
TEST_F(MDBuilderTest,createTBAANode)82f4a2713aSLionel Sambuc TEST_F(MDBuilderTest, createTBAANode) {
83f4a2713aSLionel Sambuc MDBuilder MDHelper(Context);
84f4a2713aSLionel Sambuc MDNode *R = MDHelper.createTBAARoot("Root");
85f4a2713aSLionel Sambuc MDNode *N0 = MDHelper.createTBAANode("Node", R);
86f4a2713aSLionel Sambuc MDNode *N1 = MDHelper.createTBAANode("edoN", R);
87f4a2713aSLionel Sambuc MDNode *N2 = MDHelper.createTBAANode("Node", R, true);
88f4a2713aSLionel Sambuc MDNode *N3 = MDHelper.createTBAANode("Node", R);
89f4a2713aSLionel Sambuc EXPECT_EQ(N0, N3);
90f4a2713aSLionel Sambuc EXPECT_NE(N0, N1);
91f4a2713aSLionel Sambuc EXPECT_NE(N0, N2);
92f4a2713aSLionel Sambuc EXPECT_GE(N0->getNumOperands(), 2U);
93f4a2713aSLionel Sambuc EXPECT_GE(N1->getNumOperands(), 2U);
94f4a2713aSLionel Sambuc EXPECT_GE(N2->getNumOperands(), 3U);
95f4a2713aSLionel Sambuc EXPECT_TRUE(isa<MDString>(N0->getOperand(0)));
96f4a2713aSLionel Sambuc EXPECT_TRUE(isa<MDString>(N1->getOperand(0)));
97f4a2713aSLionel Sambuc EXPECT_TRUE(isa<MDString>(N2->getOperand(0)));
98f4a2713aSLionel Sambuc EXPECT_EQ(cast<MDString>(N0->getOperand(0))->getString(), "Node");
99f4a2713aSLionel Sambuc EXPECT_EQ(cast<MDString>(N1->getOperand(0))->getString(), "edoN");
100f4a2713aSLionel Sambuc EXPECT_EQ(cast<MDString>(N2->getOperand(0))->getString(), "Node");
101f4a2713aSLionel Sambuc EXPECT_EQ(N0->getOperand(1), R);
102f4a2713aSLionel Sambuc EXPECT_EQ(N1->getOperand(1), R);
103f4a2713aSLionel Sambuc EXPECT_EQ(N2->getOperand(1), R);
104*0a6a1f1dSLionel Sambuc EXPECT_TRUE(mdconst::hasa<ConstantInt>(N2->getOperand(2)));
105*0a6a1f1dSLionel Sambuc EXPECT_EQ(mdconst::extract<ConstantInt>(N2->getOperand(2))->getZExtValue(),
106*0a6a1f1dSLionel Sambuc 1U);
107f4a2713aSLionel Sambuc }
108f4a2713aSLionel Sambuc }
109