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).