[llvm-commits] [llvm] r41818 - in /llvm/trunk: lib/VMCore/ConstantFold.cpp test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll

Chris Lattner sabre at nondot.org
Mon Sep 10 16:42:42 PDT 2007


Author: lattner
Date: Mon Sep 10 18:42:42 2007
New Revision: 41818

URL: http://llvm.org/viewvc/llvm-project?rev=41818&view=rev
Log:
Fix a buggy constant folding transformation when handling aliases.

Added:
    llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
Modified:
    llvm/trunk/lib/VMCore/ConstantFold.cpp

Modified: llvm/trunk/lib/VMCore/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantFold.cpp?rev=41818&r1=41817&r2=41818&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/ConstantFold.cpp (original)
+++ llvm/trunk/lib/VMCore/ConstantFold.cpp Mon Sep 10 18:42:42 2007
@@ -23,6 +23,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Function.h"
+#include "llvm/GlobalAlias.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
@@ -951,12 +952,14 @@
     // Now we know that the RHS is a GlobalValue or simple constant,
     // which (since the types must match) means that it's a ConstantPointerNull.
     if (const GlobalValue *CPR2 = dyn_cast<GlobalValue>(V2)) {
-      if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage())
-        return ICmpInst::ICMP_NE;
+      // Don't try to decide equality of aliases.
+      if (!isa<GlobalAlias>(CPR1) && !isa<GlobalAlias>(CPR2))
+        if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage())
+          return ICmpInst::ICMP_NE;
     } else {
-      // GlobalVals can never be null.
       assert(isa<ConstantPointerNull>(V2) && "Canonicalization guarantee!");
-      if (!CPR1->hasExternalWeakLinkage())
+      // GlobalVals can never be null.  Don't try to evaluate aliases.
+      if (!CPR1->hasExternalWeakLinkage() && !isa<GlobalAlias>(CPR1))
         return ICmpInst::ICMP_NE;
     }
   } else {

Added: llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll?rev=41818&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll Mon Sep 10 18:42:42 2007
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep icmp
+; PR1646
+
+ at __gthrw_pthread_cancel = alias weak i32 (i32)* @pthread_cancel		; <i32 (i32)*> [#uses=1]
+ at __gthread_active_ptr.5335 = internal constant i8* bitcast (i32 (i32)* @__gthrw_pthread_cancel to i8*)		; <i8**> [#uses=1]
+declare extern_weak i32 @pthread_cancel(i32)
+
+define i1 @__gthread_active_p() {
+entry:
+	%tmp1 = load i8** @__gthread_active_ptr.5335, align 4		; <i8*> [#uses=1]
+	%tmp2 = icmp ne i8* %tmp1, null		; <i1> [#uses=1]
+	ret i1 %tmp2
+}





More information about the llvm-commits mailing list