@@ -20138,6 +20138,16 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
2013820138 }
2013920139}
2014020140
20141+ static bool isLegalLogicalImmediate(unsigned Imm, const ARMSubtarget *Subtarget) {
20142+ // Handle special cases first
20143+ if (!Subtarget->isThumb())
20144+ return ARM_AM::getSOImmVal(Imm) != -1;
20145+ if (Subtarget->isThumb2())
20146+ return ARM_AM::getT2SOImmVal(Imm) != -1;
20147+ // Thumb1 only has 8-bit unsigned immediate.
20148+ return Imm <= 255;
20149+ }
20150+
2014120151bool ARMTargetLowering::targetShrinkDemandedConstant(
2014220152 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
2014320153 TargetLoweringOpt &TLO) const {
@@ -20178,6 +20188,14 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2017820188 // code won't do this, so we have to do it explicitly to avoid an infinite
2017920189 // loop in obscure cases.)
2018020190 if (ExpandedMask == ~0U)
20191+ return TLO.CombineTo(Op, Op.getOperand(0));
20192+
20193+ // Don't optimize if it is legal already.
20194+ if (isLegalLogicalImmediate(Mask, Subtarget))
20195+ return false;
20196+
20197+ // bic
20198+ if (isLegalLogicalImmediate(~Mask, Subtarget))
2018120199 return false;
2018220200
2018320201 auto IsLegalMask = [ShrunkMask, ExpandedMask](unsigned Mask) -> bool {
@@ -20215,7 +20233,6 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2021520233 // We could try to recognize lsls+lsrs or lsrs+lsls pairs here.
2021620234 // We could try to prefer Thumb1 immediates which can be lowered to a
2021720235 // two-instruction sequence.
20218- // We could try to recognize more legal ARM/Thumb2 immediates here.
2021920236
2022020237 return false;
2022120238}
0 commit comments