Skip to content

Commit 49527d7

Browse files
committed
Update ARMISelLowering.cpp
1 parent 8e699d2 commit 49527d7

File tree

1 file changed

+20
-24
lines changed

1 file changed

+20
-24
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20144,15 +20144,30 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
2014420144
}
2014520145
}
2014620146

20147+
static bool isLegalLogicalImmediate(unsigned Imm, const ARMSubtarget *Subtarget) {
20148+
// Handle special cases first
20149+
if (!Subtarget->isThumb())
20150+
return ARM_AM::getSOImmVal(Imm) != -1;
20151+
if (Subtarget->isThumb2())
20152+
return ARM_AM::getT2SOImmVal(Imm) != -1;
20153+
// Thumb1 only has 8-bit unsigned immediate.
20154+
return Imm <= 255;
20155+
}
20156+
2014720157
static bool optimizeLogicalImm(SDValue Op, unsigned Size, unsigned Imm,
2014820158
const APInt &Demanded,
2014920159
TargetLowering::TargetLoweringOpt &TLO,
20150-
unsigned NewOpc) {
20160+
unsigned NewOpc, const ARMSubtarget *Subtarget) {
2015120161
unsigned OldImm = Imm, NewImm, Enc;
2015220162
unsigned Mask = ~0U, OrigMask = Mask;
20153-
20163+
bool Invert = false;
20164+
2015420165
// Return if the immediate is already all zeros, all ones, a bimm32.
20155-
if (Imm == 0 || Imm == Mask)
20166+
if (Imm == 0 || Imm == Mask || isLegalLogicalImmediate(Imm, Subtarget))
20167+
return false;
20168+
20169+
// bic/orn/eon
20170+
if ((Op.getOpcode() == ISD::AND || (Subtarget->isThumb2() && Op.getOpcode() == ISD::OR)) && isLegalLogicalImmediate(~Imm, Subtarget))
2015620171
return false;
2015720172

2015820173
unsigned EltSize = Size;
@@ -20228,8 +20243,7 @@ static bool optimizeLogicalImm(SDValue Op, unsigned Size, unsigned Imm,
2022820243
// Otherwise, create a machine node so that target independent DAG combine
2022920244
// doesn't undo this optimization.
2023020245
} else {
20231-
Enc = AArch64_AM::encodeLogicalImmediate(NewImm, Size);
20232-
SDValue EncConst = TLO.DAG.getTargetConstant(Enc, DL, VT);
20246+
SDValue EncConst = TLO.DAG.getTargetConstant(NewImm, DL, VT);
2023320247
New = SDValue(
2023420248
TLO.DAG.getMachineNode(NewOpc, DL, VT, Op.getOperand(0), EncConst), 0);
2023520249
}
@@ -20285,25 +20299,7 @@ bool ARMTargetLowering::targetShrinkDemandedConstant(
2028520299
return false;
2028620300

2028720301
unsigned Imm = C->getZExtValue();
20288-
20289-
bool isLegalLogicalImmediate(unsigned Imm, const ARMSubtarget *Subtarget) {
20290-
// Handle special cases first
20291-
if (Imm == 0 || Imm == 0xFFFFFFFF)
20292-
return true;
20293-
20294-
if (!Subtarget->isThumb()) {
20295-
// ARM mode: check shifter operand immediate
20296-
return ARM_AM::getSOImmVal(Imm) != -1;
20297-
} else if (Subtarget->isThumb2()) {
20298-
// Thumb2 mode: check T2 shifter operand immediate
20299-
return ARM_AM::getT2SOImmVal(Imm) != -1;
20300-
} else {
20301-
// Thumb1 mode: very limited
20302-
return Imm <= 255 || ARM_AM::isThumbImmShiftedVal(Imm);
20303-
}
20304-
}
20305-
20306-
return optimizeLogicalImm(Op, Size, Imm, DemandedBits, TLO, NewOpc);
20302+
return optimizeLogicalImm(Op, Size, Imm, DemandedBits, TLO, NewOpc, Subtarget);
2030720303
}
2030820304

2030920305
bool ARMTargetLowering::SimplifyDemandedBitsForTargetNode(

0 commit comments

Comments
 (0)