Skip to content

Commit 738c135

Browse files
authored
SystemZ: Add more tests for fp128 atomics (#90269)
These did not have proper floating point uses so weren't representative samples. The bitcast inserted by lowering could be absorbed by the load/store on the source/use.
1 parent ff03f23 commit 738c135

File tree

3 files changed

+137
-4
lines changed

3 files changed

+137
-4
lines changed

llvm/test/CodeGen/SystemZ/atomic-load-08.ll

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
; loads with a bitcast, and this test case gets converted into that form as
33
; well by the AtomicExpand pass.
44
;
5-
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6-
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5+
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefixes=CHECK,BASE %s
6+
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck -check-prefixes=CHECK,Z13 %s
77

88
define void @f1(ptr %ret, ptr %src) {
99
; CHECK-LABEL: f1:
@@ -17,10 +17,54 @@ define void @f1(ptr %ret, ptr %src) {
1717
ret void
1818
}
1919

20+
define void @f1_fpuse(ptr %ret, ptr %src) {
21+
; CHECK-LABEL: f1_fpuse:
22+
; CHECK: # %bb.0:
23+
; BASE-NEXT: aghi %r15, -176
24+
; BASE-NEXT: .cfi_def_cfa_offset 336
25+
26+
; CHECK-NEXT: lpq %r0, 0(%r3)
27+
28+
; BASE-NEXT: stg %r1, 168(%r15)
29+
; BASE-NEXT: stg %r0, 160(%r15)
30+
; BASE-NEXT: ld %f0, 160(%r15)
31+
; BASE-NEXT: ld %f2, 168(%r15)
32+
33+
; Z13-NEXT: vlvgp %v0, %r0, %r1
34+
; Z13-NEXT: vrepg %v2, %v0, 1
35+
36+
; CHECK-NEXT: axbr %f0, %f0
37+
; CHECK-NEXT: std %f0, 0(%r2)
38+
; CHECK-NEXT: std %f2, 8(%r2)
39+
; BASE-NEXT: aghi %r15, 176
40+
; CHECK-NEXT: br %r14
41+
42+
%val = load atomic fp128, ptr %src seq_cst, align 16
43+
%use = fadd fp128 %val, %val
44+
store fp128 %use, ptr %ret, align 8
45+
ret void
46+
}
47+
2048
define void @f2(ptr %ret, ptr %src) {
2149
; CHECK-LABEL: f2:
2250
; CHECK: brasl %r14, __atomic_load@PLT
2351
%val = load atomic fp128, ptr %src seq_cst, align 8
2452
store fp128 %val, ptr %ret, align 8
2553
ret void
2654
}
55+
56+
define void @f2_fpuse(ptr %ret, ptr %src) {
57+
; CHECK-LABEL: f2_fpuse:
58+
; CHECK: brasl %r14, __atomic_load@PLT
59+
; CHECK-NEXT: ld %f0, 160(%r15)
60+
; CHECK-NEXT: ld %f2, 168(%r15)
61+
; CHECK-NEXT: axbr %f0, %f0
62+
; CHECK-NEXT: std %f0, 0(%r13)
63+
; CHECK-NEXT: std %f2, 8(%r13)
64+
; CHECK-NEXT: lmg %r13, %r15, 280(%r15)
65+
; CHECK-NEXT: br %r14
66+
%val = load atomic fp128, ptr %src seq_cst, align 8
67+
%use = fadd fp128 %val, %val
68+
store fp128 %use, ptr %ret, align 8
69+
ret void
70+
}

llvm/test/CodeGen/SystemZ/atomic-store-08.ll

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
; Test long double atomic stores. The atomic store is converted to i128 by
22
; the AtomicExpand pass.
33
;
4-
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5-
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4+
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefixes=CHECK,BASE %s
5+
; xUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck -check-prefixes=CHECK,Z13 %s
66

77
define void @f1(ptr %dst, ptr %src) {
88
; CHECK-LABEL: f1:
@@ -17,10 +17,57 @@ define void @f1(ptr %dst, ptr %src) {
1717
ret void
1818
}
1919

20+
define void @f1_fpsrc(ptr %dst, ptr %src) {
21+
; CHECK-LABEL: f1_fpsrc:
22+
; CHECK: # %bb.0:
23+
; CHECK-NEXT: ld %f0, 0(%r3)
24+
; CHECK-NEXT: ld %f2, 8(%r3)
25+
; CHECK-NEXT: axbr %f0, %f0
26+
27+
; BASE-NEXT: lgdr %r1, %f2
28+
; BASE-NEXT: lgdr %r0, %f0
29+
30+
; Z13-NEXT: vmrhg %v0, %v0, %v2
31+
; Z13-NEXT: vlgvg %r1, %v0, 1
32+
; Z13-NEXT: vlgvg %r0, %v0, 0
33+
34+
; CHECK-NEXT: stpq %r0, 0(%r2)
35+
; CHECK-NEXT: bcr 15, %r0
36+
; CHECK-NEXT: br %r14
37+
%val = load fp128, ptr %src, align 8
38+
%add = fadd fp128 %val, %val
39+
store atomic fp128 %add, ptr %dst seq_cst, align 16
40+
ret void
41+
}
42+
2043
define void @f2(ptr %dst, ptr %src) {
2144
; CHECK-LABEL: f2:
2245
; CHECK: brasl %r14, __atomic_store@PLT
2346
%val = load fp128, ptr %src, align 8
2447
store atomic fp128 %val, ptr %dst seq_cst, align 8
2548
ret void
2649
}
50+
51+
define void @f2_fpuse(ptr %dst, ptr %src) {
52+
; CHECK-LABEL: f2_fpuse:
53+
; CHECK: # %bb.0:
54+
; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
55+
; CHECK-NEXT: .cfi_offset %r14, -48
56+
; CHECK-NEXT: .cfi_offset %r15, -40
57+
; CHECK-NEXT: aghi %r15, -176
58+
; CHECK-NEXT: .cfi_def_cfa_offset 336
59+
; CHECK-NEXT: ld %f0, 0(%r3)
60+
; CHECK-NEXT: ld %f2, 8(%r3)
61+
; CHECK-NEXT: lgr %r3, %r2
62+
; CHECK-NEXT: axbr %f0, %f0
63+
; CHECK-NEXT: la %r4, 160(%r15)
64+
; CHECK-NEXT: lghi %r2, 16
65+
; CHECK-NEXT: lhi %r5, 5
66+
; CHECK-NEXT: std %f0, 160(%r15)
67+
; CHECK-NEXT: std %f2, 168(%r15)
68+
; CHECK-NEXT: brasl %r14, __atomic_store@PLT
69+
%val = load fp128, ptr %src, align 8
70+
%add = fadd fp128 %val, %val
71+
store atomic fp128 %add, ptr %dst seq_cst, align 8
72+
ret void
73+
}

llvm/test/CodeGen/SystemZ/atomicrmw-xchg-07.ll

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,45 @@ define void @f1(ptr align 16 %ret, ptr align 16 %src, ptr align 16 %b) {
2626
store fp128 %res, ptr %ret, align 16
2727
ret void
2828
}
29+
30+
define void @f1_fpuse(ptr align 16 %ret, ptr align 16 %src, ptr align 16 %b) {
31+
; CHECK-LABEL: f1_fpuse:
32+
; CHECK: # %bb.0:
33+
; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
34+
; CHECK-NEXT: .cfi_offset %r12, -64
35+
; CHECK-NEXT: .cfi_offset %r13, -56
36+
; CHECK-NEXT: .cfi_offset %r15, -40
37+
; CHECK-NEXT: aghi %r15, -176
38+
; CHECK-NEXT: .cfi_def_cfa_offset 336
39+
; CHECK-NEXT: ld %f0, 0(%r4)
40+
; CHECK-NEXT: ld %f2, 8(%r4)
41+
; CHECK-NEXT: lg %r0, 8(%r3)
42+
; CHECK-NEXT: lg %r1, 0(%r3)
43+
; CHECK-NEXT: axbr %f0, %f0
44+
; CHECK-NEXT: lgdr %r5, %f2
45+
; CHECK-NEXT: lgdr %r4, %f0
46+
; CHECK-NEXT: .LBB1_1: # %atomicrmw.start
47+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
48+
; CHECK-NEXT: lgr %r12, %r1
49+
; CHECK-NEXT: lgr %r13, %r0
50+
; CHECK-NEXT: cdsg %r12, %r4, 0(%r3)
51+
; CHECK-NEXT: lgr %r0, %r13
52+
; CHECK-NEXT: lgr %r1, %r12
53+
; CHECK-NEXT: jl .LBB1_1
54+
; CHECK-NEXT: # %bb.2: # %atomicrmw.end
55+
; CHECK-NEXT: stg %r1, 160(%r15)
56+
; CHECK-NEXT: stg %r0, 168(%r15)
57+
; CHECK-NEXT: ld %f0, 160(%r15)
58+
; CHECK-NEXT: ld %f2, 168(%r15)
59+
; CHECK-NEXT: axbr %f0, %f0
60+
; CHECK-NEXT: std %f0, 0(%r2)
61+
; CHECK-NEXT: std %f2, 8(%r2)
62+
; CHECK-NEXT: lmg %r12, %r15, 272(%r15)
63+
; CHECK-NEXT: br %r14
64+
%val = load fp128, ptr %b, align 16
65+
%add.src = fadd fp128 %val, %val
66+
%res = atomicrmw xchg ptr %src, fp128 %add.src seq_cst
67+
%res.x2 = fadd fp128 %res, %res
68+
store fp128 %res.x2, ptr %ret, align 16
69+
ret void
70+
}

0 commit comments

Comments
 (0)