This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/34176] [4.3 Regression] SCCVN breaks gettext
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 22 Nov 2007 14:00:47 -0000
- Subject: [Bug tree-optimization/34176] [4.3 Regression] SCCVN breaks gettext
- References: <bug-34176-10053@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #8 from rguenth at gcc dot gnu dot org 2007-11-22 14:00 -------
If you go through the SCCVN dump you realize that Michas analysis of the
problem
is correct btw:
SCC consists of: nitems_21 nitems_1 new_max_9 dest_10 destptr_3 destptr.2_16
dest.3_17 D.1581_18 D.1582_19 nitems_20 destptr_15
Value numbering nitems_21 stmt = nitems_21 = PHI <0(2), nitems_20(9)>
Setting value number of nitems_21 to 0
-- fine. nitems_20 is still VTOP ---
Value numbering nitems_1 stmt = nitems_1 = PHI <nitems_21(3), nitems_1(4)>
Setting value number of nitems_1 to 0
Value numbering new_max_9 stmt = new_max_9 = nitems_1 + len2_8;
RHS nitems_1 + len2_8 simplified to len2_8 has constants 0
Setting value number of new_max_9 to len2_8
Value numbering dest_10 stmt = dest_10 = foo (new_max_9);
Setting value number of dest_10 to dest_10
Value numbering destptr_3 stmt = destptr_3 = PHI <dest_10(6), destptr_15(7)>
Setting value number of destptr_3 to dest_10
--- also fine, destptr_15 is still VTOP ---
Value numbering destptr.2_16 stmt = destptr.2_16 = (long int) destptr_3;
Setting value number of destptr.2_16 to destptr.2_16
Value numbering dest.3_17 stmt = dest.3_17 = (long int) dest_10;
Setting value number of dest.3_17 to destptr.2_16
Value numbering D.1581_18 stmt = D.1581_18 = destptr.2_16 - dest.3_17;
RHS destptr.2_16 - dest.3_17 simplified to 0 has constants 0
Setting value number of D.1581_18 to 0
Value numbering D.1582_19 stmt = D.1582_19 = D.1581_18 /[ex] 8;
RHS D.1581_18 /[ex] 8 simplified to 0 has constants 0
Setting value number of D.1582_19 to 0
Value numbering nitems_20 stmt = nitems_20 = (size_t) D.1582_19;
RHS (size_t) D.1582_19 simplified to 0 has constants 0
Setting value number of nitems_20 to 0
--- also ok, this should be corrected later ---
Value numbering destptr_15 stmt = destptr_15 = destptr_3 + 8;
Setting value number of destptr_15 to destptr_15
--- now, destptr_15 is no longer VTOP! ---
Value numbering nitems_21 stmt = nitems_21 = PHI <0(2), nitems_20(9)>
Setting value number of nitems_21 to 0
Value numbering nitems_1 stmt = nitems_1 = PHI <nitems_21(3), nitems_1(4)>
Setting value number of nitems_1 to 0
Value numbering new_max_9 stmt = new_max_9 = nitems_1 + len2_8;
RHS nitems_1 + len2_8 simplified to len2_8 has constants 0
Setting value number of new_max_9 to len2_8
Value numbering dest_10 stmt = dest_10 = foo (new_max_9);
Setting value number of dest_10 to dest_10
Value numbering destptr_3 stmt = destptr_3 = PHI <dest_10(6), destptr_15(7)>
Setting value number of destptr_3 to destptr_3
--- correct, destptr_3 is no longer dest_10 ---
Value numbering destptr.2_16 stmt = destptr.2_16 = (long int) destptr_3;
Setting value number of destptr.2_16 to destptr.2_16
Value numbering dest.3_17 stmt = dest.3_17 = (long int) dest_10;
Setting value number of dest.3_17 to destptr.2_16
--- but whoops - why this? exactly because of the hashtable problem ---
Value numbering D.1581_18 stmt = D.1581_18 = destptr.2_16 - dest.3_17;
RHS destptr.2_16 - dest.3_17 simplified to 0 has constants 1
Setting value number of D.1581_18 to 0
Value numbering D.1582_19 stmt = D.1582_19 = D.1581_18 /[ex] 8;
RHS D.1581_18 /[ex] 8 simplified to 0 has constants 1
Setting value number of D.1582_19 to 0
Value numbering nitems_20 stmt = nitems_20 = (size_t) D.1582_19;
RHS (size_t) D.1582_19 simplified to 0 has constants 1
Setting value number of nitems_20 to 0
--- oh well - so we didn't correct nitems_20 to be non-null ---
Value numbering destptr_15 stmt = destptr_15 = destptr_3 + 8;
Setting value number of destptr_15 to destptr_15
Value numbering nitems_21 stmt = nitems_21 = PHI <0(2), nitems_20(9)>
Setting value number of nitems_21 to 0
--- and thus now are converged to a wrong solution. ---
Value numbering nitems_1 stmt = nitems_1 = PHI <nitems_21(3), nitems_1(4)>
Setting value number of nitems_1 to 0
Value numbering new_max_9 stmt = new_max_9 = nitems_1 + len2_8;
RHS nitems_1 + len2_8 simplified to len2_8 has constants 0
Setting value number of new_max_9 to len2_8
Value numbering dest_10 stmt = dest_10 = foo (new_max_9);
Setting value number of dest_10 to dest_10
Value numbering destptr_3 stmt = destptr_3 = PHI <dest_10(6), destptr_15(7)>
Setting value number of destptr_3 to destptr_3
Value numbering destptr.2_16 stmt = destptr.2_16 = (long int) destptr_3;
Setting value number of destptr.2_16 to destptr.2_16
Value numbering dest.3_17 stmt = dest.3_17 = (long int) dest_10;
Setting value number of dest.3_17 to destptr.2_16
Value numbering D.1581_18 stmt = D.1581_18 = destptr.2_16 - dest.3_17;
RHS destptr.2_16 - dest.3_17 simplified to 0 has constants 1
Setting value number of D.1581_18 to 0
Value numbering D.1582_19 stmt = D.1582_19 = D.1581_18 /[ex] 8;
RHS D.1581_18 /[ex] 8 simplified to 0 has constants 1
Setting value number of D.1582_19 to 0
Value numbering nitems_20 stmt = nitems_20 = (size_t) D.1582_19;
RHS (size_t) D.1582_19 simplified to 0 has constants 1
Setting value number of nitems_20 to 0
Value numbering destptr_15 stmt = destptr_15 = destptr_3 + 8;
Setting value number of destptr_15 to destptr_15
--- no changes. Now the final run with the correct table ---
Value numbering nitems_21 stmt = nitems_21 = PHI <0(2), nitems_20(9)>
Setting value number of nitems_21 to 0
--- ... as nitems_20 has a wrong final value number ---
Value numbering nitems_1 stmt = nitems_1 = PHI <nitems_21(3), nitems_1(4)>
Setting value number of nitems_1 to 0
Value numbering new_max_9 stmt = new_max_9 = nitems_1 + len2_8;
RHS nitems_1 + len2_8 simplified to len2_8 has constants 0
Setting value number of new_max_9 to len2_8
Value numbering dest_10 stmt = dest_10 = foo (new_max_9);
Setting value number of dest_10 to dest_10
Value numbering destptr_3 stmt = destptr_3 = PHI <dest_10(6), destptr_15(7)>
Setting value number of destptr_3 to destptr_3
Value numbering destptr.2_16 stmt = destptr.2_16 = (long int) destptr_3;
Setting value number of destptr.2_16 to destptr.2_16
Value numbering dest.3_17 stmt = dest.3_17 = (long int) dest_10;
Setting value number of dest.3_17 to dest.3_17
Value numbering D.1581_18 stmt = D.1581_18 = destptr.2_16 - dest.3_17;
Setting value number of D.1581_18 to D.1581_18
Value numbering D.1582_19 stmt = D.1582_19 = D.1581_18 /[ex] 8;
Setting value number of D.1582_19 to D.1582_19
Value numbering nitems_20 stmt = nitems_20 = (size_t) D.1582_19;
Setting value number of nitems_20 to nitems_20
Value numbering destptr_15 stmt = destptr_15 = destptr_3 + 8;
Setting value number of destptr_15 to destptr_15
All fine, but as nitems_20 has a wrong value-number from the optimistic
iteration we retain that and the wrong simplification.
Now, you are of course free to find another fix for this bug ;)
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Last reconfirmed|0000-00-00 00:00:00 |2007-11-22 14:00:47
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34176