aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-11-29 07:18:39 +0000
committerChris Lattner <sabre@nondot.org>2006-11-29 07:18:39 +0000
commit46b96055cf34dca14ca4d3f853fa8cd8785e5517 (patch)
tree481bcdb98fb167fc1bc00bbec0bbfaa6dd9bb209 /lib/Transforms
parent6478b2fcd1e8756e75af088d9c6631caa123fbf9 (diff)
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
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index a5bf60bdeb..f20d0dd21a 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: