mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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
This commit is contained in:
@@ -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.
|
||||
|
Reference in New Issue
Block a user