|
|
@@ -0,0 +1,168 @@ |
|
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
|
|
|
|
|
; RUN: llc < %s -mtriple=aarch64 -regalloc=basic | FileCheck %s |
|
|
|
|
|
; Test that the register allocator behaves differently with minsize functions. |
|
|
|
|
|
declare void @foo(i32, ptr) |
|
|
|
|
|
define void @optsize(i32 %arg, i32 %arg1, ptr %arg2, ptr %arg3, ptr %arg4, i32 %arg5, i1 %arg6) minsize { |
|
|
; CHECK-LABEL: optsize: |
|
|
; CHECK: // %bb.0: // %bb |
|
|
; CHECK-NEXT: stp x30, x23, [sp, #-48]! // 16-byte Folded Spill |
|
|
; CHECK-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill |
|
|
; CHECK-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill |
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 48 |
|
|
; CHECK-NEXT: .cfi_offset w19, -8 |
|
|
; CHECK-NEXT: .cfi_offset w20, -16 |
|
|
; CHECK-NEXT: .cfi_offset w21, -24 |
|
|
; CHECK-NEXT: .cfi_offset w22, -32 |
|
|
; CHECK-NEXT: .cfi_offset w23, -40 |
|
|
; CHECK-NEXT: .cfi_offset w30, -48 |
|
|
; CHECK-NEXT: mov w23, w5 |
|
|
; CHECK-NEXT: mov x22, x4 |
|
|
; CHECK-NEXT: mov x21, x3 |
|
|
; CHECK-NEXT: mov x20, x2 |
|
|
; CHECK-NEXT: mov w19, w1 |
|
|
; CHECK-NEXT: .LBB0_1: // %bb8 |
|
|
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 |
|
|
; CHECK-NEXT: cbz w19, .LBB0_1 |
|
|
; CHECK-NEXT: // %bb.2: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #39 |
|
|
; CHECK-NEXT: b.eq .LBB0_6 |
|
|
; CHECK-NEXT: // %bb.3: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #34 |
|
|
; CHECK-NEXT: b.eq .LBB0_6 |
|
|
; CHECK-NEXT: // %bb.4: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #10 |
|
|
; CHECK-NEXT: b.ne .LBB0_1 |
|
|
; CHECK-NEXT: // %bb.5: // %bb9 |
|
|
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1 |
|
|
; CHECK-NEXT: str wzr, [x20] |
|
|
; CHECK-NEXT: b .LBB0_1 |
|
|
; CHECK-NEXT: .LBB0_6: // %bb10 |
|
|
; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=1 |
|
|
; CHECK-NEXT: mov w0, w23 |
|
|
; CHECK-NEXT: mov x1, x21 |
|
|
; CHECK-NEXT: str wzr, [x22] |
|
|
; CHECK-NEXT: bl foo |
|
|
; CHECK-NEXT: b .LBB0_1 |
|
|
bb: |
|
|
br label %bb7 |
|
|
|
|
|
bb7: ; preds = %bb13, %bb |
|
|
%phi = phi i32 [ 0, %bb ], [ %spec.select, %bb13 ] |
|
|
br label %bb8 |
|
|
|
|
|
bb8: ; preds = %bb10, %bb9, %bb8, %bb7 |
|
|
switch i32 %arg1, label %bb8 [ |
|
|
i32 10, label %bb9 |
|
|
i32 1, label %bb16 |
|
|
i32 0, label %bb13 |
|
|
i32 39, label %bb10 |
|
|
i32 34, label %bb10 |
|
|
] |
|
|
|
|
|
bb9: ; preds = %bb8 |
|
|
store i32 0, ptr %arg2, align 4 |
|
|
br label %bb8 |
|
|
|
|
|
bb10: ; preds = %bb8, %bb8 |
|
|
store i32 0, ptr %arg4, align 4 |
|
|
tail call void @foo(i32 %arg5, ptr %arg3) |
|
|
br label %bb8 |
|
|
|
|
|
bb13: ; preds = %bb8 |
|
|
%not.arg6 = xor i1 %arg6, true |
|
|
%spec.select = zext i1 %not.arg6 to i32 |
|
|
br label %bb7 |
|
|
|
|
|
bb16: ; preds = %bb8 |
|
|
unreachable |
|
|
} |
|
|
|
|
|
define void @optspeed(i32 %arg, i32 %arg1, ptr %arg2, ptr %arg3, ptr %arg4, i32 %arg5, i1 %arg6) { |
|
|
; CHECK-LABEL: optspeed: |
|
|
; CHECK: // %bb.0: // %bb |
|
|
; CHECK-NEXT: stp x30, x23, [sp, #-48]! // 16-byte Folded Spill |
|
|
; CHECK-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill |
|
|
; CHECK-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill |
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 48 |
|
|
; CHECK-NEXT: .cfi_offset w19, -8 |
|
|
; CHECK-NEXT: .cfi_offset w20, -16 |
|
|
; CHECK-NEXT: .cfi_offset w21, -24 |
|
|
; CHECK-NEXT: .cfi_offset w22, -32 |
|
|
; CHECK-NEXT: .cfi_offset w23, -40 |
|
|
; CHECK-NEXT: .cfi_offset w30, -48 |
|
|
; CHECK-NEXT: mov w22, w5 |
|
|
; CHECK-NEXT: mov x21, x4 |
|
|
; CHECK-NEXT: mov x20, x3 |
|
|
; CHECK-NEXT: mov x23, x2 |
|
|
; CHECK-NEXT: mov w19, w1 |
|
|
; CHECK-NEXT: b .LBB1_2 |
|
|
; CHECK-NEXT: .LBB1_1: // %bb10 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: mov w0, w22 |
|
|
; CHECK-NEXT: mov x1, x20 |
|
|
; CHECK-NEXT: str wzr, [x21] |
|
|
; CHECK-NEXT: bl foo |
|
|
; CHECK-NEXT: .LBB1_2: // %bb8 |
|
|
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #33 |
|
|
; CHECK-NEXT: b.gt .LBB1_6 |
|
|
; CHECK-NEXT: // %bb.3: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: cbz w19, .LBB1_2 |
|
|
; CHECK-NEXT: // %bb.4: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #10 |
|
|
; CHECK-NEXT: b.ne .LBB1_2 |
|
|
; CHECK-NEXT: // %bb.5: // %bb9 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: str wzr, [x23] |
|
|
; CHECK-NEXT: b .LBB1_2 |
|
|
; CHECK-NEXT: .LBB1_6: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #34 |
|
|
; CHECK-NEXT: b.eq .LBB1_1 |
|
|
; CHECK-NEXT: // %bb.7: // %bb8 |
|
|
; CHECK-NEXT: // in Loop: Header=BB1_2 Depth=1 |
|
|
; CHECK-NEXT: cmp w19, #39 |
|
|
; CHECK-NEXT: b.eq .LBB1_1 |
|
|
; CHECK-NEXT: b .LBB1_2 |
|
|
bb: |
|
|
br label %bb7 |
|
|
|
|
|
bb7: ; preds = %bb13, %bb |
|
|
%phi = phi i32 [ 0, %bb ], [ %spec.select, %bb13 ] |
|
|
br label %bb8 |
|
|
|
|
|
bb8: ; preds = %bb10, %bb9, %bb8, %bb7 |
|
|
switch i32 %arg1, label %bb8 [ |
|
|
i32 10, label %bb9 |
|
|
i32 1, label %bb16 |
|
|
i32 0, label %bb13 |
|
|
i32 39, label %bb10 |
|
|
i32 34, label %bb10 |
|
|
] |
|
|
|
|
|
bb9: ; preds = %bb8 |
|
|
store i32 0, ptr %arg2, align 4 |
|
|
br label %bb8 |
|
|
|
|
|
bb10: ; preds = %bb8, %bb8 |
|
|
store i32 0, ptr %arg4, align 4 |
|
|
tail call void @foo(i32 %arg5, ptr %arg3) |
|
|
br label %bb8 |
|
|
|
|
|
bb13: ; preds = %bb8 |
|
|
%not.arg6 = xor i1 %arg6, true |
|
|
%spec.select = zext i1 %not.arg6 to i32 |
|
|
br label %bb7 |
|
|
|
|
|
bb16: ; preds = %bb8 |
|
|
unreachable |
|
|
} |