diff options
author | Luke Lau <luke@igalia.com> | 2024-10-15 15:10:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-15 15:10:26 +0100 |
commit | 043f066a647334195da41d7f5fd2a8400d7e4c91 (patch) | |
tree | f232124d99d969d89fdb49631890a5750514a815 | |
parent | 732353303e423237b7d23695a0e516728e491da4 (diff) | |
download | llvm-043f066a647334195da41d7f5fd2a8400d7e4c91.zip llvm-043f066a647334195da41d7f5fd2a8400d7e4c91.tar.gz llvm-043f066a647334195da41d7f5fd2a8400d7e4c91.tar.bz2 |
[RISCV][VLOPT] Fix operand check in isVectorOpUsedAsScalarOp (#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.
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 6 | ||||
-rw-r--r-- | llvm/test/CodeGen/RISCV/rvv/vl-opt.mir | 17 |
2 files changed, 19 insertions, 4 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 1a9084f..8a4dd70 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -611,10 +611,8 @@ static bool isVectorOpUsedAsScalarOp(MachineOperand &MO) { case RISCV::VFREDOSUM_VS: case RISCV::VFREDUSUM_VS: case RISCV::VFWREDOSUM_VS: - case RISCV::VFWREDUSUM_VS: { - bool HasPassthru = RISCVII::isFirstDefTiedToFirstUse(MI->getDesc()); - return HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 3; - } + case RISCV::VFWREDUSUM_VS: + return MO.getOperandNo() == 3; default: return false; } diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir index 59a472c..010e3ca 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir @@ -16,3 +16,20 @@ body: | %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ ... +--- +name: vredsum_vv_user +body: | + bb.0: + liveins: $x1 + ; CHECK-LABEL: name: vredsum_vv_user + ; CHECK: liveins: $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %vl:gprnox0 = COPY $x1 + ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ + %vl:gprnox0 = COPY $x1 + %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ + %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ + %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ +... |