On Mon, Dec 31, 2012 at 9:09 PM,  <[email protected]> wrote:
> Author: rhuijben
> Date: Mon Dec 31 20:09:21 2012
> New Revision: 1427237
>
> URL: http://svn.apache.org/viewvc?rev=1427237&view=rev
> Log:
> Following up on r1427210, document some of the unaligned access magic by using
> similar pointer calculations in more cases. Document the + 1's in the pointer
> calculations.

It's all been a while, so my memory is a bit foggy on this, but just
reading this diff I have a question ...

> * subversion/libsvn_diff/diff_file.c
>   (find_identical_suffix): Make the can_read code easier to follow; add some
>      comments. Reduce scope of single-use variable.
>
> Modified:
>     subversion/trunk/subversion/libsvn_diff/diff_file.c
>
> Modified: subversion/trunk/subversion/libsvn_diff/diff_file.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_file.c?rev=1427237&r1=1427236&r2=1427237&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_diff/diff_file.c (original)
> +++ subversion/trunk/subversion/libsvn_diff/diff_file.c Mon Dec 31 20:09:21 
> 2012
> @@ -528,7 +528,6 @@ find_identical_suffix(apr_off_t *suffix_
>    apr_off_t min_file_size;
>    int suffix_lines_to_keep = SUFFIX_LINES_TO_KEEP;
>    svn_boolean_t is_match;
> -  svn_boolean_t reached_prefix;
>    apr_off_t lines = 0;
>    svn_boolean_t had_cr;
>    svn_boolean_t had_nl;
> @@ -590,6 +589,7 @@ find_identical_suffix(apr_off_t *suffix_
>    had_nl = FALSE;
>    while (is_match)
>      {
> +      svn_boolean_t reached_prefix;
>  #if SVN_UNALIGNED_ACCESS_IS_OK
>        /* Initialize the minimum pointer positions. */
>        const char *min_curp[4];
> @@ -616,24 +616,28 @@ find_identical_suffix(apr_off_t *suffix_
>        DECREMENT_POINTERS(file_for_suffix, file_len, pool);
>
>  #if SVN_UNALIGNED_ACCESS_IS_OK
> +      for (i = 0; i < file_len; i++)
> +        min_curp[i] = file_for_suffix[i].buffer;
>
> -      min_curp[0] = file_for_suffix[0].chunk == suffix_min_chunk0
> -                  ? file_for_suffix[0].buffer + suffix_min_offset0 + 1
> -                  : file_for_suffix[0].buffer + 1;
> -      for (i = 1; i < file_len; i++)
> -        min_curp[i] = file_for_suffix[i].buffer + 1;
> +      /* If we are in the same chunk that contains the last part of the 
> common
> +         prefix, use the min_curp[0] pointer to make sure we don't get a
> +         suffix that overlaps the already determined common prefix. */
> +      if (file_for_suffix[0].chunk == suffix_min_chunk0)
> +        min_curp[0] += suffix_min_offset0;

After your change, the min_curp's are 1 lower than before, and ...

>        /* Scan quickly by reading with machine-word granularity. */
>        for (i = 0, can_read_word = TRUE; i < file_len; i++)
>          can_read_word = can_read_word
> -                        && (   file_for_suffix[i].curp - 
> sizeof(apr_uintptr_t)
> -                            >= min_curp[i]);
> +                        && (  (file_for_suffix[i].curp + 1
> +                                 - sizeof(apr_uintptr_t))
> +                            > min_curp[i]);

... here the LHS is 1 higher than before *and* you changed the
operator from >= to >. Are you sure that's correct? It probably
doesn't hurt, but it let's the chunky suffix scanning stop potentially
1 word too early (I think ... if the previous version was correct that
is).

Same below inside the while loop ...

>        while (can_read_word)
>          {
>            apr_uintptr_t chunk;
>
> -          /* For each file curp is positioned at the next byte to read, but 
> we
> -             want to examine the bytes before the current location. */
> +          /* For each file curp is positioned at the current byte, but we
> +             want to examine the current byte and the ones before the current
> +             location as one machine word. */
>
>            chunk = *(const apr_uintptr_t *)(file_for_suffix[0].curp + 1
>                                               - sizeof(apr_uintptr_t));
> @@ -654,15 +658,18 @@ find_identical_suffix(apr_off_t *suffix_
>              {
>                file_for_suffix[i].curp -= sizeof(apr_uintptr_t);
>                can_read_word = can_read_word
> -                              && (   (file_for_suffix[i].curp
> -                                        - sizeof(apr_uintptr_t))
> -                                  >= min_curp[i]);
> +                              && (  (file_for_suffix[i].curp + 1
> +                                       - sizeof(apr_uintptr_t))
> +                                  > min_curp[i]);

here.

Or was that intentional?

-- 
Johan

>              }
>
> -          /* We skipped 4 bytes, so there are no closing EOLs */
> +          /* We skipped some bytes, so there are no closing EOLs */
>            had_nl = FALSE;
>            had_cr = FALSE;
>          }
> +
> +      /* The > min_curp[i] check leaves at least one final byte for checking
> +         in the non block optimized case below. */
>  #endif
>
>        reached_prefix = file_for_suffix[0].chunk == suffix_min_chunk0
> @@ -671,7 +678,8 @@ find_identical_suffix(apr_off_t *suffix_
>        if (reached_prefix || is_one_at_bof(file_for_suffix, file_len))
>          break;
>
> -      for (i = 1, is_match = TRUE; i < file_len; i++)
> +      is_match = TRUE;
> +      for (i = 1; i < file_len; i++)
>          is_match = is_match
>                     && *file_for_suffix[0].curp == *file_for_suffix[i].curp;
>      }
>
>

Reply via email to