def convert_to_SSA(exprs): """ Convert an iterable of :class:`Eq`s into Static Single Assignment form. """ # Identify recurring LHSs seen = {} for i, e in enumerate(exprs): seen.setdefault(e.lhs, []).append(i) # Optimization: don't waste time reconstructing stuff if already in SSA form if all(len(i) == 1 for i in seen.values()): return exprs # Do the SSA conversion c = 0 mapper = {} processed = [] for i, e in enumerate(exprs): where = seen[e.lhs] if len(where) > 1: # Transform into SSA until the very last write, excluded if where[-1] != i: ssa_lhs = dSymbol(name='ssa_t%d' % c, dtype=e.lhs.base.function.dtype) processed.append(e.func(ssa_lhs, e.rhs.xreplace(mapper))) mapper[e.lhs] = ssa_lhs c += 1 else: processed.append(e.func(e.lhs, e.rhs.xreplace(mapper))) else: processed.append(e) return processed
def test_internal_symbols(): s = dSymbol(name='s', dtype=np.float32) pkl_s = pickle.dumps(s) new_s = pickle.loads(pkl_s) assert new_s.name == s.name assert new_s.dtype is np.float32 s = Scalar(name='s', dtype=np.int32, is_const=True) pkl_s = pickle.dumps(s) new_s = pickle.loads(pkl_s) assert new_s.name == s.name assert new_s.dtype is np.int32 assert new_s.is_const is True