summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-06-26 20:27:24 +0000
committerChris Lattner <sabre@nondot.org>2010-06-26 20:27:24 +0000
commit217e056e409f51bc64a82334e72bed0f14a51270 (patch)
tree425800e065fb935cc5b19ef38d67f82bd058fe8c /clang/lib
parent3bbc52ce3e3d5a4e28147085266819c17bb7ad99 (diff)
downloadbcm5719-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.cpp13
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");
}
OpenPOWER on IntegriCloud