[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-27 Thread ebotcazou at gcc dot gnu dot org

--- Additional Comments From ebotcazou at gcc dot gnu dot org  2004-11-27 
17:05 ---
See http://gcc.gnu.org/ml/gcc-patches/2004-11/msg02385.html


-- 
   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED


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


[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-27 Thread cvs-commit at gcc dot gnu dot org

--- Additional Comments From cvs-commit at gcc dot gnu dot org  2004-11-27 
16:59 ---
Subject: Bug 18577

CVSROOT:/cvs/gcc
Module name:gcc
Branch: gcc-3_3-branch
Changes by: [EMAIL PROTECTED]   2004-11-27 16:59:18

Modified files:
gcc: ChangeLog regclass.c regs.h unroll.c 
Added files:
gcc/testsuite/gcc.dg: loop-6.c 

Log message:
PR optimization/18577
* unroll.c (unroll_loop): Test both REGNO_LAST_UID and
REGNO_LAST_NOTE_UID to decide whether a pseudo is local
to the loop.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.16114.2.1027&r2=1.16114.2.1028
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/regclass.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.160.4.5&r2=1.160.4.6
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/regs.h.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.26.4.1&r2=1.26.4.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unroll.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.184.2.9&r2=1.184.2.10
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/loop-6.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=NONE&r2=1.1.4.1



-- 


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


[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-21 Thread ebotcazou at gcc dot gnu dot org

--- Additional Comments From ebotcazou at gcc dot gnu dot org  2004-11-21 
09:07 ---
> IIRC note luids are supposed to be a superset of regular luids, so your check
> should be redundant (see regclass.c:reg_scan_mark_refs).  Now something could
> have invalidated this relationship.

It's this chunk of code in load_mems:

  set = gen_move_insn (reg, best);
  set = loop_insn_hoist (loop, set);
  if (REG_P (best))
{
  for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p))
if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p))
  {
REGNO_LAST_UID (REGNO (best)) = INSN_UID (set);
break;
  }
}

which changes REGNO_LAST_UID without updating REGNO_LAST_NOTE_UID for pseudo 78.
 Note that there is no note mentioning pseudo 78 so REGNO_LAST_NOTE_UID points
to garbage after it is executed.

We could probably update REGNO_LAST_NOTE_UID too here, but there might be other
places with the same problem so I think your proposed fix is the safest one. 
I'm going to test it on x86.


-- 


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


[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-20 Thread ebotcazou at gcc dot gnu dot org

--- Additional Comments From ebotcazou at gcc dot gnu dot org  2004-11-21 
07:14 ---
> The bug seems to be caused by the loop unroller making a pseudo local
> to be able to duplicate it while it is still needed outside of the loop.
> Reverting Eric Botcazou's patch for rtl-optimization/11841, which is
> also about this, fixes the problem.

Thanks for investigating.

> I don't really understand what's going on, but is it possible we still have 
> to 
> look at the pseudo luids and not only the note luids? Like this?

IIRC note luids are supposed to be a superset of regular luids, so your check
should be redundant (see regclass.c:reg_scan_mark_refs).  Now something could
have invalidated this relationship.

-- 
   What|Removed |Added

 CC|ebotcazou at gcc dot gnu dot|
   |org |
 AssignedTo|unassigned at gcc dot gnu   |ebotcazou at gcc dot gnu dot
   |dot org |org
 Status|NEW |ASSIGNED


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


[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-20 Thread falk at debian dot org

--- Additional Comments From falk at debian dot org  2004-11-21 02:33 
---
The bug seems to be caused by the loop unroller making a pseudo local
to be able to duplicate it while it is still needed outside of the loop.
Reverting Eric Botcazou's patch for rtl-optimization/11841, which is
also about this, fixes the problem. I don't really understand what's going
on, but is it possible we still have to look at the pseudo luids and not
only the note luids? Like this?

diff -u -p -r1.184.2.9 unroll.c
--- unroll.c17 May 2004 21:05:48 -  1.184.2.9
+++ unroll.c21 Nov 2004 02:30:41 -
@@ -794,6 +794,8 @@ unroll_loop (loop, insn_count, strength_
   for (r = FIRST_PSEUDO_REGISTER; r < max_reg_before_loop; ++r)
if (REGNO_FIRST_UID (r) > 0 && REGNO_FIRST_UID (r) < max_uid_for_loop
&& REGNO_FIRST_LUID (r) >= copy_start_luid
+   && REGNO_LAST_UID (r) > 0 && REGNO_LAST_UID (r) < max_uid_for_loop
+   && REGNO_LAST_LUID (r) <= copy_end_luid
&& REGNO_LAST_NOTE_UID (r) > 0 && REGNO_LAST_NOTE_UID (r) <
max_uid_for_loop
&& REGNO_LAST_NOTE_LUID (r) <= copy_end_luid)
  {


-- 
   What|Removed |Added

 CC||ebotcazou at gcc dot gnu dot
   ||org
 Status|UNCONFIRMED |NEW
 Ever Confirmed||1


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


[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization

2004-11-20 Thread pinskia at gcc dot gnu dot org


-- 
   What|Removed |Added

   Target Milestone|--- |3.3.6


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