diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td @@ -44,7 +44,6 @@ } multiclass VPatUSLoadStoreSDNode; } +multiclass VPatUSLoadStoreMaskSDNode +{ + defvar load_instr = !cast("PseudoVLE1_V_"#m.BX); + defvar store_instr = !cast("PseudoVSE1_V_"#m.BX); + // Load + def : Pat<(m.Mask (load reg_rs1:$rs1)), + (load_instr reg_rs1:$rs1, m.AVL, m.SEW)>; + // Store + def : Pat<(store m.Mask:$rs2, reg_rs1:$rs1), + (store_instr VR:$rs2, reg_rs1:$rs1, m.AVL, m.SEW)>; +} + multiclass VPatUSLoadStoreSDNodes { foreach vti = AllVectors in - defm "" : VPatUSLoadStoreSDNode; + foreach mti = AllMasks in + defm "" : VPatUSLoadStoreMaskSDNode; } class VPatBinarySDNode_VV* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,m8,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_32(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,m4,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_16(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,m2,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_8(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,m1,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_4(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_4: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,mf2,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_2(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_2: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,mf4,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +} + +define void @test_load_mask_1(* %pa, * %pb) { +; CHECK-LABEL: test_load_mask_1: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a2, zero, e8,mf8,ta,mu +; CHECK-NEXT: vle1.v v25, (a0) +; CHECK-NEXT: vse1.v v25, (a1) +; CHECK-NEXT: ret + %a = load , * %pa + store %a, * %pb + ret void +}