@@ -1086,7 +1086,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1086
1086
// but in different syms, create a new sym and record that the array sym requires compensation. Compensation will be
1087
1087
// inserted later to initialize this new sym from all predecessors of the merged block.
1088
1088
1089
- StackSym *newHeadSegmentSym;
1089
+ StackSym *newHeadSegmentSym = nullptr ;
1090
1090
if (toDataValueInfo->HeadSegmentSym () && fromDataValueInfo->HeadSegmentSym ())
1091
1091
{
1092
1092
if (toDataValueInfo->HeadSegmentSym () == fromDataValueInfo->HeadSegmentSym ())
@@ -1095,27 +1095,26 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1095
1095
}
1096
1096
else
1097
1097
{
1098
- Assert (!this ->globOpt ->IsLoopPrePass ());
1099
- Assert (symsRequiringCompensation);
1100
- symsRequiringCompensation->Set (arraySym->m_id );
1101
- Assert (symsCreatedForMerge);
1102
- if (symsCreatedForMerge->Test (toDataValueInfo->HeadSegmentSym ()->m_id ))
1098
+ if (!this ->globOpt ->IsLoopPrePass ())
1103
1099
{
1104
- newHeadSegmentSym = toDataValueInfo->HeadSegmentSym ();
1105
- }
1106
- else
1107
- {
1108
- newHeadSegmentSym = StackSym::New (TyMachPtr, this ->globOpt ->func );
1109
- symsCreatedForMerge->Set (newHeadSegmentSym->m_id );
1100
+ // Adding compensation code in the prepass won't help, as the symstores would again be different in the main pass.
1101
+ Assert (symsRequiringCompensation);
1102
+ symsRequiringCompensation->Set (arraySym->m_id );
1103
+ Assert (symsCreatedForMerge);
1104
+ if (symsCreatedForMerge->Test (toDataValueInfo->HeadSegmentSym ()->m_id ))
1105
+ {
1106
+ newHeadSegmentSym = toDataValueInfo->HeadSegmentSym ();
1107
+ }
1108
+ else
1109
+ {
1110
+ newHeadSegmentSym = StackSym::New (TyMachPtr, this ->globOpt ->func );
1111
+ symsCreatedForMerge->Set (newHeadSegmentSym->m_id );
1112
+ }
1110
1113
}
1111
1114
}
1112
1115
}
1113
- else
1114
- {
1115
- newHeadSegmentSym = nullptr ;
1116
- }
1117
1116
1118
- StackSym *newHeadSegmentLengthSym;
1117
+ StackSym *newHeadSegmentLengthSym = nullptr ;
1119
1118
if (toDataValueInfo->HeadSegmentLengthSym () && fromDataValueInfo->HeadSegmentLengthSym ())
1120
1119
{
1121
1120
if (toDataValueInfo->HeadSegmentLengthSym () == fromDataValueInfo->HeadSegmentLengthSym ())
@@ -1124,27 +1123,25 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1124
1123
}
1125
1124
else
1126
1125
{
1127
- Assert (!this ->globOpt ->IsLoopPrePass ());
1128
- Assert (symsRequiringCompensation);
1129
- symsRequiringCompensation->Set (arraySym->m_id );
1130
- Assert (symsCreatedForMerge);
1131
- if (symsCreatedForMerge->Test (toDataValueInfo->HeadSegmentLengthSym ()->m_id ))
1126
+ if (!this ->globOpt ->IsLoopPrePass ())
1132
1127
{
1133
- newHeadSegmentLengthSym = toDataValueInfo->HeadSegmentLengthSym ();
1134
- }
1135
- else
1136
- {
1137
- newHeadSegmentLengthSym = StackSym::New (TyUint32, this ->globOpt ->func );
1138
- symsCreatedForMerge->Set (newHeadSegmentLengthSym->m_id );
1128
+ Assert (symsRequiringCompensation);
1129
+ symsRequiringCompensation->Set (arraySym->m_id );
1130
+ Assert (symsCreatedForMerge);
1131
+ if (symsCreatedForMerge->Test (toDataValueInfo->HeadSegmentLengthSym ()->m_id ))
1132
+ {
1133
+ newHeadSegmentLengthSym = toDataValueInfo->HeadSegmentLengthSym ();
1134
+ }
1135
+ else
1136
+ {
1137
+ newHeadSegmentLengthSym = StackSym::New (TyUint32, this ->globOpt ->func );
1138
+ symsCreatedForMerge->Set (newHeadSegmentLengthSym->m_id );
1139
+ }
1139
1140
}
1140
1141
}
1141
1142
}
1142
- else
1143
- {
1144
- newHeadSegmentLengthSym = nullptr ;
1145
- }
1146
1143
1147
- StackSym *newLengthSym;
1144
+ StackSym *newLengthSym = nullptr ;
1148
1145
if (toDataValueInfo->LengthSym () && fromDataValueInfo->LengthSym ())
1149
1146
{
1150
1147
if (toDataValueInfo->LengthSym () == fromDataValueInfo->LengthSym ())
@@ -1153,25 +1150,23 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
1153
1150
}
1154
1151
else
1155
1152
{
1156
- Assert (!this ->globOpt ->IsLoopPrePass ());
1157
- Assert (symsRequiringCompensation);
1158
- symsRequiringCompensation->Set (arraySym->m_id );
1159
- Assert (symsCreatedForMerge);
1160
- if (symsCreatedForMerge->Test (toDataValueInfo->LengthSym ()->m_id ))
1161
- {
1162
- newLengthSym = toDataValueInfo->LengthSym ();
1163
- }
1164
- else
1153
+ if (!this ->globOpt ->IsLoopPrePass ())
1165
1154
{
1166
- newLengthSym = StackSym::New (TyUint32, this ->globOpt ->func );
1167
- symsCreatedForMerge->Set (newLengthSym->m_id );
1155
+ Assert (symsRequiringCompensation);
1156
+ symsRequiringCompensation->Set (arraySym->m_id );
1157
+ Assert (symsCreatedForMerge);
1158
+ if (symsCreatedForMerge->Test (toDataValueInfo->LengthSym ()->m_id ))
1159
+ {
1160
+ newLengthSym = toDataValueInfo->LengthSym ();
1161
+ }
1162
+ else
1163
+ {
1164
+ newLengthSym = StackSym::New (TyUint32, this ->globOpt ->func );
1165
+ symsCreatedForMerge->Set (newLengthSym->m_id );
1166
+ }
1168
1167
}
1169
1168
}
1170
1169
}
1171
- else
1172
- {
1173
- newLengthSym = nullptr ;
1174
- }
1175
1170
1176
1171
if (newHeadSegmentSym || newHeadSegmentLengthSym || newLengthSym)
1177
1172
{
0 commit comments