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

Reply via email to