From a0ef5ed742a81b134ac4438c3a4adc0c9a151b64 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 10 Sep 2007 23:42:42 +0000 Subject: [PATCH] Fix a buggy constant folding transformation when handling aliases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41818 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/ConstantFold.cpp | 11 +++++++---- .../InstCombine/2007-09-10-AliasConstFold.ll | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 5686a0e35fa..4dc1340f908 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -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(V2)) { - if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage()) - return ICmpInst::ICMP_NE; + // Don't try to decide equality of aliases. + if (!isa(CPR1) && !isa(CPR2)) + if (!CPR1->hasExternalWeakLinkage() || !CPR2->hasExternalWeakLinkage()) + return ICmpInst::ICMP_NE; } else { - // GlobalVals can never be null. assert(isa(V2) && "Canonicalization guarantee!"); - if (!CPR1->hasExternalWeakLinkage()) + // GlobalVals can never be null. Don't try to evaluate aliases. + if (!CPR1->hasExternalWeakLinkage() && !isa(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 index 00000000000..2dcb43926ba --- /dev/null +++ b/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep icmp +; PR1646 + +@__gthrw_pthread_cancel = alias weak i32 (i32)* @pthread_cancel ; [#uses=1] +@__gthread_active_ptr.5335 = internal constant i8* bitcast (i32 (i32)* @__gthrw_pthread_cancel to 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 ; [#uses=1] + %tmp2 = icmp ne i8* %tmp1, null ; [#uses=1] + ret i1 %tmp2 +}