All EH related tests fail on all hppa targets using dwarf2 EH support. See for example: <http://gcc.gnu.org/ml/gcc-testresults/2007-07/msg00634.html>.
I looked at the failure of gcc.dg/cleanup-8.c. The following code appears to be miscompiled: #define uw_install_context(CURRENT, TARGET) \ do \ { \ long offset = uw_install_context_1 ((CURRENT), (TARGET)); \ void *handler = __builtin_frob_return_addr ((TARGET)->ra); \ __builtin_eh_return (offset, handler); \ } \ while (0) Prior to the dataflow merge, we have the following assembler code: 0x00013308 <_Unwind_ForcedUnwind+384>: b,l 0x113bc <uw_install_context_1>,rp 0x0001330c <_Unwind_ForcedUnwind+388>: copy r3,r25 0x00013310 <_Unwind_ForcedUnwind+392>: copy ret0,ret1 0x00013314 <_Unwind_ForcedUnwind+396>: ldw -164(sp),ret0 0x00013318 <_Unwind_ForcedUnwind+400>: b,l 0x13278 <_Unwind_ForcedUnwind+240>,r0 0x0001331c <_Unwind_ForcedUnwind+404>: stw ret0,-4d4(sp) The last instruction stores the new address for the return pointer into the frame. The epilogue at _Unwind_ForcedUnwind+240 loads the return pointer from this location. After the dataflow merge, we have the following: 0x000137f4 <_Unwind_ForcedUnwind+384>: b,l 0x10e34 <uw_install_context_1>,rp 0x000137f8 <_Unwind_ForcedUnwind+388>: copy r3,r25 0x000137fc <_Unwind_ForcedUnwind+392>: b,l 0x13764 <_Unwind_ForcedUnwind+240>,r0 0x00013800 <_Unwind_ForcedUnwind+396>: copy ret0,ret1 The new return pointer isn't saved in the frame, so _Unwind_ForcedUnwind returns to the wrong place. It looks like the insns are dropped the dse1 pass. We have the following after the cse2 pass: ;; Start of basic block ( 2) -> 4 ;; bb 4 artificial_defs: { } ;; bb 4 artificial_uses: { u54(3){ }u55(19){ }u56(30){ }} ;; lr in 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; lr use 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; lr def 0 [%r0] 1 [%r1] 2 [%r2] 4 [%r4] 19 [%r19] 20 [%r20] 21 [%r21] 2 2 [%r22] 23 [%r23] 24 [%r24] 25 [%r25] 26 [%r26] 27 [%r27] 28 [%r28] 29 [%r29] 3 1 [%r31] 32 [%fr4] 33 [%fr4R] 34 [%fr5] 35 [%fr5R] 36 [%fr6] 37 [%fr6R] 38 [%fr7 ] 39 [%fr7R] 40 [%fr8] 41 [%fr8R] 42 [%fr9] 43 [%fr9R] 44 [%fr10] 45 [%fr10R] 46 [%fr11] 47 [%fr11R] 68 [%fr22] 69 [%fr22R] 70 [%fr23] 71 [%fr23R] 72 [%fr24] 73 [%fr24R] 74 [%fr25] 75 [%fr25R] 76 [%fr26] 77 [%fr26R] 78 [%fr27] 79 [%fr27R] 80 [%fr28] 81 [%fr28R] 82 [%fr29] 83 [%fr29R] 84 [%fr30] 85 [%fr30R] 86 [%fr31] 87 [%fr31R] 88 [SAR] 94 95 99 ;; live in 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; live gen 25 [%r25] 26 [%r26] 28 [%r28] 29 [%r29] 94 95 ;; live kill 1 [%r1] 2 [%r2] 4 [%r4] 28 [%r28] 99 ;; Pred edge 2 [1.0%] (code_label 34 47 35 4 546 "" [1 uses]) (note 35 34 37 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 37 35 38 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg:SI 26 %r26) (reg/f:SI 113)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/f:SI 113) (expr_list:REG_EQUAL (plus:SI (reg/f:SI 3 %r3) (const_int 8 [0x8])) (nil)))) (insn 38 37 39 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg:SI 25 %r25) (reg/f:SI 104)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/f:SI 104) (expr_list:REG_EQUAL (plus:SI (reg/f:SI 3 %r3) (const_int 496 [0x1f0])) (nil)))) (call_insn 39 38 40 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (parallel [ (set (reg:SI 28 %r28) (call (mem:SI (symbol_ref/v:SI ("@uw_install_context_1") [flags 0x203] <function_decl 0x404bc080 uw_install_context_1>) [0 S4 A32]) (const_int 16 [0x10]))) (clobber (reg:SI 1 %r1)) (clobber (reg:SI 2 %r2)) (clobber (reg:SI 4 %r4)) (use (reg:SI 19 %r19)) (use (const_int 0 [0x0])) ]) 216 {call_val_symref_pic} (expr_list:REG_DEAD (reg:SI 26 %r26) (expr_list:REG_DEAD (reg:SI 25 %r25) (nil))) (expr_list:REG_DEP_TRUE (use (reg:SI 25 %r25)) (expr_list:REG_DEP_TRUE (use (reg:SI 26 %r26)) (nil)))) (insn 40 39 41 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg/v:SI 95 [ offset ]) (reg:SI 28 %r28)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg:SI 28 %r28) (nil))) (insn 41 40 51 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg/v/f:SI 94 [ handler ]) (mem/s/f/c:SI (plus:SI (reg/f:SI 3 %r3) (const_int 860 [0x35c])) [4 cur_context.ra+0 S4 A32])) 37 {*pa.md:2543} (nil)) (insn 51 41 52 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (clobber (reg/i:SI 28 %r28 [ <result> ])) -1 (expr_list:REG_UNUSED (reg/i:SI 28 %r28 [ <result> ]) (nil))) (insn 52 51 53 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (clobber (reg:SI 99 [ <result> ])) -1 (expr_list:REG_UNUSED (reg:SI 99 [ <result> ]) (nil))) (insn 53 52 54 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (set (reg:SI 29 %r29 [ offset ]) (reg/v:SI 95 [ offset ])) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/v:SI 95 [ offset ]) (nil))) (insn 54 53 55 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (set (mem:SI (plus:SI (reg/f:SI 3 %r3) (const_int -20 [0xffffffec])) [0 S4 A32]) (reg/v/f:SI 94 [ handler ])) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/v/f:SI 94 [ handler ]) (nil))) ;; End of basic block 4 -> ( 5) ;; lr out 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; live out 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] ;; Succ edge 5 [100.0%] (fallthru) ;; Start of basic block ( 3 4) -> 5 ;; bb 5 artificial_defs: { } ;; bb 5 artificial_uses: { u76(3){ }u77(19){ }u78(30){ }} ;; lr in 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; lr use 3 [%r3] 19 [%r19] 30 [%r30] 99 ;; lr def 28 [%r28] ;; live in 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; live gen 28 [%r28] ;; live kill ;; Pred edge 3 [100.0%] (fallthru) ;; Pred edge 4 [100.0%] (fallthru) (code_label 55 54 66 5 548 "" [0 uses]) (note 66 55 56 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 56 66 62 5 ../../../gcc/libgcc/../gcc/unwind.inc:216 (set (reg/i:SI 28 %r28 [ <result> ]) (reg:SI 99 [ <result> ])) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg:SI 99 [ <result> ]) (nil))) (insn 62 56 0 5 ../../../gcc/libgcc/../gcc/unwind.inc:216 (use (reg/i:SI 28 %r28 [ <result> ])) -1 (nil)) ;; End of basic block 5 -> ( 1) ;; lr out 3 [%r3] 19 [%r19] 28 [%r28] 29 [%r29] 30 [%r30] ;; live out 3 [%r3] 19 [%r19] 28 [%r28] 29 [%r29] 30 [%r30] ;; Succ edge EXIT [100.0%] (fallthru) We have the following after the dse1 pass: ... **scanning insn=41 mem: (plus:SI (reg/f:SI 3 %r3) (const_int 860 [0x35c])) after cselib_expand address: (plus:SI (reg/f:SI 3 %r3) (const_int 860 [0x35c])) after canon_rtx address: (plus:SI (reg/f:SI 3 %r3) (const_int 860 [0x35c])) gid=4 offset=860 processing const load gid=4[860..864) mems_found = 0, cannot_delete = true ... **scanning insn=54 mem: (plus:SI (reg/f:SI 3 %r3) (const_int -20 [0xffffffec])) after cselib_expand address: (plus:SI (reg/f:SI 3 %r3) (const_int -20 [0xffffffec])) after canon_rtx address: (plus:SI (reg/f:SI 3 %r3) (const_int -20 [0xffffffec])) gid=4 offset=-20 processing const base store gid=4[-20..-16) mems_found = 1, cannot_delete = false ... starting to process insn 54 v: 1, 2, 3, 4 i = -20, index = 4 i = -19, index = 3 i = -18, index = 2 i = -17, index = 1 deferring deletion of insn with uid = 54. ... starting to process insn 41 v: 1, 2, 3, 4 regular read ... ;; Start of basic block ( 2) -> 4 ;; bb 4 artificial_defs: { } ;; bb 4 artificial_uses: { u54(3){ }u55(19){ }u56(30){ }} ;; lr in 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; lr use 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; lr def 0 [%r0] 1 [%r1] 2 [%r2] 4 [%r4] 19 [%r19] 20 [%r20] 21 [%r21] 2 2 [%r22] 23 [%r23] 24 [%r24] 25 [%r25] 26 [%r26] 27 [%r27] 28 [%r28] 29 [%r29] 3 1 [%r31] 32 [%fr4] 33 [%fr4R] 34 [%fr5] 35 [%fr5R] 36 [%fr6] 37 [%fr6R] 38 [%fr7 ] 39 [%fr7R] 40 [%fr8] 41 [%fr8R] 42 [%fr9] 43 [%fr9R] 44 [%fr10] 45 [%fr10R] 46 [%fr11] 47 [%fr11R] 68 [%fr22] 69 [%fr22R] 70 [%fr23] 71 [%fr23R] 72 [%fr24] 73 [%fr24R] 74 [%fr25] 75 [%fr25R] 76 [%fr26] 77 [%fr26R] 78 [%fr27] 79 [%fr27R] 8 0 [%fr28] 81 [%fr28R] 82 [%fr29] 83 [%fr29R] 84 [%fr30] 85 [%fr30R] 86 [%fr31] 8 7 [%fr31R] 88 [SAR] 94 95 99 ;; live in 3 [%r3] 19 [%r19] 30 [%r30] 104 113 ;; live gen 25 [%r25] 26 [%r26] 28 [%r28] 29 [%r29] 94 95 ;; live kill 1 [%r1] 2 [%r2] 4 [%r4] 28 [%r28] 99 ;; Pred edge 2 [1.0%] (code_label 34 47 35 4 546 "" [1 uses]) (note 35 34 37 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (insn 37 35 38 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg:SI 26 %r26) (reg/f:SI 113)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/f:SI 113) (expr_list:REG_EQUAL (plus:SI (reg/f:SI 3 %r3) (const_int 8 [0x8])) (nil)))) (insn 38 37 39 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg:SI 25 %r25) (reg/f:SI 104)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/f:SI 104) (expr_list:REG_EQUAL (plus:SI (reg/f:SI 3 %r3) (const_int 496 [0x1f0])) (nil)))) (call_insn 39 38 40 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (parallel [ (set (reg:SI 28 %r28) (call (mem:SI (symbol_ref/v:SI ("@uw_install_context_1") [flags 0x203] <function_decl 0x404bc080 uw_install_context_1>) [0 S4 A32]) (const_int 16 [0x10]))) (clobber (reg:SI 1 %r1)) (clobber (reg:SI 2 %r2)) (clobber (reg:SI 4 %r4)) (use (reg:SI 19 %r19)) (use (const_int 0 [0x0])) ]) 216 {call_val_symref_pic} (expr_list:REG_DEAD (reg:SI 26 %r26) (expr_list:REG_DEAD (reg:SI 25 %r25) (nil))) (expr_list:REG_DEP_TRUE (use (reg:SI 25 %r25)) (expr_list:REG_DEP_TRUE (use (reg:SI 26 %r26)) (nil)))) (insn 40 39 41 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg/v:SI 95 [ offset ]) (reg:SI 28 %r28)) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg:SI 28 %r28) (nil))) (insn 41 40 51 4 ../../../gcc/libgcc/../gcc/unwind.inc:215 (set (reg/v/f:SI 94 [ handler ]) (mem/s/f/c:SI (plus:SI (reg/f:SI 3 %r3) (const_int 860 [0x35c])) [4 cur_context.ra+0 S4 A32])) 37 {*pa.md:2543} (nil)) (insn 51 41 52 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (clobber (reg/i:SI 28 %r28 [ <result> ])) -1 (expr_list:REG_UNUSED (reg/i:SI 28 %r28 [ <result> ]) (nil))) (insn 52 51 53 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (clobber (reg:SI 99 [ <result> ])) -1 (expr_list:REG_UNUSED (reg:SI 99 [ <result> ]) (nil))) (insn 53 52 55 4 ../../../gcc/libgcc/../gcc/unwind.inc:216 (set (reg:SI 29 %r29 [ offset ]) (reg/v:SI 95 [ offset ])) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg/v:SI 95 [ offset ]) (nil))) ;; End of basic block 4 -> ( 5) ;; lr out 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; live out 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] ;; Succ edge 5 [100.0%] (fallthru) ;; Start of basic block ( 3 4) -> 5 ;; bb 5 artificial_defs: { } ;; bb 5 artificial_uses: { u76(3){ }u77(19){ }u78(30){ }} ;; lr in 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; lr use 3 [%r3] 19 [%r19] 30 [%r30] 99 ;; lr def 28 [%r28] ;; live in 3 [%r3] 19 [%r19] 29 [%r29] 30 [%r30] 99 ;; live gen 28 [%r28] ;; live kill ;; Pred edge 3 [100.0%] (fallthru) ;; Pred edge 4 [100.0%] (fallthru) (code_label 55 53 66 5 548 "" [0 uses]) (note 66 55 56 5 [bb 5] NOTE_INSN_BASIC_BLOCK) (insn 56 66 62 5 ../../../gcc/libgcc/../gcc/unwind.inc:216 (set (reg/i:SI 28 %r28 [ <result> ]) (reg:SI 99 [ <result> ])) 37 {*pa.md:2543} (expr_list:REG_DEAD (reg:SI 99 [ <result> ]) (nil))) (insn 62 56 0 5 ../../../gcc/libgcc/../gcc/unwind.inc:216 (use (reg/i:SI 28 %r28 [ <result> ])) -1 (nil)) ;; End of basic block 5 -> ( 1) ;; lr out 3 [%r3] 19 [%r19] 28 [%r28] 29 [%r29] 30 [%r30] ;; live out 3 [%r3] 19 [%r19] 28 [%r28] 29 [%r29] 30 [%r30] ;; Succ edge EXIT [100.0%] (fallthru) starting the processing of deferred insns deleting insn with uid = 54. ending the processing of deferred insns -- Summary: __builtin_eh_return broken by dataflow merge Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: danglin at gcc dot gnu dot org GCC build triplet: hppa*-*-* GCC host triplet: hppa*-*-* GCC target triplet: hppa*-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32769