On January 11, 2016 6:15:48 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >Related to the PR69207 changes, the problem there has been that >fold_convertible_p allowed conversion from a vector type to same sized >integral type, and fold_convert used NOP_EXPR in that case. But, >such an operation is much better handled using VCE. > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks, Richard. >2016-01-11 Jakub Jelinek <ja...@redhat.com> > > * fold-const.c (fold_convertible_p): Don't return true > for conversion of VECTOR_TYPE to same sized integral type. > (fold_convert_loc): Fix up formatting. Fold conversion of > VECTOR_TYPE to same sized integral type using VIEW_CONVERT_EXPR > instead of NOP_EXPR. > >--- gcc/fold-const.c.jj 2016-01-09 08:36:15.000000000 +0100 >+++ gcc/fold-const.c 2016-01-11 11:53:41.470765831 +0100 >@@ -2182,11 +2182,8 @@ fold_convertible_p (const_tree type, con > case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: > case POINTER_TYPE: case REFERENCE_TYPE: > case OFFSET_TYPE: >- if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig) >- || TREE_CODE (orig) == OFFSET_TYPE) >- return true; >- return (TREE_CODE (orig) == VECTOR_TYPE >- && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig))); >+ return (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig) >+ || TREE_CODE (orig) == OFFSET_TYPE); > > case REAL_TYPE: > case FIXED_POINT_TYPE: >@@ -2241,11 +2238,11 @@ fold_convert_loc (location_t loc, tree t > return fold_build1_loc (loc, NOP_EXPR, type, arg); > if (TREE_CODE (orig) == COMPLEX_TYPE) > return fold_convert_loc (loc, type, >- fold_build1_loc (loc, REALPART_EXPR, >- TREE_TYPE (orig), arg)); >+ fold_build1_loc (loc, REALPART_EXPR, >+ TREE_TYPE (orig), arg)); > gcc_assert (TREE_CODE (orig) == VECTOR_TYPE > && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig))); >- return fold_build1_loc (loc, NOP_EXPR, type, arg); >+ return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg); > > case REAL_TYPE: > if (TREE_CODE (arg) == INTEGER_CST) > > Jakub