Michael Choi via llvm-dev
2017-Apr-08 00:20 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170407/754f93c4/attachment.html>
Craig Topper via llvm-dev
2017-Apr-08 00:36 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
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/e1744335/attachment.html>
Michael Choi via llvm-dev
2017-Apr-08 01:01 UTC
[llvm-dev] How to insert vector type input parameter for function in C/C++ API?
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/f6e0eacd/attachment-0001.html>
Possibly Parallel Threads
- How to insert vector type input parameter for function in C/C++ API?
- How to insert vector type input parameter for function in C/C++ API?
- LLVM FunctionType cannot be returned as VectorType?
- LLVM FunctionType cannot be returned as VectorType?
- LLVM FunctionType cannot be returned as VectorType?