diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-10 07:40:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-10 07:40:50 +0000 |
commit | dde5ee5d37d05c326d33497e1dbd16f77191a1ae (patch) | |
tree | ac2a5ce8f9abe8d76c346ff77d8755071bc08d60 /lib/Transforms | |
parent | 24e64df7ec25b55aa872c2ef33728dfbb8c353c4 (diff) | |
download | external_llvm-dde5ee5d37d05c326d33497e1dbd16f77191a1ae.zip external_llvm-dde5ee5d37d05c326d33497e1dbd16f77191a1ae.tar.gz external_llvm-dde5ee5d37d05c326d33497e1dbd16f77191a1ae.tar.bz2 |
now that the cost model has changed, we can always consider
elimination of a sign extend to be a win, which simplifies
the client of CanEvaluateSExtd, and allows us to eliminate
more casts (examples taken from real code).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93109 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCasts.cpp | 41 |
1 files changed, 16 insertions, 25 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index b0d017e..13f6071 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -919,34 +919,25 @@ Instruction *InstCombiner::visitSExt(SExtInst &CI) { if (NumBitsSExt == 0) return 0; + // Okay, we can transform this! Insert the new expression now. + DEBUG(dbgs() << "ICE: EvaluateInDifferentType converting expression type" + " to avoid sign extend: " << CI); + Value *Res = EvaluateInDifferentType(Src, DestTy, true); + assert(Res->getType() == DestTy); + uint32_t SrcBitSize = SrcTy->getScalarSizeInBits(); uint32_t DestBitSize = DestTy->getScalarSizeInBits(); + + // If the high bits are already filled with sign bit, just replace this + // cast with the result. + if (NumBitsSExt > DestBitSize - SrcBitSize || + ComputeNumSignBits(Res) > DestBitSize - SrcBitSize) + return ReplaceInstUsesWith(CI, Res); - // Because this is a sign extension, we can always transform it by inserting - // two new shifts (to do the extension). However, this is only profitable - // if we've eliminated two or more casts from the input. If we know the - // result will be sign-extended enough to not require these shifts, we can - // always do the transformation. - if (NumCastsRemoved >= 2 || - NumBitsSExt > DestBitSize-SrcBitSize) { - - // Okay, we can transform this! Insert the new expression now. - DEBUG(dbgs() << "ICE: EvaluateInDifferentType converting expression type" - " to avoid sign extend: " << CI); - Value *Res = EvaluateInDifferentType(Src, DestTy, true); - assert(Res->getType() == DestTy); - - // If the high bits are already filled with sign bit, just replace this - // cast with the result. - if (NumBitsSExt > DestBitSize - SrcBitSize || - ComputeNumSignBits(Res) > DestBitSize - SrcBitSize) - return ReplaceInstUsesWith(CI, Res); - - // We need to emit a shl + ashr to do the sign extend. - Value *ShAmt = ConstantInt::get(DestTy, DestBitSize-SrcBitSize); - return BinaryOperator::CreateAShr(Builder->CreateShl(Res, ShAmt, "sext"), - ShAmt); - } + // We need to emit a shl + ashr to do the sign extend. + Value *ShAmt = ConstantInt::get(DestTy, DestBitSize-SrcBitSize); + return BinaryOperator::CreateAShr(Builder->CreateShl(Res, ShAmt, "sext"), + ShAmt); } // If the input is a shl/ashr pair of a same constant, then this is a sign |