digitalmars.D - Compiler does some flow analysis with -O..?
- Jarrett Billingsley (20/20) Apr 09 2009 Try this.
- Denis Koroskin (20/40) Apr 09 2009 I believe this is just an optimization and not a general-purpose flow an...
- Jarrett Billingsley (2/4) Apr 09 2009 It happens even with a non-trivial condition.
- Denis Koroskin (13/18) Apr 09 2009 Now I am convinced:
- Nick Sabalausky (4/16) Apr 09 2009 I guess I'm going to have to start using -O in my debug builds...unless ...
- Denis Koroskin (3/25) Apr 09 2009 Yeah, me too!
- Robert Fraser (2/3) Apr 10 2009 Ssh!
Try this.
void main()
{
int x = void;
int y = 3;
if(y < 10)
x += 5;
else
x = 2;
}
Notice that x is uninitialized, so "x += 5;" shouldn't work.
If you compile this, even with -w, DMD happily accepts it. But if you
throw -O, it gives the error:
dtest.d(187): Error: variable x used before set
This seems to be a relatively recent development, and doesn't seem to
be documented. It's also very surprising that it only happens when -O
is thrown.
I like it a lot. Could this functionality be formalized and extended
(i.e. to include accesses to variables declared like "int x;", like it
says in the spec)?
Apr 09 2009
On Thu, 09 Apr 2009 18:19:02 +0400, Jarrett Billingsley
<jarrett.billingsley gmail.com> wrote:
Try this.
void main()
{
int x = void;
int y = 3;
if(y < 10)
x += 5;
else
x = 2;
}
Notice that x is uninitialized, so "x += 5;" shouldn't work.
If you compile this, even with -w, DMD happily accepts it. But if you
throw -O, it gives the error:
dtest.d(187): Error: variable x used before set
This seems to be a relatively recent development, and doesn't seem to
be documented. It's also very surprising that it only happens when -O
is thrown.
I like it a lot. Could this functionality be formalized and extended
(i.e. to include accesses to variables declared like "int x;", like it
says in the spec)?
I believe this is just an optimization and not a general-purpose flow analysis:
Step 0:
int x = void;
int y = 3;
if (y < 10)
x += 5;
else
x = 2;
Step 1:
int x = void;
int y = 3;
if (true)
x += 5;
else
x = 2;
Step2:
int x = void;
int y = 3;
x += 5; // Error: variable x used before set
Apr 09 2009
On Thu, Apr 9, 2009 at 10:28 AM, Denis Koroskin <2korden gmail.com> wrote:I believe this is just an optimization and not a general-purpose flow analysis:It happens even with a non-trivial condition.
Apr 09 2009
On Thu, 09 Apr 2009 18:53:07 +0400, Jarrett Billingsley <jarrett.billingsley gmail.com> wrote:On Thu, Apr 9, 2009 at 10:28 AM, Denis Koroskin <2korden gmail.com> wrote:Now I am convinced: extern(C) int rand(); void main() { int x = void; if (rand() == 0) { x += 5; // line 7 } } test.d(7): Error: variable x used before set It only happens with DMD1.042+ Yay!I believe this is just an optimization and not a general-purpose flow analysis:It happens even with a non-trivial condition.
Apr 09 2009
"Denis Koroskin" <2korden gmail.com> wrote in message
news:op.ur4kb8ffo7cclz soldat.creatstudio.intranet...
Now I am convinced:
extern(C) int rand();
void main()
{
int x = void;
if (rand() == 0) {
x += 5; // line 7
}
}
test.d(7): Error: variable x used before set
It only happens with DMD1.042+
Yay!
I guess I'm going to have to start using -O in my debug builds...unless this
behavior becomes independant of the -O switch...wink wink nudge nudge...
Apr 09 2009
On Thu, 09 Apr 2009 20:36:43 +0400, Nick Sabalausky <a a.a> wrote:"Denis Koroskin" <2korden gmail.com> wrote in message news:op.ur4kb8ffo7cclz soldat.creatstudio.intranet...Yeah, me too! BTW, that's a breaking change! XDNow I am convinced: extern(C) int rand(); void main() { int x = void; if (rand() == 0) { x += 5; // line 7 } } test.d(7): Error: variable x used before set It only happens with DMD1.042+ Yay!I guess I'm going to have to start using -O in my debug builds...unless this behavior becomes independant of the -O switch...wink wink nudge nudge...
Apr 09 2009
Denis Koroskin wrote:BTW, that's a breaking change! XDSsh!
Apr 10 2009








Robert Fraser <fraserofthenight gmail.com>