@@ -876,3 +876,107 @@ define <2 x i64> @vwadd_v2i64_of_v2i16(ptr %x, ptr %y) {
876876 %e = add <2 x i64 > %c , %d
877877 ret <2 x i64 > %e
878878}
879+
880+ ; %x.i32 and %y.i32 are disjoint, so DAGCombiner will combine it into an or.
881+ define <4 x i32 > @vwaddu_vv_disjoint_or_add (<4 x i8 > %x.i8 , <4 x i8 > %y.i8 ) {
882+ ; CHECK-LABEL: vwaddu_vv_disjoint_or_add:
883+ ; CHECK: # %bb.0:
884+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
885+ ; CHECK-NEXT: vzext.vf2 v10, v8
886+ ; CHECK-NEXT: vsll.vi v8, v10, 8
887+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
888+ ; CHECK-NEXT: vzext.vf2 v10, v8
889+ ; CHECK-NEXT: vzext.vf4 v8, v9
890+ ; CHECK-NEXT: vor.vv v8, v10, v8
891+ ; CHECK-NEXT: ret
892+ %x.i16 = zext <4 x i8 > %x.i8 to <4 x i16 >
893+ %x.shl = shl <4 x i16 > %x.i16 , splat (i16 8 )
894+ %x.i32 = zext <4 x i16 > %x.shl to <4 x i32 >
895+ %y.i32 = zext <4 x i8 > %y.i8 to <4 x i32 >
896+ %add = add <4 x i32 > %x.i32 , %y.i32
897+ ret <4 x i32 > %add
898+ }
899+
900+ define <4 x i32 > @vwaddu_vv_disjoint_or (<4 x i16 > %x.i16 , <4 x i16 > %y.i16 ) {
901+ ; CHECK-LABEL: vwaddu_vv_disjoint_or:
902+ ; CHECK: # %bb.0:
903+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
904+ ; CHECK-NEXT: vor.vv v9, v8, v9
905+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
906+ ; CHECK-NEXT: vzext.vf2 v8, v9
907+ ; CHECK-NEXT: ret
908+ %x.i32 = zext <4 x i16 > %x.i16 to <4 x i32 >
909+ %y.i32 = zext <4 x i16 > %y.i16 to <4 x i32 >
910+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
911+ ret <4 x i32 > %or
912+ }
913+
914+ define <4 x i32 > @vwadd_vv_disjoint_or (<4 x i16 > %x.i16 , <4 x i16 > %y.i16 ) {
915+ ; CHECK-LABEL: vwadd_vv_disjoint_or:
916+ ; CHECK: # %bb.0:
917+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
918+ ; CHECK-NEXT: vor.vv v9, v8, v9
919+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
920+ ; CHECK-NEXT: vsext.vf2 v8, v9
921+ ; CHECK-NEXT: ret
922+ %x.i32 = sext <4 x i16 > %x.i16 to <4 x i32 >
923+ %y.i32 = sext <4 x i16 > %y.i16 to <4 x i32 >
924+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
925+ ret <4 x i32 > %or
926+ }
927+
928+ define <4 x i32 > @vwaddu_vx_disjoint_or (<4 x i16 > %x.i16 , i16 %y.i16 ) {
929+ ; CHECK-LABEL: vwaddu_vx_disjoint_or:
930+ ; CHECK: # %bb.0:
931+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
932+ ; CHECK-NEXT: vor.vx v9, v8, a0
933+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
934+ ; CHECK-NEXT: vzext.vf2 v8, v9
935+ ; CHECK-NEXT: ret
936+ %x.i32 = zext <4 x i16 > %x.i16 to <4 x i32 >
937+ %y.head = insertelement <4 x i16 > poison, i16 %y.i16 , i32 0
938+ %y.splat = shufflevector <4 x i16 > %y.head , <4 x i16 > poison, <4 x i32 > zeroinitializer
939+ %y.i32 = zext <4 x i16 > %y.splat to <4 x i32 >
940+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
941+ ret <4 x i32 > %or
942+ }
943+
944+ define <4 x i32 > @vwadd_vx_disjoint_or (<4 x i16 > %x.i16 , i16 %y.i16 ) {
945+ ; CHECK-LABEL: vwadd_vx_disjoint_or:
946+ ; CHECK: # %bb.0:
947+ ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
948+ ; CHECK-NEXT: vor.vx v9, v8, a0
949+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
950+ ; CHECK-NEXT: vsext.vf2 v8, v9
951+ ; CHECK-NEXT: ret
952+ %x.i32 = sext <4 x i16 > %x.i16 to <4 x i32 >
953+ %y.head = insertelement <4 x i16 > poison, i16 %y.i16 , i32 0
954+ %y.splat = shufflevector <4 x i16 > %y.head , <4 x i16 > poison, <4 x i32 > zeroinitializer
955+ %y.i32 = sext <4 x i16 > %y.splat to <4 x i32 >
956+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
957+ ret <4 x i32 > %or
958+ }
959+
960+ define <4 x i32 > @vwaddu_wv_disjoint_or (<4 x i32 > %x.i32 , <4 x i16 > %y.i16 ) {
961+ ; CHECK-LABEL: vwaddu_wv_disjoint_or:
962+ ; CHECK: # %bb.0:
963+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
964+ ; CHECK-NEXT: vzext.vf2 v10, v9
965+ ; CHECK-NEXT: vor.vv v8, v8, v10
966+ ; CHECK-NEXT: ret
967+ %y.i32 = zext <4 x i16 > %y.i16 to <4 x i32 >
968+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
969+ ret <4 x i32 > %or
970+ }
971+
972+ define <4 x i32 > @vwadd_wv_disjoint_or (<4 x i32 > %x.i32 , <4 x i16 > %y.i16 ) {
973+ ; CHECK-LABEL: vwadd_wv_disjoint_or:
974+ ; CHECK: # %bb.0:
975+ ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
976+ ; CHECK-NEXT: vsext.vf2 v10, v9
977+ ; CHECK-NEXT: vor.vv v8, v8, v10
978+ ; CHECK-NEXT: ret
979+ %y.i32 = sext <4 x i16 > %y.i16 to <4 x i32 >
980+ %or = or disjoint <4 x i32 > %x.i32 , %y.i32
981+ ret <4 x i32 > %or
982+ }
0 commit comments