diff options
author | Chris Lattner <sabre@nondot.org> | 2010-06-26 20:27:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-06-26 20:27:24 +0000 |
commit | 217e056e409f51bc64a82334e72bed0f14a51270 (patch) | |
tree | 425800e065fb935cc5b19ef38d67f82bd058fe8c /clang/lib | |
parent | 3bbc52ce3e3d5a4e28147085266819c17bb7ad99 (diff) | |
download | bcm5719-llvm-217e056e409f51bc64a82334e72bed0f14a51270.tar.gz bcm5719-llvm-217e056e409f51bc64a82334e72bed0f14a51270.zip |
implement rdar://7432000 - signed negate should codegen as NSW.
While I'm in there, adjust pointer to member adjustments as well.
llvm-svn: 106955
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index a46105e1968..4372279175e 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -997,13 +997,13 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) { std::swap(DerivedDecl, BaseDecl); if (llvm::Constant *Adj = - CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, - CE->getBasePath())) { + CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, CE->getBasePath())){ if (CE->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer) - Src = Builder.CreateSub(Src, Adj, "adj"); + Src = Builder.CreateNSWSub(Src, Adj, "adj"); else - Src = Builder.CreateAdd(Src, Adj, "adj"); + Src = Builder.CreateNSWAdd(Src, Adj, "adj"); } + return Src; } @@ -1117,6 +1117,11 @@ Value *ScalarExprEmitter::VisitUnaryMinus(const UnaryOperator *E) { Value *Op = Visit(E->getSubExpr()); if (Op->getType()->isFPOrFPVectorTy()) return Builder.CreateFNeg(Op, "neg"); + + // Signed integer overflow is undefined behavior. + if (E->getType()->isSignedIntegerType()) + return Builder.CreateNSWNeg(Op, "neg"); + return Builder.CreateNeg(Op, "neg"); } |