Skip to content

Commit 3a542dc

Browse files
committed
[Mips] Fix compiler crash when returning fp128 after calling a function returning { i8, i128 }
1 parent ce66b56 commit 3a542dc

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)