From 46b96055cf34dca14ca4d3f853fa8cd8785e5517 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 29 Nov 2006 07:18:39 +0000 Subject: [PATCH] implement cast.ll:test35. With this, we recognize: unsigned short swp(unsigned short a) { return ((a & 0xff00) >> 8 | (a & 0x00ff) << 8); } as an idiom for bswap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32011 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index a5bf60bdeb5..f20d0dd21ab 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -5624,6 +5624,14 @@ static bool CanEvaluateInDifferentType(Value *V, const Type *Ty, // These operators can all arbitrarily be extended or truncated. return CanEvaluateInDifferentType(I->getOperand(0), Ty, NumCastsRemoved) && CanEvaluateInDifferentType(I->getOperand(1), Ty, NumCastsRemoved); + case Instruction::AShr: + case Instruction::LShr: + case Instruction::Shl: + // If this is just a bitcast changing the sign of the operation, we can + // convert if the operand can be converted. + if (V->getType()->getPrimitiveSizeInBits() == Ty->getPrimitiveSizeInBits()) + return CanEvaluateInDifferentType(I->getOperand(0), Ty, NumCastsRemoved); + break; case Instruction::Trunc: case Instruction::ZExt: case Instruction::SExt: @@ -5669,6 +5677,14 @@ Value *InstCombiner::EvaluateInDifferentType(Value *V, const Type *Ty) { LHS, RHS, I->getName()); break; } + case Instruction::AShr: + case Instruction::LShr: + case Instruction::Shl: { + Value *LHS = EvaluateInDifferentType(I->getOperand(0), Ty); + Res = new ShiftInst((Instruction::OtherOps)I->getOpcode(), LHS, + I->getOperand(1), I->getName()); + break; + } case Instruction::Trunc: case Instruction::ZExt: case Instruction::SExt: