diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2013-02-27 08:56:08 +0000 |
---|---|---|
committer | Andrey Belevantsev <abel@ispras.ru> | 2013-02-27 08:56:08 +0000 |
commit | f5b947fcb18119e0e5466b33f3ca20f71fa2d09e (patch) | |
tree | 9ce85787bc76ebf33091259846b485916408196d /gcc/sel-sched-ir.c | |
parent | ee84361b3e862c95283725ca4c934e0a632e8404 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@196308 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sel-sched-ir.c')
-rw-r--r-- | gcc/sel-sched-ir.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 39dc52f66d9..ae17351b595 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -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); |