[llvm-commits] [llvm] r102519 - in /llvm/trunk: lib/VMCore/Metadata.cpp test/Transforms/GlobalOpt/metadata.ll

Chris Lattner sabre at nondot.org
Wed Apr 28 13:16:13 PDT 2010


Author: lattner
Date: Wed Apr 28 15:16:12 2010
New Revision: 102519

URL: http://llvm.org/viewvc/llvm-project?rev=102519&view=rev
Log:
fix PR6112 - When globalopt (or any other pass) does RAUW(@G, %G), 
metadata references in non-function-local MDNodes should drop to 
null.


Added:
    llvm/trunk/test/Transforms/GlobalOpt/metadata.ll
Modified:
    llvm/trunk/lib/VMCore/Metadata.cpp

Modified: llvm/trunk/lib/VMCore/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Metadata.cpp?rev=102519&r1=102518&r2=102519&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Metadata.cpp (original)
+++ llvm/trunk/lib/VMCore/Metadata.cpp Wed Apr 28 15:16:12 2010
@@ -178,6 +178,13 @@
   free(this);
 }
 
+/// isFunctionLocalValue - Return true if this is a value that would require a
+/// function-local MDNode.
+static bool isFunctionLocalValue(Value *V) {
+  return isa<Instruction>(V) || isa<Argument>(V) || isa<BasicBlock>(V) ||
+         (isa<MDNode>(V) && cast<MDNode>(V)->isFunctionLocal());
+}
+
 MDNode *MDNode::getMDNode(LLVMContext &Context, Value *const *Vals,
                           unsigned NumVals, FunctionLocalness FL,
                           bool Insert) {
@@ -188,8 +195,7 @@
     for (unsigned i = 0; i != NumVals; ++i) {
       Value *V = Vals[i];
       if (!V) continue;
-      if (isa<Instruction>(V) || isa<Argument>(V) || isa<BasicBlock>(V) ||
-          (isa<MDNode>(V) && cast<MDNode>(V)->isFunctionLocal())) {
+      if (isFunctionLocalValue(V)) {
         isFunctionLocal = true;
         break;
       }
@@ -262,6 +268,13 @@
 void MDNode::replaceOperand(MDNodeOperand *Op, Value *To) {
   Value *From = *Op;
 
+  // If is possible that someone did GV->RAUW(inst), replacing a global variable
+  // with an instruction or some other function-local object.  If this is a
+  // non-function-local MDNode, it can't point to a function-local object.
+  // Handle this case by implicitly dropping the MDNode reference to null.
+  if (!isFunctionLocal() && To && isFunctionLocalValue(To))
+    To = 0;
+  
   if (From == To)
     return;
 

Added: llvm/trunk/test/Transforms/GlobalOpt/metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/metadata.ll?rev=102519&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/metadata.ll (added)
+++ llvm/trunk/test/Transforms/GlobalOpt/metadata.ll Wed Apr 28 15:16:12 2010
@@ -0,0 +1,19 @@
+; RUN: opt -S -globalopt metadata.ll | FileCheck %s
+
+; PR6112 - When globalopt does RAUW(@G, %G), the metadata reference should drop
+; to null.
+ at G = internal global i8** null
+
+define i32 @main(i32 %argc, i8** %argv) {
+; CHECK: @main
+; CHECK: %G = alloca
+  store i8** %argv, i8*** @G
+  ret i32 0
+}
+
+!named = !{!0}
+
+; CHECK: !0 = metadata !{null}
+!0 = metadata !{i8*** @G}
+
+





More information about the llvm-commits mailing list