@@ -161,6 +161,26 @@ void PresburgerSpace::convertVarKind(VarKind srcKind, unsigned srcPos,
161161 assert (dstPos <= getNumVarKind (dstKind) &&
162162 " invalid position for destination variables" );
163163
164+ // Move identifiers if `usingIds` and variables moved are not locals.
165+ unsigned srcOffset = getVarKindOffset (srcKind) + srcPos;
166+ unsigned dstOffset = getVarKindOffset (dstKind) + dstPos;
167+ if (isUsingIds () && srcKind != VarKind::Local && dstKind != VarKind::Local) {
168+ identifiers.insert (identifiers.begin () + dstOffset, num, Identifier ());
169+ // Update srcOffset if insertion of new elements invalidates it.
170+ if (dstOffset < srcOffset)
171+ srcOffset += num;
172+ std::move (identifiers.begin () + srcOffset,
173+ identifiers.begin () + srcOffset + num,
174+ identifiers.begin () + dstOffset);
175+ identifiers.erase (identifiers.begin () + srcOffset,
176+ identifiers.begin () + srcOffset + num);
177+ } else if (isUsingIds () && srcKind != VarKind::Local) {
178+ identifiers.erase (identifiers.begin () + srcOffset,
179+ identifiers.begin () + srcOffset + num);
180+ } else if (isUsingIds () && dstKind != VarKind::Local) {
181+ identifiers.insert (identifiers.begin () + dstOffset, num, Identifier ());
182+ }
183+
164184 auto addVars = [&](VarKind kind, int num) {
165185 switch (kind) {
166186 case VarKind::Domain:
@@ -180,22 +200,6 @@ void PresburgerSpace::convertVarKind(VarKind srcKind, unsigned srcPos,
180200
181201 addVars (srcKind, -(signed )num);
182202 addVars (dstKind, num);
183-
184- // Move identifiers if `usingIds` and variables moved are not locals.
185- unsigned srcOffset = getVarKindOffset (srcKind) + srcPos;
186- unsigned dstOffset = getVarKindOffset (dstKind) + dstPos;
187- if (isUsingIds () && srcKind != VarKind::Local && dstKind != VarKind::Local) {
188- identifiers.insert (identifiers.begin () + dstOffset, num, Identifier ());
189- for (unsigned i = 0 ; i < num; ++i)
190- identifiers[dstOffset + i] = identifiers[srcOffset + i];
191- identifiers.erase (identifiers.begin () + srcOffset,
192- identifiers.begin () + srcOffset + num);
193- } else if (isUsingIds () && srcKind != VarKind::Local) {
194- identifiers.erase (identifiers.begin () + srcOffset,
195- identifiers.begin () + srcOffset + num);
196- } else if (isUsingIds () && dstKind != VarKind::Local) {
197- identifiers.insert (identifiers.begin () + dstOffset, num, Identifier ());
198- }
199203}
200204
201205void PresburgerSpace::swapVar (VarKind kindA, VarKind kindB, unsigned posA,
0 commit comments