This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Bug rtl-optimization/33669] [4.3 Regression] Revision 128957 miscompiles 481.wrf


HJ,

Sorry about the committing snafu.  I should have posted the irc log of
seonbae's comments to the log for the bug.  Also I had a meeting in the
city tonight, so there was not time to commit it between when seonbae
gave the final approval and when i had to catch my train.

I have committed the corrected patch as revision 129193.  It looks like
you had left the testcase when you reverted so there is no test case in
this patch.

This patch was tested on ia-64, ppc-32, xa6-{64,32}.

Kenny

> This patch fixes pr33669 <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33669>.
>
> The failure only happens if you have a block with 2 or more uses of a
> multiword pseudo register that is local to this block and has been
> allocated by local_alloc.  The uses must be in a particular form: the
> last use must be a subreg use that only used some of the hard registers and
> a previous non subreg use of the multiword register.
>
> When all of this happens, the code did not properly expand this to a
> whole multiregister when the second to last use is encountered in the
> backwards scan.
>
> I.e. a lot of things have to happen to get this to fail.
>
> I have tested this patch on ia-64, x86-{64,32} and ppc-32.
>



2007-10-07  Kenneth Zadeck <zadeck@naturalbridge.com>

    PR middle-end/33669
    * ra-conflict.c (record_one_conflict_between_regnos,
    set_conflicts_for_earlyclobber, global_conflicts): Improved logging.
    (global_conflicts): Enhanced incorrect check.
   

Index: ra-conflict.c
===================================================================
--- ra-conflict.c	(revision 129192)
+++ ra-conflict.c	(working copy)
@@ -196,7 +196,7 @@ record_one_conflict_between_regnos (enum
   int allocno2 = reg_allocno[r2];
 
   if (dump_file)
-    fprintf (dump_file, "  rocbr adding %d<=>%d\n", r1, r2);
+    fprintf (dump_file, "    rocbr adding %d<=>%d\n", r1, r2);
 
   if (allocno1 >= 0 && allocno2 >= 0)
     set_conflict (allocno1, allocno2);
@@ -401,9 +401,6 @@ set_conflicts_for_earlyclobber (rtx insn
 						    recog_data.operand[use + 1]);
 		}
 	}
-
-  if (dump_file) 
-    fprintf (dump_file, "  finished early clobber conflicts.\n");
 }
 
 
@@ -983,12 +980,12 @@ global_conflicts (void)
 			set_renumbers_live (&renumbers_live, live_subregs, live_subregs_used, 
 					    allocnum, renumber);
 		    }
-		  
-		  else if (!sparseset_bit_p (allocnos_live, allocnum))
+		  else if (live_subregs_used[allocnum] > 0
+			   || !sparseset_bit_p (allocnos_live, allocnum))
 		    {
 		      if (dump_file)
-			fprintf (dump_file, "    dying pseudo\n");
-		      
+			fprintf (dump_file, "    %sdying pseudo\n", 
+				 (live_subregs_used[allocnum] > 0) ? "partially ": "");
 		      /* Resetting the live_subregs_used is
 			 effectively saying do not use the subregs
 			 because we are reading the whole pseudo.  */
@@ -1071,6 +1068,8 @@ global_conflicts (void)
 		 FIXME: We should consider either adding a new kind of
 		 clobber, or adding a flag to the clobber distinguish
 		 these two cases.  */
+	      if (dump_file && VEC_length (df_ref_t, clobbers))
+		fprintf (dump_file, "  clobber conflicts\n");
 	      for (k = VEC_length (df_ref_t, clobbers) - 1; k >= 0; k--)
 		{
 		  struct df_ref *def = VEC_index (df_ref_t, clobbers, k);
@@ -1132,6 +1131,8 @@ global_conflicts (void)
 	      if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
 		{ 
 		  int j;
+		  if (dump_file)
+		    fprintf (dump_file, "  multiple sets\n");
 		  for (j = VEC_length (df_ref_t, dying_regs) - 1; j >= 0; j--)
 		    {
 		      int used_in_output = 0;
@@ -1166,7 +1167,7 @@ global_conflicts (void)
 	    }
 	}
 
-	    /* Add the renumbers live to the hard_regs_live for the next few
+      /* Add the renumbers live to the hard_regs_live for the next few
 	 calls.  All of this gets recomputed at the top of the loop so
 	 there is no harm.  */
       IOR_HARD_REG_SET (hard_regs_live, renumbers_live);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]