aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2006-02-09 14:13:57 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2006-02-09 06:13:57 -0800
commit4853940ccb7949141793454476b7436c1a431598 (patch)
tree66b2befe15094d2b37c15fe8a652cdbf2492f627 /gcc
parent58e0c554fd7a78dad40f5b0ab705955cfd8bba43 (diff)
downloadgcc-4853940ccb7949141793454476b7436c1a431598.zip
gcc-4853940ccb7949141793454476b7436c1a431598.tar.gz
gcc-4853940ccb7949141793454476b7436c1a431598.tar.bz2
re PR middle-end/26134 (fold *(float*)(&complex_float_var) into REALPART_EXPR<complex_float_var>)
2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26134 * fold-const.c (fold_indirect_ref_1): Fold "*(foo *)&complexfoo" to "__real__ complexfoo" and "((foo*)&complexfoo)[1]" to "__imag__ complexfoo". 2006-02-09 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/26134 * gcc.dg/tree-ssa/complex-3.c: New test. From-SVN: r110800
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/complex-3.c27
4 files changed, 63 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 478de23..57e720c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2006-02-09 Andrew Pinski <pinskia@physics.uc.edu>
+ PR middle-end/26134
+ * fold-const.c (fold_indirect_ref_1): Fold
+ "*(foo *)&complexfoo" to "__real__ complexfoo"
+ and "((foo*)&complexfoo)[1]" to "__imag__ complexfoo".
+
+2006-02-09 Andrew Pinski <pinskia@physics.uc.edu>
+
* tree-flow-inline.h (var_can_have_subvars):
Volatile variables should not have subvariables.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 01734a6..833cc43 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -11721,8 +11721,32 @@ fold_indirect_ref_1 (tree type, tree op0)
min_val = TYPE_MIN_VALUE (type_domain);
return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
}
+ /* *(foo *)&complexfoo => __real__ complexfoo */
+ else if (TREE_CODE (optype) == COMPLEX_TYPE
+ && type == TREE_TYPE (optype))
+ return fold_build1 (REALPART_EXPR, type, op);
}
+ /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
+ if (TREE_CODE (sub) == PLUS_EXPR
+ && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
+ {
+ tree op00 = TREE_OPERAND (sub, 0);
+ tree op01 = TREE_OPERAND (sub, 1);
+ tree op00type;
+
+ STRIP_NOPS (op00);
+ op00type = TREE_TYPE (op00);
+ if (TREE_CODE (op00) == ADDR_EXPR
+ && TREE_CODE (TREE_TYPE (op00type)) == COMPLEX_TYPE
+ && type == TREE_TYPE (TREE_TYPE (op00type)))
+ {
+ tree size = TYPE_SIZE_UNIT (type);
+ if (tree_int_cst_equal (size, op01))
+ return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (op00, 0));
+ }
+ }
+
/* *(foo *)fooarrptr => (*fooarrptr)[0] */
if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
&& type == TREE_TYPE (TREE_TYPE (subtype)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a73cf09..dd78250 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2006-02-09 Andrew Pinski <pinskia@physics.uc.edu>
+ PR middle-end/26134
+ * gcc.dg/tree-ssa/complex-3.c: New test.
+
+2006-02-09 Andrew Pinski <pinskia@physics.uc.edu>
+
* gcc.c-torture/compile/volatile-1.c: New test.
2006-02-09 Diego Novillo <dnovillo@redhat.com>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/complex-3.c b/gcc/testsuite/gcc.dg/tree-ssa/complex-3.c
new file mode 100644
index 0000000..5f4b110
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/complex-3.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+typedef _Complex float COMPLEX_FLOAT;
+float real_part(COMPLEX_FLOAT a)
+{
+ return *(float*)(&a);
+}
+
+float real_part_2(COMPLEX_FLOAT a)
+{
+ return ((float*)(&a))[0];
+}
+
+
+float imag_part(COMPLEX_FLOAT a)
+{
+ return ((float*)(&a))[1];
+}
+
+/* Test that the above gets optimized to REALPART_EXPR and IMAGPART_EXPR
+ respectively. */
+
+/* { dg-final { scan-tree-dump-times "REALPART_EXPR" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "IMAGPART_EXPR" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+