public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4
@ 2024-06-12 3:16 lee.imple at gmail dot com
2024-06-13 12:17 ` [Bug libstdc++/115454] " mkretz at gcc dot gnu.org
` (11 more replies)
0 siblings, 12 replies; 13+ messages in thread
From: lee.imple at gmail dot com @ 2024-06-12 3:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
Bug ID: 115454
Summary: std::experimental::find_last_set is buggy on x86-64-v4
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: lee.imple at gmail dot com
Target Milestone: ---
We are using a simd with 4 uint64_t elements (with `deduce_t`) on x86-64-v4.
We are trying to find the last element with the value -1 (i.e. all 1s).
The code is as following (available at https://godbolt.org/z/3f1nszf8E ),
compiled with the options `-O3 -march=x86-64-v4 -std=c++20`.
```c++
#include <experimental/simd>
#include <cstdint>
using deduce_t_element = std::experimental::simd<
std::uint64_t,
std::experimental::simd_abi::deduce_t<std::uint64_t, 4>
>;
using fixed_size_element = std::experimental::simd<
std::uint64_t,
std::experimental::simd_abi::fixed_size<4>
>;
int f_deduce(deduce_t_element e) {
return find_last_set(e != -1);
}
int f_fixed_size(fixed_size_element e) {
return find_last_set(e != -1);
}
```
G++ trunk gives the following assembly (I add the comments).
```asm
f_deduce(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<32> >):
vpcmpeqd %ymm1, %ymm1, %ymm1
movl $-1, %eax
vpcmpq $4, %ymm1, %ymm0, %k0
kmovb %k0, %edx
orb $-16, %dl # %dl |= 0xf0
je .L1
movzbl %dl, %edx
movl $31, %eax
lzcntl %edx, %edx # leading zeros is 24
# because the next byte is always 0b1111
subl %edx, %eax # so we get the result is 31 - 24 = 7
.L1:
ret
f_fixed_size(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_Fixed<4> >):
vpcmpeqd %ymm0, %ymm0, %ymm0
movl $63, %edx
vpcmpq $4, (%rdi), %ymm0, %k0
kmovb %k0, %eax
andl $15, %eax
lzcntq %rax, %rax
subl %eax, %edx
movl %edx, %eax
vzeroupper
ret
```
In fact, the first function always gives the result 7 whatever argument it
gets, which is more obvious from clang++'s result.
```asm
f_deduce(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<32>>): #
@f_deduce(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_VecBltnBtmsk<32>>)
movl $7, %eax
retq
f_fixed_size(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_Fixed<4>>): #
@f_fixed_size(std::experimental::parallelism_v2::simd<unsigned long,
std::experimental::parallelism_v2::simd_abi::_Fixed<4>>)
vpcmpeqd %ymm0, %ymm0, %ymm0
vpcmpeqq (%rdi), %ymm0, %k0
kmovd %k0, %eax
xorb $15, %al
movzbl %al, %eax
lzcntq %rax, %rcx
movl $63, %eax
subl %ecx, %eax
vzeroupper
retq
```
I don't know why, but compiled result of `fixed_size_simd` seems to be
different.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
@ 2024-06-13 12:17 ` mkretz at gcc dot gnu.org
2024-06-14 13:45 ` mkretz at gcc dot gnu.org
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: mkretz at gcc dot gnu.org @ 2024-06-13 12:17 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2024-06-13
Assignee|unassigned at gcc dot gnu.org |mkretz at gcc dot gnu.org
--- Comment #1 from Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> ---
Confirmed. The != compare returns an 8-bit mask (internally) for a 4-element
simd_mask in
https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/experimental/bits/simd_x86.h;h=4ab933b573c614654902d6f5747d53e39f4b100f;hb=HEAD#l2350.
The high 4 bits are incorrectly set because of the ~ operator on the resulting
mask. Those bits are not cleared before calling std::bit_width - 1, which is
why the result is unconditionally 7.
You can work around the bug by replacing 'e != -1' with '!(e == -1)' for the
time being.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
2024-06-13 12:17 ` [Bug libstdc++/115454] " mkretz at gcc dot gnu.org
@ 2024-06-14 13:45 ` mkretz at gcc dot gnu.org
2024-06-14 13:48 ` mkretz at gcc dot gnu.org
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: mkretz at gcc dot gnu.org @ 2024-06-14 13:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #2 from Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> ---
Actually, find_last_set needs to clear padding bits as well. This fixes the
issue. Regression tests are running now.
commit b85ff52c1fb059f75bcedf103a15fce9db8bc92b
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h
b/libstdc++-v3/include/experimental/bits/simd_x86.h
index 517c4b4a5be..8a23aa2082b 100644
--- a/libstdc++-v3/include/experimental/bits/simd_x86.h
+++ b/libstdc++-v3/include/experimental/bits/simd_x86.h
@@ -2339,29 +2339,29 @@ _S_not_equal_to(_SimdWrapper<_Tp, _Np> __x,
_SimdWrapper<_Tp, _Np> __y)
__assert_unreachable<_Tp>();
}
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 8)
- return ~_mm512_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 4)
- return ~_mm512_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 2)
- return ~_mm512_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 1)
- return ~_mm512_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 8)
- return ~_mm256_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 4)
- return ~_mm256_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 2)
- return ~_mm256_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 1)
- return ~_mm256_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 8)
- return ~_mm_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 4)
- return ~_mm_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 2)
- return ~_mm_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 1)
- return ~_mm_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else
__assert_unreachable<_Tp>();
} // }}}
@@ -5292,7 +5292,7 @@ _S_find_first_set(simd_mask<_Tp, _Abi> __k)
_S_find_last_set(simd_mask<_Tp, _Abi> __k)
{
if constexpr (__is_avx512_abi<_Abi>())
- return std::__bit_width(__k._M_data._M_data) - 1;
+ return std::__bit_width(_Abi::_S_masked(__k._M_data)._M_data) - 1;
else
return _Base::_S_find_last_set(__k);
}
diff --git a/libstdc++-v3/testsuite/experimental/simd/pr115454_find_last_set.cc
b/libstdc++-v3/testsuite/experimental/simd/pr115454_find_last_set.cc
new file mode 100644
index 00000000000..b47f19d3067
--- /dev/null
+++ b/libstdc++-v3/testsuite/experimental/simd/pr115454_find_last_set.cc
@@ -0,0 +1,49 @@
+// { dg-options "-std=gnu++17" }
+// { dg-do run { target *-*-* } }
+// { dg-require-effective-target c++17 }
+// { dg-additional-options "-march=x86-64-v4" { target avx512f } }
+// { dg-require-cmath "" }
+
+#include <experimental/simd>
+
+namespace stdx = std::experimental;
+
+using T = std::uint64_t;
+
+template <typename U, int N>
+using V = stdx::simd<U, stdx::simd_abi::deduce_t<U, N>>;
+
+[[gnu::noinline, gnu::noipa]]
+int reduce(V<T, 4> x)
+{
+ static_assert(stdx::find_last_set(V<T, 4>([](unsigned i) { return i; }) !=
V<T, 4>(0)) == 3);
+ return stdx::find_last_set(x != -1);
+}
+
+[[gnu::noinline, gnu::noipa]]
+int reduce2()
+{
+ using M8 = typename V<short, 8>::mask_type;
+ using M4 = typename V<int, 4>::mask_type;
+ if constexpr (sizeof(M8) == sizeof(M4))
+ {
+ M4 k;
+ __builtin_memcpy(&__data(k), &__data(M8(true)), sizeof(M4));
+ return stdx::find_last_set(k);
+ }
+ return 3;
+}
+
+
+int main()
+{
+ const V<T, 4> x {};
+
+ const int r = reduce(x);
+ if (r != 3)
+ __builtin_abort();
+
+ const int r2 = reduce2();
+ if (r2 != 3)
+ __builtin_abort();
+}
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
2024-06-13 12:17 ` [Bug libstdc++/115454] " mkretz at gcc dot gnu.org
2024-06-14 13:45 ` mkretz at gcc dot gnu.org
@ 2024-06-14 13:48 ` mkretz at gcc dot gnu.org
2024-06-20 10:57 ` cvs-commit at gcc dot gnu.org
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: mkretz at gcc dot gnu.org @ 2024-06-14 13:48 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
Matthias Kretz (Vir) <mkretz at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|--- |11.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (2 preceding siblings ...)
2024-06-14 13:48 ` mkretz at gcc dot gnu.org
@ 2024-06-20 10:57 ` cvs-commit at gcc dot gnu.org
2024-06-20 18:41 ` cvs-commit at gcc dot gnu.org
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-20 10:57 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Matthias Kretz <mkretz@gcc.gnu.org>:
https://gcc.gnu.org/g:1340ddea0158de3f49aeb75b4013e5fc313ff6f4
commit r15-1500-g1340ddea0158de3f49aeb75b4013e5fc313ff6f4
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (3 preceding siblings ...)
2024-06-20 10:57 ` cvs-commit at gcc dot gnu.org
@ 2024-06-20 18:41 ` cvs-commit at gcc dot gnu.org
2024-06-20 18:44 ` cvs-commit at gcc dot gnu.org
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-20 18:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Matthias Kretz
<mkretz@gcc.gnu.org>:
https://gcc.gnu.org/g:e77f314ccd422ffa05c6c06837e2cb94c25f2bba
commit r14-10331-ge77f314ccd422ffa05c6c06837e2cb94c25f2bba
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
(cherry picked from commit 1340ddea0158de3f49aeb75b4013e5fc313ff6f4)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (4 preceding siblings ...)
2024-06-20 18:41 ` cvs-commit at gcc dot gnu.org
@ 2024-06-20 18:44 ` cvs-commit at gcc dot gnu.org
2024-06-21 16:25 ` cvs-commit at gcc dot gnu.org
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-20 18:44 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Matthias Kretz
<mkretz@gcc.gnu.org>:
https://gcc.gnu.org/g:a0b92a530ad61389c0cdeb8d8ece4677e019c28e
commit r11-11517-ga0b92a530ad61389c0cdeb8d8ece4677e019c28e
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
(cherry picked from commit 4787960dcaf0de3f46464960f5246de9b3c69a06)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (5 preceding siblings ...)
2024-06-20 18:44 ` cvs-commit at gcc dot gnu.org
@ 2024-06-21 16:25 ` cvs-commit at gcc dot gnu.org
2024-06-21 16:26 ` cvs-commit at gcc dot gnu.org
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-21 16:25 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Matthias Kretz
<mkretz@gcc.gnu.org>:
https://gcc.gnu.org/g:fbd088a069b172cae4e268abe2d38e567ef97990
commit r13-8861-gfbd088a069b172cae4e268abe2d38e567ef97990
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
(cherry picked from commit 1340ddea0158de3f49aeb75b4013e5fc313ff6f4)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (6 preceding siblings ...)
2024-06-21 16:25 ` cvs-commit at gcc dot gnu.org
@ 2024-06-21 16:26 ` cvs-commit at gcc dot gnu.org
2024-06-27 10:24 ` cvs-commit at gcc dot gnu.org
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-21 16:26 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-12 branch has been updated by Matthias Kretz
<mkretz@gcc.gnu.org>:
https://gcc.gnu.org/g:8b5bdeb8aa2c2f6dbd448a8f7d500d9eaece48e1
commit r12-10574-g8b5bdeb8aa2c2f6dbd448a8f7d500d9eaece48e1
Author: Matthias Kretz <m.kretz@gsi.de>
Date: Fri Jun 14 15:11:25 2024 +0200
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change
to AVX512 operator!= is unnecessary. However, the latter was not
producing optimal code and unnecessarily set the padding bits. In
theory, the compiler could determine that with the new !=
implementation, the bit operation for clearing the padding bits is a
no-op and can be elided.
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
PR libstdc++/115454
* include/experimental/bits/simd_x86.h (_S_not_equal_to): Use
neq comparison instead of bitwise negation after eq.
(_S_find_last_set): Clear unused high bits before computing
bit_width.
* testsuite/experimental/simd/pr115454_find_last_set.cc: New
test.
(cherry picked from commit 1340ddea0158de3f49aeb75b4013e5fc313ff6f4)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (7 preceding siblings ...)
2024-06-21 16:26 ` cvs-commit at gcc dot gnu.org
@ 2024-06-27 10:24 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:16 ` cvs-commit at gcc dot gnu.org
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-27 10:24 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Alexandre Oliva <aoliva@gcc.gnu.org>:
https://gcc.gnu.org/g:95faa1bea7bdc7f92fcccb3543bfcbc8184c5e5b
commit r15-1692-g95faa1bea7bdc7f92fcccb3543bfcbc8184c5e5b
Author: Alexandre Oliva <oliva@adacore.com>
Date: Thu Jun 27 07:22:48 2024 -0300
[libstdc++] [testsuite] defer to check_vect_support* [PR115454]
The newly-added testcase overrides the default dg-do action set by
check_vect_support_and_set_flags (in libstdc++-dg/conformance.exp), so
it attempts to run the test even if runtime vector support is not
available.
Remove the explicit dg-do directive, so that the default is honored,
and the test is run if vector support is found, and only compiled
otherwise.
for libstdc++-v3/ChangeLog
PR libstdc++/115454
* testsuite/experimental/simd/pr115454_find_last_set.cc: Defer
to check_vect_support_and_set_flags's default dg-do action.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (8 preceding siblings ...)
2024-06-27 10:24 ` cvs-commit at gcc dot gnu.org
@ 2024-06-27 11:16 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:33 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:46 ` cvs-commit at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-27 11:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Alexandre Oliva
<aoliva@gcc.gnu.org>:
https://gcc.gnu.org/g:b70af0bd2e33e9cc20dae45c131429a402fc8845
commit r14-10352-gb70af0bd2e33e9cc20dae45c131429a402fc8845
Author: Alexandre Oliva <oliva@adacore.com>
Date: Thu Jun 27 08:14:34 2024 -0300
[libstdc++] [testsuite] defer to check_vect_support* [PR115454]
The newly-added testcase overrides the default dg-do action set by
check_vect_support_and_set_flags (in libstdc++-dg/conformance.exp), so
it attempts to run the test even if runtime vector support is not
available.
Remove the explicit dg-do directive, so that the default is honored,
and the test is run if vector support is found, and only compiled
otherwise.
for libstdc++-v3/ChangeLog
PR libstdc++/115454
* testsuite/experimental/simd/pr115454_find_last_set.cc: Defer
to check_vect_support_and_set_flags's default dg-do action.
(cherry picked from commit 95faa1bea7bdc7f92fcccb3543bfcbc8184c5e5b)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (9 preceding siblings ...)
2024-06-27 11:16 ` cvs-commit at gcc dot gnu.org
@ 2024-06-27 11:33 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:46 ` cvs-commit at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-27 11:33 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Alexandre Oliva
<aoliva@gcc.gnu.org>:
https://gcc.gnu.org/g:3de1c4985bebd1882b6643789daba24f2d11bafe
commit r13-8872-g3de1c4985bebd1882b6643789daba24f2d11bafe
Author: Alexandre Oliva <oliva@adacore.com>
Date: Thu Jun 27 08:32:15 2024 -0300
[libstdc++] [testsuite] defer to check_vect_support* [PR115454]
The newly-added testcase overrides the default dg-do action set by
check_vect_support_and_set_flags (in libstdc++-dg/conformance.exp), so
it attempts to run the test even if runtime vector support is not
available.
Remove the explicit dg-do directive, so that the default is honored,
and the test is run if vector support is found, and only compiled
otherwise.
for libstdc++-v3/ChangeLog
PR libstdc++/115454
* testsuite/experimental/simd/pr115454_find_last_set.cc: Defer
to check_vect_support_and_set_flags's default dg-do action.
(cherry picked from commit 95faa1bea7bdc7f92fcccb3543bfcbc8184c5e5b)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/115454] std::experimental::find_last_set is buggy on x86-64-v4
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
` (10 preceding siblings ...)
2024-06-27 11:33 ` cvs-commit at gcc dot gnu.org
@ 2024-06-27 11:46 ` cvs-commit at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-06-27 11:46 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115454
--- Comment #11 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-12 branch has been updated by Alexandre Oliva
<aoliva@gcc.gnu.org>:
https://gcc.gnu.org/g:95ca5f458251e21123e45ec52c38d629d39cd0e4
commit r12-10585-g95ca5f458251e21123e45ec52c38d629d39cd0e4
Author: Alexandre Oliva <oliva@adacore.com>
Date: Thu Jun 27 08:44:54 2024 -0300
[libstdc++] [testsuite] defer to check_vect_support* [PR115454]
The newly-added testcase overrides the default dg-do action set by
check_vect_support_and_set_flags (in libstdc++-dg/conformance.exp), so
it attempts to run the test even if runtime vector support is not
available.
Remove the explicit dg-do directive, so that the default is honored,
and the test is run if vector support is found, and only compiled
otherwise.
for libstdc++-v3/ChangeLog
PR libstdc++/115454
* testsuite/experimental/simd/pr115454_find_last_set.cc: Defer
to check_vect_support_and_set_flags's default dg-do action.
(cherry picked from commit 95faa1bea7bdc7f92fcccb3543bfcbc8184c5e5b)
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-06-27 11:46 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-12 3:16 [Bug libstdc++/115454] New: std::experimental::find_last_set is buggy on x86-64-v4 lee.imple at gmail dot com
2024-06-13 12:17 ` [Bug libstdc++/115454] " mkretz at gcc dot gnu.org
2024-06-14 13:45 ` mkretz at gcc dot gnu.org
2024-06-14 13:48 ` mkretz at gcc dot gnu.org
2024-06-20 10:57 ` cvs-commit at gcc dot gnu.org
2024-06-20 18:41 ` cvs-commit at gcc dot gnu.org
2024-06-20 18:44 ` cvs-commit at gcc dot gnu.org
2024-06-21 16:25 ` cvs-commit at gcc dot gnu.org
2024-06-21 16:26 ` cvs-commit at gcc dot gnu.org
2024-06-27 10:24 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:16 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:33 ` cvs-commit at gcc dot gnu.org
2024-06-27 11:46 ` cvs-commit at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).