[InstCombine] Canonicalize single element array store

Use the element type instead of the aggregate type.

Differential Revision: http://reviews.llvm.org/D9591

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2015-05-11 05:04:27 +00:00
parent 3101b1a432
commit c88eae46da
2 changed files with 29 additions and 0 deletions

View File

@ -880,6 +880,15 @@ static bool unpackStoreToAggregate(InstCombiner &IC, StoreInst &SI) {
}
}
if (auto *AT = dyn_cast<ArrayType>(T)) {
// If the array only have one element, we unpack.
if (AT->getNumElements() == 1) {
V = IC.Builder->CreateExtractValue(V, 0);
combineStoreToNewValue(IC, SI, V);
return true;
}
}
return false;
}

View File

@ -32,6 +32,26 @@ body:
ret void
}
define void @storeArrayOfA() {
body:
%0 = tail call i8* @allocmemory(i64 32)
%1 = bitcast i8* %0 to [1 x %A]*
; CHECK-LABEL: storeStructOfA
; CHECK: store %A__vtbl* @A__vtblZ
store [1 x %A] [%A { %A__vtbl* @A__vtblZ }], [1 x %A]* %1, align 8
ret void
}
define void @storeStructOfArrayOfA() {
body:
%0 = tail call i8* @allocmemory(i64 32)
%1 = bitcast i8* %0 to { [1 x %A] }*
; CHECK-LABEL: storeStructOfArrayOfA
; CHECK: store %A__vtbl* @A__vtblZ
store { [1 x %A] } { [1 x %A] [%A { %A__vtbl* @A__vtblZ }] }, { [1 x %A] }* %1, align 8
ret void
}
define %A @loadA() {
body:
%0 = tail call i8* @allocmemory(i64 32)