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@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