hameeza ahmed via llvm-dev
2017-Aug-17 17:09 UTC
[llvm-dev] unable to emit vectorized code in LLVM IR
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,+
>>
rdseed,+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/cbce6c04/attachment.html>
hameeza ahmed via llvm-dev
2017-Aug-17 18:37 UTC
[llvm-dev] unable to emit vectorized code in LLVM IR
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>
Craig Topper via llvm-dev
2017-Aug-17 18:44 UTC
[llvm-dev] unable to emit vectorized code in LLVM IR
I assume compiler knows that your only have 2 input values that you just
added together 1000 times.
Despite the fact that you stored to a[i] and b[i] here, nothing reads them
other than the addition in the same loop iteration. So the compiler easily
removed the a and b arrays. Same with 'c', it's not read outside the
loop
so it doesn't need to exist. So the compiler turned your loop body back
into g+= aa + bb; And since the loop is 1000 iterations and aa and bb never
change this got further simplified to (aa+bb)*1000.
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];
}
~Craig
On Thu, Aug 17, 2017 at 11:37 AM, hameeza ahmed <hahmed2305 at gmail.com>
wrote:
> 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/1b1000a2/attachment.html>