aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-07 01:08:39 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-07 01:08:39 +0000
commitc1e407070844dd619893f12feae5d1217255a854 (patch)
treed3faf2ec97e4ab252b90647d347430041db3bce9 /llvm/unittests/Transforms/Utils/ValueMapperTest.cpp
parent49acebea0730f0b478bfb933e008750ca47cd878 (diff)
downloadllvm-c1e407070844dd619893f12feae5d1217255a854.zip
llvm-c1e407070844dd619893f12feae5d1217255a854.tar.gz
llvm-c1e407070844dd619893f12feae5d1217255a854.tar.bz2
ValueMapper: Make LocalAsMetadata match function-local Values
Start treating LocalAsMetadata similarly to function-local members of the Value hierarchy in MapValue and MapMetadata. - Don't memoize them. - Return nullptr if they are missing. This also cleans up ConstantAsMetadata to stop listening to the RF_IgnoreMissingLocals flag. llvm-svn: 265631
Diffstat (limited to 'llvm/unittests/Transforms/Utils/ValueMapperTest.cpp')
-rw-r--r--llvm/unittests/Transforms/Utils/ValueMapperTest.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp
index 865cb5d..56e407b 100644
--- a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp
+++ b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
@@ -126,4 +127,86 @@ TEST(ValueMapperTest, MapMetadataSeededWithNull) {
EXPECT_EQ(nullptr, MapMetadata(D, VM, RF_None));
}
+TEST(ValueMapperTest, MapMetadataLocalAsMetadata) {
+ LLVMContext C;
+ FunctionType *FTy =
+ FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
+ std::unique_ptr<Function> F(
+ Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
+ Argument &A = *F->arg_begin();
+
+ auto *LAM = LocalAsMetadata::get(&A);
+ ValueToValueMapTy VM;
+ EXPECT_EQ(nullptr, MapMetadata(LAM, VM));
+ EXPECT_EQ(nullptr, MapMetadata(LAM, VM, RF_IgnoreMissingLocals));
+ EXPECT_EQ(None, VM.getMappedMD(LAM));
+
+ VM.MD()[LAM].reset(LAM);
+ EXPECT_EQ(LAM, MapMetadata(LAM, VM));
+ EXPECT_EQ(LAM, MapMetadata(LAM, VM, RF_IgnoreMissingLocals));
+
+ auto *N = MDNode::get(C, None);
+ VM.MD()[LAM].reset(N);
+ EXPECT_EQ(N, MapMetadata(LAM, VM));
+ EXPECT_EQ(N, MapMetadata(LAM, VM, RF_IgnoreMissingLocals));
+}
+
+TEST(ValueMapperTest, MapMetadataConstantAsMetadata) {
+ LLVMContext C;
+ FunctionType *FTy =
+ FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
+ std::unique_ptr<Function> F(
+ Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
+
+ auto *CAM = ConstantAsMetadata::get(F.get());
+ {
+ ValueToValueMapTy VM;
+ EXPECT_EQ(CAM, MapMetadata(CAM, VM));
+ EXPECT_TRUE(VM.MD().count(CAM));
+ VM.MD().erase(CAM);
+ EXPECT_EQ(CAM, MapMetadata(CAM, VM, RF_IgnoreMissingLocals));
+ EXPECT_TRUE(VM.MD().count(CAM));
+
+ auto *N = MDNode::get(C, None);
+ VM.MD()[CAM].reset(N);
+ EXPECT_EQ(N, MapMetadata(CAM, VM));
+ EXPECT_EQ(N, MapMetadata(CAM, VM, RF_IgnoreMissingLocals));
+ }
+
+ std::unique_ptr<Function> F2(
+ Function::Create(FTy, GlobalValue::ExternalLinkage, "F2"));
+ ValueToValueMapTy VM;
+ VM[F.get()] = F2.get();
+ auto *F2MD = MapMetadata(CAM, VM);
+ EXPECT_TRUE(VM.MD().count(CAM));
+ EXPECT_TRUE(F2MD);
+ EXPECT_EQ(F2.get(), cast<ConstantAsMetadata>(F2MD)->getValue());
+}
+
+TEST(ValueMapperTest, MapValueLocalAsMetadata) {
+ LLVMContext C;
+ FunctionType *FTy =
+ FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
+ std::unique_ptr<Function> F(
+ Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
+ Argument &A = *F->arg_begin();
+
+ auto *LAM = LocalAsMetadata::get(&A);
+ auto *MAV = MetadataAsValue::get(C, LAM);
+
+ ValueToValueMapTy VM;
+ EXPECT_EQ(nullptr, MapValue(MAV, VM));
+ EXPECT_EQ(nullptr, MapValue(MAV, VM, RF_IgnoreMissingLocals));
+ EXPECT_FALSE(VM.count(MAV));
+ EXPECT_FALSE(VM.count(&A));
+
+ VM[MAV] = MAV;
+ EXPECT_EQ(MAV, MapValue(MAV, VM));
+ EXPECT_EQ(MAV, MapValue(MAV, VM, RF_IgnoreMissingLocals));
+
+ VM[MAV] = &A;
+ EXPECT_EQ(&A, MapValue(MAV, VM));
+ EXPECT_EQ(&A, MapValue(MAV, VM, RF_IgnoreMissingLocals));
+}
+
} // end namespace