diff options
| author | Sameer AbuAsal <sabuasal@codeaurora.org> | 2018-03-02 22:04:12 +0000 |
|---|---|---|
| committer | Sameer AbuAsal <sabuasal@codeaurora.org> | 2018-03-02 22:04:12 +0000 |
| commit | 2646a41e54ba858fdcb0d52fb7286af5ecbc0d38 (patch) | |
| tree | be04597a8f2c3cd5a6b48af93145177e8cbe874c /llvm/test/MC | |
| parent | e403c862cc0788236269730e272c91fec74c4a9a (diff) | |
| download | bcm5719-llvm-2646a41e54ba858fdcb0d52fb7286af5ecbc0d38.tar.gz bcm5719-llvm-2646a41e54ba858fdcb0d52fb7286af5ecbc0d38.zip | |
[RISCV] Implement MC relaxations for compressed instructions.
Summary:
This patch implements relaxation for RISCV in the MC layer.
The following relaxations are currently handled:
1) Relax C_BEQZ to BEQ and C_BNEZ to BNEZ in RISCV.
2) Relax and C_J $imm to JAL x0, $imm and CJAL to JAL ra, $imm.
Reviewers: asb, llvm-commits, efriedma
Reviewed By: asb
Subscribers: shiva0217
Differential Revision: https://reviews.llvm.org/D43055
llvm-svn: 326626
Diffstat (limited to 'llvm/test/MC')
| -rw-r--r-- | llvm/test/MC/RISCV/fixups-compressed.s | 9 | ||||
| -rw-r--r-- | llvm/test/MC/RISCV/relocations.s | 6 | ||||
| -rw-r--r-- | llvm/test/MC/RISCV/rv32-relaxation.s | 75 | ||||
| -rw-r--r-- | llvm/test/MC/RISCV/rv64-relaxation.s | 64 |
4 files changed, 151 insertions, 3 deletions
diff --git a/llvm/test/MC/RISCV/fixups-compressed.s b/llvm/test/MC/RISCV/fixups-compressed.s index 65e4c773eca..a97d290f216 100644 --- a/llvm/test/MC/RISCV/fixups-compressed.s +++ b/llvm/test/MC/RISCV/fixups-compressed.s @@ -2,13 +2,15 @@ # RUN: | FileCheck -check-prefix=CHECK-FIXUP %s # RUN: llvm-mc -triple riscv32 -filetype=obj -mattr=+c < %s \ # RUN: | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INSTR %s +# RUN: llvm-mc -filetype=obj -mattr=+c -triple=riscv32 %s \ +# RUN: | llvm-readobj -r | FileCheck %s -check-prefix=CHECK-REL .LBB0_2: # CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_jump # CHECK-INSTR: c.j 0 c.j .LBB0_2 # CHECK: fixup A - offset: 0, value: func1, kind: fixup_riscv_rvc_jump -# CHECK-INSTR: c.jal 0 +# CHECK-INSTR: c.jal 6 c.jal func1 # CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_branch # CHECK-INSTR: c.beqz a3, -4 @@ -16,3 +18,8 @@ c.beqz a3, .LBB0_2 # CHECK-FIXUP: fixup A - offset: 0, value: .LBB0_2, kind: fixup_riscv_rvc_branch # CHECK-INSTR: c.bnez a5, -6 c.bnez a5, .LBB0_2 + +func1: + nop + +# CHECK-REL-NOT: R_RISCV diff --git a/llvm/test/MC/RISCV/relocations.s b/llvm/test/MC/RISCV/relocations.s index 13c6b512f26..77421620e68 100644 --- a/llvm/test/MC/RISCV/relocations.s +++ b/llvm/test/MC/RISCV/relocations.s @@ -85,11 +85,13 @@ bgeu a0, a1, foo # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_branch c.jal foo -# RELOC: R_RISCV_RVC_JUMP +# A compressed jump (c.j) to an unresolved symbol will be relaxed to a (jal). +# RELOC: R_RISCV_JAL # INSTR: c.jal foo # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_jump c.bnez a0, foo -# RELOC: R_RISCV_RVC_BRANCH +# A compressed branch (c.bnez) to an unresolved symbol will be relaxed to a (bnez). +# RELOC: R_RISCV_BRANCH # INSTR: c.bnez a0, foo # FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_rvc_branch diff --git a/llvm/test/MC/RISCV/rv32-relaxation.s b/llvm/test/MC/RISCV/rv32-relaxation.s new file mode 100644 index 00000000000..66109faf3eb --- /dev/null +++ b/llvm/test/MC/RISCV/rv32-relaxation.s @@ -0,0 +1,75 @@ +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s + +FAR_JUMP_NEGATIVE: + c.nop +.space 2000 + +FAR_BRANCH_NEGATIVE: + c.nop +.space 256 + +NEAR_NEGATIVE: + c.nop + +start: + c.bnez a0, NEAR +#INSTR: c.bnez a0, 72 + c.bnez a0, NEAR_NEGATIVE +#INSTR: c.bnez a0, -4 + c.bnez a0, FAR_BRANCH +#INSTR-NEXT: bnez a0, 326 + c.bnez a0, FAR_BRANCH_NEGATIVE +#INSTR-NEXT: bnez a0, -268 + c.bnez a0, FAR_JUMP +#INSTR-NEXT: bnez a0, 2320 + c.bnez a0, FAR_JUMP_NEGATIVE +#INSTR-NEXT: bnez a0, -2278 + + c.beqz a0, NEAR +#INSTR-NEXT: c.beqz a0, 52 + c.beqz a0, NEAR_NEGATIVE +#INSTR-NEXT: c.beqz a0, -24 + c.beqz a0, FAR_BRANCH +#INSTR-NEXT: beqz a0, 306 + c.beqz a0, FAR_BRANCH_NEGATIVE +#INSTR-NEXT: beqz a0, -288 + c.beqz a0, FAR_JUMP +#INSTR-NEXT: beqz a0, 2300 + c.beqz a0, FAR_JUMP_NEGATIVE +#INSTR-NEXT: beqz a0, -2298 + + c.j NEAR +#INSTR-NEXT: c.j 32 + c.j NEAR_NEGATIVE +#INSTR-NEXT: c.j -44 + c.j FAR_BRANCH +#INSTR-NEXT: c.j 286 + c.j FAR_BRANCH_NEGATIVE +#INSTR-NEXT: c.j -306 + c.j FAR_JUMP +#INSTR-NEXT: j 2284 + c.j FAR_JUMP_NEGATIVE +#INSTR-NEXT: j -2314 + + c.jal NEAR +#INSTR: c.jal 16 + c.jal NEAR_NEGATIVE +#INSTR: c.jal -60 + c.jal FAR_BRANCH +#INSTR-NEXT: c.jal 270 + c.jal FAR_BRANCH_NEGATIVE +#INSTR-NEXT: c.jal -322 + c.jal FAR_JUMP +#INSTR-NEXT: jal 2268 + c.jal FAR_JUMP_NEGATIVE +#INSTR-NEXT: jal -2330 + +NEAR: + c.nop +.space 256 +FAR_BRANCH: + c.nop +.space 2000 +FAR_JUMP: + c.nop diff --git a/llvm/test/MC/RISCV/rv64-relaxation.s b/llvm/test/MC/RISCV/rv64-relaxation.s new file mode 100644 index 00000000000..018408f575a --- /dev/null +++ b/llvm/test/MC/RISCV/rv64-relaxation.s @@ -0,0 +1,64 @@ +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+c < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=INSTR %s + +FAR_JUMP_NEGATIVE: + c.nop +.space 2000 + +FAR_BRANCH_NEGATIVE: + c.nop +.space 256 + +NEAR_NEGATIVE: + c.nop + +start: + c.bnez a0, NEAR +#INSTR: c.bnez a0, 56 + c.bnez a0, NEAR_NEGATIVE +#INSTR: c.bnez a0, -4 + c.bnez a0, FAR_BRANCH +#INSTR-NEXT: bnez a0, 310 + c.bnez a0, FAR_BRANCH_NEGATIVE +#INSTR-NEXT: bnez a0, -268 + c.bnez a0, FAR_JUMP +#INSTR-NEXT: bnez a0, 2304 + c.bnez a0, FAR_JUMP_NEGATIVE +#INSTR-NEXT: bnez a0, -2278 + + c.beqz a0, NEAR +#INSTR-NEXT: c.beqz a0, 36 + c.beqz a0, NEAR_NEGATIVE +#INSTR-NEXT: c.beqz a0, -24 + c.beqz a0, FAR_BRANCH +#INSTR-NEXT: beqz a0, 290 + c.beqz a0, FAR_BRANCH_NEGATIVE +#INSTR-NEXT: beqz a0, -288 + c.beqz a0, FAR_JUMP +#INSTR-NEXT: beqz a0, 2284 + c.beqz a0, FAR_JUMP_NEGATIVE +#INSTR-NEXT: beqz a0, -2298 + + c.j NEAR +#INSTR-NEXT: c.j 16 + c.j NEAR_NEGATIVE +#INSTR-NEXT: c.j -44 + c.j FAR_BRANCH +#INSTR-NEXT: c.j 270 + c.j FAR_BRANCH_NEGATIVE +#INSTR-NEXT: c.j -306 + c.j FAR_JUMP +#INSTR-NEXT: j 2268 + c.j FAR_JUMP_NEGATIVE +#INSTR-NEXT: j -2314 + +NEAR: + c.nop + +.space 256 +FAR_BRANCH: + c.nop + +.space 2000 +FAR_JUMP: + c.nop |

