This is the mail archive of the gcc-bugs@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]

[Bug debug/54953] [4.8 Regression] New sra-1.c FAILs on powerpc


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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2012-10-17
   Target Milestone|---                         |4.8.0
     Ever Confirmed|0                           |1

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-10-17 16:03:50 UTC ---
I've tried:
--- dce.c.jj1    2012-10-08 21:37:36.000000000 +0200
+++ dce.c    2012-10-17 17:32:19.855891915 +0200
@@ -880,7 +880,9 @@ word_dce_process_block (basic_block bb,

         for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
           dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn,
-                      DEBUG_TEMP_BEFORE_WITH_VALUE);
+                      marked_insn_p (insn)
+                      ? DEBUG_TEMP_AFTER_WITH_REG
+                      : DEBUG_TEMP_BEFORE_WITH_VALUE);
       }

     if (dump_file)
@@ -981,7 +983,9 @@ dce_process_block (basic_block bb, bool
     if (debug.used && !bitmap_empty_p (debug.used))
       for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
         dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn,
-                    DEBUG_TEMP_BEFORE_WITH_VALUE);
+                    needed
+                    ? DEBUG_TEMP_AFTER_WITH_REG
+                    : DEBUG_TEMP_BEFORE_WITH_VALUE);
       }

   dead_debug_local_finish (&debug, NULL);
but that isn't enough (well, it seems likely the testcase passes again, but
isn't correct).
The problem is in:
654      /* If there's a single (debug) use of an otherwise unused REG, and
655         the debug use is not part of a larger expression, then it
656         probably doesn't make sense to introduce a new debug temp.  */
657      if (where == DEBUG_TEMP_AFTER_WITH_REG && !uses->next)
658        {
659          rtx next = DF_REF_INSN (uses->use);
660    
661          if (DEBUG_INSN_P (next) && reg == INSN_VAR_LOCATION_LOC (next))
662        {
663          XDELETE (uses);
664          return 0;
665        }
666        }
in dead_debug_insert_temp, which triggers in this case and just does nothing. 
I wonder why that hunk has been added, if the pseudo is live at that point,
surely it doesn't make sense, but if it becomes dead in between the insn and
the single debug use, then inserting a new debug temp is desirable even in that
case.  If it is fine for some reason for df-problems.c uses, perhaps we should
have another DEBUG_TEMP_AFTER_WITH_REG_FORCE where mode or similar that would
do the same thing as DEBUG_TEMP_AFTER_WITH_REG, but not trigger this kind of
?optimization?.


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