dl@ROCKY.OSWEGO.EDU (Doug Lea) (03/21/89)
gcc (1.34) and g++ (1.34.1) (Vax750, 4.3BSD) appear to ignore the fact that functions are `const' when they have been inlined. Here is an example where this detrimentally impacts optimization, especially strength reduction. ------ file t321.c struct mat { double * d; int r, c; }; static int const rows(struct mat* m) { return m->r; } static int const cols(struct mat* m) { return m->c; } static inline int const il_rows(struct mat* m) { return m->r; } static inline int const il_cols(struct mat* m) { return m->c; } void fill1(struct mat* m, double x) /* paradoxically, the faster version */ { int i, j; for (i = 0; i < rows(m); ++i) for (j = 0; j < cols(m); ++j) *(m->d + (i * cols(m) + j)) = x; } void fill2(struct mat* m, double x) { int i, j; for (i = 0; i < il_rows(m); ++i) for (j = 0; j < il_cols(m); ++j) *(m->d + (i * il_cols(m) + j)) = x; } ------ after gcc -O -S -fstrength-reduce t321.c on a Vax #NO_APP gcc_compiled.: .text .align 1 _rows: .word 0x0 movl 4(ap),r1 movl 4(r1),r0 ret .align 1 _cols: .word 0x0 movl 4(ap),r1 movl 8(r1),r0 ret .align 1 .globl _fill1 _fill1: .word 0xfc0 movl 4(ap),r9 movd 8(ap),r10 clrl r8 pushl r9 calls $1,_cols movl r0,r7 clrl r6 jbr L5 L12: clrl r1 movl r6,r2 jbr L8 L11: addl3 r2,r1,r0 movd r10,*(r9)[r0] incl r1 L8: cmpl r1,r7 jlss L11 addl2 r7,r6 incl r8 L5: pushl r9 calls $1,_rows cmpl r8,r0 jlss L12 ret .align 1 .globl _fill2 _fill2: .word 0x0 movl 4(ap),r3 movd 8(ap),r4 clrl r2 jbr L13 L26: clrl r1 jbr L18 L25: mull3 r2,8(r3),r0 addl2 r1,r0 movd r4,*(r3)[r0] incl r1 L18: cmpl r1,8(r3) jlss L25 incl r2 L13: cmpl r2,4(r3) jlss L26 ret