104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=mips64-unknown-freebsd -O0 -o - %s | FileCheck %s3 4; Previously SelectionDAGBuilder would always set alignment to 1 for hidden sret5; parameters so we were generating ldl+ldr/lwl+lwr to load those values even6; though we know that they are aligned (since we allocated an aligned frame index)7 8declare dso_local void @use_sret(i32, i128, i64) unnamed_addr9declare dso_local { i32, i128, i64 } @implicit_sret_decl() unnamed_addr10 11define internal void @test() unnamed_addr nounwind {12; CHECK-LABEL: test:13; CHECK: # %bb.0: # %start14; CHECK-NEXT: daddiu $sp, $sp, -6415; CHECK-NEXT: sd $ra, 56($sp) # 8-byte Folded Spill16; CHECK-NEXT: daddiu $4, $sp, 017; CHECK-NEXT: jal implicit_sret_decl18; CHECK-NEXT: nop19; CHECK-NEXT: ld $6, 24($sp)20; CHECK-NEXT: ld $5, 16($sp)21; CHECK-NEXT: ld $7, 32($sp)22; CHECK-NEXT: lw $4, 0($sp)23; CHECK-NEXT: jal use_sret24; CHECK-NEXT: nop25; CHECK-NEXT: ld $ra, 56($sp) # 8-byte Folded Reload26; CHECK-NEXT: daddiu $sp, $sp, 6427; CHECK-NEXT: jr $ra28; CHECK-NEXT: nop29start:30 %0 = call { i32, i128, i64 } @implicit_sret_decl()31 %1 = extractvalue { i32, i128, i64 } %0, 032 %2 = extractvalue { i32, i128, i64 } %0, 133 %3 = extractvalue { i32, i128, i64 } %0, 234 call void @use_sret(i32 %1, i128 %2, i64 %3)35 ret void36}37 38define internal { i32, i128, i64 } @implicit_sret_impl() unnamed_addr nounwind {39; CHECK-LABEL: implicit_sret_impl:40; CHECK: # %bb.0:41; CHECK-NEXT: # kill: def $at_64 killed $a0_6442; CHECK-NEXT: daddiu $1, $zero, 2043; CHECK-NEXT: sd $1, 24($4)44; CHECK-NEXT: daddiu $1, $zero, 045; CHECK-NEXT: sd $zero, 16($4)46; CHECK-NEXT: daddiu $1, $zero, 3047; CHECK-NEXT: sd $1, 32($4)48; CHECK-NEXT: addiu $1, $zero, 1049; CHECK-NEXT: sw $1, 0($4)50; CHECK-NEXT: jr $ra51; CHECK-NEXT: nop52 ret { i32, i128, i64 } { i32 10, i128 20, i64 30 }53}54 55declare dso_local { i32, i32, i32, i32, i32, i32 } @implicit_sret_decl2() unnamed_addr56declare dso_local void @use_sret2(i32, i32, i32) unnamed_addr57define internal void @test2() unnamed_addr nounwind {58; CHECK-LABEL: test2:59; CHECK: # %bb.0: # %start60; CHECK-NEXT: daddiu $sp, $sp, -3261; CHECK-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill62; CHECK-NEXT: daddiu $4, $sp, 063; CHECK-NEXT: jal implicit_sret_decl264; CHECK-NEXT: nop65; CHECK-NEXT: lw $6, 20($sp)66; CHECK-NEXT: lw $5, 12($sp)67; CHECK-NEXT: lw $4, 4($sp)68; CHECK-NEXT: jal use_sret269; CHECK-NEXT: nop70; CHECK-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload71; CHECK-NEXT: daddiu $sp, $sp, 3272; CHECK-NEXT: jr $ra73; CHECK-NEXT: nop74start:75 %0 = call { i32, i32, i32, i32, i32, i32 } @implicit_sret_decl2()76 %1 = extractvalue { i32, i32, i32, i32, i32, i32 } %0, 177 %2 = extractvalue { i32, i32, i32, i32, i32, i32 } %0, 378 %3 = extractvalue { i32, i32, i32, i32, i32, i32 } %0, 579 call void @use_sret2(i32 %1, i32 %2, i32 %3)80 ret void81}82 83 84define internal { i32, i32, i32, i32, i32, i32 } @implicit_sret_impl2() unnamed_addr nounwind {85; CHECK-LABEL: implicit_sret_impl2:86; CHECK: # %bb.0:87; CHECK-NEXT: # kill: def $at_64 killed $a0_6488; CHECK-NEXT: addiu $1, $zero, 689; CHECK-NEXT: sw $1, 20($4)90; CHECK-NEXT: addiu $1, $zero, 591; CHECK-NEXT: sw $1, 16($4)92; CHECK-NEXT: addiu $1, $zero, 493; CHECK-NEXT: sw $1, 12($4)94; CHECK-NEXT: addiu $1, $zero, 395; CHECK-NEXT: sw $1, 8($4)96; CHECK-NEXT: addiu $1, $zero, 297; CHECK-NEXT: sw $1, 4($4)98; CHECK-NEXT: addiu $1, $zero, 199; CHECK-NEXT: sw $1, 0($4)100; CHECK-NEXT: jr $ra101; CHECK-NEXT: nop102 ret { i32, i32, i32, i32, i32, i32 } { i32 1, i32 2, i32 3, i32 4, i32 5, i32 6 }103}104