1
; Test variable-sized allocas and addresses based on them in cases where
2
; stack arguments are needed.
4
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK1
5
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK2
6
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-A
7
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-B
8
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-C
9
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-D
10
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-FP
12
declare i64 @bar(i8 *%a, i8 *%b, i8 *%c, i8 *%d, i8 *%e, i64 %f, i64 %g)
14
; Allocate %length bytes and take addresses based on the result.
15
; There are two stack arguments, so an offset of 160 + 2 * 8 == 176
16
; is added to the copy of %r15.
17
define i64 @f1(i64 %length, i64 %index) {
18
; The full allocation sequence is:
26
; The third instruction does not depend on the first two, so check for
27
; two fully-ordered sequences.
29
; FIXME: a better sequence would be:
37
; CHECK1: la %r0, 7(%r2)
38
; CHECK1: nill %r0, 65528
39
; CHECK1: sgr %r1, %r0
40
; CHECK1: lgr %r15, %r1
43
; CHECK2: lgr %r1, %r15
44
; CHECK2: sgr %r1, %r0
45
; CHECK2: lgr %r15, %r1
48
; CHECK-A: lgr %r15, %r1
49
; CHECK-A: la %r2, 176(%r1)
52
; CHECK-B: lgr %r15, %r1
53
; CHECK-B: la %r3, 177(%r1)
56
; CHECK-C: lgr %r15, %r1
57
; CHECK-C: la %r4, 4095({{%r3,%r1|%r1,%r3}})
60
; CHECK-D: lgr %r15, %r1
61
; CHECK-D: lay %r5, 4096({{%r3,%r1|%r1,%r3}})
64
; CHECK-E: lgr %r15, %r1
65
; CHECK-E: lay %r6, 4271({{%r3,%r1|%r1,%r3}})
68
; CHECK-FP: lgr %r11, %r15
69
; CHECK-FP: lmg %r6, %r15, 224(%r11)
70
%a = alloca i8, i64 %length
71
%b = getelementptr i8 *%a, i64 1
72
%cindex = add i64 %index, 3919
73
%c = getelementptr i8 *%a, i64 %cindex
74
%dindex = add i64 %index, 3920
75
%d = getelementptr i8 *%a, i64 %dindex
76
%eindex = add i64 %index, 4095
77
%e = getelementptr i8 *%a, i64 %eindex
78
%count = call i64 @bar(i8 *%a, i8 *%b, i8 *%c, i8 *%d, i8 *%e, i64 0, i64 0)
79
%res = add i64 %count, 1