diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index fd3b0525c1056..ef9cbac0ec4e9 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -20106,6 +20106,31 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op, Known = KnownOp0.intersectWith(KnownOp1); break; } + case ARMISD::VORRIMM: { + KnownBits KnownLHS = DAG.computeKnownBits(Op.getOperand(0), Depth + 1); + + unsigned Encoded = Op.getConstantOperandVal(1); + unsigned ElemSize = Op.getScalarValueSizeInBits(); + uint64_t DecodedVal = ARM_AM::decodeVMOVModImm(Encoded, ElemSize); + APInt Imm(ElemSize, DecodedVal); + + Known.One = KnownLHS.One | Imm; + Known.Zero = KnownLHS.Zero & ~Imm; + return; + } + case ARMISD::VBICIMM: { + KnownBits KnownLHS = DAG.computeKnownBits(Op.getOperand(0), Depth + 1); + + unsigned Encoded = Op.getConstantOperandVal(1); + unsigned ElemSize = Op.getScalarValueSizeInBits(); + uint64_t DecodedVal = ARM_AM::decodeVMOVModImm(Encoded, ElemSize); + APInt Imm(ElemSize, DecodedVal); + + APInt NotImm = ~Imm; + Known.One = KnownLHS.One & NotImm; + Known.Zero = KnownLHS.Zero | Imm; + return; + } } }