summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-01 18:34:40 +0000
committerChris Lattner <sabre@nondot.org>2010-01-01 18:34:40 +0000
commit25c87e9cf9ee7ea73affd103a3d3fbac62384bfa (patch)
tree0caa5214fa38d59aa887be4104a0498d4b2f0b37 /llvm/lib/Transforms/Scalar/InstructionCombining.cpp
parent4f2486353aa83c1472582fabfd33bf3b3d5a19a7 (diff)
downloadbcm5719-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.cpp13
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))) {
OpenPOWER on IntegriCloud