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); >>>+}