<div dir="ltr">Hi, <div><br></div><div>if I have the following IR, LICM doesn't work again, even if I use '-loop-rotate' firstly. In this IR, the return value of intrinsic function "foo" is used by another function "func2" as parameter.  However, for the intrinsic function "foo", the parameters are still loop invariant. Do you know why this happens? Thanks a lot.</div><div><br></div><div>Regards,</div><div><br></div><div>Xiangyang<br><div><br></div><div><div>; Function Attrs: uwtable</div><div>define void @_Z5func1ii(i32 %a, i32 %b) #0 {</div><div>  br label %1</div><div><br></div><div>; <label>:1                                       ; preds = %0, %1</div><div>  %i.01 = phi i32 [ 0, %0 ], [ %6, %1 ]</div><div>  %2 = call i32 @llvm.foo(i32 %a, i32 1)</div><div>  %3 = call i32 @_Z5func2ii(i32 %b, i32 %2)</div><div>  %4 = call i32 @llvm.foo(i32 %a, i32 2)</div><div>  %5 = call i32 @_Z5func2ii(i32 %3, i32 %4)</div><div>  %6 = add nsw i32 %i.01, 1</div><div>  %7 = icmp slt i32 %6, 10</div><div>  br i1 %7, label %1, label %8</div><div><br></div><div>; <label>:8                                       ; preds = %1</div><div>  ret void</div><div>}</div><div><br></div><div>; Function Attrs: nounwind readonly</div><div>declare i32 @llvm.foo(i32, i32) #1</div><div><br></div><div>declare i32 @_Z5func2ii(i32, i32) #2</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-12-01 13:16 GMT-05:00 Xiangyang Guo <span dir="ltr"><<a href="mailto:eceguo@gmail.com" target="_blank">eceguo@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Thanks for your reply, escha,<div><br></div><div>Yes, -loop-rorate makes it work.</div><div><br></div><div>Regards,</div><div><br></div><div>Xiangyang</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2015-12-01 12:48 GMT-05:00  <span dir="ltr"><<a href="mailto:escha@apple.com" target="_blank">escha@apple.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span><br>
> On Dec 1, 2015, at 9:30 AM, Xiangyang Guo via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> Hi, All,<br>
><br>
> Suppose I define one memory read only intrinsic function "foo" in Intrinsics.td like this<br>
><br>
> def int_foo : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrReadMem]>;<br>
><br>
> Suppose I have the following IR, which means the intrinsic function "foo" is called 10 times in a loop. Since the parameters of function "foo" are invariant and the function "foo" is defined as "IntrReadMem". I assume the '-licm' can move the function call 'foo' out of the loop body. However, after I use "opt test.ll -basicaa -licm -S", the function call 'foo' is still inside the loop body. Do I misunderstand something here? Any suggestions are appreciated. Thanks a lot.<br>
<br>
</span>Does it work if you call -loop-rotate first? Loop unrolling requires loops to be in canonicalized rotated form first, so I wouldn’t be surprised if LICM does as well.<br>
<br>
—escha</blockquote></div><br></div>
</div></div></blockquote></div><br></div>