From e3358dd36bd69327e0fe20d9fe2950751c6dfbeb Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 20 Jul 2019 17:13:00 +0000 Subject: PR target/91204 * optabs.c (expand_unop): As fallback, expand ~op0 as op0 ^ -1. * gcc.c-torture/compile/pr91204.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@273629 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/optabs.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/compile/pr91204.c | 11 +++++++++++ 4 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr91204.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8adea2d7b35..535636bb830 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-20 Jakub Jelinek + + PR target/91204 + * optabs.c (expand_unop): As fallback, expand ~op0 as op0 ^ -1. + 2019-07-20 John David Anglin * config/pa/pa.h (hppa_profile_hook): Delete declaration. diff --git a/gcc/optabs.c b/gcc/optabs.c index 4b39ff61193..06bcaab1f55 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -2972,6 +2972,17 @@ expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target, return target; } + /* Emit ~op0 as op0 ^ -1. */ + if (unoptab == one_cmpl_optab + && (SCALAR_INT_MODE_P (mode) || GET_MODE_CLASS (mode) == MODE_VECTOR_INT) + && optab_handler (xor_optab, mode) != CODE_FOR_nothing) + { + temp = expand_binop (mode, xor_optab, op0, CONSTM1_RTX (mode), + target, unsignedp, OPTAB_DIRECT); + if (temp) + return temp; + } + if (optab_to_code (unoptab) == NEG) { /* Try negating floating point values by flipping the sign bit. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index adefdb937ab..cd553db4b39 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-07-20 Jakub Jelinek + PR target/91204 + * gcc.c-torture/compile/pr91204.c: New test. + * c-c++-common/gomp/cancel-1.c: Adjust expected diagnostic wording. * c-c++-common/gomp/clauses-1.c (foo, baz, bar): Add order(concurrent) clause where allowed. Add combined constructs with loop with all diff --git a/gcc/testsuite/gcc.c-torture/compile/pr91204.c b/gcc/testsuite/gcc.c-torture/compile/pr91204.c new file mode 100644 index 00000000000..dc267329eda --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr91204.c @@ -0,0 +1,11 @@ +/* PR target/91204 */ + +int a, b, c[64]; + +void +foo (void) +{ + int i; + for (i = 2; i < 64; i++) + c[i] &= b ^ c[i] ^ c[i - 2]; +} -- cgit v1.2.3