Skip to content

Commit 89161f4

Browse files
authored
Fix bug in String.Equals unrolling for certain single-char strings (#78234)
1 parent ba54d0a commit 89161f4

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

src/coreclr/jit/importer_vectorization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ GenTree* Compiler::impExpandHalfConstEqualsSWAR(
380380
// [ ch1 ]
381381
// [value]
382382
//
383-
return impCreateCompareInd(data, TYP_SHORT, dataOffset, cns[0], cmpMode);
383+
return impCreateCompareInd(data, TYP_USHORT, dataOffset, cns[0], cmpMode);
384384
}
385385
if (len == 2)
386386
{

src/tests/JIT/opt/Vectorization/StringEquals.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static int Main()
2222
}
2323

2424
Console.WriteLine(testCount);
25-
return testCount == 25920 ? 100 : 0;
25+
return testCount == 27888 ? 100 : 0;
2626
}
2727
}
2828

@@ -195,10 +195,22 @@ static void ValidateEquals(bool result, string left, string right)
195195
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_157(string s) => ValidateEquals(s == "2ж1311a23b2212aЙ21Й11жb3233bb3a1", s, "2ж1311a23b2212aЙ21Й11жb3233bb3a1");
196196
[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");
197197
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_159(string s) => ValidateEquals(s == "a120213b11211\0223223312ьь1Й3222Й", s, "a120213b11211\0223223312ьь1Й3222Й");
198+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_160(string s) => ValidateEquals(s == "\u9244", s, "\u9244");
199+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_161(string s) => ValidateEquals(s == "\u9244\u9244", s, "\u9244\u9244");
200+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_162(string s) => ValidateEquals(s == "\u9244\u9244\u9244", s, "\u9244\u9244\u9244");
201+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_163(string s) => ValidateEquals(s == "\uFFFF", s, "\uFFFF");
202+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_164(string s) => ValidateEquals(s == "\uFFFF\uFFFF", s, "\uFFFF\uFFFF");
203+
[MethodImpl(MethodImplOptions.NoInlining)] public static void Equals_165(string s) => ValidateEquals(s == "\uFFFF\uFFFF\uFFFF", s, "\uFFFF\uFFFF\uFFFF");
198204

199205
public static readonly string[] s_TestData =
200206
{
201207
null,
208+
"\u9244",
209+
"\u9244\u9244",
210+
"\u9244\u9244\u9244",
211+
"\uFFFF",
212+
"\uFFFF\uFFFF",
213+
"\uFFFF\uFFFF\uFFFF",
202214
"",
203215
"\0",
204216
"a",

src/tests/JIT/opt/Vectorization/UnrollEqualsStartsWIth.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static int Main()
1818
int testCount = 0;
1919
foreach (var testType in testTypes)
2020
testCount += RunTests(testType);
21-
return testCount == 113652 ? 100 : 0;
21+
return testCount == 127512 ? 100 : 0;
2222
}
2323

2424
public static int RunTests(Type type)
@@ -37,6 +37,12 @@ public static int RunTests(Type type)
3737

3838
string[] testData =
3939
{
40+
"\u9244",
41+
"\u9244\u9244",
42+
"\u9244\u9244\u9244",
43+
"\uFFFF",
44+
"\uFFFF\uFFFF",
45+
"\uFFFF\uFFFF\uFFFF",
4046
"",
4147
string.Empty,
4248
"a",

0 commit comments

Comments
 (0)