Skip to content

Commit 54067c5

Browse files
committed
[SROA] Use memcpy if type size does not match store size
The original memcpy also copies the padding, so make sure that this is still the case after splitting. Fixes llvm#64081.
1 parent 3f199cb commit 54067c5

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

Diff for: llvm/lib/Transforms/Scalar/SROA.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3285,6 +3285,7 @@ class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
32853285
(BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset ||
32863286
SliceSize !=
32873287
DL.getTypeStoreSize(NewAI.getAllocatedType()).getFixedValue() ||
3288+
!DL.typeSizeEqualsStoreSize(NewAI.getAllocatedType()) ||
32883289
!NewAI.getAllocatedType()->isSingleValueType());
32893290

32903291
// If we're just going to emit a memcpy, the alloca hasn't changed, and the

Diff for: llvm/test/Transforms/SROA/pr64081.ll

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33

44
%B = type { i1, i3 }
55

6-
; FIXME: This is a miscompile.
76
define void @test(i7 %x) {
87
; CHECK-LABEL: define void @test(
98
; CHECK-SAME: i7 [[X:%.*]]) {
109
; CHECK-NEXT: bb:
1110
; CHECK-NEXT: [[RES:%.*]] = alloca [2 x i8], align 1
11+
; CHECK-NEXT: [[TMP_SROA_0:%.*]] = alloca i1, align 8
1212
; CHECK-NEXT: [[TMP_SROA_1:%.*]] = alloca i3, align 1
1313
; CHECK-NEXT: store i7 [[X]], ptr [[TMP_SROA_1]], align 1
14-
; CHECK-NEXT: store i1 undef, ptr [[RES]], align 1
14+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[RES]], ptr align 8 [[TMP_SROA_0]], i64 1, i1 false)
1515
; CHECK-NEXT: [[TMP_SROA_1_0_RES_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[RES]], i64 1
16-
; CHECK-NEXT: [[TMP_SROA_1_0_TMP_SROA_1_0_COPYLOAD:%.*]] = load i3, ptr [[TMP_SROA_1]], align 1
17-
; CHECK-NEXT: store i3 [[TMP_SROA_1_0_TMP_SROA_1_0_COPYLOAD]], ptr [[TMP_SROA_1_0_RES_SROA_IDX]], align 1
16+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP_SROA_1_0_RES_SROA_IDX]], ptr align 1 [[TMP_SROA_1]], i64 1, i1 false)
1817
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @use(ptr [[RES]])
1918
; CHECK-NEXT: ret void
2019
;

0 commit comments

Comments
 (0)