Bug 32749 - [4.3 regression]: gfortran.dg/auto_array_1.f90
Summary: [4.3 regression]: gfortran.dg/auto_array_1.f90
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: 4.3.0
Assignee: Kenneth Zadeck
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2007-07-12 23:50 UTC by H.J. Lu
Modified: 2007-07-27 17:33 UTC (History)
3 users (show)

See Also:
Host:
Target: ia64-unknown-linux-gnu
Build:
Known to work:
Known to fail:
Last reconfirmed: 2007-07-25 18:41:41


Attachments
pr32749.patch (1.30 KB, patch)
2007-07-26 17:56 UTC, Seongbae Park
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description H.J. Lu 2007-07-12 23:50:31 UTC
Revision 126060 fails:

AIL: gfortran.dg/auto_array_1.f90  -O3 -fomit-frame-pointer -funroll-loops  execution test
FAIL: gfortran.dg/auto_array_1.f90  -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions  execution test

and revision 126007 works.
Comment 1 Francois-Xavier Coudert 2007-07-13 00:30:42 UTC
There has not been any patch to the Fortran front-end during that time, making it plausible that it's a middle-end or target bug.
Comment 2 H.J. Lu 2007-07-13 14:50:19 UTC
revision 126030 works.
Comment 3 H.J. Lu 2007-07-13 18:52:11 UTC
revision 126045 works.
Comment 4 H.J. Lu 2007-07-13 20:02:10 UTC
revision 126056 is bad.
Comment 5 H.J. Lu 2007-07-13 20:56:40 UTC
revision 126050 works.
Comment 6 H.J. Lu 2007-07-13 21:53:07 UTC
revision 126054 is bad.
Comment 7 H.J. Lu 2007-07-13 21:57:56 UTC
This patch

http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01977.html

is the cause. Richard, can you look into it? Thanks.
Comment 8 Richard Biener 2007-07-13 22:07:30 UTC
Sure, though I doubt this patch changed anything.  I won't get to it until after
the summit though.
Comment 9 Richard Biener 2007-07-16 12:27:54 UTC
I bet that if you back up until before

Author: rguenth
Date: Sat Jun 23 18:17:57 2007
New Revision: 125974

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=125974
Log:
2007-06-23  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/16876
	PR middle-end/29478
	* tree.h (CALL_CANNOT_INLINE_P): New macro to access static_flag
	for CALL_EXPRs.

the testcase will fail as well.  The effect of the patch you pointed at is
just to make inlining possible again.

I'll defer this for someone else to check what goes wrong with this testcase.
Comment 11 Richard Biener 2007-07-16 13:33:54 UTC
That makes me comfortable ;)
Comment 12 H.J. Lu 2007-07-16 17:10:33 UTC
revision 125905 works.
Comment 13 H.J. Lu 2007-07-16 18:14:12 UTC
revision 125920 works.
Comment 14 Uroš Bizjak 2007-07-16 18:47:25 UTC
(In reply to comment #13)
> revision 125920 works.
> Revision 125925 is bad:

17:06 	r125925 - in /trunk/gcc: ChangeLog testsuite/gc... 	spop
16:25 	r125924 - in /trunk/gcc: ChangeLog df-problems.c 	zadeck
15:47 	r125923 - in /branches/gcc-4_2-branch/gcc: Chan... 	hjl
14:54 	r125922 - in /trunk/gcc: ChangeLog testsuite/Ch... 	rguenth
13:18 	r125921 - in /branches/gcc-4_2-branch/gcc/tests... 	hjl
12:31 	r125920 - in /trunk/gcc: ChangeLog config/i386/... 	hjl

Could we place our bets now? ;)
Comment 15 H.J. Lu 2007-07-16 19:11:54 UTC
revision 125924 is bad. I am testing revision 125923 now.
Comment 16 H.J. Lu 2007-07-16 19:27:38 UTC
revision 125923 works. Kenny, it looks like your patch

http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html

causes this regression. Can you look into it? Thanks.
Comment 17 Kenneth Zadeck 2007-07-16 23:26:25 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

hjl at lucon dot org wrote:
> ------- Comment #16 from hjl at lucon dot org  2007-07-16 19:27 -------
> revision 125923 works. Kenny, it looks like your patch
>
> http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html
>
> causes this regression. Can you look into it? Thanks.
>
>
>   
I will look into this as soon as the bootstrap starts working again on
the ia-64.


Kenny
Comment 18 Kenneth Zadeck 2007-07-25 18:41:41 UTC
i am testing a patch.
Comment 19 Kenneth Zadeck 2007-07-26 11:51:30 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

This patch extends the fix in
http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html
to handle the case of clobbers inside conditional calls.

This problem caused the regression of gfortran.dg/matmul_3.f90 on the
ia-64 in addition to the regression cited in this pr.

Tested on ppc-32, ia-64 and x86-64.

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

    PR middle-end/32749
   
    * df-problems.c (df_note_bb_compute): Handle case of clobber
    inside conditional call.  
   

ok to commit?

kenny
Index: df-problems.c
===================================================================
--- df-problems.c	(revision 126918)
+++ df-problems.c	(working copy)
@@ -3989,7 +3989,7 @@ df_note_bb_compute (unsigned int bb_inde
 	      /* However a may or must clobber still needs to kill the
 		 reg so that REG_DEAD notes are later placed
 		 appropriately.  */ 
-	      else 
+	      else if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
 		bitmap_clear_bit (live, DF_REF_REGNO (def));
 	    }
 	}
Comment 20 Seongbae Park 2007-07-26 17:27:57 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

On 7/26/07, Kenneth Zadeck <zadeck@naturalbridge.com> wrote:
> This patch extends the fix in
> http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html
> to handle the case of clobbers inside conditional calls.
>
> This problem caused the regression of gfortran.dg/matmul_3.f90 on the
> ia-64 in addition to the regression cited in this pr.
>
> Tested on ppc-32, ia-64 and x86-64.
>
> 2007-07-26  Kenneth Zadeck <zadeck@naturalbridge.com>
>
>     PR middle-end/32749
>
>     * df-problems.c (df_note_bb_compute): Handle case of clobber
>     inside conditional call.
>
> ok to commit?

This change is OK.
Though I wonder if we need to do similar checking
for the regular insn case below.
Comment 21 Kenneth Zadeck 2007-07-26 17:35:47 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

Seongbae Park (???, ???) wrote:
> On 7/26/07, Kenneth Zadeck <zadeck@naturalbridge.com> wrote:
>> This patch extends the fix in
>> http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html
>> to handle the case of clobbers inside conditional calls.
>>
>> This problem caused the regression of gfortran.dg/matmul_3.f90 on the
>> ia-64 in addition to the regression cited in this pr.
>>
>> Tested on ppc-32, ia-64 and x86-64.
>>
>> 2007-07-26 Kenneth Zadeck <zadeck@naturalbridge.com>
>>
>> PR middle-end/32749
>>
>> * df-problems.c (df_note_bb_compute): Handle case of clobber
>> inside conditional call.
>>
>> ok to commit?
>
> This change is OK.
> Though I wonder if we need to do similar checking
> for the regular insn case below.
No the checking is done in df_create_unused_note. The only reason you
have to do it here is that you are not calling that.

thanks

kenny
Comment 22 Seongbae Park 2007-07-26 17:56:23 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

On 7/26/07, Kenneth Zadeck <zadeck@naturalbridge.com> wrote:
> Seongbae Park (???, ???) wrote:
> > On 7/26/07, Kenneth Zadeck <zadeck@naturalbridge.com> wrote:
> >> This patch extends the fix in
> >> http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01557.html
> >> to handle the case of clobbers inside conditional calls.
> >>
> >> This problem caused the regression of gfortran.dg/matmul_3.f90 on the
> >> ia-64 in addition to the regression cited in this pr.
> >>
> >> Tested on ppc-32, ia-64 and x86-64.
> >>
> >> 2007-07-26 Kenneth Zadeck <zadeck@naturalbridge.com>
> >>
> >> PR middle-end/32749
> >>
> >> * df-problems.c (df_note_bb_compute): Handle case of clobber
> >> inside conditional call.
> >>
> >> ok to commit?
> >
> > This change is OK.
> > Though I wonder if we need to do similar checking
> > for the regular insn case below.
> No the checking is done in df_create_unused_note. The only reason you
> have to do it here is that you are not calling that.
>
> thanks

Now that I look at df_create_unused_note,
this patch smells a bit - because the condition
inside the for loop looks identical to df_create_unused_node.
I think it would be cleaner if we split the live vector update
into a separate function. i.e. attached patch (untested).
Comment 23 Seongbae Park 2007-07-26 17:56:23 UTC
Created attachment 13986 [details]
pr32749.patch
Comment 24 zadeck@gcc.gnu.org 2007-07-27 17:22:24 UTC
Subject: Bug 32749

Author: zadeck
Date: Fri Jul 27 17:22:14 2007
New Revision: 126987

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=126987
Log:
2007-07-26  Kenneth Zadeck <zadeck@naturalbridge.com>

	PR middle-end/32749
	
	* df-problems.c (df_create_unused_note): Removed do_not_gen parm
	and the updating of the live and do_not_gen sets.
	(df_note_bb_compute): Added updating of live and do_not_gen sets
	for regular defs so that the case of clobber inside conditional
	call is processed correctly.
	

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/df-problems.c

Comment 25 Kenneth Zadeck 2007-07-27 17:29:58 UTC
Subject: Re:  [4.3 regression]: gfortran.dg/auto_array_1.f90

This patch rearranges the updating of the local dataflow info when
building reg_dead notes.  The need for this was that processing was not
correctly handled for clobbers that occurred within conditional call
insns.  A rare case but one that at least happens on the ia-64.

This patch not only fixes the regressions listed in pr32749, but also
fixes the gfortran.dg/matmul_3.f90 on the ia-64 regressions. 

This patch was bootstrapped and regression tested yesterday on x86-64
and ia-64 and was again bootstrapped this morning on x86-64 (just to
make sure there were no interactions with richard sandiford's fixes to
closely related code that was just committed.)

Committed as revision 126987.

Kenny

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

    PR middle-end/32749
   
    * df-problems.c (df_create_unused_note): Removed do_not_gen parm
    and the updating of the live and do_not_gen sets.
    (df_note_bb_compute): Added updating of live and do_not_gen sets
    for regular defs so that the case of clobber inside conditional
    call is processed correctly.
   
Index: df-problems.c
===================================================================
--- df-problems.c	(revision 126979)
+++ df-problems.c	(working copy)
@@ -3868,13 +3868,12 @@ df_set_dead_notes_for_mw (rtx insn, rtx 
 }
 
 
-/* Create a REG_UNUSED note if necessary for DEF in INSN updating LIVE
-   and DO_NOT_GEN.  Do not generate notes for registers in artificial
-   uses.  */
+/* Create a REG_UNUSED note if necessary for DEF in INSN updating
+   LIVE.  Do not generate notes for registers in ARTIFICIAL_USES.  */
 
 static rtx
 df_create_unused_note (rtx insn, rtx old, struct df_ref *def, 
-		       bitmap live, bitmap do_not_gen, bitmap artificial_uses)
+		       bitmap live, bitmap artificial_uses)
 {
   unsigned int dregno = DF_REF_REGNO (def);
   
@@ -3899,12 +3898,6 @@ df_create_unused_note (rtx insn, rtx old
 #endif
     }
   
-  if (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER + DF_REF_MAY_CLOBBER)))
-    bitmap_set_bit (do_not_gen, dregno);
-  
-  /* Kill this register if it is not a subreg store or conditional store.  */
-  if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
-    bitmap_clear_bit (live, dregno);
   return old;
 }
 
@@ -3915,7 +3908,7 @@ df_create_unused_note (rtx insn, rtx old
 
 static void
 df_note_bb_compute (unsigned int bb_index, 
-		  bitmap live, bitmap do_not_gen, bitmap artificial_uses)
+		    bitmap live, bitmap do_not_gen, bitmap artificial_uses)
 {
   basic_block bb = BASIC_BLOCK (bb_index);
   rtx insn;
@@ -4012,17 +4005,17 @@ df_note_bb_compute (unsigned int bb_inde
 	  for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
 	    {
 	      struct df_ref *def = *def_rec;
-	      if (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER)))
-		old_unused_notes
-		  = df_create_unused_note (insn, old_unused_notes, 
-					   def, live, do_not_gen, 
-					   artificial_uses);
-
-	      /* However a may or must clobber still needs to kill the
-		 reg so that REG_DEAD notes are later placed
-		 appropriately.  */ 
-	      else 
-		bitmap_clear_bit (live, DF_REF_REGNO (def));
+	      unsigned int dregno = DF_REF_REGNO (def);
+	      if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
+		{
+		  old_unused_notes
+		    = df_create_unused_note (insn, old_unused_notes, 
+					     def, live, artificial_uses);
+		  bitmap_set_bit (do_not_gen, dregno);
+		}
+
+	      if (!DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL | DF_REF_CONDITIONAL))
+		bitmap_clear_bit (live, dregno);
 	    }
 	}
       else
@@ -4043,10 +4036,16 @@ df_note_bb_compute (unsigned int bb_inde
 	  for (def_rec = DF_INSN_UID_DEFS (uid); *def_rec; def_rec++)
 	    {
 	      struct df_ref *def = *def_rec;
+	      unsigned int dregno = DF_REF_REGNO (def);
 	      old_unused_notes
 		= df_create_unused_note (insn, old_unused_notes, 
-					 def, live, do_not_gen, 
-					 artificial_uses);
+					 def, live, artificial_uses);
+
+	      if (!DF_REF_FLAGS_IS_SET (def, DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))
+		bitmap_set_bit (do_not_gen, dregno);
+
+	      if (!DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL | DF_REF_CONDITIONAL))
+		bitmap_clear_bit (live, dregno);
 	    }
 	}
       
Comment 26 Kenneth Zadeck 2007-07-27 17:33:46 UTC
revision 126987