[Bug rtl-optimization/18577] [3.3 regression] variable use moved before initialization
--- 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
--- 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
--- 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
--- 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
--- 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
-- What|Removed |Added Target Milestone|--- |3.3.6 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18577