On Wed, Aug 27, 2025 at 03:18:55PM +0200, Tomasz Kamiński wrote:
> For any minimum value of a signed type, its negation (with wraparound) results
> in the same value, behaving like zero. Representing the unordered result with
> this minimum value, along with 0 for equal, 1 for greater, and -1 for less
> in partial_ordering, allows its value to be reversed using unary negation.
> 
> The operator<=(partial_order, 0) now checks if the reversed value is positive.
> This works correctly because the unordered value remains unchanged and thus
> negative.
> 
> libstdc++-v3/ChangeLog:
> 
>       * libsupc++/compare (_Ncmp::_Unordered): Rename and change the value
>       to minimum value of signed char.
>       (_Ncomp::unordered): Renamed from _Unordered, the name is reserved
>       by partial_ordered::unordered.
>       (partial_ordering::_M_reverse()): Define.
>       (operator<=(partial_ordering, __cmp_cat::__unspec))
>       (operator>=(__cmp_cat::__unspec, partial_ordering)): Implemented
>       in terms of negated _M_value.
>       (operator>=(partial_ordering, __cmp_cat::__unspec))
>       (operator<=(__cmp_cat::__unspec, partial_ordering)): Directly
>       compare _M_value, as unordered value is negative.
>       (partial_ordering::unordered): Handle _Ncmp::unoredred rename.
>       * python/libstdcxx/v6/printers.py: Add -128 as integer value
>       for unordered, keeping 2 to preserve backward compatibility.
> 
> Reviewed-by: Jonathan Wakely <jwak...@redhat.com>
> Signed-off-by: Tomasz Kamiński <tkami...@redhat.com>

This broke
+FAIL: g++.dg/opt/pr94589-2.C  -std=gnu++20  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|==|!=|>|>=) 5\\\\.0" 12
+FAIL: g++.dg/opt/pr94589-2.C  -std=gnu++23  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|==|!=|>|>=) 5\\\\.0" 12
+FAIL: g++.dg/opt/pr94589-2.C  -std=gnu++26  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|==|!=|>|>=) 5\\\\.0" 12
on i686-linux, x86_64-linux or powerpc64le-linux, additionally
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++20  scan-tree-dump-times optimized 
"[ij]_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) [ij]_[0-9]+\\\\(D\\\\)" 8
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++20  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) 5\\\\.0" 8
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++23  scan-tree-dump-times optimized 
"[ij]_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) [ij]_[0-9]+\\\\(D\\\\)" 8
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++23  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) 5\\\\.0" 8
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++26  scan-tree-dump-times optimized 
"[ij]_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) [ij]_[0-9]+\\\\(D\\\\)" 8
FAIL: g++.dg/opt/pr94589-5.C  -std=gnu++26  scan-tree-dump-times optimized 
"i_[0-9]+\\\\(D\\\\) (?:<|<=|>|>=) 5\\\\.0" 8
on powerpc64le-linux.
Both tree-ssa-phiopt.cc (spaceship_replacement)
and tree-ssa-math-opts.cc (optimize_spaceship)
attempt to optimize some spaceship comparisons.
Although I wrote both, my memory is weak, so just judging from function
comments, the latter likely should deal with values -1, 0, 1 and X where
X is some other value, so perhaps all we want to change there is
      other than -1, 0, 1, for libstdc++ 2, for libc++ -127.  */
to
      other than -1, 0, 1, for libstdc++ -128, for libc++ -127.  */
and adjust other comments that show the 2 value to show -128 instead.
But tree-ssa-phiopt.cc clearly optimizes only the 2 case and has pattern
recognition of the (x & ~1) == 0 and similar cases, which all will now be
different for -128.  So, either spaceship_replacement needs to be rewritten
to only handle -128 instead of 2, or depending on the source either -128 or
2.

        Jakub

Reply via email to