| ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -aarch64-tbz-offset-bits=4 -aarch64-cbz-offset-bits=3 < %s | FileCheck %s |
| |
| ;; Check that branch relaxation accounts for the size of xray EXIT sleds |
| ;; Note that TAIL_CALL sleds don't exist on AArch64 and don't need a test. |
| define void @exit(i1 zeroext %0) nounwind "function-instrument"="xray-always" { |
| ; CHECK-LABEL: exit: |
| ; CHECK-NEXT: .Lfunc_begin0: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: .p2align 2 |
| ; CHECK-NEXT: .Lxray_sled_0: |
| ; CHECK-NEXT: b #32 |
| ; CHECK-COUNT-7: nop |
| ; CHECK-NOT: nop |
| ; CHECK: tbnz |
| ; CHECK-SAME: [[FALLTHROUGH:.LBB[0-9_]+]] |
| ; CHECK-NEXT: b |
| ; CHECK-SAME: [[OUT_OF_RANGE:.LBB[0-9_]+]] |
| ; CHECK-NEXT: [[FALLTHROUGH]]: |
| ; CHECK-NEXT: bl bar |
| ; CHECK: .p2align 2 |
| ; CHECK-NEXT: .Lxray_sled_1: |
| ; CHECK-NEXT: b #32 |
| ; CHECK-COUNT-7: nop |
| ; CHECK-NOT: nop |
| ; CHECK-NEXT: .Ltmp1: |
| ; CHECK-NEXT: ret |
| ; CHECK-NEXT: [[OUT_OF_RANGE]]: |
| ; CHECK-SAME: // %end2 |
| ; CHECK-NEXT: bl baz |
| br i1 %0, label %end1, label %end2 |
| |
| end1: |
| %2 = call i32 @bar() |
| ret void |
| |
| end2: |
| %3 = call i32 @baz() |
| ret void |
| } |
| |
| ;; Check that branch relaxation accounts for the size of xray EVENT sleds |
| define void @customevent(i1 zeroext %0, ptr nocapture noundef readonly %e1, i64 noundef %s1, ptr nocapture noundef readonly %e2, i64 noundef %s2) "function-instrument"="xray-always" { |
| ; CHECK-LABEL: customevent: |
| ; CHECK-NEXT: .Lfunc_begin1: |
| ; CHECK-NEXT: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: .p2align 2 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK: cbnz |
| ; CHECK-SAME: [[FALLTHROUGH_2:.LBB[0-9_]+]] |
| ; CHECK-NEXT: b |
| ; CHECK-SAME: [[OUT_OF_RANGE_2:.LBB[0-9_]+]] |
| ; CHECK-NEXT: [[FALLTHROUGH_2]]: |
| ; CHECK-SAME: // %end1 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK-NEXT: Begin XRay custom event |
| ; CHECK: bl __xray_CustomEvent |
| ; CHECK: End XRay custom event |
| ; CHECK-NEXT: [[OUT_OF_RANGE_2]]: |
| ; CHECK-SAME: // %end2 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK-NEXT: Begin XRay custom event |
| ; CHECK: bl __xray_CustomEvent |
| ; CHECK: End XRay custom event |
| ; CHECK: .Ltmp |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %0, label %end1, label %end2 |
| |
| end1: |
| call void @llvm.xray.customevent(ptr %e1, i64 %s1) |
| br label %end2 |
| |
| end2: |
| tail call void @llvm.xray.customevent(ptr %e2, i64 %s2) |
| ret void |
| } |
| |
| ;; Check that branch relaxation accounts for the size of xray TYPED_EVENT sleds |
| define void @typedevent(i1 zeroext %0, i64 noundef %type, ptr nocapture noundef readonly %event, i64 noundef %size) "function-instrument"="xray-always" { |
| ; CHECK-LABEL: typedevent: |
| ; CHECK-NEXT: .Lfunc_begin2: |
| ; CHECK-NEXT: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: .p2align 2 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK: cbnz |
| ; CHECK-SAME: [[FALLTHROUGH_3:.LBB[0-9_]+]] |
| ; CHECK-NEXT: b |
| ; CHECK-SAME: [[OUT_OF_RANGE_3:.LBB[0-9_]+]] |
| ; CHECK-NEXT: [[FALLTHROUGH_3]]: |
| ; CHECK-SAME: // %end1 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK-NEXT: Begin XRay typed event |
| ; CHECK: bl __xray_TypedEvent |
| ; CHECK: End XRay typed event |
| ; CHECK-NEXT: [[OUT_OF_RANGE_3]]: |
| ; CHECK-SAME: // %end2 |
| ; CHECK-NEXT: .Lxray_sled_{{[0-9]+}}: |
| ; CHECK-NEXT: Begin XRay typed event |
| ; CHECK: bl __xray_TypedEvent |
| ; CHECK: End XRay typed event |
| ; CHECK: .Ltmp |
| ; CHECK-NEXT: ret |
| entry: |
| br i1 %0, label %end1, label %end2 |
| |
| end1: |
| call void @llvm.xray.typedevent(i64 %type, ptr %event, i64 %size) |
| br label %end2 |
| |
| end2: |
| tail call void @llvm.xray.typedevent(i64 %size, ptr %event, i64 %type) |
| ret void |
| } |
| |
| declare void @llvm.xray.customevent(ptr, i64) |
| declare void @llvm.xray.typedevent(i64, ptr, i64) |
| declare i32 @bar() |
| declare i32 @baz() |