aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/IPO
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
commite1d0fa1c2288e7141ee86c0c82093d75500ea144 (patch)
tree93ae22bf054a1b089894325d6d6118d32a10af44 /lib/Transforms/IPO
parentaca7e1c1fec05b4d818ac5867fce8e269b59680b (diff)
downloadexternal_llvm-e1d0fa1c2288e7141ee86c0c82093d75500ea144.zip
external_llvm-e1d0fa1c2288e7141ee86c0c82093d75500ea144.tar.gz
external_llvm-e1d0fa1c2288e7141ee86c0c82093d75500ea144.tar.bz2
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO')
-rw-r--r--lib/Transforms/IPO/GlobalOpt.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index b93eb6b..1d0993a 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/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.