218
218
rewrite(#c_let{vars=[#c_var{name=X}=V]=Vs,
219
arg=#c_call{module=#c_atom{val='erlang'},
220
name=#c_atom{val='setelement'},
221
args=[#c_int{val=Index1}, _Tuple, _Val1]
219
arg=#c_call{module=#c_literal{val='erlang'},
220
name=#c_literal{val='setelement'},
221
args=[#c_literal{val=Index1}, _Tuple, _Val1]
223
body=#c_call{anno=Banno,module=#c_atom{val='erlang'},
224
name=#c_atom{val='setelement'},
225
args=[#c_int{val=Index2},
223
body=#c_call{anno=Banno,module=#c_literal{val='erlang'},
224
name=#c_literal{val='setelement'},
225
args=[#c_literal{val=Index2},
230
230
_BodyEnv, FinalEnv)
231
when integer(Index1), integer(Index2), Index2 > 0, Index1 > Index2 ->
231
when is_integer(Index1), is_integer(Index2), Index2 > 0, Index1 > Index2 ->
232
232
case is_safe(Val2) of
234
234
{R#c_let{vars=Vs,
236
236
body=#c_seq{arg=#c_primop{
238
name=#c_atom{val='dsetelement'},
239
args=[#c_int{val=Index2},
238
name=#c_literal{val='dsetelement'},
239
args=[#c_literal{val=Index2},
256
256
%% if X1 is used exactly once.
258
258
rewrite(#c_let{vars=[#c_var{name=X1}],
259
arg=#c_call{module=#c_atom{val='erlang'},
260
name=#c_atom{val='setelement'},
261
args=[#c_int{val=Index1}, _Tuple, _Val1]
259
arg=#c_call{module=#c_literal{val='erlang'},
260
name=#c_literal{val='setelement'},
261
args=[#c_literal{val=Index1}, _Tuple, _Val1]
263
263
body=#c_let{vars=[#c_var{}=V]=Vs,
264
264
arg=#c_call{anno=Banno,
265
module=#c_atom{val='erlang'},
266
name=#c_atom{val='setelement'},
267
args=[#c_int{val=Index2},
265
module=#c_literal{val='erlang'},
266
name=#c_literal{val='setelement'},
267
args=[#c_literal{val=Index2},
278
278
body=#c_seq{arg=#c_primop{
280
name=#c_atom{val='dsetelement'},
281
args=[#c_int{val=Index2},
280
name=#c_literal{val='dsetelement'},
281
args=[#c_literal{val=Index2},
294
294
is_safe(#c_var{}) -> true;
295
295
is_safe(#c_fname{}) -> true;
296
is_safe(#c_int{}) -> true;
297
is_safe(#c_float{}) -> true;
298
is_safe(#c_atom{}) -> true;
299
is_safe(#c_char{}) -> true;
300
is_safe(#c_nil{}) -> true;
296
is_safe(#c_literal{val=[_|_]}) -> false;
297
is_safe(#c_literal{val=V}) -> not is_tuple(V);
301
298
is_safe(_) -> false.
303
300
is_single_use(V, Env) ->