mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-15 22:03:26 +00:00
Estimated hours taken: 6 Branches: main Fix a performance bug where dead_pred_elim was taking a significant amount of time to delete entries from the predicate_table. With this change dead_pred_elim goes from 12 minutes to 55 seconds CPU time in the IL grade when compiling accumulator.m with --intermodule-optimization turned on. compiler/hlds_module.m: Implement a new predicate, predicate_table_restrict, which restricts the predicate_table to include only a subset of the predicates. Rather than deleting all the non-needed entries, this predicate builds the predicate_table from scratch again, hence this predicate is only useful when the number of predicates to keep is significantly less than the number of predicates to delete. Change predicate_table_do_insert so that it records in the pred_info whether or not a predicate can only be accessed by its fully qualified name, this is needed so that the predicate_table can be rebuilt correctly. compiler/dead_proc_elim.m: Use predicate_table_restrict to restrict the set of pred_ids in the predicate_table rather than module_info_remove_predicate as the amount of predicates to keep is in general significantly smaller than the number of predicates to keep. compiler/hlds_pred.m: Add a new pred_marker which indicates whether or not a predicate can only be accessed by its fully qualified name. compiler/hlds_out.m: compiler/intermod.m: Handle the new pred_marker.
This is now looking a LOT more like the standard "diff" utility. There are a few features missing (e.g. we can't do directory diffs), but apart from that, it seems to work. The major changes in this version are: - We now accept command-line options. In particular, we recognise all options that are accepted by GNU diff, though some of them result in error reports and a few which have do nothing to do with the output format or semantics, but are merely for efficiency, are accepted and ignored. - We support different output formats, in particular all of the output formats supported by GNU diff. There are a number of modifiers to the output formats (for example, --show-function-line) which we don't yet support. - We have a new diff algorithm, based on the one by Eugene Myers. See myers.m for details. - Just about everything has been modified to support the above changes. - Lots of cleanups, lots more documentation. Examine the file TODO to see what's still missing. Andrew Bromage 13 September 1998 =========================================================================== The version which appears here is a re-hacked version of Marnix Klooster's hacked version of my original. Special thanks to him for making my code a lot more maintainable than it originally was. :-) The changes from the previous version: - Bug fix for a problem which was causing it to bomb out if the two files were identical. - Changed indenting so it more closely matches the Mercury compiler coding standard. - Update to use unique arrays (now called array.m). - Various minor documentation tweaks. Oh, and it still runs in nowhere near the speed of GNU diff. Andrew Bromage 28 Jul 1997 =========================================================================== The Mercury modules in this directory have been derived from the 'diff' sample distributed with Mercury 0.6. That sample carries the following copyright information, description and to-do list (in diff.m): %-----------------------------------------------------------------------------% % Copyright (C) 1995 The University of Melbourne. % This file may only be copied under the terms of the GNU General % Public License - see the file COPYING in the Mercury distribution. %-----------------------------------------------------------------------------% % File: diff.m % Main author: bromage % Something very similar to the standard diff utility. Sort of. :-) % On the still-to-do list: % - Add command-line options. Probably: % --ignore-all-space % --ignore-blank-lines % --ignore-case % --rcs % What others are easy and don't break up the code? The major changes I made were * Moved code for manipulating and displaying diffs to a separate module called diffs.m (and changed their calls in diff.m). The type 'lcss,' needed both by the rest of lcss.m and by diffs.m, was moved to a new module lcsstype.m. * Made lcss.m independent of files, and allowed it to process any kind of list by adding polymorphism. (The file processing calls have been moved to diff.m.) * Added type synonyms 'pos' and 'segment' in diffs.m to clarify the types. Renamed 'single_diff' to 'edit'. * Added end-of-file match to the generated lcss, thereby allowing the to_diff predicate to be simplified considerably. * Numbered lists from 0 internally in the lcss-algorithm. This made to_diff simpler still, but also forced changes in the diff-printing part. * Removed the swapping in find_lcss, because it doesn't seem to help. * The array(string) representing a file in file.m was also renumbered to begin with 0. * Added and corrected comments. Have fun, <>< Marnix -- Marnix Klooster marnix@worldonline.nl