<div dir="ltr">There are a couple things going on.<div><br></div><div>InstCombine prefers to canonicalize ule/uge/sle/sge compares with constants to ult/ugt/slt/sgt by adjusting the constant. This allows transforms in InstCombine and other passes to not need to check for two forms of equivalent operations. The backends sometimes have to reverse this to get better code.</div><div><br></div><div>There's a second transform that's turning the signed compare into an unsigned compare because the loop counter starts at zero and counts up to a positive number so the value will never be negative. Unsigned compares are easier for some optimizations to reason about so the compiler tries to make unsigned compares when it can.</div><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 10, 2021 at 4:54 AM zbh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="line-height:1.7;color:rgb(0,0,0);font-size:14px;font-family:Arial"><p style="margin:0px"><br></p><div style="margin:0px">I understand it's <span style="font-family:arial;white-space:pre-wrap"> equivalent.But I don't know the benefit. And I don't understand why this statement changed to</span></div><div style="margin:0px"><span style="font-family:arial;white-space:pre-wrap">not eq in the last either.</span></div><div style="margin:0px"><span style="font-family:arial;white-space:pre-wrap">···</span></div><div style="margin:0px"><font face="arial"><span style="white-space:pre-wrap">  %exitcond = icmp ne i32 %inc, 129</span></font></div><p style="margin:0px">···</p><p style="margin:0px"><br></p><div style="margin:0px">Thanks</div><div style="margin:0px">Rock</div><div style="zoom:1"></div><div id="gmail-m_4184160060651867058divNeteaseMailCard"></div><p style="margin:0px"><br></p><pre><br>At 2021-08-10 19:23:59, "Dimitry Andric" <<a href="mailto:dimitry@andric.com" target="_blank">dimitry@andric.com</a>> wrote:
>On 10 Aug 2021, at 13:16, zbh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:
>> 
>> I find the value 128 chaned to 129. So I want to know what's the purpose to changed the form?Can you give some example?
>
>(icmp reference: <<a href="https://llvm.org/docs/LangRef.html#id303f" target="_blank">https://llvm.org/docs/LangRef.html#id303f</a>>)
>
>Before, it uses "icmp sle" which is "signed <=", so effectively "<= 128".
>
>After, it uses "icmp ult" which is "unsigned <", so effectively "< 129".
>
>These are equivalent.
>
<div>>-Dimitry</div><div><br></div><div>-------------------------------------------------------------</div><div><br></div><div><div style="font-family:Arial;white-space:normal;margin:0px">Hi all:</div><div style="font-family:Arial;white-space:normal;margin:0px"><br></div><div style="font-family:Arial;white-space:normal;margin:0px">I write C code like this:</div><div style="font-family:Arial;white-space:normal;margin:0px"><br></div><div style="font-family:Arial;white-space:normal;margin:0px">```</div><div style="font-family:Arial;white-space:normal;margin:0px">for (int i =0; i< 128; i++) {</div><div style="font-family:Arial;white-space:normal;margin:0px"> printf("hello");</div><div style="font-family:Arial;white-space:normal;margin:0px">}</div><div style="font-family:Arial;white-space:normal;margin:0px">```</div><div style="font-family:Arial;white-space:normal;margin:0px">I use this command to compile the above code.</div><div style="font-family:Arial;white-space:normal;margin:0px">``</div><div style="font-family:Arial;white-space:normal;margin:0px"><div style="margin:0px">clang -Xclang -disable-O0-optnone -O0  -emit-llvm -S main.c</div><div style="margin:0px">opt -O2  --print-after-all main.ll -S -o  main.mid.ll</div></div><div style="font-family:Arial;white-space:normal;margin:0px">``</div><div style="font-family:Arial;white-space:normal;margin:0px">And I find the LLVM IR have this changed after instCombine optimization.</div><div style="font-family:Arial;white-space:normal;margin:0px"><br></div><div style="font-family:Arial;white-space:normal;margin:0px">```</div><div style="font-family:Arial;white-space:normal;margin:0px"><div style="margin:0px">*** IR Dump After Dead Argument Elimination ***</div><div style="margin:0px">; Function Attrs: noinline nounwind uwtable</div><div style="margin:0px">define dso_local i32 @main(i32 %argc, i8** %argv) local_unnamed_addr #0 {</div><div style="margin:0px">entry:</div><div style="margin:0px">  br label %for.cond</div><div style="margin:0px"><br></div><div style="margin:0px">for.cond:                                         ; preds = %for.body, %entry</div><div style="margin:0px">  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]</div><div style="margin:0px">  %cmp =<b> icmp sle i32 %i.0, 128</b></div><div style="margin:0px">  br i1 %cmp, label %for.body, label %for.end</div><div style="margin:0px"><br></div><div style="margin:0px">for.body:                                         ; preds = %for.cond</div><div style="margin:0px">  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))</div><div style="margin:0px">  %inc = add nsw i32 %i.0, 1</div><div style="margin:0px">  br label %for.cond</div><div style="margin:0px"><br></div><div style="margin:0px">for.end:                                          ; preds = %for.cond</div><div style="margin:0px">  ret i32 0</div><div style="margin:0px">}</div><div style="margin:0px"><br></div><div style="margin:0px">*** IR Dump After Combine redundant instructions ***</div><div style="margin:0px">; Function Attrs: noinline nounwind uwtable</div><div style="margin:0px">define dso_local i32 @main(i32 %argc, i8** %argv) local_unnamed_addr #0 {</div><div style="margin:0px">entry:</div><div style="margin:0px">  br label %for.cond</div><div style="margin:0px"><br></div><div style="margin:0px">for.cond:                                         ; preds = %for.body, %entry</div><div style="margin:0px">  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]</div><div style="margin:0px">  %cmp = <b>icmp ult i32 %i.0, 129</b></div><div style="margin:0px">  br i1 %cmp, label %for.body, label %for.end</div><div style="margin:0px"><br></div><div style="margin:0px">for.body:                                         ; preds = %for.cond</div><div style="margin:0px">  %call = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))</div><div style="margin:0px">  %inc = add nuw nsw i32 %i.0, 1</div><div style="margin:0px">  br label %for.cond</div><div style="margin:0px"><br></div><div style="margin:0px">for.end:                                          ; preds = %for.cond</div><div style="margin:0px">  ret i32 0</div><div style="margin:0px">}</div><div style="margin:0px"><br></div><div style="margin:0px">···</div><div style="margin:0px">I find the value 128 chaned to 129. So I want to know what's the purpose to changed the form?Can you give some example?</div><div style="margin:0px"><br></div><div style="margin:0px">Thanks</div><div style="margin:0px">Rock</div></div></div><div><br></div></pre></div><br><br><span title="neteasefooter"><p> </p></span>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>