From 0cd3301ba72bd155f8808d6395e5766a592e980c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 18 Apr 2002 21:01:15 -0700 Subject: [PATCH] ifcvt.c (find_cond_trap): Handle cases with no proper THEN or JOIN blocks. * ifcvt.c (find_cond_trap): Handle cases with no proper THEN or JOIN blocks. Handle multiple references to the TRAP block. Handle non-adjacent THEN and OTHER blocks. * gcc.dg/20000906-1.c: Enable for all targets. * gcc.c-torture/compile/iftrap-2.c: New. From-SVN: r52509 --- gcc/ChangeLog | 13 +++ gcc/ifcvt.c | 79 ++++++++----------- gcc/testsuite/ChangeLog | 5 ++ .../gcc.c-torture/compile/iftrap-2.c | 10 +++ gcc/testsuite/gcc.dg/20000906-1.c | 3 +- 5 files changed, 60 insertions(+), 50 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/iftrap-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e7f60ad109..6a2aa3ea144 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2002-04-18 Richard Henderson + + * ifcvt.c (find_cond_trap): Handle cases with no proper THEN or JOIN + blocks. Handle multiple references to the TRAP block. Handle + non-adjacent THEN and OTHER blocks. + +2002-04-18 Richard Henderson + + * config/ia64/ia64.c (ia64_function_arg_pass_by_reference): Don't + crash with no type for by-mode libcalls. + + * config/ia64/ia64.md (conditional_trap): Fix predicate polarity. + 2002-04-18 Bob Wilson * config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill, diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 880f94a9f3a..f46a6cf7cc1 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -2080,56 +2080,27 @@ find_cond_trap (test_bb, then_edge, else_edge) basic_block test_bb; edge then_edge, else_edge; { - basic_block then_bb, else_bb, join_bb, trap_bb; + basic_block then_bb, else_bb, trap_bb, other_bb; rtx trap, jump, cond, cond_earliest, seq; enum rtx_code code; then_bb = then_edge->dest; else_bb = else_edge->dest; - join_bb = NULL; /* Locate the block with the trap instruction. */ /* ??? While we look for no successors, we really ought to allow EH successors. Need to fix merge_if_block for that to work. */ - /* ??? We can't currently handle merging the blocks if they are not - already adjacent. Prevent losage in merge_if_block by detecting - this now. */ if ((trap = block_has_only_trap (then_bb)) != NULL) - { - trap_bb = then_bb; - if (else_bb->index != then_bb->index + 1) - return FALSE; - join_bb = else_bb; - else_bb = NULL; - } + trap_bb = then_bb, other_bb = else_bb; else if ((trap = block_has_only_trap (else_bb)) != NULL) - { - trap_bb = else_bb; - if (else_bb->index != then_bb->index + 1) - else_bb = NULL; - else if (then_bb->succ - && ! then_bb->succ->succ_next - && ! (then_bb->succ->flags & EDGE_COMPLEX) - && then_bb->succ->dest->index == else_bb->index + 1) - join_bb = then_bb->succ->dest; - } + trap_bb = else_bb, other_bb = then_bb; else return FALSE; if (rtl_dump_file) { - if (trap_bb == then_bb) - fprintf (rtl_dump_file, - "\nTRAP-IF block found, start %d, trap %d", - test_bb->index, then_bb->index); - else - fprintf (rtl_dump_file, - "\nTRAP-IF block found, start %d, then %d, trap %d", - test_bb->index, then_bb->index, trap_bb->index); - if (join_bb) - fprintf (rtl_dump_file, ", join %d\n", join_bb->index); - else - fputc ('\n', rtl_dump_file); + fprintf (rtl_dump_file, "\nTRAP-IF block found, start %d, trap %d\n", + test_bb->index, trap_bb->index); } /* If this is not a standard conditional jump, we can't parse it. */ @@ -2162,24 +2133,36 @@ find_cond_trap (test_bb, then_edge, else_edge) if (seq == NULL) return FALSE; - /* Emit the new insns before cond_earliest; delete the old jump. */ + /* Emit the new insns before cond_earliest. */ emit_insn_before (seq, cond_earliest); - delete_insn (jump); - /* Delete the trap block together with its insn. */ - if (trap_bb == then_bb) - then_bb = NULL; - else if (else_bb == NULL) - ; - else if (trap_bb == else_bb) - else_bb = NULL; + /* Delete the trap block if possible. */ + remove_edge (trap_bb == then_bb ? then_edge : else_edge); + if (trap_bb->pred == NULL) + { + flow_delete_block (trap_bb); + num_removed_blocks++; + } + + /* If the non-trap block and the test are now adjacent, merge them. + Otherwise we must insert a direct branch. */ + if (test_bb->index + 1 == other_bb->index) + { + delete_insn (jump); + merge_if_block (test_bb, NULL, NULL, other_bb); + } else - abort (); - flow_delete_block (trap_bb); - num_removed_blocks++; + { + rtx lab, newjump; - /* Merge what's left. */ - merge_if_block (test_bb, then_bb, else_bb, join_bb); + lab = JUMP_LABEL (jump); + newjump = emit_jump_insn_after (gen_jump (lab), jump); + LABEL_NUSES (lab) += 1; + JUMP_LABEL (newjump) = lab; + emit_barrier_after (newjump); + + delete_insn (jump); + } return TRUE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00405d86e45..60b580ea696 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-04-18 Richard Henderson + + * gcc.dg/20000906-1.c: Enable for all targets. + * gcc.c-torture/compile/iftrap-2.c: New. + 2002-04-18 Jakub Jelinek * gcc.dg/20020418-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/iftrap-2.c b/gcc/testsuite/gcc.c-torture/compile/iftrap-2.c new file mode 100644 index 00000000000..bb7bb5726b1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/iftrap-2.c @@ -0,0 +1,10 @@ +void foo(int p, int q) +{ + if (p) + { + if (q) + __builtin_trap (); + } + else + bar(); +} diff --git a/gcc/testsuite/gcc.dg/20000906-1.c b/gcc/testsuite/gcc.dg/20000906-1.c index e17d91fbf55..90d09d4dba5 100644 --- a/gcc/testsuite/gcc.dg/20000906-1.c +++ b/gcc/testsuite/gcc.dg/20000906-1.c @@ -1,5 +1,4 @@ -/* The target must support __builtin_trap to run this test. */ -/* { dg-do run { target i?86-*-* mips*-*-* powerpc*-*-* m68k-*-* sparc*-*-* i960*-*-* } } */ +/* { dg-do run } */ /* Testcase distilled from glibc's nss_parse_service_list in nss/nsswitch.c It can't be distilled further. Fails with `-O2' for i[3456]86. */ -- 2.30.2