diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 8f8f0e37b6fc..61267e65e22d 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -19278,9 +19278,8 @@ static SDValue performVP_REVERSECombine(SDNode *N, SelectionDAG &DAG, // If Mask is all ones, then load is unmasked and can be reversed. if (!isOneOrOneSplat(LoadMask)) { // If the mask is not all ones, we can reverse the load if the mask was also - // reversed by an unmasked vp.reverse with the same EVL. + // reversed by a vp.reverse with the same EVL. if (LoadMask.getOpcode() != ISD::EXPERIMENTAL_VP_REVERSE || - !isOneOrOneSplat(LoadMask.getOperand(1)) || LoadMask.getOperand(2) != VPLoad->getVectorLength()) return SDValue(); LoadMask = LoadMask.getOperand(0); @@ -19338,9 +19337,8 @@ static SDValue performVP_STORECombine(SDNode *N, SelectionDAG &DAG, // If Mask is all ones, then load is unmasked and can be reversed. if (!isOneOrOneSplat(StoreMask)) { // If the mask is not all ones, we can reverse the store if the mask was - // also reversed by an unmasked vp.reverse with the same EVL. + // also reversed by a vp.reverse with the same EVL. if (StoreMask.getOpcode() != ISD::EXPERIMENTAL_VP_REVERSE || - !isOneOrOneSplat(StoreMask.getOperand(1)) || StoreMask.getOperand(2) != VPStore->getVectorLength()) return SDValue(); StoreMask = StoreMask.getOperand(0); diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-combine-reverse-load.ll b/llvm/test/CodeGen/RISCV/rvv/vp-combine-reverse-load.ll index 75c60ad9382b..73700ecda506 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-combine-reverse-load.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-combine-reverse-load.ll @@ -33,6 +33,22 @@ define @test_load_mask_is_vp_reverse(* ret %rev } +define @test_load_mask_is_vp_reverse_with_mask(* %ptr, %mask, %revmask, i32 zeroext %evl) { +; CHECK-LABEL: test_load_mask_is_vp_reverse_with_mask: +; CHECK: # %bb.0: +; CHECK-NEXT: slli a2, a1, 2 +; CHECK-NEXT: add a0, a2, a0 +; CHECK-NEXT: addi a0, a0, -4 +; CHECK-NEXT: li a2, -4 +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma +; CHECK-NEXT: vlse32.v v8, (a0), a2, v0.t +; CHECK-NEXT: ret + %loadmask = call @llvm.experimental.vp.reverse.nxv2i1( %mask, %revmask, i32 %evl) + %load = call @llvm.vp.load.nxv2f32.p0nxv2f32(* %ptr, %loadmask, i32 %evl) + %rev = call @llvm.experimental.vp.reverse.nxv2f32( %load, splat (i1 true), i32 %evl) + ret %rev +} + define @test_load_mask_not_all_one(* %ptr, %notallones, i32 zeroext %evl) { ; CHECK-LABEL: test_load_mask_not_all_one: ; CHECK: # %bb.0: diff --git a/llvm/test/CodeGen/RISCV/rvv/vp-combine-store-reverse.ll b/llvm/test/CodeGen/RISCV/rvv/vp-combine-store-reverse.ll index 5fa29dac6960..a2d393d3f6ea 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vp-combine-store-reverse.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vp-combine-store-reverse.ll @@ -33,18 +33,19 @@ define void @test_store_mask_is_vp_reverse( %val, %val, * %ptr, %notallones, i32 zeroext %evl) { -; CHECK-LABEL: test_store_mask_not_all_one: +define void @test_store_mask_is_vp_reverse_with_mask( %val, * %ptr, %mask, %revmask, i32 zeroext %evl) { +; CHECK-LABEL: test_store_mask_is_vp_reverse_with_mask: ; CHECK: # %bb.0: +; CHECK-NEXT: slli a2, a1, 2 +; CHECK-NEXT: add a0, a2, a0 +; CHECK-NEXT: addi a0, a0, -4 +; CHECK-NEXT: li a2, -4 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vid.v v9, v0.t -; CHECK-NEXT: addi a1, a1, -1 -; CHECK-NEXT: vrsub.vx v9, v9, a1, v0.t -; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t -; CHECK-NEXT: vse32.v v10, (a0), v0.t +; CHECK-NEXT: vsse32.v v8, (a0), a2, v0.t ; CHECK-NEXT: ret - %rev = call @llvm.experimental.vp.reverse.nxv2f32( %val, %notallones, i32 %evl) - call void @llvm.vp.store.nxv2f32.p0nxv2f32( %rev, * %ptr, %notallones, i32 %evl) + %storemask = call @llvm.experimental.vp.reverse.nxv2i1( %mask, %revmask, i32 %evl) + %rev = call @llvm.experimental.vp.reverse.nxv2f32( %val, splat (i1 true), i32 %evl) + call void @llvm.vp.store.nxv2f32.p0nxv2f32( %rev, * %ptr, %storemask, i32 %evl) ret void }