re PR middle-end/45472 ([Middle-end volatile semantics] ICE: in move_op_ascend, at sel-sched.c:6124 with -fselective-scheduling2)

PR middle-end/45472

	gcc/
        * sel-sched-ir.c (merge_expr): Also change vinsn of merged expr
        when the may_trap_p bit of the exprs being merged differs.

        Reorder tests for speculativeness in the logical and operator.

	testsuite/
	* gcc.dg/45472.c: New test.

From-SVN: r196308
This commit is contained in:
Andrey Belevantsev 2013-02-27 12:56:08 +04:00 committed by Andrey Belevantsev
parent 0fcb564b72
commit 436a956a80
4 changed files with 41 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2013-02-27 Andrey Belevantsev <abel@ispras.ru>
PR middle-end/45472
* sel-sched-ir.c (merge_expr): Also change vinsn of merged expr
when the may_trap_p bit of the exprs being merged differs.
Reorder tests for speculativeness in the logical and operator.
2013-02-27 Jakub Jelinek <jakub@redhat.com>
* incpath.c (add_standard_paths): Use reconcat instead of concat

View File

@ -1866,8 +1866,12 @@ merge_expr (expr_t to, expr_t from, insn_t split_point)
/* Make sure that speculative pattern is propagated into exprs that
have non-speculative one. This will provide us with consistent
speculative bits and speculative patterns inside expr. */
if (EXPR_SPEC_DONE_DS (to) == 0
&& EXPR_SPEC_DONE_DS (from) != 0)
if ((EXPR_SPEC_DONE_DS (from) != 0
&& EXPR_SPEC_DONE_DS (to) == 0)
/* Do likewise for volatile insns, so that we always retain
the may_trap_p bit on the resulting expression. */
|| (VINSN_MAY_TRAP_P (EXPR_VINSN (from))
&& !VINSN_MAY_TRAP_P (EXPR_VINSN (to))))
change_vinsn_in_expr (to, EXPR_VINSN (from));
merge_expr_data (to, from, split_point);

View File

@ -1,3 +1,8 @@
2013-02-27 Andrey Belevantsev <abel@ispras.ru>
PR middle-end/45472
* gcc.dg/pr45472.c: New test.
2013-02-26 Marek Polacek <polacek@redhat.com>
PR tree-optimization/56426

View File

@ -0,0 +1,21 @@
/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
/* { dg-options "-O -fschedule-insns2 -fselective-scheduling2" } */
struct S
{
volatile long vl;
int i;
};
struct S s1, s2;
void
foo (int j, int c)
{
int i;
for (i = 0; i <= j; i++)
{
if (c)
s2.vl += s1.vl;
s1 = s2;
}
}