This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/16807] New: [lno] Weird loop unrolling
- From: "falk at debian dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 28 Jul 2004 19:56:06 -0000
- Subject: [Bug tree-optimization/16807] New: [lno] Weird loop unrolling
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
gcc version 3.5-tree-ssa-lno 20040719 (merged 20040718)
For this code:
int g (int *p, int n) {
int r = 0, i;
for (i = 0; i < n; ++i)
r += p[i];
return r;
}
with -O3 -funroll-all-loops, I get:
g:
.frame $30,0,$26,0
.prologue 0
mov $31,$0
ble $17,$L4
lda $17,-1($17)
mov $31,$24
$L5:
ldl $23,0($16)
zapnot $17,15,$3
lda $2,1($24)
lda $3,1($3)
lda $24,7($2)
lda $4,1($2)
lda $5,2($2)
lda $6,3($2)
lda $7,4($2)
lda $8,5($2)
lda $22,6($2)
cmpeq $2,$3,$2
cmpeq $4,$3,$4
cmpeq $5,$3,$5
cmpeq $6,$3,$6
cmpeq $7,$3,$7
cmpeq $8,$3,$8
cmpeq $22,$3,$22
cmpeq $24,$3,$25
addl $0,$23,$0
lda $3,4($16)
bne $2,$L4
ldl $1,0($3)
lda $16,28($3)
addl $0,$1,$0
bne $4,$L4
ldl $1,4($3)
addl $0,$1,$0
bne $5,$L4
ldl $1,8($3)
addl $0,$1,$0
bne $6,$L4
ldl $1,12($3)
addl $0,$1,$0
bne $7,$L4
ldl $1,16($3)
addl $0,$1,$0
bne $8,$L4
ldl $1,20($3)
addl $0,$1,$0
bne $22,$L4
ldl $1,24($3)
addl $0,$1,$0
beq $25,$L5
.align 4
$L4:
ret $31,($26),1
.end g
which strikes me as an extremely weird way of unrolling a loop, and in fact
it takes twice the time as the code 3.5 generates, which is:
g:
.frame $30,0,$26,0
.prologue 0
mov $17,$25
ble $17,$L38
lda $17,-1($17)
cmple $25,1,$1
ldl $0,0($16)
lda $24,1($31)
and $17,7,$17
lda $23,4($16)
bne $1,$L4
addl $31,$17,$17
beq $17,$L5
cmpeq $17,1,$1
bne $1,$L31
cmpeq $17,2,$1
bne $1,$L32
cmpeq $17,3,$1
bne $1,$L33
cmpeq $17,4,$1
bne $1,$L34
cmpeq $17,5,$1
bne $1,$L35
cmpeq $17,6,$1
bne $1,$L36
ldl $1,4($16)
lda $23,8($16)
lda $24,2($31)
addl $0,$1,$0
$L36:
ldl $1,0($23)
addl $24,1,$24
lda $23,4($23)
addl $0,$1,$0
$L35:
ldl $1,0($23)
addl $24,1,$24
lda $23,4($23)
addl $0,$1,$0
$L34:
ldl $1,0($23)
addl $24,1,$24
lda $23,4($23)
addl $0,$1,$0
$L33:
ldl $1,0($23)
addl $24,1,$24
lda $23,4($23)
addl $0,$1,$0
$L32:
ldl $1,0($23)
addl $24,1,$24
lda $23,4($23)
addl $0,$1,$0
$L31:
ldl $2,0($23)
addl $24,1,$24
lda $23,4($23)
cmple $25,$24,$1
addl $0,$2,$0
bne $1,$L4
$L5:
ldl $1,0($23)
ldl $8,4($23)
addl $24,8,$24
ldl $6,8($23)
ldl $7,12($23)
cmple $25,$24,$22
ldl $4,16($23)
ldl $5,20($23)
addl $0,$1,$1
ldl $2,24($23)
ldl $3,28($23)
lda $23,32($23)
addl $1,$8,$1
addl $1,$6,$1
addl $1,$7,$1
addl $1,$4,$1
addl $1,$5,$1
addl $1,$2,$1
addl $1,$3,$0
beq $22,$L5
$L4:
ret $31,($26),1
$L38:
mov $31,$0
ret $31,($26),1
.end g
--
Summary: [lno] Weird loop unrolling
Product: gcc
Version: lno
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: falk at debian dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: alphaev68-unknown-linux-gnu
GCC host triplet: alphaev68-unknown-linux-gnu
GCC target triplet: alphaev68-unknown-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16807