mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-18 12:29:21 +00:00
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
This commit is contained in:
parent
6478b2fcd1
commit
46b96055cf
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user