[llvm-bugs] [Bug 32915] New: issue with unsigned long operations. (hweight64)
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu May 4 01:07:21 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=32915
Bug ID: 32915
Summary: issue with unsigned long operations. (hweight64)
Product: clang
Version: 3.9
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Frontend
Assignee: unassignedclangbugs at nondot.org
Reporter: bogdan.becheriu at yahoo.com
CC: llvm-bugs at lists.llvm.org
Created attachment 18406
--> https://bugs.llvm.org/attachment.cgi?id=18406&action=edit
the source code affected
compile the following code. (also attached)
/** compute number of 1 bits in generic data type
* Copyright (C) 2017 Bogdan Becheriu
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define HWEIGHT_IMPL(x) \
static __inline__ unsigned int hweight ## x(u ## x w)\
{\
unsigned int k;\
for (k = 1; k < sizeof(w) << 3; k <<= 1) {\
u ## x mask = ((u ## x)-1) / ((1 << k) + 1);\
w = (w & mask) + ((w >> k) & mask);\
}\
return w;\
}
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long u64;
HWEIGHT_IMPL(8)
HWEIGHT_IMPL(16)
HWEIGHT_IMPL(32)
HWEIGHT_IMPL(64)
/* @@ demo */
#include "stdio.h"
int main(int argc, char *argv[], char **envp)
{
printf("bits set in %d: %d %d %d %d\n", -1, hweight8(-1),
hweight16(-1), hweight32(-1), hweight64(-1));
return 0;
}
--------------------------
it happens only when enabling -O2 or higher on the hweight64 implementation
(unsigned long type).
please see output of executable on both gcc and clang below.
me at gentoo ~/probablyuseless-code $ gcc -Wall -Werror -pedantic -O3 -ansi
hweight.c
me at gentoo ~/probablyuseless-code $ ./a.out
bits set in -1: 8 16 32 64
me at gentoo ~/probablyuseless-code $ clang -Wall -Werror -pedantic -O3 -ansi
hweight.c
me at gentoo ~/probablyuseless-code $ ./a.out
bits set in -1: 8 16 32 0
clang version 3.9.1 (tags/RELEASE_391/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170504/418af886/attachment.html>
More information about the llvm-bugs
mailing list