lkml.org 
[lkml]   [2008]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: undefined reference to __udivdi3 (gcc-4.3)
Date
> I assume it's one or both of these loops in arch/x86/xen/time.c 
> do_stolen_accounting() that are being optimized into a divide which
> generates a libgcc call:
>
> while (stolen >= NS_PER_TICK) {
> ticks++;
> stolen -= NS_PER_TICK;
> }
>
> or
>
> while (blocked >= NS_PER_TICK) {
> ticks++;
> blocked -= NS_PER_TICK;
> }

That looks plausible.

> I seem to recall in one previous case we added some dummy assembly
> code to stop gcc from doing this.

I think you refer to 38332cb9, "time: prevent the loop in
timespec_add_ns() from being optimised away".


while(unlikely(ns >= NSEC_PER_SEC)) {
+ /* The following asm() prevents the compiler from
+ * optimising this loop into a modulo operation. */
+ asm("" : "+r"(ns));
+
ns -= NSEC_PER_SEC;
a->tv_sec++;
}


> Not sure if that is a sustainable fix, though..

It should be. The asm() arg tells GCC that the asm() could modify
"ns" in some way, so GCC cannot optimise away the loop, since it
doesn't have the required info about the induction variable to do
that.


Segher



\
 
 \ /
  Last update: 2008-05-05 00:23    [W:0.108 / U:1.908 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site