Commit 89851e4c by Alan Hayward Committed by Alan Hayward

re PR tree-optimization/71407 (ICE at -O3 in 32-bit and 64-bit modes on…

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
parent 200eafbf
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> 2016-06-10 Richard Biener <rguenther@suse.de>
PR middle-end/71477 PR middle-end/71477
......
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> 2016-06-10 Richard Biener <rguenther@suse.de>
PR middle-end/71477 PR middle-end/71477
......
/* { 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;
}
}
/* { 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;
}
/* { 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;
}
}
...@@ -6353,7 +6353,7 @@ vectorizable_live_operation (gimple *stmt, ...@@ -6353,7 +6353,7 @@ vectorizable_live_operation (gimple *stmt,
worklist.safe_push (use_stmt); worklist.safe_push (use_stmt);
gcc_assert (worklist.length () == 1); gcc_assert (worklist.length () == 1);
bitsize = TYPE_SIZE (lhs_type); bitsize = TYPE_SIZE (TREE_TYPE (vectype));
vec_bitsize = TYPE_SIZE (vectype); vec_bitsize = TYPE_SIZE (vectype);
/* Get the vectorized lhs of STMT and the lane to use (counted in bits). */ /* Get the vectorized lhs of STMT and the lane to use (counted in bits). */
...@@ -6399,15 +6399,18 @@ vectorizable_live_operation (gimple *stmt, ...@@ -6399,15 +6399,18 @@ vectorizable_live_operation (gimple *stmt,
/* Create a new vectorized stmt for the uses of STMT and insert outside the /* Create a new vectorized stmt for the uses of STMT and insert outside the
loop. */ loop. */
tree new_name = make_ssa_name (lhs_type); gimple_seq stmts = NULL;
tree new_tree = build3 (BIT_FIELD_REF, lhs_type, vec_lhs, bitsize, bitstart); tree new_tree = build3 (BIT_FIELD_REF, TREE_TYPE (vectype), vec_lhs, bitsize,
gimple *new_stmt = gimple_build_assign (new_name, new_tree); bitstart);
gsi_insert_on_edge_immediate (single_exit (loop), new_stmt); 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 /* Replace all uses of the USE_STMT in the worklist with the newly inserted
statement. */ statement. */
use_stmt = worklist.pop (); 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); update_stmt (use_stmt);
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment