+2012-07-13  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * ggc.h (ggc_internal_alloc_stat, ggc_alloc_typed_stat,
+       ggc_internal_cleared_alloc_stat, ggc_cleared_alloc_htab_ignore_args,
+       ggc_cleared_alloc_ptr_array_two_args, ggc_splay_alloc): Add
+       ATTRIBUTE_MALLOC.
+       * alloc-pool.h (pool_alloc): Likewise.
+
+       * final.c (final): Do not loop to find max_uid.
+
 2012-07-13  Steven Bosscher  <steven@gcc.gnu.org>
 
        * emit-rtl.c (make_debug_insn_raw, make_jump_insn_raw): Make static.
 
 final (rtx first, FILE *file, int optimize_p)
 {
   rtx insn, next;
-  int max_uid = 0;
   int seen = 0;
 
   /* Used for -dA dump.  */
 
   last_ignored_compare = 0;
 
+#ifdef HAVE_cc0
   for (insn = first; insn; insn = NEXT_INSN (insn))
     {
-      if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
-       max_uid = INSN_UID (insn);
-#ifdef HAVE_cc0
       /* If CC tracking across branches is enabled, record the insn which
         jumps to each branch only reached from one place.  */
       if (optimize_p && JUMP_P (insn))
              LABEL_REFS (lab) = insn;
            }
        }
-#endif
     }
+#endif
 
   init_recog ();
 
 
 /* Allocation.  */
 
 /* The internal primitive.  */
-extern void *ggc_internal_alloc_stat (size_t MEM_STAT_DECL);
+extern void *ggc_internal_alloc_stat (size_t MEM_STAT_DECL)
+  ATTRIBUTE_MALLOC;
 
 extern size_t ggc_round_alloc_size (size_t requested_size);
 
 #define ggc_internal_alloc(s) ggc_internal_alloc_stat (s MEM_STAT_INFO)
 
 /* Allocate an object of the specified type and size.  */
-extern void *ggc_alloc_typed_stat (enum gt_types_enum, size_t MEM_STAT_DECL);
+extern void *ggc_alloc_typed_stat (enum gt_types_enum, size_t MEM_STAT_DECL)
+  ATTRIBUTE_MALLOC;
 
 #define ggc_alloc_typed(s, z) ggc_alloc_typed_stat (s, z MEM_STAT_INFO)
 
 /* Allocates cleared memory.  */
-extern void *ggc_internal_cleared_alloc_stat (size_t MEM_STAT_DECL);
+extern void *ggc_internal_cleared_alloc_stat (size_t MEM_STAT_DECL)
+  ATTRIBUTE_MALLOC;
 
 /* Resize a block.  */
 extern void *ggc_realloc_stat (void *, size_t MEM_STAT_DECL);
 #define ggc_alloc_cleared_atomic(S)             \
     (ggc_internal_cleared_alloc_stat ((S) MEM_STAT_INFO))
 
-extern void * ggc_cleared_alloc_htab_ignore_args (size_t, size_t);
+extern void *ggc_cleared_alloc_htab_ignore_args (size_t, size_t)
+  ATTRIBUTE_MALLOC;
 
-extern void * ggc_cleared_alloc_ptr_array_two_args (size_t, size_t);
+extern void *ggc_cleared_alloc_ptr_array_two_args (size_t, size_t)
+  ATTRIBUTE_MALLOC;
 
 #define htab_create_ggc(SIZE, HASH, EQ, DEL) \
   htab_create_typed_alloc (SIZE, HASH, EQ, DEL,        \
   splay_tree_new_typed_alloc (COMPARE, NULL, NULL, &ALLOC_TREE, &ALLOC_NODE, \
                              &ggc_splay_dont_free, NULL)
 
-extern void *ggc_splay_alloc (enum gt_types_enum, int, void *);
+extern void *ggc_splay_alloc (enum gt_types_enum, int, void *)
+  ATTRIBUTE_MALLOC;
 
 extern void ggc_splay_dont_free (void *, void *);
 
 
 /* Allocate an object into the specified allocation zone.  */
 extern void *ggc_internal_alloc_zone_stat (size_t,
-                                         struct alloc_zone * MEM_STAT_DECL);
+                                         struct alloc_zone * MEM_STAT_DECL)
+  ATTRIBUTE_MALLOC;
 
 extern void *ggc_internal_cleared_alloc_zone_stat (size_t,
-                                         struct alloc_zone * MEM_STAT_DECL);
+                                         struct alloc_zone * MEM_STAT_DECL)
+  ATTRIBUTE_MALLOC;
 
 static inline void *
 ggc_internal_zone_alloc_stat (struct alloc_zone * z, size_t s MEM_STAT_DECL)