diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index d7ac3afe7b76b..2acdefcc6d505 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -257,6 +257,9 @@ static OperandInfo getOperandInfo(const MachineOperand &MO, // Vector Unit-Stride Instructions // Vector Strided Instructions /// Dest EEW encoded in the instruction and EMUL=(EEW/SEW)*LMUL + case RISCV::VLM_V: + case RISCV::VSM_V: + return OperandInfo(RISCVVType::getEMULEqualsEEWDivSEWTimesLMUL(0, MI), 0); case RISCV::VLE8_V: case RISCV::VSE8_V: case RISCV::VLSE8_V: @@ -742,6 +745,7 @@ static bool isSupportedInstr(const MachineInstr &MI) { switch (RVV->BaseInstr) { // Vector Unit-Stride Instructions // Vector Strided Instructions + case RISCV::VLM_V: case RISCV::VLE8_V: case RISCV::VLSE8_V: case RISCV::VLE16_V: diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir index a1bbfc8a7d351..e8bec4e745e91 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir @@ -573,6 +573,26 @@ body: | PseudoVSE8_V_MF2 %x, $noreg, 1, 3 /* e8 */ ... --- +name: vsm_v +body: | + bb.0: + ; CHECK-LABEL: name: vsm_v + ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ + ; CHECK-NEXT: PseudoVSM_V_B8 %x, $noreg, 1, 0 /* e8 */ + %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 + PseudoVSM_V_B8 %x, $noreg, 1, 0 +... +--- +name: vsm_v_incompatible_emul +body: | + bb.0: + ; CHECK-LABEL: name: vsm_v_incompatible_emul + ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ + ; CHECK-NEXT: PseudoVSM_V_B16 %x, $noreg, 1, 0 /* e8 */ + %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 + PseudoVSM_V_B16 %x, $noreg, 1, 0 +... +--- name: vleN_v body: | bb.0: @@ -603,6 +623,36 @@ body: | %x:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 ... --- +name: vlm_v +body: | + bb.0: + ; CHECK-LABEL: name: vlm_v + ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, 1, 0 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ + %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 + %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 +... +--- +name: vlm_v_incompatible_eew +body: | + bb.0: + ; CHECK-LABEL: name: vlm_v_incompatible_eew + ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 + %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 +... +--- +name: vlm_v_incompatible_emul +body: | + bb.0: + ; CHECK-LABEL: name: vlm_v_incompatible_emul + ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ + %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 + %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 +... +--- name: vsseN_v body: | bb.0: