On Tue, Jul 28, 2015 at 3:05 PM, Samuel Thibault <[email protected]>
wrote:
> Paul Hargrove, le Tue 28 Jul 2015 15:00:36 -0700, a écrit :
> > Well, for the compiler that accepted the "=r" form and then generated
> code that
> > SEGV'd I would say "buggy".
>
> I would like to see the generated code before saying anything, since
> it's so easy to write bogus inline assembly and being completely unable
> to see the issue before seeing the bogus generated code :)
>
The compiler I have characterized as "buggy" is Solaris Studio 12.2 for
Linux ("Sun C 5.11 Linux_i386 2010/08/13"):
Previously I only had a bunch of SEGVs from "make check" to support that.
However, now I have the generated code that Samuel requested to support
that conclusion.
The inline asm I had originally tested that lead to that characterization
was:
__asm__(
"xchg %%ebx,%1\n\t"
"cpuid\n\t"
"xchg %%ebx,%1\n\t"
: "=a" (*eax), "=r" (*ebx), "=c" (*ecx), "=d" (*edx)
: "0" (*eax), "2" (*ecx));
And retesting that asm today, I find the following generated code:
$ objdump -d src/.libs/libhwloc.so | grep -C1 -w cpuid
5f5c5: 87 d3 xchg %edx,%ebx
5f5c7: 0f a2 cpuid
5f5c9: 87 d3 xchg %edx,%ebx
So the compiler chose %edx for the 2nd output, even though is is explicitly
used for the 4th output.
I don't see how that could ever be correct.
I tried adding the early-clobbers ("=&" vs "="):
: "=a" (*eax), "=r&" (*ebx), "=c" (*ecx), "=&d" (*edx)
But the same bogus code is generated.
We already know the following "final" asm works on this system (on all the
systems I tested):
__asm__(
"mov %%ebx,%1\n\t"
"cpuid\n\t"
"xchg %%ebx,%1\n\t"
: "+a" (*eax), "=&SD" (*ebx), "+c" (*ecx), "=&d" (*edx));
But I tried changing "SD" to "r":
: "+a" (*eax), "=&r" (*ebx), "+c" (*ecx), "=&d" (*edx));
And we again see %edx being chosen for two outputs:
$ objdump -d src/.libs/libhwloc.so | grep -C1 -w cpuid
5f5b3: 8b d3 mov %ebx,%edx
5f5b5: 0f a2 cpuid
5f5b7: 87 d3 xchg %edx,%ebx
It is also worth pointing out that the first asm in this email was never a
real candidate because it also resulted in build failures on a couple gcc
versions:
With "gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)" on Scientific Linux 6.6
(RHEL clone like CentOS):
libtool: compile: gcc -DHAVE_CONFIG_H -I.
-I/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/src
-I../include/private/autogen -I../include/hwloc/autogen
-I/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/BLD/
include
-I/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include
-DHWLOC_INSIDE_LIBHWLOC -DHWLOC
_PLUGINS_PATH=\"/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/INST/lib/hwloc\"
-fvisibility=hidden -g -O2 -M
T topology-x86.lo -MD -MP -MF .deps/topology-x86.Tpo -c
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-
1.11.0/src/topology-x86.c -fPIC -DPIC -o .libs/topology-x86.o
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/src/topology-x86.c:
In function ?look_proc?:
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: can't find a register in class ?CLOBBERED_REGS? while reloading ?asm?
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
/home/phargrov/OMPI/hwloc-1.11.0-linux-x86-sl6x/hwloc-1.11.0/include/private/cpuid-x86.h:75:
error: ?asm? operand has impossible constraints
make[1]: *** [topology-x86.lo] Error 1
And with "gcc (GCC) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)" on Red Hat
Linux 8.0:
libtool: compile: gcc -DHAVE_CONFIG_H -I.
-I/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/src
-I../include/private/autogen -I../include/hwloc/autogen
-I/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/BLD/include
-I/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include
-DHWLOC_INSIDE_LIBHWLOC
-DHWLOC_PLUGINS_PATH=\"/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/INST/lib/hwloc\"
-g -O2 -MT topology-x86.lo -MD -MP -MF .deps/topology-x86.Tpo -c
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/src/topology-x86.c
-fPIC -DPIC -o .libs/topology-x86.o
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/src/topology-x86.c:
In function `look_proc':
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include/private/cpuid-x86.h:75:
can't find a register in class `Q_REGS' while reloading `asm'
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include/private/cpuid-x86.h:75:
can't find a register in class `Q_REGS' while reloading `asm'
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include/private/cpuid-x86.h:75:
can't find a register in class `Q_REGS' while reloading `asm'
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include/private/cpuid-x86.h:75:
can't find a register in class `Q_REGS' while reloading `asm'
/home/pcp1/phargrov/OMPI/hwloc-1.11.0-linux-x86-RH8/hwloc-1.11.0/include/private/cpuid-x86.h:75:
can't find a register in class `Q_REGS' while reloading `asm'
make[1]: *** [topology-x86.lo] Error 1
These two are examples of "poorly performing" register allocators, as
opposed to the *incorrect* one seen in Solaris Studio 12.2.
-Paul
--
Paul H. Hargrove [email protected]
Computer Languages & Systems Software (CLaSS) Group
Computer Science Department Tel: +1-510-495-2352
Lawrence Berkeley National Laboratory Fax: +1-510-486-6900