On Tuesday 19 December 2006 22:46, Paul Brook wrote:
> > Compiler can optimize it any way it wants,
> > as long as result is the same as unoptimized one.
>
> We have an option for that. It's called -O0.
>
> Pretty much all optimization will change the behavior of your program.
Even x*2 -> x+x? Or unsigned x/8 -> x>>3 ?
> The
> important distinction is whether that difference is observable in valid
> programs. The whole point of langage standards is that they define what
> constitutes a valid program.
>
> By your definition all writes to vairables must translate into a write to
> memory (for "correct" behavior in multithreaded applications and with signal
> handlers). This implies all variables are effectively volatile.
I am perfectly happy with registers too. Not nesessarily with same size, even.
(Just proprerly autoextend signed values a-la AMD64).
Do not put words in my mouth. I said nothing about volatility
and multithreading.
[Offtopic: even declaring variable "volatile" buys you zero
for multithreaded/SMP/memory-mapped PCI/etc case.
Today's CPUs are too clever these days. OOO loads and stores and all that.
Linus Torvalds recently explained that on l-k in painful details.]
There are a lot of 100.00% safe optimizations which gcc
can do. Value range propagation for bitwise operations, for one:
# cat tt.c
int f(int n)
{
n = ((n & 0xf0f) | 1);
if (n == 0x1000) return 2; /* impossible */
if (n == 0x10) return 1; /* impossible */
return 0;
}
# gcc -O2 -S -fomit-frame-pointer tt.c
# cat tt.s
.file "tt.c"
.text
.p2align 2,,3
.globl f
.type f, @function
f:
movl 4(%esp), %eax
andl $3854, %eax
orl $1, %eax
cmpl $4096, %eax
je .L7
cmpl $16, %eax
sete %al
movzbl %al, %eax
ret
.p2align 2,,3
.L7:
movw $2, %ax
ret
.size f, .-f
.ident "GCC: (GNU) 4.2.0 20061128 (prerelease)"
.section .note.GNU-stack,"",@progbits
--
vda