This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/21562] [4.0/4.1 Regression] Quiet bad codegen (unrolling + tail call interaction)
- From: "dalej at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 16 May 2005 21:44:55 -0000
- Subject: [Bug tree-optimization/21562] [4.0/4.1 Regression] Quiet bad codegen (unrolling + tail call interaction)
- References: <20050513235619.21562.dalej@gcc.gnu.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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