public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* Help: How to update dataflow info after splitting ?
@ 2011-10-06 17:34 Nick Clifton
  0 siblings, 0 replies; only message in thread
From: Nick Clifton @ 2011-10-06 17:34 UTC (permalink / raw)
  To: gcc-bugs; +Cc: pocmatos

Hi Guys,

  I am stuck on a dataflow problem.  PR 49801 is reported against the RX
  toolchain, but I believe it to be a generic problem.

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

  The issue I think is the split2 pass which is converting this:

    (set (pc) (if_then_else (geu (reg r1)
                                 (reg r2))
                            (label_ref 13)
                            (pc)))

  into this:

    (set (reg:CC cc) (compare:CC (reg r1)
                                 (reg r2)))

    (set (pc) (if_then_else (geu (reg cc)
                                 (const_int 0))
                            (label_ref 13)
                            (pc)))

  This new pair of insns introduces a definition and use of the
  condition code register (reg cc), but the dataflow information is not
  updated to reflect this.  This causes the following pass (compare
  eliminate) to ICE with a dataflow checking failure if checking is
  enabled:

    shift.c:7:1: internal compiler error: in df_live_verify_transfer_functions, at df-problems.c:1816

  The dataflow information for the basic block looks like this:

    ;; Start of basic block ( 0) -> 2
    ;; bb 2 artificial_defs: { }
    ;; bb 2 artificial_uses: { u-1(0){ }}
    ;; lr  in  	 0 [r0] 1 [r1] 2 [r2]
    ;; lr  use 	 0 [r0] 1 [r1] 2 [r2]
    ;; lr  def 	
    ;; live  in  	 0 [r0] 1 [r1] 2 [r2]
    ;; live  gen 	
    ;; live  kill	

    ;; End of basic block 2 -> ( 3 4)
    ;; lr  out 	 0 [r0] 1 [r1] 2 [r2]
    ;; live  out 	 0 [r0] 1 [r1] 2 [r2]

  Ie no mention of the condition code register (register 16).

  The issue I have is that I do not know how to fix this.  I thought
  that adding a call to df_insn_rescan for the newly created insns would
  work, like this:

Index: gcc/recog.c
===================================================================
--- gcc/recog.c	(revision 179611)
+++ gcc/recog.c	(working copy)
@@ -2841,7 +2841,10 @@
       for (;;)
 	{
 	  if (INSN_P (first))
-	    cleanup_subreg_operands (first);
+	    {
+	      cleanup_subreg_operands (first);
+	      df_insn_rescan (first);
+	    }
 	  if (first == last)
 	    break;
 	  first = NEXT_INSN (first);

  But this made no difference. :-(  I have considered adding a
  "(set (reg cc)..)" in parallel to the original jump pattern, but I am
  loath to do so because I have found that gcc tends to have issues with
  jump insns that contain parallels.

  Any suggestions ?

Cheers
  Nick


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-10-06 17:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-06 17:34 Help: How to update dataflow info after splitting ? Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).