Michael Choi via llvm-dev
2017-Apr-08 01:16 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
Fantastic! It's working! Thank you so much Craig!!! On Fri, Apr 7, 2017 at 6:05 PM, Craig Topper <craig.topper at gmail.com> wrote:> It should be VectorType::get(Type::getInt32Ty(Context),4). You need the > word "get" after VectorType:: > > ~Craig > > On Fri, Apr 7, 2017 at 6:01 PM, Michael Choi <choimichael103 at gmail.com> > wrote: > >> Thank you so much Craig! >> >> I tried it. But still complaining. Here is the error message during >> compilation. >> >> HowToUseJIT_SIMD_FuncProto.cpp:94:55: error: expected unqualified-id >> VectorType::(Type::getInt32Ty( >> Context),4), >> >> >> >> THIS IS MY CODE: >> LLVMContext Context; >> >> std::unique_ptr<Module> Owner = make_unique<Module>("test", Context); >> Module *M = Owner.get(); >> >> Function *Add1F >> cast<Function>(M->getOrInsertFunction("add1", >> VectorType::(Type::getInt32Ty( >> Context),4), >> VectorType::(Type::getInt32Ty( >> Context),4), >> >> //Type::getInt32Ty(Context), >> //This is working fine >> //Type::getInt32Ty(Context), >> //This is working fine >> >> nullptr)); >> >> >> Any idea? >> Please let me know what is wrong in my code. >> >> Thanks, >> Michael >> >> On Fri, Apr 7, 2017 at 5:36 PM, Craig Topper <craig.topper at gmail.com> >> wrote: >> >>> To create a vector type you can call VectorType::get(<scalar element >>> type>, <num of elements>) and pass the output of that to the Type argument >>> when creating instructions. To get the scalar element type you can use the >>> get*Ty methods in IRBuilder or the Type::get*Ty methods. >>> >>> ~Craig >>> >>> On Fri, Apr 7, 2017 at 5:20 PM, Michael Choi via llvm-dev < >>> llvm-dev at lists.llvm.org> wrote: >>> >>>> I am working on AVX2 code generation by LLVM framework. >>>> >>>> I want to generate LLVM-IR code for the following code by C/C++ API >>>> from LLVM framework. I am using LLVM3.8. >>>> Basically, I want to generate TARGET (Refer to below) LLVM-IR code for >>>> SOURCE function by C/C++ API. >>>> As you see below, the AVX2 data type is __m256i which is vector type. >>>> How can I indicate vector type (function return type, input parameters) for >>>> IRBuiler by C/C++ APIs? >>>> >>>> I don't see any example online and please let me know if anybody has >>>> examples. >>>> >>>> >>>> >>>> SOURCE: >>>> #include "immintrin.h" >>>> __m256i sum(__m256i a, __m256i b) { >>>> return a+b; >>>> } >>>> >>>> TARGET: >>>> michael at michael-Precision-Tower-3420:~/Year_2017/work_DEMO$ cat >>>> avx2_add2.ll >>>> ; ModuleID = 'avx2_add2.c' >>>> target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" >>>> target triple = "x86_64-unknown-windows-cygnus" >>>> >>>> ; Function Attrs: nounwind >>>> define <4 x i64> @sum(<4 x i64> %a, <4 x i64> %b) #0 { >>>> %1 = alloca <4 x i64>, align 32 >>>> %2 = alloca <4 x i64>, align 32 >>>> store <4 x i64> %a, <4 x i64>* %1, align 32 >>>> store <4 x i64> %b, <4 x i64>* %2, align 32 >>>> %3 = load <4 x i64>, <4 x i64>* %1, align 32 >>>> %4 = load <4 x i64>, <4 x i64>* %2, align 32 >>>> %5 = add <4 x i64> %3, %4 >>>> ret <4 x i64> %5 >>>> } >>>> >>>> attributes #0 = { nounwind "disable-tail-calls"="false" >>>> "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" >>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false" >>>> "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2" >>>> "unsafe-fp-math"="false" "use-soft-float"="false" } >>>> >>>> !llvm.ident = !{!0} >>>> >>>> !0 = !{!"clang version 3.8.1 (tags/RELEASE_381/final)"} >>>> >>>> Thanks, >>>> Michael >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170407/a3a48e5e/attachment.html>
Michael Choi via llvm-dev
2017-Apr-10 23:34 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
Hi Craig, Thank you for your help! As you know from my first mail , I want to generrate LLVM-IR code (TARGET) by C/C++ APIs for below SOURCE source code (AVX2 code). I am using LLVM 3.8.x I can't find useful examples from online. So far, I just done following 'Done: Part-1' which gives me this, = LLVM-IR code from 'Done: Part-1' ========================================define i32 @add1(i32 %AnArg) { EntryBlock: %0 = add i32 1, %AnArg // Line 1: From C/C++ APIs below ret i32 %0 // Line 2: From C/C++ APIs below } =================================================================== Done: Part-1 ======================================================= Function *Add1F cast<Function>(M->getOrInsertFunction("add1", VectorType::get(Type::getInt32Ty(Context),4), VectorType::get(Type::getInt32Ty(Context),4), nullptr)); Value *One = builder.getInt32(1); // Get pointers to the integer argument of the add1 function... assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an arg Argument *ArgX = &*Add1F->arg_begin(); // Get the arg ArgX->setName("AnArg"); // Give it a nice symbolic name for fun. // Create the add instruction, inserting it into the end of BB. Value *Add = builder.CreateAdd(One, ArgX); // Create the return instruction and add it to the basic block builder.CreateRet(Add); ================================================================ QUESTION: 1. How to prepare the vector values? : Above 'Value *One = builder.getInt32(1);' for single value : I want to get vector value which has 4 value. How to do this? 2. How to prepare vector values for multiple vector type parameters? : Ex, Parameters __m256i a, __m256i b for sum(__m256i a, __m256i b) function 3. If you have any example code (C/C++ APIs implementation) for "__m256i sum(__m256i a, __m256i b)", please let me know. FYI: ////////////// B E L O W ////////////////////////////////////////////////////////////// SOURCE: #include "immintrin.h" __m256i sum(__m256i a, __m256i b) { return a+b; } TARGET: michael at michael-Precision-Tower-3420:~/Year_2017/work_DEMO$ cat avx2_add2.ll ; ModuleID = 'avx2_add2.c' target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-windows-cygnus" ; Function Attrs: nounwind define <4 x i64> @sum(<4 x i64> %a, <4 x i64> %b) #0 { %1 = alloca <4 x i64>, align 32 %2 = alloca <4 x i64>, align 32 store <4 x i64> %a, <4 x i64>* %1, align 32 store <4 x i64> %b, <4 x i64>* %2, align 32 %3 = load <4 x i64>, <4 x i64>* %1, align 32 %4 = load <4 x i64>, <4 x i64>* %2, align 32 %5 = add <4 x i64> %3, %4 ret <4 x i64> %5 } attributes #0 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" } !llvm.ident = !{!0} !0 = !{!"clang version 3.8.1 (tags/RELEASE_381/final)"} Thanks, Michael On Fri, Apr 7, 2017 at 6:16 PM, Michael Choi <choimichael103 at gmail.com> wrote:> Fantastic! It's working! Thank you so much Craig!!! > > > On Fri, Apr 7, 2017 at 6:05 PM, Craig Topper <craig.topper at gmail.com> > wrote: > >> It should be VectorType::get(Type::getInt32Ty(Context),4). You need the >> word "get" after VectorType:: >> >> ~Craig >> >> On Fri, Apr 7, 2017 at 6:01 PM, Michael Choi <choimichael103 at gmail.com> >> wrote: >> >>> Thank you so much Craig! >>> >>> I tried it. But still complaining. Here is the error message during >>> compilation. >>> >>> HowToUseJIT_SIMD_FuncProto.cpp:94:55: error: expected unqualified-id >>> VectorType::(Type::getInt32Ty( >>> Context),4), >>> >>> >>> >>> THIS IS MY CODE: >>> LLVMContext Context; >>> >>> std::unique_ptr<Module> Owner = make_unique<Module>("test", Context); >>> Module *M = Owner.get(); >>> >>> Function *Add1F >>> cast<Function>(M->getOrInsertFunction("add1", >>> VectorType::(Type::getInt32Ty( >>> Context),4), >>> VectorType::(Type::getInt32Ty( >>> Context),4), >>> >>> //Type::getInt32Ty(Context), >>> //This is working fine >>> //Type::getInt32Ty(Context), >>> //This is working fine >>> >>> nullptr)); >>> >>> >>> Any idea? >>> Please let me know what is wrong in my code. >>> >>> Thanks, >>> Michael >>> >>> On Fri, Apr 7, 2017 at 5:36 PM, Craig Topper <craig.topper at gmail.com> >>> wrote: >>> >>>> To create a vector type you can call VectorType::get(<scalar element >>>> type>, <num of elements>) and pass the output of that to the Type argument >>>> when creating instructions. To get the scalar element type you can use the >>>> get*Ty methods in IRBuilder or the Type::get*Ty methods. >>>> >>>> ~Craig >>>> >>>> On Fri, Apr 7, 2017 at 5:20 PM, Michael Choi via llvm-dev < >>>> llvm-dev at lists.llvm.org> wrote: >>>> >>>>> I am working on AVX2 code generation by LLVM framework. >>>>> >>>>> I want to generate LLVM-IR code for the following code by C/C++ API >>>>> from LLVM framework. I am using LLVM3.8. >>>>> Basically, I want to generate TARGET (Refer to below) LLVM-IR code for >>>>> SOURCE function by C/C++ API. >>>>> As you see below, the AVX2 data type is __m256i which is vector type. >>>>> How can I indicate vector type (function return type, input parameters) for >>>>> IRBuiler by C/C++ APIs? >>>>> >>>>> I don't see any example online and please let me know if anybody has >>>>> examples. >>>>> >>>>> >>>>> >>>>> SOURCE: >>>>> #include "immintrin.h" >>>>> __m256i sum(__m256i a, __m256i b) { >>>>> return a+b; >>>>> } >>>>> >>>>> TARGET: >>>>> michael at michael-Precision-Tower-3420:~/Year_2017/work_DEMO$ cat >>>>> avx2_add2.ll >>>>> ; ModuleID = 'avx2_add2.c' >>>>> target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" >>>>> target triple = "x86_64-unknown-windows-cygnus" >>>>> >>>>> ; Function Attrs: nounwind >>>>> define <4 x i64> @sum(<4 x i64> %a, <4 x i64> %b) #0 { >>>>> %1 = alloca <4 x i64>, align 32 >>>>> %2 = alloca <4 x i64>, align 32 >>>>> store <4 x i64> %a, <4 x i64>* %1, align 32 >>>>> store <4 x i64> %b, <4 x i64>* %2, align 32 >>>>> %3 = load <4 x i64>, <4 x i64>* %1, align 32 >>>>> %4 = load <4 x i64>, <4 x i64>* %2, align 32 >>>>> %5 = add <4 x i64> %3, %4 >>>>> ret <4 x i64> %5 >>>>> } >>>>> >>>>> attributes #0 = { nounwind "disable-tail-calls"="false" >>>>> "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" >>>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false" >>>>> "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2" >>>>> "unsafe-fp-math"="false" "use-soft-float"="false" } >>>>> >>>>> !llvm.ident = !{!0} >>>>> >>>>> !0 = !{!"clang version 3.8.1 (tags/RELEASE_381/final)"} >>>>> >>>>> Thanks, >>>>> Michael >>>>> >>>>> _______________________________________________ >>>>> LLVM Developers mailing list >>>>> llvm-dev at lists.llvm.org >>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>> >>>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/fec80bcd/attachment-0001.html>
Michael Choi via llvm-dev
2017-Apr-10 23:54 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
FYI. I am referencing attached implementation for my project. Thanks, Michael On Mon, Apr 10, 2017 at 4:34 PM, Michael Choi <choimichael103 at gmail.com> wrote:> Hi Craig, > > Thank you for your help! > > As you know from my first mail , I want to generrate LLVM-IR code (TARGET) > by C/C++ APIs for below SOURCE source code (AVX2 code). > > I am using LLVM 3.8.x > > I can't find useful examples from online. So far, I just done following > 'Done: Part-1' which gives me this, > = LLVM-IR code from 'Done: Part-1' =============================> ==========> define i32 @add1(i32 %AnArg) { > EntryBlock: > %0 = add i32 1, %AnArg // Line 1: From C/C++ APIs below > ret i32 %0 // Line 2: From C/C++ APIs below > } > ==================================================================> = Done: Part-1 =======================================================> Function *Add1F > cast<Function>(M->getOrInsertFunction("add1", > VectorType::get(Type:: > getInt32Ty(Context),4), > VectorType::get(Type:: > getInt32Ty(Context),4), > nullptr)); > > Value *One = builder.getInt32(1); > > // Get pointers to the integer argument of the add1 function... > assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an > arg > Argument *ArgX = &*Add1F->arg_begin(); // Get the arg > ArgX->setName("AnArg"); // Give it a nice > symbolic name for fun. > > // Create the add instruction, inserting it into the end of BB. > Value *Add = builder.CreateAdd(One, ArgX); > > // Create the return instruction and add it to the basic block > builder.CreateRet(Add); > ================================================================> > QUESTION: > 1. How to prepare the vector values? > : Above 'Value *One = builder.getInt32(1);' for single value > : I want to get vector value which has 4 value. How to do this? > 2. How to prepare vector values for multiple vector type parameters? > : Ex, Parameters __m256i a, __m256i b for sum(__m256i a, __m256i b) > function > 3. If you have any example code (C/C++ APIs implementation) for "__m256i > sum(__m256i a, __m256i b)", please let me know. > > > > FYI: > > ////////////// B E L O W ////////////////////////////// > //////////////////////////////// > SOURCE: > #include "immintrin.h" > __m256i sum(__m256i a, __m256i b) { > return a+b; > } > > TARGET: > michael at michael-Precision-Tower-3420:~/Year_2017/work_DEMO$ cat > avx2_add2.ll > ; ModuleID = 'avx2_add2.c' > target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" > target triple = "x86_64-unknown-windows-cygnus" > > ; Function Attrs: nounwind > define <4 x i64> @sum(<4 x i64> %a, <4 x i64> %b) #0 { > %1 = alloca <4 x i64>, align 32 > %2 = alloca <4 x i64>, align 32 > store <4 x i64> %a, <4 x i64>* %1, align 32 > store <4 x i64> %b, <4 x i64>* %2, align 32 > %3 = load <4 x i64>, <4 x i64>* %1, align 32 > %4 = load <4 x i64>, <4 x i64>* %2, align 32 > %5 = add <4 x i64> %3, %4 > ret <4 x i64> %5 > } > > attributes #0 = { nounwind "disable-tail-calls"="false" > "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" > "no-infs-fp-math"="false" "no-nans-fp-math"="false" > "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2" > "unsafe-fp-math"="false" "use-soft-float"="false" } > > !llvm.ident = !{!0} > > !0 = !{!"clang version 3.8.1 (tags/RELEASE_381/final)"} > > Thanks, > Michael > > On Fri, Apr 7, 2017 at 6:16 PM, Michael Choi <choimichael103 at gmail.com> > wrote: > >> Fantastic! It's working! Thank you so much Craig!!! >> >> >> On Fri, Apr 7, 2017 at 6:05 PM, Craig Topper <craig.topper at gmail.com> >> wrote: >> >>> It should be VectorType::get(Type::getInt32Ty(Context),4). You need >>> the word "get" after VectorType:: >>> >>> ~Craig >>> >>> On Fri, Apr 7, 2017 at 6:01 PM, Michael Choi <choimichael103 at gmail.com> >>> wrote: >>> >>>> Thank you so much Craig! >>>> >>>> I tried it. But still complaining. Here is the error message during >>>> compilation. >>>> >>>> HowToUseJIT_SIMD_FuncProto.cpp:94:55: error: expected unqualified-id >>>> >>>> VectorType::(Type::getInt32Ty(Context),4), >>>> >>>> >>>> >>>> THIS IS MY CODE: >>>> LLVMContext Context; >>>> >>>> std::unique_ptr<Module> Owner = make_unique<Module>("test", Context); >>>> Module *M = Owner.get(); >>>> >>>> Function *Add1F >>>> cast<Function>(M->getOrInsertFunction("add1", >>>> >>>> VectorType::(Type::getInt32Ty(Context),4), >>>> >>>> VectorType::(Type::getInt32Ty(Context),4), >>>> >>>> >>>> //Type::getInt32Ty(Context), //This is working fine >>>> >>>> //Type::getInt32Ty(Context), //This is working fine >>>> >>>> nullptr)); >>>> >>>> >>>> Any idea? >>>> Please let me know what is wrong in my code. >>>> >>>> Thanks, >>>> Michael >>>> >>>> On Fri, Apr 7, 2017 at 5:36 PM, Craig Topper <craig.topper at gmail.com> >>>> wrote: >>>> >>>>> To create a vector type you can call VectorType::get(<scalar element >>>>> type>, <num of elements>) and pass the output of that to the Type argument >>>>> when creating instructions. To get the scalar element type you can use the >>>>> get*Ty methods in IRBuilder or the Type::get*Ty methods. >>>>> >>>>> ~Craig >>>>> >>>>> On Fri, Apr 7, 2017 at 5:20 PM, Michael Choi via llvm-dev < >>>>> llvm-dev at lists.llvm.org> wrote: >>>>> >>>>>> I am working on AVX2 code generation by LLVM framework. >>>>>> >>>>>> I want to generate LLVM-IR code for the following code by C/C++ API >>>>>> from LLVM framework. I am using LLVM3.8. >>>>>> Basically, I want to generate TARGET (Refer to below) LLVM-IR code >>>>>> for SOURCE function by C/C++ API. >>>>>> As you see below, the AVX2 data type is __m256i which is vector type. >>>>>> How can I indicate vector type (function return type, input parameters) for >>>>>> IRBuiler by C/C++ APIs? >>>>>> >>>>>> I don't see any example online and please let me know if anybody has >>>>>> examples. >>>>>> >>>>>> >>>>>> >>>>>> SOURCE: >>>>>> #include "immintrin.h" >>>>>> __m256i sum(__m256i a, __m256i b) { >>>>>> return a+b; >>>>>> } >>>>>> >>>>>> TARGET: >>>>>> michael at michael-Precision-Tower-3420:~/Year_2017/work_DEMO$ cat >>>>>> avx2_add2.ll >>>>>> ; ModuleID = 'avx2_add2.c' >>>>>> target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" >>>>>> target triple = "x86_64-unknown-windows-cygnus" >>>>>> >>>>>> ; Function Attrs: nounwind >>>>>> define <4 x i64> @sum(<4 x i64> %a, <4 x i64> %b) #0 { >>>>>> %1 = alloca <4 x i64>, align 32 >>>>>> %2 = alloca <4 x i64>, align 32 >>>>>> store <4 x i64> %a, <4 x i64>* %1, align 32 >>>>>> store <4 x i64> %b, <4 x i64>* %2, align 32 >>>>>> %3 = load <4 x i64>, <4 x i64>* %1, align 32 >>>>>> %4 = load <4 x i64>, <4 x i64>* %2, align 32 >>>>>> %5 = add <4 x i64> %3, %4 >>>>>> ret <4 x i64> %5 >>>>>> } >>>>>> >>>>>> attributes #0 = { nounwind "disable-tail-calls"="false" >>>>>> "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" >>>>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false" >>>>>> "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2" >>>>>> "unsafe-fp-math"="false" "use-soft-float"="false" } >>>>>> >>>>>> !llvm.ident = !{!0} >>>>>> >>>>>> !0 = !{!"clang version 3.8.1 (tags/RELEASE_381/final)"} >>>>>> >>>>>> Thanks, >>>>>> Michael >>>>>> >>>>>> _______________________________________________ >>>>>> LLVM Developers mailing list >>>>>> llvm-dev at lists.llvm.org >>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>>> >>>>>> >>>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/16fd535f/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: HowToUseJIT.cpp Type: text/x-c++src Size: 4674 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/16fd535f/attachment.cpp>
Craig Topper via llvm-dev
2017-Apr-10 23:59 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
There are quite a few different ways to make constant vectors. You can create a splat of integer constants by using ConstantInt::get(<vector type>, <scalar value>) The scalar value can be an uint64_t or an APInt. Of if you have a Constant * you want to splat you can use ConstantVector::getSplat. If it's not a splat, you can use ConstantDataVector::get which will take an array of uint8_t, uint16_t, uint32_t, or uin64_t and auto infer the width and element count. Or you can use ConstantVector::get which will take an array of individual Constant * that all have the same scalar type. I don't have any complete code for implementing a function. Most of my interaction with these APIs has been in converting intrinsics into native IR in lib/IR/AutoUpgrade.cpp and clang's lib/CodeGen/CGBuiltin.cpp. I'm sure you'll find every function I mentioned above used in one or both of those files. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170410/df2e2db7/attachment-0001.html>