From cb6f056004a10d5c3ed0341366e3ddeb53cac5e6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 25 Aug 2011 01:13:43 +0200 Subject: Opotimize "scno >= 0 && scno < nsyscalls" check gcc can't figure out on its own that this check can be done with single compare, and does two compares. We can help it by casting scno to unsigned long: ((unsigned long)(scno) < nsyscalls) * defs.h: New macro SCNO_IN_RANGE(long_var). * count.c (count_syscall): Use SCNO_IN_RANGE() instead of open-coded check. * syscall.c (getrval2): Use SCNO_IN_RANGE() instead of open-coded check. This fixes a bug: missing check for scno < 0 and scno > nsyscalls instead of scno >= nsyscalls. (get_scno): Use SCNO_IN_RANGE() instead of open-coded check. This fixes a bug: scno > nsyscalls instead of scno >= nsyscalls. (known_scno): Use SCNO_IN_RANGE() instead of open-coded check. (internal_syscall): Likewise. (syscall_enter): Likewise. (trace_syscall_entering): Likewise. (get_error): Likewise. (trace_syscall_exiting): Likewise. Signed-off-by: Denys Vlasenko --- count.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'count.c') diff --git a/count.c b/count.c index 86b1953..77fc919 100644 --- a/count.c +++ b/count.c @@ -50,7 +50,7 @@ static struct timeval shortest = { 1000000, 0 }; void count_syscall(struct tcb *tcp, struct timeval *tv) { - if (tcp->scno < 0 || tcp->scno >= nsyscalls) + if (!SCNO_IN_RANGE(tcp->scno)) return; if (!counts) { -- cgit v1.2.3