[Issue 287] New: DMD optimization bug arround dynamic array length

Thomas Kuehne thomas-dloop at kuehne.cn
Tue Aug 15 05:21:31 PDT 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

d-bugmail at puremagic.com schrieb am 2006-08-14:
> http://d.puremagic.com/issues/show_bug.cgi?id=287

> build -release -O -clean sample.d
> got wrong optimized exe.
>
> import std.stdio;
> import std.process;
>
> char[] replace(char[] subject) {
>                 char[] s = new char[subject.length];
>                 int lng = 0;
>                 char[] sa;
>                 int lngnew;
>                 int i = 0;
>                 while(i<10) {
>                         i++;
>                         sa = "repxxxxxxxxxxxx";
>                         lngnew = lng + sa.length;
>                         if(lngnew > s.length) s.length = lngnew * 2; // expand
> size
>                         writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
>                         s[lng .. lngnew] = sa[0 .. $];
>                         lng = lngnew;
>
>                         //volatile{//OK
>
>                         sa = "repzzzzzzzzzzzzzzzzzzzzzz";
>                         //lngnew = lng-1 + sa.length+1;//OK
>                         //synchronized lngnew = lng + sa.length;//OK
>                         //lngnew += sa.length;//OK
>                         lngnew = lng + sa.length;// 2*sa.length?
>                         if(lngnew > s.length) s.length = lngnew * 2; // expand
> size
>                         writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
>                         s[lng .. lngnew] = sa[0 .. $];
>                         lng = lngnew;
>
>                         //}
>
>                 }
>                 return s[0 .. lng];
> }
>
> void demo() {
>         int lng = 0;
>         int lngnew = 0;
>         int i = 0;
>         char[] sa = "xxxx";//it seem to be around the Dynamic Array's length
> property.
>
>         // class SA {
>                 // int _a;
>                 // this(int a) {_a = a;}
>                 // int length() {return _a;}
>         // }
>         // SA sa = new SA(4);//OK
>         while(i<10) {
>                 i++;
>                 lngnew = lng + sa.length;
>                 writefln(lng, \t, lngnew, \t, sa.length);
>                 lng = lngnew;
>
>                 lngnew = lng + sa.length;
>                 writefln(lng, \t, lngnew, \t, sa.length);
>                 lng = lngnew;
>         }
> }
>
> int main(char[][] args) {
>         try {
>                 demo();
>                 writefln(replace("012345678901234567890"));
>         } catch(Exception e) {
>                 writefln(e.msg);
>         }
>         system("pause");
>         return 0;
> }

Added to DStress as
http://dstress.kuehne.cn/run/o/odd_bug_07_A.d
http://dstress.kuehne.cn/run/o/odd_bug_07_B.d

Thomas


-----BEGIN PGP SIGNATURE-----

iD8DBQFE4bJ+LK5blCcjpWoRAiFDAJwNAxYqylFxBbE0DHKz8lv6ouPUJQCgo8Ap
m1e4mdLdEGVvRNeiS5Fm7zE=
=tGKg
-----END PGP SIGNATURE-----



More information about the Digitalmars-d-bugs mailing list