@@ -974,7 +974,8 @@ GlobOptBlockData::MergeValueInfo(
974
974
fromDataValueInfo->AsArrayValueInfo (),
975
975
fromDataSym,
976
976
symsRequiringCompensation,
977
- symsCreatedForMerge);
977
+ symsCreatedForMerge,
978
+ isLoopBackEdge);
978
979
}
979
980
980
981
// Consider: If both values are VarConstantValueInfo with the same value, we could
@@ -1072,7 +1073,8 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1072
1073
const ArrayValueInfo *const fromDataValueInfo,
1073
1074
Sym *const arraySym,
1074
1075
BVSparse<JitArenaAllocator> *const symsRequiringCompensation,
1075
- BVSparse<JitArenaAllocator> *const symsCreatedForMerge)
1076
+ BVSparse<JitArenaAllocator> *const symsCreatedForMerge,
1077
+ bool isLoopBackEdge)
1076
1078
{
1077
1079
Assert (mergedValueType.IsAnyOptimizedArray ());
1078
1080
Assert (toDataValueInfo);
@@ -1095,7 +1097,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1095
1097
}
1096
1098
else
1097
1099
{
1098
- if (!this ->globOpt ->IsLoopPrePass ())
1100
+ if (!this ->globOpt ->IsLoopPrePass () && !isLoopBackEdge )
1099
1101
{
1100
1102
// Adding compensation code in the prepass won't help, as the symstores would again be different in the main pass.
1101
1103
Assert (symsRequiringCompensation);
@@ -1123,7 +1125,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1123
1125
}
1124
1126
else
1125
1127
{
1126
- if (!this ->globOpt ->IsLoopPrePass ())
1128
+ if (!this ->globOpt ->IsLoopPrePass () && !isLoopBackEdge )
1127
1129
{
1128
1130
Assert (symsRequiringCompensation);
1129
1131
symsRequiringCompensation->Set (arraySym->m_id );
@@ -1150,7 +1152,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1150
1152
}
1151
1153
else
1152
1154
{
1153
- if (!this ->globOpt ->IsLoopPrePass ())
1155
+ if (!this ->globOpt ->IsLoopPrePass () && !isLoopBackEdge )
1154
1156
{
1155
1157
Assert (symsRequiringCompensation);
1156
1158
symsRequiringCompensation->Set (arraySym->m_id );
0 commit comments