diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-07 01:08:39 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-07 01:08:39 +0000 |
| commit | c1e407070844dd619893f12feae5d1217255a854 (patch) | |
| tree | d3faf2ec97e4ab252b90647d347430041db3bce9 /llvm/unittests/Transforms/Utils/ValueMapperTest.cpp | |
| parent | 49acebea0730f0b478bfb933e008750ca47cd878 (diff) | |
| download | llvm-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.cpp | 83 |
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 |
