mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-03 09:21:02 +00:00
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:
parent
0c0f7c935b
commit
a0ef5ed742
@ -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 {
|
||||
|
13
test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
Normal file
13
test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user