[llvm] [SystemZ] Allow forming overflow op for i128 (PR #153557)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 14 01:48:55 PDT 2025
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/153557
Allow matching i128 overflow pattern into UADDO, which then allows use of vaccq.
>From 9603b7276be39104fd1f717c961536c6be825d25 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Thu, 14 Aug 2025 10:40:37 +0200
Subject: [PATCH 1/2] add tests
---
llvm/test/CodeGen/SystemZ/int-cmp-65.ll | 41 +++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-65.ll b/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
index b06ab3c1fa3d3..0e736ec25d0b7 100644
--- a/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
+++ b/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
@@ -85,3 +85,44 @@ define i128 @i128_addc_4(i128 %a, i128 %b) {
ret i128 %ext
}
+define i128 @i128_addc_xor(i128 %a, i128 %b) {
+; CHECK-LABEL: i128_addc_xor:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vl %v1, 0(%r4), 3
+; CHECK-NEXT: vl %v0, 0(%r3), 3
+; CHECK-NEXT: vno %v1, %v1, %v1
+; CHECK-NEXT: veclg %v1, %v0
+; CHECK-NEXT: jlh .LBB6_2
+; CHECK-NEXT: # %bb.1:
+; CHECK-NEXT: vchlgs %v0, %v0, %v1
+; CHECK-NEXT: .LBB6_2:
+; CHECK-NEXT: jnl .LBB6_4
+; CHECK-NEXT: # %bb.3:
+; CHECK-NEXT: larl %r1, .LCPI6_0
+; CHECK-NEXT: vl %v0, 0(%r1), 3
+; CHECK-NEXT: vst %v0, 0(%r2), 3
+; CHECK-NEXT: br %r14
+; CHECK-NEXT: .LBB6_4:
+; CHECK-NEXT: vgbm %v0, 0
+; CHECK-NEXT: vst %v0, 0(%r2), 3
+; CHECK-NEXT: br %r14
+ %b.not = xor i128 %b, -1
+ %cmp = icmp ugt i128 %a, %b.not
+ %ext = zext i1 %cmp to i128
+ ret i128 %ext
+}
+
+define i128 @i128_addc_xor_inv(i128 %a, i128 %b) {
+; CHECK-LABEL: i128_addc_xor_inv:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vl %v1, 0(%r4), 3
+; CHECK-NEXT: vl %v0, 0(%r3), 3
+; CHECK-NEXT: vno %v1, %v1, %v1
+; CHECK-NEXT: vscbiq %v0, %v1, %v0
+; CHECK-NEXT: vst %v0, 0(%r2), 3
+; CHECK-NEXT: br %r14
+ %b.not = xor i128 %b, -1
+ %cmp = icmp ule i128 %a, %b.not
+ %ext = zext i1 %cmp to i128
+ ret i128 %ext
+}
>From 56c3d372c4671b8273110cfd37a3c60ab40cf9ec Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Thu, 14 Aug 2025 10:41:12 +0200
Subject: [PATCH 2/2] Allow forming overflow op for i128
---
llvm/lib/Target/SystemZ/SystemZISelLowering.h | 2 +-
llvm/test/CodeGen/SystemZ/atomicrmw-ops-i128.ll | 13 ++++++++-----
llvm/test/CodeGen/SystemZ/int-cmp-65.ll | 17 ++---------------
3 files changed, 11 insertions(+), 21 deletions(-)
diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.h b/llvm/lib/Target/SystemZ/SystemZISelLowering.h
index 1866962e17587..707887c59bd65 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.h
+++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.h
@@ -523,7 +523,7 @@ class SystemZTargetLowering : public TargetLowering {
bool MathUsed) const override {
// Form add and sub with overflow intrinsics regardless of any extra
// users of the math result.
- return VT == MVT::i32 || VT == MVT::i64;
+ return VT == MVT::i32 || VT == MVT::i64 || VT == MVT::i128;
}
bool shouldConsiderGEPOffsetSplit() const override { return true; }
diff --git a/llvm/test/CodeGen/SystemZ/atomicrmw-ops-i128.ll b/llvm/test/CodeGen/SystemZ/atomicrmw-ops-i128.ll
index c088f6d862e7c..9271dc73e2725 100644
--- a/llvm/test/CodeGen/SystemZ/atomicrmw-ops-i128.ll
+++ b/llvm/test/CodeGen/SystemZ/atomicrmw-ops-i128.ll
@@ -363,10 +363,11 @@ define i128 @atomicrmw_uinc_wrap(ptr %src, i128 %b) {
define i128 @atomicrmw_udec_wrap(ptr %src, i128 %b) {
; CHECK-LABEL: atomicrmw_udec_wrap:
; CHECK: # %bb.0:
+; CHECK-NEXT: larl %r1, .LCPI12_0
; CHECK-NEXT: vl %v0, 0(%r4), 3
; CHECK-NEXT: vl %v3, 0(%r3), 4
-; CHECK-NEXT: vgbm %v1, 65535
-; CHECK-NEXT: vgbm %v2, 0
+; CHECK-NEXT: vl %v1, 0(%r1), 3
+; CHECK-NEXT: vgbm %v2, 65535
; CHECK-NEXT: j .LBB12_2
; CHECK-NEXT: .LBB12_1: # %atomicrmw.start
; CHECK-NEXT: # in Loop: Header=BB12_2 Depth=1
@@ -379,6 +380,9 @@ define i128 @atomicrmw_udec_wrap(ptr %src, i128 %b) {
; CHECK-NEXT: je .LBB12_8
; CHECK-NEXT: .LBB12_2: # %atomicrmw.start
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: vscbiq %v4, %v3, %v1
+; CHECK-NEXT: vlgvf %r0, %v4, 3
+; CHECK-NEXT: xilf %r0, 1
; CHECK-NEXT: veclg %v0, %v3
; CHECK-NEXT: jlh .LBB12_4
; CHECK-NEXT: # %bb.3: # %atomicrmw.start
@@ -390,12 +394,11 @@ define i128 @atomicrmw_udec_wrap(ptr %src, i128 %b) {
; CHECK-NEXT: jl .LBB12_6
; CHECK-NEXT: # %bb.5: # %atomicrmw.start
; CHECK-NEXT: # in Loop: Header=BB12_2 Depth=1
-; CHECK-NEXT: vaq %v4, %v3, %v1
+; CHECK-NEXT: vaq %v4, %v3, %v2
; CHECK-NEXT: .LBB12_6: # %atomicrmw.start
; CHECK-NEXT: # in Loop: Header=BB12_2 Depth=1
-; CHECK-NEXT: vceqgs %v5, %v3, %v2
; CHECK-NEXT: vlr %v5, %v0
-; CHECK-NEXT: je .LBB12_1
+; CHECK-NEXT: cijlh %r0, 0, .LBB12_1
; CHECK-NEXT: # %bb.7: # %atomicrmw.start
; CHECK-NEXT: # in Loop: Header=BB12_2 Depth=1
; CHECK-NEXT: vlr %v5, %v4
diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-65.ll b/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
index 0e736ec25d0b7..29c918a061e07 100644
--- a/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
+++ b/llvm/test/CodeGen/SystemZ/int-cmp-65.ll
@@ -88,22 +88,9 @@ define i128 @i128_addc_4(i128 %a, i128 %b) {
define i128 @i128_addc_xor(i128 %a, i128 %b) {
; CHECK-LABEL: i128_addc_xor:
; CHECK: # %bb.0:
-; CHECK-NEXT: vl %v1, 0(%r4), 3
; CHECK-NEXT: vl %v0, 0(%r3), 3
-; CHECK-NEXT: vno %v1, %v1, %v1
-; CHECK-NEXT: veclg %v1, %v0
-; CHECK-NEXT: jlh .LBB6_2
-; CHECK-NEXT: # %bb.1:
-; CHECK-NEXT: vchlgs %v0, %v0, %v1
-; CHECK-NEXT: .LBB6_2:
-; CHECK-NEXT: jnl .LBB6_4
-; CHECK-NEXT: # %bb.3:
-; CHECK-NEXT: larl %r1, .LCPI6_0
-; CHECK-NEXT: vl %v0, 0(%r1), 3
-; CHECK-NEXT: vst %v0, 0(%r2), 3
-; CHECK-NEXT: br %r14
-; CHECK-NEXT: .LBB6_4:
-; CHECK-NEXT: vgbm %v0, 0
+; CHECK-NEXT: vl %v1, 0(%r4), 3
+; CHECK-NEXT: vaccq %v0, %v1, %v0
; CHECK-NEXT: vst %v0, 0(%r2), 3
; CHECK-NEXT: br %r14
%b.not = xor i128 %b, -1
More information about the llvm-commits
mailing list