Skip to content

Commit 7bc1741

Browse files
committed
add a NFC test case for the function atomic_compare_exchange_weak
1 parent c5c4f0d commit 7bc1741

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
; Test the generate asm of function
2+
; int foo(_Atomic int *cp, int *old, int c) {
3+
; return atomic_compare_exchange_weak_explicit(cp, old, c, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4+
; }
5+
6+
; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix7.2.0.0 -mcpu=pwr8 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK
7+
; RUN: llc < %s -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix7.2.0.0 -mcpu=pwr8 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK64
8+
9+
10+
define i32 @foo(ptr noundef %cp, ptr noundef %old, i32 noundef %c) {
11+
entry:
12+
%cp.addr = alloca ptr, align 4
13+
%old.addr = alloca ptr, align 4
14+
%c.addr = alloca i32, align 4
15+
%.atomictmp = alloca i32, align 4
16+
%cmpxchg.bool = alloca i8, align 1
17+
store ptr %cp, ptr %cp.addr, align 4
18+
store ptr %old, ptr %old.addr, align 4
19+
store i32 %c, ptr %c.addr, align 4
20+
%0 = load ptr, ptr %cp.addr, align 4
21+
%1 = load ptr, ptr %old.addr, align 4
22+
%2 = load i32, ptr %c.addr, align 4
23+
store i32 %2, ptr %.atomictmp, align 4
24+
%3 = load i32, ptr %1, align 4
25+
%4 = load i32, ptr %.atomictmp, align 4
26+
%5 = cmpxchg weak ptr %0, i32 %3, i32 %4 monotonic monotonic, align 4
27+
%6 = extractvalue { i32, i1 } %5, 0
28+
%7 = extractvalue { i32, i1 } %5, 1
29+
br i1 %7, label %cmpxchg.continue, label %cmpxchg.store_expected
30+
31+
cmpxchg.store_expected: ; preds = %entry
32+
store i32 %6, ptr %1, align 4
33+
br label %cmpxchg.continue
34+
35+
cmpxchg.continue: ; preds = %cmpxchg.store_expected, %entry
36+
%storedv = zext i1 %7 to i8
37+
store i8 %storedv, ptr %cmpxchg.bool, align 1
38+
%8 = load i8, ptr %cmpxchg.bool, align 1
39+
%loadedv = trunc i8 %8 to i1
40+
%conv = zext i1 %loadedv to i32
41+
ret i32 %conv
42+
}
43+
44+
; CHECK: .foo:
45+
; CHECK-NEXT: # %bb.0: # %entry
46+
; CHECK-NEXT: lwz r7, 0(r4)
47+
; CHECK-NEXT: stw r3, -4(r1)
48+
; CHECK-NEXT: stw r4, -8(r1)
49+
; CHECK-NEXT: stw r5, -12(r1)
50+
; CHECK-NEXT: stw r5, -16(r1)
51+
; CHECK-NEXT: L..BB0_1: # %entry
52+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
53+
; CHECK-NEXT: lwarx r6, 0, r3
54+
; CHECK-NEXT: cmpw cr1, r6, r7
55+
; CHECK-NEXT: bne cr1, L..BB0_3
56+
; CHECK-NEXT: # %bb.2: # %entry
57+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
58+
; CHECK-NEXT: stwcx. r5, 0, r3
59+
; CHECK-NEXT: bne cr0, L..BB0_1
60+
; CHECK-NEXT: L..BB0_3: # %entry
61+
; CHECK-NEXT: cmplw r6, r7
62+
; CHECK-NEXT: beq cr0, L..BB0_5
63+
; CHECK-NEXT: # %bb.4: # %cmpxchg.store_expected
64+
; CHECK-NEXT: stw r6, 0(r4)
65+
; CHECK-NEXT: L..BB0_5: # %cmpxchg.continue
66+
; CHECK-NEXT: li r3, 0
67+
; CHECK-NEXT: li r4, 1
68+
; CHECK-NEXT: isel r3, r4, r3, 4*cr1+eq
69+
; CHECK-NEXT: stb r3, -17(r1)
70+
; CHECK-NEXT: blr
71+
; CHECK64: .foo:
72+
; CHECK64-NEXT: # %bb.0: # %entry
73+
; CHECK64-NEXT: lwz r7, 0(r4)
74+
; CHECK64-NEXT: std r3, -8(r1)
75+
; CHECK64-NEXT: std r4, -16(r1)
76+
; CHECK64-NEXT: stw r5, -20(r1)
77+
; CHECK64-NEXT: stw r5, -24(r1)
78+
; CHECK64-NEXT: L..BB0_1: # %entry
79+
; CHECK64-NEXT: # =>This Inner Loop Header: Depth=1
80+
; CHECK64-NEXT: lwarx r6, 0, r3
81+
; CHECK64-NEXT: cmpw cr1, r6, r7
82+
; CHECK64-NEXT: bne cr1, L..BB0_3
83+
; CHECK64-NEXT: # %bb.2: # %entry
84+
; CHECK64-NEXT: # in Loop: Header=BB0_1 Depth=1
85+
; CHECK64-NEXT: stwcx. r5, 0, r3
86+
; CHECK64-NEXT: bne cr0, L..BB0_1
87+
; CHECK64-NEXT: L..BB0_3: # %entry
88+
; CHECK64-NEXT: cmplw r6, r7
89+
; CHECK64-NEXT: beq cr0, L..BB0_5
90+
; CHECK64-NEXT: # %bb.4: # %cmpxchg.store_expected
91+
; CHECK64-NEXT: stw r6, 0(r4)
92+
; CHECK64-NEXT: L..BB0_5: # %cmpxchg.continue
93+
; CHECK64-NEXT: li r3, 0
94+
; CHECK64-NEXT: li r4, 1
95+
; CHECK64-NEXT: isel r3, r4, r3, 4*cr1+eq
96+
; CHECK64-NEXT: li r4, 1
97+
; CHECK64-NEXT: stb r3, -25(r1)
98+
; CHECK64-NEXT: li r3, 0
99+
; CHECK64-NEXT: isel r3, r4, r3, 4*cr1+eq
100+
; CHECK64-NEXT: blr

0 commit comments

Comments
 (0)