Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
Generics LLVM:强制转换结构的有效方法_Generics_Llvm - Fatal编程技术网

Generics LLVM:强制转换结构的有效方法

Generics LLVM:强制转换结构的有效方法,generics,llvm,Generics,Llvm,我有一个函数,它表示返回声明的泛型结构的共享泛型代码 %"GenStruct<System.__Canon>" = type <{ i32, i32 }> 其中,HelloWasm\u Program\u GenStructWithImplicitOp\u 1\u\u op\u Implicit是返回泛型类型的共享泛型方法。 我做了一个alloca来获得一个指针并将其转换。这是可行的,但效率似乎很低,因为它执行alloc和store/load操作。有没有办法解决这个问题

我有一个函数,它表示返回声明的泛型结构的共享泛型代码

%"GenStruct<System.__Canon>" = type <{ i32, i32 }>
其中,
HelloWasm\u Program\u GenStructWithImplicitOp\u 1\u\u op\u Implicit
是返回泛型类型的共享泛型方法。
我做了一个
alloca
来获得一个指针并将其转换。这是可行的,但效率似乎很低,因为它执行alloc和store/load操作。有没有办法解决这个问题,或者我不必担心,因为在最后的编译中(在本例中为Wasm),这将被优化掉?

这不是一个答案,只是一个评论。您可以通过生成的extractvalue、cast和insertvalue指令序列来实现强制转换,这应该会产生优秀的代码。在您的示例中,当然不会有强制转换,但更一般地说,在结构中强制转换基本字段可能是必要的,以便使用LLVM匹配.Net的升级规则。@arnt这当然会产生较小的Wast,谢谢。
%"GenStruct<string>" = type <{ i32, i32 }>
  %3 = call %"GenStruct<System.__Canon>" @"HelloWasm_Program_GenStructWithImplicitOp_1<System___Canon>__op_Implicit"(i8* %1, i8* %CastPtr)
  %memStruct = alloca %"GenStruct<System.__Canon>"
  store %"GenStruct<System.__Canon>" %3, %"GenStruct<System.__Canon>"* %memStruct,
  %castPtr = bitcast %"GenStruct<System.__Canon>"* %memStruct to %"GenStruct<string>"*
  %Loadop_Implicit_return = load %"GenStruct<string>", %"GenStruct<string>"* %castPtr