Skip to content

Commit 2dd9f4e

Browse files
committed
Add test cases for builtin setjmp/longjm.
1 parent 81fe8ec commit 2dd9f4e

File tree

5 files changed

+477
-0
lines changed

5 files changed

+477
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang -mbackchain --target=s390x-linux -S -emit-llvm -o - %s | FileCheck %s
3+
4+
void *buf[20];
5+
// CHECK-LABEL: define dso_local void @foo(
6+
// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
7+
// CHECK-NEXT: [[ENTRY:.*:]]
8+
// CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.eh.sjlj.setjmp(ptr @buf)
9+
// CHECK-NEXT: ret void
10+
//
11+
void foo()
12+
{
13+
__builtin_setjmp (buf);
14+
}
15+
16+
// CHECK-LABEL: define dso_local void @foo1(
17+
// CHECK-SAME: ) #[[ATTR0]] {
18+
// CHECK-NEXT: [[ENTRY:.*:]]
19+
// CHECK-NEXT: call void @llvm.eh.sjlj.longjmp(ptr @buf)
20+
// CHECK-NEXT: unreachable
21+
//
22+
void foo1()
23+
{
24+
__builtin_longjmp (buf, 1);
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang --target=s390x-linux -S -emit-llvm -o - %s | FileCheck %s
3+
4+
void *buf[20];
5+
// CHECK-LABEL: define dso_local void @foo(
6+
// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
7+
// CHECK-NEXT: [[ENTRY:.*:]]
8+
// CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.eh.sjlj.setjmp(ptr @buf)
9+
// CHECK-NEXT: ret void
10+
//
11+
void foo()
12+
{
13+
__builtin_setjmp (buf);
14+
}
15+
16+
// CHECK-LABEL: define dso_local void @foo1(
17+
// CHECK-SAME: ) #[[ATTR0]] {
18+
// CHECK-NEXT: [[ENTRY:.*:]]
19+
// CHECK-NEXT: call void @llvm.eh.sjlj.longjmp(ptr @buf)
20+
// CHECK-NEXT: unreachable
21+
//
22+
void foo1()
23+
{
24+
__builtin_longjmp (buf, 1);
25+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; Test longjmp load from jmp_buf.
3+
; Frame pointer from Slot 1.
4+
; Jump address from Slot 2.
5+
; Backchain Value from Slot 3.
6+
; Stack Pointer from Slot 4.
7+
; Literal Pool Pointer from Slot 5.
8+
9+
; RUN: llc < %s -mtriple=s390x-linux-gnu -O2 | FileCheck %s
10+
11+
@buf = global [20 x ptr] zeroinitializer, align 8
12+
13+
define void @foo() {
14+
; CHECK-LABEL: foo:
15+
; CHECK: # %bb.0: # %entry
16+
; CHECK-NEXT: stmg %r11, %r15, 88(%r15)
17+
; CHECK-NEXT: .cfi_offset %r11, -72
18+
; CHECK-NEXT: .cfi_offset %r13, -56
19+
; CHECK-NEXT: .cfi_offset %r15, -40
20+
; CHECK-NEXT: lgrl %r1, buf@GOT
21+
; CHECK-NEXT: lg %r2, 8(%r1)
22+
; CHECK-NEXT: lg %r11, 0(%r1)
23+
; CHECK-NEXT: lg %r13, 32(%r1)
24+
; CHECK-NEXT: lg %r15, 24(%r1)
25+
; CHECK-NEXT: br %r2
26+
entry:
27+
tail call void @llvm.eh.sjlj.longjmp(ptr nonnull @buf)
28+
unreachable
29+
}
30+
31+
define void @bar() "backchain" {
32+
; CHECK-LABEL: bar:
33+
; CHECK: # %bb.0: # %entry
34+
; CHECK-NEXT: stmg %r11, %r15, 88(%r15)
35+
; CHECK-NEXT: .cfi_offset %r11, -72
36+
; CHECK-NEXT: .cfi_offset %r13, -56
37+
; CHECK-NEXT: .cfi_offset %r15, -40
38+
; CHECK-NEXT: lgrl %r1, buf@GOT
39+
; CHECK-NEXT: lg %r2, 8(%r1)
40+
; CHECK-NEXT: lg %r11, 0(%r1)
41+
; CHECK-NEXT: lg %r13, 32(%r1)
42+
; CHECK-NEXT: lg %r3, 16(%r1)
43+
; CHECK-NEXT: lg %r15, 24(%r1)
44+
; CHECK-NEXT: stg %r3, 0(%r15)
45+
; CHECK-NEXT: br %r2
46+
entry:
47+
tail call void @llvm.eh.sjlj.longjmp(ptr nonnull @buf)
48+
unreachable
49+
}
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; Simulate register pressure around setjmp call for integer arguments.
3+
; Test assembly of funtion call foo in func() in setjmp if and else part.
4+
; extern foo has 20 argument pointer to int.
5+
; Test setjmp store jmp_buf.
6+
; Return address in slot 2.
7+
; Stack Pointer in slot 4.
8+
; Clobber %r6-%r15, %f8-%f15.
9+
10+
; RUN: llc < %s -mtriple=s390x-linux-gnu -O2 | FileCheck %s
11+
12+
declare i32 @llvm.eh.sjlj.setjmp(ptr)
13+
declare void @foo(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr
14+
@buf = global [10 x ptr] zeroinitializer, align 8
15+
@t = global i32 0, align 4
16+
@s = global i32 0, align 4
17+
@r = global i32 0, align 4
18+
@q = global i32 0, align 4
19+
@p = global i32 0, align 4
20+
@o = global i32 0, align 4
21+
@n = global i32 0, align 4
22+
@m = global i32 0, align 4
23+
@l = global i32 0, align 4
24+
@k = global i32 0, align 4
25+
@j = global i32 0, align 4
26+
@i = global i32 0, align 4
27+
@h = global i32 0, align 4
28+
@g = global i32 0, align 4
29+
@f = global i32 0, align 4
30+
@e = global i32 0, align 4
31+
@d = global i32 0, align 4
32+
@c = global i32 0, align 4
33+
@b = global i32 0, align 4
34+
@a = global i32 0, align 4
35+
36+
define signext i32 @func() {
37+
; CHECK-LABEL: func:
38+
; CHECK: # %bb.0: # %entry
39+
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
40+
; CHECK-NEXT: .cfi_offset %r6, -112
41+
; CHECK-NEXT: .cfi_offset %r7, -104
42+
; CHECK-NEXT: .cfi_offset %r8, -96
43+
; CHECK-NEXT: .cfi_offset %r9, -88
44+
; CHECK-NEXT: .cfi_offset %r10, -80
45+
; CHECK-NEXT: .cfi_offset %r11, -72
46+
; CHECK-NEXT: .cfi_offset %r12, -64
47+
; CHECK-NEXT: .cfi_offset %r13, -56
48+
; CHECK-NEXT: .cfi_offset %r14, -48
49+
; CHECK-NEXT: .cfi_offset %r15, -40
50+
; CHECK-NEXT: aghi %r15, -448
51+
; CHECK-NEXT: .cfi_def_cfa_offset 608
52+
; CHECK-NEXT: std %f8, 440(%r15) # 8-byte Folded Spill
53+
; CHECK-NEXT: std %f9, 432(%r15) # 8-byte Folded Spill
54+
; CHECK-NEXT: std %f10, 424(%r15) # 8-byte Folded Spill
55+
; CHECK-NEXT: std %f11, 416(%r15) # 8-byte Folded Spill
56+
; CHECK-NEXT: std %f12, 408(%r15) # 8-byte Folded Spill
57+
; CHECK-NEXT: std %f13, 400(%r15) # 8-byte Folded Spill
58+
; CHECK-NEXT: std %f14, 392(%r15) # 8-byte Folded Spill
59+
; CHECK-NEXT: std %f15, 384(%r15) # 8-byte Folded Spill
60+
; CHECK-NEXT: .cfi_offset %f8, -168
61+
; CHECK-NEXT: .cfi_offset %f9, -176
62+
; CHECK-NEXT: .cfi_offset %f10, -184
63+
; CHECK-NEXT: .cfi_offset %f11, -192
64+
; CHECK-NEXT: .cfi_offset %f12, -200
65+
; CHECK-NEXT: .cfi_offset %f13, -208
66+
; CHECK-NEXT: .cfi_offset %f14, -216
67+
; CHECK-NEXT: .cfi_offset %f15, -224
68+
; CHECK-NEXT: lgrl %r1, buf@GOT
69+
; CHECK-NEXT: larl %r0, .LBB0_1
70+
; CHECK-NEXT: stg %r0, 8(%r1)
71+
; CHECK-NEXT: stg %r15, 24(%r1)
72+
; CHECK-NEXT: .LBB0_1: # Block address taken
73+
; CHECK-NEXT: # %entry
74+
; CHECK-NEXT: .LBB0_2: # %entry
75+
; CHECK-NEXT: lgrl %r1, t@GOT
76+
; CHECK-NEXT: stg %r1, 312(%r15) # 8-byte Folded Spill
77+
; CHECK-NEXT: lgrl %r2, s@GOT
78+
; CHECK-NEXT: stg %r2, 304(%r15) # 8-byte Folded Spill
79+
; CHECK-NEXT: lgrl %r3, r@GOT
80+
; CHECK-NEXT: stg %r3, 296(%r15) # 8-byte Folded Spill
81+
; CHECK-NEXT: lgrl %r4, q@GOT
82+
; CHECK-NEXT: stg %r4, 288(%r15) # 8-byte Folded Spill
83+
; CHECK-NEXT: mvhi 0(%r1), 1
84+
; CHECK-NEXT: mvhi 0(%r2), 1
85+
; CHECK-NEXT: mvhi 0(%r3), 1
86+
; CHECK-NEXT: mvhi 0(%r4), 1
87+
; CHECK-NEXT: lgrl %r5, p@GOT
88+
; CHECK-NEXT: lgrl %r14, o@GOT
89+
; CHECK-NEXT: lgrl %r1, n@GOT
90+
; CHECK-NEXT: stg %r1, 280(%r15) # 8-byte Folded Spill
91+
; CHECK-NEXT: lgrl %r9, m@GOT
92+
; CHECK-NEXT: mvhi 0(%r5), 1
93+
; CHECK-NEXT: stg %r5, 376(%r15) # 8-byte Folded Spill
94+
; CHECK-NEXT: mvhi 0(%r14), 1
95+
; CHECK-NEXT: stg %r14, 368(%r15) # 8-byte Folded Spill
96+
; CHECK-NEXT: mvhi 0(%r1), 1
97+
; CHECK-NEXT: mvhi 0(%r9), 1
98+
; CHECK-NEXT: stg %r9, 360(%r15) # 8-byte Folded Spill
99+
; CHECK-NEXT: lgrl %r1, l@GOT
100+
; CHECK-NEXT: lgrl %r2, k@GOT
101+
; CHECK-NEXT: lgrl %r3, j@GOT
102+
; CHECK-NEXT: lgrl %r4, i@GOT
103+
; CHECK-NEXT: stg %r4, 344(%r15) # 8-byte Folded Spill
104+
; CHECK-NEXT: mvhi 0(%r1), 1
105+
; CHECK-NEXT: stg %r1, 352(%r15) # 8-byte Folded Spill
106+
; CHECK-NEXT: mvhi 0(%r2), 1
107+
; CHECK-NEXT: stg %r2, 336(%r15) # 8-byte Folded Spill
108+
; CHECK-NEXT: mvhi 0(%r3), 1
109+
; CHECK-NEXT: stg %r3, 328(%r15) # 8-byte Folded Spill
110+
; CHECK-NEXT: mvhi 0(%r4), 1
111+
; CHECK-NEXT: lgrl %r4, h@GOT
112+
; CHECK-NEXT: lgrl %r8, g@GOT
113+
; CHECK-NEXT: lgrl %r7, f@GOT
114+
; CHECK-NEXT: lgrl %r6, e@GOT
115+
; CHECK-NEXT: mvhi 0(%r4), 1
116+
; CHECK-NEXT: stg %r4, 320(%r15) # 8-byte Folded Spill
117+
; CHECK-NEXT: mvhi 0(%r8), 1
118+
; CHECK-NEXT: mvhi 0(%r7), 1
119+
; CHECK-NEXT: mvhi 0(%r6), 1
120+
; CHECK-NEXT: lgrl %r13, d@GOT
121+
; CHECK-NEXT: lgrl %r12, c@GOT
122+
; CHECK-NEXT: lgrl %r11, b@GOT
123+
; CHECK-NEXT: lgrl %r10, a@GOT
124+
; CHECK-NEXT: mvhi 0(%r13), 1
125+
; CHECK-NEXT: mvhi 0(%r12), 1
126+
; CHECK-NEXT: mvhi 0(%r11), 1
127+
; CHECK-NEXT: mvhi 0(%r10), 1
128+
; CHECK-NEXT: mvc 272(8,%r15), 312(%r15) # 8-byte Folded Reload
129+
; CHECK-NEXT: mvc 264(8,%r15), 304(%r15) # 8-byte Folded Reload
130+
; CHECK-NEXT: mvc 256(8,%r15), 296(%r15) # 8-byte Folded Reload
131+
; CHECK-NEXT: mvc 248(8,%r15), 288(%r15) # 8-byte Folded Reload
132+
; CHECK-NEXT: stg %r5, 240(%r15)
133+
; CHECK-NEXT: stg %r14, 232(%r15)
134+
; CHECK-NEXT: mvc 224(8,%r15), 280(%r15) # 8-byte Folded Reload
135+
; CHECK-NEXT: stg %r9, 216(%r15)
136+
; CHECK-NEXT: stg %r1, 208(%r15)
137+
; CHECK-NEXT: stg %r2, 200(%r15)
138+
; CHECK-NEXT: stg %r3, 192(%r15)
139+
; CHECK-NEXT: lg %r9, 344(%r15) # 8-byte Folded Reload
140+
; CHECK-NEXT: stg %r9, 184(%r15)
141+
; CHECK-NEXT: stg %r4, 176(%r15)
142+
; CHECK-NEXT: stg %r8, 168(%r15)
143+
; CHECK-NEXT: stg %r7, 160(%r15)
144+
; CHECK-NEXT: lgr %r2, %r10
145+
; CHECK-NEXT: lgr %r3, %r11
146+
; CHECK-NEXT: lgr %r4, %r12
147+
; CHECK-NEXT: lgr %r5, %r13
148+
; CHECK-NEXT: brasl %r14, foo@PLT
149+
; CHECK-NEXT: l %r0, 0(%r11)
150+
; CHECK-NEXT: a %r0, 0(%r10)
151+
; CHECK-NEXT: a %r0, 0(%r12)
152+
; CHECK-NEXT: a %r0, 0(%r13)
153+
; CHECK-NEXT: a %r0, 0(%r6)
154+
; CHECK-NEXT: a %r0, 0(%r7)
155+
; CHECK-NEXT: a %r0, 0(%r8)
156+
; CHECK-NEXT: lg %r1, 320(%r15) # 8-byte Folded Reload
157+
; CHECK-NEXT: a %r0, 0(%r1)
158+
; CHECK-NEXT: a %r0, 0(%r9)
159+
; CHECK-NEXT: lg %r1, 328(%r15) # 8-byte Folded Reload
160+
; CHECK-NEXT: a %r0, 0(%r1)
161+
; CHECK-NEXT: lg %r1, 336(%r15) # 8-byte Folded Reload
162+
; CHECK-NEXT: a %r0, 0(%r1)
163+
; CHECK-NEXT: lg %r1, 352(%r15) # 8-byte Folded Reload
164+
; CHECK-NEXT: a %r0, 0(%r1)
165+
; CHECK-NEXT: lg %r1, 360(%r15) # 8-byte Folded Reload
166+
; CHECK-NEXT: a %r0, 0(%r1)
167+
; CHECK-NEXT: lg %r1, 280(%r15) # 8-byte Folded Reload
168+
; CHECK-NEXT: a %r0, 0(%r1)
169+
; CHECK-NEXT: lg %r1, 368(%r15) # 8-byte Folded Reload
170+
; CHECK-NEXT: a %r0, 0(%r1)
171+
; CHECK-NEXT: lg %r1, 376(%r15) # 8-byte Folded Reload
172+
; CHECK-NEXT: a %r0, 0(%r1)
173+
; CHECK-NEXT: lg %r1, 288(%r15) # 8-byte Folded Reload
174+
; CHECK-NEXT: a %r0, 0(%r1)
175+
; CHECK-NEXT: lg %r1, 296(%r15) # 8-byte Folded Reload
176+
; CHECK-NEXT: a %r0, 0(%r1)
177+
; CHECK-NEXT: lg %r1, 304(%r15) # 8-byte Folded Reload
178+
; CHECK-NEXT: a %r0, 0(%r1)
179+
; CHECK-NEXT: lg %r1, 312(%r15) # 8-byte Folded Reload
180+
; CHECK-NEXT: a %r0, 0(%r1)
181+
; CHECK-NEXT: lgfr %r2, %r0
182+
; CHECK-NEXT: ld %f8, 440(%r15) # 8-byte Folded Reload
183+
; CHECK-NEXT: ld %f9, 432(%r15) # 8-byte Folded Reload
184+
; CHECK-NEXT: ld %f10, 424(%r15) # 8-byte Folded Reload
185+
; CHECK-NEXT: ld %f11, 416(%r15) # 8-byte Folded Reload
186+
; CHECK-NEXT: ld %f12, 408(%r15) # 8-byte Folded Reload
187+
; CHECK-NEXT: ld %f13, 400(%r15) # 8-byte Folded Reload
188+
; CHECK-NEXT: ld %f14, 392(%r15) # 8-byte Folded Reload
189+
; CHECK-NEXT: ld %f15, 384(%r15) # 8-byte Folded Reload
190+
; CHECK-NEXT: lmg %r6, %r15, 496(%r15)
191+
; CHECK-NEXT: br %r14
192+
entry:
193+
%0 = tail call i32 @llvm.eh.sjlj.setjmp(ptr nonnull @buf)
194+
store i32 1, ptr @t, align 4
195+
store i32 1, ptr @s, align 4
196+
store i32 1, ptr @r, align 4
197+
store i32 1, ptr @q, align 4
198+
store i32 1, ptr @p, align 4
199+
store i32 1, ptr @o, align 4
200+
store i32 1, ptr @n, align 4
201+
store i32 1, ptr @m, align 4
202+
store i32 1, ptr @l, align 4
203+
store i32 1, ptr @k, align 4
204+
store i32 1, ptr @j, align 4
205+
store i32 1, ptr @i, align 4
206+
store i32 1, ptr @h, align 4
207+
store i32 1, ptr @g, align 4
208+
store i32 1, ptr @f, align 4
209+
store i32 1, ptr @e, align 4
210+
store i32 1, ptr @d, align 4
211+
store i32 1, ptr @c, align 4
212+
store i32 1, ptr @b, align 4
213+
store i32 1, ptr @a, align 4
214+
tail call void @foo(ptr noundef nonnull @a, ptr noundef nonnull @b, ptr noundef nonnull @c, ptr noundef nonnull @d, ptr noundef nonnull @e, ptr noundef nonnull @f, ptr noundef nonnull @g, ptr noundef nonnull @h, ptr noundef nonnull @i, ptr noundef nonnull @j, ptr noundef nonnull @k, ptr noundef nonnull @l, ptr noundef nonnull @m, ptr noundef nonnull @n, ptr noundef nonnull @o, ptr noundef nonnull @p, ptr noundef nonnull @q, ptr noundef nonnull @r, ptr noundef nonnull @s, ptr noundef nonnull @t)
215+
%1 = load i32, ptr @a, align 4
216+
%2 = load i32, ptr @b, align 4
217+
%add = add nsw i32 %2, %1
218+
%3 = load i32, ptr @c, align 4
219+
%add1 = add nsw i32 %add, %3
220+
%4 = load i32, ptr @d, align 4
221+
%add2 = add nsw i32 %add1, %4
222+
%5 = load i32, ptr @e, align 4
223+
%add3 = add nsw i32 %add2, %5
224+
%6 = load i32, ptr @f, align 4
225+
%add4 = add nsw i32 %add3, %6
226+
%7 = load i32, ptr @g, align 4
227+
%add5 = add nsw i32 %add4, %7
228+
%8 = load i32, ptr @h, align 4
229+
%add6 = add nsw i32 %add5, %8
230+
%9 = load i32, ptr @i, align 4
231+
%add7 = add nsw i32 %add6, %9
232+
%10 = load i32, ptr @j, align 4
233+
%add8 = add nsw i32 %add7, %10
234+
%11 = load i32, ptr @k, align 4
235+
%add9 = add nsw i32 %add8, %11
236+
%12 = load i32, ptr @l, align 4
237+
%add10 = add nsw i32 %add9, %12
238+
%13 = load i32, ptr @m, align 4
239+
%add11 = add nsw i32 %add10, %13
240+
%14 = load i32, ptr @n, align 4
241+
%add12 = add nsw i32 %add11, %14
242+
%15 = load i32, ptr @o, align 4
243+
%add13 = add nsw i32 %add12, %15
244+
%16 = load i32, ptr @p, align 4
245+
%add14 = add nsw i32 %add13, %16
246+
%17 = load i32, ptr @q, align 4
247+
%add15 = add nsw i32 %add14, %17
248+
%18 = load i32, ptr @r, align 4
249+
%add16 = add nsw i32 %add15, %18
250+
%19 = load i32, ptr @s, align 4
251+
%add17 = add nsw i32 %add16, %19
252+
%20 = load i32, ptr @t, align 4
253+
%add18 = add nsw i32 %add17, %20
254+
ret i32 %add18
255+
}

0 commit comments

Comments
 (0)