<div dir="ltr">Do we also do this in InstCombine? Is InstCombine's overflow detection more powerful?<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">On Sun, Jan 13, 2019 at 2:12 PM Simon Pilgrim via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@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">Author: rksimon<br>
Date: Sun Jan 13 14:08:26 2019<br>
New Revision: 351026<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=351026&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=351026&view=rev</a><br>
Log:<br>
[DAGCombiner] If add_sat(x,y) can't overflow -> add(x,y)<br>
<br>
NOTE: We need more powerful signed overflow detection in computeOverflowKind<br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
    llvm/trunk/test/CodeGen/X86/combine-add-usat.ll<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=351026&r1=351025&r2=351026&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=351026&r1=351025&r2=351026&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sun Jan 13 14:08:26 2019<br>
@@ -2206,6 +2206,10 @@ SDValue DAGCombiner::visitADDSAT(SDNode<br>
   if (isNullConstant(N1))<br>
     return N0;<br>
<br>
+  // If it cannot overflow, transform into an add.<br>
+  if (DAG.computeOverflowKind(N0, N1) == SelectionDAG::OFK_Never)<br>
+    return DAG.getNode(ISD::ADD, DL, VT, N0, N1);<br>
+<br>
   return SDValue();<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/combine-add-usat.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/combine-add-usat.ll?rev=351026&r1=351025&r2=351026&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/combine-add-usat.ll?rev=351026&r1=351025&r2=351026&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/combine-add-usat.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/combine-add-usat.ll Sun Jan 13 14:08:26 2019<br>
@@ -59,11 +59,11 @@ define <8 x i16> @combine_zero_v8i16(<8<br>
 define i32 @combine_no_overflow_i32(i32 %a0, i32 %a1) {<br>
 ; CHECK-LABEL: combine_no_overflow_i32:<br>
 ; CHECK:       # %bb.0:<br>
+; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi<br>
+; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi<br>
 ; CHECK-NEXT:    shrl $16, %edi<br>
 ; CHECK-NEXT:    shrl $16, %esi<br>
-; CHECK-NEXT:    addl %edi, %esi<br>
-; CHECK-NEXT:    movl $-1, %eax<br>
-; CHECK-NEXT:    cmovael %esi, %eax<br>
+; CHECK-NEXT:    leal (%rsi,%rdi), %eax<br>
 ; CHECK-NEXT:    retq<br>
   %1 = lshr i32 %a0, 16<br>
   %2 = lshr i32 %a1, 16<br>
@@ -76,14 +76,14 @@ define <8 x i16> @combine_no_overflow_v8<br>
 ; SSE:       # %bb.0:<br>
 ; SSE-NEXT:    psrlw $10, %xmm0<br>
 ; SSE-NEXT:    psrlw $10, %xmm1<br>
-; SSE-NEXT:    paddusw %xmm1, %xmm0<br>
+; SSE-NEXT:    paddw %xmm1, %xmm0<br>
 ; SSE-NEXT:    retq<br>
 ;<br>
 ; AVX-LABEL: combine_no_overflow_v8i16:<br>
 ; AVX:       # %bb.0:<br>
 ; AVX-NEXT:    vpsrlw $10, %xmm0, %xmm0<br>
 ; AVX-NEXT:    vpsrlw $10, %xmm1, %xmm1<br>
-; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0<br>
+; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0<br>
 ; AVX-NEXT:    retq<br>
   %1 = lshr <8 x i16> %a0, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10><br>
   %2 = lshr <8 x i16> %a1, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10><br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>