Fix a buggy constant folding transformation when handling aliases.
authorChris Lattner <sabre@nondot.org>
Mon, 10 Sep 2007 23:42:42 +0000 (23:42 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 10 Sep 2007 23:42:42 +0000 (23:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41818 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp
test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll [new file with mode: 0644]

index 5686a0e35fa5633057196fe719fe941ba3ae66e8..4dc1340f908cc0ffc9c40b23471e81e4543fa666 100644 (file)
@@ -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 @@ static ICmpInst::Predicate evaluateICmpRelation(const Constant *V1,
     // 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 {
diff --git a/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll b/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
new file mode 100644 (file)
index 0000000..2dcb439
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep icmp
+; PR1646
+
+@__gthrw_pthread_cancel = alias weak i32 (i32)* @pthread_cancel                ; <i32 (i32)*> [#uses=1]
+@__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
+}