lkml.org 
[lkml]   [2010]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: gcc 4.5.1 / as 2.20.51.0.11 miscompiling drivers/char/i8k.c ?
    On Mon, Nov 15, 2010 at 07:30:35PM +0100, Jim Bos wrote:
    > On 11/15/2010 07:08 PM, Linus Torvalds wrote:
    > > On Mon, Nov 15, 2010 at 9:40 AM, Jim Bos <jim876@xs4all.nl> wrote:
    > >>
    > >> Hmm, that doesn't work.
    > >>
    > >> [ Not sure if you read to whole thread but initial workaround was to
    > >> change the asm(..) to asm volatile(..) which did work. ]
    > >
    > > Since I have a different gcc than yours (and I'm not going to compile
    > > my own), have you posted your broken .s file anywhere? In fact, with
    > > the noinline (and the removal of the "+m" thing - iow just the patch
    > > you tried), what does just the "i8k_smm" function assembly look like
    > > for you after you've done a "make drivers/char/i8k.s"?
    > >
    > > If the asm just doesn't exist AT ALL, that's just odd. Because every
    > > single call-site of i8k_smm() clearly looks at the return value. So
    > > the volatile really shouldn't make any difference from that
    > > standpoint. Odd.
    > >
    > > Linus
    > >
    >
    > Attached version with plain 2.6.36 source and version with the committed
    > patch, i.e with the '"+m" (*regs)'

    Thanks, this actually helped to see the problem.
    The problem is not inside of i8k_smm, which is not inlined, but in the
    callers.
    ipa-pure-const.c pass thinks i8k_smm is a pure function, thus
    regs = {};
    regs.eax = 166;
    x = i8k_smm (&regs);
    if (!x) x = regs.eax;
    in the callers is optimized into
    regs = {}
    regs.eax = 166;
    x = i8k_smm (&regs);
    if (!x) x = 166;
    Now, not sure why this happens, as there is
    case GIMPLE_ASM:
    for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
    {
    tree op = gimple_asm_clobber_op (stmt, i);
    if (simple_cst_equal(TREE_VALUE (op), memory_identifier_string) == 1)
    {
    if (dump_file)
    fprintf (dump_file, " memory asm clobber is not const/pure");
    /* Abandon all hope, ye who enter here. */
    local->pure_const_state = IPA_NEITHER;
    }
    }
    Debugging...

    Jakub


    \
     
     \ /
      Last update: 2010-11-15 20:03    [W:3.095 / U:0.748 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site