diff --git a/bolt/test/RISCV/internal-func-reloc.s b/bolt/test/RISCV/internal-func-reloc.s new file mode 100644 --- /dev/null +++ b/bolt/test/RISCV/internal-func-reloc.s @@ -0,0 +1,43 @@ +/// Check that functions with internal relocations are considered "simple" and +/// get transformed by BOLT. The tests rely on the "remove-nops" optimization: +/// if nops got removed from the function, it got transformed by BOLT. + +// RUN: %clang %cflags -o %t %s +// RUN: llvm-bolt -o %t.bolt %t +// RUN: llvm-objdump -d %t.bolt | FileCheck %s + + .text + + /// These options are only used to make the assembler output easier to predict + .option norelax + .option norvc + + .globl _start + .p2align 1 +// CHECK: <_start>: +// CHECK-NEXT: j 0x{{.*}} <_start> +_start: + nop +1: + j 1b + .size _start, .-_start + + .globl f + .p2align 1 +// CHECK: : +// CHECK-NEXT: auipc a0, 0 +// CHECK-NEXT: addi a0, a0, 12 +f: + nop +1: + /// Same as "la a0, g" but more explicit + auipc a0, %pcrel_hi(g) + addi a0, a0, %pcrel_lo(1b) + ret + .size f, .-f + + .globl g + .p2align 1 +g: + ret + .size g, .-g diff --git a/bolt/test/RISCV/reorder-blocks-reverse.s b/bolt/test/RISCV/reorder-blocks-reverse.s new file mode 100644 --- /dev/null +++ b/bolt/test/RISCV/reorder-blocks-reverse.s @@ -0,0 +1,31 @@ +// RUN: %clang %cflags -o %t %s +// RUN: llvm-bolt --reorder-blocks=reverse -o %t.bolt %t +// RUN: llvm-objdump -d --no-show-raw-insn %t.bolt | FileCheck %s + + .text + .globl _start + .p2align 1 +_start: + nop + beq t0, t1, 1f + nop + beq t0, t2, 2f +1: + li a0, 5 + j 3f +2: + li a0, 6 +3: + ret + .size _start,.-_start + +// CHECK: {{.*}}00 <_start>: +// CHECK-NEXT: {{.*}}00: beq t0, t1, {{.*}} <_start+0x10> +// CHECK-NEXT: {{.*}}04: j {{.*}} <_start+0x16> +// CHECK-NEXT: {{.*}}08: ret +// CHECK-NEXT: {{.*}}0a: li a0, 6 +// CHECK-NEXT: {{.*}}0c: j {{.*}} <_start+0x8> +// CHECK-NEXT: {{.*}}10: li a0, 5 +// CHECK-NEXT: {{.*}}12: j {{.*}} <_start+0x8> +// CHECK-NEXT: {{.*}}16: beq t0, t2, {{.*}} <_start+0xa> +// CHECK-NEXT: {{.*}}1a: j {{.*}} <_start+0x10>