diff options
| author | Simon Dardis <simon.dardis@mips.com> | 2018-02-09 10:46:16 +0000 |
|---|---|---|
| committer | Simon Dardis <simon.dardis@mips.com> | 2018-02-09 10:46:16 +0000 |
| commit | 9ab7f42adcf36ec2e86c2c5abb7b7413195621d2 (patch) | |
| tree | f29e6d37dfe69cfaa3145704449faf23cfdb1950 | |
| parent | 9620f4b746c7b3b752ce5013817bd112fe5b721c (diff) | |
| download | bcm5719-llvm-9ab7f42adcf36ec2e86c2c5abb7b7413195621d2.tar.gz bcm5719-llvm-9ab7f42adcf36ec2e86c2c5abb7b7413195621d2.zip | |
[mips] UnXFAIL gprestore.ll test.
Repurpose this previously XFAIL'd test to check that jalr uses $25
as per ABI requirements for PIC code.
llvm-svn: 324729
| -rw-r--r-- | llvm/test/CodeGen/Mips/gprestore.ll | 221 |
1 files changed, 207 insertions, 14 deletions
diff --git a/llvm/test/CodeGen/Mips/gprestore.ll b/llvm/test/CodeGen/Mips/gprestore.ll index b1c2ad1d275..88ac047b660 100644 --- a/llvm/test/CodeGen/Mips/gprestore.ll +++ b/llvm/test/CodeGen/Mips/gprestore.ll @@ -1,32 +1,225 @@ -; DISABLE: llc -march=mips < %s | FileCheck %s -; RUN: false -; XFAIL: * +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic | FileCheck %s --check-prefix=O32 +; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic | FileCheck %s --check-prefix=N64 +; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 | FileCheck %s --check-prefix=N32 +; RUN: llc -mtriple=mips-mti-linux-gnu < %s -relocation-model=pic -O3 | FileCheck %s --check-prefix=O3O32 +; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -O3 | FileCheck %s --check-prefix=O3N64 +; RUN: llc -mtriple=mips64-mti-linux-gnu < %s -relocation-model=pic -target-abi n32 -O3 | FileCheck %s --check-prefix=O3N32 + +; Test that PIC calls use the $25 register. This is an ABI requirement. @p = external global i32 @q = external global i32 @r = external global i32 define void @f0() nounwind { +; O32-LABEL: f0: +; O32: # %bb.0: # %entry +; O32-NEXT: lui $2, %hi(_gp_disp) +; O32-NEXT: addiu $2, $2, %lo(_gp_disp) +; O32-NEXT: addiu $sp, $sp, -32 +; O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill +; O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill +; O32-NEXT: addu $16, $2, $25 +; O32-NEXT: lw $25, %call16(f1)($16) +; O32-NEXT: jalr $25 +; O32-NEXT: move $gp, $16 +; O32-NEXT: lw $1, %got(p)($16) +; O32-NEXT: lw $4, 0($1) +; O32-NEXT: lw $25, %call16(f2)($16) +; O32-NEXT: jalr $25 +; O32-NEXT: move $gp, $16 +; O32-NEXT: lw $1, %got(q)($16) +; O32-NEXT: lw $17, 0($1) +; O32-NEXT: lw $25, %call16(f2)($16) +; O32-NEXT: jalr $25 +; O32-NEXT: move $4, $17 +; O32-NEXT: lw $1, %got(r)($16) +; O32-NEXT: lw $5, 0($1) +; O32-NEXT: lw $25, %call16(f3)($16) +; O32-NEXT: move $4, $17 +; O32-NEXT: jalr $25 +; O32-NEXT: move $gp, $16 +; O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload +; O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload +; O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; O32-NEXT: jr $ra +; O32-NEXT: addiu $sp, $sp, 32 +; +; N64-LABEL: f0: +; N64: # %bb.0: # %entry +; N64-NEXT: daddiu $sp, $sp, -32 +; N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill +; N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill +; N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) +; N64-NEXT: daddu $1, $1, $25 +; N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0))) +; N64-NEXT: ld $25, %call16(f1)($gp) +; N64-NEXT: jalr $25 +; N64-NEXT: nop +; N64-NEXT: ld $1, %got_disp(p)($gp) +; N64-NEXT: ld $25, %call16(f2)($gp) +; N64-NEXT: jalr $25 +; N64-NEXT: lw $4, 0($1) +; N64-NEXT: ld $1, %got_disp(q)($gp) +; N64-NEXT: lw $16, 0($1) +; N64-NEXT: ld $25, %call16(f2)($gp) +; N64-NEXT: jalr $25 +; N64-NEXT: move $4, $16 +; N64-NEXT: ld $1, %got_disp(r)($gp) +; N64-NEXT: lw $5, 0($1) +; N64-NEXT: ld $25, %call16(f3)($gp) +; N64-NEXT: jalr $25 +; N64-NEXT: move $4, $16 +; N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload +; N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload +; N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; N64-NEXT: jr $ra +; N64-NEXT: daddiu $sp, $sp, 32 +; +; N32-LABEL: f0: +; N32: # %bb.0: # %entry +; N32-NEXT: addiu $sp, $sp, -32 +; N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill +; N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill +; N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) +; N32-NEXT: addu $1, $1, $25 +; N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0))) +; N32-NEXT: lw $25, %call16(f1)($gp) +; N32-NEXT: jalr $25 +; N32-NEXT: nop +; N32-NEXT: lw $1, %got_disp(p)($gp) +; N32-NEXT: lw $25, %call16(f2)($gp) +; N32-NEXT: jalr $25 +; N32-NEXT: lw $4, 0($1) +; N32-NEXT: lw $1, %got_disp(q)($gp) +; N32-NEXT: lw $16, 0($1) +; N32-NEXT: lw $25, %call16(f2)($gp) +; N32-NEXT: jalr $25 +; N32-NEXT: move $4, $16 +; N32-NEXT: lw $1, %got_disp(r)($gp) +; N32-NEXT: lw $5, 0($1) +; N32-NEXT: lw $25, %call16(f3)($gp) +; N32-NEXT: jalr $25 +; N32-NEXT: move $4, $16 +; N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload +; N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload +; N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; N32-NEXT: jr $ra +; N32-NEXT: addiu $sp, $sp, 32 +; +; O3O32-LABEL: f0: +; O3O32: # %bb.0: # %entry +; O3O32-NEXT: lui $2, %hi(_gp_disp) +; O3O32-NEXT: addiu $2, $2, %lo(_gp_disp) +; O3O32-NEXT: addiu $sp, $sp, -32 +; O3O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; O3O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill +; O3O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill +; O3O32-NEXT: addu $16, $2, $25 +; O3O32-NEXT: lw $25, %call16(f1)($16) +; O3O32-NEXT: jalr $25 +; O3O32-NEXT: move $gp, $16 +; O3O32-NEXT: lw $1, %got(p)($16) +; O3O32-NEXT: lw $25, %call16(f2)($16) +; O3O32-NEXT: move $gp, $16 +; O3O32-NEXT: jalr $25 +; O3O32-NEXT: lw $4, 0($1) +; O3O32-NEXT: lw $1, %got(q)($16) +; O3O32-NEXT: lw $25, %call16(f2)($16) +; O3O32-NEXT: lw $17, 0($1) +; O3O32-NEXT: jalr $25 +; O3O32-NEXT: move $4, $17 +; O3O32-NEXT: lw $1, %got(r)($16) +; O3O32-NEXT: lw $25, %call16(f3)($16) +; O3O32-NEXT: move $4, $17 +; O3O32-NEXT: move $gp, $16 +; O3O32-NEXT: jalr $25 +; O3O32-NEXT: lw $5, 0($1) +; O3O32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload +; O3O32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload +; O3O32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; O3O32-NEXT: jr $ra +; O3O32-NEXT: addiu $sp, $sp, 32 +; +; O3N64-LABEL: f0: +; O3N64: # %bb.0: # %entry +; O3N64-NEXT: daddiu $sp, $sp, -32 +; O3N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; O3N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill +; O3N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill +; O3N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) +; O3N64-NEXT: daddu $1, $1, $25 +; O3N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0))) +; O3N64-NEXT: ld $25, %call16(f1)($gp) +; O3N64-NEXT: jalr $25 +; O3N64-NEXT: nop +; O3N64-NEXT: ld $1, %got_disp(p)($gp) +; O3N64-NEXT: ld $25, %call16(f2)($gp) +; O3N64-NEXT: jalr $25 +; O3N64-NEXT: lw $4, 0($1) +; O3N64-NEXT: ld $1, %got_disp(q)($gp) +; O3N64-NEXT: ld $25, %call16(f2)($gp) +; O3N64-NEXT: lw $16, 0($1) +; O3N64-NEXT: jalr $25 +; O3N64-NEXT: move $4, $16 +; O3N64-NEXT: ld $1, %got_disp(r)($gp) +; O3N64-NEXT: ld $25, %call16(f3)($gp) +; O3N64-NEXT: move $4, $16 +; O3N64-NEXT: jalr $25 +; O3N64-NEXT: lw $5, 0($1) +; O3N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload +; O3N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload +; O3N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; O3N64-NEXT: jr $ra +; O3N64-NEXT: daddiu $sp, $sp, 32 +; +; O3N32-LABEL: f0: +; O3N32: # %bb.0: # %entry +; O3N32-NEXT: addiu $sp, $sp, -32 +; O3N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; O3N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill +; O3N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill +; O3N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0))) +; O3N32-NEXT: addu $1, $1, $25 +; O3N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0))) +; O3N32-NEXT: lw $25, %call16(f1)($gp) +; O3N32-NEXT: jalr $25 +; O3N32-NEXT: nop +; O3N32-NEXT: lw $1, %got_disp(p)($gp) +; O3N32-NEXT: lw $25, %call16(f2)($gp) +; O3N32-NEXT: jalr $25 +; O3N32-NEXT: lw $4, 0($1) +; O3N32-NEXT: lw $1, %got_disp(q)($gp) +; O3N32-NEXT: lw $25, %call16(f2)($gp) +; O3N32-NEXT: lw $16, 0($1) +; O3N32-NEXT: jalr $25 +; O3N32-NEXT: move $4, $16 +; O3N32-NEXT: lw $1, %got_disp(r)($gp) +; O3N32-NEXT: lw $25, %call16(f3)($gp) +; O3N32-NEXT: move $4, $16 +; O3N32-NEXT: jalr $25 +; O3N32-NEXT: lw $5, 0($1) +; O3N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload +; O3N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload +; O3N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; O3N32-NEXT: jr $ra +; O3N32-NEXT: addiu $sp, $sp, 32 entry: -; CHECK: jalr -; CHECK-NOT: got({{.*}})($gp) -; CHECK: lw $gp -; CHECK: jalr -; CHECK-NOT: got({{.*}})($gp) -; CHECK: lw $gp -; CHECK: jalr -; CHECK-NOT: got({{.*}})($gp) -; CHECK: lw $gp - tail call void (...) @f1() nounwind + tail call void @f1() nounwind %tmp = load i32, i32* @p, align 4 tail call void @f2(i32 %tmp) nounwind %tmp1 = load i32, i32* @q, align 4 + tail call void @f2(i32 %tmp1) nounwind %tmp2 = load i32, i32* @r, align 4 tail call void @f3(i32 %tmp1, i32 %tmp2) nounwind ret void } -declare void @f1(...) +declare void @f1() declare void @f2(i32) |

