Commit 651afdb2 by Yuri Rumyantsev Committed by Ilya Enkovich

re PR tree-optimization/71518 (wrong code at -O3 on x86_64-linux-gnu in 64-bit…

re PR tree-optimization/71518 (wrong code at -O3 on x86_64-linux-gnu in 64-bit mode (not in 32-bit mode))

gcc/

2016-07-06  Yuri Rumyantsev  <ysrumyan@gmail.com>

	PR tree-optimization/71518
	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust
	misalign also for outer loops with negative step.

gcc/testsuite/

2016-07-06  Yuri Rumyantsev  <ysrumyan@gmail.com>

	PR tree-optimization/71518
        * gcc.dg/pr71518.c: New test.

From-SVN: r238055
parent a5fa1522
2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/71518
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust
misalign also for outer loops with negative step.
2016-07-06 Wilco Dijkstra <wdijkstr@arm.com>
* config/arm/cortex-a53.md: Use final_presence_set for in-order.
......
2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/71518
* gcc.dg/pr71518.c: New test.
2016-07-06 Wilco Dijkstra <wdijkstr@arm.com>
* gcc.target/arm/vst1Q_laneu64-1.c (foo): Use unsigned char*.
......
/* PR tree-optimization/71518 */
/* { dg-options "-O3" } */
int a, *b[9], c, d, e;
static int
fn1 ()
{
for (c = 6; c >= 0; c--)
for (d = 0; d < 2; d++)
{
b[d * 2 + c] = 0;
e = a > 1 ? : 0;
if (e == 2)
return 0;
}
return 0;
}
int
main ()
{
fn1 ();
return 0;
}
......@@ -698,6 +698,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
tree base, base_addr;
tree misalign = NULL_TREE;
tree aligned_to;
tree step;
unsigned HOST_WIDE_INT alignment;
if (dump_enabled_p ())
......@@ -828,16 +829,20 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
DR_VECT_AUX (dr)->base_element_aligned = true;
}
if (loop && nested_in_vect_loop_p (loop, stmt))
step = STMT_VINFO_DR_STEP (stmt_info);
else
step = DR_STEP (dr);
/* If this is a backward running DR then first access in the larger
vectype actually is N-1 elements before the address in the DR.
Adjust misalign accordingly. */
if (tree_int_cst_sgn (DR_STEP (dr)) < 0)
if (tree_int_cst_sgn (step) < 0)
{
tree offset = ssize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
/* DR_STEP(dr) is the same as -TYPE_SIZE of the scalar type,
otherwise we wouldn't be here. */
offset = fold_build2 (MULT_EXPR, ssizetype, offset, DR_STEP (dr));
/* PLUS because DR_STEP was negative. */
offset = fold_build2 (MULT_EXPR, ssizetype, offset, step);
/* PLUS because STEP was negative. */
misalign = size_binop (PLUS_EXPR, misalign, offset);
}
......
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