| ;; Check prefetch directives in basic block section profiles. | |
| ;; | |
| ;; Specify the bb sections profile: | |
| ; RUN: echo 'v1' > %t | |
| ; RUN: echo 'f foo' >> %t | |
| ; RUN: echo 't 0,0' >> %t | |
| ; RUN: echo 't 1,0' >> %t | |
| ; RUN: echo 't 1,1' >> %t | |
| ; RUN: echo 't 2,1' >> %t | |
| ; RUN: echo 't 3,0' >> %t | |
| ; RUN: echo 't 3,1' >> %t | |
| ; RUN: echo 'i 3,0 bar,0,0' >> %t | |
| ; RUN: echo 'i 2,1 foo,1,0' >> %t | |
| ; RUN: echo 'i 1,1 extfunc,5,5' >> %t | |
| ; RUN: echo 'i 1,1 extfunc,5,5' >> %t | |
| ; RUN: echo 'i 1,1 bar,0,0' >> %t | |
| ; RUN: echo 'f bar' >> %t | |
| ; RUN: echo 't 0,0' >> %t | |
| ; RUN: echo 't 21,1' >> %t | |
| ; RUN: echo 'i 0,1 foo,0,0' >> %t | |
| ; RUN: echo 'f qux' >> %t | |
| ; RUN: echo 't 0,0' >> %t | |
| ; RUN: echo 't 0,1' >> %t | |
| ;; | |
| ; RUN: llc < %s -mtriple=x86_64-pc-linux -asm-verbose=false -function-sections -basic-block-sections=%t -O0 | FileCheck %s | |
| define void @foo(i1 %arg) nounwind { | |
| br i1 %arg, label %cond.true, label %cond.false | |
| ; CHECK: foo: | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_foo_0_0 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_0_0: | |
| cond.true: ; preds = %1 | |
| call i32 @bar() | |
| br label %end | |
| ; CHECK: .globl __llvm_prefetch_target_foo_1_0 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_1_0: | |
| ; CHECK-NEXT: callq bar@PLT | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_foo_1_1 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_1_1: | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_extfunc_5_5(%rip) | |
| ; CHECK-NEXT: .weak __llvm_prefetch_target_extfunc_5_5 | |
| ; CHECK-NEXT: __llvm_prefetch_target_extfunc_5_5: | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_extfunc_5_5(%rip) | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_bar_0_0(%rip) | |
| cond.false: ; preds = %1 | |
| call i32 @baz() | |
| br label %end | |
| ; CHECK: callq baz@PLT | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_foo_2_1 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_2_1: | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_foo_1_0(%rip) | |
| end: ; preds = %11, %9 | |
| ret void | |
| ; CHECK: .LBB0_3: | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_foo_3_0 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_3_0: | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_bar_0_0(%rip) | |
| ; CHECK: .globl __llvm_prefetch_target_foo_3_1 | |
| ; CHECK-NEXT: __llvm_prefetch_target_foo_3_1: | |
| } | |
| define weak i32 @bar() nounwind { | |
| %call = call i32 @baz() | |
| ret i32 %call | |
| ; CHECK: bar: | |
| ; CHECK-NEXT: .weak __llvm_prefetch_target_bar_21_1 | |
| ; CHECK-NEXT: __llvm_prefetch_target_bar_21_1: | |
| ; CHECK-NEXT: .weak __llvm_prefetch_target_bar_0_0 | |
| ; CHECK-NEXT: __llvm_prefetch_target_bar_0_0: | |
| ; CHECK: callq baz@PLT | |
| ; CHECK-NEXT: prefetchit1 __llvm_prefetch_target_foo_0_0(%rip) | |
| } | |
| define internal i32 @qux() nounwind { | |
| %call = call i32 @baz() | |
| ret i32 %call | |
| ; CHECK: qux: | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_qux_0_0 | |
| ; CHECK-NEXT: __llvm_prefetch_target_qux_0_0: | |
| ; CHECK: callq baz@PLT | |
| ; CHECK-NEXT: .globl __llvm_prefetch_target_qux_0_1 | |
| ; CHECK-NEXT: __llvm_prefetch_target_qux_0_1: | |
| } | |
| declare i32 @baz() |