TYPE VarVarPair = Var * Var VarVarPairSet = set(VarVarPair) VarVarPairSetLifted = lift(VarVarPairSet) PROBLEM Copy_Propagation direction : forward carrier : VarVarPairSetLifted init : top init_start : lift({}) combine : glb TRANSFER ASSIGN(var, exp) = let entry <= @ in lift(entry - { varpair | varpair in entry; varpair#1 = var || varpair#2 = var } + (if expType(exp) = "VAR" then {(var,expVar(exp))} else {} endif)) /* could test whether (x,y) is in carrier while given y:=x, and not kill (x,y) */ /* could also test for x := y; z:=x; (z is now both a copy of y and x!) */