1*9880d681SAndroid Build Coastguard Worker //===- ValueMapper.cpp - Unit tests for ValueMapper -----------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalVariable.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Transforms/Utils/ValueMapper.h"
16*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNode)22*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNode) {
23*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
24*9880d681SAndroid Build Coastguard Worker auto *U = MDTuple::get(Context, None);
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker // The node should be unchanged.
27*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
28*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U, ValueMapper(VM).mapMDNode(*U));
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeCycle)31*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeCycle) {
32*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
33*9880d681SAndroid Build Coastguard Worker MDNode *U0;
34*9880d681SAndroid Build Coastguard Worker MDNode *U1;
35*9880d681SAndroid Build Coastguard Worker {
36*9880d681SAndroid Build Coastguard Worker Metadata *Ops[] = {nullptr};
37*9880d681SAndroid Build Coastguard Worker auto T = MDTuple::getTemporary(Context, Ops);
38*9880d681SAndroid Build Coastguard Worker Ops[0] = T.get();
39*9880d681SAndroid Build Coastguard Worker U0 = MDTuple::get(Context, Ops);
40*9880d681SAndroid Build Coastguard Worker T->replaceOperandWith(0, U0);
41*9880d681SAndroid Build Coastguard Worker U1 = MDNode::replaceWithUniqued(std::move(T));
42*9880d681SAndroid Build Coastguard Worker U0->resolveCycles();
43*9880d681SAndroid Build Coastguard Worker }
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(U0->isResolved());
46*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(U0->isUniqued());
47*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(U1->isResolved());
48*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(U1->isUniqued());
49*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U1, U0->getOperand(0));
50*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U0, U1->getOperand(0));
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker // Cycles shouldn't be duplicated.
53*9880d681SAndroid Build Coastguard Worker {
54*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
55*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U0, ValueMapper(VM).mapMDNode(*U0));
56*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U1, ValueMapper(VM).mapMDNode(*U1));
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker // Check the other order.
60*9880d681SAndroid Build Coastguard Worker {
61*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
62*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U1, ValueMapper(VM).mapMDNode(*U1));
63*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(U0, ValueMapper(VM).mapMDNode(*U0));
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker }
66*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeDuplicatedCycle)67*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeDuplicatedCycle) {
68*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
69*9880d681SAndroid Build Coastguard Worker auto *PtrTy = Type::getInt8Ty(Context)->getPointerTo();
70*9880d681SAndroid Build Coastguard Worker std::unique_ptr<GlobalVariable> G0 = llvm::make_unique<GlobalVariable>(
71*9880d681SAndroid Build Coastguard Worker PtrTy, false, GlobalValue::ExternalLinkage, nullptr, "G0");
72*9880d681SAndroid Build Coastguard Worker std::unique_ptr<GlobalVariable> G1 = llvm::make_unique<GlobalVariable>(
73*9880d681SAndroid Build Coastguard Worker PtrTy, false, GlobalValue::ExternalLinkage, nullptr, "G1");
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // Create a cycle that references G0.
76*9880d681SAndroid Build Coastguard Worker MDNode *N0; // !0 = !{!1}
77*9880d681SAndroid Build Coastguard Worker MDNode *N1; // !1 = !{!0, i8* @G0}
78*9880d681SAndroid Build Coastguard Worker {
79*9880d681SAndroid Build Coastguard Worker auto T0 = MDTuple::getTemporary(Context, nullptr);
80*9880d681SAndroid Build Coastguard Worker Metadata *Ops1[] = {T0.get(), ConstantAsMetadata::get(G0.get())};
81*9880d681SAndroid Build Coastguard Worker N1 = MDTuple::get(Context, Ops1);
82*9880d681SAndroid Build Coastguard Worker T0->replaceOperandWith(0, N1);
83*9880d681SAndroid Build Coastguard Worker N0 = MDNode::replaceWithUniqued(std::move(T0));
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker // Resolve N0 and N1.
87*9880d681SAndroid Build Coastguard Worker ASSERT_FALSE(N0->isResolved());
88*9880d681SAndroid Build Coastguard Worker ASSERT_FALSE(N1->isResolved());
89*9880d681SAndroid Build Coastguard Worker N0->resolveCycles();
90*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(N0->isResolved());
91*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(N1->isResolved());
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker // Seed the value map to map G0 to G1 and map the nodes. The output should
94*9880d681SAndroid Build Coastguard Worker // have new nodes that reference G1 (instead of G0).
95*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
96*9880d681SAndroid Build Coastguard Worker VM[G0.get()] = G1.get();
97*9880d681SAndroid Build Coastguard Worker MDNode *MappedN0 = ValueMapper(VM).mapMDNode(*N0);
98*9880d681SAndroid Build Coastguard Worker MDNode *MappedN1 = ValueMapper(VM).mapMDNode(*N1);
99*9880d681SAndroid Build Coastguard Worker EXPECT_NE(N0, MappedN0);
100*9880d681SAndroid Build Coastguard Worker EXPECT_NE(N1, MappedN1);
101*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantAsMetadata::get(G1.get()), MappedN1->getOperand(1));
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker // Check that the output nodes are resolved.
104*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(MappedN0->isResolved());
105*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(MappedN1->isResolved());
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeUnresolved)108*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeUnresolved) {
109*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
110*9880d681SAndroid Build Coastguard Worker TempMDTuple T = MDTuple::getTemporary(Context, None);
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
113*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(T.get(), ValueMapper(VM, RF_NoModuleLevelChanges).mapMDNode(*T));
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeDistinct)116*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeDistinct) {
117*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
118*9880d681SAndroid Build Coastguard Worker auto *D = MDTuple::getDistinct(Context, None);
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker {
121*9880d681SAndroid Build Coastguard Worker // The node should be cloned.
122*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
123*9880d681SAndroid Build Coastguard Worker EXPECT_NE(D, ValueMapper(VM).mapMDNode(*D));
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker {
126*9880d681SAndroid Build Coastguard Worker // The node should be moved.
127*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
128*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(D, ValueMapper(VM, RF_MoveDistinctMDs).mapMDNode(*D));
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeDistinctOperands)132*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeDistinctOperands) {
133*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
134*9880d681SAndroid Build Coastguard Worker Metadata *Old = MDTuple::getDistinct(Context, None);
135*9880d681SAndroid Build Coastguard Worker auto *D = MDTuple::getDistinct(Context, Old);
136*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(Old, D->getOperand(0));
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker Metadata *New = MDTuple::getDistinct(Context, None);
139*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
140*9880d681SAndroid Build Coastguard Worker VM.MD()[Old].reset(New);
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker // Make sure operands are updated.
143*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(D, ValueMapper(VM, RF_MoveDistinctMDs).mapMDNode(*D));
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(New, D->getOperand(0));
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeSeeded)147*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeSeeded) {
148*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
149*9880d681SAndroid Build Coastguard Worker auto *D = MDTuple::getDistinct(Context, None);
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker // The node should be moved.
152*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
153*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(D));
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker VM.MD().insert(std::make_pair(D, TrackingMDRef(D)));
156*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(D, *VM.getMappedMD(D));
157*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(D, ValueMapper(VM).mapMDNode(*D));
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMDNodeSeededWithNull)160*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMDNodeSeededWithNull) {
161*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
162*9880d681SAndroid Build Coastguard Worker auto *D = MDTuple::getDistinct(Context, None);
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker // The node should be moved.
165*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
166*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(D));
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker VM.MD().insert(std::make_pair(D, TrackingMDRef()));
169*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, *VM.getMappedMD(D));
170*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, ValueMapper(VM).mapMDNode(*D));
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMetadataNullMapGlobalWithIgnoreMissingLocals)173*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataNullMapGlobalWithIgnoreMissingLocals) {
174*9880d681SAndroid Build Coastguard Worker LLVMContext C;
175*9880d681SAndroid Build Coastguard Worker FunctionType *FTy =
176*9880d681SAndroid Build Coastguard Worker FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
177*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F(
178*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
181*9880d681SAndroid Build Coastguard Worker RemapFlags Flags = RF_IgnoreMissingLocals | RF_NullMapMissingGlobalValues;
182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, ValueMapper(VM, Flags).mapValue(*F));
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMetadataMDString)185*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataMDString) {
186*9880d681SAndroid Build Coastguard Worker LLVMContext C;
187*9880d681SAndroid Build Coastguard Worker auto *S1 = MDString::get(C, "S1");
188*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker // Make sure S1 maps to itself, but isn't memoized.
191*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(S1, ValueMapper(VM).mapMetadata(*S1));
192*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(S1));
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker // We still expect VM.MD() to be respected.
195*9880d681SAndroid Build Coastguard Worker auto *S2 = MDString::get(C, "S2");
196*9880d681SAndroid Build Coastguard Worker VM.MD()[S1].reset(S2);
197*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(S2, ValueMapper(VM).mapMetadata(*S1));
198*9880d681SAndroid Build Coastguard Worker }
199*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMetadataGetMappedMD)200*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataGetMappedMD) {
201*9880d681SAndroid Build Coastguard Worker LLVMContext C;
202*9880d681SAndroid Build Coastguard Worker auto *N0 = MDTuple::get(C, None);
203*9880d681SAndroid Build Coastguard Worker auto *N1 = MDTuple::get(C, N0);
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker // Make sure hasMD and getMappedMD work correctly.
206*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
207*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.hasMD());
208*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N0, ValueMapper(VM).mapMetadata(*N0));
209*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N1, ValueMapper(VM).mapMetadata(*N1));
210*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(VM.hasMD());
211*9880d681SAndroid Build Coastguard Worker ASSERT_NE(None, VM.getMappedMD(N0));
212*9880d681SAndroid Build Coastguard Worker ASSERT_NE(None, VM.getMappedMD(N1));
213*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N0, *VM.getMappedMD(N0));
214*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N1, *VM.getMappedMD(N1));
215*9880d681SAndroid Build Coastguard Worker }
216*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMetadataNoModuleLevelChanges)217*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataNoModuleLevelChanges) {
218*9880d681SAndroid Build Coastguard Worker LLVMContext C;
219*9880d681SAndroid Build Coastguard Worker auto *N0 = MDTuple::get(C, None);
220*9880d681SAndroid Build Coastguard Worker auto *N1 = MDTuple::get(C, N0);
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker // Nothing should be memoized when RF_NoModuleLevelChanges.
223*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
224*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.hasMD());
225*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N0, ValueMapper(VM, RF_NoModuleLevelChanges).mapMetadata(*N0));
226*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N1, ValueMapper(VM, RF_NoModuleLevelChanges).mapMetadata(*N1));
227*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.hasMD());
228*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(N0));
229*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(N1));
230*9880d681SAndroid Build Coastguard Worker }
231*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapMetadataConstantAsMetadata)232*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataConstantAsMetadata) {
233*9880d681SAndroid Build Coastguard Worker LLVMContext C;
234*9880d681SAndroid Build Coastguard Worker FunctionType *FTy =
235*9880d681SAndroid Build Coastguard Worker FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
236*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F(
237*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker auto *CAM = ConstantAsMetadata::get(F.get());
240*9880d681SAndroid Build Coastguard Worker {
241*9880d681SAndroid Build Coastguard Worker // ConstantAsMetadata shouldn't be memoized.
242*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
243*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CAM, ValueMapper(VM).mapMetadata(*CAM));
244*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.MD().count(CAM));
245*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CAM, ValueMapper(VM, RF_IgnoreMissingLocals).mapMetadata(*CAM));
246*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.MD().count(CAM));
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker // But it should respect a mapping that gets seeded.
249*9880d681SAndroid Build Coastguard Worker auto *N = MDTuple::get(C, None);
250*9880d681SAndroid Build Coastguard Worker VM.MD()[CAM].reset(N);
251*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N, ValueMapper(VM).mapMetadata(*CAM));
252*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N, ValueMapper(VM, RF_IgnoreMissingLocals).mapMetadata(*CAM));
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F2(
256*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F2"));
257*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
258*9880d681SAndroid Build Coastguard Worker VM[F.get()] = F2.get();
259*9880d681SAndroid Build Coastguard Worker auto *F2MD = ValueMapper(VM).mapMetadata(*CAM);
260*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.MD().count(CAM));
261*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(F2MD);
262*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(F2.get(), cast<ConstantAsMetadata>(F2MD)->getValue());
263*9880d681SAndroid Build Coastguard Worker }
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker #ifdef GTEST_HAS_DEATH_TEST
266*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
TEST(ValueMapperTest,mapMetadataLocalAsMetadata)267*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapMetadataLocalAsMetadata) {
268*9880d681SAndroid Build Coastguard Worker LLVMContext C;
269*9880d681SAndroid Build Coastguard Worker FunctionType *FTy =
270*9880d681SAndroid Build Coastguard Worker FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
271*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F(
272*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
273*9880d681SAndroid Build Coastguard Worker Argument &A = *F->arg_begin();
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker // mapMetadata doesn't support LocalAsMetadata. The only valid container for
276*9880d681SAndroid Build Coastguard Worker // LocalAsMetadata is a MetadataAsValue instance, so use it directly.
277*9880d681SAndroid Build Coastguard Worker auto *LAM = LocalAsMetadata::get(&A);
278*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
279*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(ValueMapper(VM).mapMetadata(*LAM), "Unexpected local metadata");
280*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(ValueMapper(VM, RF_IgnoreMissingLocals).mapMetadata(*LAM),
281*9880d681SAndroid Build Coastguard Worker "Unexpected local metadata");
282*9880d681SAndroid Build Coastguard Worker }
283*9880d681SAndroid Build Coastguard Worker #endif
284*9880d681SAndroid Build Coastguard Worker #endif
285*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapValueLocalAsMetadata)286*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapValueLocalAsMetadata) {
287*9880d681SAndroid Build Coastguard Worker LLVMContext C;
288*9880d681SAndroid Build Coastguard Worker FunctionType *FTy =
289*9880d681SAndroid Build Coastguard Worker FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
290*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F(
291*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
292*9880d681SAndroid Build Coastguard Worker Argument &A = *F->arg_begin();
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker auto *LAM = LocalAsMetadata::get(&A);
295*9880d681SAndroid Build Coastguard Worker auto *MAV = MetadataAsValue::get(C, LAM);
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker // The principled answer to a LocalAsMetadata of an unmapped SSA value would
298*9880d681SAndroid Build Coastguard Worker // be to return nullptr (regardless of RF_IgnoreMissingLocals).
299*9880d681SAndroid Build Coastguard Worker //
300*9880d681SAndroid Build Coastguard Worker // However, algorithms that use RemapInstruction assume that each instruction
301*9880d681SAndroid Build Coastguard Worker // only references SSA values from previous instructions. Arguments of
302*9880d681SAndroid Build Coastguard Worker // such as "metadata i32 %x" don't currently successfully maintain that
303*9880d681SAndroid Build Coastguard Worker // property. To keep RemapInstruction from crashing we need a non-null
304*9880d681SAndroid Build Coastguard Worker // return here, but we also shouldn't reference the unmapped local. Use
305*9880d681SAndroid Build Coastguard Worker // "metadata !{}".
306*9880d681SAndroid Build Coastguard Worker auto *N0 = MDTuple::get(C, None);
307*9880d681SAndroid Build Coastguard Worker auto *N0AV = MetadataAsValue::get(C, N0);
308*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
309*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(N0AV, ValueMapper(VM).mapValue(*MAV));
310*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, ValueMapper(VM, RF_IgnoreMissingLocals).mapValue(*MAV));
311*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.count(MAV));
312*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.count(&A));
313*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, VM.getMappedMD(LAM));
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker VM[MAV] = MAV;
316*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MAV, ValueMapper(VM).mapValue(*MAV));
317*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MAV, ValueMapper(VM, RF_IgnoreMissingLocals).mapValue(*MAV));
318*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(VM.count(MAV));
319*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.count(&A));
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker VM[MAV] = &A;
322*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&A, ValueMapper(VM).mapValue(*MAV));
323*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&A, ValueMapper(VM, RF_IgnoreMissingLocals).mapValue(*MAV));
324*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(VM.count(MAV));
325*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(VM.count(&A));
326*9880d681SAndroid Build Coastguard Worker }
327*9880d681SAndroid Build Coastguard Worker
TEST(ValueMapperTest,mapValueLocalAsMetadataToConstant)328*9880d681SAndroid Build Coastguard Worker TEST(ValueMapperTest, mapValueLocalAsMetadataToConstant) {
329*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
330*9880d681SAndroid Build Coastguard Worker auto *Int8 = Type::getInt8Ty(Context);
331*9880d681SAndroid Build Coastguard Worker FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), Int8, false);
332*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Function> F(
333*9880d681SAndroid Build Coastguard Worker Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker // Map a local value to a constant.
336*9880d681SAndroid Build Coastguard Worker Argument &A = *F->arg_begin();
337*9880d681SAndroid Build Coastguard Worker Constant &C = *ConstantInt::get(Int8, 42);
338*9880d681SAndroid Build Coastguard Worker ValueToValueMapTy VM;
339*9880d681SAndroid Build Coastguard Worker VM[&A] = &C;
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker // Look up the metadata-as-value wrapper. Don't crash.
342*9880d681SAndroid Build Coastguard Worker auto *MDA = MetadataAsValue::get(Context, ValueAsMetadata::get(&A));
343*9880d681SAndroid Build Coastguard Worker auto *MDC = MetadataAsValue::get(Context, ValueAsMetadata::get(&C));
344*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(isa<LocalAsMetadata>(MDA->getMetadata()));
345*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(isa<ConstantAsMetadata>(MDC->getMetadata()));
346*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(&C, ValueMapper(VM).mapValue(A));
347*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MDC, ValueMapper(VM).mapValue(*MDA));
348*9880d681SAndroid Build Coastguard Worker }
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker } // end namespace
351