Skip to content

Commit 52b1843

Browse files
authored
[VP][DAGCombine] Use simplifySelect when combining vp.select. (#87342)
Hi all, This patch is a follow-up of #79101. It migrates logic from `visitVSELECT` to `visitVP_SELECT` to simplify `vp.select`. With this patch we can do the following combinations: ``` vp.select undef, T, F --> T (if T is a constant), F otherwise vp.select <condition>, undef, F --> F vp.select <condition>, T, undef --> T vp.select false, T, F --> F vp.select <condition>, T, T --> T ``` I'm a total newbie to llvm and I'm sure there's room for improvements in this patch. Please let me know if you have any advice. Thank you in advance!
1 parent 51107be commit 52b1843

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12056,6 +12056,13 @@ SDValue DAGCombiner::foldVSelectOfConstants(SDNode *N) {
1205612056
}
1205712057

1205812058
SDValue DAGCombiner::visitVP_SELECT(SDNode *N) {
12059+
SDValue N0 = N->getOperand(0);
12060+
SDValue N1 = N->getOperand(1);
12061+
SDValue N2 = N->getOperand(2);
12062+
12063+
if (SDValue V = DAG.simplifySelect(N0, N1, N2))
12064+
return V;
12065+
1205912066
if (SDValue V = foldBoolSelectToLogic<VPMatchContext>(N, DAG))
1206012067
return V;
1206112068

llvm/test/CodeGen/RISCV/rvv/vselect-vp.ll

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,3 +825,56 @@ define <vscale x 2 x i1> @select_cond_x_cond(<vscale x 2 x i1> %x, <vscale x 2 x
825825
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %x, i32 %evl)
826826
ret <vscale x 2 x i1> %a
827827
}
828+
829+
define <vscale x 2 x i1> @select_undef_T_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) {
830+
; CHECK-LABEL: select_undef_T_F:
831+
; CHECK: # %bb.0:
832+
; CHECK-NEXT: vmv1r.v v0, v8
833+
; CHECK-NEXT: ret
834+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> poison, <vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 %evl)
835+
ret <vscale x 2 x i1> %a
836+
}
837+
838+
define <vscale x 2 x i1> @select_undef_undef_F(<vscale x 2 x i1> %x, i32 zeroext %evl) {
839+
; CHECK-LABEL: select_undef_undef_F:
840+
; CHECK: # %bb.0:
841+
; CHECK-NEXT: ret
842+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> poison, <vscale x 2 x i1> undef, <vscale x 2 x i1> %x, i32 %evl)
843+
ret <vscale x 2 x i1> %a
844+
}
845+
846+
define <vscale x 2 x i1> @select_unknown_undef_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) {
847+
; CHECK-LABEL: select_unknown_undef_F:
848+
; CHECK: # %bb.0:
849+
; CHECK-NEXT: vmv1r.v v0, v8
850+
; CHECK-NEXT: ret
851+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> undef, <vscale x 2 x i1> %y, i32 %evl)
852+
ret <vscale x 2 x i1> %a
853+
}
854+
855+
define <vscale x 2 x i1> @select_unknown_T_undef(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) {
856+
; CHECK-LABEL: select_unknown_T_undef:
857+
; CHECK: # %bb.0:
858+
; CHECK-NEXT: vmv1r.v v0, v8
859+
; CHECK-NEXT: ret
860+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> poison, i32 %evl)
861+
ret <vscale x 2 x i1> %a
862+
}
863+
864+
define <vscale x 2 x i1> @select_false_T_F(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %z, i32 zeroext %evl) {
865+
; CHECK-LABEL: select_false_T_F:
866+
; CHECK: # %bb.0:
867+
; CHECK-NEXT: vmv1r.v v0, v9
868+
; CHECK-NEXT: ret
869+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> zeroinitializer, <vscale x 2 x i1> %y, <vscale x 2 x i1> %z, i32 %evl)
870+
ret <vscale x 2 x i1> %a
871+
}
872+
873+
define <vscale x 2 x i1> @select_unknown_T_T(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, i32 zeroext %evl) {
874+
; CHECK-LABEL: select_unknown_T_T:
875+
; CHECK: # %bb.0:
876+
; CHECK-NEXT: vmv1r.v v0, v8
877+
; CHECK-NEXT: ret
878+
%a = call <vscale x 2 x i1> @llvm.vp.select.nxv2i1(<vscale x 2 x i1> %x, <vscale x 2 x i1> %y, <vscale x 2 x i1> %y, i32 %evl)
879+
ret <vscale x 2 x i1> %a
880+
}

0 commit comments

Comments
 (0)