On Mon, Jan 4, 2010 at 12:02 PM, Andrew Haley <a...@redhat.com> wrote:
> On 01/04/2010 10:51 AM, Mark Colby wrote:
>> This sounds like a dumb question I know. However the following code
>> snippet results in many more machine instructions under 4.4.2 than under
>> 2.9.5 (I am running a cygwin->PowerPC cross):
>>
>>   typedef unsigned int U32;
>>   typedef union
>>   {
>>     U32 R;
>>     struct
>>     {
>>       U32 BF1:2;
>>       U32 :8;
>>       U32 BF2:2;
>>       U32 BF3:2;
>>       U32 :18;
>>     } B;
>>   } TEST_t;
>>   U32 testFunc(void)
>>   {
>>     TEST_t t;
>>     t.R=0;
>>     t.B.BF1=2;
>>     t.B.BF2=3;
>>     t.B.BF3=1;
>>     return t.R;
>>   }
>>
>> Output under 4.4.2 (powerpc-eabi-gcc-4-4-2 -O3 -S gcc-test.cpp -o
>> gcc-test-442.s):
>>
>>   li 0,2
>>   li 3,0
>>   rlwimi 3,0,30,0,1
>>   li 0,3
>>   rlwimi 3,0,20,10,11
>>   li 0,1
>>   rlwimi 3,0,18,12,13
>>   blr
>>
>> Output under 2.9.5 (powerpc-eabi-gcc-2-9-5 -O3 -S gcc-test.cpp -o
>> gcc-test-295.s):
>>
>>   lis 3,0x8034
>>   blr
>>
>> Is there any way to improve this behaviour? I have been using 2.9.5 very
>> successfully for years and am now looking at 4.4.2, but have many such
>> examples in my code (for clarity of commenting and maintainability).
>
> This is very strange.  On x86_64, gcc 4.4.1 generates
>
>        movl    $7170, %eax
>        ret
>
> This optimization is done by the first RTL cse pass.  I can't understand
> why it's not being done for your target.  I guess this will need a
> powerpc expert.

Known bug, see http://gcc.gnu.org/PR22141

I hope Jakub will finish this work for gcc 4.5.

Ciao!
Steven

Reply via email to