[llvm] [PowerPC ][NFC] Add a test case for the function atomic_compare_exchange_weak (PR #141263)

zhijian lin via llvm-commits llvm-commits at lists.llvm.org
Mon May 26 09:57:22 PDT 2025


https://github.com/diggerlin updated https://github.com/llvm/llvm-project/pull/141263

>From 7bc1741a919d6bbdc7c8cbdf8c343c03aa814422 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 May 2025 13:50:30 -0400
Subject: [PATCH 1/3] add a NFC test case for the function
 atomic_compare_exchange_weak

---
 .../PowerPC/atomic-compare-exchange-weak.ll   | 100 ++++++++++++++++++
 1 file changed, 100 insertions(+)
 create mode 100644 llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll

diff --git a/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
new file mode 100644
index 0000000000000..e46f3995b055c
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
@@ -0,0 +1,100 @@
+; Test the generate asm of function 
+; int foo(_Atomic int *cp, int *old, int c) {
+;  return atomic_compare_exchange_weak_explicit(cp, old, c, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
+; }  
+
+; RUN: llc < %s -ppc-asm-full-reg-names  -mtriple=powerpc-ibm-aix7.2.0.0 -mcpu=pwr8  -verify-machineinstrs | FileCheck %s --check-prefix=CHECK
+; RUN: llc < %s -ppc-asm-full-reg-names  -mtriple=powerpc64-ibm-aix7.2.0.0 -mcpu=pwr8  -verify-machineinstrs | FileCheck %s --check-prefix=CHECK64
+
+
+define i32 @foo(ptr noundef %cp, ptr noundef %old, i32 noundef %c)  {
+entry:
+  %cp.addr = alloca ptr, align 4
+  %old.addr = alloca ptr, align 4
+  %c.addr = alloca i32, align 4
+  %.atomictmp = alloca i32, align 4
+  %cmpxchg.bool = alloca i8, align 1
+  store ptr %cp, ptr %cp.addr, align 4
+  store ptr %old, ptr %old.addr, align 4
+  store i32 %c, ptr %c.addr, align 4
+  %0 = load ptr, ptr %cp.addr, align 4
+  %1 = load ptr, ptr %old.addr, align 4
+  %2 = load i32, ptr %c.addr, align 4
+  store i32 %2, ptr %.atomictmp, align 4
+  %3 = load i32, ptr %1, align 4
+  %4 = load i32, ptr %.atomictmp, align 4
+  %5 = cmpxchg weak ptr %0, i32 %3, i32 %4 monotonic monotonic, align 4
+  %6 = extractvalue { i32, i1 } %5, 0
+  %7 = extractvalue { i32, i1 } %5, 1
+  br i1 %7, label %cmpxchg.continue, label %cmpxchg.store_expected
+
+cmpxchg.store_expected:                           ; preds = %entry
+  store i32 %6, ptr %1, align 4
+  br label %cmpxchg.continue
+
+cmpxchg.continue:                                 ; preds = %cmpxchg.store_expected, %entry
+  %storedv = zext i1 %7 to i8
+  store i8 %storedv, ptr %cmpxchg.bool, align 1
+  %8 = load i8, ptr %cmpxchg.bool, align 1
+  %loadedv = trunc i8 %8 to i1
+  %conv = zext i1 %loadedv to i32
+  ret i32 %conv
+}
+
+; CHECK: .foo:
+; CHECK-NEXT: # %bb.0:                                # %entry
+; CHECK-NEXT: 	lwz r7, 0(r4)
+; CHECK-NEXT: 	stw r3, -4(r1)
+; CHECK-NEXT: 	stw r4, -8(r1)
+; CHECK-NEXT: 	stw r5, -12(r1)
+; CHECK-NEXT: 	stw r5, -16(r1)
+; CHECK-NEXT: L..BB0_1:                               # %entry
+; CHECK-NEXT:                                         # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: 	lwarx r6, 0, r3
+; CHECK-NEXT: 	cmpw cr1, r6, r7
+; CHECK-NEXT: 	bne	cr1, L..BB0_3
+; CHECK-NEXT: # %bb.2:                                # %entry
+; CHECK-NEXT:                                         #   in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: 	stwcx. r5, 0, r3
+; CHECK-NEXT: 	bne	cr0, L..BB0_1
+; CHECK-NEXT: L..BB0_3:                               # %entry
+; CHECK-NEXT: 	cmplw	r6, r7
+; CHECK-NEXT: 	beq	cr0, L..BB0_5
+; CHECK-NEXT: # %bb.4:                                # %cmpxchg.store_expected
+; CHECK-NEXT: 	stw r6, 0(r4)
+; CHECK-NEXT: L..BB0_5:                               # %cmpxchg.continue
+; CHECK-NEXT: 	li r3, 0
+; CHECK-NEXT: 	li r4, 1
+; CHECK-NEXT: 	isel r3, r4, r3, 4*cr1+eq
+; CHECK-NEXT: 	stb r3, -17(r1)
+; CHECK-NEXT: 	blr
+; CHECK64:       .foo:
+; CHECK64-NEXT:  # %bb.0:                                # %entry
+; CHECK64-NEXT:  	lwz r7, 0(r4)
+; CHECK64-NEXT:  	std r3, -8(r1)
+; CHECK64-NEXT:  	std r4, -16(r1)
+; CHECK64-NEXT:  	stw r5, -20(r1)
+; CHECK64-NEXT:  	stw r5, -24(r1)
+; CHECK64-NEXT:  L..BB0_1:                               # %entry
+; CHECK64-NEXT:                                          # =>This Inner Loop Header: Depth=1
+; CHECK64-NEXT:  	lwarx r6, 0, r3
+; CHECK64-NEXT:  	cmpw cr1, r6, r7
+; CHECK64-NEXT:  	bne	cr1, L..BB0_3
+; CHECK64-NEXT:  # %bb.2:                                # %entry
+; CHECK64-NEXT:                                          #   in Loop: Header=BB0_1 Depth=1
+; CHECK64-NEXT:  	stwcx. r5, 0, r3
+; CHECK64-NEXT:  	bne	cr0, L..BB0_1
+; CHECK64-NEXT:  L..BB0_3:                               # %entry
+; CHECK64-NEXT:  	cmplw	r6, r7
+; CHECK64-NEXT:  	beq	cr0, L..BB0_5
+; CHECK64-NEXT:  # %bb.4:                                # %cmpxchg.store_expected
+; CHECK64-NEXT:  	stw r6, 0(r4)
+; CHECK64-NEXT:  L..BB0_5:                               # %cmpxchg.continue
+; CHECK64-NEXT:  	li r3, 0
+; CHECK64-NEXT:  	li r4, 1
+; CHECK64-NEXT:  	isel r3, r4, r3, 4*cr1+eq
+; CHECK64-NEXT:  	li r4, 1
+; CHECK64-NEXT:  	stb r3, -25(r1)
+; CHECK64-NEXT:  	li r3, 0
+; CHECK64-NEXT:  	isel r3, r4, r3, 4*cr1+eq
+; CHECK64-NEXT:  	blr

>From 65786885fdd2c0f26dab0b9cd60ae6498cc9c69d Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 May 2025 13:53:48 -0400
Subject: [PATCH 2/3] minor change

---
 llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
index e46f3995b055c..c0ff844f51486 100644
--- a/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
+++ b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
@@ -6,7 +6,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
 ; RUN: llc < %s -ppc-asm-full-reg-names  -mtriple=powerpc64-ibm-aix7.2.0.0 -mcpu=pwr8  -verify-machineinstrs | FileCheck %s --check-prefix=CHECK64
 
-
 define i32 @foo(ptr noundef %cp, ptr noundef %old, i32 noundef %c)  {
 entry:
   %cp.addr = alloca ptr, align 4
@@ -68,6 +67,7 @@ cmpxchg.continue:                                 ; preds = %cmpxchg.store_expec
 ; CHECK-NEXT: 	isel r3, r4, r3, 4*cr1+eq
 ; CHECK-NEXT: 	stb r3, -17(r1)
 ; CHECK-NEXT: 	blr
+
 ; CHECK64:       .foo:
 ; CHECK64-NEXT:  # %bb.0:                                # %entry
 ; CHECK64-NEXT:  	lwz r7, 0(r4)

>From 49682c56fb579ac3aa19bad4e4439b6d209a2047 Mon Sep 17 00:00:00 2001
From: zhijian lin <zhijian at ca.ibm.com>
Date: Mon, 26 May 2025 12:57:14 -0400
Subject: [PATCH 3/3] Update
 llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll

Co-authored-by: Amy Kwan <amy.kwan1 at ibm.com>
---
 llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
index c0ff844f51486..388460959f861 100644
--- a/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
+++ b/llvm/test/CodeGen/PowerPC/atomic-compare-exchange-weak.ll
@@ -1,4 +1,4 @@
-; Test the generate asm of function 
+; Test the generation of asm for the function:
 ; int foo(_Atomic int *cp, int *old, int c) {
 ;  return atomic_compare_exchange_weak_explicit(cp, old, c, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
 ; }  



More information about the llvm-commits mailing list