Hi all, When I approach the class CodeGenC in src/target/source/codegen_c.h I notice it could not generate native C code as noted.
CodeGenC does not aim at generating C codes consumed by MSVC or GCC, Rather, it’s providing infrastructural abstraction for C variants like CUDA and OpenCL-C. You might find some odd variant features, e.g., type int3 for a vector of 3 ints. For native C code generator, see CodeGenLLVM.
I’ve already read the class CodeGenLLVM and LLVMModuleNode but failed to find any information relevant.
Question “Possible to convert a LLVM IR back to C code?” from @joyalbin got some answers. Does it mean native C code could only be generated by a LLVM backend which has been moved? But @comaniac suggests to directly generate C code from TVM IR. Does it mean CodeGenC or another way in CodeGenLLVM ?
I think “native C-code generation” is used for more niche use cases like micro-TVM / embedded, but yes, we don’t typically emit native C code for convolution kernels etc.
There are a couple of different targets that output something so similar to C (e.g. CUDA, OpenCL) that some some of the functionality was extracted into a common superclass, CodeGenC. When you specify target="c", it uses CodeGenCHost in codegen_c_host.cc. You might look at that for more guidance.
Note that with microTVM we need to use tir.disable_vectorize option to avoid generating such int3 types.
I think the previous warnings that this might not generate fully-optimized code in some situations is correct.