@@ -1990,3 +1990,140 @@ define void @caller() nounwind {
19901990 store volatile [32 x i32 ] %val , ptr @var
19911991 ret void
19921992}
1993+
1994+ ; This function tests if the stack size is correctly calculated when
1995+ ; callee-saved registers are not a sequential list from $ra
1996+ define void @foo () {
1997+ ; RV32I-LABEL: foo:
1998+ ; RV32I: # %bb.0: # %entry
1999+ ; RV32I-NEXT: addi sp, sp, -16
2000+ ; RV32I-NEXT: .cfi_def_cfa_offset 16
2001+ ; RV32I-NEXT: sw s4, 12(sp) # 4-byte Folded Spill
2002+ ; RV32I-NEXT: .cfi_offset s4, -4
2003+ ; RV32I-NEXT: #APP
2004+ ; RV32I-NEXT: li s4, 0
2005+ ; RV32I-NEXT: #NO_APP
2006+ ; RV32I-NEXT: lw s4, 12(sp) # 4-byte Folded Reload
2007+ ; RV32I-NEXT: addi sp, sp, 16
2008+ ; RV32I-NEXT: ret
2009+ ;
2010+ ; RV32I-WITH-FP-LABEL: foo:
2011+ ; RV32I-WITH-FP: # %bb.0: # %entry
2012+ ; RV32I-WITH-FP-NEXT: addi sp, sp, -16
2013+ ; RV32I-WITH-FP-NEXT: .cfi_def_cfa_offset 16
2014+ ; RV32I-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2015+ ; RV32I-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2016+ ; RV32I-WITH-FP-NEXT: sw s4, 4(sp) # 4-byte Folded Spill
2017+ ; RV32I-WITH-FP-NEXT: .cfi_offset ra, -4
2018+ ; RV32I-WITH-FP-NEXT: .cfi_offset s0, -8
2019+ ; RV32I-WITH-FP-NEXT: .cfi_offset s4, -12
2020+ ; RV32I-WITH-FP-NEXT: addi s0, sp, 16
2021+ ; RV32I-WITH-FP-NEXT: .cfi_def_cfa s0, 0
2022+ ; RV32I-WITH-FP-NEXT: #APP
2023+ ; RV32I-WITH-FP-NEXT: li s4, 0
2024+ ; RV32I-WITH-FP-NEXT: #NO_APP
2025+ ; RV32I-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2026+ ; RV32I-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2027+ ; RV32I-WITH-FP-NEXT: lw s4, 4(sp) # 4-byte Folded Reload
2028+ ; RV32I-WITH-FP-NEXT: addi sp, sp, 16
2029+ ; RV32I-WITH-FP-NEXT: ret
2030+ ;
2031+ ; RV32IZCMP-LABEL: foo:
2032+ ; RV32IZCMP: # %bb.0: # %entry
2033+ ; RV32IZCMP-NEXT: cm.push {ra, s0-s4}, -32
2034+ ; RV32IZCMP-NEXT: .cfi_def_cfa_offset 32
2035+ ; RV32IZCMP-NEXT: .cfi_offset s4, -4
2036+ ; RV32IZCMP-NEXT: #APP
2037+ ; RV32IZCMP-NEXT: li s4, 0
2038+ ; RV32IZCMP-NEXT: #NO_APP
2039+ ; RV32IZCMP-NEXT: cm.popret {ra, s0-s4}, 32
2040+ ;
2041+ ; RV32IZCMP-WITH-FP-LABEL: foo:
2042+ ; RV32IZCMP-WITH-FP: # %bb.0: # %entry
2043+ ; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, -16
2044+ ; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 16
2045+ ; RV32IZCMP-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2046+ ; RV32IZCMP-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2047+ ; RV32IZCMP-WITH-FP-NEXT: sw s4, 4(sp) # 4-byte Folded Spill
2048+ ; RV32IZCMP-WITH-FP-NEXT: .cfi_offset ra, -4
2049+ ; RV32IZCMP-WITH-FP-NEXT: .cfi_offset s0, -8
2050+ ; RV32IZCMP-WITH-FP-NEXT: .cfi_offset s4, -12
2051+ ; RV32IZCMP-WITH-FP-NEXT: addi s0, sp, 16
2052+ ; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
2053+ ; RV32IZCMP-WITH-FP-NEXT: #APP
2054+ ; RV32IZCMP-WITH-FP-NEXT: li s4, 0
2055+ ; RV32IZCMP-WITH-FP-NEXT: #NO_APP
2056+ ; RV32IZCMP-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2057+ ; RV32IZCMP-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2058+ ; RV32IZCMP-WITH-FP-NEXT: lw s4, 4(sp) # 4-byte Folded Reload
2059+ ; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, 16
2060+ ; RV32IZCMP-WITH-FP-NEXT: ret
2061+ ;
2062+ ; RV64I-LABEL: foo:
2063+ ; RV64I: # %bb.0: # %entry
2064+ ; RV64I-NEXT: addi sp, sp, -16
2065+ ; RV64I-NEXT: .cfi_def_cfa_offset 16
2066+ ; RV64I-NEXT: sd s4, 8(sp) # 8-byte Folded Spill
2067+ ; RV64I-NEXT: .cfi_offset s4, -8
2068+ ; RV64I-NEXT: #APP
2069+ ; RV64I-NEXT: li s4, 0
2070+ ; RV64I-NEXT: #NO_APP
2071+ ; RV64I-NEXT: ld s4, 8(sp) # 8-byte Folded Reload
2072+ ; RV64I-NEXT: addi sp, sp, 16
2073+ ; RV64I-NEXT: ret
2074+ ;
2075+ ; RV64I-WITH-FP-LABEL: foo:
2076+ ; RV64I-WITH-FP: # %bb.0: # %entry
2077+ ; RV64I-WITH-FP-NEXT: addi sp, sp, -32
2078+ ; RV64I-WITH-FP-NEXT: .cfi_def_cfa_offset 32
2079+ ; RV64I-WITH-FP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
2080+ ; RV64I-WITH-FP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
2081+ ; RV64I-WITH-FP-NEXT: sd s4, 8(sp) # 8-byte Folded Spill
2082+ ; RV64I-WITH-FP-NEXT: .cfi_offset ra, -8
2083+ ; RV64I-WITH-FP-NEXT: .cfi_offset s0, -16
2084+ ; RV64I-WITH-FP-NEXT: .cfi_offset s4, -24
2085+ ; RV64I-WITH-FP-NEXT: addi s0, sp, 32
2086+ ; RV64I-WITH-FP-NEXT: .cfi_def_cfa s0, 0
2087+ ; RV64I-WITH-FP-NEXT: #APP
2088+ ; RV64I-WITH-FP-NEXT: li s4, 0
2089+ ; RV64I-WITH-FP-NEXT: #NO_APP
2090+ ; RV64I-WITH-FP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
2091+ ; RV64I-WITH-FP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
2092+ ; RV64I-WITH-FP-NEXT: ld s4, 8(sp) # 8-byte Folded Reload
2093+ ; RV64I-WITH-FP-NEXT: addi sp, sp, 32
2094+ ; RV64I-WITH-FP-NEXT: ret
2095+ ;
2096+ ; RV64IZCMP-LABEL: foo:
2097+ ; RV64IZCMP: # %bb.0: # %entry
2098+ ; RV64IZCMP-NEXT: cm.push {ra, s0-s4}, -48
2099+ ; RV64IZCMP-NEXT: .cfi_def_cfa_offset 48
2100+ ; RV64IZCMP-NEXT: .cfi_offset s4, -8
2101+ ; RV64IZCMP-NEXT: #APP
2102+ ; RV64IZCMP-NEXT: li s4, 0
2103+ ; RV64IZCMP-NEXT: #NO_APP
2104+ ; RV64IZCMP-NEXT: cm.popret {ra, s0-s4}, 48
2105+ ;
2106+ ; RV64IZCMP-WITH-FP-LABEL: foo:
2107+ ; RV64IZCMP-WITH-FP: # %bb.0: # %entry
2108+ ; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, -32
2109+ ; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 32
2110+ ; RV64IZCMP-WITH-FP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
2111+ ; RV64IZCMP-WITH-FP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
2112+ ; RV64IZCMP-WITH-FP-NEXT: sd s4, 8(sp) # 8-byte Folded Spill
2113+ ; RV64IZCMP-WITH-FP-NEXT: .cfi_offset ra, -8
2114+ ; RV64IZCMP-WITH-FP-NEXT: .cfi_offset s0, -16
2115+ ; RV64IZCMP-WITH-FP-NEXT: .cfi_offset s4, -24
2116+ ; RV64IZCMP-WITH-FP-NEXT: addi s0, sp, 32
2117+ ; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
2118+ ; RV64IZCMP-WITH-FP-NEXT: #APP
2119+ ; RV64IZCMP-WITH-FP-NEXT: li s4, 0
2120+ ; RV64IZCMP-WITH-FP-NEXT: #NO_APP
2121+ ; RV64IZCMP-WITH-FP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
2122+ ; RV64IZCMP-WITH-FP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
2123+ ; RV64IZCMP-WITH-FP-NEXT: ld s4, 8(sp) # 8-byte Folded Reload
2124+ ; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, 32
2125+ ; RV64IZCMP-WITH-FP-NEXT: ret
2126+ entry:
2127+ tail call void asm sideeffect "li s4, 0" , "~{s4}" ()
2128+ ret void
2129+ }
0 commit comments