mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
Allow SROA of vectors. Removing this caused a
huge performance regression in something we care about. This may not be final fix. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58718 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
53997b0745
commit
c0bc547c99
@ -531,8 +531,6 @@ void SROA::isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasVector = false;
|
|
||||||
|
|
||||||
// Walk through the GEP type indices, checking the types that this indexes
|
// Walk through the GEP type indices, checking the types that this indexes
|
||||||
// into.
|
// into.
|
||||||
for (; I != E; ++I) {
|
for (; I != E; ++I) {
|
||||||
@ -551,19 +549,13 @@ void SROA::isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
|
|||||||
// integer. Specifically, consider A[0][i]. We cannot know that the user
|
// integer. Specifically, consider A[0][i]. We cannot know that the user
|
||||||
// isn't doing invalid things like allowing i to index an out-of-range
|
// isn't doing invalid things like allowing i to index an out-of-range
|
||||||
// subscript that accesses A[1]. Because of this, we have to reject SROA
|
// subscript that accesses A[1]. Because of this, we have to reject SROA
|
||||||
// of any accesses into structs where any of the components are variables.
|
// of any accesses into structs where any of the components are variables.
|
||||||
if (IdxVal->getZExtValue() >= AT->getNumElements())
|
if (IdxVal->getZExtValue() >= AT->getNumElements())
|
||||||
return MarkUnsafe(Info);
|
return MarkUnsafe(Info);
|
||||||
|
} else if (const VectorType *VT = dyn_cast<VectorType>(*I)) {
|
||||||
|
if (IdxVal->getZExtValue() >= VT->getNumElements())
|
||||||
|
return MarkUnsafe(Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note if we've seen a vector type yet
|
|
||||||
hasVector |= isa<VectorType>(*I);
|
|
||||||
|
|
||||||
// Don't SROA pointers into vectors, unless all indices are zero. When all
|
|
||||||
// indices are zero, we only consider this GEP as a bitcast, but will still
|
|
||||||
// not consider breaking up the vector.
|
|
||||||
if (hasVector && !IsAllZeroIndices)
|
|
||||||
return MarkUnsafe(Info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are any non-simple uses of this getelementptr, make sure to reject
|
// If there are any non-simple uses of this getelementptr, make sure to reject
|
||||||
|
Loading…
x
Reference in New Issue
Block a user