<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - lifetime markers interfere with memcpy optimization"
   href="https://llvm.org/bugs/show_bug.cgi?id=29105">29105</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>lifetime markers interfere with memcpy optimization
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Scalar Optimizations
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>jmuizelaar@mozilla.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>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.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>