[Openmp-commits] [PATCH] D28599: kmp_affinity: Fix check if specific bit is set

Jonas Hahnfeld via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Thu Jan 12 00:47:48 PST 2017

Hahnfeld created this revision.
Hahnfeld added reviewers: jlpeyton, AndreyChurbanov, tlwilmar.
Hahnfeld added a subscriber: openmp-commits.

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.



Index: runtime/src/kmp_affinity.cpp
--- runtime/src/kmp_affinity.cpp
+++ runtime/src/kmp_affinity.cpp
@@ -1022,7 +1022,7 @@
         // 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)) {
             __kmp_set_system_affinity(oldMask, TRUE);

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28599.84085.patch
Type: text/x-patch
Size: 514 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20170112/e6cbcdcc/attachment.bin>

More information about the Openmp-commits mailing list