| ; 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 |
| } |