Skip to content

Commit 437e1a7

Browse files
authored
[RISCV][VLOPT] Handle tied pseudos in getOperandInfo (#123170)
For .wv widening instructions when checking if the opperand is vs1 or vs2, we take into account whether or not it has a passthru. For tied pseudos though their passthru is the vs2, and we weren't taking this into account.
1 parent 5e5fd0e commit 437e1a7

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
206206
MI.getOperand(RISCVII::getSEWOpNum(MI.getDesc())).getImm();
207207

208208
const bool HasPassthru = RISCVII::isFirstDefTiedToFirstUse(MI.getDesc());
209+
const bool IsTied = RISCVII::isTiedPseudo(MI.getDesc().TSFlags);
209210

210211
// We bail out early for instructions that have passthru with non NoRegister,
211212
// which means they are using TU policy. We are not interested in these
@@ -568,7 +569,8 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
568569
case RISCV::VFWADD_WV:
569570
case RISCV::VFWSUB_WF:
570571
case RISCV::VFWSUB_WV: {
571-
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1;
572+
bool IsOp1 = (HasPassthru && !IsTied) ? MO.getOperandNo() == 2
573+
: MO.getOperandNo() == 1;
572574
bool TwoTimes = IsMODef || IsOp1;
573575
return TwoTimes ? MILog2SEW + 1 : MILog2SEW;
574576
}
@@ -610,6 +612,7 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) {
610612
case RISCV::VFNCVT_F_F_W:
611613
case RISCV::VFNCVT_ROD_F_F_W:
612614
case RISCV::VFNCVTBF16_F_F_W: {
615+
assert(!IsTied);
613616
bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1;
614617
bool TwoTimes = IsOp1;
615618
return TwoTimes ? MILog2SEW + 1 : MILog2SEW;

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,36 @@ body: |
243243
%y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0
244244
...
245245
---
246+
name: tied_vwop_wv_vs1
247+
body: |
248+
bb.0:
249+
; CHECK-LABEL: name: tied_vwop_wv_vs1
250+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
251+
; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
252+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
253+
%y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0
254+
...
255+
---
256+
name: tied_vwop_wv_vs1_incompatible_eew
257+
body: |
258+
bb.0:
259+
; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_eew
260+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
261+
; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
262+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0
263+
%y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0
264+
...
265+
---
266+
name: tied_vwop_wv_vs1_incompatible_emul
267+
body: |
268+
bb.0:
269+
; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_emul
270+
; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
271+
; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
272+
%x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
273+
%y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0
274+
...
275+
---
246276
name: vop_vf2_vd
247277
body: |
248278
bb.0:

llvm/test/CodeGen/RISCV/rvv/vl-opt.mir

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,12 @@ body: |
140140
%x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, -1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm
141141
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0
142142
...
143-
143+
---
144+
name: vwadd_tied_vs1
145+
body: |
146+
bb.0:
147+
; CHECK-LABEL: name: vwadd_tied_vs1
148+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
149+
; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */
150+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
151+
%y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */

0 commit comments

Comments
 (0)