------- Comment #15 from bergner at vnet dot ibm dot com  2005-11-04 17:38 
-------
For completeness, here is a minimal test case that shows the problem we are
having:

[EMAIL PROTECTED]:~/olaf/PR24644-4> cat bar.c 
register struct paca_struct * local_paca asm("r13");
struct paca_struct { volatile long state; };
extern void foo(void);

int migration_thread(void)
{
 local_paca->state = 1;
 foo();
 local_paca->state = 0;
 return 0;
}
[EMAIL PROTECTED]:~/olaf/PR24644-4> ~/gcc/dataflow-base/bin/gcc -m64 -O1 -S 
bar.c 

The code we get looks like: 
.migration_thread:
        mflr 0
        std 29,-24(1)
        std 0,16(1)
        stdu 1,-144(1)
        mr 29,13
        li 0,1
        std 0,0(13)
        bl .foo
        nop
        li 0,0
        std 0,0(29)
        li 3,0
        addi 1,1,144
        ld 0,16(1)
        mtlr 0
        ld 29,-24(1)
        blr

This looks like gcc thinks r13 will be trashed by the call to foo() so it
copies it to a non volatile register for use after the call.  Strange that this
didn't happen before the patch found by Olaf.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24644

Reply via email to