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