This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Autoincrement examples


Michael Hayes writes:
 > I've also been tidying up a patch that I'm about to submit for a
 > separate autoincrement pass that is run as part of flow optimization.
 > This collects lists of register references within a basic block and
 > uses these lists to look for a sequence of memory references to merge
 > with an increment insn.  I found that this approach worked better than
 > scanning def-use chains.  

Here's the patches I was referring to.  There are three new files:
autoinc.c, ref.c, ref.h.  I've written this as a bolt-on to
life_analysis_1 since it completely replaces the autoinc code in
flow.c.

I'd be interested in folks' opinions to whether this is the best
approach or whether I'm barking up the wrong tree....

For starters, here the docs from autoinc.c:

  There are a number of transformations which can be made by
  this optimization:

  case A:
  *REG1; REG1 = REG1 + INC  => REG1 = REG1; *REG1++

  case B:
  *REG1; REG2 = REG1 + INC  => *REG1++; REG2 = REG1 
  where REG1 dies in the add insn.
  
  case C:  (very uncommon)
  *REG1; REG2 = REG1 + INC  => REG2 = REG1; *REG2++
  where REG1 is live after the add insn and where REG2 is not used
  between the first memref and the add insn.  This case requires
  a new move insn to be inserted before the first memref which makes
  REG2 live earlier.  However, this won't affect autoinc processing
  for REG2 since REG2 is not operand 1 of an add insn.

  case D:
  REG1 = REG1 + INC; *REG1  => REG1 = REG1; *++REG1
  
  case E:
  REG2 = REG1 + INC; *REG1  => *++REG1; REG2 = REG1
  where REG1 dies in the last memref and REG2 is not used between 
  the add insn and last memref.

  case F:
  *REG1; *(REG1 + INC)      =>  *REG1; *++REG1
  where REG1 dies in the last memref.

  This latter case is useful for DSP architectures which can handle
  multiple autoincrement addresses better than multiple indirect
  addresses.  This case could be handled by a separate, optional, scan
  of the register ref list.


  Note that strength_reduce in loop.c performs the following
  transformation which we try to undo:
  *R; R = R + 1; *R; R = R + 1  => *R; *(R + 1); R = R + 2

  However, the following is not transformed:
  R = R + 1; *R; R = R + 1; *R 


begin 644 autoinc.patch.gz
M'XL("--?ZS<``V%U=&]I;F,N<&%T8V@`W%S[5]M(EO[9.?M'%.FS:1O$PZ;I
M!!C28XRAV>6UMIET=J:/CBR5L099\DHRM#N3_WWOHTJJD@PDO=-S^BSG)-AR
M/>ZKOOO5K3+G<2!_.1"3*'G<\E\=_=]_7@UZ0S$)(WD@MN6=GVW[7IHG\;;_
MD.'3C!_>^?XVS^D\O$IEGH;R(8SO1`J_LC")17NK_7W[51!.)F+3%YN[8G,N
M-E-ZJH5=7U]7+QOM_?W][9W][<ZN:.\=[+P]Z.PU>(3-S<U:H^]$NPTM#K[K
MX!CFCSA.,A#6$9==L=-IM]N;[=V=MXZX'7:WA%C?ICG;N[M.>W=?8`<:GQY\
MUQ;P>O.5$-^$L1\M`BE>Y\D\D@];T]?6TU3ZR5WU81AG\>8D\NXR_&3#^,1;
MY`F\X0[PB=4M&6>YY]^K#^&30$["6`KUW/6GB_C>]:(H\<4O,_I=TQE:YJ$O
MPC@7<9+,W5GR(-UYH]&X&5R/KIO--/^EU3HDU7?;N\YN6ZDN=,^')`R@*[R4
M+D\[!XESF<)0X,'0AU;@4AI.T'B.4(/:8Z!ETL!]2")X%DD7C9)5Q+![S+ST
MWDWE7>9&(4CMY:Z,@Z('/)<Y=EJS.D7A!)K&7K3,PLQMFXHZ:`;ZKSY7&(>Y
MRV.Z#]+/DU3U%'HJL<[]H6.#?K(\7?BY]H98KP\Z3Y.Y=^?ETAV#;^X;MNQD
M)_4?"4;QMMO><W8[1;S]O_7"Z?E%7YGT#^J-ZE*R=!+-B2-B[.H0($)/26LK
MD+28.KMOOW,ZN^]V]'(28GM=?)#BT8.EZ$6AEXEBK#">).F,70BO!(CG12*0
M7@`*)*D4,@IG84P-&*IP/#(2C61(15J#,T35!:;`A:A>X/I)(+D3C3D1S37X
M/$KHHQE`7"Z#%GTF.!3\)`:KQKD[6<0^B8R38NB"SM^CSAT=O'\DG2M.^N=I
M7@V3E>M%-'&9<&3L[;]U.M_O[)61(52H9^&O$BP4Z/?C92[!9&`,+\H2@6$_
ME:G4YK#C&PSP-2Y7BF'`B\FA?D=Y`GM83ZJ=\<-/K_2GDS#-<G?N99D*@[W]
M?53P71D&_P(%G_#OBVIN\!.&(QSD-VK^+%H\XPN.B;=O]YS.6XT69,6W;]_A
MHSUM100Y,>B?N<?=X7G//;ZX[OVG:(8M<<1/\;U[=G%]W+TXY.9*C\\<Y*BH
MHAMN,L]A<8$OFDJDV!U[6>@S,BIKM@Z9D-`JODH>13Z5I):U=F$!>KZ_2`%7
MP6V7WCWP$^`H,US":!D!JJ9">OY4VY5F$C23R!-8\KC2C)4/T_NIA/&TN&`O
MB0`2!/!A!DQ2C\21A`E-3$&^F1<O!2@&(87S89"%&>1(E'&1R<#!%P3U@#=!
M*+."]EF>PY3(SIF+)F2#6,H`.P,^16YR[V`>EEE+<:;][R!=[Q0P_TTX`98F
MNK>C:_?\JN>>]'O:A.<3(JN"P.\AN9>!\"8H'H..(Q[!;(LL%SD:4?X"LB-K
MUD-II>4O<S`#F!Z'`?N!]9-%G+,N:PK)GL*Q3WH4PMRF.&1EU"\(I9_Z/]U`
M5.`[1[1;V*_Q21$36-:@ZEY)A?\0JK;%/_[Q)&[_1GW1M=N!?-B.%U'4^`#B
M7WI+(;X7.^\.=CL'G;<"C/&.S*(9O-\X34,QE',!6Y#.+FY!.N^PV7XUP&AT
M8Z6WG;W]73;J!AKO6B_.\5*`0F/(>6`;6A+XPEX4,\"2=`GZ3P`W8U]F#&BH
M[=G5+?:?PU).P62C*7HC@T69`DU2#E)`H+,L=^XE\V4:WDUST>RU2`5QFDHI
MALDD?T2P/@4O!-3'$>>@N^X6PU9OO`#SH^B7H3_U9"1NML2/WA*,W9QM3?'%
MGV'!@[T\I*_C1;K<\ORM^-<6@LT&2XGH8XJ*FO1Z6]R"W^#'$Q0J4T(=BF6R
M@#4:@RT"B">61(0YHL0VF(.(\A(&@$<@/@0CXAG(,,MP#GR#0Y_)6*;`1&X6
MXPA@Z@(8=YP!%($T^"2;DG8P#'9XRBR'0H;P>2H`^VC'VR',:7HY2IF2V9,8
M54;(`BI>-JUI62J#O)BFG29SD'P*HX$NCV$4B;%$A)LL(@?Z0EOQX7STX_7M
M2'2O/HH/W<&@>S7Z>`AM\VD"G\H'R2.%L%Y"&!CD3\$A2[`$#'#9'_1^A![=
MX_.+\]%'%/WT?'35'P[%Z?5`=,5-=S`Z[]U>=`?BYG9P<SWL0_`,)0HEE?!/
MV'%"GD@1[W,OC#*E[D?P70:B18#DWH-$5)?`G@`V((3GRY<=A*:,$E@>J**R
MWB&`/8G$`=6[OOEX?G4&D@(\P8H'%$I#")$\><&;CMC;%R.)T")N(L^78E,,
M%]AU=W<'#?Y288%4W%ZG93)"@L.41\2+V1@\C\J!];,BJ6;B<0JKAZ(9/#OS
M`LDQ)T!."`ESU1[PZ`(:@WF[!_1Z'1A!^Q!Y09OI05ML"`!6(8[>FT\/N>7&
MAC7(<7603GT0U<_^F+H]DH+T'G.LCEG(WI19&2S*R7H'0C0A]I>P*`&M9KPL
M7IC=>,HJ=$@%:W*P$Q)PE7A,$8@W%"T[V!+"@2@"#3*6^:-4"X0H'J(L("SU
MLW11J$J*I/)_%F&J`!A\*X&0`/?A&2%YC>FE3`D>Y0370&T"=OL,DB(/0^*1
M%M)+8:$BCO^8/,+R31T.A<<D_A8@;C*!7;).#;C3]153VE#)@$:")[ZM,P!)
MBEJU,0@AVDPOE3XZ.=#2V.&DPF=%5&ULX(N*J_L'I5)/#:-Z6HY_+JPBSW9/
MU:&%,]7JJ42!T=U6^=1:`^O-4MH6\PF0M?C4T/9E,8MY*'0`^S$\:4ZFJ0#B
MY+&3X0W`A#\%G/'S!026`0I3D#V2-,IL$>4A(M-*L@R]P`"\`*!?T3B,`XA5
M/^=@U6VM>/8)C2%J>3+*Z1X@*B1ER%>.RF%>Y(@,1**!%$H7O!N=`BDS5RI3
MFZLD5[D+TIJ,[_(I;):#A8\RB2A)YEL0OS)%+,QX@201,!4=RS90*I,`F\P!
M0&"1`60GVG,00QA`X#4"">.M0C#R*[YOE9]UM)S&,C-DT*%5B"$#%=1/3(5O
MBQ3P;U;MUT_B27A7K0AG2S#=K/HTS:/J(UV$J#ZG[=4F;:^J'U$=>O6TN`VL
M/U.U;/OAA!_A4U601M[..X#CVS.QH_.=>/"B,,""&S#!^$Y2Z"9QM%0A!?GR
M)Q>)QEG?A=WK4'`S16'9M4B`:)(`*1AV&/1[UV?N]4T?.,W)4*R+/9UDJ^(,
M^_]UV[_J]5WH)IJK^[:*T`1YAU1#7"`R)T"RHH!VNL(;(V="='R6>C.1P&W+
M+$1R04C0NS[IHQ(818/1A<`B`BUO@B)K/,)BXAL\S&7_4O=<,97BLP[!V/G5
M\$JW!?\"LXKU@M&)BBRDBJ0XKPL3PY-/U$@"$\$2"=4X!!<Z-E35!.8NW^!@
MY3N@IG-\]_G0M.)`@@EC)<O+VM*R!;R!5K_*-($]'<L=8QD!-^S`M+QQA-6%
M#X/3B^X9K\%XDUKCX)ZV#_$YH&%L<QZ&S(=B*'!B$';$]>GIL#_21DLF$RP^
M`01Q28H;\PBZ!QNZ1^T#V):F1,BU/K0]G8:`&:6QJ71EV19IJJK!9+@-@BW6
M8XHG0PX)Z2A!L`3MMW1M"DM-W*HH5]&@,YPPEBZI-RN<IGH8(QT^XV@`JAWN
MAYVH0'<DSOHC%ZWH#L__NP\;-ZZ4*F3$33>+HR7\I.>ESVZ'T&]T/>B[L#$8
MX7Y^T+_L7XW4..+-&VWN#37?$0J)S_'7>[&#XS:4<'J,0C<A(\R5]8E.^O9$
M.(CJ4DZYN6K*/\&4HCHG#/?\G/#O&=V>5XK[OCA^5:4GQ_]3?7Q#_L_L^RB3
M3SKLXKI[\J_P5SE/3;??S5\\Y^_FKF+X?ZJW4D91C<6?383M)3%0DYR0*(-M
M!Z4$@*RKVTN%5AD#(Q.[DI`!+^4::Z!S`R,S;/Z7HGMQ/ARI0IL)U<A*J?!4
M':T+PZG:#UI68RF1:\Y^BF_;W1Z]K,1-&:@1.&MDQIXX6_BXBT$^;,M3`5B0
MV(!53+Y8_YRXF+L=W&G?8<D=_O.0BSHX`Z%B6@"L2HNZDUC7KPJ/8[;#D:P'
MYOM*9A7K-)D%R#"OU1U%*)$96X1E:H6@L;-N9N$ORB+6CE"$.@ACA*BM-1=+
M<FEO1:FD8@4%/"1O*LMJG;PT=XL`:[:,!0!6YKL$-&:SL++1AJ2&\+Z3.1\S
M6R.`D#_\\`.60ZS]@N(W:+Q,5X2PN#5''AGP>8$7$510I0<B##3%S39-82L@
MXV"5^)^U):DF'%(&%"&L2O20"#<VZB95_G+AMV&$5<F4_/[7\.<MO7(MJ.5&
MO.0AP9Z??L3J=?$4<8P?J^REYB0KQO2*AG#$#=,%KPQLG!,)&:G94&#_A4,8
M?JER]F8Q.!K8$6^X8EX\!;QQ`,X</0]6T6N&YL-5;SZ/EFI<]RY-%G-PBK:U
MPKN=+P]S5`6V2O/#BI<@'K4;=ECJLH5QRB7&8VC'QV:GUP.7.'03F[<LMQFK
MZ0-$6O(H[O&_1_DMUUV#!,&1BC&L&FR($UH@)86$'QVBS:Q%3#)("!TYL#%N
MRXTQ,5^+KF;%,%3MQ?EIK>!ZP.7+A:E%IK??+A)J@C)5^]%58F-Q^DF*%8!Z
M10E;TBY-596J60;&+N4IQM<;<2K?_AW/=K`L`/LV>TG2DD.OB2,%:^Q#H9Y=
M]7\:*5?@$PJ/!AT5H\]<Z*X0!S]UP(>VLPB7:%Q7U=C(HYDCZH[%`%OI_LWW
M4SR,/&()28)GVU7PV4`W#!C)L+6(HS"^5PZ::+LY*F:PD*_V08C##BU=*E!A
MIS#GM*PZ<W*OXC73!OH/9N\&7*K$HV'<M/!Y%XQ!)Z-6/BT'>0D/<;"KZU%_
M6$&%(I&6(.,"2@Q<8A1-)8-&JR='L;<8:W1G`D9$\A%)%]\T*6T7F`$;<V!!
MS;(?*'Y)VV+>U$7&!FU3)[\,SSR6G`.-!>I%*3ASN6DP$\3"!84\GMGH+%6:
MBZ6L`2:.`#@)NTMW..CQS0^M^\ZSLI]/&`"H`$Q'5^"WS62.B#U?,LP8Z9)B
M(LQA(SDI/*!.TZ%OEM#I$->'YW/II:H*[8G7$&>O*;S@-8CWFM$F+);U:EW1
MK8`#7H0'XZC>21_=6^IG@/G$94G4:BWY&'FP4%JAOJ)&%LD=8K6(KQQD>97=
M`G&]H>!2Z^CJFEPK)0,1BP$PFNDS%)\I,Z_%&IW\27-7S"#(*Q0Q1N$-@LM'
M;B4OYHG1CI#/<8@VVHF:SO$$*Y!9'<1!$^JW)<Q*24E[M8K/2_PT`<XD5HU-
MDX-G8OHU:=/_'0?%PY?Y5U!@O@X#(U4Y+\(9-F\_]4''&@.F7MD06N85.LR5
M"S6U]8ZW57;=HN3+)5.W:+I)N@M*[FK*KNX"562W'A;LGG%K59WQYPJ&H?IE
M6@"N-^B?NHB`E[<7HW/WAOS4:9DMUHHVW<O^I6ZBW/@,7P+-Z,#D5.4H=(FB
M8I:>NN*C%N"=..*AQ?LC<7H^``IZ,^S?GERC"+#$^@,UXP_<#.^V(<+_E=[]
M+`X*R$<>T%2LDH4UP>V#HNMJKTB;1$47:B="NGJ*F0LO&&GSZ!MXY2)TRE.?
M&>QAQ[SGS+R9@9,>K=3VEAX%]QR4!22==&0BP0M,.&7,(ZDAVW1,6XS7Y!/6
MPE=)V:6MSP4J)XZEJMSYN,6GS\5Q$?H-]CDY<B[JR^UZK<(V>KM&LS#=ZQCG
MAWJ45>>4,262ZF:>MDTX"HB"'$)!7Q7ZZ8H.=J^5;GD(XV2;8QT##]F;"KPB
MHM^\*>+Y!'[?U%K6FAKABR2L?%3M^/36MXLB(2A#_QTNU_!)ILU&O2+\,5*_
M"2?V44;)6N>+/&L"<L$B>$T3G/PM?GV@7G?A-9#^/)`II[9O8..IR]A&\:TP
M$]L"JT85$]05.:XKPLR!SW+U/2H*%<\Z*VOH:*#B>N5DCLD!$G0(VC'?OK--
M@[*"PL1^:4:F*B_9B"UR_*Q%JG:WK?2D*7I/^!3OGES(_%M@!8`Y:L7RN2J9
MH;"4IN+^5.+50TSFEE&J![;4&ZQ7G"]]17STC?CHO6`-T]0FK%NV,OA6C0]K
MQ[1-FYV$&1Z;J)TIRK&(`6?0$/,4JT&T^(MS<@)<TIA8(]9=[OA$!,WQZ"VW
MMNP`,26M!;R!"F<8Y5PTP-B_OH6,HL*>;MRMWMACU;"^L3>+2[4SD2=/L8K/
MGCXP,7:%7#^P<*ACU$=X4M6"$CGD:%6QKS5&+8I+AK;VG1;N!LJF,RX?Z9.7
M>O/ZYE6)`JB)D0>_[,,#+B1Q5C8.1`ADR2DH7:M:B.9>*TK=Y6QK*^8K*U>U
M">GGN5G+OBNF71,KU2R*[O]D+<WIUNH3_AYJKE[VYE*^!>$^(66?)UG^F;_R
MLS3N0W-.-_:%*E.38'2A'A=OF:XI-'6!3(EG+Q>K?*8J'"L^A0RC5H(9J2L:
M8F&RUK)MAS1N`"@I&!L&C3)?7MUO&UM,_"G0"$^F#9YY<W$[W+X\O[H=(DNK
M;NI[UU?#4?=J](78M8J,PT3G5Z._="^>':&R_0=P1M3U!$M&)%@S03SSAHR=
MQ"%^4V8PNN"\AWB-%^U-?$8E$$EZ*Y`$)L4,2A-H^5G<3;7%XHT!/S,?@8@C
MOF8S"8%ARCA9W$V)DTM_D2-[U7M7RJW5G;>Q":R=,.'F'?:RF:K<U([7*S4J
MI#4J4O!_^@\><`*V6&(+]B?X`!;]7_C!4\5],\!79R`5Q#N_1Q:R@'W5'E&A
MS%/[0W-[V*B%(\M:3VRMPP)L&D2SJ%@4!,"90#9)]5]RSM\7LWEVB,(A&\$M
MRQRV+'@I)PX4_/$5?/RB!-Y\EM_BA@AY`_F6OM$U]GPN@'H1P)2NK]5I9QFY
M5!;$:/V/V\L;$OMI_9[)M954J\]D34]^85I_0DX">SK!`50I$E#YN3HS@5:T
MZ+$E(0RH-"*-"I%LR"AZ.+9Z_-S4R1*,M_-K1ZI`9>2B6M41?UZ@'BW[U*Y'
M93D(@=JE)%SL5`,M2E9E-?4'R\OZK.S9JS"\FHNK!P1(!]8%&4N+%ZZNE-;Q
M=<[^Q)["!$NG,"(!%I]#1--%ORKT-+BW>3U`0^?F45&`:I0Y77^Z87SZ64MB
M6G14O6$8,'4/%&/GE86_0GB\!':>WF?"N_/"F.9!2/P$`.<@Q?BL.$9]6>TP
MIUFA_JD7XFQX3RNE,C-=5P40GO/A,>ZE9G.T!.(_^&4;B4A!>Q0?H?NAND+C
MX)3>`PR,FCAT80VK"8NY*C9P5[RQYX=5&Y>WBZC5IY)@K;CVH^C8R?GPQKAW
MD9I^8E4;1=Q5J!A^HK!=E[)P'1>U+"899_TK7*X<`=OD4EX9#?(J"?BY'@$K
MA*]1R3^,[*4+?)/8,A7861'?)A(W"JJEE36";35D$SVTBI//\M%*RV>X::7E
M*IY:HZF5/LJJ^HXC_UAM-C96TW7F<<39F-3@-VSX.*&H6JK#(OMTH/%TJ;\T
M*CGC2$6'BJZ2.BL??2UMIE!HK%+2H-.V@U?<[^538P2R#"M,]'U,=:>7`2!`
M+(%F/@=0IFLQX81)`U(&^L,&>!/\'I&(KC'!,/B=H6H%`JUA5[;?'ZV\_+NR
MLF)=L]JI'3_=\'<HOO($"L7&)SR'/C7/S',=DQNK(W(:`R`U"\?J5O_7'/BH
M;WM@7;YVZO-;SW?*0Y@\R;VH?GB@SD^^YO1$/W3)G$>%+)OO]4-UI,"]5K!]
M:F0Q?IOKK[Z/JAD=%N-7L66UAFPI\\,"#O$LDL_4D,`^>BG[J_;-2R[5JYMY
M20'[RDV9D>-BRYY?<G"G%FBC8>]E@`,ZX@V>XZEU7P+XFC6+JJS;IJKF)U3T
M/ISS-[:1="43=3(4TBD';YWYA,;01N4!"W^JME]5^6_Q'<Y&O>[_7-F?-]T-
MPKAZ!)1>TPJQ4<%A7^.XQBJO$31^K>?RPG/8W1:6BA6F]PI0*V=A9?4*R(N&
M*FU75R=PS<J:+"BGA7>5?L^BWQ5Z<*@KP?XB3?&^>_$W,-"DYE?ZCP$EU3<8
ME%$1Q_4M_M76M[\:``F=UB)^$[+X4C(D5?H;#<;E?P?HXWAQ=\=TW?J3!,#D
MYPNZ4E.2RY7@J?\2@CL>F_Z+7?Z["&.Z+$I_#>'KD)0'L!Z-S0N@YM^;,.'6
M.&$OT-<ZL,4OB+-R*Y6W:T"FX"4H3N;`,'/UL2->_RT^-OSW[\$!G5>@N`9'
MHBL=B]E<]ZJCM[;:RM*;#JC*'V:`F,)P;-+)#:HRQ56J/R_NH_`^R/P3`GB0
MBC>L;F0Z]>89$BYU6S1=Q/0]-0B^@`ICA>/T.5"6S"3_F0@L=>B;L47(J0RM
MKY[^;WM7WMM&<NS_IC[%V(!C<DTYU@,"[)-66>B@-D)D29"HK/.R`3$627NT
M%*EPR(C"QM_]=1W=7=7'B+(WP":P@%U+,WU-=75U=1V_IA1\;[Y"6VLYG6%^
M-VWJWY-/&0YDF+8^G[W'@QJFM=Z6<S-)Y>2U5Q+1`4TRPW5CSEI#.!V94Q2J
M47"0JH:C.0&G!?2`"$2;5$K>&Q^S(M9B9#4#6;X;@2684_8;<[).^OX]`_!6
M\)UE;?K;!X<1J[[:74\O69>?C>"X-11\R/-US,TOAHG8\1J9&@<9A1_ATR^1
M@<@3IQ*9Y?*W*`'3H@_VFP84F$>DFJ[SJ'SS0C`MWAZ?W3T:_K815)+7S7!?
M",D!L^TVU?"[A)SRJP-&5NP&98M-2.'$5W_$L$CX=7,SEJEQ8+%$Z0ED:;B%
MJ-TCO\&85G]GB\ICF(N4D]OP;8GG)PJDA^3NR03+W-6CY7#F"(4T\JP8NGC'
M`SBB!)OC^_<4^4J_C:;#+FMD^/>'B9%^$P=^A4D$306@OMIOH_#K*!(P3ABH
M*?`1OAB!A"@9`#_NTDA[CG^H1Q3=K!W;"(92D=6OZ?`M@AH1'8AS&AKHDOX2
MO06B^(Y%MSP`XV>$V9,>`<+\<3>;+Y;3:E&%,Q@)Y?7U'35V*(EP*ZY..LA_
M_:4;.("<E^BGZ;J"NG@*3`^D+8<0/5O_:TJM"='S[1^^%1`]1T;2^J45+"G)
ME6B^8%0&.6=$HJ\H/5]1>KZB]/PF4'J<XN=9^WHV@3FODPN;%>Y2RFQP655&
M6:TFP'EBZ;/0]K`LKXM,XAM)#+M#3.&;X2LA"P2]:F;G^DCGIK(8SI9PR.!W
MN#=:@!K,2S&S@0W!&UA0-:=^8NTI)WU6`!%-HD#%PE$\.H2(RD\PS?B/P&7,
MV13DOK()*B*)3WT/-@U3(:V[L3H,7Z%C`_@,9N7C?5DC@9?3(1^"D%G-"BQ!
M(%IC#T*>H(D5-2$&&!UO0D"DD7K5U/)U;BX<,.7U?%;7EM(8OX!!>(KX,"2@
M.Q%SR&&XT!=2NI:D1L_%U?&A0UQAHSDMS$0^I,OE,E\D`(7^L:RN?YX\<'(1
MC&TL\Q8J5HO,B_8,N(;@ASK\V38@:./+4$ET?0%+HE\PPHA^Z"&N]?,&$).Y
M!2#QC\!HL&G:WZQ'BPB<I`DM.U<*]RSX'S7%EJ,`8A@T(?Y])RID4QK&`V>W
M;B@S7*.,X217QIU1.8.DA!`UY`^9U8LY)M+T1=D08_02`F.VM8\@X0&(\B=,
M-:&4_<JY`_BVO,?(&"X2V0M@W-[7"9_=]H$+D(,DTY!9;>1!?TI2[N#D;'^_
M=_$TZEV;,PSDZ_SG4]!^_N=1\8"!6C&]U8LK4`0>[D9H[^[_];S',"T4N:RH
MS)9B/@5AV!$(,'+3`KEF8T2W@9T(4QJK6O3#.9$@=JD=UD#\05'MJ[)C4(6<
M09`/F-2&/(55H*B"S@?X-$,'!X7)%DH;,-H=P#PO[XJ20+74/FS'%#KR$-;X
M%7(5PT:/`2H8';-&`X3^*.L:7@!%':>%^`-(*JBAGBC7.`6F<4/NEZSY60H@
M(/L@Z<^[,^3Q;Z")9344#CQ;TW!<6];K6(%+`KG].R%-NQB@,!NW7;\V!(G=
M247;O9!9!,*_+]\+LGB?DBS@J>3X->C`DZH0T82RC#+0`Z?J!0%X4LP+3BM*
M"QMK9W7!6WX=6EKSD))>4^]ADJ,+9HGR#?")3^VU7^7>F'IZWA.=!F76(@"H
M1C,T?'A:\!)G"A@6PE"XR].!49)$4KX-;V,>WO7A>H>]H]@H!R_-$>GX-)Y/
MN^/^S?3U]\#+(5]%1&A,56GHT&[?B0[5JTR'*:FK*%RGA2ZJWO:$_B3!RR<<
M.3-YJ?6;D%G-J\<'1GZ7WF@3T0,>D\7^:82\=Z/`OZ^*/^U='`ZPN\$I>@G:
M[/W5.VHJ6-,EW-,W8-*][<%EWK?"[6'='9]=S^E)68.;G[`M95G5.E&L^=D9
MZ!VL'UM+6#<`3#9$$7GW"-,-:4RKK@-I<!RT2O+3+Y8]^&Q%S*@RJU;*+86&
MXT4Y-V?NNKA#BT(-YP;>_Q"2$_4#^T4N[L>I3!C@C"O3'HOJUYD@?6`1C"#>
MN]@[.>F=V`#BM^KM_LF?;<I).%<>%(!X-F:R=W_I'9ST3GDBWW3(N5&Q9Z,B
MMT:KB&@,]3#LF.H9BG<$GH;\X,@F?/\1+"F)S[R\VC?LB_W]ZU]%_/[_>A=G
M`[./7>P=]/.E+H]_.%VC5/_B^*`_.#G[<0`F,9^T\<$%5#-%E!LJ;LB,N)-<
M'=S`RJX+N2ME_8J/+HD[S&&<KKT>ZB]8#A?]=_2QUSX8G#Y^I:EBL8I@H0KH
M(CY&)!-9WYKQR34.H44!R$+L:4DM\EAF:5`E7CI/6AUR?`X>MQXMZN8AQHMJ
ME5]2'&,5D=8MK!4O*QL(M!ZA6RE:16T*VJE8H#5Y4OJGGL20`!-4M'F[6/F]
M(L&AL1+@>3:O`6186G&RG6JXA>Z!D'HS#&Z.-6;"(8KK.B%@,7_V9&^_=V+6
M-6-#\]/+O[[=/XL?N_R.^&FBW.'9U?Y)3[TX/U!_[AT>7@S,W,8/#X^/CN0;
M*8Q53\0YOI@+508[)ULTT`D*T+-=O,@(/1^>&82BR-F'R(8EH$Q#36"6IGR>
M=XXS.0FM]U9K.,0THEB7!;1Z!/]ML$<9?J*<G8;M25+$E)=$4V-8V9ZY3]D'
M!/"OV86%P]132WB2VU'!PUY<,'KF$P"BLOIQ&(P>(AB/?+P$P468@HAM9IU6
MA`]`4PQF\/<DNXWH8VZQC@.\YZ5)BH>3&M#NO3G0_!R2CE0$]3$_HCIQ/WHY
M'V%N9+=P02PNS5T/`G#OJ"%2EU>13_YX2MT!4U-)!XX_-DO!N2V*(4(IV0Z;
MV'S5X>0K*?W7%8P[MKAEIRCL'N+@QR2IYYB"Z0/C)?U"XH'GSW]/00%LZ".A
MQ0O&\_0$HH:S>DSWSRT!LX'Y<2`Q,)D28\!#W;L%&S0S3;T0=I46L3)XL"C8
M:3$C*46S4L/]3^!%#B31/L25V5AL+"0A29-RJZ7GTHQ3B2H1,1W,Z!!"((G+
M\==0:H22*=4&4]AAAZU$&U>7B=J.25Q(L,OFO'2T"C5@NAOCYY$@)W$&MX#;
M/:)CF(*@?]QBG`'CA""^(4-M(#)=<7C9?\U5P:MMGM08=(,<=H^^KX7KD\!D
M6<E@3Q34O)1CX86(5N/W%=RT-@(PMV#8T(B18]7<YB.IP%(48AKWY&7-F&[Z
MR@^HB@+0?3"_IZN_'&=$IQG+'`%][404A3Z0V.+1X::A;'3$:2J+5`O9U('B
MT=X>&N'9&PPIN5-"BAV.1$?#V<C1"K4!-F<#N)[-WX551N%5..6B-D[^;!PQ
M&@.N$.)AV)P/N$\O17]V;&%&(X*,4+JG%/50O%/@S23\%I\(N`:WCF1*6Z'D
MS]:.YU"666J)B[7GI=2"@WA*3GRFC'>QE<Q'U\MY7?US-'F0S@?HA/B3)3+Z
MZY5@2I`C;3&P;X7%H,6,DV@#V";DFZ`[(9-4JG-PZ`Z+.9P!G*Q0%52"CI5"
MS\+P@Q*1=PHNB32GE`HY5C=M+F="JA]RI]%HH/\..4P__K>D@G/1ZU]=G&XW
M%]J[?.LNK%#ZWM7IY7GO8/"7LY.]_G%P=C#2XGQPK`\DT-#QZ?E5N!DCJD,Y
MK.@V%PQ:L+<#FPWR5H?&(]@4@3I@=#ICF[K5`[6M;Q0T%!W.W\5G%"ZWZ4\5
M"$0)H+-C;H5"0L!#-Z,>^7NP9/#=_B*)6FPF!SP^/*=7F))\#=J/^C**\[?Y
MB>#7NUL6<X@JL0A:E!L/OD<.N^#H)T;-@M0!,W2*#L%%CR%;AAFK!47Q,U8N
MM.0_&[2.ZQ(A>A>\M7ZH2#]WL+RF+HX$=?1Z.3&JF?^Z[Y]]7UQ!N/=B"2)[
M\D"'-93O$=%!RT%H.>S23&%9@^2QHYK/WD]&M[6[I<,)9W3,E0N,.1FJ]NE+
M7,/<$MW9:=J'*QHAN`:Q@J=P8V]53HS&#`)^7F$(_'TYAY@<.6.7%-]BCA]=
M@@^6QT_,[P`YB<`C9A.1J\*R7JW4.,?D!0=LXM!E/7$+Y;PD'R\0@.Z;AL%7
M4XB@YRNR:JOA_$@C`1;`<2I-')-8*='$GJCN?2+)="P4#HZX<LO2FC+@@!T,
M$[&5S68)?4*@LID62_6%7+JUF4<(!2+4O@JH.;\U+Y9U^6&DMA%K39(=1?+?
MJ.(W4D:BS>N&X(%OBN]49?J&P4GO](?^GU!(%S?LOJ!)B(_7<75\?&,/]WC=
M;4;DHJ[KY*67MOR'$?FE63,)T:H*8AA(O!.[*;>PN'P1::WRJZQIR"T8A#X`
M>3(OOAG?+MC&!.:HH[.+MWM]MBSMA/64EXG_<>9%VX0E+#:1M#(*D8Z1V+<`
MK`QS_'+T,J$2]DM$EN"OQRUBNZ@91M#FM<"5M\7$"+5)I)95/@E=]-Q:.05I
MY=2CUH?98D8FN!U?WAU7TENO:Z3JY([(V(*S`HL/[D4?K(A]LY/C:&G,K1YC
M83M087"MB'WSPY5Z062$Y9"DVW)5W2YO79"@N\(.O98HC4_V\*:.Z\D2)B^9
MX$B#70V6U;"-\2I=1/50=E=\KDRI4$1[5\6=%-;.:M?.P>SV#J*W[8#!;1]`
M^A`?$TX#C\+BB\/#9[O4HP4G$NCOA`B^$;EDS4P'@0%&Q:]PEJI<T$"0I)"I
MC\WGFB`BT`15D4L'/0BA[5P'"$7.]-!>3C"QD6U<&[>U_\(>C]#D;7CB,L).
M0H7Z9?6RV2_C#V0(+@_S1!'*<*)#;%P':8NLC/P/)WVP(R)N-1N17;"MS90G
MY0YV04#MQ3,BM@#G(<(D]V"YV.IL:H.(Z>;`)HOB^5Z_W[NPO!(9%9L_=5FG
MLIW$\CZ].CD!RG:+L)_TKA1TF@&R.C!'-0]D94V#9IX!H)\%!?T?EPX\+42M
MP='5Z4'_^,PPZ.7>#[;A'5D;?[B>O]V:+K=^E<2D"0]E5)Y/8^8C@_.4M-';
MHAI`Q)^U@@8U[50=?:#Z)"EAYJ]7XLV79H7QZ8)<5?!DT]NB45-$K;Y$+!$/
M440Y9V!/&E<K5!+]=1NH^?..MTG'[SF!G)6N?MQ1EV^?EQSYL:SM/0+F]Z&L
M_[&T45!T]:'"/`KO74AGXKIX$#MO>"$]:)28O`6;WX:SB7"2';_PS_'S[>-H
M]^:@"`QOM5%F,MJUX@T]6(BV2G@LCN<1,Y\Q>OIN,><+3X=%^^/,:*J8.-$A
M&"E@>.52B`WH?GTR'ZG(YLO^WL&?!^=GQZ>&=!B=<_76<6E6K73C/#"DK1%1
M'!T?/HY-6,"8I_SIUGUVC6&I#\B%"'HS$;OTY\^WGM.\8N(IHTA2J56:H4':
M0YS-,MU'2!S3-7F"M(;2Y10:=Q5ETQ:9V!83J:="D^D6.L6T4`FECC@JL]1*
MY_4N_,JK1TSU#^`-4Z/(O31C<J\:X"$*L]-<'.]?]7N#JU,S,X>9P"4?(R=4
M-'*=H,;G-(0/U]<VJG8`)W$=:"OS*WUH9QBJ^XTE&V=-V'SQXAN.TPTB>WDW
M-)H!0E3+IC$D(:B=J$SUZ5-8#-F_E"Z+%^P*A13"3M'S,)_-;NT->/9TK.Q8
M`(C%&9!ED."$/SJ_=EK,82D;5:BL=0R7'Z3][97[[??%MXJ^P[7I:UM8G\!#
M2>"P>H[",O;TWS$HV_:3!Z5Q18)PYYV@F/@"V6E8;*A;DQDWEGV<DA@D]-J+
MY!?L<'(A_5(2E@Z<P[L4R=U1+R&TADQ*:$W0"!VVUUM3$7(CO;2TZ0UP61)I
M?W0-5>_T,'"WRV,6':A"U=.<M*`9%(M&$<`F3XY/>P,CP#']0Q4+>O/JK3VH
M0:BX.JA1D=Z[W@$(K^.C`>B`QPB;`;\6;26=(3!);D:_*%70:B&4J!+L83NZ
MJ-[YN%;71_71GTY!M14SNQ^__B0/?6KKHZEF8S#HF04`R13CN9$W(YN-:*9P
M2DF>V>G9R1(R.JBE#H@JAH%``:$U/F.C9I"U>*W'Y;B;K</G(F:QA#R#X8BY
M/<WE\#FU:H1Y/L'L`D$C.RK73@+O1MH=?J45X8<4KXG(>"&8:(V%P5K,>DOC
M,04]6A]Y15WQO+)J8*:U5]G&"F*&_`5:F@%D[/6\>F^3[XN"9\U>JT[Y-T=G
M"64O0)=82U.C16+U&VI!)Q*A*GS>O]`QK/$>XS`K3!NIUSN)NG:GR=1UKU-U
MA\W]#G6_R3WQ3<-&&+T;)NNE6TNW$[:@..60;IU#YK?>O&HA,_42$&5B\K-W
MQ0ECV'HZNS:7)>$HXR2U;+Z1E9E7='DC?!;*+ROTTL%O`6BEG@'*_X$7$L.2
MDX;FC2"6&L.^Y5.]@I=)5$3=5``$Z1L($1IW`_3\U(X24@=5GR>01J=&_5>1
MAA=&'$,.SC*_&W5QC^$6<CN1W(@.>R>]?N]05+@\N[HXZ`T0=\M5D/>\)1FQ
M28ZH`JGE;K<&`D)B[(DJA"VP&X;R8A"I\JZ,6#:D(9=2GHTO/=SS>5L=L^$O
M3(Q4/A#D9JE9D/KUN&JARS7I%I1JK)0+JJQ3E1!/.)FQW*2%6A\,:TC\SGUG
MO-R2\K30,M4]<^TDU%Q5L%G\VK6YGJ,#\=/3O"XM[C#>(>Z`_QCJBR`VG`D0
MD:DMCX/^%%KPODC$IPSQ_F8/<3M<1\/`BU%O[?`SI^MGX=R?N7JIOL6%\_P$
MC"ED;\<)9!!N%SV#8E[>'H<@(S0:%_WP0%'GRRFA5<HK10PECVRP!\3)4$U[
M=RTN<C3-UW@7C@A2+Q<$:H*WU?7IQMI6B_+OZ19%P':;5^Z(/EHMYN5T-%N:
MX\VL))>^2%UHR>//:+PH)A0EB;$W-D1C,IO=F<^8SR:`T475O@?PT<-9?*T<
M(1V(._=0$Z5*"&WNEV32!>-.'<[GPY-L&#MY(3(?&AV.,MX^I6_G%>^?N4D$
M[:^&FWRU>RM@M\>TLP37Y;.,#@&L$N*:%@"Y8DAF02J#&\;G:=@&:C8%S2&W
MB^7M'4&..IS:.@1#U^"4D60#T:9MLP&F1U:MG`Y*,("%(.FI9RDP=4P["YZA
M82-XALLO1,U\1JL2+PB"WVR&/CZ0N'Q!E'X(TW=A:/=BN%T\CX!#M-"S'3P)
MC]UE>Z6O8W#EZ!OI@H5(0Q.`XE!1WS`:R$V\F;%H/T=4R.<I:$-H%8<4>F1]
M*`M'>KC\T)9/%O,+E]K(B5=_8;%=]>+68OM4)B6U+"&`>8@027FQ4C&S_B(A
MC$9Z`]8!4=4%RX3U?3`O_21"=5<R0#<HR\GV84&WZL2X7)FM3C`P)7=XWG*W
M,5&C+;ANT]#G?J=X7FSCK_,=-<N)W5'2MHR(ZW]+WR?D`ZQYOK,30U^<N.NI
M%:ZX%W7[Q1#@:SLP^`WMHXR^W'ZS^V)7Q=X=Q3T3C$I(Y?PH'0^%XRO,`.<H
M%7Z%03*K-(XQ.PJSZ7[)$*+.9,2U7X&<L,1EK`2!Y:MYRW(1B&W%1.EF1?ZE
M;EK?U.=O07`'!)'L:#Z*C7W,\V`^_+)QP=K?5D\P9G\[Q]A.XHB5OPK7NUW'
MJ?@2%J?)B]`H+"^8>G#/M7G:@QO2?%MNO2>X/-6O8_=LC\3SU.N&])P+89?I
M7S1,W(,-&O;MQ/)I*BX3$JI4;KK"A(`UV33=V-5E[S/X4;$CP((]PHI1WR(^
M-QB^:<U0J;F56-/T1.=M-YQ/&F0<XN"TIZF[)X5WA1R*\7>[N[O/O0;A%#36
MRC9YW>TD=:N?IJRZ@2AE;0]^Y39>#)_SYSUWUP51`=86X5>K8;X8(E`R5Z#N
MN]Q[E\?59?VARTS6=5^7L.E\CFY.1()S(B/DN^-4RI*CKX_P0.R?K9?[,(I?
MG'I\L[.1T8J;E.`@$-C><7#C[S?('RYNUJ`FQ/^7>&,F^@I_.-QOP`!CFB&V
MOX,7>01F4(V.[AKO*B._5.<_:ZR/S+`;;6T#1#)7!^@!YP8K,/H_/17H^Z,$
M^M[:VMYZL_T_;]8$^MYZ\X>O0-]?@;Z_`GW_EP)]"]!C#2WSBS`M!#'>$?:'
M5TKB\\>G'2=9#^B>F,D#P^KQK7\EG#"Z]CS0)1P#T,*[I'EC:A3C\]E8SJ)]
MC[EE:(]$&!X,NX0<8[@,AASO=YBEW1%?Z;?/C1"0UJBS')`;RS,!XN+\(%3^
M&(R`US/,\*.KB<:Z+&'Y4.&S);>*"52^G"8\XOE@>0P2@;LZ(83Z]\@.OE*(
M.DI53D>KA1Z$+#<U;ZG<N:E1@14X6Q81P76CL,"EV\Y.;>!AVDC9!=U-ASM$
M-H?]C;MP>@C?##-U;"I0IIJ+>7NDFF#-MYBUBGD8U^Z6([,3$.2Z@+[RSCP7
MQN%&L>'QLWD9P(FA4[3Q'XA6P$M\91DX3>A"UM,D2^%RT<6<B4Z6`YA+7<P"
M3LI28)#4I8`OPE+@HM*E@,O"4NC%T<60<3H)RAJ9:K8S5*H4(6&,8HT&)"33
M)G?A`6GQ[QCP-*P,]PN?R_&1T3^^A[&3JBV,*(\.P)7--437'*_5#A3--2-;
MB`P]^.HG=PI,_QCE/QZ7)T*BWSW7<;?@W`'J18U"]P_^F=#B($S<4%):4,6H
M-21#<TV\W%E_<,)6FVTC,X*G-Q,:;^+&E)EDK0$!F9-LN1?P96Y2]ORL^"+"
M.Q"R=[8OS[I?TI58`*F>Z#[:7">"3@%K!6]S;"&XO[DN(71X+GXZ$X>SW5`#
M\D6>L%ZV,NMEW8K>N)@4+U<G_6,K8(CT(LK'DMX;P?2[^);:CJ4BK&@5.)1H
MR+]+-=2AS61/*6>OK?.;(288I8@N7^%L!M``[>82[RQ"(OM-`?>,Z.M2!,,&
MSBXPAC64R];UMI9(3HCF8&MB%7V%@)-@8D!URZ8$G5^<]<_:[2C41^<4(DXE
M_0_3<?R_U93^Y\)HPH[P,)OK)5M+>LJS0X01/=:"B'9J;.>1QL"^PO7)MM;5
/BJ.FP<;_`V4#/7TPP@``
`
end



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]