If multiple affection to a same ExprId are present in @affect_list,
merge them (in place).
For instance, XCGH AH, AL semantic is
[
RAX = {RAX[0:8],0,8, RAX[0:8],8,16, RAX[16:64],16,64}
RAX = {RAX[8:16],0,8, RAX[8:64],8,64}
]
This function will update @affect_list to replace previous ExprAff by
[
RAX = {RAX[8:16],0,8, RAX[0:8],8,16, RAX[16:64],16,64}
]
Definition at line 165 of file ir.py.
168 If multiple affection to a same ExprId are present in @affect_list,
169 merge them (in place).
170 For instance, XCGH AH, AL semantic is
172 RAX = {RAX[0:8],0,8, RAX[0:8],8,16, RAX[16:64],16,64}
173 RAX = {RAX[8:16],0,8, RAX[8:64],8,64}
175 This function will update @affect_list to replace previous ExprAff by
177 RAX = {RAX[8:16],0,8, RAX[0:8],8,16, RAX[16:64],16,64}
183 for expr
in affect_list:
184 effect[expr.dst] = effect.get(expr.dst, []) + [expr]
187 for dst, expr_list
in effect.items():
188 if len(expr_list) <= 1:
192 if any(map(
lambda e: not(isinstance(e.src, m2_expr.ExprCompose)),
197 e_colision = reduce(
lambda x, y: x.union(y),
198 (e.get_modified_slice()
for e
in expr_list),
201 known_intervals = sorted([(x[1], x[2])
for x
in e_colision])
206 remaining = ((m2_expr.ExprSlice(dst, *interval),
209 for interval
in missing_i)
212 slices = sorted(e_colision.union(remaining), key=
lambda x: x[1])
213 final_dst = m2_expr.ExprCompose(slices)
216 for expr
in expr_list:
217 affect_list.remove(expr)
220 affect_list.append(m2_expr.ExprAff(dst, final_dst))