------- Comment #2 from pinskia at gcc dot gnu dot org 2005-11-01 14:54 ------- Actually it is "int*" and "int" and that mainly comes down to how we repesent (int*)[d]; If we change the code (we should be able to do this in the IR also, Daniel Berlin had a patch which did it): extern int abs (int __x); extern int bar (short*, short, int);
struct s { short int* top; short int* left; short int* diag; }; typedef int aar[]; typedef aar *aptr; typedef char par[]; typedef par *pptr; int foo (int *a, struct s* p, short int pv[6][16]) { int s = 0; int b; aptr a1; a1 = (aptr)(a); pptr p1= (pptr)(p); for (b = 0; b < 6; ++b) { int d; short int ps; if (abs (p->left[0] - p->diag[0]) < abs (p->diag[0] - p->top[0])) d = 1; else d = 2; (*a1)[b] = d; ps = (*p1)[d - 1]; s += bar (pv[b], ps, a[b]); } return s; } -- We get: .L12: movl $1, %eax xorl %edx, %edx ..... jl .L12 movl $2, %eax movl $1, %edx jmp .L5 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24609