228 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic -mips-jalr-reloc=false | FileCheck %s --check-prefix=O323; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -mips-jalr-reloc=false | FileCheck %s --check-prefix=N644; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 -mips-jalr-reloc=false | FileCheck %s --check-prefix=N325; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic -O3 -mips-jalr-reloc=false | FileCheck %s --check-prefix=O3O326; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -O3 -mips-jalr-reloc=false | FileCheck %s --check-prefix=O3N647; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 -O3 -mips-jalr-reloc=false | FileCheck %s --check-prefix=O3N328 9; Test that PIC calls use the $25 register. This is an ABI requirement.10 11@p = external global i3212@q = external global i3213@r = external global i3214 15define void @f0() nounwind {16; O32-LABEL: f0:17; O32: # %bb.0: # %entry18; O32-NEXT: lui $2, %hi(_gp_disp)19; O32-NEXT: addiu $2, $2, %lo(_gp_disp)20; O32-NEXT: addiu $sp, $sp, -3221; O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill22; O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill23; O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill24; O32-NEXT: addu $16, $2, $2525; O32-NEXT: lw $25, %call16(f1)($16)26; O32-NEXT: jalr $2527; O32-NEXT: move $gp, $1628; O32-NEXT: lw $1, %got(p)($16)29; O32-NEXT: lw $4, 0($1)30; O32-NEXT: lw $25, %call16(f2)($16)31; O32-NEXT: jalr $2532; O32-NEXT: move $gp, $1633; O32-NEXT: lw $1, %got(q)($16)34; O32-NEXT: lw $17, 0($1)35; O32-NEXT: lw $25, %call16(f2)($16)36; O32-NEXT: jalr $2537; O32-NEXT: move $4, $1738; O32-NEXT: lw $1, %got(r)($16)39; O32-NEXT: lw $5, 0($1)40; O32-NEXT: lw $25, %call16(f3)($16)41; O32-NEXT: move $4, $1742; O32-NEXT: jalr $2543; O32-NEXT: move $gp, $1644; O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload45; O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload46; O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload47; O32-NEXT: jr $ra48; O32-NEXT: addiu $sp, $sp, 3249;50; N64-LABEL: f0:51; N64: # %bb.0: # %entry52; N64-NEXT: daddiu $sp, $sp, -3253; N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill54; N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill55; N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill56; N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))57; N64-NEXT: daddu $1, $1, $2558; N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0)))59; N64-NEXT: ld $25, %call16(f1)($gp)60; N64-NEXT: jalr $2561; N64-NEXT: nop62; N64-NEXT: ld $1, %got_disp(p)($gp)63; N64-NEXT: ld $25, %call16(f2)($gp)64; N64-NEXT: jalr $2565; N64-NEXT: lw $4, 0($1)66; N64-NEXT: ld $1, %got_disp(q)($gp)67; N64-NEXT: lw $16, 0($1)68; N64-NEXT: ld $25, %call16(f2)($gp)69; N64-NEXT: jalr $2570; N64-NEXT: move $4, $1671; N64-NEXT: ld $1, %got_disp(r)($gp)72; N64-NEXT: lw $5, 0($1)73; N64-NEXT: ld $25, %call16(f3)($gp)74; N64-NEXT: jalr $2575; N64-NEXT: move $4, $1676; N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload77; N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload78; N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload79; N64-NEXT: jr $ra80; N64-NEXT: daddiu $sp, $sp, 3281;82; N32-LABEL: f0:83; N32: # %bb.0: # %entry84; N32-NEXT: addiu $sp, $sp, -3285; N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill86; N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill87; N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill88; N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))89; N32-NEXT: addu $1, $1, $2590; N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0)))91; N32-NEXT: lw $25, %call16(f1)($gp)92; N32-NEXT: jalr $2593; N32-NEXT: nop94; N32-NEXT: lw $1, %got_disp(p)($gp)95; N32-NEXT: lw $25, %call16(f2)($gp)96; N32-NEXT: jalr $2597; N32-NEXT: lw $4, 0($1)98; N32-NEXT: lw $1, %got_disp(q)($gp)99; N32-NEXT: lw $16, 0($1)100; N32-NEXT: lw $25, %call16(f2)($gp)101; N32-NEXT: jalr $25102; N32-NEXT: move $4, $16103; N32-NEXT: lw $1, %got_disp(r)($gp)104; N32-NEXT: lw $5, 0($1)105; N32-NEXT: lw $25, %call16(f3)($gp)106; N32-NEXT: jalr $25107; N32-NEXT: move $4, $16108; N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload109; N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload110; N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload111; N32-NEXT: jr $ra112; N32-NEXT: addiu $sp, $sp, 32113;114; O3O32-LABEL: f0:115; O3O32: # %bb.0: # %entry116; O3O32-NEXT: lui $2, %hi(_gp_disp)117; O3O32-NEXT: addiu $2, $2, %lo(_gp_disp)118; O3O32-NEXT: addiu $sp, $sp, -32119; O3O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill120; O3O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill121; O3O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill122; O3O32-NEXT: addu $16, $2, $25123; O3O32-NEXT: lw $25, %call16(f1)($16)124; O3O32-NEXT: jalr $25125; O3O32-NEXT: move $gp, $16126; O3O32-NEXT: lw $1, %got(p)($16)127; O3O32-NEXT: lw $25, %call16(f2)($16)128; O3O32-NEXT: move $gp, $16129; O3O32-NEXT: jalr $25130; O3O32-NEXT: lw $4, 0($1)131; O3O32-NEXT: lw $1, %got(q)($16)132; O3O32-NEXT: lw $25, %call16(f2)($16)133; O3O32-NEXT: lw $17, 0($1)134; O3O32-NEXT: jalr $25135; O3O32-NEXT: move $4, $17136; O3O32-NEXT: lw $1, %got(r)($16)137; O3O32-NEXT: lw $25, %call16(f3)($16)138; O3O32-NEXT: move $4, $17139; O3O32-NEXT: move $gp, $16140; O3O32-NEXT: jalr $25141; O3O32-NEXT: lw $5, 0($1)142; O3O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload143; O3O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload144; O3O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload145; O3O32-NEXT: jr $ra146; O3O32-NEXT: addiu $sp, $sp, 32147;148; O3N64-LABEL: f0:149; O3N64: # %bb.0: # %entry150; O3N64-NEXT: daddiu $sp, $sp, -32151; O3N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill152; O3N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill153; O3N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill154; O3N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))155; O3N64-NEXT: daddu $1, $1, $25156; O3N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0)))157; O3N64-NEXT: ld $25, %call16(f1)($gp)158; O3N64-NEXT: jalr $25159; O3N64-NEXT: nop160; O3N64-NEXT: ld $1, %got_disp(p)($gp)161; O3N64-NEXT: ld $25, %call16(f2)($gp)162; O3N64-NEXT: jalr $25163; O3N64-NEXT: lw $4, 0($1)164; O3N64-NEXT: ld $1, %got_disp(q)($gp)165; O3N64-NEXT: ld $25, %call16(f2)($gp)166; O3N64-NEXT: lw $16, 0($1)167; O3N64-NEXT: jalr $25168; O3N64-NEXT: move $4, $16169; O3N64-NEXT: ld $1, %got_disp(r)($gp)170; O3N64-NEXT: ld $25, %call16(f3)($gp)171; O3N64-NEXT: move $4, $16172; O3N64-NEXT: jalr $25173; O3N64-NEXT: lw $5, 0($1)174; O3N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload175; O3N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload176; O3N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload177; O3N64-NEXT: jr $ra178; O3N64-NEXT: daddiu $sp, $sp, 32179;180; O3N32-LABEL: f0:181; O3N32: # %bb.0: # %entry182; O3N32-NEXT: addiu $sp, $sp, -32183; O3N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill184; O3N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill185; O3N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill186; O3N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))187; O3N32-NEXT: addu $1, $1, $25188; O3N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0)))189; O3N32-NEXT: lw $25, %call16(f1)($gp)190; O3N32-NEXT: jalr $25191; O3N32-NEXT: nop192; O3N32-NEXT: lw $1, %got_disp(p)($gp)193; O3N32-NEXT: lw $25, %call16(f2)($gp)194; O3N32-NEXT: jalr $25195; O3N32-NEXT: lw $4, 0($1)196; O3N32-NEXT: lw $1, %got_disp(q)($gp)197; O3N32-NEXT: lw $25, %call16(f2)($gp)198; O3N32-NEXT: lw $16, 0($1)199; O3N32-NEXT: jalr $25200; O3N32-NEXT: move $4, $16201; O3N32-NEXT: lw $1, %got_disp(r)($gp)202; O3N32-NEXT: lw $25, %call16(f3)($gp)203; O3N32-NEXT: move $4, $16204; O3N32-NEXT: jalr $25205; O3N32-NEXT: lw $5, 0($1)206; O3N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload207; O3N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload208; O3N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload209; O3N32-NEXT: jr $ra210; O3N32-NEXT: addiu $sp, $sp, 32211entry:212 tail call void @f1() nounwind213 %tmp = load i32, ptr @p, align 4214 tail call void @f2(i32 %tmp) nounwind215 %tmp1 = load i32, ptr @q, align 4216 tail call void @f2(i32 %tmp1) nounwind217 %tmp2 = load i32, ptr @r, align 4218 tail call void @f3(i32 %tmp1, i32 %tmp2) nounwind219 ret void220}221 222declare void @f1()223 224declare void @f2(i32)225 226declare void @f3(i32, i32)227 228