From 54b8379a261d1b36958aecbca568ef6475a8e1ca Mon Sep 17 00:00:00 2001 From: Andrey Belevantsev Date: Tue, 30 Apr 2013 14:55:52 +0400 Subject: [PATCH] re PR rtl-optimization/56957 (ICE in add_insn_after, at emit-rtl.c:3783) PR rtl-optimization/56957 PR rtl-optimization/57105 * sel-sched.c (move_op_orig_expr_found): Remove insn_emitted variable. Use just INSN_UID for determining whether an insn should be only disconnected from the insn stream. * sel-sched-ir.h (EXPR_WAS_CHANGED): Remove. * gcc.dg/pr57105.c: New test. From-SVN: r198449 --- gcc/ChangeLog | 10 ++++++++++ gcc/sel-sched-ir.h | 2 -- gcc/sel-sched.c | 7 +++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr57105.c | 18 ++++++++++++++++++ 5 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr57105.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 236a905f7f3..cde1dec3578 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-04-30 Andrey Belevantsev + + PR rtl-optimization/56957 + PR rtl-optimization/57105 + + * sel-sched.c (move_op_orig_expr_found): Remove insn_emitted + variable. Use just INSN_UID for determining whether an insn + should be only disconnected from the insn stream. + * sel-sched-ir.h (EXPR_WAS_CHANGED): Remove. + 2013-04-30 Jakub Jelinek PR tree-optimization/57104 diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h index 6d9394a4428..486159dd262 100644 --- a/gcc/sel-sched-ir.h +++ b/gcc/sel-sched-ir.h @@ -191,8 +191,6 @@ typedef expr_def *expr_t; #define EXPR_WAS_RENAMED(EXPR) ((EXPR)->was_renamed) #define EXPR_CANT_MOVE(EXPR) ((EXPR)->cant_move) -#define EXPR_WAS_CHANGED(EXPR) (EXPR_HISTORY_OF_CHANGES (EXPR).length () > 0) - /* Insn definition for list of original insns in find_used_regs. */ struct _def { diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index 11bf2e62c31..fb9386f9690 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -6051,14 +6051,13 @@ move_op_orig_expr_found (insn_t insn, expr_t expr, cmpd_local_params_p lparams ATTRIBUTE_UNUSED, void *static_params) { - bool only_disconnect, insn_emitted; + bool only_disconnect; moveop_static_params_p params = (moveop_static_params_p) static_params; copy_expr_onside (params->c_expr, INSN_EXPR (insn)); track_scheduled_insns_and_blocks (insn); - insn_emitted = handle_emitting_transformations (insn, expr, params); - only_disconnect = (params->uid == INSN_UID (insn) - && ! insn_emitted && ! EXPR_WAS_CHANGED (expr)); + handle_emitting_transformations (insn, expr, params); + only_disconnect = params->uid == INSN_UID (insn); /* Mark that we've disconnected an insn. */ if (only_disconnect) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77183feb8f2..00576eec6a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-30 Andrey Belevantsev + + PR rtl-optimization/57105 + * gcc.dg/pr57105.c: New test. + 2013-04-30 Jakub Jelinek PR tree-optimization/57104 diff --git a/gcc/testsuite/gcc.dg/pr57105.c b/gcc/testsuite/gcc.dg/pr57105.c new file mode 100644 index 00000000000..a968f52375e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr57105.c @@ -0,0 +1,18 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-Os -fselective-scheduling2 -g" } */ +int bar (int); +int *baz (int *); + +void +foo (int a) +{ + while (bar (0)) + { + int *c = baz (0); + if (a) + { + int i = *baz (c); + } + bar (*baz (c)); + } +}