public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-297] wrong GIMPLE from (bit_field_ref CTOR ..) simplification
@ 2023-04-27 11:21 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-04-27 11:21 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:a82c6ab0aade4124e1903dda6f6f85c4c317fcec

commit r14-297-ga82c6ab0aade4124e1903dda6f6f85c4c317fcec
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Apr 24 13:20:25 2023 +0200

    wrong GIMPLE from (bit_field_ref CTOR ..) simplification
    
    When we simplify a BIT_FIELD_REF of a CTOR like { _1, _2, _3, _4 }
    and attempt to produce (view converted) { _1, _2 } for a selected
    subset we fail to realize this cannot be done from match.pd since
    we have no way to write the resulting CTOR "operation" and the
    built CTOR { _1, _2 } isn't a GIMPLE value.
    
    This kind of simplifications have to be done in forwprop (or would
    need a match.pd syntax extension) where we can split out the CTOR
    to a separate stmt.
    
    The following disables this particular simplification when we are
    simplifying GIMPLE.  With enhanced IL checking this otherwise
    causes ICEs in the testsuite from vectorized code.
    
            * match.pd (BIT_FIELD_REF CONSTRUCTOR@0 @1 @2): Do not
            create a CTOR operand in the result when simplifying GIMPLE.

Diff:
---
 gcc/match.pd | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 34e1a5c1b46..c4320781f5b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -7456,10 +7456,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 			     ? type
 			     : build_vector_type (TREE_TYPE (TREE_TYPE (ctor)),
 						  count * k));
+	      /* We used to build a CTOR in the non-constant case here
+		 but that's not a GIMPLE value.  We'd have to expose this
+		 operation somehow so the code generation can properly
+		 split it out to a separate stmt.  */
 	      res = (constant_p ? build_vector_from_ctor (evtype, vals)
-		     : build_constructor (evtype, vals));
+		     : (GIMPLE ? NULL_TREE : build_constructor (evtype, vals)));
 	    }
-	    (view_convert { res; }))))))
+	    (if (res)
+	     (view_convert { res; })))))))
       /* The bitfield references a single constructor element.  */
       (if (k.is_constant (&const_k)
 	   && idx + n <= (idx / const_k + 1) * const_k)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-27 11:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-27 11:21 [gcc r14-297] wrong GIMPLE from (bit_field_ref CTOR ..) simplification Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).