[m-rev.] for review: conditional structure reuse for LLDS backends
Julien Fischer
juliensf at csse.unimelb.edu.au
Mon Feb 11 13:02:19 AEDT 2008
On Mon, 11 Feb 2008, Peter Wang wrote:
> On 2008-02-11, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
>>
>> On Wed, 30 Jan 2008, Peter Wang wrote:
>>
>>> [Pending bootchecks in more grades.]
>>
>> Could you please post some benchmarks between conditional structure
>> reuse / structure reuse without static data / no structure reuse,
>> at some point.
>
> Will do.
>
>>
>>> Index: runtime/mercury_heap.h
>>> ===================================================================
>>> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_heap.h,v
>>> retrieving revision 1.39
>>> diff -u -r1.39 mercury_heap.h
>>> --- runtime/mercury_heap.h 21 Aug 2007 06:22:04 -0000 1.39
>>> +++ runtime/mercury_heap.h 30 Jan 2008 03:58:00 -0000
>>> @@ -33,7 +33,7 @@
>>> #include "mercury_context.h" /* for min_heap_reclamation_point() */
>>> #include "mercury_heap_profile.h" /* for MR_record_allocation() */
>>> #include "mercury_deep_profiling.h" /* for MR_current_call_site_dynamic */
>>> -#include "mercury_std.h" /* for MR_EXTERN_INLINE */
>>> +#include "mercury_std.h" /* for MR_EXTERN_INLINE */
>>> #include "mercury_reg_workarounds.h" /* for MR_memcpy */
>>> #include "mercury_debug.h" /* for MR_debugtagoffsetincrhp* */
>>> #ifdef MR_HIGHLEVEL_CODE
>>> @@ -47,6 +47,8 @@
>>> #ifdef MR_BOEHM_GC
>>> #define GC_I_HIDE_POINTERS
>>> #include "gc.h"
>>> + #include "gc_mark.h" /* for GC_least_plausible_heap_addr */
>>> + /* GC_greatest_plausible_heap_addr */
>>> #endif
>>> #endif
>>>
>>> @@ -396,6 +398,59 @@
>>> /***************************************************************************/
>>>
>>> /*
>>> +** Macros to implement structure reuse, conditioned on whether the structure
>>
>> s/conditioned/conditional/
>
> Changed (although it was fine before).
>
>>> +#ifdef MR_BOEHM_GC
>>> +
>>> + #define MR_in_heap_range(addr) \
>>> + ((void *) (addr) >= GC_least_plausible_heap_addr && \
>>> + (void *) (addr) < GC_greatest_plausible_heap_addr) \
>>> +
>>> +#else /* ! MR_BOEHM_GC */
>>
>> Is it still possible to use non-conditional structre reuse with the LLDS
>> backend? If so, how do I do it? If not, there should be a
>> developer-only option that does that.
>
> I have made this possible by defining a C macro that forces the trivial
> definition of MR_in_heap_range (always evaluates to true).
>
> Peter
>
> --- ws_reuse_plausible,20080130,e.txt 2008-01-30 16:02:39.000000000 +1100
> +++ ws_reuse_plausible,20080211,b.txt 2008-02-11 11:03:43.000000000 +1100
> @@ -31,7 +31,7 @@
>
>
> compiler/llds.m:
> - Extend the `incr_hp' instruction to holds information for structure
> + Extend the `incr_hp' instruction to hold information for structure
> reuse.
>
> compiler/code_info.m:
> @@ -49,6 +49,7 @@
> `var_locn_assign_dynamic_cell_to_var'.
>
> runtime/mercury_heap.h:
> +runtime/mercury_conf_param.h:
> Add a macro to check if an address is between
> `GC_least_plausible_heap_addr' and `GC_greatest_plausible_heap_addr',
> which are therefore in the heap.
> @@ -56,6 +57,9 @@
> Add macros to conditionally reuse a cell or otherwise fall back to
> allocating a new object.
>
> + Make it possible to revert to unconditional structure reuse by
> + defining the C macro `MR_UNCONDITIONAL_STRUCTURE_REUSE'.
> +
> compiler/llds_out.m:
> Call the new macros in `mercury_heap.h' for `incr_hp' instructions
> with reuse information filled in.
>
>
> diff -u runtime/mercury_heap.h runtime/mercury_heap.h
> --- runtime/mercury_heap.h 30 Jan 2008 03:58:00 -0000
> +++ runtime/mercury_heap.h 10 Feb 2008 23:59:59 -0000
> @@ -398,7 +398,7 @@
> /***************************************************************************/
>
> /*
> -** Macros to implement structure reuse, conditioned on whether the structure
> +** Macros to implement structure reuse, conditional on whether the structure
> ** to reuse is really dynamically allocated. If not, fall back to allocating
> ** a new object on the heap.
> */
> @@ -418,13 +418,13 @@
> (void) dummy; \
> } while (0)
>
> -#ifdef MR_BOEHM_GC
> +#if defined(MR_BOEHM_GC) && !defined(MR_UNCONDITIONAL_STRUCTURE_REUSE)
>
> #define MR_in_heap_range(addr) \
> ((void *) (addr) >= GC_least_plausible_heap_addr && \
> (void *) (addr) < GC_greatest_plausible_heap_addr) \
>
> -#else /* ! MR_BOEHM_GC */
> +#else /* ! MR_BOEHM_GC || MR_UNCONDITIONAL_STRUCTURE_REUSE */
>
> /*
> ** We don't have any way to check whether `addr' is dynamically allocated,
> @@ -433,7 +433,7 @@
> */
> #define MR_in_heap_range(addr) (MR_TRUE)
>
> -#endif /* ! MR_BOEHM_GC */
> +#endif /* ! MR_BOEHM_GC || MR_UNCONDITIONAL_STRUCTURE_REUSE */
>
> #define MR_tag_reuse_or_alloc_heap_flag(dest, tag, flag, reuse_addr, \
> fallback_alloc) \
> --- runtime/mercury_conf_param.h 13 Dec 2007 01:14:01 -0000 1.105
> +++ runtime/mercury_conf_param.h 10 Feb 2008 23:59:59 -0000
> @@ -475,6 +475,10 @@
> ** problems if user-defined unify procedures abort: the exception could be
> ** transmitted to the parent Mercury code only by catching and retransmitting
> ** it, which, for efficiency reasons, the code doesn't do.
> +**
> +** MR_UNCONDITIONAL_STRUCTURE_REUSE
> +** Enable this to bypass the check that a cell was allocated by Boehm GC
> +** before reusing it.
> */
>
> #if defined(MR_THREAD_SAFE) && defined(MR_TRACE_HISTOGRAM)
That looks fine.
Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list