@@ -20166,10 +20166,6 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2016620166 if (!EnableOptimizeLogicalImm)
2016720167 return false;
2016820168
20169- // Only optimize AND for now.
20170- if (Op.getOpcode() != ISD::AND)
20171- return false;
20172-
2017320169 EVT VT = Op.getValueType();
2017420170
2017520171 // Ignore vectors.
@@ -20182,22 +20178,56 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2018220178 if (DemandedBits.popcount() == 32)
2018320179 return false;
2018420180
20181+ // Only optimize AND for now.
20182+ if (Op.getOpcode() != ISD::AND)
20183+ return false;
20184+
2018520185 // Make sure the RHS really is a constant.
2018620186 ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
2018720187 if (!C)
2018820188 return false;
2018920189
2019020190 unsigned Mask = C->getZExtValue();
20191+
20192+ if (Mask == 0 || Mask == ~0U)
20193+ return false;
20194+
20195+ unsigned Mask = C->getZExtValue();
2019120196
2019220197 unsigned Demanded = DemandedBits.getZExtValue();
2019320198 unsigned ShrunkMask = Mask & Demanded;
2019420199 unsigned ExpandedMask = Mask | ~Demanded;
2019520200
20201+ auto IsLegalMask = [ShrunkMask, ExpandedMask](unsigned Mask) -> bool {
20202+ return (ShrunkMask & Mask) == ShrunkMask && (~ExpandedMask & Mask) == 0;
20203+ };
20204+ auto UseMask = [Mask, Op, VT, &TLO](unsigned NewMask) -> bool {
20205+ if (NewMask == Mask)
20206+ return true;
20207+ SDLoc DL(Op);
20208+ SDValue NewC = TLO.DAG.getConstant(NewMask, DL, VT);
20209+ SDValue NewOp = TLO.DAG.getNode(ISD::AND, DL, VT, Op.getOperand(0), NewC);
20210+ return TLO.CombineTo(Op, NewOp);
20211+ };
20212+
20213+ // If thumb, check for uxth and uxtb masks first and foremost.
20214+ if (Subtarget->isThumb1Only() && Subtarget->hasV6Ops()) {
20215+ if (IsLegalMask(0xFF)) {
20216+ ++NumOptimizedImms;
20217+ return UseMask(0xFF);
20218+ }
20219+
20220+ if (IsLegalMask(0xFFFF)) {
20221+ ++NumOptimizedImms;
20222+ return UseMask(0xFFFF);
20223+ }
20224+ }
20225+
2019620226 // If the mask is all zeros, let the target-independent code replace the
2019720227 // result with zero.
2019820228 if (ShrunkMask == 0) {
2019920229 ++NumOptimizedImms;
20200- return false ;
20230+ return UseMask(0) ;
2020120231 }
2020220232
2020320233 // If the mask is all ones, erase the AND. (Currently, the target-independent
@@ -20208,30 +20238,6 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2020820238 return TLO.CombineTo(Op, Op.getOperand(0));
2020920239 }
2021020240
20211- auto IsLegalMask = [ShrunkMask, ExpandedMask](unsigned Mask) -> bool {
20212- return (ShrunkMask & Mask) == ShrunkMask && (~ExpandedMask & Mask) == 0;
20213- };
20214- auto UseMask = [Mask, Op, VT, &TLO](unsigned NewMask) -> bool {
20215- if (NewMask == Mask)
20216- return true;
20217- SDLoc DL(Op);
20218- SDValue NewC = TLO.DAG.getConstant(NewMask, DL, VT);
20219- SDValue NewOp = TLO.DAG.getNode(ISD::AND, DL, VT, Op.getOperand(0), NewC);
20220- return TLO.CombineTo(Op, NewOp);
20221- };
20222-
20223- // If thumb, check for uxth and uxtb masks first and foremost.
20224- if (Subtarget->isThumb1Only() && Subtarget->hasV6Ops()) {
20225- if (IsLegalMask(0xFF)) {
20226- ++NumOptimizedImms;
20227- return UseMask(0xFF);
20228- }
20229-
20230- if (IsLegalMask(0xFF00)) {
20231- ++NumOptimizedImms;
20232- return UseMask(0xFF00);
20233- }
20234- }
2023520241
2023620242 if (isLegalLogicalImmediate(ShrunkMask, Subtarget)) {
2023720243 ++NumOptimizedImms;
0 commit comments