1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic | FileCheck %s --check-prefix=O32 3; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic | FileCheck %s --check-prefix=N64 4; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 | FileCheck %s --check-prefix=N32 5; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic -O3 | FileCheck %s --check-prefix=O3O32 6; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -O3 | FileCheck %s --check-prefix=O3N64 7; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 -O3 | FileCheck %s --check-prefix=O3N32 8 9; Test that PIC calls use the $25 register. This is an ABI requirement. 10 11@p = external global i32 12@q = external global i32 13@r = external global i32 14 15define void @f0() nounwind { 16; O32-LABEL: f0: 17; O32: # %bb.0: # %entry 18; O32-NEXT: lui $2, %hi(_gp_disp) 19; O32-NEXT: addiu $2, $2, %lo(_gp_disp) 20; O32-NEXT: addiu $sp, $sp, -32 21; O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 22; O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 23; O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 24; O32-NEXT: addu $16, $2, $25 25; O32-NEXT: lw $25, %call16(f1)($16) 26; O32-NEXT: jalr $25 27; O32-NEXT: move $gp, $16 28; 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 $25 32; O32-NEXT: move $gp, $16 33; 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 $25 37; O32-NEXT: move $4, $17 38; 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, $17 42; O32-NEXT: jalr $25 43; O32-NEXT: move $gp, $16 44; O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 45; O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 46; O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 47; O32-NEXT: jr $ra 48; O32-NEXT: addiu $sp, $sp, 32 49; 50; N64-LABEL: f0: 51; N64: # %bb.0: # %entry 52; N64-NEXT: daddiu $sp, $sp, -32 53; N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 54; N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 55; N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 56; N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) 57; N64-NEXT: daddu $1, $1, $25 58; N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0))) 59; N64-NEXT: ld $25, %call16(f1)($gp) 60; N64-NEXT: jalr $25 61; N64-NEXT: nop 62; N64-NEXT: ld $1, %got_disp(p)($gp) 63; N64-NEXT: ld $25, %call16(f2)($gp) 64; N64-NEXT: jalr $25 65; 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 $25 70; N64-NEXT: move $4, $16 71; 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 $25 75; N64-NEXT: move $4, $16 76; N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 77; N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 78; N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 79; N64-NEXT: jr $ra 80; N64-NEXT: daddiu $sp, $sp, 32 81; 82; N32-LABEL: f0: 83; N32: # %bb.0: # %entry 84; N32-NEXT: addiu $sp, $sp, -32 85; N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 86; N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 87; N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 88; N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) 89; N32-NEXT: addu $1, $1, $25 90; N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0))) 91; N32-NEXT: lw $25, %call16(f1)($gp) 92; N32-NEXT: jalr $25 93; N32-NEXT: nop 94; N32-NEXT: lw $1, %got_disp(p)($gp) 95; N32-NEXT: lw $25, %call16(f2)($gp) 96; N32-NEXT: jalr $25 97; 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 $25 102; N32-NEXT: move $4, $16 103; 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 $25 107; N32-NEXT: move $4, $16 108; N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 109; N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 110; N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 111; N32-NEXT: jr $ra 112; N32-NEXT: addiu $sp, $sp, 32 113; 114; O3O32-LABEL: f0: 115; O3O32: # %bb.0: # %entry 116; O3O32-NEXT: lui $2, %hi(_gp_disp) 117; O3O32-NEXT: addiu $2, $2, %lo(_gp_disp) 118; O3O32-NEXT: addiu $sp, $sp, -32 119; O3O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill 120; O3O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill 121; O3O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill 122; O3O32-NEXT: addu $16, $2, $25 123; O3O32-NEXT: lw $25, %call16(f1)($16) 124; O3O32-NEXT: jalr $25 125; O3O32-NEXT: move $gp, $16 126; O3O32-NEXT: lw $1, %got(p)($16) 127; O3O32-NEXT: lw $25, %call16(f2)($16) 128; O3O32-NEXT: move $gp, $16 129; O3O32-NEXT: jalr $25 130; 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 $25 135; O3O32-NEXT: move $4, $17 136; O3O32-NEXT: lw $1, %got(r)($16) 137; O3O32-NEXT: lw $25, %call16(f3)($16) 138; O3O32-NEXT: move $4, $17 139; O3O32-NEXT: move $gp, $16 140; O3O32-NEXT: jalr $25 141; O3O32-NEXT: lw $5, 0($1) 142; O3O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload 143; O3O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload 144; O3O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload 145; O3O32-NEXT: jr $ra 146; O3O32-NEXT: addiu $sp, $sp, 32 147; 148; O3N64-LABEL: f0: 149; O3N64: # %bb.0: # %entry 150; O3N64-NEXT: daddiu $sp, $sp, -32 151; O3N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 152; O3N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 153; O3N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 154; O3N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) 155; O3N64-NEXT: daddu $1, $1, $25 156; O3N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0))) 157; O3N64-NEXT: ld $25, %call16(f1)($gp) 158; O3N64-NEXT: jalr $25 159; O3N64-NEXT: nop 160; O3N64-NEXT: ld $1, %got_disp(p)($gp) 161; O3N64-NEXT: ld $25, %call16(f2)($gp) 162; O3N64-NEXT: jalr $25 163; 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 $25 168; O3N64-NEXT: move $4, $16 169; O3N64-NEXT: ld $1, %got_disp(r)($gp) 170; O3N64-NEXT: ld $25, %call16(f3)($gp) 171; O3N64-NEXT: move $4, $16 172; O3N64-NEXT: jalr $25 173; O3N64-NEXT: lw $5, 0($1) 174; O3N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 175; O3N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 176; O3N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 177; O3N64-NEXT: jr $ra 178; O3N64-NEXT: daddiu $sp, $sp, 32 179; 180; O3N32-LABEL: f0: 181; O3N32: # %bb.0: # %entry 182; O3N32-NEXT: addiu $sp, $sp, -32 183; O3N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill 184; O3N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill 185; O3N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill 186; O3N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) 187; O3N32-NEXT: addu $1, $1, $25 188; O3N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0))) 189; O3N32-NEXT: lw $25, %call16(f1)($gp) 190; O3N32-NEXT: jalr $25 191; O3N32-NEXT: nop 192; O3N32-NEXT: lw $1, %got_disp(p)($gp) 193; O3N32-NEXT: lw $25, %call16(f2)($gp) 194; O3N32-NEXT: jalr $25 195; 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 $25 200; O3N32-NEXT: move $4, $16 201; O3N32-NEXT: lw $1, %got_disp(r)($gp) 202; O3N32-NEXT: lw $25, %call16(f3)($gp) 203; O3N32-NEXT: move $4, $16 204; O3N32-NEXT: jalr $25 205; O3N32-NEXT: lw $5, 0($1) 206; O3N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload 207; O3N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload 208; O3N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload 209; O3N32-NEXT: jr $ra 210; O3N32-NEXT: addiu $sp, $sp, 32 211entry: 212 tail call void @f1() nounwind 213 %tmp = load i32, i32* @p, align 4 214 tail call void @f2(i32 %tmp) nounwind 215 %tmp1 = load i32, i32* @q, align 4 216 tail call void @f2(i32 %tmp1) nounwind 217 %tmp2 = load i32, i32* @r, align 4 218 tail call void @f3(i32 %tmp1, i32 %tmp2) nounwind 219 ret void 220} 221 222declare void @f1() 223 224declare void @f2(i32) 225 226declare void @f3(i32, i32) 227 228