forked from OSchip/llvm-project
fix a serious pessimization that Tron on IRC pointed out where we would
"boolify" pointers, generating really awful code because getting the pointer value requires a load itself. Before: _foo: movb $1, _X.b ret _get: xorl %ecx, %ecx movb _X.b, %al testb %al, %al movl $_Y, %eax cmove %ecx, %eax ret With the xform disabled: _foo: movl $_Y, _X ret _get: movl _X, %eax ret llvm-svn: 66351
This commit is contained in:
parent
f653c2e18e
commit
e313283199
|
@ -1531,10 +1531,12 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) {
|
|||
const Type *GVElType = GV->getType()->getElementType();
|
||||
|
||||
// If GVElType is already i1, it is already shrunk. If the type of the GV is
|
||||
// an FP value or vector, don't do this optimization because a select between
|
||||
// them is very expensive and unlikely to lead to later simplification.
|
||||
// an FP value, pointer or vector, don't do this optimization because a select
|
||||
// between them is very expensive and unlikely to lead to later
|
||||
// simplification. In these cases, we typically end up with "cond ? v1 : v2"
|
||||
// where v1 and v2 both require constant pool loads, a big loss.
|
||||
if (GVElType == Type::Int1Ty || GVElType->isFloatingPoint() ||
|
||||
isa<VectorType>(GVElType))
|
||||
isa<PointerType>(GVElType) || isa<VectorType>(GVElType))
|
||||
return false;
|
||||
|
||||
// Walk the use list of the global seeing if all the uses are load or store.
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {@X = internal global i32}
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
target triple = "i386-apple-darwin7"
|
||||
@X = internal global i32* null ; <i32**> [#uses=2]
|
||||
@Y = internal global i32 0 ; <i32*> [#uses=1]
|
||||
|
||||
define void @foo() nounwind {
|
||||
entry:
|
||||
store i32* @Y, i32** @X, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32* @get() nounwind {
|
||||
entry:
|
||||
%0 = load i32** @X, align 4 ; <i32*> [#uses=1]
|
||||
ret i32* %0
|
||||
}
|
Loading…
Reference in New Issue