[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #11 from ebotcazou at gcc dot gnu dot org 2006-08-08 11:12 --- Ugh. This is an oscillation with period 6 (not 3 as indicated in comment #3) between fold_rtx and fold_rtx_mem: #0 fold_rtx (x=0x55759dd4, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:3621 #1 0x081a640a in fold_rtx_mem (x=0x55759de0, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:3453 #2 0x081a8203 in fold_rtx (x=0x55759de0, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:3678 #3 0x081ad4d0 in fold_rtx (x=0x55759d8c, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:4283 #4 0x081a640a in fold_rtx_mem (x=0x55759d98, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:3453 #5 0x081a8203 in fold_rtx (x=0x55759d98, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:3678 #6 0x081ad4d0 in fold_rtx (x=0x55759dd4, insn=0x0) at /home/eric/svn/gcc/gcc/cse.c:4283 The fundamental problem is that fold_rtx operates recursively on its operands after equivalencing them, unlike the tree folder. More specifically: /* If we have (op reg const_int) for an associative OP and REG is known to be of similar form, we may be able to replace the operation with a combined operation. This may eliminate the intermediate operation if every use is simplified in this way. Note that the similar optimization done by combine.c only works if the intermediate operation's result has only one reference. */ This is a recipe for infinite loops and the code already contains a couple of kludges against that: /* If we have compiled a statement like if (x == (x mask1)), and now are looking at x mask2, we will have a case where the first operand of Y is the same as our first operand. Unless we detect this case, an infinite loop will result. */ if (XEXP (y, 0) == folded_arg0) break; [...] /* If Y contains our first operand (the most common way this can happen is if Y is a MEM), we would do into an infinite loop if we tried to fold it. So don't in that case. */ if (! reg_mentioned_p (folded_arg0, y)) y = fold_rtx (y, insn); I have another one for the -O1 case but it falls apart at -O2 because PRE hoists an equivalencing insn out of the extended BB under consideration. The problematic pattern is set (reg1) (plus (reg) (mem (plus (reg2) (const_int set (reg2) (plus (reg) (mem (plus (reg1) (const_int so in particular it defeats all the first order kludges like the above two. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #12 from pinskia at gcc dot gnu dot org 2006-08-08 18:33 --- *** Bug 28010 has been marked as a duplicate of this bug. *** -- pinskia at gcc dot gnu dot org changed: What|Removed |Added CC||jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #13 from ebotcazou at gcc dot gnu dot org 2006-08-08 18:52 --- *** Bug 28569 has been marked as a duplicate of this bug. *** -- ebotcazou at gcc dot gnu dot org changed: What|Removed |Added CC||sawada at icepp dot s dot u- ||tokyo dot ac dot jp http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #10 from ebotcazou at gcc dot gnu dot org 2006-08-06 20:15 --- Investigating. -- ebotcazou at gcc dot gnu dot org changed: What|Removed |Added AssignedTo|unassigned at gcc dot gnu |ebotcazou at gcc dot gnu dot |dot org |org Status|NEW |ASSIGNED Last reconfirmed|2006-05-15 15:53:09 |2006-08-06 20:15:17 date|| http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #9 from steven at gcc dot gnu dot org 2006-07-14 17:02 --- The patch identified in comment #8 can't have caused the CSE problem, but it probably exposed a latent bug. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #8 from janis at gcc dot gnu dot org 2006-07-14 00:20 --- A regression hunt on powerpc-linux using an i686-linux cross compiler identified this patch: http://gcc.gnu.org/viewcvs?view=revrev=102570 r102570 | hubicka | 2005-07-29 22:22:41 + (Fri, 29 Jul 2005) The compiler didn't segfault on the test system, but it did run for a very long time so the test script used by the regression hunt timed out after 5 seconds. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #7 from pinskia at gcc dot gnu dot org 2006-07-07 13:36 --- Janis, Could you do a regression hunt on this bug for me? Thanks, Andrew Pinski -- pinskia at gcc dot gnu dot org changed: What|Removed |Added CC||janis at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #6 from steven at gcc dot gnu dot org 2006-06-04 09:34 --- Would be fixed with fwprop due to not recursively calling fold_rtx. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
-- mmitchel at gcc dot gnu dot org changed: What|Removed |Added Priority|P3 |P1 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
-- kazu at gcc dot gnu dot org changed: What|Removed |Added AssignedTo|kazu at gcc dot gnu dot org |unassigned at gcc dot gnu ||dot org Status|ASSIGNED|NEW http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #5 from mmitchel at gcc dot gnu dot org 2006-05-25 02:34 --- Will not be fixed in 4.1.1; adjust target milestone to 4.1.2. -- mmitchel at gcc dot gnu dot org changed: What|Removed |Added Target Milestone|4.1.1 |4.1.2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #4 from kazu at gcc dot gnu dot org 2006-05-19 19:36 --- Infinite recursion is going on in CSE. Here is what happens. At cse.c:4278 in fold_rtx, we have (gdb) call debug_rtx(x) (plus:SI (reg/v/f:SI 60 [ first ]) (const_int 4 [0x4])) (gdb) call debug_rtx(y) (plus:SI (reg/v/f:SI 60 [ first ]) (mem/s/j:SI (plus:SI (reg/v/f:SI 59 [ cur ]) (const_int 4 [0x4])) [0 variable.offset_next+0 S4 A32])) (gdb) Here we call fold_rtx (XEXP (y, 1), 0), where XEXP (y, 1) is (mem/s/j:SI (plus:SI (reg/v/f:SI 59 [ cur ]) (const_int 4 [0x4])) [0 variable.offset_next+0 S4 A32]) fold_rtx delegates all processing of MEMs to fold_rtx_mem, so fold_rtx_mem gets (mem/s/j:SI (plus:SI (reg/v/f:SI 59 [ cur ]) (const_int 4 [0x4])) [0 variable.offset_next+0 S4 A32]) fold_rtx_mem in turn calls fold_rtx with the address inside the MEM, which is: (plus:SI (reg/v/f:SI 59 [ cur ]) (const_int 4 [0x4])) [0 variable.offset_next+0 S4 A32]) fold_rtx later calls lookup_as_function on (reg/v/f:SI 59 [ cur ]), which returns (plus:SI (reg/v/f:SI 60 [ first ]) (mem/s/j:SI (plus:SI (reg/v/f:SI 60 [ first ]) (const_int 4 [0x4])) [0 variable.offset_next+0 S4 A32])) which is the same as what we started with. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
-- kazu at gcc dot gnu dot org changed: What|Removed |Added AssignedTo|unassigned at gcc dot gnu |kazu at gcc dot gnu dot org |dot org | Status|NEW |ASSIGNED http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #2 from pinskia at gcc dot gnu dot org 2006-05-15 15:53 --- Confirmed. -- pinskia at gcc dot gnu dot org changed: What|Removed |Added CC||pinskia at gcc dot gnu dot ||org Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Known to fail||4.1.0 4.2.0 Known to work||4.0.3 Last reconfirmed|-00-00 00:00:00 |2006-05-15 15:53:09 date|| Summary|Internal error with -O1 |[4.1/4.2 Regression] |(CSE) |Internal error with -O1 ||(CSE) Target Milestone|--- |4.1.1 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616
[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)
--- Comment #3 from pinskia at gcc dot gnu dot org 2006-05-15 15:59 --- Reduced testcase (without any preprocessed macros or includes): struct chunk_s { unsigned int size; int offset_next; }; typedef struct chunk_s chunk_t; void gcc_bug_test(chunk_t *first) { chunk_t * cur; char * first0; do { first0 = (char *) first; cur = (chunk_t *) (first-offset_next + first0); if ((chunk_t *) (first0 + cur-offset_next) != first) return ; first-offset_next = 0; } while (cur-size != 0); } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27616