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.2
havalTransform3+0xc(1001047d4, ffffffff7fffefcd, 100104880, 143367, a19b3906, 1f3213955f32139)
libmhash.so.2havalUpdate+0x130(1001047d0, ffffffff7fffefcc, 81, ffffffffffffffff, 1001047f4, 408) libmhash.so.2
mhash+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.2
mutils_word32nswap+4: btst 0xff, %i2
libmhash.so.2mutils_word32nswap+8: bne,pn %icc,+0x24 <libmhash.so.2
mutils_word32nswap+0x2c>
libmhash.so.2mutils_word32nswap+0xc: mov %i0, %l4 libmhash.so.2
mutils_word32nswap+0x10: sll %i1, 2, %l6
libmhash.so.2mutils_word32nswap+0x14: call +0x12d494 <0x7ffeff131aa0> libmhash.so.2
mutils_word32nswap+0x18: srl %l6, 0, %o0
libmhash.so.2mutils_word32nswap+0x1c: brnz,pn %o0, +0x14 <libmhash.so.2
mutils_word32nswap+0x30>
libmhash.so.2mutils_word32nswap+0x20: mov %o0, %i0 libmhash.so.2
mutils_word32nswap+0x24: ret
libmhash.so.2mutils_word32nswap+0x28: restore %g0, 0, %o0 libmhash.so.2
mutils_word32nswap+0x2c: mov %l4, %i0
libmhash.so.2mutils_word32nswap+0x30: cmp %i1, 0 libmhash.so.2
mutils_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.2
mutils_word32nswap+0x23c>
libmhash.so.2mutils_word32nswap+0x40: mov %i0, %l6 libmhash.so.2
mutils_word32nswap+0x44: sra %i1, 0, %o0
libmhash.so.2mutils_word32nswap+0x48: sub %i0, %l4, %l7 libmhash.so.2
mutils_word32nswap+0x4c: srax %l7, 0x3f, %g4
libmhash.so.2mutils_word32nswap+0x50: sethi %hi(0x7ffffc00), %l1 libmhash.so.2
mutils_word32nswap+0x54: srl %i1, 0, %l2
libmhash.so.2mutils_word32nswap+0x58: xor %l7, %g4, %g5 libmhash.so.2
mutils_word32nswap+0x5c: sllx %o0, 2, %g3
libmhash.so.2mutils_word32nswap+0x60: add %l1, 0x3fe, %l0 libmhash.so.2
mutils_word32nswap+0x64: sub %g5, %g4, %g2
libmhash.so.2mutils_word32nswap+0x68: sub %l2, %l0, %o2 libmhash.so.2
mutils_word32nswap+0x6c: srlx %o2, 0x3f, %o1
libmhash.so.2mutils_word32nswap+0x70: cmp %g2, %g3 libmhash.so.2
mutils_word32nswap+0x74: clr %g1
libmhash.so.2mutils_word32nswap+0x78: and %o1, 1, %i4 libmhash.so.2
mutils_word32nswap+0x7c: movge %xcc,1, %g1
libmhash.so.2mutils_word32nswap+0x80: btst %g1, %i4 libmhash.so.2
mutils_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.2
mutils_word32nswap+0x90: add %i1, 0, %g4 libmhash.so.2mutils_word32nswap+0x94: add %l5, 0x300, %l3 libmhash.so.2
mutils_word32nswap+0x98: add %i1, -1, %i2 libmhash.so.2mutils_word32nswap+0x9c: clr %l1 libmhash.so.2
mutils_word32nswap+0xa0: sethi %hi(0xff000000), %l2 libmhash.so.2mutils_word32nswap+0xa4: sethi %hi(0xff0000), %l5 libmhash.so.2
mutils_word32nswap+0xa8: cmp %g4, 5 libmhash.so.2mutils_word32nswap+0xac: bl,pn %icc,+0x13c <libmhash.so.2
mutils_word32nswap+0x1e8>
libmhash.so.2mutils_word32nswap+0xb0: sub %i2, 3, %o7 libmhash.so.2
mutils_word32nswap+0xb4: add %l1, 1, %l1
libmhash.so.2mutils_word32nswap+0xb8: ld [%l4], %g5 libmhash.so.2
mutils_word32nswap+0xbc: add %l4, 4, %l4
libmhash.so.2`mutils_word32nswap+0xc0: and %g5, %l5, %o1::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.2
mutils_word32nswap+0xbc
%sp = 0xffffffff7fffe151
%fp = 0xffffffff7fffe201
%asi = 0x82
%fprs = 0x07
It looks like an alignment issue to me.