This PR was originally opened against PRE (PR25809), but turns out PRE can't solve this problem, so here's a new PR instead:
In testcases that have reduction, like gcc.dg/vect/vect-reduc-2char.c and gcc.dg/vect-reduc-2short.c, the following casts appear: signed char sdiff; unsigned char ux, udiff; sdiff_0 = ... loop: # sdiff_41 = PHI <sdiff_39, sdiff_0>; ..... ux_36 = .... udiff_37 = (unsigned char) sdiff_41; udiff_38 = x_36 + udiff_37; sdiff_39 = (signed char) udiff_38; end_loop although these casts could be taken out of loop all together. i.e., transform the code into something like the following: signed char sdiff; unsigned char ux, udiff; sdiff_0 = ... udiff_1 = (unsigned char) sdiff_0; loop: # udiff_3 = PHI <udiff_2, udiff_1>; ..... ux_36 = .... udiff_2 = ux_36 + udiff_3; end_loop sdiff_39 = (signed char) udiff_2; see this discussion thread: http://gcc.gnu.org/ml/gcc-patches/2005-12/msg01827.html -- Summary: missed optimization: we don't move "invariant casts" out of loops Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dorit at il dot ibm dot com GCC host triplet: powerpc64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31873