[llvm-dev] unable to emit vectorized code in LLVM IR

hameeza ahmed via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 17 11:37:19 PDT 2017


why is it happening? is there any way to solve this?

On Thu, Aug 17, 2017 at 10:09 PM, hameeza ahmed <hahmed2305 at gmail.com>
wrote:

> even if i make my code as follows: vectorized instructions not get
> emitted. What to do?
>
> int main(int argc, char** argv) {
> int a[1000], b[1000], c[1000]; int g=0;
> int aa=atoi(argv[1]), bb=atoi(argv[2]);
> for (int i=0; i<1000; i++) {
> a[i]=aa, b[i]=bb;
>  c[i]=a[i] + b[i];
> g+=c[i];
> }
>
> printf("sum: %d\n", g);
>
> return 0;
> }
>
> On Thu, Aug 17, 2017 at 10:03 PM, Craig Topper <craig.topper at gmail.com>
> wrote:
>
>> Did you remove the printf completely? Meaning that nothing accesses 'c'
>> after the loop? If so it got removed as dead code because it had no visible
>> effect.
>>
>> ~Craig
>>
>> On Thu, Aug 17, 2017 at 10:01 AM, hameeza ahmed <hahmed2305 at gmail.com>
>> wrote:
>>
>>> i removed printf from loop. Now getting no error. but the IR doesnot
>>> contain vectorized code. IR Output is as follows:
>>> ; ModuleID = 'sum-vec.ll'
>>> source_filename = "sum-vec.c"
>>> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>>> target triple = "x86_64-unknown-linux-gnu"
>>>
>>> ; Function Attrs: norecurse nounwind readnone uwtable
>>> define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 {
>>>   ret i32 0
>>> }
>>>
>>> attributes #0 = { norecurse nounwind readnone uwtable
>>> "correctly-rounded-divide-sqrt-fp-math"="false"
>>> "disable-tail-calls"="false" "less-precise-fpmad"="false"
>>> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
>>> "no-jump-tables"="false" "no-nans-fp-math"="false"
>>> "no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
>>> "stack-protector-buffer-size"="8" "target-cpu"="knl"
>>> "target-features"="+adx,+aes,+avx,+avx2,+avx512cd,+avx512er,
>>> +avx512f,+avx512pf,+bmi,+bmi2,+cx16,+f16c,+fma,+fsgsbase,+fx
>>> sr,+lzcnt,+mmx,+movbe,+pclmul,+popcnt,+prefetchwt1,+rdrnd,+r
>>> dseed,+rtm,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsaveopt"
>>> "unsafe-fp-math"="false" "use-soft-float"="false" }
>>>
>>> !llvm.ident = !{!0}
>>>
>>> !0 = !{!"clang version 4.0.0 (tags/RELEASE_400/final)"}
>>>
>>> what to do? please help.
>>>
>>>
>>> On Thu, Aug 17, 2017 at 9:57 PM, Nemanja Ivanovic <
>>> nemanja.i.ibm at gmail.com> wrote:
>>>
>>>> Move the printf out of the loop and it should vectorize just fine.
>>>>
>>>> On Thu, Aug 17, 2017 at 6:52 PM, hameeza ahmed <hahmed2305 at gmail.com>
>>>> wrote:
>>>>
>>>>> I want to vectorize the user given inputs. when opt does vectorization
>>>>> user supplied inputs (from a text file) will be added using AVX vector
>>>>> instructions.
>>>>>
>>>>> as you pointed; When i changed my code to following:
>>>>>
>>>>> int main(int argc, char** argv) {
>>>>> int a[1000], b[1000], c[1000];
>>>>> int aa=atoi(argv[1]), bb=atoi(argv[2]);
>>>>> for (int i=0; i<1000; i++) {
>>>>> a[i]=aa, b[i]=bb;
>>>>>  c[i]=a[i] + b[i];
>>>>> printf("sum: %d\n", c[i]);
>>>>>
>>>>> }
>>>>>
>>>>> I am getting error remark: <unknown>:0:0: loop not vectorized: call
>>>>> instruction cannot be vectorized.
>>>>>
>>>>> I am running following commands:
>>>>> clang  -S -emit-llvm sum-vec.c -march=knl -O3 -mllvm
>>>>> -disable-llvm-optzns -o sum-vec.ll
>>>>> opt  -S -O3 -force-vector-width=64 sum-vec.ll -o sum-vec03.ll
>>>>>
>>>>> How to achieve this? Please help.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Thu, Aug 17, 2017 at 10:44 AM, Nemanja Ivanovic <
>>>>> nemanja.i.ibm at gmail.com> wrote:
>>>>>
>>>>>> I'm not sure what you expect to have vectorized here. If you look at
>>>>>> the emitted code, there's no loop. It's just an add and a multiply as you
>>>>>> might expect when adding a loop-invariant sum 1000 times in a loop.
>>>>>>
>>>>>> On Wed, Aug 16, 2017 at 11:38 PM, hameeza ahmed via llvm-dev <
>>>>>> llvm-dev at lists.llvm.org> wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>> I have written the following code. when i try to vectorize it
>>>>>>> through opt. i am not getting vectorized instructions.
>>>>>>>
>>>>>>> #include <stdio.h>
>>>>>>> #include<stdlib.h>
>>>>>>> int main(int argc, char** argv) {
>>>>>>> int sum=0; int a=atoi(argv[1]); int b=atoi(argv[2]);
>>>>>>> for (int i=0;i<1000;i++)
>>>>>>> {
>>>>>>> sum+=a+b;
>>>>>>> }
>>>>>>>
>>>>>>> printf("sum: %d\n", sum);
>>>>>>> return 0;
>>>>>>> }
>>>>>>> i use following commands:
>>>>>>> clang  -S -emit-llvm sum-main.c -march=knl -O3 -mllvm
>>>>>>> -disable-llvm-optzns -o sum-main.ll
>>>>>>> opt  -S -O3 -force-vector-width=64 sum-main.ll -o sum-main03.ll
>>>>>>>
>>>>>>> why is that so? where am i doing mistake? i am not getting
>>>>>>> vectorized operations rather getting scalar operations.
>>>>>>>
>>>>>>> Please help.
>>>>>>>
>>>>>>> Thank You
>>>>>>>
>>>>>>> Regards
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> 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/20170817/5298990b/attachment.html>


More information about the llvm-dev mailing list