[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#6728: [PATCH] sort: omit 'restrict' in doubtful cases

From: Paul Eggert
Subject: bug#6728: [PATCH] sort: omit 'restrict' in doubtful cases
Date: Sun, 25 Jul 2010 20:29:45 -0700
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv: Gecko/20100527 Thunderbird/3.0.5

Several of the uses of 'restrict' in sort.c are not needed,
and the one in the typedef might even be incorrect (though
it would be hard to come up with a test case proving this,
as it is compiler-dependent and would require a genius compiler).
I installed the following.  It does not affect the code generated
on RHEL 5 x86-64 (gcc -O2), so any performance penalty of omitting
these 'restrict's is likely to be minor.

>From f9f86499bf0d45df5e304ce014724d35f3386560 Mon Sep 17 00:00:00 2001
From: Paul R. Eggert <address@hidden>
Date: Sun, 25 Jul 2010 20:25:31 -0700
Subject: [PATCH] sort: omit 'restrict' in doubtful cases

* src/sort.c (lock_node, unlock_node, queue_destroy, queue_init):
Omit 'restrict'; it shouldn't help here, as these functions have just
one pointer parameter and don't access static storage.
(queue_insert, check_insert, update_parent): Omit 'restrict', as
the pointer types differ, and are not char * or unsigned char *,
and therefore can't alias.
(write_unique): Omit 'restrict', as the pointer types are all
(merge_loop, sortlines): Omit 'restrict', as any performance
advantages are extremely unlikely and it's not worth cluttering
the code for that.
(struct thread_args): Omit 'restrict': this seems to be incorrect.
It's unlikely for 'restrict' to be correct inside a typedef.
 src/sort.c |   36 +++++++++++++++++-------------------
 1 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/src/sort.c b/src/sort.c
index ca1d95c..ea2720f 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -3119,7 +3119,7 @@ compare_nodes (void const *a, void const *b)
    number of processors.  */
 static inline void
-lock_node (struct merge_node *restrict node)
+lock_node (struct merge_node *node)
   pthread_spin_lock (node->lock);
@@ -3127,7 +3127,7 @@ lock_node (struct merge_node *restrict node)
 /* Unlock a merge tree NODE. */
 static inline void
-unlock_node (struct merge_node *restrict node)
+unlock_node (struct merge_node *node)
   pthread_spin_unlock (node->lock);
@@ -3135,7 +3135,7 @@ unlock_node (struct merge_node *restrict node)
 /* Destroy merge QUEUE. */
 static inline void
-queue_destroy (struct merge_node_queue *restrict queue)
+queue_destroy (struct merge_node_queue *queue)
   heap_free (queue->priority_queue);
   pthread_cond_destroy (&queue->cond);
@@ -3148,7 +3148,7 @@ queue_destroy (struct merge_node_queue *restrict queue)
    heap, RESERVE should be 2 * NTHREADS. */
 static inline void
-queue_init (struct merge_node_queue *restrict queue, size_t reserve)
+queue_init (struct merge_node_queue *queue, size_t reserve)
   queue->priority_queue = heap_alloc (compare_nodes, reserve);
   pthread_mutex_init (&queue->mutex, NULL);
@@ -3159,8 +3159,7 @@ queue_init (struct merge_node_queue *restrict queue, 
size_t reserve)
    or does not need to lock NODE. */
 static inline void
-queue_insert (struct merge_node_queue *restrict queue,
-              struct merge_node *restrict node)
+queue_insert (struct merge_node_queue *queue, struct merge_node *node)
   pthread_mutex_lock (&queue->mutex);
   heap_insert (queue->priority_queue, node);
@@ -3172,7 +3171,7 @@ queue_insert (struct merge_node_queue *restrict queue,
 /* Pop NODE off priority QUEUE. Guarantee a non-null, spinlocked NODE. */
 static inline struct merge_node *
-queue_pop (struct merge_node_queue *restrict queue)
+queue_pop (struct merge_node_queue *queue)
   struct merge_node *node = NULL;
@@ -3199,8 +3198,7 @@ queue_pop (struct merge_node_queue *restrict queue)
    thus is only appropriate for internal sort. */
 static inline void
-write_unique (struct line const *restrict line, FILE *tfp,
-              char const *temp_output)
+write_unique (struct line const *line, FILE *tfp, char const *temp_output)
   static struct line const *saved = NULL;
@@ -3284,7 +3282,7 @@ mergelines_node (struct merge_node *restrict node, size_t 
 /* Insert NODE into QUEUE if it passes insertion checks. */
 static inline void
-check_insert (struct merge_node *node, struct merge_node_queue *restrict queue)
+check_insert (struct merge_node *node, struct merge_node_queue *queue)
   size_t lo_avail = node->lo - node->end_lo;
   size_t hi_avail = node->hi - node->end_hi;
@@ -3304,8 +3302,8 @@ check_insert (struct merge_node *node, struct 
merge_node_queue *restrict queue)
 /* Update parent merge tree NODE. */
 static inline void
-update_parent (struct merge_node *restrict node, size_t merged,
-               struct merge_node_queue *restrict queue)
+update_parent (struct merge_node *node, size_t merged,
+               struct merge_node_queue *queue)
   if (node->level > MERGE_ROOT)
@@ -3326,7 +3324,7 @@ update_parent (struct merge_node *restrict node, size_t 
    some of those lines, until the MERGE_END node is popped. */
 static void
-merge_loop (struct merge_node_queue *restrict queue,
+merge_loop (struct merge_node_queue *queue,
             size_t total_lines, FILE *tfp, char const *temp_output)
   while (1)
@@ -3352,8 +3350,8 @@ merge_loop (struct merge_node_queue *restrict queue,
 static void sortlines (struct line *restrict, struct line *restrict,
                        unsigned long int, size_t,
-                       struct merge_node *restrict, bool,
-                       struct merge_node_queue *restrict,
+                       struct merge_node *, bool,
+                       struct merge_node_queue *,
                        FILE *, char const *);
 /* Thread arguments for sortlines_thread. */
@@ -3364,9 +3362,9 @@ struct thread_args
   struct line *dest;
   unsigned long int nthreads;
   size_t const total_lines;
-  struct merge_node *const restrict parent;
+  struct merge_node *const parent;
   bool lo_child;
-  struct merge_node_queue *const restrict merge_queue;
+  struct merge_node_queue *const merge_queue;
   FILE *tfp;
   char const *output_temp;
@@ -3407,8 +3405,8 @@ sortlines_thread (void *data)
 static void
 sortlines (struct line *restrict lines, struct line *restrict dest,
            unsigned long int nthreads, size_t total_lines,
-           struct merge_node *restrict parent, bool lo_child,
-           struct merge_node_queue *restrict merge_queue,
+           struct merge_node *parent, bool lo_child,
+           struct merge_node_queue *merge_queue,
            FILE *tfp, char const *temp_output)
   /* Create merge tree NODE. */

reply via email to

[Prev in Thread] Current Thread [Next in Thread]