From 89851e4c1363247b62cbff5a495317f582931c0c Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Fri, 10 Jun 2016 08:46:55 +0000 Subject: [PATCH] re PR tree-optimization/71407 (ICE at -O3 in 32-bit and 64-bit modes on x86_64-linux-gnu (verify_gimple: integral result type precision does not match field size of BIT_FIELD_REF)) 2016-06-10 Alan Hayward gcc/ PR tree-optimization/71407 PR tree-optimization/71416 * tree-vect-loop.c (vectorizable_live_operation): Use vectype for BIT_FIELD_REF type. testsuite/ PR tree-optimization/71407 PR tree-optimization/71416 * gcc.dg/vect/pr71407.c: New * gcc.dg/vect/pr71416-1.c: New * gcc.dg/vect/pr71416-2.c: New From-SVN: r237288 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.dg/vect/pr71407.c | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/vect/pr71416-1.c | 17 +++++++++++++++++ gcc/testsuite/gcc.dg/vect/pr71416-2.c | 17 +++++++++++++++++ gcc/tree-vect-loop.c | 15 +++++++++------ 6 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr71407.c create mode 100644 gcc/testsuite/gcc.dg/vect/pr71416-1.c create mode 100644 gcc/testsuite/gcc.dg/vect/pr71416-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c589250be68..3f7240cf92f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-06-10 Alan Hayward + + PR tree-optimization/71407 + PR tree-optimization/71416 + * tree-vect-loop.c (vectorizable_live_operation): Use vectype for + BIT_FIELD_REF type. + 2016-06-10 Richard Biener PR middle-end/71477 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c93f6fae010..ae3f462cbb0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-06-10 Alan Hayward + + PR tree-optimization/71407 + PR tree-optimization/71416 + * gcc.dg/vect/pr71407.c: New + * gcc.dg/vect/pr71416-1.c: New + * gcc.dg/vect/pr71416-2.c: New + 2016-06-10 Richard Biener PR middle-end/71477 diff --git a/gcc/testsuite/gcc.dg/vect/pr71407.c b/gcc/testsuite/gcc.dg/vect/pr71407.c new file mode 100644 index 00000000000..761990de9f3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr71407.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +int a, c, d; +short b; + +void +fn1 () +{ + int e; + for (; c; c++) + { + for (; a; a++) + b = (short) a || e; + e = d; + } +} diff --git a/gcc/testsuite/gcc.dg/vect/pr71416-1.c b/gcc/testsuite/gcc.dg/vect/pr71416-1.c new file mode 100644 index 00000000000..8a2854889f9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr71416-1.c @@ -0,0 +1,17 @@ +/* { dg-do run } */ + +short a; +char b, e; +static short c; +int d, f; +int main() { + short g; + for (; e; ++e) { + d = a; + f = 0; + if (b) + d = f = g >= c; + } + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/vect/pr71416-2.c b/gcc/testsuite/gcc.dg/vect/pr71416-2.c new file mode 100644 index 00000000000..d846ef17ef1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr71416-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +int a, b, d, e, f, g; +int *c; +void fn2 (int *); +void fn1() { fn2(&e); } + +void fn2(int *p1) { + for (;;) { + for (; a; a++) + if (*p1 = g || --f, b) + if (*c) + d = *p1; + if (*p1) + break; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 1f61c83deaf..1231b95f6a7 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6353,7 +6353,7 @@ vectorizable_live_operation (gimple *stmt, worklist.safe_push (use_stmt); gcc_assert (worklist.length () == 1); - bitsize = TYPE_SIZE (lhs_type); + bitsize = TYPE_SIZE (TREE_TYPE (vectype)); vec_bitsize = TYPE_SIZE (vectype); /* Get the vectorized lhs of STMT and the lane to use (counted in bits). */ @@ -6399,15 +6399,18 @@ vectorizable_live_operation (gimple *stmt, /* Create a new vectorized stmt for the uses of STMT and insert outside the loop. */ - tree new_name = make_ssa_name (lhs_type); - tree new_tree = build3 (BIT_FIELD_REF, lhs_type, vec_lhs, bitsize, bitstart); - gimple *new_stmt = gimple_build_assign (new_name, new_tree); - gsi_insert_on_edge_immediate (single_exit (loop), new_stmt); + gimple_seq stmts = NULL; + tree new_tree = build3 (BIT_FIELD_REF, TREE_TYPE (vectype), vec_lhs, bitsize, + bitstart); + new_tree = force_gimple_operand (fold_convert (lhs_type, new_tree), &stmts, + true, NULL_TREE); + if (stmts) + gsi_insert_seq_on_edge_immediate (single_exit (loop), stmts); /* Replace all uses of the USE_STMT in the worklist with the newly inserted statement. */ use_stmt = worklist.pop (); - replace_uses_by (gimple_phi_result (use_stmt), new_name); + replace_uses_by (gimple_phi_result (use_stmt), new_tree); update_stmt (use_stmt); return true; -- 2.30.2