From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964861AbcBPTUB (ORCPT ); Tue, 16 Feb 2016 14:20:01 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:37686 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755524AbcBPTTp (ORCPT ); Tue, 16 Feb 2016 14:19:45 -0500 From: Rasmus Villemoes To: Andi Kleen , Andi Kleen , "Rafael J. Wysocki" , Ingo Molnar , Rasmus Villemoes Cc: akpm@linux-foundation.org, lenb@kernel.org, Eric Dumazet , Fengguang Wu , linux-kernel@vger.kernel.org Subject: [PATCH 2/2] cpuidle: menu: help gcc generate slightly better code Date: Tue, 16 Feb 2016 20:19:19 +0100 Message-Id: <1455650361-26596-2-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1455650361-26596-1-git-send-email-linux@rasmusvillemoes.dk> References: <1455650361-26596-1-git-send-email-linux@rasmusvillemoes.dk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We know that the avg variable actually ends up holding a 32 bit quantity, since it's an average of such numbers. It is only a u64 because it is temporarily used to hold the sum. Making it an actual u32 allows gcc to generate slightly better code, e.g. when computing the square, it can do a 32x32->64 multiply. Signed-off-by: Rasmus Villemoes --- drivers/cpuidle/governors/menu.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index beef7ae123ba..27fc733cb5b9 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c @@ -199,8 +199,8 @@ static void menu_update(struct cpuidle_driver *drv, struct cpuidle_device *dev); static void get_typical_interval(struct menu_device *data) { int i, divisor; - unsigned int max, thresh; - uint64_t avg, variance; + unsigned int max, thresh, avg; + uint64_t sum, variance; thresh = UINT_MAX; /* Discard outliers above this value */ @@ -208,28 +208,28 @@ again: /* First calculate the average of past intervals */ max = 0; - avg = 0; + sum = 0; divisor = 0; for (i = 0; i < INTERVALS; i++) { unsigned int value = data->intervals[i]; if (value <= thresh) { - avg += value; + sum += value; divisor++; if (value > max) max = value; } } if (divisor == INTERVALS) - avg >>= INTERVAL_SHIFT; + avg = sum >> INTERVAL_SHIFT; else - do_div(avg, divisor); + avg = div_u64(sum, divisor); /* Then try to determine variance */ variance = 0; for (i = 0; i < INTERVALS; i++) { unsigned int value = data->intervals[i]; if (value <= thresh) { - int64_t diff = value - avg; + int64_t diff = (int64_t)value - avg; variance += diff * diff; } } @@ -251,7 +251,7 @@ again: * Use this result only if there is no timer to wake us up sooner. */ if (likely(variance <= U64_MAX/36)) { - if (((avg*avg > variance*36) && (divisor * 4 >= INTERVALS * 3)) + if ((((u64)avg*avg > variance*36) && (divisor * 4 >= INTERVALS * 3)) || variance <= 400) { if (data->next_timer_us > avg) data->predicted_us = avg; -- 2.1.4