On December 2, 2019 5:40:41 PM GMT+01:00, Richard Sandiford 
<richard.sandif...@arm.com> wrote:
>Richard Biener <richard.guent...@gmail.com> writes:
>> On December 2, 2019 5:27:05 PM GMT+01:00, Richard Sandiford
><richard.sandif...@arm.com> wrote:
>>>In this PR, IPA-CP was misled into using NOP_EXPR rather than
>>>VIEW_CONVERT_EXPR to reinterpret a vector of 4 shorts as a vector
>>>of 2 ints.  This tripped the tree-cfg.c assert I'd added in r278245.
>>>
>>>Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>>
>> Hmm, but then it may create such conversion without verifying the
>target supports it? 
>
>This doesn't seem like the right place to check that though.

Agreed. 

>E.g. tree-vect-generic.c could lower conversions if necessary, just
>like for any other vector op.  AIUI fold_convertible_p is just checking
>whether the conversion satisfies the tree/gimple semantics of NOP_EXPR.

Hmm, OK. 

>Note that in the IPA-CP case, we should never generate a vector
>NOP_EXPR
>that isn't also tree_nop_conversion_p, see comment 4 in the PR.  It's
>possible we might want to rewrite the IPA-CP (and other IPA conditions)
>to be more explicit about this, but I think we want the patch either
>way.
>All it does is disallow cases that were previously (wrongly) allowed.

So let's go with the patch as is then. 

Thanks, 
Richard. 

>Thanks,
>Richard
>
>>
>> Richard. 
>>
>>>Richard
>>>
>>>
>>>2019-12-02  Richard Sandiford  <richard.sandif...@arm.com>
>>>
>>>gcc/
>>>     PR middle-end/92741
>>>     * fold-const.c (fold_convertible_p): Check vector types more
>>>     thoroughly.
>>>
>>>gcc/testsuite/
>>>     PR middle-end/92741
>>>     * gcc.dg/pr92741.c: New test.
>>>
>>>Index: gcc/fold-const.c
>>>===================================================================
>>>--- gcc/fold-const.c 2019-11-18 15:27:36.053367794 +0000
>>>+++ gcc/fold-const.c 2019-12-02 16:25:02.662405351 +0000
>>>@@ -2375,10 +2375,15 @@ fold_convertible_p (const_tree type, con
>>> 
>>>     case REAL_TYPE:
>>>     case FIXED_POINT_TYPE:
>>>-    case VECTOR_TYPE:
>>>     case VOID_TYPE:
>>>       return TREE_CODE (type) == TREE_CODE (orig);
>>> 
>>>+    case VECTOR_TYPE:
>>>+      return (VECTOR_TYPE_P (orig)
>>>+          && known_eq (TYPE_VECTOR_SUBPARTS (type),
>>>+                       TYPE_VECTOR_SUBPARTS (orig))
>>>+          && fold_convertible_p (TREE_TYPE (type), TREE_TYPE (orig)));
>>>+
>>>     default:
>>>       return false;
>>>     }
>>>Index: gcc/testsuite/gcc.dg/pr92741.c
>>>===================================================================
>>>--- /dev/null        2019-09-17 11:41:18.176664108 +0100
>>>+++ gcc/testsuite/gcc.dg/pr92741.c   2019-12-02 16:25:02.662405351
>+0000
>>>@@ -0,0 +1,19 @@
>>>+/* { dg-options "-O2 -fexceptions -fnon-call-exceptions -fno-inline"
>}
>>>*/
>>>+
>>>+typedef int vh __attribute__ ((__vector_size__ (2 * sizeof (int))));
>>>+typedef short int cq __attribute__ ((__vector_size__ (4 * sizeof
>>>(short int))));
>>>+
>>>+static void
>>>+id (int *r8, vh *tu)
>>>+{
>>>+  *(vh *) r8 = *tu;
>>>+}
>>>+
>>>+void
>>>+mr (void)
>>>+{
>>>+  int r8;
>>>+  cq he = { 0, };
>>>+
>>>+  id (&r8, (vh *) &he);
>>>+}

Reply via email to