<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Try that:<div class=""><br class=""></div><div class="">void f(int* a, int* b, int* c, int n) {<br class="">  for (int i = 0; i < n; ++i) {<br class="">    c[i] = a[i] + b[i];<br class="">  }<br class="">}</div><div class=""><br class=""></div><div class="">and compile with: clang++ -S -O3 -mavx2 a.cpp -o a.assembly</div><div class="">and look at the a.assembly file. You’ll get something such as:</div><div class=""><br class=""></div><div class="">LBB0_12:                                ## =>This Inner Loop Header: Depth=1<br class=""><span class="Apple-tab-span" style="white-space:pre">    </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>-96(%rax), %ymm0<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>-64(%rax), %ymm1<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>-32(%rax), %ymm2<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>(%rax), %ymm3<br class=""><span class="Apple-tab-span" style="white-space:pre">  </span>vpaddd<span class="Apple-tab-span" style="white-space:pre">      </span>-96(%r11), %ymm0, %ymm0<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>vpaddd<span class="Apple-tab-span" style="white-space:pre">      </span>-64(%r11), %ymm1, %ymm1<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>vpaddd<span class="Apple-tab-span" style="white-space:pre">      </span>-32(%r11), %ymm2, %ymm2<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>vpaddd<span class="Apple-tab-span" style="white-space:pre">      </span>(%r11), %ymm3, %ymm3<br class=""><span class="Apple-tab-span" style="white-space:pre">   </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>%ymm0, -96(%rbx)<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>%ymm1, -64(%rbx)<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>%ymm2, -32(%rbx)<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>vmovdqu<span class="Apple-tab-span" style="white-space:pre">     </span>%ymm3, (%rbx)<br class=""><span class="Apple-tab-span" style="white-space:pre">  </span>subq<span class="Apple-tab-span" style="white-space:pre">        </span>$-128, %r11<br class=""><span class="Apple-tab-span" style="white-space:pre">    </span>subq<span class="Apple-tab-span" style="white-space:pre">        </span>$-128, %rax<br class=""><span class="Apple-tab-span" style="white-space:pre">    </span>subq<span class="Apple-tab-span" style="white-space:pre">        </span>$-128, %rbx<br class=""><span class="Apple-tab-span" style="white-space:pre">    </span>addq<span class="Apple-tab-span" style="white-space:pre">        </span>$-32, %r9<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>jne<span class="Apple-tab-span" style="white-space:pre"> </span>LBB0_12<br class=""><br class=""></div><div class="">That’s vectorized code, unrolled by 4. So you get 4 * (32 / 4) = 32 elements processed every loop. The ymm registers shows that you are using 256 bits vector registers as available on avx cpu. With avx512, you would get zmm registers.</div><div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">François Fayard<br class=""></div></div>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Aug 17, 2017, at 8:44 PM, Craig Topper via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">I assume compiler knows that your only have 2 input values that you just added together 1000 times.<div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class=""><span style="font-size:12.8px" class="">int main(int argc, char** argv) {</span><div style="font-size:12.8px" class="">int a[1000], b[1000], c[1000]; int g=0;</div><span style="font-size:12.8px" class=""><div class="">int aa=atoi(argv[1]), bb=atoi(argv[2]);</div><div class="">for (int i=0; i<1000; i++) {</div><div class="">a[i]=aa, b[i]=bb;</div><div class=""> c[i]=a[i] + b[i];</div></span><div style="font-size:12.8px" class="">g+=c[i];<br class=""></div><div style="font-size:12.8px" class="">}</div></div></div><div class="gmail_extra"><br clear="all" class=""><div class=""><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 11:37 AM, hameeza ahmed <span dir="ltr" class=""><<a href="mailto:hahmed2305@gmail.com" target="_blank" class="">hahmed2305@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">why is it happening? is there any way to solve this?</div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 10:09 PM, hameeza ahmed <span dir="ltr" class=""><<a href="mailto:hahmed2305@gmail.com" target="_blank" class="">hahmed2305@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">even if i make my code as follows: vectorized instructions not get emitted. What to do?<div class=""><br class=""><div class=""><span class=""><div class="">int main(int argc, char** argv) {</div></span><div class="">int a[1000], b[1000], c[1000]; int g=0;</div><span class=""><div class="">int aa=atoi(argv[1]), bb=atoi(argv[2]);</div><div class="">for (int i=0; i<1000; i++) {</div><div class="">a[i]=aa, b[i]=bb;</div><div class=""> c[i]=a[i] + b[i];</div></span><div class="">g+=c[i];<br class=""></div><div class="">}</div><div class=""><br class=""></div><div class="">printf("sum: %d\n", g);</div><div class=""><br class=""></div><div class="">return 0;</div><div class="">}</div></div></div></div><div class="m_8769496259533141939HOEnZb"><div class="m_8769496259533141939h5"><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 10:03 PM, Craig Topper <span dir="ltr" class=""><<a href="mailto:craig.topper@gmail.com" target="_blank" class="">craig.topper@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">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.</div><div class="gmail_extra"><span class="m_8769496259533141939m_8963143490367774594HOEnZb"><font color="#888888" class=""><br clear="all" class=""><div class=""><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></font></span><div class=""><div class="m_8769496259533141939m_8963143490367774594h5">
<br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 10:01 AM, hameeza ahmed <span dir="ltr" class=""><<a href="mailto:hahmed2305@gmail.com" target="_blank" class="">hahmed2305@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">i removed printf from loop. Now getting no error. but the IR doesnot contain vectorized code. IR Output is as follows:<div class=""><div class="">; ModuleID = 'sum-vec.ll'</div><div class="">source_filename = "sum-vec.c"</div><div class="">target datalayout = "e-m:e-i64:64-f80:128-n8:16:32<wbr class="">:64-S128"</div><div class="">target triple = "x86_64-unknown-linux-gnu"</div><div class=""><br class=""></div><div class="">; Function Attrs: norecurse nounwind readnone uwtable</div><div class="">define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr #0 {</div><div class="">  ret i32 0</div><div class="">}</div><div class=""><br class=""></div><div class="">attributes #0 = { norecurse nounwind readnone uwtable "correctly-rounded-divide-sqrt<wbr class="">-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false<wbr class="">" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="fal<wbr class="">se" "no-trapping-math"="false" "stack-protector-buffer-size"=<wbr class="">"8" "target-cpu"="knl" "target-features"="+adx,+aes,+<wbr class="">avx,+avx2,+avx512cd,+avx512er,<wbr class="">+avx512f,+avx512pf,+bmi,+bmi2,<wbr class="">+cx16,+f16c,+fma,+fsgsbase,+fx<wbr class="">sr,+lzcnt,+mmx,+movbe,+pclmul,<wbr class="">+popcnt,+prefetchwt1,+rdrnd,+r<wbr class="">dseed,+rtm,+sse,+sse2,+sse3,+s<wbr class="">se4.1,+sse4.2,+ssse3,+x87,+xsa<wbr class="">ve,+xsaveopt" "unsafe-fp-math"="false" "use-soft-float"="false" }</div><div class=""><br class=""></div><div class="">!llvm.ident = !{!0}</div><div class=""><br class=""></div><div class="">!0 = !{!"clang version 4.0.0 (tags/RELEASE_400/final)"}</div></div><div class=""><br class=""></div><div class="">what to do? please help.</div><div class=""><br class=""></div></div><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186HOEnZb"><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186h5"><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 9:57 PM, Nemanja Ivanovic <span dir="ltr" class=""><<a href="mailto:nemanja.i.ibm@gmail.com" target="_blank" class="">nemanja.i.ibm@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">Move the printf out of the loop and it should vectorize just fine.<br class=""></div><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186m_-8326072891700327931HOEnZb"><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186m_-8326072891700327931h5"><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 6:52 PM, hameeza ahmed <span dir="ltr" class=""><<a href="mailto:hahmed2305@gmail.com" target="_blank" class="">hahmed2305@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">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.<div class=""><br class=""></div><div class="">as you pointed; When i changed my code to following:</div><div class=""><br class=""></div><div class=""><div class="">int main(int argc, char** argv) {</div><div class="">int a[1000], b[1000], c[1000];</div><div class="">int aa=atoi(argv[1]), bb=atoi(argv[2]);</div><div class="">for (int i=0; i<1000; i++) {</div><div class="">a[i]=aa, b[i]=bb;</div><div class=""> c[i]=a[i] + b[i];</div><div class="">printf("sum: %d\n", c[i]);</div><div class=""><br class=""></div><div class="">}</div></div><div class=""><br class=""></div><div class="">I am getting error remark: <unknown>:0:0: loop not vectorized: call instruction cannot be vectorized.</div><div class=""><br class=""></div><div class="">I am running following commands:</div><div class="">clang  -S -emit-llvm sum-vec.c -march=knl -O3 -mllvm -disable-llvm-optzns -o sum-vec.ll<br class=""></div><div class="">opt  -S -O3 -force-vector-width=64 sum-vec.ll -o sum-vec03.ll<br class=""></div><div class=""><br class=""></div><div class="">How to achieve this? Please help.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Thu, Aug 17, 2017 at 10:44 AM, Nemanja Ivanovic <span dir="ltr" class=""><<a href="mailto:nemanja.i.ibm@gmail.com" target="_blank" class="">nemanja.i.ibm@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">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.<br class=""></div><div class="gmail_extra"><br class=""><div class="gmail_quote"><div class=""><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186m_-8326072891700327931m_-9083316128729032069m_-5426776120835238504h5">On Wed, Aug 16, 2017 at 11:38 PM, hameeza ahmed via llvm-dev <span dir="ltr" class=""><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>></span> wrote:<br class=""></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=""><div class="m_8769496259533141939m_8963143490367774594m_2098162457735726186m_-8326072891700327931m_-9083316128729032069m_-5426776120835238504h5"><div dir="ltr" class="">Hello, <div class="">I have written the following code. when i try to vectorize it through opt. i am not getting vectorized instructions.</div><div class=""><br class=""></div><div class=""><div class="">#include <stdio.h></div><div class="">#include<stdlib.h></div><div class="">int main(int argc, char** argv) {</div><div class="">int sum=0; int a=atoi(argv[1]); int b=atoi(argv[2]);</div><div class="">for (int i=0;i<1000;i++)</div><div class="">{</div><div class="">sum+=a+b;<br class=""></div><div class="">}</div><div class=""><br class=""></div><div class="">printf("sum: %d\n", sum);</div><div class="">return 0;</div><div class="">}</div></div><div class="">i use following commands:</div><div class=""><div class="">clang  -S -emit-llvm sum-main.c -march=knl -O3 -mllvm -disable-llvm-optzns -o sum-main.ll</div></div><div class=""><div class="">opt  -S -O3 -force-vector-width=64 sum-main.ll -o sum-main03.ll</div></div><div class=""><br class=""></div><div class="">why is that so? where am i doing mistake? i am not getting vectorized operations rather getting scalar operations.</div><div class=""><br class=""></div><div class="">Please help.</div><div class=""><br class=""></div><div class="">Thank You</div><div class=""><br class=""></div><div class="">Regards</div><div class=""><br class=""></div></div>
<br class=""></div></div>______________________________<wbr class="">_________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-dev</a><br class="">
<br class=""></blockquote></div><br class=""></div>
</blockquote></div><br class=""></div>
</blockquote></div><br class=""></div>
</div></div></blockquote></div><br class=""></div>
</div></div></blockquote></div><br class=""></div></div></div>
</blockquote></div><br class=""></div>
</div></div></blockquote></div><br class=""></div>
</blockquote></div><br class=""></div>
_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></blockquote></div><br class=""></div></body></html>