diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-12-19 17:59:02 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-12-19 17:59:02 +0000 |
| commit | f29562db25102c42a9eab1dc8515a36aea3cc78f (patch) | |
| tree | 306c33a77116b70cc499f3f6a8c18ac5663e7a89 /llvm/lib | |
| parent | ee61c1d820c03e44ed3f3020a8a16571c20f6ab1 (diff) | |
| download | bcm5719-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.cpp | 10 |
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; |

