Skip to content

Commit c47a943

Browse files
committed
Merge 81810 from mainline.
When extending a memset range past the front, set the alignment of the memset region to the alignment of the new start address. llvm-svn: 81976
1 parent 318048b commit c47a943

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ void MemsetRanges::addStore(int64_t Start, StoreInst *SI) {
271271
if (Start < I->Start) {
272272
I->Start = Start;
273273
I->StartPtr = SI->getPointerOperand();
274+
I->Alignment = SI->getAlignment();
274275
}
275276

276277
// Now we know that Start <= I->End and Start >= I->Start (so the startpoint
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
; RUN: opt < %s -S -memcpyopt | FileCheck %s
2+
3+
; The resulting memset is only 4-byte aligned, despite containing
4+
; a 16-byte alignmed store in the middle.
5+
6+
; CHECK: call void @llvm.memset.i64(i8* %a01, i8 0, i64 16, i32 4)
7+
8+
define void @foo(i32* %p) {
9+
%a0 = getelementptr i32* %p, i64 0
10+
store i32 0, i32* %a0, align 4
11+
%a1 = getelementptr i32* %p, i64 1
12+
store i32 0, i32* %a1, align 16
13+
%a2 = getelementptr i32* %p, i64 2
14+
store i32 0, i32* %a2, align 4
15+
%a3 = getelementptr i32* %p, i64 3
16+
store i32 0, i32* %a3, align 4
17+
ret void
18+
}

0 commit comments

Comments
 (0)