diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-01-01 18:34:40 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-01-01 18:34:40 +0000 |
| commit | 25c87e9cf9ee7ea73affd103a3d3fbac62384bfa (patch) | |
| tree | 0caa5214fa38d59aa887be4104a0498d4b2f0b37 /llvm/lib/Transforms/Scalar/InstructionCombining.cpp | |
| parent | 4f2486353aa83c1472582fabfd33bf3b3d5a19a7 (diff) | |
| download | bcm5719-llvm-25c87e9cf9ee7ea73affd103a3d3fbac62384bfa.tar.gz bcm5719-llvm-25c87e9cf9ee7ea73affd103a3d3fbac62384bfa.zip | |
implement the transform requested in PR5284
llvm-svn: 92398
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 516d72ea899..c6a8df44c8b 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -10139,6 +10139,19 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { if (IntrinsicInst *Operand = dyn_cast<IntrinsicInst>(II->getOperand(1))) if (Operand->getIntrinsicID() == Intrinsic::bswap) return ReplaceInstUsesWith(CI, Operand->getOperand(1)); + + // bswap(trunc(bswap(x))) -> trunc(lshr(x, c)) + if (TruncInst *TI = dyn_cast<TruncInst>(II->getOperand(1))) { + if (IntrinsicInst *Operand = dyn_cast<IntrinsicInst>(TI->getOperand(0))) + if (Operand->getIntrinsicID() == Intrinsic::bswap) { + unsigned C = Operand->getType()->getPrimitiveSizeInBits() - + TI->getType()->getPrimitiveSizeInBits(); + Value *CV = ConstantInt::get(Operand->getType(), C); + Value *V = Builder->CreateLShr(Operand->getOperand(1), CV); + return new TruncInst(V, TI->getType()); + } + } + break; case Intrinsic::powi: if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getOperand(2))) { |

