[llvm-dev] How to insert vector type input parameter for function in C/C++ API?

Michael Choi via llvm-dev llvm-dev at lists.llvm.org
Mon Apr 10 16:34:55 PDT 2017


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>


More information about the llvm-dev mailing list