blob: 35242b2d70f888d57d82ffa1ced166c496bc439e [file] [edit]
; RUN: llc -mtriple=sparc -verify-machineinstrs < %s | FileCheck %s
; Leaf conversion must be decided from the registers that are actually used
; after allocation, so that a call-free function under register pressure keeps
; its register window instead of being forced to spill.
@g = global [8 x i32] zeroinitializer
; Eight simultaneously-live values plus two addresses do not fit in the
; registers a leaf may use. The function must retain its register window and
; not spill.
; CHECK-LABEL: high_pressure_no_call:
; CHECK: save %sp, -{{[0-9]+}}, %sp
; CHECK-NOT: %sp
; CHECK: ret
; CHECK-NEXT: restore
define void @high_pressure_no_call() {
entry:
%p0 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 0
%p1 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 1
%p2 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 2
%p3 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 3
%p4 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 4
%p5 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 5
%p6 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 6
%p7 = getelementptr inbounds [8 x i32], ptr @g, i32 0, i32 7
%v0 = load volatile i32, ptr %p0
%v1 = load volatile i32, ptr %p1
%v2 = load volatile i32, ptr %p2
%v3 = load volatile i32, ptr %p3
%v4 = load volatile i32, ptr %p4
%v5 = load volatile i32, ptr %p5
%v6 = load volatile i32, ptr %p6
%v7 = load volatile i32, ptr %p7
store volatile i32 %v7, ptr %p0
store volatile i32 %v6, ptr %p1
store volatile i32 %v5, ptr %p2
store volatile i32 %v4, ptr %p3
store volatile i32 %v3, ptr %p4
store volatile i32 %v2, ptr %p5
store volatile i32 %v1, ptr %p6
store volatile i32 %v0, ptr %p7
ret void
}
; A small call-free function must still be converted to a leaf.
; CHECK-LABEL: low_pressure_no_call:
; CHECK-NOT: save
; CHECK: retl
; CHECK-NEXT: add %o0, %o1, %o0
define i32 @low_pressure_no_call(i32 %a, i32 %b) {
entry:
%sum = add i32 %a, %b
ret i32 %sum
}