Re: linearize bug?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Sat, 11 Nov 2006, Jeff Garzik wrote:
> Given the following C code:
>
> #include <stdlib.h>
> 
> int foo(void)
> {
>         int i;
> 
>         i = 42;
>         i += rand();
> 
>         return i;
> }
> 
> test-linearize seems to give me the following output, which indicates that
> pseudo %r1 is "dead" immediately before it is used:

That is normal.

"dead X" means that X is dead after the _next_ (non-deathnote) 
instruction.

So every single death-note should always show up _before_ an instruction 
that uses that register, or something is wrong.

This is actually very useful. It means that for a code generator that 
keeps track of hardware registers, it knows that a register content can be 
re-used as the _destination_ of a code sequence when it sees the 
death-note.

So for example:

> foo:
> .L0x2b52beecd010:
>         <entry-point>
>         call.32     %r1 <- rand
>         dead        %r1
>         add.32      %r4 <- %r1, $42
>         dead        %r4
>         ret.32      %r4

Here, the compiler back-end might, for example, look at

	call.32 %r1 <- rand

and decide to use register %eax for %r1.

Now, the "dead %r1" that follows will tell the back-end that the value in 
%r1 will be used _only_ by the following instruction, and never again, so 
when it sees the

	add.32 %r4 <- r1, $42

the back-end can trivially decide to _reuse_ %eax for %r4 too, and 
generate just a simple

	addl $42,%eax

for that instruction, without worrying at all about the fact that it 
over-writes the register that contains %r1.

The same thing foes for the next two instructions: "dead %r4" means that 
r4 (which we hold in %eax) will be dead after the next instruction (the 
return), so again it knows that it can re-use %eax for the result. Of 
course, for a return that's trivial anyway, but..

My "example" back-end actually does all this. It's buggy as hell, but try

	./example file.c

on your input file, and at least I get:

	.globl foo
	foo:
	        call rand               # generate_call
	        add.32 $42,%eax         # do_binop
	        ret             # generate_ret

which actually is correct (and re-uses %eax all the time). It even gets a 
few more complicated cases right, but there are certainly trivial ways to 
confuse it too (it doesn't really do any stack slot allocation, so 
anything that generates a spill - which it _will_ try to do - will 
actually generate completely broken code that just overwrites the stack).

			Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux