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