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