aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-07-18 20:24:45 +0000
committerRichard Stallman <rms@gnu.org>1993-07-18 20:24:45 +0000
commit551064b16e9a308ebc279316494adc2763e48a5d (patch)
tree1db7eacc135a8ed0f7727b7b6b08b9cf9c4391eb /gcc/fold-const.c
parentcba389cdf9bd114a1f28bea0a4ca6b6036fecfba (diff)
downloadgcc-551064b16e9a308ebc279316494adc2763e48a5d.zip
gcc-551064b16e9a308ebc279316494adc2763e48a5d.tar.gz
gcc-551064b16e9a308ebc279316494adc2763e48a5d.tar.bz2
(fold): Handle CONJ_EXPR.
From-SVN: r4938
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index de5630b..5b9d851 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3485,6 +3485,30 @@ fold (expr)
return build1 (ABS_EXPR, type, TREE_OPERAND (arg0, 0));
return t;
+ case CONJ_EXPR:
+ if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
+ return arg0;
+ else if (TREE_CODE (arg0) == COMPLEX_EXPR)
+ return build (COMPLEX_EXPR, TREE_TYPE (arg0),
+ TREE_OPERAND (arg0, 0),
+ fold (build1 (NEGATE_EXPR,
+ TREE_TYPE (TREE_TYPE (arg0)),
+ TREE_OPERAND (arg0, 1))));
+ else if (TREE_CODE (arg0) == COMPLEX_CST)
+ return build_complex (TREE_OPERAND (arg0, 0),
+ fold (build1 (NEGATE_EXPR,
+ TREE_TYPE (TREE_TYPE (arg0)),
+ TREE_OPERAND (arg0, 1))));
+ else if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
+ return fold (build (TREE_CODE (arg0), type,
+ fold (build1 (CONJ_EXPR, type,
+ TREE_OPERAND (arg0, 0))),
+ fold (build1 (CONJ_EXPR,
+ type, TREE_OPERAND (arg0, 1)))));
+ else if (TREE_CODE (arg0) == CONJ_EXPR)
+ return TREE_OPERAND (arg0, 0);
+ return t;
+
case BIT_NOT_EXPR:
if (wins)
{