<div dir="ltr">Hi, <div><br>I have doubts on the following transformation in InstCombineAddSub.cpp. Is it always safe to preserve NSW/NUW in this case? </div><div><br></div><div><pre id="c1" class="" style="margin-top:0px;margin-bottom:0px;color:rgb(0,0,0);padding-top:0.5em;font-size:medium;line-height:16.25px">
<span class="" id="c1_1469" style="display:block">  <span class="" style="color:rgb(136,0,0)">// If this is a 'B = x-(-A)', change to B = x+A.  This preserves NSW/NUW.</span>
</span><span class="" id="c1_1470" style="display:block">  <span class="" style="color:rgb(0,0,136)">if</span> (<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/include/llvm/IR/Value.h&ct=xref_jump_to_def&cl=GROK&l=69&gsn=Value" style="text-decoration:none;color:rgb(85,26,139)">Value</a> <a class="" href="https://cs.corp.google.com/#piper///depot/google3/GENERATED/figments/cpp/PointerTo/start-with-ll/llvm/class-Value.cc&ct=xref_jump_to_def&cl=GROK&l=3&gsn=*" style="text-decoration:none;color:rgb(85,26,139)">*</a><a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_usages&gs=cpp:llvm::class-InstCombiner::visitSub(llvm::BinaryOperator%2520&amp;)::V@google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp:48204%257Cdef&l=1470&gsn=V" style="text-decoration:none;color:rgb(85,26,139)">V</a> = <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp&ct=xref_jump_to_def&cl=GROK&l=611&gsn=dyn_castNegVal" style="text-decoration:none;color:rgb(85,26,139);background-color:rgb(255,255,170)">dyn_castNegVal</a>(<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1456&gsn=Op1" style="text-decoration:none;color:rgb(85,26,139)">Op1</a>)) {
</span><span class="" id="c1_1471" style="display:block">    <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/include/llvm/IR/InstrTypes.h&ct=xref_jump_to_def&cl=GROK&l=138&gsn=BinaryOperator" style="text-decoration:none;color:rgb(85,26,139)">BinaryOperator</a> <a class="" href="https://cs.corp.google.com/#piper///depot/google3/GENERATED/figments/cpp/PointerTo/start-with-ll/llvm/class-BinaryOperator.cc&ct=xref_jump_to_def&cl=GROK&l=3&gsn=*" style="text-decoration:none;color:rgb(85,26,139)">*</a><a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_usages&gs=cpp:llvm::class-InstCombiner::visitSub(llvm::BinaryOperator%2520&amp;)::Res@google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp:48251%257Cdef&l=1471&gsn=Res" style="text-decoration:none;color:rgb(85,26,139)">Res</a> = <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/include/llvm/IR/InstrTypes.h&ct=xref_jump_to_def&cl=GROK&l=138&gsn=BinaryOperator" style="text-decoration:none;color:rgb(85,26,139)">BinaryOperator</a>::CreateAdd(<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1456&gsn=Op0" style="text-decoration:none;color:rgb(85,26,139)">Op0</a>, <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1470&gsn=V" style="text-decoration:none;color:rgb(85,26,139)">V</a>);
</span><span class="" id="c1_1472" style="display:block">    <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1471&gsn=Res" style="text-decoration:none;color:rgb(85,26,139)">Res</a>-><a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/IR/Instructions.cpp&ct=xref_jump_to_def&cl=GROK&l=2013&gsn=setHasNoSignedWrap" style="text-decoration:none;color:rgb(85,26,139)">setHasNoSignedWrap</a>(<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1455&gsn=I" style="text-decoration:none;color:rgb(85,26,139)">I</a>.<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/IR/Instructions.cpp&ct=xref_jump_to_def&cl=GROK&l=2025&gsn=hasNoSignedWrap" style="text-decoration:none;color:rgb(85,26,139)">hasNoSignedWrap</a>());
</span><span class="" id="c1_1473" style="display:block">    <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1471&gsn=Res" style="text-decoration:none;color:rgb(85,26,139)">Res</a>-><a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/IR/Instructions.cpp&ct=xref_jump_to_def&cl=GROK&l=2009&gsn=setHasNoUnsignedWrap" style="text-decoration:none;color:rgb(85,26,139)">setHasNoUnsignedWrap</a>(<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1455&gsn=I" style="text-decoration:none;color:rgb(85,26,139)">I</a>.<a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/IR/Instructions.cpp&ct=xref_jump_to_def&cl=GROK&l=2021&gsn=hasNoUnsignedWrap" style="text-decoration:none;color:rgb(85,26,139)">hasNoUnsignedWrap</a>());
</span><span class="" id="c1_1474" style="display:block">    <span class="" style="color:rgb(0,0,136)">return</span> <a class="" href="https://cs.corp.google.com/#piper///depot/google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp&ct=xref_jump_to_def&cl=GROK&l=1471&gsn=Res" style="text-decoration:none;color:rgb(85,26,139)">Res</a>;
</span><span class="" id="c1_1475" style="display:block">  }</span></pre><br>Suppose A = x = (i4 -8) (the minimum signed integer of i4). The first minus in x - (-A) does not sign-overflow, but x + A sign-overflows. </div>
<div><br></div><div>Thanks, </div><div>Jingyue</div></div>