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  <alan.hayward@arm.com>

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
This commit is contained in:
Alan Hayward 2016-06-10 08:46:55 +00:00 committed by Alan Hayward
parent 200eafbfae
commit 89851e4c13
6 changed files with 74 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2016-06-10 Alan Hayward <alan.hayward@arm.com>
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 <rguenther@suse.de>
PR middle-end/71477

View File

@ -1,3 +1,11 @@
2016-06-10 Alan Hayward <alan.hayward@arm.com>
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 <rguenther@suse.de>
PR middle-end/71477

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;