How to change IR type?

hello,

I want to change the following IR:

%2 = tail call i16 @llvm.nvvm.read.ptx.sreg.tid.x() #2
%add = add i16 %mul6, %2
to

%2 = tail call i16v @llvm.nvvm.read.ptx.sreg.tid.x() #2
(i16v)%add = add i16 %mul6, (i16v)%2 //Here keep %mul6 i16 as it is.

I’m not familar with LLVM IR API, it’s not easy to get the type and change it right away. Seems need to create a new IR and replace the old one?

But it’s also hard to CreateCall() or CreateAdd(), hard to get the original IR’s info to fill in those CreateXXX parameter.

Any ideas or reference code?
How to learn LLVM IR API quickly?

In general you can use Value::mutateType to change the type of a value. You can’t change the types arbitrarily though, I think that the operands to “add” still need to have the same type.