OSDN Git Service

2011-03-16 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2011 15:55:48 +0000 (15:55 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2011 15:55:48 +0000 (15:55 +0000)
PR tree-optimization/48149
* fold-const.c (fold_binary_loc): Fold
COMPLEX_EXPR <REALPART_EXPR <x>, IMAGPART_EXPR <x>>.

* gcc.dg/fold-complex-1.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171048 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-complex-1.c [new file with mode: 0644]

index a535ac1..c19efcb 100644 (file)
@@ -1,5 +1,11 @@
 2011-03-16  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/48149
+       * fold-const.c (fold_binary_loc): Fold
+       COMPLEX_EXPR <REALPART_EXPR <x>, IMAGPART_EXPR <x>>.
+
+2011-03-16  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/26134
        * tree-ssa.c (maybe_rewrite_mem_ref_base): Handle rewriting
        complex part accesses to REALPART_EXPR and IMAGPART_EXPR.
index f8630a2..9baa9eb 100644 (file)
@@ -13176,6 +13176,14 @@ fold_binary_loc (location_t loc,
          || (TREE_CODE (arg0) == INTEGER_CST
              && TREE_CODE (arg1) == INTEGER_CST))
        return build_complex (type, arg0, arg1);
+      if (TREE_CODE (arg0) == REALPART_EXPR
+         && TREE_CODE (arg1) == IMAGPART_EXPR
+         && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 0)))
+             == TYPE_MAIN_VARIANT (type))
+         && operand_equal_p (TREE_OPERAND (arg0, 0),
+                             TREE_OPERAND (arg1, 0), 0))
+       return omit_one_operand_loc (loc, type, TREE_OPERAND (arg0, 0),
+                                    TREE_OPERAND (arg1, 0));
       return NULL_TREE;
 
     case ASSERT_EXPR:
index efb6140..a9db0b7 100644 (file)
@@ -1,5 +1,10 @@
 2011-03-16  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/48149
+       * gcc.dg/fold-complex-1.c: New testcase.
+
+2011-03-16  Richard Guenther  <rguenther@suse.de>
+
        PR testsuite/48147
        * gcc.dg/guality/pr45882.c: Really make sure no inlining
        or cloning happens.
diff --git a/gcc/testsuite/gcc.dg/fold-complex-1.c b/gcc/testsuite/gcc.dg/fold-complex-1.c
new file mode 100644 (file)
index 0000000..a9ba0fd
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ffast-math -fdump-tree-original" } */
+
+_Complex float
+foo (_Complex float x)
+{
+  return  __real x + 1.0iF * __imag x;
+}
+
+/* { dg-final { scan-tree-dump-times "COMPLEX_EXPR" 0 "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */