MapMetadata: Allow unresolved metadata if it won't change
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 17 Mar 2015 01:14:40 +0000 (01:14 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 17 Mar 2015 01:14:40 +0000 (01:14 +0000)
Allow unresolved nodes through the `MapMetadata()` if
`RF_NoModuleLevelChanges`, since there's no remapping to do anyway.

This fixes PR22929.  I'll add a clang test as a follow-up.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232449 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/ValueMapper.cpp
unittests/Transforms/Utils/CMakeLists.txt
unittests/Transforms/Utils/ValueMapperTest.cpp [new file with mode: 0644]

index 49c0902addb44a9430c8a3fdc69dbc51af2df159..54c76887234d6b3552fb065201e6ed48283aba60 100644 (file)
@@ -291,14 +291,18 @@ static Metadata *MapMetadataImpl(const Metadata *MD,
     return nullptr;
   }
 
+  // Note: this cast precedes the Flags check so we always get its associated
+  // assertion.
   const MDNode *Node = cast<MDNode>(MD);
-  assert(Node->isResolved() && "Unexpected unresolved node");
 
   // If this is a module-level metadata and we know that nothing at the
   // module level is changing, then use an identity mapping.
   if (Flags & RF_NoModuleLevelChanges)
     return mapToSelf(VM, MD);
 
+  // Require resolved nodes whenever metadata might be remapped.
+  assert(Node->isResolved() && "Unexpected unresolved node");
+
   if (Node->isDistinct())
     return mapDistinctNode(Node, Cycles, VM, Flags, TypeMapper, Materializer);
 
index ffa1d49d380bdda2ba911f44387d84a18e1fd65d..517ff99ea46bc5a7dbb434b140e11db0e1527a72 100644 (file)
@@ -9,4 +9,5 @@ add_llvm_unittest(UtilsTests
   Cloning.cpp
   IntegerDivision.cpp
   Local.cpp
+  ValueMapperTest.cpp
   )
diff --git a/unittests/Transforms/Utils/ValueMapperTest.cpp b/unittests/Transforms/Utils/ValueMapperTest.cpp
new file mode 100644 (file)
index 0000000..137a260
--- /dev/null
@@ -0,0 +1,27 @@
+//===- ValueMapper.cpp - Unit tests for ValueMapper -----------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/Transforms/Utils/ValueMapper.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+TEST(ValueMapperTest, MapMetadataUnresolved) {
+  LLVMContext Context;
+  TempMDTuple T = MDTuple::getTemporary(Context, None);
+
+  ValueToValueMapTy VM;
+  EXPECT_EQ(T.get(), MapMetadata(T.get(), VM, RF_NoModuleLevelChanges));
+}
+
+}