I'm surprised gcc doesn't manage to do that: At least in debug builds two call sites exist, just like source code has it. That's not necessary though - by using do/while we can reduce this to a single call site. Then the function will be inlined.
While improving code gen, also switch the function's 2nd parameter to unsigned. Signed-off-by: Jan Beulich <[email protected]> --- Oddly enough the CDQE is replaced by an entirely unnecessary 32-bit MOV of a register to itself (i.e. zero-extending to 64 bits), as that's immediately preceded by a 32-bit ADD targeting the same register. --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -124,7 +124,7 @@ static inline unsigned long ns2ticks(uns return (unsigned long) tmp; } -static int hpet_next_event(unsigned long delta, int timer) +static int hpet_next_event(unsigned long delta, unsigned int timer) { uint32_t cnt, cmp; unsigned long flags; @@ -173,12 +173,10 @@ static int reprogram_hpet_evt_channel( delta = max_t(int64_t, delta, MIN_DELTA_NS); delta = ns2ticks(delta, ch->shift, ch->mult); - ret = hpet_next_event(delta, ch->idx); - while ( ret && force ) - { - delta += delta; + do { ret = hpet_next_event(delta, ch->idx); - } + delta += delta; + } while ( ret && force ); return ret; }
