tlively added inline comments.
================
Comment at: clang/include/clang/Basic/BuiltinsWebAssembly.def:29
+// Bulk memory builtins
+TARGET_BUILTIN(__builtin_wasm_memory_init, "vIiv*ii", "", "bulk-memory")
+TARGET_BUILTIN(__builtin_wasm_data_drop, "vIi", "", "bulk-memory")
----------------
aheejin wrote:
> - When do we use `Ii` instead of `i`?
> - Shouldn't we add the memory index field as well, even if that means a user 
> always has to set it to 0? Are we gonna add a new builtin once multiple 
> memories are available?
> - Shouldn't the segment index, segment offset, and the size operands be `Ui` 
> because they cannot be negative?
We use `Ii` instead of `i` when the argument needs to be a compile time 
constant because it is encoded as a literal in the corresponding instruction.

I was imagining that we could add a new builtin once multiple memories are 
available, but perhaps it would be better to add an argument to the builtin now 
and error out if it is not zero. I will do that.

Yes, `Ui` seems reasonable.




================
Comment at: clang/include/clang/Basic/BuiltinsWebAssembly.def:30
+TARGET_BUILTIN(__builtin_wasm_memory_init, "vIiv*ii", "", "bulk-memory")
+TARGET_BUILTIN(__builtin_wasm_data_drop, "vIi", "", "bulk-memory")
+
----------------
aheejin wrote:
> The same thing..
> - Shouldn't the segment index be `Ui`?
> - Shouldn't we add the memory index field as well?
> 
 - Done

 - This intrinsic doesn't have a memory index, since it doesn't write anything 
into memory.


================
Comment at: clang/lib/CodeGen/CGBuiltin.cpp:13477
+    if (!SegArg->isIntegerConstantExpr(SegConst, getContext()))
+      llvm_unreachable("Constant arg isn't actually constant?");
+    llvm::Type *SegType = ConvertType(SegArg->getType());
----------------
aheejin wrote:
> Not sure if we can use `llvm_unreachable` here, because we can certainly 
> reach here if a user uses this builtin with a non-const variable. In this 
> file people often just used `assert` for user errors, which is not ideal 
> either.
> 
> I haven't used it myself, but looking at the code, the recommended way to 
> signal an error looks like to use [[ 
> https://github.com/llvm/llvm-project/blob/db7fbcb038f095622a3e6847ecd6ff80bdc2483a/clang/lib/CodeGen/CodeGenFunction.h#L2092-L2094
>  | `CodeGenFunction::ErrorUnsupported` ]] function, as in [[ 
> https://github.com/llvm/llvm-project/blob/0e04ebdcda44ef90e25abd0a2e65cc755ae8bc37/clang/lib/CodeGen/CGBuiltin.cpp#L2458-L2460
>  | here ]]. We used `llvm_unreachable` for SIMD builtins too, but maybe we 
> can fix it later.
`llvm_unreachable` is appropriate here because non-constant expressions will 
have been caught earlier by the type checking.

A follow-up PR updating SIMD intrinsics to use `Ui` and appropriate error 
handling sounds good.


================
Comment at: clang/lib/CodeGen/CGBuiltin.cpp:13488
+    Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_memory_init,
+                                        {SegType, IdxType, DstType});
+    return Builder.CreateCall(Callee, Args);
----------------
aheejin wrote:
> Do we need to pass types here to make intrinsic names overloaded like 
> `llvm.wasm.memory.init.i32.i32.i8`, unless this intrinsic also support 
> operands of other types, which it doesn't? The same for `data.drop` builtin.
Fixed. I had been copying `llvm.memcpy`, but I agree it is better to not be 
polymorphic.


================
Comment at: llvm/include/llvm/IR/IntrinsicsWebAssembly.td:121
+             llvm_i32_ty, llvm_i32_ty],
+            [IntrWriteMem, IntrArgMemOnly, WriteOnly<1>],
+            "", [SDNPMemOperand]>;
----------------
aheejin wrote:
> - Isn't the pointer argument number not 1 but 2?
> - I guess this should have `IntrHasSideEffects` as well, as in `data.drop`?
> - I don't know much how they are handled differently in compilation, but 
> because we can access some other memory, which holds the segment part, during 
> execution, how about `IntrInaccessibleMemOrArgMemOnly` instead of 
> `IntrArgMemOnly`?
- Yes, good catch.

- Ok, I'm not sure it's necessary but it can't hurt.

- I'm not sure this is necessary either, but again it can't hurt. Better safe 
than sorry.


================
Comment at: llvm/include/llvm/IR/IntrinsicsWebAssembly.td:122
+            [IntrWriteMem, IntrArgMemOnly, WriteOnly<1>],
+            "", [SDNPMemOperand]>;
+def int_wasm_data_drop :
----------------
aheejin wrote:
> I told you we needed this, but on second thought, because we don't really use 
> `MachineMemOperand`, maybe we don't need it..? :$ The [[ 
> https://github.com/llvm/llvm-project/blob/dc2c93017f8bf2a2c10b8e024f8f4a6409dbeeee/llvm/include/llvm/IR/Intrinsics.td#L483-L496
>  | standard memcpy/memmove/memset intrinsics ]] don't have it either. So if 
> the code runs ok without these I think we can delete it. The same for 
> `data.drop` intrinsic. Sorry for the incorrect info and confusion.
No problem!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57736/new/

https://reviews.llvm.org/D57736



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to