diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -1266,6 +1266,22 @@ BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), FactorRegister) .addReg(SizeOfVector, RegState::Kill) .addImm(ShiftAmount); + } else if (isPowerOf2_32(NumOfVReg - 1)) { + uint32_t ShiftAmount = Log2_32(NumOfVReg - 1); + BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), FactorRegister) + .addReg(SizeOfVector) + .addImm(ShiftAmount); + BuildMI(MBB, II, DL, TII->get(RISCV::ADD), FactorRegister) + .addReg(FactorRegister) + .addReg(SizeOfVector, RegState::Kill); + } else if (isPowerOf2_32(NumOfVReg + 1)) { + uint32_t ShiftAmount = Log2_32(NumOfVReg + 1); + BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), FactorRegister) + .addReg(SizeOfVector) + .addReg(ShiftAmount); + BuildMI(MBB, II, DL, TII->get(RISCV::SUB), FactorRegister) + .addReg(FactorRegister) + .addReg(SizeOfVector, RegState::Kill); } else { Register VN = MRI.createVirtualRegister(&RISCV::GPRRegClass); BuildMI(MBB, II, DL, TII->get(RISCV::ADDI), VN) diff --git a/llvm/test/CodeGen/RISCV/rvv/allocate-lmul-2-4-8.ll b/llvm/test/CodeGen/RISCV/rvv/allocate-lmul-2-4-8.ll --- a/llvm/test/CodeGen/RISCV/rvv/allocate-lmul-2-4-8.ll +++ b/llvm/test/CodeGen/RISCV/rvv/allocate-lmul-2-4-8.ll @@ -76,13 +76,13 @@ ; CHECK-LABEL: lmul1_and_2: ; CHECK: # %bb.0: ; CHECK-NEXT: addi sp, sp, -16 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: add sp, sp, a0 ; CHECK-NEXT: addi sp, sp, 16 ; CHECK-NEXT: ret @@ -120,9 +120,9 @@ ; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 32 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 5 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 2 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -32 ; CHECK-NEXT: addi sp, s0, -32 @@ -139,13 +139,13 @@ ; CHECK-LABEL: lmul2_and_1: ; CHECK: # %bb.0: ; CHECK-NEXT: addi sp, sp, -16 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: add sp, sp, a0 ; CHECK-NEXT: addi sp, sp, 16 ; CHECK-NEXT: ret @@ -158,17 +158,17 @@ ; CHECK-LABEL: lmul4_and_1: ; CHECK: # %bb.0: ; CHECK-NEXT: addi sp, sp, -32 -; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill -; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 32 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 5 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 2 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -32 ; CHECK-NEXT: addi sp, s0, -32 -; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload -; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload +; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload +; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload ; CHECK-NEXT: addi sp, sp, 32 ; CHECK-NEXT: ret %v1 = alloca @@ -180,8 +180,8 @@ ; CHECK-LABEL: lmul4_and_2: ; CHECK: # %bb.0: ; CHECK-NEXT: addi sp, sp, -32 -; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill -; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 32 ; CHECK-NEXT: csrr a0, vlenb ; CHECK-NEXT: addi a1, zero, 6 @@ -189,8 +189,8 @@ ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -32 ; CHECK-NEXT: addi sp, s0, -32 -; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload -; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload +; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload +; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload ; CHECK-NEXT: addi sp, sp, 32 ; CHECK-NEXT: ret %v1 = alloca @@ -251,15 +251,15 @@ ; CHECK-LABEL: gpr_and_lmul1_and_2: ; CHECK: # %bb.0: ; CHECK-NEXT: addi sp, sp, -16 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: addi a0, zero, 3 ; CHECK-NEXT: sd a0, 8(sp) -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: add sp, sp, a0 ; CHECK-NEXT: addi sp, sp, 16 ; CHECK-NEXT: ret @@ -277,9 +277,9 @@ ; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 32 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 5 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 2 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -32 ; CHECK-NEXT: addi a0, zero, 3 @@ -303,9 +303,9 @@ ; CHECK-NEXT: sd ra, 56(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s0, 48(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 64 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 15 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, vxsat +; CHECK-NEXT: sub a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -64 ; CHECK-NEXT: addi sp, s0, -64 diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-framelayout.ll b/llvm/test/CodeGen/RISCV/rvv/rvv-framelayout.ll --- a/llvm/test/CodeGen/RISCV/rvv/rvv-framelayout.ll +++ b/llvm/test/CodeGen/RISCV/rvv/rvv-framelayout.ll @@ -8,9 +8,9 @@ ; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 32 -; CHECK-NEXT: csrr a2, vlenb -; CHECK-NEXT: addi a3, zero, 3 -; CHECK-NEXT: mul a2, a2, a3 +; CHECK-NEXT: csrr a3, vlenb +; CHECK-NEXT: slli a2, a3, 1 +; CHECK-NEXT: add a2, a2, a3 ; CHECK-NEXT: sub sp, sp, a2 ; CHECK-NEXT: slli a0, a0, 2 ; CHECK-NEXT: addi a0, a0, 15 @@ -21,9 +21,9 @@ ; CHECK-NEXT: sub a2, s0, a2 ; CHECK-NEXT: addi a2, a2, -32 ; CHECK-NEXT: vl1re64.v v25, (a2) -; CHECK-NEXT: csrr a2, vlenb -; CHECK-NEXT: addi a3, zero, 3 -; CHECK-NEXT: mul a2, a2, a3 +; CHECK-NEXT: csrr a3, vlenb +; CHECK-NEXT: slli a2, a3, 1 +; CHECK-NEXT: add a2, a2, a3 ; CHECK-NEXT: sub a2, s0, a2 ; CHECK-NEXT: addi a2, a2, -32 ; CHECK-NEXT: vl2re64.v v26, (a2) @@ -55,9 +55,9 @@ ; CHECK-NEXT: sd ra, 120(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s0, 112(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 128 -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: addi a1, zero, 3 -; CHECK-NEXT: mul a0, a0, a1 +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a0, a1, 1 +; CHECK-NEXT: add a0, a0, a1 ; CHECK-NEXT: sub sp, sp, a0 ; CHECK-NEXT: andi sp, sp, -64 ; CHECK-NEXT: csrr a0, vlenb @@ -93,9 +93,9 @@ ; CHECK-NEXT: sd s0, 112(sp) # 8-byte Folded Spill ; CHECK-NEXT: sd s1, 104(sp) # 8-byte Folded Spill ; CHECK-NEXT: addi s0, sp, 128 -; CHECK-NEXT: csrr a2, vlenb -; CHECK-NEXT: addi a3, zero, 3 -; CHECK-NEXT: mul a2, a2, a3 +; CHECK-NEXT: csrr a3, vlenb +; CHECK-NEXT: slli a2, a3, 1 +; CHECK-NEXT: add a2, a2, a3 ; CHECK-NEXT: sub sp, sp, a2 ; CHECK-NEXT: andi sp, sp, -64 ; CHECK-NEXT: mv s1, sp