139 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefix=RV64I %s6 7; When passing a function argument with a size that isn't a multiple of XLEN,8; and the argument is split and passed indirectly, we must ensure that the stack9; slot size appropriately reflects the total size of the parts the argument is10; split into. Otherwise, stack writes can clobber neighboring values.11 12declare void @callee129(i129)13declare void @callee160(i160)14declare void @callee161(i161)15 16define i32 @caller129() nounwind {17; RV32I-LABEL: caller129:18; RV32I: # %bb.0:19; RV32I-NEXT: addi sp, sp, -3220; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill21; RV32I-NEXT: li a0, 4222; RV32I-NEXT: sw a0, 24(sp)23; RV32I-NEXT: sw zero, 16(sp)24; RV32I-NEXT: mv a0, sp25; RV32I-NEXT: sw zero, 0(sp)26; RV32I-NEXT: sw zero, 4(sp)27; RV32I-NEXT: sw zero, 8(sp)28; RV32I-NEXT: sw zero, 12(sp)29; RV32I-NEXT: call callee12930; RV32I-NEXT: lw a0, 24(sp)31; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload32; RV32I-NEXT: addi sp, sp, 3233; RV32I-NEXT: ret34;35; RV64I-LABEL: caller129:36; RV64I: # %bb.0:37; RV64I-NEXT: addi sp, sp, -4838; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill39; RV64I-NEXT: li a0, 4240; RV64I-NEXT: sw a0, 36(sp)41; RV64I-NEXT: mv a0, sp42; RV64I-NEXT: sd zero, 0(sp)43; RV64I-NEXT: sd zero, 8(sp)44; RV64I-NEXT: sd zero, 16(sp)45; RV64I-NEXT: call callee12946; RV64I-NEXT: lw a0, 36(sp)47; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload48; RV64I-NEXT: addi sp, sp, 4849; RV64I-NEXT: ret50 %1 = alloca i3251 store i32 42, ptr %152 call void @callee129(i129 0)53 %2 = load i32, ptr %154 ret i32 %255}56 57define i32 @caller160() nounwind {58; RV32I-LABEL: caller160:59; RV32I: # %bb.0:60; RV32I-NEXT: addi sp, sp, -3261; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill62; RV32I-NEXT: li a0, 4263; RV32I-NEXT: sw a0, 24(sp)64; RV32I-NEXT: sw zero, 16(sp)65; RV32I-NEXT: mv a0, sp66; RV32I-NEXT: sw zero, 0(sp)67; RV32I-NEXT: sw zero, 4(sp)68; RV32I-NEXT: sw zero, 8(sp)69; RV32I-NEXT: sw zero, 12(sp)70; RV32I-NEXT: call callee16071; RV32I-NEXT: lw a0, 24(sp)72; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload73; RV32I-NEXT: addi sp, sp, 3274; RV32I-NEXT: ret75;76; RV64I-LABEL: caller160:77; RV64I: # %bb.0:78; RV64I-NEXT: addi sp, sp, -4879; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill80; RV64I-NEXT: li a0, 4281; RV64I-NEXT: sw a0, 36(sp)82; RV64I-NEXT: mv a0, sp83; RV64I-NEXT: sd zero, 0(sp)84; RV64I-NEXT: sd zero, 8(sp)85; RV64I-NEXT: sd zero, 16(sp)86; RV64I-NEXT: call callee16087; RV64I-NEXT: lw a0, 36(sp)88; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload89; RV64I-NEXT: addi sp, sp, 4890; RV64I-NEXT: ret91 %1 = alloca i3292 store i32 42, ptr %193 call void @callee160(i160 0)94 %2 = load i32, ptr %195 ret i32 %296}97 98define i32 @caller161() nounwind {99; RV32I-LABEL: caller161:100; RV32I: # %bb.0:101; RV32I-NEXT: addi sp, sp, -32102; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill103; RV32I-NEXT: li a0, 42104; RV32I-NEXT: sw a0, 24(sp)105; RV32I-NEXT: sw zero, 16(sp)106; RV32I-NEXT: sw zero, 20(sp)107; RV32I-NEXT: mv a0, sp108; RV32I-NEXT: sw zero, 0(sp)109; RV32I-NEXT: sw zero, 4(sp)110; RV32I-NEXT: sw zero, 8(sp)111; RV32I-NEXT: sw zero, 12(sp)112; RV32I-NEXT: call callee161113; RV32I-NEXT: lw a0, 24(sp)114; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload115; RV32I-NEXT: addi sp, sp, 32116; RV32I-NEXT: ret117;118; RV64I-LABEL: caller161:119; RV64I: # %bb.0:120; RV64I-NEXT: addi sp, sp, -48121; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill122; RV64I-NEXT: li a0, 42123; RV64I-NEXT: sw a0, 36(sp)124; RV64I-NEXT: mv a0, sp125; RV64I-NEXT: sd zero, 0(sp)126; RV64I-NEXT: sd zero, 8(sp)127; RV64I-NEXT: sd zero, 16(sp)128; RV64I-NEXT: call callee161129; RV64I-NEXT: lw a0, 36(sp)130; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload131; RV64I-NEXT: addi sp, sp, 48132; RV64I-NEXT: ret133 %1 = alloca i32134 store i32 42, ptr %1135 call void @callee161(i161 0)136 %2 = load i32, ptr %1137 ret i32 %2138}139