Skip to content

Commit 6409647

Browse files
committed
[Mips] Fix compiler crash when returning fp128 after calling a function returning { i8, i128 }
issue description: When process CanLowerReturn in function lowcall, Mips implements this hook using CheckReturn with CCAssignFn RetCC_Mips. In CheckReturn, Mips would check whether lowered value was originated from f128, this step would check whether MF function return type was f128. In this issue, function return type was just fp128. In CCAssignFn RetCC_Mips, CCIfType i64 would be CCAssignToReg V0_64, A0_64 for soft-float. Then Mips process LowerCallResult which use CCAssignFn RetCC_Mips. It would also check whether lowered value was originated from f128. In this issue, call function return type was structure type and not {f128}, so in CCAssignFn RetCC_Mips, CCIfType i64 would be CCAssignToReg V0_64, V1_64. And in this issue, structure type return value was three i64, so when check the third i64, would report error "Call result #2 has unhandled type i64" due to there are no register available for it.
1 parent ce66b56 commit 6409647

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

llvm/lib/Target/Mips/MipsCallingConv.td

+2-2
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ def RetCC_MipsN : CallingConv<[
207207
CCIfType<[i8, i16, i32, i64],
208208
CCIfInReg<CCPromoteToUpperBitsInType<i64>>>>,
209209

210-
// i64 are returned in registers V0_64, V1_64
211-
CCIfType<[i64], CCAssignToReg<[V0_64, V1_64]>>,
210+
// i64 are returned in registers V0_64, V1_64, A0_64
211+
CCIfType<[i64], CCAssignToReg<[V0_64, V1_64, A0_64]>>,
212212

213213
// f32 are returned in registers F0, F2
214214
CCIfType<[f32], CCAssignToReg<[F0, F2]>>,

llvm/test/CodeGen/Mips/mips64-f128.ll

+55
Original file line numberDiff line numberDiff line change
@@ -2903,6 +2903,61 @@ entry:
29032903
%cond = select i1 %cmp, fp128 %c, fp128 %d
29042904
ret fp128 %cond
29052905
}
2906+
2907+
define { i8, i128 } @bar() {
2908+
ret { i8, i128 } zeroinitializer
2909+
}
2910+
2911+
define fp128 @call_retFP128() {
2912+
; C_CC_FMT-LABEL: call_retFP128:
2913+
; C_CC_FMT: # %bb.0: # %entry
2914+
; C_CC_FMT-NEXT: daddiu $sp, $sp, -16
2915+
; C_CC_FMT-NEXT: .cfi_def_cfa_offset 16
2916+
; C_CC_FMT-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
2917+
; C_CC_FMT-NEXT: sd $gp, 0($sp) # 8-byte Folded Spill
2918+
; C_CC_FMT-NEXT: .cfi_offset 31, -8
2919+
; C_CC_FMT-NEXT: .cfi_offset 28, -16
2920+
; C_CC_FMT-NEXT: lui $1, %hi(%neg(%gp_rel(call_retFP128)))
2921+
; C_CC_FMT-NEXT: daddu $1, $1, $25
2922+
; C_CC_FMT-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(call_retFP128)))
2923+
; C_CC_FMT-NEXT: ld $25, %call16(bar)($gp)
2924+
; C_CC_FMT-NEXT: .reloc .Ltmp51, R_MIPS_JALR, bar
2925+
; C_CC_FMT-NEXT: .Ltmp51:
2926+
; C_CC_FMT-NEXT: jalr $25
2927+
; C_CC_FMT-NEXT: nop
2928+
; C_CC_FMT-NEXT: daddiu $2, $zero, 0
2929+
; C_CC_FMT-NEXT: daddiu $4, $zero, 0
2930+
; C_CC_FMT-NEXT: ld $gp, 0($sp) # 8-byte Folded Reload
2931+
; C_CC_FMT-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
2932+
; C_CC_FMT-NEXT: daddiu $sp, $sp, 16
2933+
; C_CC_FMT-NEXT: jr $ra
2934+
; C_CC_FMT-NEXT: nop
2935+
;
2936+
; CMP_CC_FMT-LABEL: call_retFP128:
2937+
; CMP_CC_FMT: # %bb.0: # %entry
2938+
; CMP_CC_FMT-NEXT: daddiu $sp, $sp, -16
2939+
; CMP_CC_FMT-NEXT: .cfi_def_cfa_offset 16
2940+
; CMP_CC_FMT-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
2941+
; CMP_CC_FMT-NEXT: sd $gp, 0($sp) # 8-byte Folded Spill
2942+
; CMP_CC_FMT-NEXT: .cfi_offset 31, -8
2943+
; CMP_CC_FMT-NEXT: .cfi_offset 28, -16
2944+
; CMP_CC_FMT-NEXT: lui $1, %hi(%neg(%gp_rel(call_retFP128)))
2945+
; CMP_CC_FMT-NEXT: daddu $1, $1, $25
2946+
; CMP_CC_FMT-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(call_retFP128)))
2947+
; CMP_CC_FMT-NEXT: ld $25, %call16(bar)($gp)
2948+
; CMP_CC_FMT-NEXT: .reloc .Ltmp51, R_MIPS_JALR, bar
2949+
; CMP_CC_FMT-NEXT: .Ltmp51:
2950+
; CMP_CC_FMT-NEXT: jalrc $25
2951+
; CMP_CC_FMT-NEXT: daddiu $2, $zero, 0
2952+
; CMP_CC_FMT-NEXT: daddiu $4, $zero, 0
2953+
; CMP_CC_FMT-NEXT: ld $gp, 0($sp) # 8-byte Folded Reload
2954+
; CMP_CC_FMT-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
2955+
; CMP_CC_FMT-NEXT: daddiu $sp, $sp, 16
2956+
; CMP_CC_FMT-NEXT: jrc $ra
2957+
entry:
2958+
call { i8, i128 } @bar()
2959+
ret fp128 0xL00000000000000000000000000000000
2960+
}
29062961
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
29072962
; ALL: {{.*}}
29082963
; PRER6: {{.*}}

0 commit comments

Comments
 (0)