Patchwork [v4] Re: avoid useless if-before-free tests

login
register
mail settings
Submitter Jim Meyering
Date April 18, 2011, 7:55 p.m.
Message ID <87hb9v49mm.fsf_-_@rho.meyering.net>
Download mbox | patch
Permalink /patch/91838/
State New
Headers show

Comments

Jim Meyering - April 18, 2011, 7:55 p.m.
Since v3, I've rebased these and moved the fortran changes to precede
these (changing gfc_free to free introduced a few more instances
that this transformation deals with).  As mentioned before, the
conditional-removing transformation was done mechanically with
two manual corrections.  One to deal with a following "else",
and another to restore a conditional that should not have been
removed.

A final(?) bootstrap and "make check" is running now.

From d64b103b57c3785bb66a8c456ef4c0ec992f4852 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@redhat.com>
Date: Mon, 3 Jan 2011 16:52:37 +0100
Subject: [PATCH 1/2] discourage unnecessary use of if before free

* README.Portability: Explain why "if (P) free (P)" is best avoided.
---
 gcc/README.Portability |   27 ++++++++++++++++++++-------
 1 files changed, 20 insertions(+), 7 deletions(-)
Tom Tromey - April 18, 2011, 8:15 p.m.
>>>>> "Jim" == Jim Meyering <jim@meyering.net> writes:

Jim> Since v3, I've rebased these and moved the fortran changes to precede
Jim> these (changing gfc_free to free introduced a few more instances
Jim> that this transformation deals with).  As mentioned before, the
Jim> conditional-removing transformation was done mechanically with
Jim> two manual corrections.  One to deal with a following "else",
Jim> and another to restore a conditional that should not have been
Jim> removed.

I'm not sure if this needs a review (I forgot what happened on the last
thread) but for avoidance of doubt, the java bits are ok.

Tom
Jim Meyering - April 18, 2011, 8:37 p.m.
Tom Tromey wrote:
>>>>>> "Jim" == Jim Meyering <jim@meyering.net> writes:
>
> Jim> Since v3, I've rebased these and moved the fortran changes to precede
> Jim> these (changing gfc_free to free introduced a few more instances
> Jim> that this transformation deals with).  As mentioned before, the
> Jim> conditional-removing transformation was done mechanically with
> Jim> two manual corrections.  One to deal with a following "else",
> Jim> and another to restore a conditional that should not have been
> Jim> removed.
>
> I'm not sure if this needs a review (I forgot what happened on the last
> thread) but for avoidance of doubt, the java bits are ok.

Thanks.  I wasn't sure either.
I'll presume it's ok and commit tomorrow if no one says otherwise,
since some people actually did review (and spot the invalid
transformation that I've since corrected).

Patch

diff --git a/gcc/README.Portability b/gcc/README.Portability
index 32a33e2..4101a2f 100644
--- a/gcc/README.Portability
+++ b/gcc/README.Portability
@@ -51,14 +51,28 @@  foo (bar, )
 needs to be coded in some other way.


-free and realloc
-----------------
+Avoid unnecessary test before free
+----------------------------------

-Some implementations crash upon attempts to free or realloc the null
-pointer.  Thus if mem might be null, you need to write
+Since SunOS 4 stopped being a reasonable portability target,
+(which happened around 2007) there has been no need to guard
+against "free (NULL)".  Thus, any guard like the following
+constitutes a redundant test:
+
+  if (P)
+    free (P);
+
+It is better to avoid the test.[*]
+Instead, simply free P, regardless of whether it is NULL.
+
+[*] However, if your profiling exposes a test like this in a
+performance-critical loop, say where P is nearly always NULL, and
+the cost of calling free on a NULL pointer would be prohibitively
+high, consider using __builtin_expect, e.g., like this:
+
+  if (__builtin_expect (ptr != NULL, 0))
+    free (ptr);

-  if (mem)
-    free (mem);


 Trigraphs
@@ -194,4 +208,3 @@  o Passing incorrect types to fprintf and friends.

 o Adding a function declaration for a module declared in another file to
   a .c file instead of to a .h file.
-
-- 
1.7.5.rc2.295.g19c42


From b4e18263cfa1e7ec717792da6e75c5fa179bd6d7 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@redhat.com>
Date: Fri, 15 Apr 2011 20:47:40 +0200
Subject: [PATCH 2/2] remove useless if-before-free tests

Change "if (E) free (E);" to "free (E);" everywhere except in the
libgo/, intl/, zlib/ and classpath/ directories.
Also transform equivalent variants like
"if (E != NULL) free (E);" and allow an extra cast on the
argument to free.  Otherwise, the tested and freed "E"
expressions must be identical, modulo white space.
---
 gcc/ChangeLog                       |   39 +++++++++++++++++
 gcc/ada/ChangeLog                   |    4 ++
 gcc/ada/initialize.c                |    3 +-
 gcc/c-family/ChangeLog              |    7 +++-
 gcc/c-family/c-format.c             |    6 +--
 gcc/calls.c                         |   15 ++----
 gcc/cfgcleanup.c                    |    3 +-
 gcc/collect2.c                      |    3 +-
 gcc/config/i386/i386.c              |    3 +-
 gcc/config/mcore/mcore.c            |    3 +-
 gcc/coverage.c                      |    3 +-
 gcc/cp/ChangeLog                    |    4 ++
 gcc/cp/tree.c                       |    3 +-
 gcc/cse.c                           |    6 +--
 gcc/cselib.c                        |    3 +-
 gcc/df-core.c                       |   15 ++----
 gcc/fortran/ChangeLog               |    7 +++
 gcc/fortran/expr.c                  |    3 +-
 gcc/fortran/gfortranspec.c          |    5 +-
 gcc/fortran/interface.c             |    3 +-
 gcc/fortran/trans-openmp.c          |    3 +-
 gcc/function.c                      |    3 +-
 gcc/gcc.c                           |   15 ++----
 gcc/gcov.c                          |    6 +--
 gcc/gensupport.c                    |   12 ++----
 gcc/graphite-clast-to-gimple.c      |    3 +-
 gcc/graphite-sese-to-poly.c         |    3 +-
 gcc/haifa-sched.c                   |    3 +-
 gcc/ipa-prop.c                      |    3 +-
 gcc/ipa-pure-const.c                |    3 +-
 gcc/ipa-reference.c                 |    3 +-
 gcc/ira-costs.c                     |   12 ++----
 gcc/ira.c                           |   18 +++-----
 gcc/java/ChangeLog                  |    6 ++-
 gcc/java/jcf-parse.c                |    3 +-
 gcc/matrix-reorg.c                  |    9 +---
 gcc/prefix.c                        |    3 +-
 gcc/profile.c                       |    3 +-
 gcc/reload1.c                       |    6 +--
 gcc/sched-deps.c                    |    3 +-
 gcc/sel-sched-ir.c                  |    3 +-
 gcc/sese.c                          |    6 +--
 gcc/tree-data-ref.c                 |    6 +--
 gcc/tree-eh.c                       |    3 +-
 gcc/tree-ssa-coalesce.c             |    3 +-
 gcc/tree-ssa-live.c                 |    6 +--
 gcc/tree-ssa-loop-ivopts.c          |    6 +--
 gcc/tree-ssa-pre.c                  |    3 +-
 libcpp/ChangeLog                    |    7 +++
 libcpp/files.c                      |    3 +-
 libcpp/init.c                       |    3 +-
 libcpp/macro.c                      |    3 +-
 libcpp/pch.c                        |    9 +---
 libdecnumber/ChangeLog              |    9 ++++
 libdecnumber/decNumber.c            |   80 +++++++++++++++++-----------------
 libgfortran/ChangeLog               |   10 ++++
 libgfortran/intrinsics/move_alloc.c |    3 +-
 libgfortran/io/fbuf.c               |    3 +-
 libgfortran/io/format.c             |    3 +-
 libgfortran/io/open.c               |    3 +-
 libgfortran/io/unit.c               |    9 +---
 libgfortran/io/unix.c               |    3 +-
 libiberty/ChangeLog                 |   13 ++++++
 libiberty/cp-demint.c               |    6 +--
 libiberty/cplus-dem.c               |    3 +-
 libiberty/pex-common.c              |    9 +---
 libiberty/pex-msdos.c               |    6 +--
 libiberty/pex-win32.c               |   24 ++++-------
 libiberty/regex.c                   |   11 ++---
 libiberty/spaces.c                  |    5 +--
 libstdc++-v3/ChangeLog              |    5 ++
 libstdc++-v3/libsupc++/del_opnt.cc  |    3 +-
 lto-plugin/ChangeLog                |    4 ++
 lto-plugin/lto-plugin.c             |    6 +--
 74 files changed, 267 insertions(+), 270 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 718056a..d6c1c07 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,42 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	Remove useless if-before-free tests.
+	* calls.c (expand_call, save_area): Likewise.
+	* cfgcleanup.c (try_forward_edges): Likewise.
+	* collect2.c (collect_execute): Likewise.
+	* config/i386/i386.c (ix86_valid_target_attribute_tree): Likewise.
+	* config/mcore/mcore.c (mcore_expand_prolog): Likewise.
+	* coverage.c (coverage_checksum_string): Likewise.
+	* cse.c (init_cse_reg_info, delete_trivially_dead_insns): Likewise.
+	* cselib.c (cselib_init): Likewise.
+	* df-core.c (rest_of_handle_df_finish, df_analyze): Likewise.
+	(df_set_clean_cfg): Likewise.
+	* function.c (free_after_compilation): Likewise.
+	* gcc.c (do_spec_1, main): Likewise.
+	* gcov.c (create_file_names): Likewise.
+	* gensupport.c (identify_predicable_attribute): Likewise.
+	* graphite-clast-to-gimple.c (save_clast_name_index): Likewise.
+	* graphite-sese-to-poly.c (free_data_refs_aux): Likewise.
+	* haifa-sched.c (haifa_finish_h_i_d): Likewise.
+	* ipa-prop.c (ipa_free_node_params_substructures): Likewise.
+	* ipa-pure-const.c (local_pure_const): Likewise.
+	* ipa-reference.c (propagate): Likewise.
+	* ira-costs.c (free_ira_costs): Likewise.
+	* ira.c (free_register_move_costs, build_insn_chain): Likewise.
+	* matrix-reorg.c (mat_free): Likewise.
+	* prefix.c (get_key_value): Likewise.
+	* profile.c (compute_value_histograms): Likewise.
+	* reload1.c (free_reg_equiv): Likewise.
+	* sched-deps.c (free_deps): Likewise.
+	* sel-sched-ir.c (fence_clear): Likewise.
+	* sese.c (set_rename, if_region_set_false_region): Likewise.
+	* tree-data-ref.c (free_rdg): Likewise.
+	* tree-eh.c (lower_try_finally): Likewise.
+	* tree-ssa-coalesce.c (delete_coalesce_list): Likewise.
+	* tree-ssa-live.c (delete_var_map): Likewise.
+	* tree-ssa-loop-ivopts.c (free_loop_data): Likewise.
+	* tree-ssa-pre.c (phi_trans_add): Likewise.
+
 2011-04-18  Jan Hubicka  <jh@suse.cz>

 	* ipa-inline.c (inline_small_functions): Fix pasto in previous patch.
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index a738316..8f6a8e8 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,7 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* initialize.c (__gnat_initialize): Remove useless if-before-free.
+
 2011-04-17  Eric Botcazou  <ebotcazou@adacore.com>

 	* gcc-interface/Make-lang.in (gnatbind): Replace $(ALL_CFLAGS) with
diff --git a/gcc/ada/initialize.c b/gcc/ada/initialize.c
index 32ea0e5..e2ad904 100644
--- a/gcc/ada/initialize.c
+++ b/gcc/ada/initialize.c
@@ -217,8 +217,7 @@  __gnat_initialize (void *eh ATTRIBUTE_UNUSED)

 		     FindClose (hDir);

-		     if (dir != NULL)
-		       free (dir);
+		     free (dir);
 		   }
 	       }
 	     else
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index f8f0b4b..61da788 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* c-format.c (init_dollar_format_checking): Remove useless
+	if-before-free.
+
 2011-04-15  Nicola Pero  <nicola.pero@meta-innovation.com>

 	* c-objc.h (objc_get_interface_ivars): Removed.
@@ -1105,7 +1110,7 @@ 
 	* c-common.c: Include gt-c-family-c-common.h.
 	* c-pragma.c: Include gt-c-family-c-pragma.h.
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2010, 2011 Free Software Foundation, Inc.

 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
index 801e434..0c5115a 100644
--- a/gcc/c-family/c-format.c
+++ b/gcc/c-family/c-format.c
@@ -1107,10 +1107,8 @@  init_dollar_format_checking (int first_arg_num, tree params)
     }
   if (dollar_arguments_alloc < dollar_arguments_count)
     {
-      if (dollar_arguments_used)
-	free (dollar_arguments_used);
-      if (dollar_arguments_pointer_p)
-	free (dollar_arguments_pointer_p);
+      free (dollar_arguments_used);
+      free (dollar_arguments_pointer_p);
       dollar_arguments_alloc = dollar_arguments_count;
       dollar_arguments_used = XNEWVEC (char, dollar_arguments_alloc);
       dollar_arguments_pointer_p = XNEWVEC (char, dollar_arguments_alloc);
diff --git a/gcc/calls.c b/gcc/calls.c
index 2e79777..bb95852 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2555,8 +2555,7 @@  expand_call (tree exp, rtx target, int ignore)
 		  highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use,
 						     needed);
 #endif
-		  if (stack_usage_map_buf)
-		    free (stack_usage_map_buf);
+		  free (stack_usage_map_buf);
 		  stack_usage_map_buf = XNEWVEC (char, highest_outgoing_arg_in_use);
 		  stack_usage_map = stack_usage_map_buf;

@@ -2661,8 +2660,7 @@  expand_call (tree exp, rtx target, int ignore)
 		    = stack_arg_under_construction;
 		  stack_arg_under_construction = 0;
 		  /* Make a new map for the new argument list.  */
-		  if (stack_usage_map_buf)
-		    free (stack_usage_map_buf);
+		  free (stack_usage_map_buf);
 		  stack_usage_map_buf = XCNEWVEC (char, highest_outgoing_arg_in_use);
 		  stack_usage_map = stack_usage_map_buf;
 		  highest_outgoing_arg_in_use = 0;
@@ -3152,8 +3150,7 @@  expand_call (tree exp, rtx target, int ignore)

       /* Free up storage we no longer need.  */
       for (i = 0; i < num_actuals; ++i)
-	if (args[i].aligned_regs)
-	  free (args[i].aligned_regs);
+	free (args[i].aligned_regs);

       insns = get_insns ();
       end_sequence ();
@@ -3208,8 +3205,7 @@  expand_call (tree exp, rtx target, int ignore)

   currently_expanding_call--;

-  if (stack_usage_map_buf)
-    free (stack_usage_map_buf);
+  free (stack_usage_map_buf);

   return target;
 }
@@ -3966,8 +3962,7 @@  emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
       stack_usage_map = initial_stack_usage_map;
     }

-  if (stack_usage_map_buf)
-    free (stack_usage_map_buf);
+  free (stack_usage_map_buf);

   return value;

diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 98c51ad..179cd00 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -646,8 +646,7 @@  try_forward_edges (int mode, basic_block b)
       ei_next (&ei);
     }

-  if (threaded_edges)
-    free (threaded_edges);
+  free (threaded_edges);
   return changed;
 }
 
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 373483b..0c554f0 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -2087,8 +2087,7 @@  collect_execute (const char *prog, char **argv, const char *outname,
 	fatal (errmsg);
     }

-  if (response_arg)
-    free (response_arg);
+  free (response_arg);

   return pex;
 }
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b6d41f0..80cb104 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4783,8 +4783,7 @@  ix86_valid_target_attribute_tree (tree args)

       /* Free up memory allocated to hold the strings */
       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
-	if (option_strings[i])
-	  free (option_strings[i]);
+	free (option_strings[i]);
     }

   return t;
diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c
index 093ac2f..741452e 100644
--- a/gcc/config/mcore/mcore.c
+++ b/gcc/config/mcore/mcore.c
@@ -1980,8 +1980,7 @@  mcore_expand_prolog (void)
       
       gcc_assert (GET_CODE (x) == SYMBOL_REF);
       
-      if (mcore_current_function_name)
-	free (mcore_current_function_name);
+      free (mcore_current_function_name);
       
       mcore_current_function_name = xstrdup (XSTR (x, 0));
       
diff --git a/gcc/coverage.c b/gcc/coverage.c
index 79d20ab..58b7c69 100644
--- a/gcc/coverage.c
+++ b/gcc/coverage.c
@@ -522,8 +522,7 @@  coverage_checksum_string (unsigned chksum, const char *string)
     }

   chksum = crc32_string (chksum, string);
-  if (dup)
-    free (dup);
+  free (dup);

   return chksum;
 }
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1037348..1aae32f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@ 
+2011-04-18  Jim Meyering  <meyering@redhat.com>
+
+	* tree.c (cxx_printable_name_internal): Remove useless if-before-free.
+
 2011-04-17  Jan Hubicka  <jh@suse.cz>

 	* semantics.c (finish_goto_stmt): Do set UNINLINABLE flag on computed
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 25f2c32..23daa6c 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1509,8 +1509,7 @@  cxx_printable_name_internal (tree decl, int v, bool translate)
       gcc_assert (uid_ring[ring_counter] != DECL_UID (current_function_decl));
     }

-  if (print_ring[ring_counter])
-    free (print_ring[ring_counter]);
+  free (print_ring[ring_counter]);

   print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v, translate));
   uid_ring[ring_counter] = DECL_UID (decl);
diff --git a/gcc/cse.c b/gcc/cse.c
index f7b477c..d83b38a 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -796,8 +796,7 @@  init_cse_reg_info (unsigned int nregs)
 	}

       /* Reallocate the table with NEW_SIZE entries.  */
-      if (cse_reg_info_table)
-	free (cse_reg_info_table);
+      free (cse_reg_info_table);
       cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
       cse_reg_info_table_size = new_size;
       cse_reg_info_table_first_uninitialized = 0;
@@ -6975,8 +6974,7 @@  delete_trivially_dead_insns (rtx insns, int nreg)
 		df_insn_rescan (insn);
 	      }
 	  }
-      if (replacements)
-	free (replacements);
+      free (replacements);
     }

   if (dump_file && ndead)
diff --git a/gcc/cselib.c b/gcc/cselib.c
index dff0967..56e6d17 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -2462,8 +2462,7 @@  cselib_init (int record_what)
   if (!reg_values || reg_values_size < cselib_nregs
       || (reg_values_size > 10 && reg_values_size > cselib_nregs * 4))
     {
-      if (reg_values)
-	free (reg_values);
+      free (reg_values);
       /* Some space for newly emit instructions so we don't end up
 	 reallocating in between passes.  */
       reg_values_size = cselib_nregs + (63 + cselib_nregs) / 16;
diff --git a/gcc/df-core.c b/gcc/df-core.c
index 98c2088..9f3ea42 100644
--- a/gcc/df-core.c
+++ b/gcc/df-core.c
@@ -811,10 +811,8 @@  rest_of_handle_df_finish (void)
       dflow->problem->free_fun ();
     }

-  if (df->postorder)
-    free (df->postorder);
-  if (df->postorder_inverted)
-    free (df->postorder_inverted);
+  free (df->postorder);
+  free (df->postorder_inverted);
   free (df->hard_regs_live_count);
   free (df);
   df = NULL;
@@ -1183,10 +1181,8 @@  df_analyze (void)
   bool everything;
   int i;

-  if (df->postorder)
-    free (df->postorder);
-  if (df->postorder_inverted)
-    free (df->postorder_inverted);
+  free (df->postorder);
+  free (df->postorder_inverted);
   df->postorder = XNEWVEC (int, last_basic_block);
   df->postorder_inverted = XNEWVEC (int, last_basic_block);
   df->n_blocks = post_order_compute (df->postorder, true, true);
@@ -1725,8 +1721,7 @@  df_check_cfg_clean (void)
 static void
 df_set_clean_cfg (void)
 {
-  if (saved_cfg)
-    free (saved_cfg);
+  free (saved_cfg);
   saved_cfg = df_compute_cfg_image ();
 }

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f6e7d47..4ac8a6c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@ 
 2011-04-18  Jim Meyering  <meyering@redhat.com>

+	* expr.c (free_expr0): Remove useless if-before-free.
+	* gfortranspec.c (lang_specific_pre_link): Likewise.
+	* interface.c (gfc_extend_expr): Likewise.
+	* trans-openmp.c (gfc_trans_omp_array_reduction): Likewise.
+
+2011-04-18  Jim Meyering  <meyering@redhat.com>
+
 	remove now-unused definition of gfc_free
 	* misc.c (gfc_free): Remove function.
 	* gfortran.h (gfc_free): Remove its prototype.
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 1e31653..4973112 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -433,8 +433,7 @@  free_expr0 (gfc_expr *e)
 	}

       /* Free the representation.  */
-      if (e->representation.string)
-	free (e->representation.string);
+      free (e->representation.string);

       break;

diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c
index 2d732fd..4d939a0 100644
--- a/gcc/fortran/gfortranspec.c
+++ b/gcc/fortran/gfortranspec.c
@@ -472,9 +472,8 @@  For more information about these matters, see the file named COPYING\n\n"));
 int
 lang_specific_pre_link (void)
 {
-  if (spec_file)
-    free (spec_file);
-  else if (library)
+  free (spec_file);
+  if (spec_file == NULL && library)
     do_spec ("%:include(libgfortran.spec)");

   return 0;
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 872d489..5e7a1dc 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -3141,8 +3141,7 @@  gfc_extend_expr (gfc_expr *e, bool *real_error)
 	}

       /* Don't use gfc_free_actual_arglist().  */
-      if (actual->next != NULL)
-	free (actual->next);
+      free (actual->next);
       free (actual);

       return FAILURE;
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index d709fdf..625daeb 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -714,8 +714,7 @@  gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
   free (symtree1);
   free (symtree2);
   free (symtree3);
-  if (symtree4)
-    free (symtree4);
+  free (symtree4);
   gfc_free_array_spec (outer_sym.as);
 }

diff --git a/gcc/function.c b/gcc/function.c
index c14a339..d7d56dd 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -211,8 +211,7 @@  free_after_compilation (struct function *f)
   prologue_insn_hash = NULL;
   epilogue_insn_hash = NULL;

-  if (crtl->emit.regno_pointer_align)
-    free (crtl->emit.regno_pointer_align);
+  free (crtl->emit.regno_pointer_align);

   memset (crtl, 0, sizeof (struct rtl_data));
   f->eh = NULL;
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 7ad959a..f9a2bb2 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4806,8 +4806,7 @@  do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
 		    t->filename_length = temp_filename_length;
 		  }

-		if (saved_suffix)
-		  free (saved_suffix);
+		free (saved_suffix);

 		obstack_grow (&obstack, t->filename, t->filename_length);
 		delete_this_arg = 1;
@@ -6724,12 +6723,10 @@  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
 	    {
 	      if (compare_debug)
 		{
-		  if (debug_check_temp_file[0])
-		    free (debug_check_temp_file[0]);
+		  free (debug_check_temp_file[0]);
 		  debug_check_temp_file[0] = NULL;

-		  if (debug_check_temp_file[1])
-		    free (debug_check_temp_file[1]);
+		  free (debug_check_temp_file[1]);
 		  debug_check_temp_file[1] = NULL;
 		}

@@ -6773,12 +6770,10 @@  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"

 	      if (compare_debug)
 		{
-		  if (debug_check_temp_file[0])
-		    free (debug_check_temp_file[0]);
+		  free (debug_check_temp_file[0]);
 		  debug_check_temp_file[0] = NULL;

-		  if (debug_check_temp_file[1])
-		    free (debug_check_temp_file[1]);
+		  free (debug_check_temp_file[1]);
 		  debug_check_temp_file[1] = NULL;
 		}
 	    }
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 56fff3a..bb27913 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -661,10 +661,8 @@  create_file_names (const char *file_name)
   int base;

   /* Free previous file names.  */
-  if (bbg_file_name)
-    free (bbg_file_name);
-  if (da_file_name)
-    free (da_file_name);
+  free (bbg_file_name);
+  free (da_file_name);
   da_file_name = bbg_file_name = NULL;
   bbg_file_time = 0;
   bbg_stamp = 0;
diff --git a/gcc/gensupport.c b/gcc/gensupport.c
index d2c2f71..682d2ac 100644
--- a/gcc/gensupport.c
+++ b/gcc/gensupport.c
@@ -594,8 +594,7 @@  identify_predicable_attribute (void)
   if (p_true == NULL || strchr (++p_true, ',') != NULL)
     {
       error_with_line (elem->lineno, "attribute `predicable' is not a boolean");
-      if (p_false)
-        free (p_false);
+      free (p_false);
       return;
     }
   p_true[-1] = '\0';
@@ -611,15 +610,13 @@  identify_predicable_attribute (void)

     case CONST:
       error_with_line (elem->lineno, "attribute `predicable' cannot be const");
-      if (p_false)
-	free (p_false);
+      free (p_false);
       return;

     default:
       error_with_line (elem->lineno,
 		       "attribute `predicable' must have a constant default");
-      if (p_false)
-	free (p_false);
+      free (p_false);
       return;
     }

@@ -631,8 +628,7 @@  identify_predicable_attribute (void)
     {
       error_with_line (elem->lineno,
 		       "unknown value `%s' for `predicable' attribute", value);
-      if (p_false)
-	free (p_false);
+      free (p_false);
     }
 }

diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index 41356dc..c8356d3 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -114,8 +114,7 @@  save_clast_name_index (htab_t index_table, const char *name, int index)

   if (slot)
     {
-      if (*slot)
-	free (*slot);
+      free (*slot);

       *slot = new_clast_name_index (name, index);
     }
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 064ded3..7474be0 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -190,8 +190,7 @@  free_data_refs_aux (VEC (data_reference_p, heap) *datarefs)
       {
 	base_alias_pair *bap = (base_alias_pair *)(dr->aux);

-	if (bap->alias_set)
-	  free (bap->alias_set);
+	free (bap->alias_set);

 	free (bap);
 	dr->aux = NULL;
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index e2d389b..d67aee8 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -5582,8 +5582,7 @@  haifa_finish_h_i_d (void)

   FOR_EACH_VEC_ELT (haifa_insn_data_def, h_i_d, i, data)
     {
-      if (data->reg_pressure != NULL)
-	free (data->reg_pressure);
+      free (data->reg_pressure);
       for (use = data->reg_use_list; use != NULL; use = next)
 	{
 	  next = use->next_insn_use;
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index be223cc..7ba9fcb 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -1884,8 +1884,7 @@  ipa_free_all_edge_args (void)
 void
 ipa_free_node_params_substructures (struct ipa_node_params *info)
 {
-  if (info->params)
-    free (info->params);
+  free (info->params);

   memset (info, 0, sizeof (*info));
 }
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index eb5b0f6..67022c4 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -1662,8 +1662,7 @@  local_pure_const (void)
 		 lang_hooks.decl_printable_name (current_function_decl,
 						 2));
     }
-  if (l)
-    free (l);
+  free (l);
   if (changed)
     return execute_fixup_cfg ();
   else
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index f874a2e..40fa6bc 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -913,8 +913,7 @@  propagate (void)
 				  node_g->statics_written);
 	    }
 	}
-      if (node_info)
-	free (node_info);
+      free (node_info);
       if (node->aux)
 	{
 	  free (node->aux);
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 3b113b6..de894a2 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -1968,19 +1968,15 @@  free_ira_costs (void)
 {
   int i;

-  if (init_cost != NULL)
-    free (init_cost);
+  free (init_cost);
   init_cost = NULL;
   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
     {
-      if (op_costs[i] != NULL)
-	free (op_costs[i]);
-      if (this_op_costs[i] != NULL)
-	free (this_op_costs[i]);
+      free (op_costs[i]);
+      free (this_op_costs[i]);
       op_costs[i] = this_op_costs[i] = NULL;
     }
-  if (temp_costs != NULL)
-    free (temp_costs);
+  free (temp_costs);
   temp_costs = NULL;
 }

diff --git a/gcc/ira.c b/gcc/ira.c
index 054f4ca..49f3e76 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1556,16 +1556,11 @@  free_register_move_costs (void)

   for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
     {
-      if (ira_max_register_move_cost[mode] != NULL)
-	free (ira_max_register_move_cost[mode]);
-      if (ira_may_move_in_cost[mode] != NULL)
-	free (ira_may_move_in_cost[mode]);
-      if (ira_may_move_out_cost[mode] != NULL)
-	free (ira_may_move_out_cost[mode]);
-      if (ira_max_may_move_in_cost[mode] != NULL)
-	free (ira_max_may_move_in_cost[mode]);
-      if (ira_max_may_move_out_cost[mode] != NULL)
-	free (ira_max_may_move_out_cost[mode]);
+      free (ira_max_register_move_cost[mode]);
+      free (ira_may_move_in_cost[mode]);
+      free (ira_may_move_out_cost[mode]);
+      free (ira_max_may_move_in_cost[mode]);
+      free (ira_max_may_move_out_cost[mode]);
       ira_register_move_cost[mode] = NULL;
       ira_max_register_move_cost[mode] = NULL;
       ira_may_move_in_cost[mode] = NULL;
@@ -3461,8 +3456,7 @@  build_insn_chain (void)
     }

   for (i = 0; i < (unsigned int) max_regno; i++)
-    if (live_subregs[i])
-      free (live_subregs[i]);
+    free (live_subregs[i]);

   reload_insn_chain = c;
   *p = NULL;
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index a96b507..3d4854d 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,7 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* jcf-parse.c (java_parse_file): Remove useless if-before-free.
+
 2011-04-14  Nathan Froyd  <froydnj@codesourcery.com>

 	* decl.c (poplevel): Use BLOCK_CHAIN and block_chainon.
@@ -22467,7 +22471,7 @@  Tue Mar  9 11:52:08 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

 
 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+2006, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.

 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index feeddad..eb3f02b 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -1843,8 +1843,7 @@  java_parse_file (void)
       list = next;
     }

-  if (file_list != NULL)
-    free (file_list);
+  free (file_list);

   if (filename_count == 0)
     warning (0, "no input file specified");
diff --git a/gcc/matrix-reorg.c b/gcc/matrix-reorg.c
index 44daa27..6f75d33 100644
--- a/gcc/matrix-reorg.c
+++ b/gcc/matrix-reorg.c
@@ -529,12 +529,9 @@  mat_free (void *e)
   if (!mat)
     return;

-  if (mat->free_stmts)
-    free (mat->free_stmts);
-  if (mat->dim_hot_level)
-    free (mat->dim_hot_level);
-  if (mat->malloc_for_level)
-    free (mat->malloc_for_level);
+  free (mat->free_stmts);
+  free (mat->dim_hot_level);
+  free (mat->malloc_for_level);
 }

 /* Find all potential matrices.
diff --git a/gcc/prefix.c b/gcc/prefix.c
index 67ebdd9..90261ae 100644
--- a/gcc/prefix.c
+++ b/gcc/prefix.c
@@ -103,8 +103,7 @@  get_key_value (char *key)
   if (prefix == 0)
     prefix = std_prefix;

-  if (temp)
-    free (temp);
+  free (temp);

   return prefix;
 }
diff --git a/gcc/profile.c b/gcc/profile.c
index fd37748..e40bfec 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -828,8 +828,7 @@  compute_value_histograms (histogram_values values)
     }

   for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
-    if (histogram_counts[t])
-      free (histogram_counts[t]);
+    free (histogram_counts[t]);
 }

 /* The entry basic block will be moved around so that it has index=1,
diff --git a/gcc/reload1.c b/gcc/reload1.c
index b4f3aec..736da51 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4213,10 +4213,8 @@  free_reg_equiv (void)
   int i;


-  if (offsets_known_at)
-    free (offsets_known_at);
-  if (offsets_at)
-    free (offsets_at);
+  free (offsets_known_at);
+  free (offsets_at);
   offsets_at = 0;
   offsets_known_at = 0;

diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 6abef8b..09bf65d 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -3547,8 +3547,7 @@  free_deps (struct deps_desc *deps)

   /* As we initialize reg_last lazily, it is possible that we didn't allocate
      it at all.  */
-  if (deps->reg_last)
-    free (deps->reg_last);
+  free (deps->reg_last);
   deps->reg_last = NULL;

   deps = NULL;
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index a6daa58..a12617c 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -581,8 +581,7 @@  fence_clear (fence_t f)
   gcc_assert ((s != NULL && dc != NULL && tc != NULL)
 	      || (s == NULL && dc == NULL && tc == NULL));

-  if (s != NULL)
-    free (s);
+  free (s);

   if (dc != NULL)
     delete_deps_context (dc);
diff --git a/gcc/sese.c b/gcc/sese.c
index bfb0276..3ce83b9 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -449,8 +449,7 @@  set_rename (htab_t rename_map, tree old_name, tree expr)
   if (!slot)
     return;

-  if (*slot)
-    free (*slot);
+  free (*slot);

   *slot = new_rename_map_elt (old_name, expr);
 }
@@ -676,8 +675,7 @@  if_region_set_false_region (ifsese if_region, sese region)

   SESE_EXIT (region) = false_edge;

-  if (if_region->false_region)
-    free (if_region->false_region);
+  free (if_region->false_region);
   if_region->false_region = region;

   if (slot)
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index e01c677..0460605 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -5127,11 +5127,9 @@  free_rdg (struct graph *rdg)
       struct graph_edge *e;

       for (e = v->succ; e; e = e->succ_next)
-	if (e->data)
-	  free (e->data);
+	free (e->data);

-      if (v->data)
-	free (v->data);
+      free (v->data);
     }

   htab_delete (rdg->indices);
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index f189b9b..948a796 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -1617,8 +1617,7 @@  lower_try_finally (struct leh_state *state, gimple tp)
     }

   VEC_free (tree, heap, this_tf.dest_array);
-  if (this_tf.goto_queue)
-    free (this_tf.goto_queue);
+  free (this_tf.goto_queue);
   if (this_tf.goto_queue_map)
     pointer_map_destroy (this_tf.goto_queue_map);

diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c
index e7490e6..2dfe37e 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -242,8 +242,7 @@  delete_coalesce_list (coalesce_list_p cl)
 {
   gcc_assert (cl->cost_one_list == NULL);
   htab_delete (cl->list);
-  if (cl->sorted)
-    free (cl->sorted);
+  free (cl->sorted);
   gcc_assert (cl->num_sorted == 0);
   free (cl);
 }
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index c99d987..4216b22 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -157,10 +157,8 @@  delete_var_map (var_map map)
 {
   var_map_base_fini (map);
   partition_delete (map->var_partition);
-  if (map->partition_to_view)
-    free (map->partition_to_view);
-  if (map->view_to_partition)
-    free (map->view_to_partition);
+  free (map->partition_to_view);
+  free (map->view_to_partition);
   free (map);
 }

diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 0aa21e0..b00b8d4 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -6254,8 +6254,7 @@  free_loop_data (struct ivopts_data *data)
       struct version_info *info;

       info = ver_info (data, i);
-      if (info->iv)
-	free (info->iv);
+      free (info->iv);
       info->iv = NULL;
       info->has_nonlin_use = false;
       info->preserve_biv = false;
@@ -6282,8 +6281,7 @@  free_loop_data (struct ivopts_data *data)
     {
       struct iv_cand *cand = iv_cand (data, i);

-      if (cand->iv)
-	free (cand->iv);
+      free (cand->iv);
       if (cand->depends_on)
 	BITMAP_FREE (cand->depends_on);
       free (cand);
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index df2a138..0015b72 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -580,8 +580,7 @@  phi_trans_add (pre_expr e, pre_expr v, basic_block pred)

   slot = htab_find_slot_with_hash (phi_translate_table, new_pair,
 				   new_pair->hashcode, INSERT);
-  if (*slot)
-    free (*slot);
+  free (*slot);
   *slot = (void *) new_pair;
 }

diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index cfd07d4..2b338f5 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* files.c (destroy_cpp_file): Remove useless if-before-free.
+	* init.c (cpp_destroy): Likewise.
+	* macro.c (replace_args): Likewise.
+	* pch.c (cpp_valid_state): Likewise.
+
 2011-03-25  Kai Tietz  <ktietz@redhat.com>

 	* files.c (file_hash_eq): Use filename_cmp
diff --git a/libcpp/files.c b/libcpp/files.c
index e3cff49..cd0bc48 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -996,8 +996,7 @@  make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
 static void
 destroy_cpp_file (_cpp_file *file)
 {
-  if (file->buffer_start)
-    free ((void *) file->buffer_start);
+  free ((void *) file->buffer_start);
   free ((void *) file->name);
   free (file);
 }
diff --git a/libcpp/init.c b/libcpp/init.c
index 5c6dacf..5ba6666 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -259,8 +259,7 @@  cpp_destroy (cpp_reader *pfile)
   while (CPP_BUFFER (pfile) != NULL)
     _cpp_pop_buffer (pfile);

-  if (pfile->out.base)
-    free (pfile->out.base);
+  free (pfile->out.base);

   if (pfile->macro_buffer)
     {
diff --git a/libcpp/macro.c b/libcpp/macro.c
index d9324a3..eba2349 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -1064,8 +1064,7 @@  replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, macro_arg

   /* Free the expanded arguments.  */
   for (i = 0; i < macro->paramc; i++)
-    if (args[i].expanded)
-      free (args[i].expanded);
+    free (args[i].expanded);

   push_ptoken_context (pfile, node, buff, first, dest - first);
 }
diff --git a/libcpp/pch.c b/libcpp/pch.c
index 00b7794..d278f14 100644
--- a/libcpp/pch.c
+++ b/libcpp/pch.c
@@ -713,12 +713,9 @@  cpp_valid_state (cpp_reader *r, const char *name, int fd)
   return -1;

  fail:
-  if (namebuf != NULL)
-    free (namebuf);
-  if (undeftab != NULL)
-    free (undeftab);
-  if (nl.defs != NULL)
-    free (nl.defs);
+  free (namebuf);
+  free (undeftab);
+  free (nl.defs);
   return 1;
 }

diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index 75e4a8e..94b7d72 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -1,3 +1,12 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* decNumber.c (decNumberFromString): Remove useless
+	if-before-free test.
+	(decNumberCompareTotalMag, decNumberExp, decNumberFMA): Likewise.
+	(decNumberLn, decNumberLog10, decNumberPower): Likewise.
+	(decNumberReduce, decNumberSquareRoot, decAddOp): Likewise.
+	(decDivideOp, NEEDTWO, decExpOp, LN2): Likewise.
+
 2011-03-28  Mike Frysinger  <vapier@gentoo.org>

 	* .gitignore: New file.
diff --git a/libdecnumber/decNumber.c b/libdecnumber/decNumber.c
index d097cab..cf2d32e 100644
--- a/libdecnumber/decNumber.c
+++ b/libdecnumber/decNumber.c
@@ -711,7 +711,7 @@  decNumber * decNumberFromString(decNumber *dn, const char chars[],
     /* decNumberShow(dn); */
     } while(0); 			/* [for break] */

-  if (allocres!=NULL) free(allocres);	/* drop any storage used */
+  free(allocres);	/* drop any storage used */
   if (status!=0) decStatus(dn, status, set);
   return dn;
   } /* decNumberFromString */
@@ -970,8 +970,8 @@  decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
     decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
     } while(0); 			/* end protected */

-  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
-  if (allocbufb!=NULL) free(allocbufb); /* .. */
+  free(allocbufa); /* drop any storage used */
+  free(allocbufb); /* .. */
   if (status!=0) decStatus(res, status, set);
   return res;
   } /* decNumberCompareTotalMag */
@@ -1074,7 +1074,7 @@  decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
     } while(0); 			/* end protected */

   #if DECSUBSET
-  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
+  free(allocrhs);	/* drop any storage used */
   #endif
   /* apply significant status */
   if (status!=0) decStatus(res, status, set);
@@ -1169,7 +1169,7 @@  decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
     decAddOp(res, acc, fhs, set, 0, &status);
     } while(0); 			/* end protected */

-  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
+  free(allocbufa); /* drop any storage used */
   if (status!=0) decStatus(res, status, set);
   #if DECCHECK
   decCheckInexact(res, set);
@@ -1296,7 +1296,7 @@  decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
     } while(0); 			/* end protected */

   #if DECSUBSET
-  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
+  free(allocrhs);	/* drop any storage used */
   #endif
   /* apply significant status */
   if (status!=0) decStatus(res, status, set);
@@ -1509,10 +1509,10 @@  decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
     decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
     } while(0); 			/* [for break] */

-  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
-  if (allocbufb!=NULL) free(allocbufb); /* .. */
+  free(allocbufa); /* drop any storage used */
+  free(allocbufb); /* .. */
   #if DECSUBSET
-  if (allocrhs !=NULL) free(allocrhs);	/* .. */
+  free(allocrhs);	/* .. */
   #endif
   /* apply significant status */
   if (status!=0) decStatus(res, status, set);
@@ -2253,11 +2253,11 @@  decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
     #endif
     } while(0); 			/* end protected */

-  if (allocdac!=NULL) free(allocdac);	/* drop any storage used */
-  if (allocinv!=NULL) free(allocinv);	/* .. */
+  free(allocdac);	/* drop any storage used */
+  free(allocinv);	/* .. */
   #if DECSUBSET
-  if (alloclhs!=NULL) free(alloclhs);	/* .. */
-  if (allocrhs!=NULL) free(allocrhs);	/* .. */
+  free(alloclhs);	/* .. */
+  free(allocrhs);	/* .. */
   #endif
   if (status!=0) decStatus(res, status, set);
   #if DECCHECK
@@ -2349,7 +2349,7 @@  decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
     } while(0); 			     /* end protected */

   #if DECSUBSET
-  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
+  free(allocrhs);	     /* .. */
   #endif
   if (status!=0) decStatus(res, status, set);/* then report status */
   return res;
@@ -3111,11 +3111,11 @@  decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
     decNumberCopy(res, a);		     /* a is now the result */
     } while(0); 			     /* end protected */

-  if (allocbuff!=NULL) free(allocbuff);      /* drop any storage used */
-  if (allocbufa!=NULL) free(allocbufa);      /* .. */
-  if (allocbufb!=NULL) free(allocbufb);      /* .. */
+  free(allocbuff);      /* drop any storage used */
+  free(allocbufa);      /* .. */
+  free(allocbufb);      /* .. */
   #if DECSUBSET
-  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
+  free(allocrhs);	     /* .. */
   #endif
   if (status!=0) decStatus(res, status, set);/* then report status */
   #if DECCHECK
@@ -4130,10 +4130,10 @@  static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
       }
     } while(0); 			     /* end protected */

-  if (allocacc!=NULL) free(allocacc);	     /* drop any storage used */
+  free(allocacc);	     /* drop any storage used */
   #if DECSUBSET
-  if (allocrhs!=NULL) free(allocrhs);	     /* .. */
-  if (alloclhs!=NULL) free(alloclhs);	     /* .. */
+  free(allocrhs);	     /* .. */
+  free(alloclhs);	     /* .. */
   #endif
   return res;
   } /* decAddOp */
@@ -4782,11 +4782,11 @@  static decNumber * decDivideOp(decNumber *res,
     #endif
     } while(0); 			     /* end protected */

-  if (varalloc!=NULL) free(varalloc);	/* drop any storage used */
-  if (allocacc!=NULL) free(allocacc);	/* .. */
+  free(varalloc);	/* drop any storage used */
+  free(allocacc);	/* .. */
   #if DECSUBSET
-  if (allocrhs!=NULL) free(allocrhs);	/* .. */
-  if (alloclhs!=NULL) free(alloclhs);	/* .. */
+  free(allocrhs);	/* .. */
+  free(alloclhs);	/* .. */
   #endif
   return res;
   } /* decDivideOp */
@@ -5127,14 +5127,14 @@  static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
     decFinish(res, set, &residue, status);   /* final cleanup */
     } while(0); 			/* end protected */

-  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
+  free(allocacc);	/* drop any storage used */
   #if DECSUBSET
-  if (allocrhs!=NULL) free(allocrhs);	/* .. */
-  if (alloclhs!=NULL) free(alloclhs);	/* .. */
+  free(allocrhs);	/* .. */
+  free(alloclhs);	/* .. */
   #endif
   #if FASTMUL
-  if (allocrhi!=NULL) free(allocrhi);	/* .. */
-  if (alloclhi!=NULL) free(alloclhi);	/* .. */
+  free(allocrhi);	/* .. */
+  free(alloclhi);	/* .. */
   #endif
   return res;
   } /* decMultiplyOp */
@@ -5483,9 +5483,9 @@  decNumber * decExpOp(decNumber *res, const decNumber *rhs,
     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
     } while(0); 			/* end protected */

-  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
-  if (allocbufa!=NULL) free(allocbufa); /* .. */
-  if (allocbuft!=NULL) free(allocbuft); /* .. */
+  free(allocrhs);	/* drop any storage used */
+  free(allocbufa); /* .. */
+  free(allocbuft); /* .. */
   /* [status is handled by caller] */
   return res;
   } /* decExpOp */
@@ -5794,8 +5794,8 @@  decNumber * decLnOp(decNumber *res, const decNumber *rhs,
     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
     } while(0); 			/* end protected */

-  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
-  if (allocbufb!=NULL) free(allocbufb); /* .. */
+  free(allocbufa); /* drop any storage used */
+  free(allocbufb); /* .. */
   /* [status is handled by caller] */
   return res;
   } /* decLnOp */
@@ -5959,8 +5959,8 @@  static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
     } while(0); 			/* end protected */

   #if DECSUBSET
-  if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
-  if (alloclhs!=NULL) free(alloclhs);	/* .. */
+  free(allocrhs);	/* drop any storage used */
+  free(alloclhs);	/* .. */
   #endif
   return res;
   } /* decQuantizeOp */
@@ -6142,8 +6142,8 @@  decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
       }
     }
   #if DECSUBSET
-  if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
-  if (alloclhs!=NULL) free(alloclhs);	/* .. */
+  free(allocrhs);	/* free any storage used */
+  free(alloclhs);	/* .. */
   #endif
   return res;
   } /* decCompareOp */
@@ -6277,7 +6277,7 @@  static Int decUnitCompare(const Unit *a, Int alength,
     result=(*u==0 ? 0 : +1);
     }
   /* clean up and return the result */
-  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
+  free(allocacc);	/* drop any storage used */
   return result;
   } /* decUnitCompare */

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index f4b19f8..0c331df 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,13 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* intrinsics/move_alloc.c (move_alloc): Remove useless
+	if-before-free test.
+	* io/fbuf.c (fbuf_destroy): Likewise.
+	* io/format.c (save_parsed_format): Likewise.
+	* io/open.c (already_open): Likewise.
+	* io/unit.c (free_internal_unit, close_unit_1): Likewise.
+	* io/unix.c (mem_close): Likewise.
+
 2011-04-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

 	PR libgfortran/48602
diff --git a/libgfortran/intrinsics/move_alloc.c b/libgfortran/intrinsics/move_alloc.c
index 9b5497c..f76c20c 100644
--- a/libgfortran/intrinsics/move_alloc.c
+++ b/libgfortran/intrinsics/move_alloc.c
@@ -37,8 +37,7 @@  move_alloc (gfc_array_char * from, gfc_array_char * to)
 {
   int i;

-  if (to->data)
-    free (to->data);
+  free (to->data);

   for (i = 0; i < GFC_DESCRIPTOR_RANK (from); i++)
     {
diff --git a/libgfortran/io/fbuf.c b/libgfortran/io/fbuf.c
index 82b3f6b..353e5ae 100644
--- a/libgfortran/io/fbuf.c
+++ b/libgfortran/io/fbuf.c
@@ -51,8 +51,7 @@  fbuf_destroy (gfc_unit * u)
 {
   if (u->fbuf == NULL)
     return;
-  if (u->fbuf->buf)
-    free (u->fbuf->buf);
+  free (u->fbuf->buf);
   free (u->fbuf);
   u->fbuf = NULL;
 }
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 5760e0c..518dc80 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -149,8 +149,7 @@  save_parsed_format (st_parameter_dt *dtp)
     free_format_data (u->format_hash_table[hash].hashed_fmt);
   u->format_hash_table[hash].hashed_fmt = NULL;

-  if (u->format_hash_table[hash].key != NULL)
-    free (u->format_hash_table[hash].key);
+  free (u->format_hash_table[hash].key);
   u->format_hash_table[hash].key = get_mem (dtp->format_len);
   memcpy (u->format_hash_table[hash].key, dtp->format, dtp->format_len);

diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index bcf7941..b26d14d 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -688,8 +688,7 @@  already_open (st_parameter_open *opp, gfc_unit * u, unit_flags * flags)
 	}

       u->s = NULL;
-      if (u->file)
-	free (u->file);
+      free (u->file);
       u->file = NULL;
       u->file_len = 0;

diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c
index 1d52217..e8a9b84 100644
--- a/libgfortran/io/unit.c
+++ b/libgfortran/io/unit.c
@@ -483,11 +483,9 @@  free_internal_unit (st_parameter_dt *dtp)

   if (dtp->u.p.current_unit != NULL)
     {
-      if (dtp->u.p.current_unit->ls != NULL)
-	free (dtp->u.p.current_unit->ls);
+      free (dtp->u.p.current_unit->ls);
   
-      if (dtp->u.p.current_unit->s)
-	free (dtp->u.p.current_unit->s);
+      free (dtp->u.p.current_unit->s);
   
       destroy_unit_mutex (dtp->u.p.current_unit);
     }
@@ -652,8 +650,7 @@  close_unit_1 (gfc_unit *u, int locked)

   delete_unit (u);

-  if (u->file)
-    free (u->file);
+  free (u->file);
   u->file = NULL;
   u->file_len = 0;

diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 4295071..ee2fd17 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -850,8 +850,7 @@  mem_flush (unix_stream * s __attribute__ ((unused)))
 static int
 mem_close (unix_stream * s)
 {
-  if (s != NULL)
-    free (s);
+  free (s);

   return 0;
 }
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index a15ffa5..c60624f 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,16 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* cp-demint.c (cplus_demangle_v3_components): Remove useless
+	if-before-free.
+	* cplus-dem.c (squangle_mop_up): Likewise.
+	(delete_non_B_K_work_stuff): Likewise.
+	* pex-common.c (pex_free): Likewise.
+	* pex-msdos.c (pex_msdos_cleanup): Likewise.
+	* pex-win32.c (mingw_rootify, msys_rootify): Likewise.
+	(win32_spawn): Likewise.
+	* regex.c (FREE_VAR, weak_alias): Likewise.
+	* spaces.c (spaces): Likewise.
+
 2011-04-10  Jim Meyering  <meyering@redhat.com>

 	Avoid memory overrun in a test leading to potential double-free.
diff --git a/libiberty/cp-demint.c b/libiberty/cp-demint.c
index 2e8f8d2..1d1a77a 100644
--- a/libiberty/cp-demint.c
+++ b/libiberty/cp-demint.c
@@ -206,10 +206,8 @@  cplus_demangle_v3_components (const char *mangled, int options, void **mem)
 	     malloc (di.num_subs * sizeof (struct demangle_component *)));
   if (di.comps == NULL || di.subs == NULL)
     {
-      if (di.comps != NULL)
-	free (di.comps);
-      if (di.subs != NULL)
-	free (di.subs);
+      free (di.comps);
+      free (di.subs);
       return NULL;
     }

diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index 84f94b6..e948487 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -1311,8 +1311,7 @@  delete_non_B_K_work_stuff (struct work_stuff *work)
       int i;

       for (i = 0; i < work->ntmpl_args; i++)
-	if (work->tmpl_argvec[i])
-	  free ((char*) work->tmpl_argvec[i]);
+	free ((char*) work->tmpl_argvec[i]);

       free ((char*) work->tmpl_argvec);
       work->tmpl_argvec = NULL;
diff --git a/libiberty/pex-common.c b/libiberty/pex-common.c
index 55b63ae..6fd3fde 100644
--- a/libiberty/pex-common.c
+++ b/libiberty/pex-common.c
@@ -623,12 +623,9 @@  pex_free (struct pex_obj *obj)

   if (obj->next_input_name_allocated)
     free (obj->next_input_name);
-  if (obj->children != NULL)
-    free (obj->children);
-  if (obj->status != NULL)
-    free (obj->status);
-  if (obj->time != NULL)
-    free (obj->time);
+  free (obj->children);
+  free (obj->status);
+  free (obj->time);

   if (obj->remove_count > 0)
     {
diff --git a/libiberty/pex-msdos.c b/libiberty/pex-msdos.c
index 4b77bf6..fa0f40a 100644
--- a/libiberty/pex-msdos.c
+++ b/libiberty/pex-msdos.c
@@ -310,10 +310,8 @@  pex_msdos_cleanup (struct pex_obj  *obj)

   ms = (struct pex_msdos *) obj->sysdep;
   for (i = 0; i < PEX_MSDOS_FILE_COUNT; ++i)
-    if (msdos->files[i] != NULL)
-      free (msdos->files[i]);
-  if (msdos->statuses != NULL)
-    free (msdos->statuses);
+    free (msdos->files[i]);
+  free (msdos->statuses);
   free (msdos);
   obj->sysdep = NULL;
 }
diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c
index 4427406..107ac6f 100644
--- a/libiberty/pex-win32.c
+++ b/libiberty/pex-win32.c
@@ -210,10 +210,8 @@  mingw_rootify (const char *executable)
   if (!namebuf || !foundbuf)
     {
       RegCloseKey (hKey);
-      if (namebuf)
-	free (namebuf);
-      if (foundbuf)
-	free (foundbuf);
+      free (namebuf);
+      free (foundbuf);
       return executable;
     }

@@ -315,8 +313,7 @@  msys_rootify (const char *executable)
     return tack_on_executable (buf, executable);

   /* failed */
-  if (buf)
-    free (buf);
+  free (buf);
   return executable;
 }
 #endif
@@ -607,8 +604,7 @@  win32_spawn (const char *executable,
 		      si,
 		      pi))
     {
-      if (env_block)
-        free (env_block);
+      free (env_block);

       free (full_executable);

@@ -618,18 +614,14 @@  win32_spawn (const char *executable,
   /* Clean up.  */
   CloseHandle (pi->hThread);
   free (full_executable);
-  if (env_block)
-    free (env_block);
+  free (env_block);

   return (pid_t) pi->hProcess;

  error:
-  if (env_block)
-    free (env_block);
-  if (cmdline)
-    free (cmdline);
-  if (full_executable)
-    free (full_executable);
+  free (env_block);
+  free (cmdline);
+  free (full_executable);

   return (pid_t) -1;
 }
diff --git a/libiberty/regex.c b/libiberty/regex.c
index 420c7f4..d65eedb 100644
--- a/libiberty/regex.c
+++ b/libiberty/regex.c
@@ -4970,7 +4970,7 @@  weak_alias (__re_search_2, re_search_2)
 #ifdef MATCH_MAY_ALLOCATE
 # define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
 #else
-# define FREE_VAR(var) if (var) free (var); var = NULL
+# define FREE_VAR(var) free (var); var = NULL
 #endif

 #ifdef WCHAR
@@ -8111,20 +8111,17 @@  weak_alias (__regerror, regerror)
 void
 regfree (regex_t *preg)
 {
-  if (preg->buffer != NULL)
-    free (preg->buffer);
+  free (preg->buffer);
   preg->buffer = NULL;

   preg->allocated = 0;
   preg->used = 0;

-  if (preg->fastmap != NULL)
-    free (preg->fastmap);
+  free (preg->fastmap);
   preg->fastmap = NULL;
   preg->fastmap_accurate = 0;

-  if (preg->translate != NULL)
-    free (preg->translate);
+  free (preg->translate);
   preg->translate = NULL;
 }
 #ifdef _LIBC
diff --git a/libiberty/spaces.c b/libiberty/spaces.c
index 67481c9..69d7a2d 100644
--- a/libiberty/spaces.c
+++ b/libiberty/spaces.c
@@ -53,10 +53,7 @@  spaces (int count)

   if (count > maxsize)
     {
-      if (buf)
-	{
-	  free (buf);
-	}
+      free (buf);
       buf = (char *) malloc (count + 1);
       if (buf == (char *) 0)
 	return 0;
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index dd2b053..22b9fea 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* libsupc++/del_opnt.cc (operator delete): Remove useless
+	if-before-free.
+
 2011-04-17  Paolo Carlini  <paolo.carlini@oracle.com>

 	* testsuite/25_algorithms/partition/moveable.cc: Actually run
diff --git a/libstdc++-v3/libsupc++/del_opnt.cc b/libstdc++-v3/libsupc++/del_opnt.cc
index 75051d5..29eab10 100644
--- a/libstdc++-v3/libsupc++/del_opnt.cc
+++ b/libstdc++-v3/libsupc++/del_opnt.cc
@@ -31,6 +31,5 @@  extern "C" void free (void *);
 _GLIBCXX_WEAK_DEFINITION void
 operator delete (void *ptr, const std::nothrow_t&) throw ()
 {
-  if (ptr)
-    free (ptr);
+  free (ptr);
 }
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog
index 2e63db3..daf3da1 100644
--- a/lto-plugin/ChangeLog
+++ b/lto-plugin/ChangeLog
@@ -1,3 +1,7 @@ 
+2011-04-15  Jim Meyering  <meyering@redhat.com>
+
+	* lto-plugin.c (free_1, free_2): Remove useless if-before-free.
+
 2011-04-05  Richard Guenther  <rguenther@suse.de>

 	PR bootstrap/48431
diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
index 661f10c..4b5828b 100644
--- a/lto-plugin/lto-plugin.c
+++ b/lto-plugin/lto-plugin.c
@@ -312,8 +312,7 @@  free_1 (void)
 	{
 	  struct ld_plugin_symbol *s = &symtab->syms[j];
 	  free (s->name);
-	  if (s->comdat_key)
-	    free (s->comdat_key);
+	  free (s->comdat_key);
 	}
       free (symtab->syms);
       symtab->syms = NULL;
@@ -342,8 +341,7 @@  free_2 (void)
   claimed_files = NULL;
   num_claimed_files = 0;

-  if (arguments_file_name)
-    free (arguments_file_name);
+  free (arguments_file_name);
   arguments_file_name = NULL;
 }