Skip to content

Commit bfdc244

Browse files
committed
Update ARMISelLowering.cpp
1 parent 151ad20 commit bfdc244

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)