From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id B25D7398407A; Tue, 27 Apr 2021 07:16:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B25D7398407A MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-139] tree-optimization/99776 - relax condition on vector ctor element extract X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: 2cde2d620fc5ff60264ee825fd6eea457d7c51d9 X-Git-Newrev: 7d6bb80931b429631f63e0fd27bee95f32eb57a9 Message-Id: <20210427071606.B25D7398407A@sourceware.org> Date: Tue, 27 Apr 2021 07:16:06 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Apr 2021 07:16:06 -0000 https://gcc.gnu.org/g:7d6bb80931b429631f63e0fd27bee95f32eb57a9 commit r12-139-g7d6bb80931b429631f63e0fd27bee95f32eb57a9 Author: Richard Biener Date: Fri Mar 26 09:50:03 2021 +0100 tree-optimization/99776 - relax condition on vector ctor element extract This relaxes the condition for the match.pd pattern doing vector ctor element extracts to not require type identity but only size equality. Since we vectorize pointer data as unsigned integer data such mismatches have to be tolerated to optimize scalar code uses of vector results. 2021-03-26 Richard Biener PR tree-optimization/99776 * match.pd (bit_field_ref (ctor)): Relax element extract type compatibility checks. * gcc.dg/tree-ssa/ssa-fre-91.c: New testcase. Diff: --- gcc/match.pd | 18 +++++++++++++----- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gcc/match.pd b/gcc/match.pd index 66788ba6a86..bb1d6231de1 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6168,9 +6168,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (BIT_FIELD_REF CONSTRUCTOR@0 @1 @2) (if (VECTOR_TYPE_P (TREE_TYPE (@0)) - && (types_match (type, TREE_TYPE (TREE_TYPE (@0))) + && tree_fits_uhwi_p (TYPE_SIZE (type)) + && ((tree_to_uhwi (TYPE_SIZE (type)) + == tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (@0))))) || (VECTOR_TYPE_P (type) - && types_match (TREE_TYPE (type), TREE_TYPE (TREE_TYPE (@0)))))) + && (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (type))) + == tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (@0)))))))) (with { tree ctor = (TREE_CODE (@0) == SSA_NAME @@ -6226,10 +6229,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) if (!CONSTANT_CLASS_P (e)) constant_p = false; } - res = (constant_p ? build_vector_from_ctor (type, vals) - : build_constructor (type, vals)); + tree evtype = (types_match (TREE_TYPE (type), + TREE_TYPE (TREE_TYPE (ctor))) + ? type + : build_vector_type (TREE_TYPE (TREE_TYPE (ctor)), + count)); + res = (constant_p ? build_vector_from_ctor (evtype, vals) + : build_constructor (evtype, vals)); } - { 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) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c new file mode 100644 index 00000000000..4999a3b66ab --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fre4" } */ + +extern void foo(void); + +static int a[2], b, *c[2]; + +int main() { + for (b = 0; b < 2; b++) + c[b] = &a[1]; + if (!c[0]) + foo(); + return 0; +} + +/* Even when vectorizing we should eliminate the call to foo. */ +/* { dg-final { scan-tree-dump-not "foo" "fre4" } } */