Refactored to provide a ModulePass in addition to a FunctionPass