@@ -171,9 +171,15 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
171
171
{
172
172
// rename all the symbols with their last known value
173
173
174
+ static_assert (
175
+ level == L0 || level == L1 || level == L1_WITH_CONSTANT_PROPAGATION ||
176
+ level == L2,
177
+ " must handle all renaming levels" );
178
+
174
179
if (expr.id ()==ID_symbol &&
175
180
expr.get_bool (ID_C_SSA_symbol))
176
181
{
182
+ exprt original_expr = expr;
177
183
ssa_exprt &ssa=to_ssa_expr (expr);
178
184
179
185
if (level == L0)
@@ -186,7 +192,7 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
186
192
return renamedt<exprt, level>{
187
193
std::move (rename_ssa<L1>(std::move (ssa), ns).value ())};
188
194
}
189
- else if (level==L2)
195
+ else
190
196
{
191
197
ssa = set_indices<L1>(std::move (ssa), ns).get ();
192
198
rename <level>(expr.type (), ssa.get_identifier (), ns);
@@ -195,7 +201,14 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
195
201
// renaming taken care of by l2_thread_encoding, or already at L2
196
202
if (l2_thread_read_encoding (ssa, ns) || !ssa.get_level_2 ().empty ())
197
203
{
198
- return renamedt<exprt, level>(std::move (ssa));
204
+ if (level == L1_WITH_CONSTANT_PROPAGATION)
205
+ {
206
+ // Don't actually rename to L2 -- we just used `ssa` to check whether
207
+ // constant-propagation was applicable
208
+ return renamedt<exprt, level>(std::move (original_expr));
209
+ }
210
+ else
211
+ return renamedt<exprt, level>(std::move (ssa));
199
212
}
200
213
else
201
214
{
@@ -209,7 +222,8 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
209
222
}
210
223
else
211
224
{
212
- ssa = set_indices<L2>(std::move (ssa), ns).get ();
225
+ if (level == L2)
226
+ ssa = set_indices<L2>(std::move (ssa), ns).get ();
213
227
return renamedt<exprt, level>(std::move (ssa));
214
228
}
215
229
}
@@ -261,6 +275,11 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
261
275
}
262
276
}
263
277
278
+ // Explicitly instantiate the one version of this function without an explicit
279
+ // caller in this file:
280
+ template renamedt<exprt, L1_WITH_CONSTANT_PROPAGATION>
281
+ goto_symex_statet::rename (exprt expr, const namespacet &ns);
282
+
264
283
exprt goto_symex_statet::l2_rename_rvalues (exprt lvalue, const namespacet &ns)
265
284
{
266
285
rename (lvalue.type (), irep_idt (), ns);
0 commit comments