Skip to content

Commit ac00cca

Browse files
committed
[RISCV] Fix assertion when passing f64 vectors via integer registers
The vector arguments are split but assignments won't be pending. Fixes #64645 Reviewed By: asb Differential Revision: https://reviews.llvm.org/D157847
1 parent 61ab106 commit ac00cca

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15169,8 +15169,7 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
1516915169
// Handle passing f64 on RV32D with a soft float ABI or when floating point
1517015170
// registers are exhausted.
1517115171
if (UseGPRForF64 && XLen == 32 && ValVT == MVT::f64) {
15172-
assert(!ArgFlags.isSplit() && PendingLocs.empty() &&
15173-
"Can't lower f64 if it is split");
15172+
assert(PendingLocs.empty() && "Can't lower f64 if it is split");
1517415173
// Depending on available argument GPRS, f64 may be passed in a pair of
1517515174
// GPRs, split between a GPR and the stack, or passed completely on the
1517615175
// stack. LowerCall/LowerFormalArguments/LowerReturn must recognise these

llvm/test/CodeGen/RISCV/pr64645.ll

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2+
; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs -target-abi=ilp32 < %s \
3+
; RUN: | FileCheck %s
4+
5+
define <2 x double> @v2f64(<2 x double> %x, <2 x double> %y) nounwind {
6+
; CHECK-LABEL: v2f64:
7+
; CHECK: # %bb.0:
8+
; CHECK-NEXT: addi sp, sp, -16
9+
; CHECK-NEXT: sw a4, 8(sp)
10+
; CHECK-NEXT: sw a5, 12(sp)
11+
; CHECK-NEXT: lw a4, 8(sp)
12+
; CHECK-NEXT: lw a5, 12(sp)
13+
; CHECK-NEXT: sw a0, 8(sp)
14+
; CHECK-NEXT: sw a1, 12(sp)
15+
; CHECK-NEXT: lw a0, 8(sp)
16+
; CHECK-NEXT: lw a1, 12(sp)
17+
; CHECK-NEXT: sw a6, 8(sp)
18+
; CHECK-NEXT: sw a7, 12(sp)
19+
; CHECK-NEXT: lw a6, 8(sp)
20+
; CHECK-NEXT: lw a7, 12(sp)
21+
; CHECK-NEXT: sw a2, 8(sp)
22+
; CHECK-NEXT: sw a3, 12(sp)
23+
; CHECK-NEXT: lw a2, 8(sp)
24+
; CHECK-NEXT: lw a3, 12(sp)
25+
; CHECK-NEXT: fadd.d a2, a2, a6
26+
; CHECK-NEXT: fadd.d a0, a0, a4
27+
; CHECK-NEXT: sw a0, 8(sp)
28+
; CHECK-NEXT: sw a1, 12(sp)
29+
; CHECK-NEXT: lw a0, 8(sp)
30+
; CHECK-NEXT: lw a1, 12(sp)
31+
; CHECK-NEXT: sw a2, 8(sp)
32+
; CHECK-NEXT: sw a3, 12(sp)
33+
; CHECK-NEXT: lw a2, 8(sp)
34+
; CHECK-NEXT: lw a3, 12(sp)
35+
; CHECK-NEXT: addi sp, sp, 16
36+
; CHECK-NEXT: ret
37+
%1 = fadd <2 x double> %x, %y
38+
ret <2 x double> %1
39+
}

0 commit comments

Comments
 (0)