From 5ef5a3b7c21df246f1e023f765d61c445cef4d71 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 6 Sep 2012 09:29:12 +0200 Subject: [PATCH] re PR rtl-optimization/54455 (ICE: RTL check: expected elt 3 type 'B', have '0' (rtx barrier) in compute_bb_for_insn, at cfgrtl.c:418) PR rtl-optimization/54455 * sel-sched-ir.c (maybe_tidy_empty_bb): Give up if previous fallthru bb ends up with asm goto referencing bb's label. * gcc.dg/54455.c: New test. From-SVN: r191013 --- gcc/ChangeLog | 6 ++++++ gcc/fortran/ChangeLog | 2 +- gcc/sel-sched-ir.c | 18 +++++++++++++++++- gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/gcc.dg/54455.c | 25 +++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/54455.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be5aeebdfd5..ca501249a3a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-09-06 Jakub Jelinek + + PR rtl-optimization/54455 + * sel-sched-ir.c (maybe_tidy_empty_bb): Give up if previous fallthru + bb ends up with asm goto referencing bb's label. + 2012-09-06 Chen Liqin * config/score/score.c: Remove TARGET_LEGITIMIZE_ADDRESS define diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9b616c2af3a..d237a24ef4f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,4 @@ -2012-09-06 Tobias Burnus +2012-09-06 Tobias Burnus PR fortran/54463 * trans-intrinsic.c (gfc_conv_intrinsic_funcall): Fix matmul diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 449efc97cbc..1f1095ecfed 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -1,5 +1,5 @@ /* Instruction scheduling pass. Selective scheduler and pipeliner. - Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 + Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -3686,6 +3686,22 @@ maybe_tidy_empty_bb (basic_block bb) FOR_EACH_EDGE (e, ei, bb->preds) if (e->flags & EDGE_COMPLEX) return false; + else if (e->flags & EDGE_FALLTHRU) + { + rtx note; + /* If prev bb ends with asm goto, see if any of the + ASM_OPERANDS_LABELs don't point to the fallthru + label. Do not attempt to redirect it in that case. */ + if (JUMP_P (BB_END (e->src)) + && (note = extract_asm_operands (PATTERN (BB_END (e->src))))) + { + int i, n = ASM_OPERANDS_LABEL_LENGTH (note); + + for (i = 0; i < n; ++i) + if (XEXP (ASM_OPERANDS_LABEL (note, i), 0) == BB_HEAD (bb)) + return false; + } + } free_data_sets (bb); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7089b59b1ef..8589e9ec463 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2012-09-06 Tobias Burnus +2012-09-06 Jakub Jelinek + + PR rtl-optimization/54455 + * gcc.dg/54455.c: New test. + +2012-09-06 Tobias Burnus PR fortran/54463 * gfortran.dg/promotion_2.f90: New. diff --git a/gcc/testsuite/gcc.dg/54455.c b/gcc/testsuite/gcc.dg/54455.c new file mode 100644 index 00000000000..de68a53e233 --- /dev/null +++ b/gcc/testsuite/gcc.dg/54455.c @@ -0,0 +1,25 @@ +/* PR rtl-optimization/54455 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fschedule-insns -fselective-scheduling --param max-sched-extend-regions-iters=2" } */ + +extern void fn1 (void), fn2 (void); + +static inline __attribute__((always_inline)) int +foo (int *x, long y) +{ + asm goto ("" : : "r" (x), "r" (y) : "memory" : lab); + return 0; +lab: + return 1; +} + +void +bar (int *x) +{ + if (foo (x, 23)) + fn1 (); + else + fn2 (); + + foo (x, 2); +} -- 2.30.2