mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
- Fix a problematic way in creating all-the-1 APInt.
- Propagate "exact" bit of [l|a]shr instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169942 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -858,8 +858,8 @@ Value *InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr,
|
|||||||
Value *VarX = Shr->getOperand(0);
|
Value *VarX = Shr->getOperand(0);
|
||||||
Type *Ty = VarX->getType();
|
Type *Ty = VarX->getType();
|
||||||
|
|
||||||
APInt BitMask1(Ty->getIntegerBitWidth(), (uint64_t)-1);
|
APInt BitMask1(APInt::getAllOnesValue(Ty->getIntegerBitWidth()));
|
||||||
APInt BitMask2(Ty->getIntegerBitWidth(), (uint64_t)-1);
|
APInt BitMask2(APInt::getAllOnesValue(Ty->getIntegerBitWidth()));
|
||||||
|
|
||||||
bool isLshr = (Shr->getOpcode() == Instruction::LShr);
|
bool isLshr = (Shr->getOpcode() == Instruction::LShr);
|
||||||
BitMask1 = isLshr ? (BitMask1.lshr(ShrAmt) << ShlAmt) :
|
BitMask1 = isLshr ? (BitMask1.lshr(ShrAmt) << ShlAmt) :
|
||||||
@@ -891,6 +891,8 @@ Value *InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr,
|
|||||||
Constant *Amt = ConstantInt::get(VarX->getType(), ShrAmt - ShlAmt);
|
Constant *Amt = ConstantInt::get(VarX->getType(), ShrAmt - ShlAmt);
|
||||||
New = isLshr ? BinaryOperator::CreateLShr(VarX, Amt) :
|
New = isLshr ? BinaryOperator::CreateLShr(VarX, Amt) :
|
||||||
BinaryOperator::CreateAShr(VarX, Amt);
|
BinaryOperator::CreateAShr(VarX, Amt);
|
||||||
|
if (cast<BinaryOperator>(Shr)->isExact())
|
||||||
|
New->setIsExact(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return InsertNewInstWith(New, *Shl);
|
return InsertNewInstWith(New, *Shl);
|
||||||
|
@@ -735,3 +735,13 @@ define i32 @test61(i32 %x) {
|
|||||||
; CHECK: @test61
|
; CHECK: @test61
|
||||||
; CHECK: ashr i32 %x, 4
|
; CHECK: ashr i32 %x, 4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; propagate "exact" trait
|
||||||
|
define i32 @test62(i32 %x) {
|
||||||
|
%shr = ashr exact i32 %x, 4
|
||||||
|
%shl = shl i32 %shr, 1
|
||||||
|
%or = or i32 %shl, 1
|
||||||
|
ret i32 %or
|
||||||
|
; CHECK: @test62
|
||||||
|
; CHECK: ashr exact i32 %x, 3
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user