]> granicus.if.org Git - clang/commitdiff
emit signed integer subtractions as 'sub nsw', patch by
authorChris Lattner <sabre@nondot.org>
Mon, 29 Mar 2010 17:28:16 +0000 (17:28 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 29 Mar 2010 17:28:16 +0000 (17:28 +0000)
Anton Yartsev!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99817 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp

index 7e26971414b40252273e214076518cf7ae2a6145..1ef06ccf6f6a89459d9d85167f4a8f9bc3c9515b 100644 (file)
@@ -1337,6 +1337,11 @@ Value *ScalarExprEmitter::EmitSub(const BinOpInfo &Ops) {
 
     if (Ops.LHS->getType()->isFPOrFPVectorTy())
       return Builder.CreateFSub(Ops.LHS, Ops.RHS, "sub");
+
+    // Signed integer overflow is undefined behavior.
+    if (Ops.Ty->isSignedIntegerType())
+      return Builder.CreateNSWSub(Ops.LHS, Ops.RHS, "sub");
+
     return Builder.CreateSub(Ops.LHS, Ops.RHS, "sub");
   }