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
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
Done.
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