Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LLVM/Clang如何实现RVO_Llvm_Rvo - Fatal编程技术网

LLVM/Clang如何实现RVO

LLVM/Clang如何实现RVO,llvm,rvo,Llvm,Rvo,我试图弄清楚LLVM是如何实现RVO的。对我来说,最简单的想法是在参数中设置指针,并将需要从函数返回的任何值memcpy指向它。然后运行memcpyoptpass,如果可能,通过这种方式获得RVO 似乎这就是-fno-elide构造函数所发生的情况: define void @_Z3fooic(%struct.X* noalias sret, i32, i8 signext) #0 { .. call void @llvm.memcpy.p0i8.p0i8.i64(i8* %12

我试图弄清楚LLVM是如何实现RVO的。对我来说,最简单的想法是在参数中设置指针,并将需要从函数返回的任何值memcpy指向它。然后运行
memcpyopt
pass,如果可能,通过这种方式获得RVO

似乎这就是-fno-elide构造函数所发生的情况:

define void @_Z3fooic(%struct.X* noalias sret, i32, i8 signext) #0 {
    ..
    call void @llvm.memcpy.p0i8.p0i8.i64(i8* %12, i8* %13, i64 20, i32 4, i1 false)
    ret void
如果没有,所有操作似乎都直接应用于
%0

这是正确的理解还是我遗漏了一些注意事项

编辑

define i8 @make_positive_point_x_I64_y_I64(i64 %x, i64 %y, %Point*) {
entry:
  %1 = or i64 %x, %y
  %2 = icmp slt i64 %1, 0
  br i1 %2, label %exit, label %merge

merge:                                            ; preds = %entry
  %3 = alloca %Point, align 8
  call void @"Point___new_self_&Point_x_I64_y_I64"(%Point* nonnull %3, i64 %x, i64 %y)
  %4 = bitcast %Point* %0 to i8*
  %5 = bitcast %Point* %3 to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %4, i8* %5, i64 zext (%Point* inttoptr (i64 16 to %Point*) to i64), i32 1, i1 false)
  br label %exit

exit:                                             ; preds = %entry, %merge
  %.0 = phi i8 [ 0, %merge ], [ 1, %entry ]
  ret i8 %.0
}
似乎
memcpyopt
是不够的,因为它没有意识到它可以使用
%0
而不是
%3