Skip to content

Commit ee780c8

Browse files
lukel97DanielCChen
authored andcommitted
[RISCV][VLOPT] Fix operand check in isVectorOpUsedAsScalarOp (llvm#112253)
A reduction instruction always has a passthru operand, so the scalar operand should always be vs1 which is at index 3. Even though the destination operand is also scalar, I think the passthru will need to preserve all elements so I haven't included it.
1 parent af49417 commit ee780c8

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,8 @@ static bool isVectorOpUsedAsScalarOp(MachineOperand &MO) {
611611
case RISCV::VFREDOSUM_VS:
612612
case RISCV::VFREDUSUM_VS:
613613
case RISCV::VFWREDOSUM_VS:
614-
case RISCV::VFWREDUSUM_VS: {
615-
bool HasPassthru = RISCVII::isFirstDefTiedToFirstUse(MI->getDesc());
616-
return HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 3;
617-
}
614+
case RISCV::VFWREDUSUM_VS:
615+
return MO.getOperandNo() == 3;
618616
default:
619617
return false;
620618
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,20 @@ body: |
1616
%x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
1717
%y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */
1818
...
19+
---
20+
name: vredsum_vv_user
21+
body: |
22+
bb.0:
23+
liveins: $x1
24+
; CHECK-LABEL: name: vredsum_vv_user
25+
; CHECK: liveins: $x1
26+
; CHECK-NEXT: {{ $}}
27+
; CHECK-NEXT: %vl:gprnox0 = COPY $x1
28+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */
29+
; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */
30+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */
31+
%vl:gprnox0 = COPY $x1
32+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */
33+
%y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */
34+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */
35+
...

0 commit comments

Comments
 (0)