blob: 8ca10275b2af45d88bc93991ef7c734c9992d26f [file] [edit]
; 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
}