From 758671b88b78d7629376b118ec6ca6bcfbabbd36 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 25 Feb 2022 10:55:17 +0100 Subject: [PATCH] match.pd: Don't create BIT_NOT_EXPRs for COMPLEX_TYPE [PR104675] We don't support BIT_{AND,IOR,XOR,NOT}_EXPR on complex types, &/|/^ are just rejected for them, and ~ is parsed as CONJ_EXPR. So, we should avoid simplifications which turn valid complex type expressions into something that will ICE during expansion. 2022-02-25 Jakub Jelinek PR tree-optimization/104675 * match.pd (-A - 1 -> ~A, -1 - A -> ~A): Don't simplify for COMPLEX_TYPE. * gcc.dg/pr104675-1.c: New test. * gcc.dg/pr104675-2.c: New test. --- gcc/match.pd | 4 +++- gcc/testsuite/gcc.dg/pr104675-1.c | 29 +++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr104675-2.c | 18 ++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr104675-1.c create mode 100644 gcc/testsuite/gcc.dg/pr104675-2.c diff --git a/gcc/match.pd b/gcc/match.pd index cf78a11ddd4..0bd0ac887e6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2776,13 +2776,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (minus (convert? (negate @0)) integer_each_onep) (if (!TYPE_OVERFLOW_TRAPS (type) + && TREE_CODE (type) != COMPLEX_TYPE && tree_nop_conversion_p (type, TREE_TYPE (@0))) (bit_not (convert @0)))) /* -1 - A -> ~A */ (simplify (minus integer_all_onesp @0) - (bit_not @0)) + (if (TREE_CODE (type) != COMPLEX_TYPE) + (bit_not @0))) /* (T)(P + A) - (T)P -> (T) A */ (simplify diff --git a/gcc/testsuite/gcc.dg/pr104675-1.c b/gcc/testsuite/gcc.dg/pr104675-1.c new file mode 100644 index 00000000000..af0b4390c30 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr104675-1.c @@ -0,0 +1,29 @@ +/* PR tree-optimization/104675 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +_Complex int +foo (_Complex int a) +{ + return (-1 + -1i) - a; +} + +_Complex int +bar (_Complex int a) +{ + return -a - (1 + 1i); +} + +_Complex int +baz (_Complex int a) +{ + _Complex int b = -1 + -1i; + return b - a; +} + +_Complex int +qux (_Complex int a) +{ + _Complex int b = 1 + 1i; + return -a - b; +} diff --git a/gcc/testsuite/gcc.dg/pr104675-2.c b/gcc/testsuite/gcc.dg/pr104675-2.c new file mode 100644 index 00000000000..037d0c4f10d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr104675-2.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/104675 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void baz (int i); + +void +bar (_Complex int c, short s) +{ + c -= s; + baz (__real__ c + __imag__ c); +} + +void +foo (void) +{ + bar (-1 - 1i, 0); +}