Commit 64a3d647 by Richard Guenther Committed by Richard Biener

re PR middle-end/26134 (fold *(float*)(&complex_float_var) into REALPART_EXPR<complex_float_var>)

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.
	(non_rewritable_mem_ref_base): Handle complex type component
	accesses, constrain offsets for vector and complex extracts
	more properly.

	* gcc.dg/tree-ssa/complex-6.c: New testcase.

From-SVN: r171046
parent ef13324e
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.
(non_rewritable_mem_ref_base): Handle complex type component
accesses, constrain offsets for vector and complex extracts
more properly.
2011-03-16 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48146
* tree-ssa-sink.c (sink_code_in_bb): Manually update virtual
operands avoiding the need for renaming.
......
2011-03-16 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26134
* gcc.dg/tree-ssa/complex-6.c: New testcase.
2011-03-16 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48146
* gcc.dg/torture/pr48146.c: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-optimized" } */
float
quantum_real(float _Complex a)
{
float *p = (float *) &a;
return p[0];
}
float
quantum_imag(float _Complex a)
{
float *p = (float *) &a;
return p[1];
}
float
quantum_foo(float _Complex a)
{
float *p = (float *) &a;
return p[2];
}
/* { dg-final { scan-tree-dump-times "REALPART_EXPR" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times "IMAGPART_EXPR" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
......@@ -1855,6 +1855,14 @@ maybe_rewrite_mem_ref_base (tree *tp)
bitsize_int (BITS_PER_UNIT),
TREE_OPERAND (*tp, 1), 0));
}
else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
&& useless_type_conversion_p (TREE_TYPE (*tp),
TREE_TYPE (TREE_TYPE (sym))))
{
*tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
? REALPART_EXPR : IMAGPART_EXPR,
TREE_TYPE (*tp), sym);
}
else if (integer_zerop (TREE_OPERAND (*tp, 1)))
{
if (!useless_type_conversion_p (TREE_TYPE (*tp),
......@@ -1888,10 +1896,14 @@ non_rewritable_mem_ref_base (tree ref)
&& TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
{
tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
if (TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
|| TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
&& useless_type_conversion_p (TREE_TYPE (base),
TREE_TYPE (TREE_TYPE (decl)))
&& double_int_fits_in_uhwi_p (mem_ref_offset (base))
&& double_int_ucmp
(tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
mem_ref_offset (base)) == 1
&& multiple_of_p (sizetype, TREE_OPERAND (base, 1),
TYPE_SIZE_UNIT (TREE_TYPE (base))))
return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment