diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp index 018d4f3201c4c..eb23599ab3baf 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp @@ -2195,7 +2195,7 @@ static bool isSeveralBitsExtractOpFromShr(SDNode *N, unsigned &Opc, // // This gets selected into a single UBFM: // - // UBFM Value, ShiftImm, BitWide + SrlImm -1 + // UBFM Value, ShiftImm, findLastSet(MaskImm) // if (N->getOpcode() != ISD::SRL) @@ -2212,19 +2212,13 @@ static bool isSeveralBitsExtractOpFromShr(SDNode *N, unsigned &Opc, return false; // Check whether we really have several bits extract here. - unsigned BitWide = 64 - countLeadingOnes(~(AndMask >> SrlImm)); - if (BitWide && isMask_64(AndMask >> SrlImm)) { - if (N->getValueType(0) == MVT::i32) - Opc = AArch64::UBFMWri; - else - Opc = AArch64::UBFMXri; - - LSB = SrlImm; - MSB = BitWide + SrlImm - 1; - return true; - } + if (!isMask_64(AndMask >> SrlImm)) + return false; - return false; + Opc = N->getValueType(0) == MVT::i32 ? AArch64::UBFMWri : AArch64::UBFMXri; + LSB = SrlImm; + MSB = findLastSet(AndMask, ZB_Undefined); + return true; } static bool isBitfieldExtractOpFromShr(SDNode *N, unsigned &Opc, SDValue &Opd0,