From be52ac73d120b5bf27f13c41656c6cfe132c8c30 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 16 Jan 2018 09:53:09 +0100 Subject: [PATCH] re PR tree-optimization/83843 (wrong code at -O2) PR tree-optimization/83843 * gimple-ssa-store-merging.c (imm_store_chain_info::output_merged_store): Handle bit_not_p on store_immediate_info for bswap/nop orig_stores. * gcc.dg/store_merging_18.c: New test. From-SVN: r256727 --- gcc/ChangeLog | 7 ++++ gcc/gimple-ssa-store-merging.c | 9 +++++ gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.dg/store_merging_18.c | 51 +++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/store_merging_18.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4af56fc340..69ed57a5b50 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-01-16 Jakub Jelinek + + PR tree-optimization/83843 + * gimple-ssa-store-merging.c + (imm_store_chain_info::output_merged_store): Handle bit_not_p on + store_immediate_info for bswap/nop orig_stores. + 2018-01-15 Andrew Waterman * config/riscv/riscv.c (riscv_rtx_costs) : Increase cost if diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c index 9321177d761..92ddfb55543 100644 --- a/gcc/gimple-ssa-store-merging.c +++ b/gcc/gimple-ssa-store-merging.c @@ -3619,6 +3619,15 @@ imm_store_chain_info::output_merged_store (merged_store_group *group) gimple_seq_add_stmt_without_update (&seq, stmt); src = gimple_assign_lhs (stmt); } + inv_op = invert_op (split_store, 2, int_type, xor_mask); + if (inv_op != NOP_EXPR) + { + stmt = gimple_build_assign (make_ssa_name (int_type), + inv_op, src, xor_mask); + gimple_set_location (stmt, loc); + gimple_seq_add_stmt_without_update (&seq, stmt); + src = gimple_assign_lhs (stmt); + } break; default: src = ops[0]; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7bbeafafa34..506113a4e61 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-01-16 Jakub Jelinek + PR tree-optimization/83843 + * gcc.dg/store_merging_18.c: New test. + PR c++/83817 * g++.dg/cpp1y/pr83817.C: New test. diff --git a/gcc/testsuite/gcc.dg/store_merging_18.c b/gcc/testsuite/gcc.dg/store_merging_18.c new file mode 100644 index 00000000000..43de6ed3d5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/store_merging_18.c @@ -0,0 +1,51 @@ +/* PR tree-optimization/83843 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fdump-tree-store-merging" } */ +/* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target store_merge } } } */ + +__attribute__((noipa)) void +foo (unsigned char *buf, unsigned char *tab) +{ + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = ~(v >> 8); + buf[1] = ~v; +} + +__attribute__((noipa)) void +bar (unsigned char *buf, unsigned char *tab) +{ + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = (v >> 8); + buf[1] = ~v; +} + +__attribute__((noipa)) void +baz (unsigned char *buf, unsigned char *tab) +{ + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = ~(v >> 8); + buf[1] = v; +} + +int +main () +{ + volatile unsigned char l1 = 0; + volatile unsigned char l2 = 1; + unsigned char buf[2]; + unsigned char tab[2] = { l1 + 1, l2 * 2 }; + foo (buf, tab); + if (buf[0] != (unsigned char) ~1 || buf[1] != (unsigned char) ~2) + __builtin_abort (); + buf[0] = l1 + 7; + buf[1] = l2 * 8; + bar (buf, tab); + if (buf[0] != 1 || buf[1] != (unsigned char) ~2) + __builtin_abort (); + buf[0] = l1 + 9; + buf[1] = l2 * 10; + baz (buf, tab); + if (buf[0] != (unsigned char) ~1 || buf[1] != 2) + __builtin_abort (); + return 0; +}