[Bug rtl-optimization/38495] [4.4 Regression] ACATS tests cxa4004 cxa4005 cxa4026 fail

vmakarov at redhat dot com gcc-bugzilla@gcc.gnu.org
Fri Dec 19 23:32:00 GMT 2008



------- Comment #5 from vmakarov at redhat dot com  2008-12-19 23:30 -------
Eric, thanks for analysis.  It saved a lot of my time.

The problem was in wrong final live ranges of a379r452 therefore the conflicts
was not recognized and the pseudos were coalesced.  One pseudo is a temporary
pseudo used for breaking register shuffle cycle (it is actually a rare case) on
a CFG edge (loop exit).  And another pseudo is destination of removed store
insn on the loop exit.  In normal case it should not conflict with the
temporary pseudo because the temporary lives only on the edge and another
pseudo lives only after the edge destination.  But it should conflict with the
temporary in this case because we removed the store and another pseudo lives
through all loop.  The suspicious code looks like 

  EXECUTE_IF_SET_IN_BITMAP (live_through, FIRST_PSEUDO_REGISTER, regno, bi)
    {
      a = node->regno_allocno_map[regno];
      if (ALLOCNO_MEM_OPTIMIZED_DEST (a) == NULL)
        {
          ALLOCNO_LIVE_RANGES (a)
            = ira_create_allocno_live_range (a, start, ira_max_point - 1,
                                             ALLOCNO_LIVE_RANGES (a));
          if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
            fprintf
              (ira_dump_file,
               "    Adding range [%d..%d] to live through allocno a%dr%d\n",
               start, ira_max_point - 1, ALLOCNO_NUM (a),
               REGNO (ALLOCNO_REG (a)));
        }

I'll send a patch solving the problem after its testing.


-- 


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



More information about the Gcc-bugs mailing list