[llvm] r270757 - IRLinker: fix double scheduling of mapping a global value because of an alias

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 14:00:45 PDT 2016


Author: mehdi_amini
Date: Wed May 25 16:00:44 2016
New Revision: 270757

URL: http://llvm.org/viewvc/llvm-project?rev=270757&view=rev
Log:
IRLinker: fix double scheduling of mapping a global value because of an alias

This test was hitting an assertion in the value mapper because
the IRLinker was trying to map two times @A while materializing
the initializer for @C.

Fix http://llvm.org/PR27850

Differential Revision: http://reviews.llvm.org/D20586

Added:
    llvm/trunk/test/Linker/alias-3.ll
Modified:
    llvm/trunk/lib/Linker/IRMover.cpp

Modified: llvm/trunk/lib/Linker/IRMover.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/IRMover.cpp?rev=270757&r1=270756&r2=270757&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/IRMover.cpp (original)
+++ llvm/trunk/lib/Linker/IRMover.cpp Wed May 25 16:00:44 2016
@@ -557,6 +557,17 @@ void IRLinker::materializeInitFor(Global
       return;
   }
 
+  // When linking a global for an alias, it will always be linked. However we
+  // need to check if it was not already scheduled to satify a reference from a
+  // regular global value initializer. We know if it has been schedule if the
+  // "New" GlobalValue that is mapped here for the alias is the same as the one
+  // already mapped. If there is an entry in the ValueMap but the value is
+  // different, it means that the value already had a definition in the
+  // destination module (linkonce for instance), but we need a new definition
+  // for the alias ("New" will be different.
+  if (ForAlias && ValueMap.lookup(Old) == New)
+    return;
+
   if (ForAlias || shouldLink(New, *Old))
     linkGlobalValueBody(*New, *Old);
 }

Added: llvm/trunk/test/Linker/alias-3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/alias-3.ll?rev=270757&view=auto
==============================================================================
--- llvm/trunk/test/Linker/alias-3.ll (added)
+++ llvm/trunk/test/Linker/alias-3.ll Wed May 25 16:00:44 2016
@@ -0,0 +1,13 @@
+; RUN: llvm-link %s -S -o - | FileCheck %s
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.9"
+
+; CHECK-DAG: @A = internal constant i8 1
+; CHECK-DAG: @B = alias i8, i8* @A
+; CHECK-DAG: @C = global [2 x i8*] [i8* @A, i8* @B]
+
+ at A = internal constant i8 1
+ at B = alias i8, i8* @A
+ at C = global [2 x i8*] [i8* @A, i8* @B]
+
+




More information about the llvm-commits mailing list