@@ -1396,8 +1396,8 @@ define <vscale x 1 x i64> @i1_zext(<vscale x 1 x i1> %va, <vscale x 1 x i64> %vb
1396
1396
; %x.i32 and %y.i32 are disjoint, so DAGCombiner will combine it into an or.
1397
1397
; FIXME: We should be able to recover the or into vwaddu.vv if the disjoint
1398
1398
; flag is set.
1399
- define <vscale x 2 x i32 > @disjoint_or (<vscale x 2 x i8 > %x.i8 , <vscale x 2 x i8 > %y.i8 ) {
1400
- ; CHECK-LABEL: disjoint_or :
1399
+ define <vscale x 2 x i32 > @vwaddu_vv_disjoint_or_add (<vscale x 2 x i8 > %x.i8 , <vscale x 2 x i8 > %y.i8 ) {
1400
+ ; CHECK-LABEL: vwaddu_vv_disjoint_or_add :
1401
1401
; CHECK: # %bb.0:
1402
1402
; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1403
1403
; CHECK-NEXT: vzext.vf2 v10, v8
@@ -1414,3 +1414,59 @@ define <vscale x 2 x i32> @disjoint_or(<vscale x 2 x i8> %x.i8, <vscale x 2 x i8
1414
1414
%add = add <vscale x 2 x i32 > %x.i32 , %y.i32
1415
1415
ret <vscale x 2 x i32 > %add
1416
1416
}
1417
+
1418
+ ; TODO: We could select vwaddu.vv, but when both arms of the or are the same
1419
+ ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
1420
+ define <vscale x 2 x i32 > @vwaddu_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
1421
+ ; CHECK-LABEL: vwaddu_vv_disjoint_or:
1422
+ ; CHECK: # %bb.0:
1423
+ ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1424
+ ; CHECK-NEXT: vor.vv v9, v8, v9
1425
+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1426
+ ; CHECK-NEXT: vzext.vf2 v8, v9
1427
+ ; CHECK-NEXT: ret
1428
+ %x.i32 = zext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1429
+ %y.i32 = zext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1430
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1431
+ ret <vscale x 2 x i32 > %or
1432
+ }
1433
+
1434
+ ; TODO: We could select vwadd.vv, but when both arms of the or are the same
1435
+ ; DAGCombiner::hoistLogicOpWithSameOpcodeHands moves the zext above the or.
1436
+ define <vscale x 2 x i32 > @vwadd_vv_disjoint_or (<vscale x 2 x i16 > %x.i16 , <vscale x 2 x i16 > %y.i16 ) {
1437
+ ; CHECK-LABEL: vwadd_vv_disjoint_or:
1438
+ ; CHECK: # %bb.0:
1439
+ ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
1440
+ ; CHECK-NEXT: vor.vv v9, v8, v9
1441
+ ; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1442
+ ; CHECK-NEXT: vsext.vf2 v8, v9
1443
+ ; CHECK-NEXT: ret
1444
+ %x.i32 = sext <vscale x 2 x i16 > %x.i16 to <vscale x 2 x i32 >
1445
+ %y.i32 = sext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1446
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1447
+ ret <vscale x 2 x i32 > %or
1448
+ }
1449
+
1450
+ define <vscale x 2 x i32 > @vwaddu_wv_disjoint_or (<vscale x 2 x i32 > %x.i32 , <vscale x 2 x i16 > %y.i16 ) {
1451
+ ; CHECK-LABEL: vwaddu_wv_disjoint_or:
1452
+ ; CHECK: # %bb.0:
1453
+ ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
1454
+ ; CHECK-NEXT: vzext.vf2 v10, v9
1455
+ ; CHECK-NEXT: vor.vv v8, v8, v10
1456
+ ; CHECK-NEXT: ret
1457
+ %y.i32 = zext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1458
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1459
+ ret <vscale x 2 x i32 > %or
1460
+ }
1461
+
1462
+ define <vscale x 2 x i32 > @vwadd_wv_disjoint_or (<vscale x 2 x i32 > %x.i32 , <vscale x 2 x i16 > %y.i16 ) {
1463
+ ; CHECK-LABEL: vwadd_wv_disjoint_or:
1464
+ ; CHECK: # %bb.0:
1465
+ ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
1466
+ ; CHECK-NEXT: vsext.vf2 v10, v9
1467
+ ; CHECK-NEXT: vor.vv v8, v8, v10
1468
+ ; CHECK-NEXT: ret
1469
+ %y.i32 = sext <vscale x 2 x i16 > %y.i16 to <vscale x 2 x i32 >
1470
+ %or = or disjoint <vscale x 2 x i32 > %x.i32 , %y.i32
1471
+ ret <vscale x 2 x i32 > %or
1472
+ }
0 commit comments