| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=arm64-apple-darwin -o - %s | FileCheck %s | |
| ; In this example, we have a small loop that searches for a 0 word in a string. | |
| ; The exit block clobbers callee saves, so should be a good candidate for | |
| ; shrink wrapping. However, we have to look through the underlying objects of | |
| ; the phi to see this. | |
| define ptr @shrinkwrapme(ptr %p) { | |
| ; CHECK-LABEL: shrinkwrapme: | |
| ; CHECK: ; %bb.0: ; %entry | |
| ; CHECK-NEXT: sub x0, x0, #4 | |
| ; CHECK-NEXT: LBB0_1: ; %loop | |
| ; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 | |
| ; CHECK-NEXT: ldr w8, [x0, #4]! | |
| ; CHECK-NEXT: cbnz w8, LBB0_1 | |
| ; CHECK-NEXT: ; %bb.2: ; %exit | |
| ; CHECK-NEXT: stp x28, x27, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
| ; CHECK-NEXT: .cfi_offset w27, -8 | |
| ; CHECK-NEXT: .cfi_offset w28, -16 | |
| ; CHECK-NEXT: ; InlineAsm Start | |
| ; CHECK-NEXT: ; InlineAsm End | |
| ; CHECK-NEXT: ldp x28, x27, [sp], #16 ; 16-byte Folded Reload | |
| ; CHECK-NEXT: ret | |
| entry: | |
| br label %loop | |
| loop: | |
| %iv = phi ptr [ %p, %entry ], [ %iv.next, %loop ] | |
| %iv.next = getelementptr inbounds i32, ptr %iv, i64 1 | |
| %load = load i32, ptr %iv | |
| %load.zero = icmp eq i32 %load, 0 | |
| br i1 %load.zero, label %exit, label %loop | |
| exit: | |
| call void asm sideeffect "", "~{x27},~{x28}"() | |
| ret ptr %iv | |
| } | |
| ; This example is similar to the previous but one of the underlying objects of | |
| ; the phi is a loaded pointer and therefore not guaranteed to avoid the stack. | |
| define ptr @dontshrinkwrapme(ptr %p) { | |
| ; CHECK-LABEL: dontshrinkwrapme: | |
| ; CHECK: ; %bb.0: ; %entry | |
| ; CHECK-NEXT: stp x28, x27, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
| ; CHECK-NEXT: .cfi_offset w27, -8 | |
| ; CHECK-NEXT: .cfi_offset w28, -16 | |
| ; CHECK-NEXT: ldr x8, [x0] | |
| ; CHECK-NEXT: sub x0, x8, #4 | |
| ; CHECK-NEXT: LBB1_1: ; %loop | |
| ; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 | |
| ; CHECK-NEXT: ldr w8, [x0, #4]! | |
| ; CHECK-NEXT: cbnz w8, LBB1_1 | |
| ; CHECK-NEXT: ; %bb.2: ; %exit | |
| ; CHECK-NEXT: ; InlineAsm Start | |
| ; CHECK-NEXT: ; InlineAsm End | |
| ; CHECK-NEXT: ldp x28, x27, [sp], #16 ; 16-byte Folded Reload | |
| ; CHECK-NEXT: ret | |
| entry: | |
| %q = load ptr, ptr %p | |
| br label %loop | |
| loop: | |
| %iv = phi ptr [ %q, %entry ], [ %iv.next, %loop ] | |
| %iv.next = getelementptr inbounds i32, ptr %iv, i64 1 | |
| %load = load i32, ptr %iv | |
| %load.zero = icmp eq i32 %load, 0 | |
| br i1 %load.zero, label %exit, label %loop | |
| exit: | |
| call void asm sideeffect "", "~{x27},~{x28}"() | |
| ret ptr %iv | |
| } | |