[PATCH] D42871: [InstCombine] Simplify MemTransferInst's source and dest alignments separately
Daniel Neilson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 2 15:04:02 PST 2018
dneilson created this revision.
dneilson added a reviewer: majnemer.
Herald added a reviewer: bollu.
This change is part of step five in the series of changes to remove alignment argument from
memcpy/memmove/memset in favour of alignment attributes. In particular, this changes the
InstCombine pass to cease using the deprecated MemoryIntrinsic::getAlignment() method, and
instead we use the separate getSourceAlignment and getDestAlignment APIs to simplify
the source and destination alignment attributes separately.
Steps:
Step 1) Remove alignment parameter and create alignment parameter attributes for
memcpy/memmove/memset. ( https://reviews.llvm.org/rL322965, https://reviews.llvm.org/rC322964, https://reviews.llvm.org/rL322963 )
Step 2) Expand the IRBuilder API to allow creation of memcpy/memmove with differing
source and dest alignments. ( https://reviews.llvm.org/rL323597 )
Step 3) Update Clang to use the new IRBuilder API. ( https://reviews.llvm.org/rC323617 )
Step 4) Update Polly to use the new IRBuilder API. ( https://reviews.llvm.org/rL323618 )
Step 5) Update LLVM passes that create memcpy/memmove calls to use the new IRBuilder API,
and those that use use MemIntrinsicInst::[get|set]Alignment() to use [get|set]DestAlignment()
and [get|set]SourceAlignment() instead. ( https://reviews.llvm.org/rL323886, r323891 )
Step 6) Remove the single-alignment IRBuilder API for memcpy/memmove, and the
MemIntrinsicInst::[get|set]Alignment() methods.
Reference
http://lists.llvm.org/pipermail/llvm-dev/2015-August/089384.html
http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html
Repository:
rL LLVM
https://reviews.llvm.org/D42871
Files:
lib/Transforms/InstCombine/InstCombineCalls.cpp
test/Transforms/InstCombine/memcpy-from-global.ll
test/Transforms/InstCombine/memmove.ll
Index: test/Transforms/InstCombine/memmove.ll
===================================================================
--- test/Transforms/InstCombine/memmove.ll
+++ test/Transforms/InstCombine/memmove.ll
@@ -17,7 +17,7 @@
define void @test2(i8* %A, i32 %N) {
;; dest can't alias source since we can't write to source!
;; CHECK-LABEL: test2
- ;; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %A, i8* align 1 getelementptr inbounds ([33 x i8], [33 x i8]* @S, i{{32|64}} 0, i{{32|64}} 0), i32 %N, i1 false)
+ ;; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %A, i8* align 16 getelementptr inbounds ([33 x i8], [33 x i8]* @S, i{{32|64}} 0, i{{32|64}} 0), i32 %N, i1 false)
;; CHECK-NEXT: ret void
call void @llvm.memmove.p0i8.p0i8.i32(i8* %A, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @S, i32 0, i32 0), i32 %N, i1 false)
ret void
Index: test/Transforms/InstCombine/memcpy-from-global.ll
===================================================================
--- test/Transforms/InstCombine/memcpy-from-global.ll
+++ test/Transforms/InstCombine/memcpy-from-global.ll
@@ -60,7 +60,7 @@
; CHECK-NEXT: getelementptr inbounds [124 x i8], [124 x i8]*
; use @G instead of %A
-; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 8 %{{.*}}, i8* align 8 getelementptr inbounds (%T, %T* @G, i64 0, i32 0)
+; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 8 %{{.*}}, i8* align 16 getelementptr inbounds (%T, %T* @G, i64 0, i32 0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a, i8* align 4 bitcast (%T* @G to i8*), i64 124, i1 false)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %b, i8* align 4 %a, i64 124, i1 false)
call void @bar(i8* %b)
Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -184,14 +184,18 @@
}
Instruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {
- unsigned DstAlign = getKnownAlignment(MI->getArgOperand(0), DL, MI, &AC, &DT);
- unsigned SrcAlign = getKnownAlignment(MI->getArgOperand(1), DL, MI, &AC, &DT);
- unsigned MinAlign = std::min(DstAlign, SrcAlign);
- unsigned CopyAlign = MI->getAlignment();
-
- // FIXME: Check & simplify source & dest alignments separately
- if (CopyAlign < MinAlign) {
- MI->setAlignment(MinAlign);
+ unsigned DstAlign = getKnownAlignment(MI->getRawDest(), DL, MI, &AC, &DT);
+ unsigned CopyDstAlign = MI->getDestAlignment();
+ if (CopyDstAlign < DstAlign){
+ MI->setDestAlignment(DstAlign);
+ return MI;
+ }
+
+ auto* MTI = cast<MemTransferInst>(MI);
+ unsigned SrcAlign = getKnownAlignment(MTI->getRawSource(), DL, MI, &AC, &DT);
+ unsigned CopySrcAlign = MTI->getSourceAlignment();
+ if (CopySrcAlign < SrcAlign) {
+ MTI->setSourceAlignment(SrcAlign);
return MI;
}
@@ -237,8 +241,8 @@
// If the memcpy/memmove provides better alignment info than we can
// infer, use it.
- SrcAlign = std::max(SrcAlign, CopyAlign);
- DstAlign = std::max(DstAlign, CopyAlign);
+ SrcAlign = std::max(SrcAlign, CopySrcAlign);
+ DstAlign = std::max(DstAlign, CopyDstAlign);
Value *Src = Builder.CreateBitCast(MI->getArgOperand(1), NewSrcPtrTy);
Value *Dest = Builder.CreateBitCast(MI->getArgOperand(0), NewDstPtrTy);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42871.132691.patch
Type: text/x-patch
Size: 3396 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180202/d150690e/attachment.bin>
More information about the llvm-commits
mailing list