@@ -1417,38 +1417,62 @@ define <vscale x 2 x i32> @vwaddu_vv_disjoint_or_add(<vscale x 2 x i8> %x.i8, <v
14171417 ret <vscale x 2 x i32 > %add
14181418}
14191419
1420- ; TODO: We could select vwaddu.vv, but when both arms of the or are the same
1421- ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
14221420define <vscale x 2 x i32 > @vwaddu_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
14231421; CHECK-LABEL: vwaddu_vv_disjoint_or:
14241422; CHECK: # %bb.0:
14251423; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1426- ; CHECK-NEXT: vor.vv v9, v8, v9
1427- ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1428- ; CHECK-NEXT: vzext.vf2 v8, v9
1424+ ; CHECK-NEXT: vwaddu.vv v10, v8, v9
1425+ ; CHECK-NEXT: vmv1r.v v8, v10
14291426; CHECK-NEXT: ret
14301427 %x.i32 = zext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
14311428 %y.i32 = zext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
14321429 %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
14331430 ret <vscale x 2 x i32 > %or
14341431}
14351432
1436- ; TODO: We could select vwadd.vv, but when both arms of the or are the same
1437- ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
14381433define <vscale x 2 x i32 > @vwadd_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
14391434; CHECK-LABEL: vwadd_vv_disjoint_or:
14401435; CHECK: # %bb.0:
14411436; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1442- ; CHECK-NEXT: vor.vv v9, v8, v9
1443- ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1444- ; CHECK-NEXT: vsext.vf2 v8, v9
1437+ ; CHECK-NEXT: vwadd.vv v10, v8, v9
1438+ ; CHECK-NEXT: vmv1r.v v8, v10
14451439; CHECK-NEXT: ret
14461440 %x.i32 = sext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
14471441 %y.i32 = sext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
14481442 %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
14491443 ret <vscale x 2 x i32 > %or
14501444}
14511445
1446+ define <vscale x 2 x i32 > @vwaddu_vx_disjoint_or (<vscale x 2 x i16 > %x.i16 , i16 %y.i16 ) {
1447+ ; CHECK-LABEL: vwaddu_vx_disjoint_or:
1448+ ; CHECK: # %bb.0:
1449+ ; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
1450+ ; CHECK-NEXT: vwaddu.vx v9, v8, a0
1451+ ; CHECK-NEXT: vmv1r.v v8, v9
1452+ ; CHECK-NEXT: ret
1453+ %x.i32 = zext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1454+ %y.head = insertelement <vscale x 2 x i16 > poison, i16 %y.i16 , i32 0
1455+ %y.splat = shufflevector <vscale x 2 x i16 > %y.head , <vscale x 2 x i16 > poison, <vscale x 2 x i32 > zeroinitializer
1456+ %y.i32 = zext <vscale x 2 x i16 > %y.splat to <vscale x 2 x i32 >
1457+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1458+ ret <vscale x 2 x i32 > %or
1459+ }
1460+
1461+ define <vscale x 2 x i32 > @vwadd_vx_disjoint_or (<vscale x 2 x i16 > %x.i16 , i16 %y.i16 ) {
1462+ ; CHECK-LABEL: vwadd_vx_disjoint_or:
1463+ ; CHECK: # %bb.0:
1464+ ; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
1465+ ; CHECK-NEXT: vwadd.vx v9, v8, a0
1466+ ; CHECK-NEXT: vmv1r.v v8, v9
1467+ ; CHECK-NEXT: ret
1468+ %x.i32 = sext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1469+ %y.head = insertelement <vscale x 2 x i16 > poison, i16 %y.i16 , i32 0
1470+ %y.splat = shufflevector <vscale x 2 x i16 > %y.head , <vscale x 2 x i16 > poison, <vscale x 2 x i32 > zeroinitializer
1471+ %y.i32 = sext <vscale x 2 x i16 > %y.splat to <vscale x 2 x i32 >
1472+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1473+ ret <vscale x 2 x i32 > %or
1474+ }
1475+
14521476define <vscale x 2 x i32 > @vwaddu_wv_disjoint_or (<vscale x 2 x i32 > %x.i32 , <vscale x 2 x i16 > %y.i16 ) {
14531477; CHECK-LABEL: vwaddu_wv_disjoint_or:
14541478; CHECK: # %bb.0:
0 commit comments