Bug 56064 - Optimize VIEW_CONVERT_EXPR with FIXED_CST
Summary: Optimize VIEW_CONVERT_EXPR with FIXED_CST
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.8.0
: P3 normal
Target Milestone: 4.8.0
Assignee: Not yet assigned to anyone
URL:
Keywords: missed-optimization
Depends on:
Blocks: 19987
  Show dependency treegraph
 
Reported: 2013-01-21 13:10 UTC by Georg-Johann Lay
Modified: 2013-02-08 13:23 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
foo.c.165r.expand (RTL dump) (825 bytes, text/plain)
2013-01-21 13:10 UTC, Georg-Johann Lay
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Georg-Johann Lay 2013-01-21 13:10:23 UTC
Created attachment 29235 [details]
foo.c.165r.expand (RTL dump)

In the followinf C code


static __inline__ __attribute__((__always_inline__))
_Fract rbits (const __INT16_TYPE__ i)
{
    _Fract f;
    __builtin_memcpy (&f, &i, sizeof (_Fract));
    return f;
}

_Fract func (void)
{
    return rbits (__INT16_C(0x1234));
}


The memcpy could be optimized away.  It is represented as VIEW_CONVERT_EXPR but FIXED_CST is not folded in fold-const.c.

The attachment shows the memory moves of HQmode which is suboptimal.  For more details, see http://gcc.gnu.org/ml/gcc/2013-01/msg00187.html
Comment 1 Georg-Johann Lay 2013-01-30 11:04:35 UTC
Author: gjl
Date: Wed Jan 30 11:04:30 2013
New Revision: 195574

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=195574
Log:
gcc/
	PR tree-optimization/56064
	* fixed-value.c (fixed_from_double_int): New function.
	* fixed-value.h (fixed_from_double_int): New prototype.
	(const_fixed_from_double_int): New static inline function.
	* fold-const.c (native_interpret_fixed): New static function.
	(native_interpret_expr) <FIXED_POINT_TYPE>: Use it.
	(can_native_interpret_type_p) <FIXED_POINT_TYPE>: Return true.
	(native_encode_fixed): New static function.
	(native_encode_expr) <FIXED_CST>: Use it.
	(native_interpret_int): Move double_int worker code to...
	* double-int.c (double_int::from_buffer): ...this new static method.
	* double-int.h (double_int::from_buffer): Prototype it.

gcc/testsuite/
	PR tree-optimization/56064
	* gcc.dg/fixed-point/view-convert.c: New test.


Added:
    trunk/gcc/testsuite/gcc.dg/fixed-point/view-convert.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/double-int.c
    trunk/gcc/double-int.h
    trunk/gcc/fixed-value.c
    trunk/gcc/fixed-value.h
    trunk/gcc/fold-const.c
    trunk/gcc/testsuite/ChangeLog
Comment 2 Georg-Johann Lay 2013-01-30 11:06:28 UTC
Done.
Comment 3 Georg-Johann Lay 2013-02-08 13:23:46 UTC
Author: gjl
Date: Fri Feb  8 13:23:34 2013
New Revision: 195885

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=195885
Log:
gcc/
	PR tree-optimization/56064
	* fixed-value.c (fixed_from_double_int): Sign/zero extend payload
	bits according to mode.
	* fixed-value.h (fixed_from_double_int)
	(const_fixed_from_double_int): Adjust comments.

gcc/testsuite/
	PR tree-optimization/56064
	* gcc.dg/fixed-point/view-convert-2.c: New test.


Added:
    trunk/gcc/testsuite/gcc.dg/fixed-point/view-convert-2.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/fixed-value.c
    trunk/gcc/fixed-value.h
    trunk/gcc/testsuite/ChangeLog