mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-17 03:30:28 +00:00
1. Make more use of getLowBitsSet/getHighBitsSet.
2. Make the APInt value do the zext/trunc stuff instead of using ConstantExpr::getZExt(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35422 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
197d19d11c
commit
e82fca09bf
@ -6304,8 +6304,7 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
|
|||||||
case Instruction::ZExt: {
|
case Instruction::ZExt: {
|
||||||
// We need to emit an AND to clear the high bits.
|
// We need to emit an AND to clear the high bits.
|
||||||
assert(SrcBitSize < DestBitSize && "Not a zext?");
|
assert(SrcBitSize < DestBitSize && "Not a zext?");
|
||||||
Constant *C = ConstantInt::get(APInt::getAllOnesValue(SrcBitSize));
|
Constant *C = ConstantInt::get(APInt::getLowBitsSet(DestBitSize, SrcBitSize));
|
||||||
C = ConstantExpr::getZExt(C, DestTy);
|
|
||||||
return BinaryOperator::createAnd(Res, C);
|
return BinaryOperator::createAnd(Res, C);
|
||||||
}
|
}
|
||||||
case Instruction::SExt:
|
case Instruction::SExt:
|
||||||
@ -6487,8 +6486,7 @@ Instruction *InstCombiner::visitTrunc(CastInst &CI) {
|
|||||||
unsigned ShAmt = ShAmtV->getZExtValue();
|
unsigned ShAmt = ShAmtV->getZExtValue();
|
||||||
|
|
||||||
// Get a mask for the bits shifting in.
|
// Get a mask for the bits shifting in.
|
||||||
APInt Mask(APInt::getAllOnesValue(SrcBitWidth).lshr(
|
APInt Mask(APInt::getLowBitsSet(SrcBitWidth, ShAmt).shl(DestBitWidth));
|
||||||
SrcBitWidth-ShAmt).shl(DestBitWidth));
|
|
||||||
Value* SrcIOp0 = SrcI->getOperand(0);
|
Value* SrcIOp0 = SrcI->getOperand(0);
|
||||||
if (SrcI->hasOneUse() && MaskedValueIsZero(SrcIOp0, Mask)) {
|
if (SrcI->hasOneUse() && MaskedValueIsZero(SrcIOp0, Mask)) {
|
||||||
if (ShAmt >= DestBitWidth) // All zeros.
|
if (ShAmt >= DestBitWidth) // All zeros.
|
||||||
@ -6547,7 +6545,7 @@ Instruction *InstCombiner::visitZExt(CastInst &CI) {
|
|||||||
// If we're actually extending zero bits and the trunc is a no-op
|
// If we're actually extending zero bits and the trunc is a no-op
|
||||||
if (MidSize < DstSize && SrcSize == DstSize) {
|
if (MidSize < DstSize && SrcSize == DstSize) {
|
||||||
// Replace both of the casts with an And of the type mask.
|
// Replace both of the casts with an And of the type mask.
|
||||||
APInt AndValue(APInt::getAllOnesValue(MidSize).zext(SrcSize));
|
APInt AndValue(APInt::getLowBitsSet(SrcSize, MidSize));
|
||||||
Constant *AndConst = ConstantInt::get(AndValue);
|
Constant *AndConst = ConstantInt::get(AndValue);
|
||||||
Instruction *And =
|
Instruction *And =
|
||||||
BinaryOperator::createAnd(CSrc->getOperand(0), AndConst);
|
BinaryOperator::createAnd(CSrc->getOperand(0), AndConst);
|
||||||
|
Loading…
Reference in New Issue
Block a user