[llvm-bugs] [Bug 29105] New: lifetime markers interfere with memcpy optimization
via llvm-bugs
llvm-bugs at lists.llvm.org
Tue Aug 23 10:02:13 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=29105
Bug ID: 29105
Summary: lifetime markers interfere with memcpy optimization
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Scalar Optimizations
Assignee: unassignedbugs at nondot.org
Reporter: jmuizelaar at mozilla.com
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
The following code is not optimized completely by opt:
%Foo = type { [2048 x i64] }
; Function Attrs: uwtable
define void @baz() unnamed_addr #0 {
entry-block:
%x.sroa.0 = alloca [2048 x i64], align 8
%tmp0 = alloca [2048 x i64], align 8
%0 = bitcast [2048 x i64]* %tmp0 to i8*
%tmp2 = alloca %Foo, align 8
%x.sroa.0.0..sroa_cast6 = bitcast [2048 x i64]* %x.sroa.0 to i8*
call void @llvm.lifetime.start(i64 16384, i8* %x.sroa.0.0..sroa_cast6)
call void @llvm.lifetime.start(i64 16384, i8* %0)
call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 16384, i32 8, i1 false)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %x.sroa.0.0..sroa_cast6, i8* %0, i64
16384, i32 8, i1 false)
call void @llvm.lifetime.end(i64 16384, i8* %0)
%1 = bitcast %Foo* %tmp2 to i8*
call void @llvm.lifetime.start(i64 16384, i8* %1)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %x.sroa.0.0..sroa_cast6, i64
16384, i32 8, i1 false)
call void @bar(%Foo* noalias nocapture nonnull dereferenceable(16384) %tmp2)
call void @llvm.lifetime.end(i64 16384, i8* %1)
call void @llvm.lifetime.end(i64 16384, i8* %x.sroa.0.0..sroa_cast6)
ret void
}
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start(i64, i8* nocapture) #1
; Function Attrs: argmemonly nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture
readonly, i64, i32, i1) #1
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end(i64, i8* nocapture) #1
; Function Attrs: uwtable
declare void @bar(%Foo* noalias nocapture readonly dereferenceable(16384))
unnamed_addr #0
; Function Attrs: argmemonly nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i32, i1)
#1
attributes #0 = { uwtable }
attributes #1 = { argmemonly nounwind }
It gets optimized to:
; Function Attrs: uwtable
define void @baz() unnamed_addr #0 {
entry-block:
%x.sroa.0 = alloca [2048 x i64], align 8
%tmp2 = alloca %Foo, align 8
%x.sroa.0.0..sroa_cast6 = bitcast [2048 x i64]* %x.sroa.0 to i8*
call void @llvm.lifetime.start(i64 16384, i8* %x.sroa.0.0..sroa_cast6)
%x.sroa.08 = bitcast [2048 x i64]* %x.sroa.0 to i8*
call void @llvm.memset.p0i8.i64(i8* %x.sroa.08, i8 0, i64 16384, i32 8, i1
false)
%0 = bitcast %Foo* %tmp2 to i8*
call void @llvm.lifetime.start(i64 16384, i8* %0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %x.sroa.0.0..sroa_cast6, i64
16384, i32 8, i1 false)
call void @bar(%Foo* noalias nocapture nonnull dereferenceable(16384) %tmp2)
call void @llvm.lifetime.end(i64 16384, i8* %0)
call void @llvm.lifetime.end(i64 16384, i8* %x.sroa.0.0..sroa_cast6)
ret void
}
instead of:
; Function Attrs: uwtable
define void @baz() unnamed_addr #0 {
entry-block:
%tmp2 = alloca %Foo, align 8
%0 = bitcast %Foo* %tmp2 to i8*
call void @llvm.lifetime.start(i64 16384, i8* %0)
call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 16384, i32 8, i1 false)
call void @bar(%Foo* noalias nocapture nonnull dereferenceable(16384) %tmp2)
call void @llvm.lifetime.end(i64 16384, i8* %0)
ret void
}
which is achieved by running the results of opt through opt again.
Removing the lifetime markers from the original causes the optimizer to produce
the correct result the first time through.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160823/f9fcd3af/attachment.html>
More information about the llvm-bugs
mailing list