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 tree-optimization/21562] [4.0/4.1 Regression] Quiet bad codegen (unrolling + tail call interaction)


------- Additional Comments From dalej at gcc dot gnu dot org  2005-05-16 21:44 -------
OK, what happens is that tail call creates a block 0 with multiple predecessors, and the
out-of-ssa pass mangles that into this form:

  # BLOCK 0
  # PRED: 9 [14.9%]  (true,exec) 1 [29.0%]  (true,exec)
<L37>:;
  posD.1132 = aposD.1138;
  # SUCC: 12 [100.0%]  (fallthru)

  # BLOCK 12
  # PRED: 0 [100.0%]  (fallthru) ENTRY [100.0%]  (fallthru,exec)
<L38>:;
  *((intD.0 *) ((unsigned intD.3) posD.1132 * 4) + mrD.1133) = 1;

where ENTRY no longer falls into block 0, but is expected to jump to block 12.  Expand has no
idea such a thing is possible and falls through anyway.  While it's not obvious in 4.0 branch, the
addition of a verify_flow_info failure in mainline makes it apparent this is not supposed to happen.

One way to fix this is change tailcall so it splits block 0 instead of creating multiple predecessors
for it.  I'll go do that unless somebody has a better idea.


-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |dalej at gcc dot gnu dot org
                   |dot org                     |
             Status|NEW                         |ASSIGNED


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


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