mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
SROA: Handle a case of store size being smaller than allocation size
In this case, we are creating an x86_fp80 slice for a union from C where the padding bytes may contain real data. An x86_fp80 alloca is 16 bytes, and that's just fine. We can't, however, use regular loads and stores to access the slice, because the store size is only 10 bytes / 80 bits. Instead, use memcpy and memset. Fixes PR18726. Reviewed By: chandlerc Differential Revision: http://reviews.llvm.org/D5012 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216248 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -2422,6 +2422,7 @@ private:
|
||||
if (!VecTy && !IntTy &&
|
||||
(BeginOffset > NewAllocaBeginOffset ||
|
||||
EndOffset < NewAllocaEndOffset ||
|
||||
SliceSize != DL.getTypeStoreSize(AllocaTy) ||
|
||||
!AllocaTy->isSingleValueType() ||
|
||||
!DL.isLegalInteger(DL.getTypeSizeInBits(ScalarTy)) ||
|
||||
DL.getTypeSizeInBits(ScalarTy)%8 != 0)) {
|
||||
@ -2544,10 +2545,11 @@ private:
|
||||
|
||||
// If this doesn't map cleanly onto the alloca type, and that type isn't
|
||||
// a single value type, just emit a memcpy.
|
||||
bool EmitMemCpy
|
||||
= !VecTy && !IntTy && (BeginOffset > NewAllocaBeginOffset ||
|
||||
EndOffset < NewAllocaEndOffset ||
|
||||
!NewAI.getAllocatedType()->isSingleValueType());
|
||||
bool EmitMemCpy =
|
||||
!VecTy && !IntTy &&
|
||||
(BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset ||
|
||||
SliceSize != DL.getTypeStoreSize(NewAI.getAllocatedType()) ||
|
||||
!NewAI.getAllocatedType()->isSingleValueType());
|
||||
|
||||
// If we're just going to emit a memcpy, the alloca hasn't changed, and the
|
||||
// size hasn't been shrunk based on analysis of the viable range, this is
|
||||
|
Reference in New Issue
Block a user