Skip to content

Commit 13ccc77

Browse files
smowtonromainbrenguier
authored andcommitted
Add L1_WITH_CONSTANT_PROPAGATION mode to goto_symex_statet::rename
This allows applying constant propagation without upgrading non-constant symbols to L2, which is useful for the dereferencing logic, as the value-set used to resolve pointer aliasing is indexed by L1 names.
1 parent 153a4b9 commit 13ccc77

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/goto-symex/goto_symex_state.cpp

+22-3
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,15 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
171171
{
172172
// rename all the symbols with their last known value
173173

174+
static_assert(
175+
level == L0 || level == L1 || level == L1_WITH_CONSTANT_PROPAGATION ||
176+
level == L2,
177+
"must handle all renaming levels");
178+
174179
if(expr.id()==ID_symbol &&
175180
expr.get_bool(ID_C_SSA_symbol))
176181
{
182+
exprt original_expr = expr;
177183
ssa_exprt &ssa=to_ssa_expr(expr);
178184

179185
if(level == L0)
@@ -186,7 +192,7 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
186192
return renamedt<exprt, level>{
187193
std::move(rename_ssa<L1>(std::move(ssa), ns).value())};
188194
}
189-
else if(level==L2)
195+
else
190196
{
191197
ssa = set_indices<L1>(std::move(ssa), ns).get();
192198
rename<level>(expr.type(), ssa.get_identifier(), ns);
@@ -195,7 +201,14 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
195201
// renaming taken care of by l2_thread_encoding, or already at L2
196202
if(l2_thread_read_encoding(ssa, ns) || !ssa.get_level_2().empty())
197203
{
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));
199212
}
200213
else
201214
{
@@ -209,7 +222,8 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
209222
}
210223
else
211224
{
212-
ssa = set_indices<L2>(std::move(ssa), ns).get();
225+
if(level == L2)
226+
ssa = set_indices<L2>(std::move(ssa), ns).get();
213227
return renamedt<exprt, level>(std::move(ssa));
214228
}
215229
}
@@ -261,6 +275,11 @@ goto_symex_statet::rename(exprt expr, const namespacet &ns)
261275
}
262276
}
263277

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+
264283
exprt goto_symex_statet::l2_rename_rvalues(exprt lvalue, const namespacet &ns)
265284
{
266285
rename(lvalue.type(), irep_idt(), ns);

src/goto-symex/renamed.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ enum levelt
1616
{
1717
L0 = 0,
1818
L1 = 1,
19-
L2 = 2
19+
L1_WITH_CONSTANT_PROPAGATION = 2,
20+
L2 = 3
2021
};
2122

2223
/// Wrapper for expressions or types which have been renamed up to a given

0 commit comments

Comments
 (0)