@@ -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+
2014720157static 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
2030920305bool ARMTargetLowering::SimplifyDemandedBitsForTargetNode(
0 commit comments