http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45980

--- Comment #1 from Carrot <carrot at google dot com> 2010-10-18 06:24:04 UTC 
---
The replacement of constant loading with add operations is occurred at pass
postreload in function reload_cse_move2add. It is straight forward to extend
that to other ALU operations, such as not, and, or, xor, shift ...

But there is a problem as shown in this example. 

      context->state[0] = 0x67452301;    // r3
      context->state[1] = 0xEFCDAB89;
      context->state[2] = 0x98BADCFE;
      context->state[3] = 0x10325476;

After the first statement, value 0x67452301 is in register r3, and after the
second statement, value 0xEFCDAB89 is in r3, and the original value 0x67452301
is lost, so we can't get the third value by simple "movns r3, r3". We need some
form of register renaming at the same time.

Reply via email to