[Openmp-commits] [openmp] r291764 - kmp_affinity: Fix check if specific bit is set

Jonas Hahnfeld via Openmp-commits openmp-commits at lists.llvm.org
Thu Jan 12 03:39:04 PST 2017


Author: hahnfeld
Date: Thu Jan 12 05:39:04 2017
New Revision: 291764

URL: http://llvm.org/viewvc/llvm-project?rev=291764&view=rev
Log:
kmp_affinity: Fix check if specific bit is set

Clang 4.0 trunk warns:
warning: logical not is only applied to the left hand side of this bitwise operator [-Wlogical-not-parentheses]

This points to a potential bug if the code really wants to check if the single
bit is not set: If for example (buf.edx >> 9) = 2 (has any bit set except the
least significant one), 'logical not' will return 0 which stays 0 after the
'bitwise and'.
To do this correctly we first need to evaluate the 'bitwise and'. In that case
it returns 2 & 1 = 0 which after the 'logical not' evaluates to 1.

Differential Revision: https://reviews.llvm.org/D28599

Modified:
    openmp/trunk/runtime/src/kmp_affinity.cpp

Modified: openmp/trunk/runtime/src/kmp_affinity.cpp
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_affinity.cpp?rev=291764&r1=291763&r2=291764&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_affinity.cpp (original)
+++ openmp/trunk/runtime/src/kmp_affinity.cpp Thu Jan 12 05:39:04 2017
@@ -1022,7 +1022,7 @@ __kmp_affinity_create_apicid_map(AddrUns
         // The apic id and max threads per pkg come from cpuid(1).
         //
         __kmp_x86_cpuid(1, 0, &buf);
-        if (! (buf.edx >> 9) & 1) {
+        if (((buf.edx >> 9) & 1) == 0) {
             __kmp_set_system_affinity(oldMask, TRUE);
             __kmp_free(threadInfo);
             KMP_CPU_FREE(oldMask);




More information about the Openmp-commits mailing list