From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25334 invoked by alias); 12 Jun 2005 20:57:55 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 25307 invoked by uid 48); 12 Jun 2005 20:57:49 -0000 Date: Sun, 12 Jun 2005 20:57:00 -0000 From: "tkoenig at gcc dot gnu dot org" To: gcc-bugs@gcc.gnu.org Message-ID: <20050612205747.22041.tkoenig@gcc.gnu.org> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug tree-optimization/22041] New: Reverse loop order for increased efficiency X-Bugzilla-Reason: CC X-SW-Source: 2005-06/txt/msg01686.txt.bz2 List-Id: The loop in the following code $ cat stride.c void foo(float *a, float *b, int n, int stride_a, int stride_b) { int i; for (i=0; i:; *(float *) ivtmp.14 = *(float *) ivtmp.12; i = i + 1; ivtmp.12 = ivtmp.12 + ivtmp.18; ivtmp.14 = ivtmp.14 + ivtmp.17; if (n != i) goto ; else goto ; and (on i686-pc-linux-gnu): .L4: movl (%ecx), %eax incl %ebx addl %edi, %ecx movl %eax, (%edx) addl %esi, %edx cmpl %ebx, 16(%ebp) jne .L4 The code $ cat stride2.c void foo(float *a, float *b, int n, int stride_a, int stride_b) { int i; for (i=n; i>0; i--) { a[(n-i)*stride_a] = b[(n-i)*stride_b]; } } is translated to :; *(float *) ivtmp.16 = *(float *) ivtmp.14; i = i - 1; ivtmp.14 = ivtmp.14 + ivtmp.20; ivtmp.16 = ivtmp.16 + ivtmp.19; if (i != 0) goto ; else goto ; and further .L4: movl (%ebx), %eax addl %edi, %ebx movl %eax, (%ecx) addl %esi, %ecx decl %edx jne .L4 which saves one instruction and one load from memory. -- Summary: Reverse loop order for increased efficiency Product: gcc Version: 4.1.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tkoenig at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22041