public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-28 18:15 Richard Henderson
0 siblings, 0 replies; 8+ messages in thread
From: Richard Henderson @ 2002-06-28 18:15 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Richard Henderson <rth@redhat.com>
To: Richard Henderson <rth@twiddle.net>, davem@gcc.gnu.org,
gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org, rusty@rustcorp.com.au,
gcc-gnats@gcc.gnu.org, gcc-patches@gcc.gnu.org
Cc:
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Fri, 28 Jun 2002 17:48:24 -0700
On Thu, Jun 27, 2002 at 10:11:26AM +0930, Alan Modra wrote:
> Were you suggesting to remove the n_iterations == 2 case?
No, just didn't feel like typing it.
Patch is ok.
r~
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-26 19:26 Alan Modra
0 siblings, 0 replies; 8+ messages in thread
From: Alan Modra @ 2002-06-26 19:26 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Alan Modra <amodra@bigpond.net.au>
To: Richard Henderson <rth@twiddle.net>
Cc: davem@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org,
rusty@rustcorp.com.au, gcc-gnats@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Thu, 27 Jun 2002 10:11:26 +0930
On Wed, Jun 26, 2002 at 10:54:53AM -0700, Richard Henderson wrote:
> Need to use gen_int_mode here and for the final_value calulation.
Yes, we need the mask when the final val is a const_int, but
loop_info->initial_value may be an expression involving a reg. So in
that case we still need plus_constant. I've also tweaked
"INTVAL (increment) == 0" to "increment == const0_rtx". Were you
suggesting to remove the n_iterations == 2 case? It's actually useful
in weird loops like
extern int *arr;
int i = 0;
do arr[i++] = 0; while (i == 1);
and possibly other cases I haven't thought of. On powerpc, the array
initialisation is unrolled.
OK now?
Index: gcc/unroll.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unroll.c,v
retrieving revision 1.168
diff -u -p -r1.168 unroll.c
--- gcc/unroll.c 15 Jun 2002 01:10:49 -0000 1.168
+++ gcc/unroll.c 26 Jun 2002 23:44:55 -0000
@@ -3941,12 +3941,6 @@ loop_iterations (loop)
}
return 0;
}
- else if (comparison_code == EQ)
- {
- if (loop_dump_stream)
- fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
- return 0;
- }
else if (GET_CODE (final_value) != CONST_INT)
{
if (loop_dump_stream)
@@ -3957,6 +3951,43 @@ loop_iterations (loop)
fprintf (loop_dump_stream, ".\n");
}
return 0;
+ }
+ else if (comparison_code == EQ)
+ {
+ rtx inc_once;
+
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
+
+ inc_once = gen_int_mode (INTVAL (initial_value) + INTVAL (increment),
+ GET_MODE (iteration_var));
+
+ if (inc_once == final_value)
+ {
+ /* The iterator value once through the loop is equal to the
+ comparision value. Either we have an infinite loop, or
+ we'll loop twice. */
+ if (increment == const0_rtx)
+ return 0;
+ loop_info->n_iterations = 2;
+ }
+ else
+ loop_info->n_iterations = 1;
+
+ if (GET_CODE (loop_info->initial_value) == CONST_INT)
+ loop_info->final_value
+ = gen_int_mode ((INTVAL (loop_info->initial_value)
+ + loop_info->n_iterations * INTVAL (increment)),
+ GET_MODE (iteration_var));
+ else
+ loop_info->final_value
+ = plus_constant (loop_info->initial_value,
+ loop_info->n_iterations * INTVAL (increment));
+ loop_info->final_equiv_value
+ = gen_int_mode ((INTVAL (initial_value)
+ + loop_info->n_iterations * INTVAL (increment)),
+ GET_MODE (iteration_var));
+ return loop_info->n_iterations;
}
/* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */
--
Alan Modra
IBM OzLabs - Linux Technology Centre
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-26 12:58 Richard Henderson
0 siblings, 0 replies; 8+ messages in thread
From: Richard Henderson @ 2002-06-26 12:58 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Richard Henderson <rth@twiddle.net>
To: davem@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org,
rusty@rustcorp.com.au, gcc-gnats@gcc.gnu.org, gcc-patches@gcc.gnu.org
Cc:
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Wed, 26 Jun 2002 10:54:53 -0700
On Wed, Jun 26, 2002 at 06:02:10PM +0930, Alan Modra wrote:
> + if (((INTVAL (initial_value) + INTVAL (increment))
> + & (((unsigned HOST_WIDE_INT) 1
> + << (GET_MODE_BITSIZE (GET_MODE (iteration_var)) - 1)
> + << 1) - 1)) == INTVAL (final_value))
Need to use gen_int_mode here and for the final_value calulation.
Suggest something like
rtx incone = gen_int_mode (INTVAL (initial_value) + INTVAL (increment),
GET_MODE (iteration_var));
if (incone == final_value)
{
...
}
else
{
loop_info->n_iterations = 1;
loop_info->final_value = incone;
loop_info->final_equiv_value = incone;
return 1;
}
r~
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-26 3:06 Alan Modra
0 siblings, 0 replies; 8+ messages in thread
From: Alan Modra @ 2002-06-26 3:06 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Alan Modra <amodra@bigpond.net.au>
To: davem@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org,
rth@twiddle.net, rusty@rustcorp.com.au, gcc-gnats@gcc.gnu.org,
gcc-patches@gcc.gnu.org
Cc:
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Wed, 26 Jun 2002 18:02:10 +0930
On Wed, Jun 26, 2002 at 01:17:00PM +0930, Alan Modra wrote:
> Bah, that's too simplistic. Patch withdrawn.
This one is better. Handles horrible loops like:
extern int *arr;
int i;
i = 0;
do
{
arr[i] = 0;
i++;
}
while (i == 1);
I'm also setting loop_info->final_value and
loop_info->final_equiv_value as they were reset to zero earlier.
bootstrapped and regression tested i686-linux.
* unroll.c (loop_iterations): Handle EQ loops.
Index: gcc/unroll.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unroll.c,v
retrieving revision 1.168
diff -u -p -r1.168 unroll.c
--- gcc/unroll.c 15 Jun 2002 01:10:49 -0000 1.168
+++ gcc/unroll.c 26 Jun 2002 04:58:40 -0000
@@ -3941,12 +3941,6 @@ loop_iterations (loop)
}
return 0;
}
- else if (comparison_code == EQ)
- {
- if (loop_dump_stream)
- fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
- return 0;
- }
else if (GET_CODE (final_value) != CONST_INT)
{
if (loop_dump_stream)
@@ -3957,6 +3951,34 @@ loop_iterations (loop)
fprintf (loop_dump_stream, ".\n");
}
return 0;
+ }
+ else if (comparison_code == EQ)
+ {
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
+
+ if (((INTVAL (initial_value) + INTVAL (increment))
+ & (((unsigned HOST_WIDE_INT) 1
+ << (GET_MODE_BITSIZE (GET_MODE (iteration_var)) - 1)
+ << 1) - 1)) == INTVAL (final_value))
+ {
+ /* The iterator value once through the loop is equal to the
+ comparision value. Either we have an infinite loop, or
+ we'll loop twice. */
+ if (INTVAL (increment) == 0)
+ return 0;
+ loop_info->n_iterations = 2;
+ }
+ else
+ loop_info->n_iterations = 1;
+
+ loop_info->final_value
+ = plus_constant (loop_info->initial_value,
+ loop_info->n_iterations * INTVAL (increment));
+ loop_info->final_equiv_value
+ = GEN_INT (INTVAL (initial_value)
+ + loop_info->n_iterations * INTVAL (increment));
+ return loop_info->n_iterations;
}
/* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */
--
Alan Modra
IBM OzLabs - Linux Technology Centre
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-25 21:29 Alan Modra
0 siblings, 0 replies; 8+ messages in thread
From: Alan Modra @ 2002-06-25 21:29 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Alan Modra <amodra@bigpond.net.au>
To: davem@gcc.gnu.org, gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org,
rth@twiddle.net, rusty@rustcorp.com.au, gcc-gnats@gcc.gnu.org,
gcc-patches@gcc.gnu.org
Cc:
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Wed, 26 Jun 2002 13:17:00 +0930
On Wed, Jun 26, 2002 at 12:54:56PM +0930, Alan Modra wrote:
> On Tue, Jun 25, 2002 at 04:21:32PM -0000, davem@gcc.gnu.org wrote:
> > Synopsis: Run once loop should *always* be unrolled
>
> This patch cures the problem. bootstrap i686-linux in progress.
>
> * unroll.c (loop_iterations): Handle EQ loops.
Bah, that's too simplistic. Patch withdrawn.
--
Alan Modra
IBM OzLabs - Linux Technology Centre
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-25 20:56 Alan Modra
0 siblings, 0 replies; 8+ messages in thread
From: Alan Modra @ 2002-06-25 20:56 UTC (permalink / raw)
To: nobody; +Cc: gcc-prs
The following reply was made to PR optimization/7120; it has been noted by GNATS.
From: Alan Modra <amodra@bigpond.net.au>
To: davem@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org,
nobody@gcc.gnu.org, rth@twiddle.net, rusty@rustcorp.com.au,
gcc-gnats@gcc.gnu.org
Cc: gcc-patches@gcc.gnu.org
Subject: Re: optimization/7120: Run once loop should *always* be unrolled
Date: Wed, 26 Jun 2002 12:54:56 +0930
On Tue, Jun 25, 2002 at 04:21:32PM -0000, davem@gcc.gnu.org wrote:
> Synopsis: Run once loop should *always* be unrolled
This patch cures the problem. bootstrap i686-linux in progress.
* unroll.c (loop_iterations): Handle EQ loops.
Index: gcc/unroll.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/unroll.c,v
retrieving revision 1.168
diff -u -p -r1.168 unroll.c
--- gcc/unroll.c 15 Jun 2002 01:10:49 -0000 1.168
+++ gcc/unroll.c 26 Jun 2002 03:19:38 -0000
@@ -3941,12 +3941,6 @@ loop_iterations (loop)
}
return 0;
}
- else if (comparison_code == EQ)
- {
- if (loop_dump_stream)
- fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
- return 0;
- }
else if (GET_CODE (final_value) != CONST_INT)
{
if (loop_dump_stream)
@@ -3957,6 +3951,15 @@ loop_iterations (loop)
fprintf (loop_dump_stream, ".\n");
}
return 0;
+ }
+ else if (comparison_code == EQ)
+ {
+ if (loop_dump_stream)
+ fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n");
+ if (INTVAL (increment) == 0)
+ return 0;
+ loop_info->n_iterations = 1;
+ return loop_info->n_iterations;
}
/* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */
--
Alan Modra
IBM OzLabs - Linux Technology Centre
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-25 9:26 davem
0 siblings, 0 replies; 8+ messages in thread
From: davem @ 2002-06-25 9:26 UTC (permalink / raw)
To: gcc-bugs, gcc-prs, nobody, rth, rusty
Synopsis: Run once loop should *always* be unrolled
State-Changed-From-To: open->analyzed
State-Changed-By: davem
State-Changed-When: Tue Jun 25 09:21:31 2002
State-Changed-Why:
Verified on sparc-linux with 3.1 branch
and mainline sources.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7120
^ permalink raw reply [flat|nested] 8+ messages in thread
* optimization/7120: Run once loop should *always* be unrolled
@ 2002-06-25 9:21 rusty
0 siblings, 0 replies; 8+ messages in thread
From: rusty @ 2002-06-25 9:21 UTC (permalink / raw)
To: gcc-gnats; +Cc: rth
>Number: 7120
>Category: optimization
>Synopsis: Run once loop should *always* be unrolled
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: pessimizes-code
>Submitter-Id: net
>Arrival-Date: Tue Jun 25 09:16:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Rusty Russell
>Release: gcc 3.0.4, gcc 2.95.4
>Organization:
>Environment:
ppc-linux, i386-linux
>Description:
Run-once loop should *always* be unrolled, and isn't:
/* gcc -S -dL -O2 */
#define NR_CPUS 1
extern void some_func(void);
void func(void)
{
unsigned int cpu;
for (cpu = 0; cpu < NR_CPUS; cpu++)
some_func();
}
foo.s: .file "foo.c"
gcc2_compiled.:
.section ".text"
.align 2
.globl func
.type func,@function
func:
stwu 1,-16(1)
mflr 0
stw 31,12(1)
stw 0,20(1)
li 31,0
.L6:
bl some_func
addic. 31,31,1
bc 12,2,.L6
lwz 0,20(1)
mtlr 0
lwz 31,12(1)
la 1,16(1)
blr
.Lfe1:
.size func,.Lfe1-func
.ident "GCC: (GNU) 2.95.4 20011002 (Debian prerelease)"
>How-To-Repeat:
Compile, browse source & .loop file.
RTH says the (< 1) test becomes (== 0), and breaks the unroll.
>Fix:
Please 8)
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/x-csrc; name="foo.c.loop"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="foo.c.loop"
Cjs7IEZ1bmN0aW9uIGZ1bmMKCgpMb29wIGZyb20gMTAgdG8gMzA6IDQgcmVhbCBpbnNucy4KQ29u
dGludWUgYXQgaW5zbiAyMS4KSW5zbiAyNDogcG9zc2libGUgYml2LCByZWcgODIsIGNvbnN0ID0x
ClJlZyA4MjogYml2IHZlcmlmaWVkCkJpdiA4MiBpbml0aWFsaXplZCBhdCBpbnNuIDk6IGluaXRp
YWwgdmFsdWUgMApMb29wIGl0ZXJhdGlvbnM6IEVRIGNvbXBhcmlzb24gbG9vcC4KQ2FuIHJldmVy
c2UgbG9vcApDYW5ub3QgZWxpbWluYXRlIGJpdiA4MjogYml2IHVzZWQgaW4gaW5zbiAxMi4KU29y
dGVkIGNvbWJpbmUgc3RhdGlzdGljczoKCgoKTG9vcCBmcm9tIDEwIHRvIDMwOiA0IHJlYWwgaW5z
bnMuCkNvbnRpbnVlIGF0IGluc24gMjEuCkluc24gMjQ6IHBvc3NpYmxlIGJpdiwgcmVnIDgyLCBj
b25zdCA9MQpSZWcgODI6IGJpdiB2ZXJpZmllZApCaXYgODIgaW5pdGlhbGl6ZWQgYXQgaW5zbiA5
OiBpbml0aWFsIHZhbHVlIDAKTG9vcCBpdGVyYXRpb25zOiBFUSBjb21wYXJpc29uIGxvb3AuCkNh
biByZXZlcnNlIGxvb3AKQ2Fubm90IGVsaW1pbmF0ZSBiaXYgODI6IGJpdiB1c2VkIGluIGluc24g
MTIuClNvcnRlZCBjb21iaW5lIHN0YXRpc3RpY3M6CgppbnNlcnRfYmN0IDA6IEJDVCBpbnN0cnVt
ZW50YXRpb24gZmFpbGVkOiBmdW5jdGlvbiBjYWxsIGluIGxvb3AKCihub3RlIDIgMCAzICIiIE5P
VEVfSU5TTl9ERUxFVEVEKQoKKG5vdGUgMyAyIDQgIiIgTk9URV9JTlNOX0ZVTkNUSU9OX0JFRykK
Cihub3RlIDQgMyA2ICIiIE5PVEVfSU5TTl9ERUxFVEVEKQoKKG5vdGUgNiA0IDQyIDAgTk9URV9J
TlNOX0JMT0NLX0JFRykKCihub3RlIDQyIDYgOSBbYmIgMF0gTk9URV9JTlNOX0JBU0lDX0JMT0NL
KQoKKGluc24gOSA0MiAzOCAoc2V0IChyZWcvdjpTSSA4MikKICAgICAgICAoY29uc3RfaW50IDAg
WzB4MF0pKSA0MjMge21vdnNpKzF9IChuaWwpCiAgICAoZXhwcl9saXN0OlJFR19FUVVBTCAoY29u
c3RfaW50IDAgWzB4MF0pCiAgICAgICAgKG5pbCkpKQoKKG5vdGUgMzggOSAxMCAiIiBOT1RFX0lO
U05fREVMRVRFRCkKCihub3RlIDEwIDM4IDE2ICIiIE5PVEVfSU5TTl9MT09QX0JFRykKCihjb2Rl
X2xhYmVsIDE2IDEwIDQzIDYgIiIgW251bSB1c2VzOiAxXSkKCihub3RlIDQzIDE2IDE5IFtiYiAx
XSBOT1RFX0lOU05fQkFTSUNfQkxPQ0spCgooY2FsbF9pbnNuIDE5IDQzIDIxIChwYXJhbGxlbFsg
CiAgICAgICAgICAgIChjYWxsIChtZW06U0kgKHN5bWJvbF9yZWY6U0kgKCJzb21lX2Z1bmMiKSkg
MCkKICAgICAgICAgICAgICAgIChjb25zdF9pbnQgMCBbMHgwXSkpCiAgICAgICAgICAgICh1c2Ug
KGNvbnN0X2ludCAwIFsweDBdKSkKICAgICAgICAgICAgKGNsb2JiZXIgKHNjcmF0Y2g6U0kpKQog
ICAgICAgIF0gKSAtMSAobmlsKQogICAgKG5pbCkKICAgIChuaWwpKQoKKG5vdGUgMjEgMTkgMjQg
IiIgTk9URV9JTlNOX0xPT1BfQ09OVCkKCihpbnNuIDI0IDIxIDQxIChzZXQgKHJlZy92OlNJIDgy
KQogICAgICAgIChwbHVzOlNJIChyZWcvdjpTSSA4MikKICAgICAgICAgICAgKGNvbnN0X2ludCAx
IFsweDFdKSkpIC0xIChuaWwpCiAgICAobmlsKSkKCihub3RlIDQxIDI0IDEyICIiIE5PVEVfSU5T
Tl9MT09QX1ZUT1ApCgooaW5zbiAxMiA0MSAxMyAoc2V0IChyZWcvczpDQyA4MykKICAgICAgICAo
Y29tcGFyZTpDQyAocmVnL3Y6U0kgODIpCiAgICAgICAgICAgIChjb25zdF9pbnQgMCBbMHgwXSkp
KSAtMSAobmlsKQogICAgKG5pbCkpCgooanVtcF9pbnNuIDEzIDEyIDMwIChzZXQgKHBjKQogICAg
ICAgIChpZl90aGVuX2Vsc2UgKGVxIChyZWcvczpDQyA4MykKICAgICAgICAgICAgICAgIChjb25z
dF9pbnQgMCBbMHgwXSkpCiAgICAgICAgICAgIChsYWJlbF9yZWYgMTYpCiAgICAgICAgICAgIChw
YykpKSAtMSAobmlsKQogICAgKG5pbCkpCgoobm90ZSAzMCAxMyAzMyAiIiBOT1RFX0lOU05fTE9P
UF9FTkQpCgoobm90ZSAzMyAzMCAwIDAgTk9URV9JTlNOX0JMT0NLX0VORCkK
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2002-06-29 0:56 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-06-28 18:15 optimization/7120: Run once loop should *always* be unrolled Richard Henderson
-- strict thread matches above, loose matches on Subject: below --
2002-06-26 19:26 Alan Modra
2002-06-26 12:58 Richard Henderson
2002-06-26 3:06 Alan Modra
2002-06-25 21:29 Alan Modra
2002-06-25 20:56 Alan Modra
2002-06-25 9:26 davem
2002-06-25 9:21 rusty
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).