diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 275b162769248261ecf2cb761aa900dda4b34bb5..9f0c949f71718ad7d4c1b5443a3cea0c61884371 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jul  6 22:47:55 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+	* gcse.c (hash_scan_insn): New argument IN_LIBCALL_BLOCK.  Changed
+	caller.
+
 Mon Jul  6 22:21:56 1998  Kamil Iskra  <iskra@student.uci.agh.edu.pl>
 
 	* m68k.c (output_scc_di): Use cmpw #0 instead of tstl when
diff --git a/gcc/gcse.c b/gcc/gcse.c
index c40f68730659c7292c2cb00fb6859134f5a55ad4..c424a33264fb972867d18c0c276e07951a6cb211 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -550,7 +550,7 @@ static void record_one_set            PROTO ((int, rtx));
 static void record_set_info           PROTO ((rtx, rtx));
 static void compute_sets              PROTO ((rtx));
 
-static void hash_scan_insn            PROTO ((rtx, int));
+static void hash_scan_insn            PROTO ((rtx, int, int));
 static void hash_scan_set             PROTO ((rtx, rtx, int));
 static void hash_scan_clobber         PROTO ((rtx, rtx));
 static void hash_scan_call            PROTO ((rtx, rtx));
@@ -1849,10 +1849,12 @@ hash_scan_call (x, insn)
    are also in the PARALLEL.  Later.
 
    If SET_P is non-zero, this is for the assignment hash table,
-   otherwise it is for the expression hash table.  */
+   otherwise it is for the expression hash table.
+   If IN_LIBCALL_BLOCK nonzero, we are in a libcall block, and should
+   not record any expressions.  */
 
 static void
-hash_scan_insn (insn, set_p)
+hash_scan_insn (insn, set_p, in_libcall_block)
      rtx insn;
      int set_p;
 {
@@ -1861,7 +1863,7 @@ hash_scan_insn (insn, set_p)
   /* Pick out the sets of INSN and for other forms of instructions record
      what's been modified.  */
 
-  if (GET_CODE (pat) == SET)
+  if (GET_CODE (pat) == SET && ! in_libcall_block)
     hash_scan_set (pat, insn, set_p);
   else if (GET_CODE (pat) == PARALLEL)
     {
@@ -2037,6 +2039,7 @@ compute_hash_table (f, set_p)
     {
       rtx insn;
       int regno;
+      int in_libcall_block;
 
       /* First pass over the instructions records information used to
 	 determine when registers and memory are first and last set.
@@ -2080,12 +2083,18 @@ compute_hash_table (f, set_p)
 
       /* The next pass builds the hash table.  */
 
-      for (insn = basic_block_head[bb];
+      for (insn = basic_block_head[bb], in_libcall_block = 0;
 	   insn && insn != NEXT_INSN (basic_block_end[bb]);
 	   insn = NEXT_INSN (insn))
 	{
 	  if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-	    hash_scan_insn (insn, set_p);
+	    {
+	      if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
+		in_libcall_block = 1;
+	      else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
+		in_libcall_block = 0;
+	      hash_scan_insn (insn, set_p, in_libcall_block);
+	    }
 	}
     }