diff options
author | Egor Bogatov <egorbo@gmail.com> | 2022-11-11 19:25:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-11 19:25:34 +0300 |
commit | 0eb7d717c47951f21e5e8bc08a5a601b857abe43 (patch) | |
tree | 7f75ab451daf12165feca3d5563762dd26b2eb01 | |
parent | 803fd02979715a632c9d67b13c3218977dd3f5a9 (diff) |
Fix bug in String.Equals unrolling for certain single-char strings (#78190)
Co-authored-by: SingleAccretion <62474226+SingleAccretion@users.noreply.github.com>
-rw-r--r-- | src/coreclr/jit/importervectorization.cpp | 2 | ||||
-rw-r--r-- | src/tests/JIT/opt/Vectorization/StringEquals.cs | 14 | ||||
-rw-r--r-- | src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs | 8 |
3 files changed, 21 insertions, 3 deletions
diff --git a/src/coreclr/jit/importervectorization.cpp b/src/coreclr/jit/importervectorization.cpp index c627ac6592e..5db9251e146 100644 --- a/src/coreclr/jit/importervectorization.cpp +++ b/src/coreclr/jit/importervectorization.cpp @@ -380,7 +380,7 @@ GenTree* Compiler::impExpandHalfConstEqualsSWAR( // [ ch1 ] // [value] // - return impCreateCompareInd(data, TYP_SHORT, dataOffset, cns[0], cmpMode); + return impCreateCompareInd(data, TYP_USHORT, dataOffset, cns[0], cmpMode); } if (len == 2) { diff --git a/src/tests/JIT/opt/Vectorization/StringEquals.cs b/src/tests/JIT/opt/Vectorization/StringEquals.cs index d5c80c0e411..86739946fa8 100644 --- a/src/tests/JIT/opt/Vectorization/StringEquals.cs +++ b/src/tests/JIT/opt/Vectorization/StringEquals.cs @@ -22,7 +22,7 @@ public class StringEquals } Console.WriteLine(testCount); - return testCount == 25920 ? 100 : 0; + return testCount == 27888 ? 100 : 0; } } @@ -195,10 +195,22 @@ public static class Tests [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_157(string s) => ValidateEquals(s == "2ж1311a23b2212aЙ21Й11жb3233bb3a1", s, "2ж1311a23b2212aЙ21Й11жb3233bb3a1"); [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_158(string s) => ValidateEquals(s == "01Й11113ь3Й32a3ьЙЙ3Й32b2ab221310", s, "01Й11113ь3Й32a3ьЙЙ3Й32b2ab221310"); [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_159(string s) => ValidateEquals(s == "a120213b11211\0223223312ьь1Й3222Й", s, "a120213b11211\0223223312ьь1Й3222Й"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_160(string s) => ValidateEquals(s == "\u9244", s, "\u9244"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_161(string s) => ValidateEquals(s == "\u9244\u9244", s, "\u9244\u9244"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_162(string s) => ValidateEquals(s == "\u9244\u9244\u9244", s, "\u9244\u9244\u9244"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_163(string s) => ValidateEquals(s == "\uFFFF", s, "\uFFFF"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_164(string s) => ValidateEquals(s == "\uFFFF\uFFFF", s, "\uFFFF\uFFFF"); + [MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_165(string s) => ValidateEquals(s == "\uFFFF\uFFFF\uFFFF", s, "\uFFFF\uFFFF\uFFFF"); public static readonly string[] s_TestData = { null, + "\u9244", + "\u9244\u9244", + "\u9244\u9244\u9244", + "\uFFFF", + "\uFFFF\uFFFF", + "\uFFFF\uFFFF\uFFFF", "", "\0", "a", diff --git a/src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs b/src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs index d50deb26def..f81b96c4eaa 100644 --- a/src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs +++ b/src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs @@ -18,7 +18,7 @@ public class UnrollEqualsStartsWIth int testCount = 0; foreach (var testType in testTypes) testCount += RunTests(testType); - return testCount == 113652 ? 100 : 0; + return testCount == 127512 ? 100 : 0; } public static int RunTests(Type type) @@ -37,6 +37,12 @@ public class UnrollEqualsStartsWIth string[] testData = { + "\u9244", + "\u9244\u9244", + "\u9244\u9244\u9244", + "\uFFFF", + "\uFFFF\uFFFF", + "\uFFFF\uFFFF\uFFFF", "", string.Empty, "a", |