[clang] [SystemZ] Fix wrong mask for float vec_insert (PR #192967)

Dominik Steenken via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 21 01:21:55 PDT 2026


https://github.com/dominik-steenken updated https://github.com/llvm/llvm-project/pull/192967

>From d08987f941eb993225643133d24281648c4cbef9 Mon Sep 17 00:00:00 2001
From: Dominik Steenken <dost at de.ibm.com>
Date: Mon, 20 Apr 2026 11:20:10 +0200
Subject: [PATCH] [SystemZ] Fix wrong mask for float vec_insert

This commit fixes an error in , where the index masking
effectively made the last two float elements of a vector non-insertable.

co-authored-by: @Andreas-Krebbel
---
 clang/lib/Headers/vecintrin.h                          | 2 +-
 clang/test/CodeGen/SystemZ/builtins-systemz-zvector2.c | 7 +++++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Headers/vecintrin.h b/clang/lib/Headers/vecintrin.h
index 338ea51ce8863..4e567b9adc265 100644
--- a/clang/lib/Headers/vecintrin.h
+++ b/clang/lib/Headers/vecintrin.h
@@ -207,7 +207,7 @@ vec_insert(unsigned long long __scalar, __vector unsigned long long __vec,
 #if __ARCH__ >= 12
 static inline __ATTRS_o_ai __vector float
 vec_insert(float __scalar, __vector float __vec, int __index) {
-  __vec[__index & 1] = __scalar;
+  __vec[__index & 3] = __scalar;
   return __vec;
 }
 #endif
diff --git a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector2.c b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector2.c
index c1ef178fcfaa9..9809afbab1a61 100644
--- a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector2.c
+++ b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector2.c
@@ -67,7 +67,7 @@ int cc;
 
 void test_core(void) {
   // CHECK-ASM-LABEL: test_core
-  vector float vf2;
+  vector float vf2, vf3;
   vector double vd2;
 
   f = vec_extract(vf, 0);
@@ -86,7 +86,10 @@ void test_core(void) {
   vf2 = vf;
   vf = vec_insert(f, vf2, 0);
   // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
-  // CHECK-ASM: vlef
+  // CHECK-ASM: vlef %{{.*}}, 0(%{{.*}}), 0
+  vf = vec_insert(f, vf2, 3);
+  // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 3
+  // CHECK-ASM: vlef %{{.*}}, 0(%{{.*}}), 3
   vf = vec_insert(0.0f, vf, 1);
   // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i64 1
   // CHECK-ASM: vleif %{{.*}}, 0, 1



More information about the cfe-commits mailing list