mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
Fix a bug in the code which determines when it's safe to use the
bt instruction, which was exposed by r106263. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106718 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
37106afe02
commit
6b13cbca61
@ -6175,15 +6175,21 @@ SDValue X86TargetLowering::LowerToBT(SDValue And, ISD::CondCode CC,
|
||||
Op1 = Op1.getOperand(0);
|
||||
|
||||
SDValue LHS, RHS;
|
||||
if (Op1.getOpcode() == ISD::SHL) {
|
||||
if (ConstantSDNode *And10C = dyn_cast<ConstantSDNode>(Op1.getOperand(0)))
|
||||
if (And10C->getZExtValue() == 1) {
|
||||
LHS = Op0;
|
||||
RHS = Op1.getOperand(1);
|
||||
}
|
||||
} else if (Op0.getOpcode() == ISD::SHL) {
|
||||
if (Op1.getOpcode() == ISD::SHL)
|
||||
std::swap(Op0, Op1);
|
||||
if (Op0.getOpcode() == ISD::SHL) {
|
||||
if (ConstantSDNode *And00C = dyn_cast<ConstantSDNode>(Op0.getOperand(0)))
|
||||
if (And00C->getZExtValue() == 1) {
|
||||
// If we looked past a truncate, check that it's only truncating away
|
||||
// known zeros.
|
||||
unsigned BitWidth = Op0.getValueSizeInBits();
|
||||
unsigned AndBitWidth = And.getValueSizeInBits();
|
||||
if (BitWidth > AndBitWidth) {
|
||||
APInt Mask = APInt::getAllOnesValue(BitWidth), Zeros, Ones;
|
||||
DAG.ComputeMaskedBits(Op0, Mask, Zeros, Ones);
|
||||
if (Zeros.countLeadingOnes() < BitWidth - AndBitWidth)
|
||||
return SDValue();
|
||||
}
|
||||
LHS = Op1;
|
||||
RHS = Op0.getOperand(1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user