Skip to content

Commit d074e75

Browse files
committed
Bail on identity shuffles
1 parent 99e1f12 commit d074e75

File tree

3 files changed

+13
-20
lines changed

3 files changed

+13
-20
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5602,12 +5602,13 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG,
56025602
}
56035603

56045604
// If the mask indices are disjoint between the two sources, we can lower it
5605-
// as a vselect + a single source vrgather.vv. Don't do this if the operands
5606-
// will be splatted since they will be lowered to something cheaper like
5607-
// vrgather.vi anyway.
5605+
// as a vselect + a single source vrgather.vv. Don't do this if we think the
5606+
// operands may end up being lowered to something cheaper than a vrgather.vv.
56085607
if (!DAG.isSplatValue(V2) && !DAG.isSplatValue(V1) &&
56095608
!ShuffleVectorSDNode::isSplatMask(ShuffleMaskLHS.data(), VT) &&
5610-
!ShuffleVectorSDNode::isSplatMask(ShuffleMaskRHS.data(), VT))
5609+
!ShuffleVectorSDNode::isSplatMask(ShuffleMaskRHS.data(), VT) &&
5610+
!ShuffleVectorInst::isIdentityMask(ShuffleMaskLHS, NumElts) &&
5611+
!ShuffleVectorInst::isIdentityMask(ShuffleMaskRHS, NumElts))
56115612
if (SDValue V = lowerDisjointIndicesShuffle(SVN, DAG, Subtarget))
56125613
return V;
56135614

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-shuffles.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -421,15 +421,11 @@ define <16 x float> @shuffle_disjoint_lanes_one_identity(<16 x float> %v, <16 x
421421
; CHECK: # %bb.0:
422422
; CHECK-NEXT: lui a0, %hi(.LCPI31_0)
423423
; CHECK-NEXT: addi a0, a0, %lo(.LCPI31_0)
424-
; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma
425-
; CHECK-NEXT: vle8.v v16, (a0)
426-
; CHECK-NEXT: li a0, 271
424+
; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, mu
425+
; CHECK-NEXT: vle16.v v16, (a0)
426+
; CHECK-NEXT: li a0, -272
427427
; CHECK-NEXT: vmv.s.x v0, a0
428-
; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
429-
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
430-
; CHECK-NEXT: vsext.vf2 v18, v16
431-
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
432-
; CHECK-NEXT: vrgatherei16.vv v8, v12, v18
428+
; CHECK-NEXT: vrgatherei16.vv v8, v12, v16, v0.t
433429
; CHECK-NEXT: ret
434430
%out = shufflevector <16 x float> %v, <16 x float> %w, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 26, i32 30, i32 22, i32 20, i32 8, i32 31, i32 29, i32 28, i32 27, i32 23, i32 25, i32 22>
435431
ret <16 x float> %out

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-shuffles.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,15 +1092,11 @@ define <16 x i32> @shuffle_disjoint_lanes_one_identity(<16 x i32> %v, <16 x i32>
10921092
; CHECK: # %bb.0:
10931093
; CHECK-NEXT: lui a0, %hi(.LCPI71_0)
10941094
; CHECK-NEXT: addi a0, a0, %lo(.LCPI71_0)
1095-
; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma
1096-
; CHECK-NEXT: vle8.v v16, (a0)
1097-
; CHECK-NEXT: li a0, 271
1095+
; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, mu
1096+
; CHECK-NEXT: vle16.v v16, (a0)
1097+
; CHECK-NEXT: li a0, -272
10981098
; CHECK-NEXT: vmv.s.x v0, a0
1099-
; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
1100-
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
1101-
; CHECK-NEXT: vsext.vf2 v18, v16
1102-
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
1103-
; CHECK-NEXT: vrgatherei16.vv v8, v12, v18
1099+
; CHECK-NEXT: vrgatherei16.vv v8, v12, v16, v0.t
11041100
; CHECK-NEXT: ret
11051101
%out = shufflevector <16 x i32> %v, <16 x i32> %w, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 26, i32 30, i32 22, i32 20, i32 8, i32 31, i32 29, i32 28, i32 27, i32 23, i32 25, i32 22>
11061102
ret <16 x i32> %out

0 commit comments

Comments
 (0)