------- Comment #3 from rguenth at gcc dot gnu dot org 2007-03-12 15:35 ------- The problem is that for example FRE value numbers
void *p_4 = &a[0]; int *q_1 = (int *)p_4; p_4 with void* type (even if &a[0] is of int* type) and so re-generates the conversion to int* even though it is about to replace (int *)p_4 with p_4 (as tree_ssa_useless_type_conversion_1 is false for converting void* to int*). At the same time tree-combining the conversion (int *)&a[0] leads to &a[0] for which we have a value already, the void* p_4 :/ Maybe the new VN will fix this testcase as well. With the series of forwprop patches in my queue (which you obviously don't like at all, but I blame you for that) we get for (void) (TARGET_EXPR <D.2605, (double *) operator new (8, (void *) &a[i])>;, D.2605 != 0B ? try { *D.2605 = 0.0; } catch { operator delete ((void *) D.2605, (void *) &a[i]); }, D.2605 : D.2605;) instead of __p_5 = &a[i_3]; iftmp.3_6 = (double *) __p_5; if (iftmp.3_6 != 0B) goto <L1>; else goto <L2>; <L1>:; *iftmp.3_6 = 0.0; <L2>:; just a[i_3] = 0.0; -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31146