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

--- Comment #3 from Oleg Endo <oleg.e...@t-online.de> 2011-12-27 22:43:11 UTC 
---
Created attachment 26191
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26191
Proposed patch to improve some of the issues.

(In reply to comment #1)
> 
> [...]
> 
>   mov #-1,rn
>   negc rn,rm
>   tst #255,rm
> 
> which is essentially T_reg = T_reg.  Usually combine catches such
> situation, but negc might be too complex for combine.
> For this case, replacing current movnegt expander by insn, splitter
> and peephole something like
> 
> [...]
>
> the above useless sequence could be removed, though we will miss
> the chance that the -1 can be CSE-ed when the cstore value is
> used.  This will cause a bit worse code for the loop like
> 
> int
> foo (int *a, int x, int n)
> {
>   int i;
>   int count;
> 
>   for (i = 0; i < n; i++)
>     count += (*(a + i) != x);
> 
>   return count;
> }
> 

Thanks for your ideas and comments.  It was really useful.

The attached patch removes the useless sequence and still allows the -1
constant to be CSE-ed for such cases as the example function above.

I haven't ran all tests on it yet, but CSiBE shows average code size reduction
of approx. -0.1% for -m4* with some code size increases in some files.
Would something like that be OK for stage 3?

Reply via email to