Skip to content

Commit db57fc4

Browse files
authored
[RISCV][VLOPT] Fix passthru check in getOperandInfo (llvm#112244)
If a pseudo has a passthru, I believe the first source operand will have operand no 2, not 1.
1 parent 037938d commit db57fc4

File tree

4 files changed

+51
-20
lines changed

4 files changed

+51
-20
lines changed

llvm/lib/Target/RISCV/RISCVTargetMachine.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() {
128128
initializeRISCVPreRAExpandPseudoPass(*PR);
129129
initializeRISCVExpandPseudoPass(*PR);
130130
initializeRISCVVectorPeepholePass(*PR);
131+
initializeRISCVVLOptimizerPass(*PR);
131132
initializeRISCVInsertVSETVLIPass(*PR);
132133
initializeRISCVInsertReadWriteCSRPass(*PR);
133134
initializeRISCVInsertWriteVXRMPass(*PR);

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ static OperandInfo getOperandInfo(const MachineInstr &MI,
431431
case RISCV::VWMACCSU_VV:
432432
case RISCV::VWMACCSU_VX:
433433
case RISCV::VWMACCUS_VX: {
434-
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 1 : MO.getOperandNo() == 2;
434+
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1;
435435
bool TwoTimes = IsMODef || IsOp1;
436436
unsigned Log2EEW = TwoTimes ? MILog2SEW + 1 : MILog2SEW;
437437
RISCVII::VLMUL EMUL =
@@ -467,7 +467,7 @@ static OperandInfo getOperandInfo(const MachineInstr &MI,
467467
case RISCV::VNCLIP_WI:
468468
case RISCV::VNCLIP_WV:
469469
case RISCV::VNCLIP_WX: {
470-
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 1 : MO.getOperandNo() == 2;
470+
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1;
471471
bool TwoTimes = IsOp1;
472472
unsigned Log2EEW = TwoTimes ? MILog2SEW + 1 : MILog2SEW;
473473
RISCVII::VLMUL EMUL =

llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.ll

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,20 @@ declare <vscale x 2 x i16> @llvm.riscv.vnsrl.nxv2i16.nxv2i32.nxv2i16(
4040
iXLen);
4141

4242
define <vscale x 2 x i16> @intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, iXLen %2, <vscale x 2 x i32> %3, <vscale x 2 x i32> %4, <vscale x 2 x i16> %z) nounwind {
43-
; CHECK-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16:
44-
; CHECK: # %bb.0: # %entry
45-
; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
46-
; CHECK-NEXT: vwadd.vv v10, v8, v9
47-
; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
48-
; CHECK-NEXT: vnsrl.wv v8, v10, v12
49-
; CHECK-NEXT: ret
43+
; NOVLOPT-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16:
44+
; NOVLOPT: # %bb.0: # %entry
45+
; NOVLOPT-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
46+
; NOVLOPT-NEXT: vwadd.vv v10, v8, v9
47+
; NOVLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
48+
; NOVLOPT-NEXT: vnsrl.wv v8, v10, v12
49+
; NOVLOPT-NEXT: ret
50+
;
51+
; VLOPT-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16:
52+
; VLOPT: # %bb.0: # %entry
53+
; VLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
54+
; VLOPT-NEXT: vwadd.vv v10, v8, v9
55+
; VLOPT-NEXT: vnsrl.wv v8, v10, v12
56+
; VLOPT-NEXT: ret
5057
entry:
5158
%c = sext <vscale x 2 x i16> %a to <vscale x 2 x i32>
5259
%d = sext <vscale x 2 x i16> %b to <vscale x 2 x i32>
@@ -67,14 +74,22 @@ declare <vscale x 2 x i16> @llvm.riscv.vnclip.nxv2i16.nxv2i32.nxv2i16(
6774
iXLen, iXLen);
6875

6976
define <vscale x 2 x i16> @vnclip(<vscale x 2 x i16> %a, <vscale x 2 x i16> %b, iXLen %2, <vscale x 2 x i32> %3, <vscale x 2 x i32> %4, <vscale x 2 x i16> %z) nounwind {
70-
; CHECK-LABEL: vnclip:
71-
; CHECK: # %bb.0: # %entry
72-
; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
73-
; CHECK-NEXT: vwadd.vv v10, v8, v9
74-
; CHECK-NEXT: csrwi vxrm, 0
75-
; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
76-
; CHECK-NEXT: vnclip.wv v8, v10, v12
77-
; CHECK-NEXT: ret
77+
; NOVLOPT-LABEL: vnclip:
78+
; NOVLOPT: # %bb.0: # %entry
79+
; NOVLOPT-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
80+
; NOVLOPT-NEXT: vwadd.vv v10, v8, v9
81+
; NOVLOPT-NEXT: csrwi vxrm, 0
82+
; NOVLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
83+
; NOVLOPT-NEXT: vnclip.wv v8, v10, v12
84+
; NOVLOPT-NEXT: ret
85+
;
86+
; VLOPT-LABEL: vnclip:
87+
; VLOPT: # %bb.0: # %entry
88+
; VLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
89+
; VLOPT-NEXT: vwadd.vv v10, v8, v9
90+
; VLOPT-NEXT: csrwi vxrm, 0
91+
; VLOPT-NEXT: vnclip.wv v8, v10, v12
92+
; VLOPT-NEXT: ret
7893
entry:
7994
%c = sext <vscale x 2 x i16> %a to <vscale x 2 x i32>
8095
%d = sext <vscale x 2 x i16> %b to <vscale x 2 x i32>
@@ -88,6 +103,3 @@ entry:
88103
ret <vscale x 2 x i16> %x
89104
}
90105

91-
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
92-
; NOVLOPT: {{.*}}
93-
; VLOPT: {{.*}}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc %s -o - -mtriple=riscv64 -mattr=+v -run-pass=riscv-vl-optimizer -verify-machineinstrs | FileCheck %s
3+
4+
---
5+
name: vnsrl_wv_user
6+
body: |
7+
bb.0:
8+
liveins: $x1
9+
; CHECK-LABEL: name: vnsrl_wv_user
10+
; CHECK: liveins: $x1
11+
; CHECK-NEXT: {{ $}}
12+
; CHECK-NEXT: %vl:gprnox0 = COPY $x1
13+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
14+
; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */
15+
%vl:gprnox0 = COPY $x1
16+
%x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
17+
%y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */
18+
...

0 commit comments

Comments
 (0)