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); +}