------- Comment #4 from danglin at gcc dot gnu dot org 2007-08-26 23:20 ------- The patch proposed here fixes the failures on hppa2.0w-hp-hpux11.11. However, I'm still left with the failure of pr32912-2.c on hppa64-hp-hpux*.
The function foo is miscompiled: .align 8 L$C0000: .dword 0x11111111222222224444444400000000 .text .align 8 .globl foo .type foo, @function foo: .PROC .CALLINFO FRAME=0,NO_CALLS .ENTRY addil LT'L$C0000,%r27 ldd RT'L$C0000(%r1),%r31 ldd 0(%r31),%r28 bve (%r2) copy %r28,%r29 .EXIT .PROCEND This is foo after final_cleanup: ;; Function foo (foo) foo () { <bb 2>: return { 286331153, 572662306, 1145324612 }; } This is the RTL generated by expand: ;; ;; Full RTL generated for this function: ;; (note 1 0 4 NOTE_INSN_DELETED) ;; Start of basic block ( 0) -> 2 ;; Pred edge ENTRY [100.0%] (fallthru) (note 4 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK) (insn 2 4 3 2 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg/f: DI 68) (reg/f:DI 61 virtual-incoming-args)) -1 (nil)) (note 3 2 5 2 NOTE_INSN_FUNCTION_BEG) ;; End of basic block 2 -> ( 3) ;; Succ edge 3 [100.0%] (fallthru) ;; Start of basic block ( 2) -> 3 ;; Pred edge 2 [100.0%] (fallthru) (note 5 3 6 3 [bb 3] NOTE_INSN_BASIC_BLOCK) (insn 6 5 7 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg:DI 71) (plus:DI (reg:DI 27 %r27) (high:DI (symbol_ref/u:DI ("*L$C0000") [flags 0x2])))) -1 (nil)) (insn 7 6 8 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg/f: DI 70) (mem/u/c:DI (lo_sum:DI (reg:DI 71) (unspec:DI [ (symbol_ref/u:DI ("*L$C0000") [flags 0x2]) ] 2)) [0 S8 A64])) -1 (expr_list:REG_EQUAL (symbol_ref/u:DI ("*L$C0000") [flags 0x2]) (nil))) (insn 8 7 9 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg:DI 66 [ <result> ]) (mem/u/c/i:DI (reg/f:DI 70) [2 S8 A64])) -1 (expr_list:REG_EQUAL (const_ double 4919131751843889152 [0x4444444400000000] 1229782938533634594 [0x111111112 2222222] 0 [0x0] 0 [0x0]) (nil))) (insn 9 8 10 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg:D I 73) (plus:DI (reg:DI 27 %r27) (high:DI (symbol_ref/u:DI ("*L$C0000") [flags 0x2])))) -1 (nil)) (insn 10 9 11 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg/ f:DI 72) (mem/u/c:DI (lo_sum:DI (reg:DI 73) (unspec:DI [ (symbol_ref/u:DI ("*L$C0000") [flags 0x2]) ] 2)) [0 S8 A64])) -1 (expr_list:REG_EQUAL (symbol_ref/u:DI ("*L$C0000") [flags 0x2]) (nil))) (insn 11 10 12 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (reg /f:DI 67 [ <result>+8 ]) (mem/u/c/i:DI (reg/f:DI 72) [2 S8 A64])) -1 (expr_list:REG_EQUAL (const_ double 4919131751843889152 [0x4444444400000000] 1229782938533634594 [0x111111112 2222222] 0 [0x0] 0 [0x0]) (nil))) (jump_insn 12 11 13 3 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:10 (set (pc) (label_ref 14)) -1 (nil)) ;; End of basic block 3 -> ( 5) ;; Succ edge 5 [100.0%] (barrier 13 12 24) ;; Start of basic block () -> 4 (note 24 13 17 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 17 24 18 4 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (clobber (reg:DI 28 %r28)) -1 (nil)) (insn 18 17 19 4 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (clobber (reg/f:DI 29 %r29)) -1 (nil)) (jump_insn 19 18 20 4 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (set (pc) (label_ref 21)) -1 (nil)) ;; End of basic block 4 -> ( 6) ;; Succ edge 6 [100.0%] (barrier 20 19 14) ;; Start of basic block ( 3) -> 5 ;; Pred edge 3 [100.0%] (code_label 14 20 25 5 1 "" [1 uses]) (note 25 14 15 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 15 25 16 5 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (set (reg :DI 28 %r28) (reg:DI 66 [ <result> ])) -1 (nil)) (insn 16 15 21 5 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (set (reg /f:DI 29 %r29) (reg/f:DI 67 [ <result>+8 ])) -1 (nil)) ;; End of basic block 5 -> ( 6) ;; Succ edge 6 [100.0%] (fallthru) ;; Start of basic block ( 4 5) -> 6 ;; Pred edge 4 [100.0%] ;; Pred edge 5 [100.0%] (fallthru) (code_label 21 16 26 6 2 "" [1 uses]) (note 26 21 22 6 [bb 6] NOTE_INSN_BASIC_BLOCK) (insn 22 26 23 6 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (use (reg :DI 28 %r28)) -1 (nil)) (insn 23 22 0 6 /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/pr32912-2.c:13 (use (reg/ f:DI 29 %r29)) -1 (nil)) ;; End of basic block 6 -> ( 1) ;; Succ edge EXIT [100.0%] (fallthru) There isn't any increment in the memory addressing for the two halves of the vector. I'm also concerned about using .dword for a 128 bit value. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33153