/* Made from liveness-analyse */ TYPE VarLabel = Var * Label VarLabelSet = set(VarLabel) VarLabelSetlifted = lift(VarLabelSet) PROBLEM Upwards_Exposed_Uses_Analysis direction : backward carrier : VarLabelSetlifted init : bot init_start : lift({}) combine : lub TRANSFER ASSIGN(variable, expression) = let UsedVars <= @ in lift(UsedVars - {e | l in top; let e = (variable,l)} + {e | v in variables(expression); let e = (v,label)}) IF(expression) = let UsedVars <= @ in lift(UsedVars + {e | v in variables(expression); let e = (v,label)}) WHILE(expression) = let UsedVars <= @ in lift(UsedVars + {e | v in variables(expression); let e = (v,label)}) CALL(_, _, expression) = let UsedVars <= @ in lift(UsedVars + {e | v in variables(expression); let e = (v,label)}) RETURN(_, param, _), local_edge = let UsedVars <= @ in lift({(x,y) | (x,y) in UsedVars; x = param }) BEGIN(_, param), call_edge = let UsedVars <= @ in lift({(x,y) | (x,y) in UsedVars; x != param }) SUPPORT subExpressions :: Expression -> ExpressionSet subExpressions(expression) = case expType(expression) of "ARITH_BINARY" => subExpressions(expSubLeft(expression)) lub subExpressions(expSubRight(expression)); "ARITH_UNARY" => subExpressions(expSub(expression)); "BOOL_BINARY" => subExpressions(expSubLeft(expression)) lub subExpressions(expSubRight(expression)); "BOOL_UNARY" => subExpressions(expSub(expression)); _ => {}; endcase + expression variables :: Expression -> VarSet variables(expression) = { expVar(exp) | exp in subExpressions(expression); expType(exp) = "VAR" }