[LLVMbugs] [Bug 22758] New: [memcpyopt] Missed memcpy->memset optimization

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Mar 2 11:48:33 PST 2015


            Bug ID: 22758
           Summary: [memcpyopt] Missed memcpy->memset optimization
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: listmail at philipreames.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

We currently don't have a dedicated memcpy to memset conversion optimization. 
We're instead relying on a call slot optimization which is unneccessary
restrictive.  In particular, it is only the contents of the source region of
memory which needs to be known, not the contents of the destination memory.

In the example below, we put a non-zero value into the destination location,
and then immediately copy zeros over it.  We fail to convert the memcpy to a
memset if we run only memcpyopt.  

Note that DSE does eliminate the dead store and thus the combination works just
fine.  You could find an example that didn't (maybe a partially dead store?),
but I didn't bother for the purposes of reporting this.  

target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @foo([100000 x i32]*)

; Function Attrs: nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) #0

; Function Attrs: nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly,
i64, i32, i1) #0

define void @testfunc() {
  %src = alloca [100000 x i32], align 4
  %dst = alloca [100000 x i32], align 4
  %1 = bitcast [100000 x i32]* %src to i8*
  %2 = bitcast [100000 x i32]* %dst to i8*
  call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 400000, i32 4, i1 false)
  store i8 47, i8* %2
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* %1, i64 400000, i32 4, i1
  call void @foo([100000 x i32]* %dst)
  ret void

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/20150302/1c489a83/attachment.html>

More information about the llvm-bugs mailing list