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