summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-07 23:32:02 +0000
committerChris Lattner <sabre@nondot.org>2009-03-07 23:32:02 +0000
commite31328319912be4aee3fd575e82bf5b370c08bc5 (patch)
tree47b011273a96c3d6c2d9cd362eee03c8469ef944 /llvm/lib
parentf653c2e18eed1c9d92d14387fdb890032c6fc7c2 (diff)
downloadbcm5719-llvm-e31328319912be4aee3fd575e82bf5b370c08bc5.tar.gz
bcm5719-llvm-e31328319912be4aee3fd575e82bf5b370c08bc5.zip
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
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/IPO/GlobalOpt.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index b93eb6b6d40..1d0993a7616 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -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.
OpenPOWER on IntegriCloud