Hi, I have doubts on the following transformation in InstCombineAddSub.cpp. Is it always safe to preserve NSW/NUW in this case? // If this is a 'B = x-(-A)', change to B = x+A. This preserves NSW/NUW. if (Value <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> * <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=*>V <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&)::V at google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp:48204%257Cdef&l=1470&gsn=V> = dyn_castNegVal <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>(Op1 <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>)) { BinaryOperator <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> * <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=*>Res <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&)::Res at google3/third_party/llvm/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp:48251%257Cdef&l=1471&gsn=Res> = BinaryOperator <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>::CreateAdd(Op0 <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>, V <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>); Res <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>->setHasNoSignedWrap <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>(I <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>.hasNoSignedWrap <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>()); Res <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>->setHasNoUnsignedWrap <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>(I <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>.hasNoUnsignedWrap <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>()); return Res <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>; } 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. Thanks, Jingyue -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140624/1804c596/attachment.html>