Hi,
I would like to work with the LLVM IRs generated by TVM when importing and compiling a module from ONNX, but I have some trouble understanding the output .ll
files. I know everything I need is written somewhere in the codebase, but it is not so easy to find things when you do not know exactly what you are looking for .
Right now what puzzles me is how the inputs of a function are modified. My simplest example is an ONNX node that perform element-by-element multiplication, this is what I get by printing mod.astext
after importing the model:
def @main(%X: Tensor[(1, 8), float32], %Y: Tensor[(1, 8), float32]) -> Tensor[(1, 8), float32] { multiply(%X, %Y) /* ty=Tensor[(1, 8), float32] */ }
Instead this is the top function in the generated .ll
file after compilation:
define dllexport i32 @fused_multiply(i8* noalias nocapture readonly, i8* noalias nocapture readnone, i32)
So, what now? There used to be two 1x8 tensors, now there are two pointers to 8-bit ints and one 32-bit int. What type of input am I supposed to give to the LLVM function to obtain the same behavior?
Where is a good starting point to find this kind of information in TVM’s source code?