multi-word operations

David Edelsohn dje@watson.ibm.com
Sat Aug 15 00:17:00 GMT 1998


	I have been looking over the optimized PowerPC code that GCC
produces from your examples and it is equally hideous: load register with
zero, copy the zero register, compare the zero register against zero.  GCC
is recognizing that the shifts and zero-extends are producing zeros but it
is not propagating that information.

	I can see that combine.c should do some of this, but the IBM XLC
compiler *front-end* generates

	COMPARE [0,pseudo] [0,0]

for

        int f2(long long foo, unsigned int x)
        {
          return (foo & x) != 0;
        }

when targeting 32-bits.  The front-end can and should deduce the zero
value in this case.

	In the case of the f1 example,

        int f1(unsigned long long foo)
        {
          return (foo >> 32) != 0;
        }

IBM's backend optimization recognizes that shifting the quantity will
produce a zero and later removes the useless compare.

	This latter one seems like a case of value / range propagation for
the most common cases of all zeros and all ones involving logical and
rotate / shift / insert / extract operations.

	Maybe SUBREG is the problem, but I don't understand why these
constant values cannot be propagated through SUBREGs.

David



More information about the Gcc mailing list