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
This commit is contained in:
Chris Lattner 2007-09-10 23:42:42 +00:00
parent 0c0f7c935b
commit a0ef5ed742
2 changed files with 20 additions and 4 deletions

View 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 {

View File

@ -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
}