[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2017-04-20 Thread ubizjak at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

Uroš Bizjak  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #10 from Uroš Bizjak  ---
Works OK with gcc-7.

[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-04-13 Thread steven at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950



Steven Bosscher  changed:



   What|Removed |Added



   Keywords||build, wrong-debug

 Status|UNCONFIRMED |NEW

   Last reconfirmed||2013-04-13

 CC||aoliva at gcc dot gnu.org,

   ||jakub at gcc dot gnu.org

 Ever Confirmed|0   |1



--- Comment #1 from Steven Bosscher  2013-04-13 
23:15:07 UTC ---

Breaks bootstrap with -fschedule-insn on i686.


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-04-14 Thread steven at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950



--- Comment #2 from Steven Bosscher  2013-04-14 
15:09:20 UTC ---

I am testing this fix:



Index: haifa-sched.c

===

--- haifa-sched.c   (revision 197942)

+++ haifa-sched.c   (working copy)

@@ -7431,14 +7431,14 @@ sched_extend_bb (void)



   /* The following is done to keep current_sched_info->next_tail non null.  */

   insn = BB_END (EXIT_BLOCK_PTR->prev_bb);

-  if (NEXT_INSN (insn) == 0

+  if (next_nondebug_insn (insn) == 0

   || (!NOTE_P (insn)

  && !LABEL_P (insn)

  /* Don't emit a NOTE if it would end up before a BARRIER.  */

  && !BARRIER_P (NEXT_INSN (insn

 { 

   rtx note = emit_note_after (NOTE_INSN_DELETED, insn);

-  /* Make insn appear outside BB.  */

+  /* Make note appear outside BB.  */

   set_block_for_insn (note, NULL);

   BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;

 }


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-04-14 Thread steven at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950



--- Comment #3 from Steven Bosscher  2013-04-14 
19:30:38 UTC ---

(In reply to comment #2)

> I am testing this fix:



Hmm, no that is not a fix...


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-17 Thread steven at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

Steven Bosscher  changed:

   What|Removed |Added

 CC||ubizjak at gmail dot com

--- Comment #4 from Steven Bosscher  ---
*** Bug 57257 has been marked as a duplicate of this bug. ***


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-20 Thread steven at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

--- Comment #5 from Steven Bosscher  ---
This patch makes the ICE go away, but it doesn't really solve the bug.

The scheduler inserts (in this case) notes between basic blocks in the
sched1 pass, which runs in cfglayout mode.  But "between basic blocks"
in cfglayout mode means nothing: such things belong in BB_HEADER and
BB_FOOTER.

But that happens before and after this patch, so the patch merely puts
things back to the status ante quo.  So be solved properly later...

Index: haifa-sched.c
===
--- haifa-sched.c   (revision 199028)
+++ haifa-sched.c   (working copy)
@@ -7442,11 +7442,12 @@ sched_extend_bb (void)
   if (NEXT_INSN (insn) == 0
   || (!NOTE_P (insn)
  && !LABEL_P (insn)
+ && !DEBUG_INSN_P (insn)
  /* Don't emit a NOTE if it would end up before a BARRIER.  */
  && !BARRIER_P (NEXT_INSN (insn
 {
   rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
-  /* Make insn appear outside BB.  */
+  /* Make note appear outside BB.  */
   set_block_for_insn (note, NULL);
   BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
 }


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-20 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

--- Comment #6 from Jakub Jelinek  ---
That still doesn't look safe -fcompare-debug wise.
I mean, if BB ends in a DEBUG_INSN (or more), it could be preceeded by note,
label, or some other insns.  So shouldn't that be instead
  rtx insn2 = DEBUG_INSN_P (insn) ? prev_nondebug_insn (insn2) : insn;
(I'd hope there shouldn't be DEBUG_INSN only bb's, because then with -g0 insn
ought to be NULL and NEXT_INSN (insn) should crash), and use this in the
!NOTE_P and !LABEL_P tests?  When NEXT_INSN (insn) is used, it should keep
using the BB_END insn, even if it is a DEBUG_INSN, we are looking at what comes
afterwards.


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-20 Thread steven at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

--- Comment #7 from Steven Bosscher  ---
Index: haifa-sched.c
===
--- haifa-sched.c   (revision 199028)
+++ haifa-sched.c   (working copy)
@@ -7435,20 +7435,19 @@ find_fallthru_edge_from (basic_block pre
 static void
 sched_extend_bb (void)
 {
-  rtx insn;
-
   /* The following is done to keep current_sched_info->next_tail non null.  */
-  insn = BB_END (EXIT_BLOCK_PTR->prev_bb);
+  rtx end = BB_END (EXIT_BLOCK_PTR->prev_bb);
+  rtx insn = DEBUG_INSN_P (end) ? prev_nondebug_insn (end) : end;
   if (NEXT_INSN (insn) == 0
   || (!NOTE_P (insn)
  && !LABEL_P (insn)
  /* Don't emit a NOTE if it would end up before a BARRIER.  */
  && !BARRIER_P (NEXT_INSN (insn
 {
-  rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
-  /* Make insn appear outside BB.  */
+  rtx note = emit_note_after (NOTE_INSN_DELETED, end);
+  /* Make note appear outside BB.  */
   set_block_for_insn (note, NULL);
-  BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
+  BB_END (EXIT_BLOCK_PTR->prev_bb) = end;
 }
 }


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-20 Thread stevenb.gcc at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

--- Comment #8 from stevenb.gcc at gmail dot com  
---
> --- Comment #6 from Jakub Jelinek  ---
> That still doesn't look safe -fcompare-debug wise.
> I mean, if BB ends in a DEBUG_INSN (or more), it could be preceeded by note,
> label, or some other insns.  So shouldn't that be instead
>   rtx insn2 = DEBUG_INSN_P (insn) ? prev_nondebug_insn (insn2) : insn;

I suppose so, yes.

> (I'd hope there shouldn't be DEBUG_INSN only bb's, because then with -g0 insn
> ought to be NULL and NEXT_INSN (insn) should crash), and use this in the
> !NOTE_P and !LABEL_P tests?

This block is a DEBUG_INSN-only block, but insn is never NULL: BB_END
will be the basic block note.


[Bug debug/56950] compare-debug failure for gcc.dg/pr41345.c with fschedule-insns

2013-05-20 Thread jakub at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56950

--- Comment #9 from Jakub Jelinek  ---
(In reply to Steven Bosscher from comment #7)
> Index: haifa-sched.c
> ===
> --- haifa-sched.c   (revision 199028)
> +++ haifa-sched.c   (working copy)
> @@ -7435,20 +7435,19 @@ find_fallthru_edge_from (basic_block pre
>  static void
>  sched_extend_bb (void)
>  {
> -  rtx insn;
> -
>/* The following is done to keep current_sched_info->next_tail non null. 
> */
> -  insn = BB_END (EXIT_BLOCK_PTR->prev_bb);
> +  rtx end = BB_END (EXIT_BLOCK_PTR->prev_bb);
> +  rtx insn = DEBUG_INSN_P (end) ? prev_nondebug_insn (end) : end;
>if (NEXT_INSN (insn) == 0

This should be NEXT_INSN (end) == 0

>|| (!NOTE_P (insn)
>   && !LABEL_P (insn)
>   /* Don't emit a NOTE if it would end up before a BARRIER.  */
>   && !BARRIER_P (NEXT_INSN (insn

and this && !BARRIER_P (NEXT_INSN (end

>  {
> -  rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
> -  /* Make insn appear outside BB.  */
> +  rtx note = emit_note_after (NOTE_INSN_DELETED, end);
> +  /* Make note appear outside BB.  */
>set_block_for_insn (note, NULL);
> -  BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
> +  BB_END (EXIT_BLOCK_PTR->prev_bb) = end;
>  }
>  }