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