[Bug tree-optimization/55162] Loop ivopts cuts off top bits of loop counter

2012-11-03 Thread olegendo at gcc dot gnu.org


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



--- Comment #4 from Oleg Endo olegendo at gcc dot gnu.org 2012-11-03 12:19:28 
UTC ---

(In reply to comment #3)



I've created a new PR 55190 for this.


[Bug tree-optimization/55162] Loop ivopts cuts off top bits of loop counter

2012-11-02 Thread olegendo at gcc dot gnu.org


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



Oleg Endo olegendo at gcc dot gnu.org changed:



   What|Removed |Added



 CC||pinskia at gcc dot gnu.org



--- Comment #3 from Oleg Endo olegendo at gcc dot gnu.org 2012-11-02 10:07:26 
UTC ---

(In reply to comment #2)

 For example, passing a virtual address 0x1000 and c = 0x8000 to the

 function should actually run over the address range 0x1000 .. 0x80001000,

 

 

 No it runs over the address range 0x1000 .. -1 and more as 0x8000 * 4

 wraps/overflows.  If x was char* then I would say there is a bug but this is

 int* which has a size of 4.



Ugh, sorry for the mess up.  Of course you're right.

I guess that the pointer wrap-around would fall into undefined behavior

category.  If so, then the loop counter adjustment could be left out entirely,

couldn't it?

My point is that the loop counter adjustment can become quite bloaty on SH:



struct X

{

  int a, b, c, d, e;

};



int test (X* x, unsigned int c)

{

  int s = 0;

  unsigned int i;

  for (i = 0; i  c; ++i)

s += x[i].b;

  return s;

}



results in:

tst r5,r5

bt/s.L4

mov r5,r1

shll2   r1

add r5,r1

mov.l   .L9,r2

shll2   r1

add #-20,r1

shlr2   r1

mul.l   r2,r1

mov.l   .L10,r2

add #4,r4

mov #0,r0

sts macl,r1

and r2,r1

add #1,r1

.L3:

mov.l   @r4,r2

dt  r1

add #20,r4

bf/s.L3

add r2,r0

rts

nop

.L4:

rts

mov #0,r0

.L11:

.align 2

.L9:

.long   214748365

.L10:

.long   1073741823


[Bug tree-optimization/55162] Loop ivopts cuts off top bits of loop counter

2012-11-01 Thread olegendo at gcc dot gnu.org


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



--- Comment #1 from Oleg Endo olegendo at gcc dot gnu.org 2012-11-01 10:11:46 
UTC ---

(In reply to comment #0)

 The same could be done on SH, too (comparing against the end address instead 
 of

 using a loop counter), but it would add a loop setup overhead.  In the optimal

 case the above function would result in the following SH code:

 

 tst r5,r5

 bt/s.L6

 mov #0,r0

 .L3:

 mov.l   @r4+,r1

 dt  r5

 bf/s.L3

 add r1,r0

 .L6:

 rts

 nop

 



... which is the case if '*x++' is used instead of 'x[i]':



int test (int* x, unsigned int c)

{

  int s = 0;

  unsigned int i;

  for (i = 0; i  c; ++i)

s += *x++;

  return s;

}


[Bug tree-optimization/55162] Loop ivopts cuts off top bits of loop counter

2012-11-01 Thread pinskia at gcc dot gnu.org


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



Andrew Pinski pinskia at gcc dot gnu.org changed:



   What|Removed |Added



 Status|UNCONFIRMED |RESOLVED

 Resolution||INVALID



--- Comment #2 from Andrew Pinski pinskia at gcc dot gnu.org 2012-11-02 
04:08:25 UTC ---

For example, passing a virtual address 0x1000 and c = 0x8000 to the

function should actually run over the address range 0x1000 .. 0x80001000,





No it runs over the address range 0x1000 .. -1 and more as 0x8000 * 4

wraps/overflows.  If x was char* then I would say there is a bug but this is

int* which has a size of 4.