summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-12-19 17:59:02 +0000
committerChris Lattner <sabre@nondot.org>2010-12-19 17:59:02 +0000
commitf29562db25102c42a9eab1dc8515a36aea3cc78f (patch)
tree306c33a77116b70cc499f3f6a8c18ac5663e7a89 /llvm/lib
parentee61c1d820c03e44ed3f3020a8a16571c20f6ab1 (diff)
downloadbcm5719-llvm-f29562db25102c42a9eab1dc8515a36aea3cc78f.tar.gz
bcm5719-llvm-f29562db25102c42a9eab1dc8515a36aea3cc78f.zip
fix a bug (possibly 8816) in the sadd forming xform: it isn't
profitable (or safe) to promote code when the add-with-constant has other uses. llvm-svn: 122175
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 80497e9391a..376a38edda3 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1588,6 +1588,16 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
static Instruction *ProcessUGT_ADDCST_ADD(ICmpInst &I, Value *A, Value *B,
ConstantInt *CI2, ConstantInt *CI1,
InstCombiner::BuilderTy *Builder) {
+ // The transformation we're trying to do here is to transform this into an
+ // llvm.sadd.with.overflow. To do this, we have to replace the original add
+ // with a narrower add, and discard the add-with-constant that is part of the
+ // range check (if we can't eliminate it, this isn't profitable).
+
+ // In order to eliminate the add-with-constant, the compare can be its only
+ // use.
+ Value *AddWithCst = I.getOperand(0);
+ if (!AddWithCst->hasOneUse()) return 0;
+
const IntegerType *WideType = cast<IntegerType>(CI1->getType());
unsigned WideWidth = WideType->getBitWidth();
unsigned NarrowWidth = WideWidth / 2;
OpenPOWER on IntegriCloud