[Bug rtl-optimization/27616] [4.1/4.2 Regression] Internal error with -O1 (CSE)

2006-08-08 Thread ebotcazou at gcc dot gnu dot org


--- 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)

2006-08-08 Thread pinskia at gcc dot gnu dot org


--- 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)

2006-08-08 Thread ebotcazou at gcc dot gnu dot org


--- 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)

2006-08-06 Thread ebotcazou at gcc dot gnu dot org


--- 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)

2006-07-14 Thread steven at gcc dot gnu dot org


--- 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)

2006-07-13 Thread janis at gcc dot gnu dot org


--- 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)

2006-07-07 Thread pinskia at gcc dot gnu dot org


--- 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)

2006-06-04 Thread steven at gcc dot gnu dot org


--- 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)

2006-06-04 Thread mmitchel at gcc dot gnu dot org


-- 

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)

2006-06-04 Thread kazu at gcc dot gnu dot org


-- 

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)

2006-05-24 Thread mmitchel at gcc dot gnu dot org


--- 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)

2006-05-19 Thread kazu at gcc dot gnu dot org


--- 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)

2006-05-18 Thread kazu at gcc dot gnu dot org


-- 

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)

2006-05-15 Thread pinskia at gcc dot gnu dot org


--- 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)

2006-05-15 Thread pinskia at gcc dot gnu dot org


--- 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