Optimization error when compiling 64 bit on sparcv9 with -xO2 or greater with Sun Studio 11. Compilation on x86 32/64 bit and sparc 32 bit works fine. Lowering optimization to -xO1 on sparcv9 also works fine.
The difference between the optimization level is as follows:
-xO1 Does basic local optimization (peephole).
-xO2 Does basic local and global optimization. This
includes induction variable elimination, local and
global common subexpression elimination, algebraic
simplification, copy propagation, constant propa-
gation, loop-invariant optimization, register
allocation, basic block merging, tail recursion
elimination, dead code elimination, tail call
elimination and complex expression expansion.
This level does not assign global, external, or
indirect references or definitions to registers.
It treats these references and definitions as if
they were declared volatile. In general, the -xO2
level results in minimum code size.
The HAVAL256 test dumps core:
Checking fragmentation capabilities of HAVAL256: FAIL: frag_test
Details:
build8s% cd work/build-isa-sparcv9/mhash-0.9.9.9/src/
build8s% mdb .libs/
driver frag_test hmac_test keygen_test rest_test
build8s% mdb .libs/frag_test core
mdb: warning: core file is from SunOS 5.10 Generic_138888-07; shared text mappings may not match installed libraries
Loading modules: [ ]
::stack
libmhash.so.2mutils_word32nswap+0xb8(100104990, 20, 1f, 6c24cc00, 1, 20754a1616aa27a) libmhash.so.2havalTransform3+0xc(1001047d4, ffffffff7fffefcd, 100104880, 143367, a19b3906, 1f3213955f32139)
libmhash.so.2havalUpdate+0x130(1001047d0, ffffffff7fffefcc, 81, ffffffffffffffff, 1001047f4, 408) libmhash.so.2mhash+0x14(100101fd0, ffffffff7fffefcc, 81, fffffffffffffffd, 0, 7ffeff021eb8)
frag_test+0x98(100, 81, 1, 958, ffffffff7fffefcc, 80)
main+0x8c(1c, 7ffeff1329ce, 1, 100101620, 100001038, 100101588)
_start+0x17c(0, ffffffff7ffff238, 0, 1, 7ffeffe0d6cc, 7ffefff10000)
::dis mutils_word32nswap
libmhash.so.2mutils_word32nswap: save %sp, -0xb0, %sp libmhash.so.2mutils_word32nswap+4: btst 0xff, %i2
libmhash.so.2mutils_word32nswap+8: bne,pn %icc,+0x24 <libmhash.so.2mutils_word32nswap+0x2c>
libmhash.so.2mutils_word32nswap+0xc: mov %i0, %l4 libmhash.so.2mutils_word32nswap+0x10: sll %i1, 2, %l6
libmhash.so.2mutils_word32nswap+0x14: call +0x12d494 <0x7ffeff131aa0> libmhash.so.2mutils_word32nswap+0x18: srl %l6, 0, %o0
libmhash.so.2mutils_word32nswap+0x1c: brnz,pn %o0, +0x14 <libmhash.so.2mutils_word32nswap+0x30>
libmhash.so.2mutils_word32nswap+0x20: mov %o0, %i0 libmhash.so.2mutils_word32nswap+0x24: ret
libmhash.so.2mutils_word32nswap+0x28: restore %g0, 0, %o0 libmhash.so.2mutils_word32nswap+0x2c: mov %l4, %i0
libmhash.so.2mutils_word32nswap+0x30: cmp %i1, 0 libmhash.so.2mutils_word32nswap+0x34: bleu,pn %icc,+0x264 <libmhash.so.2<code>mutils_word32nswap+0x298> libmhash.so.2mutils_word32nswap+0x38: cmp %i1, 4 libmhash.so.2mutils_word32nswap+0x3c: bl,pn %icc,+0x200 <libmhash.so.2mutils_word32nswap+0x23c>
libmhash.so.2mutils_word32nswap+0x40: mov %i0, %l6 libmhash.so.2mutils_word32nswap+0x44: sra %i1, 0, %o0
libmhash.so.2mutils_word32nswap+0x48: sub %i0, %l4, %l7 libmhash.so.2mutils_word32nswap+0x4c: srax %l7, 0x3f, %g4
libmhash.so.2mutils_word32nswap+0x50: sethi %hi(0x7ffffc00), %l1 libmhash.so.2mutils_word32nswap+0x54: srl %i1, 0, %l2
libmhash.so.2mutils_word32nswap+0x58: xor %l7, %g4, %g5 libmhash.so.2mutils_word32nswap+0x5c: sllx %o0, 2, %g3
libmhash.so.2mutils_word32nswap+0x60: add %l1, 0x3fe, %l0 libmhash.so.2mutils_word32nswap+0x64: sub %g5, %g4, %g2
libmhash.so.2mutils_word32nswap+0x68: sub %l2, %l0, %o2 libmhash.so.2mutils_word32nswap+0x6c: srlx %o2, 0x3f, %o1
libmhash.so.2mutils_word32nswap+0x70: cmp %g2, %g3 libmhash.so.2mutils_word32nswap+0x74: clr %g1
libmhash.so.2mutils_word32nswap+0x78: and %o1, 1, %i4 libmhash.so.2mutils_word32nswap+0x7c: movge %xcc,1, %g1
libmhash.so.2mutils_word32nswap+0x80: btst %g1, %i4 libmhash.so.2mutils_word32nswap+0x84: be,a,pn %icc,+0x1bc <libmhash.so.2<code>mutils_word32nswap+0x240> libmhash.so.2mutils_word32nswap+0x88: clr %l2 libmhash.so.2mutils_word32nswap+0x8c: sethi %hi(0xfc00), %l5 libmhash.so.2mutils_word32nswap+0x90: add %i1, 0, %g4 libmhash.so.2mutils_word32nswap+0x94: add %l5, 0x300, %l3 libmhash.so.2mutils_word32nswap+0x98: add %i1, -1, %i2 libmhash.so.2mutils_word32nswap+0x9c: clr %l1 libmhash.so.2mutils_word32nswap+0xa0: sethi %hi(0xff000000), %l2 libmhash.so.2mutils_word32nswap+0xa4: sethi %hi(0xff0000), %l5 libmhash.so.2mutils_word32nswap+0xa8: cmp %g4, 5 libmhash.so.2mutils_word32nswap+0xac: bl,pn %icc,+0x13c <libmhash.so.2mutils_word32nswap+0x1e8>
libmhash.so.2mutils_word32nswap+0xb0: sub %i2, 3, %o7 libmhash.so.2mutils_word32nswap+0xb4: add %l1, 1, %l1
libmhash.so.2mutils_word32nswap+0xb8: ld [%l4], %g5 libmhash.so.2mutils_word32nswap+0xbc: add %l4, 4, %l4
libmhash.so.2`mutils_word32nswap+0xc0: and %g5, %l5, %o1</libmhash.so.2<code></libmhash.so.2<code>::regs
%g0 = 0x0000000000000000 %l0 = 0x000000007ffffffe
%g1 = 0x0000000000000001 %l1 = 0x0000000000000001
%g2 = 0x00000001801059c3 %l2 = 0x00000000ff000000
%g3 = 0x0000000000000080 %l3 = 0x000000000000ff00
%g4 = 0x0000000000000020 %l4 = 0xffffffff7fffefcd
%g5 = 0x00000001801059c3 %l5 = 0x0000000000ff0000
%g6 = 0x0000000000000000 %l6 = 0x0000000100104990
%g7 = 0x0000000000000000 %l7 = 0x00000001801059c3
%o0 = 0x0000000000000020 %i0 = 0x0000000100104990
%o1 = 0x0000000000000001 %i1 = 0x0000000000000020
%o2 = 0xffffffff80000022 %i2 = 0x000000000000001f
%o3 = 0x000000007f7e7e7e %i3 = 0x000000006c24cc00
%o4 = 0x00000000007e0000 %i4 = 0x0000000000000001
%o5 = 0x0000000100104990 %i5 = 0x020754a1616aa27a
%o6 = 0xffffffff7fffe151 %i6 = 0xffffffff7fffe201
%o7 = 0x000000000000001c %i7 = 0x00007ffeff0190ec libmhash.so.2`havalTransform3+0xc
%ccr = 0x00 xcc=nzvc icc=nzvc
%y = 0x0000000000000000
%pc = 0x00007ffeff0046b0 libmhash.so.2mutils_word32nswap+0xb8
%npc = 0x00007ffeff0046b4 libmhash.so.2mutils_word32nswap+0xbc
%sp = 0xffffffff7fffe151
%fp = 0xffffffff7fffe201
%asi = 0x82
%fprs = 0x07
It looks like an alignment issue to me.