RFR: 8370794: C2 SuperWord: Long/Integer.compareUnsigned return wrong value for EQ/NE in SLP
    Hamlin Li 
    mli at openjdk.org
       
    Wed Oct 29 17:37:24 UTC 2025
    
    
  
On Wed, 29 Oct 2025 16:38:54 GMT, Hamlin Li <mli at openjdk.org> wrote:
> Hi,
> Can you help to review this patch?
> 
> [JDK-8370481](https://bugs.openjdk.org/browse/JDK-8370481) introduces this regression for unsigned I/L EQ/NE in SLP.
> 
> ====================
> 
> In [JDK-8370481](https://bugs.openjdk.org/browse/JDK-8370481), we fixed an issue related to transformation from (Bool + CmpU + CMove) to (VectorMaskCmp + VectorBlend), and added tests for unsigned ones.
> As discussion in [1], we should also add more tests for transformation from (Bool + Cmp + CMove) to (VectorMaskCmp + VectorBlend) for the signed ones.
> 
> [1] https://github.com/openjdk/jdk/pull/27942#discussion_r2468750039
> 
> Thanks!
@eme64 When I develop this test pr, found out that, after https://github.com/openjdk/jdk/pull/27942 there could be some failing scenarios for unsigned EQ/NE (found by the newly developed unsigned EQ/NE test). We could fix it with the following patch, I can put the fix patch and related EQ/NE signed/unsigned tests in this pr, but seems it's better to put them in another separate pr? Please let me know what do you think. Thanks
diff --git a/src/hotspot/share/opto/subnode.cpp b/src/hotspot/share/opto/subnode.cpp
index 9c6c7498dd0..a10cd2a8d5b 100644
--- a/src/hotspot/share/opto/subnode.cpp
+++ b/src/hotspot/share/opto/subnode.cpp
@@ -1398,6 +1398,21 @@ const Type *BoolTest::cc2logical( const Type *CC ) const {
   return TypeInt::BOOL;
 }
 
+BoolTest::mask BoolTest::unsigned_mask(BoolTest::mask btm) {
+  switch(btm) {
+    case eq:
+    case ne:
+      return btm;
+    case lt:
+    case le:
+    case gt:
+    case ge:
+      return mask(btm | unsigned_compare);
+    default:
+      ShouldNotReachHere();
+  }
+}
+
 //------------------------------dump_spec-------------------------------------
 // Print special per-node info
 void BoolTest::dump_on(outputStream *st) const {
diff --git a/src/hotspot/share/opto/subnode.hpp b/src/hotspot/share/opto/subnode.hpp
index 2c3d9cfd35e..463d9e020cb 100644
--- a/src/hotspot/share/opto/subnode.hpp
+++ b/src/hotspot/share/opto/subnode.hpp
@@ -331,7 +331,7 @@ struct BoolTest {
   mask negate( ) const { return negate_mask(_test); }
   // Return the negative mask for the given mask, for both signed and unsigned comparison.
   static mask negate_mask(mask btm) { return mask(btm ^ 4); }
-  static mask unsigned_mask(mask btm) { return mask(btm | unsigned_compare); }
+  static mask unsigned_mask(mask btm);
   bool is_canonical( ) const { return (_test == BoolTest::ne || _test == BoolTest::lt || _test == BoolTest::le || _test == BoolTest::overflow); }
   bool is_less( )  const { return _test == BoolTest::lt || _test == BoolTest::le; }
   bool is_greater( ) const { return _test == BoolTest::gt || _test == BoolTest::ge; }
-------------
PR Comment: https://git.openjdk.org/jdk/pull/28047#issuecomment-3462672014
    
    
More information about the hotspot-compiler-dev
mailing list