re PR tree-optimization/83580 (Wrong code caused by vectorization)

2018-01-08  Richard Biener  <rguenther@suse.de>

	PR middle-end/83580
	* tree-data-ref.c (split_constant_offset): Remove STRIP_NOPS.

	* gcc.dg/torture/pr83580.c: New testcase.

From-SVN: r256329
This commit is contained in:
Richard Biener 2018-01-08 08:24:51 +00:00 committed by Richard Biener
parent 55d84e61f3
commit 3e1b80ff33
4 changed files with 29 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2018-01-08 Richard Biener <rguenther@suse.de>
PR middle-end/83580
* tree-data-ref.c (split_constant_offset): Remove STRIP_NOPS.
2018-01-08 Richard Biener <rguenther@suse.de> 2018-01-08 Richard Biener <rguenther@suse.de>
PR middle-end/83517 PR middle-end/83517

View File

@ -1,3 +1,8 @@
2018-01-08 Richard Biener <rguenther@suse.de>
PR middle-end/83580
* gcc.dg/torture/pr83580.c: New testcase.
2018-01-08 Richard Biener <rguenther@suse.de> 2018-01-08 Richard Biener <rguenther@suse.de>
PR middle-end/83517 PR middle-end/83517

View File

@ -0,0 +1,16 @@
/* { dg-do run } */
int a[2] = { 0, 1 };
int x = 129;
int
main ()
{
volatile int v = 0;
int t = x, i;
for (i = 0; i < 1 + v + v + v + v + v + v + v + v + a[a[0]]; i++)
t = a[(signed char) (130 - x)];
if (t != 1)
__builtin_abort ();
return 0;
}

View File

@ -723,23 +723,21 @@ split_constant_offset_1 (tree type, tree op0, enum tree_code code, tree op1,
void void
split_constant_offset (tree exp, tree *var, tree *off) split_constant_offset (tree exp, tree *var, tree *off)
{ {
tree type = TREE_TYPE (exp), otype, op0, op1, e, o; tree type = TREE_TYPE (exp), op0, op1, e, o;
enum tree_code code; enum tree_code code;
*var = exp; *var = exp;
*off = ssize_int (0); *off = ssize_int (0);
STRIP_NOPS (exp);
if (tree_is_chrec (exp) if (tree_is_chrec (exp)
|| get_gimple_rhs_class (TREE_CODE (exp)) == GIMPLE_TERNARY_RHS) || get_gimple_rhs_class (TREE_CODE (exp)) == GIMPLE_TERNARY_RHS)
return; return;
otype = TREE_TYPE (exp);
code = TREE_CODE (exp); code = TREE_CODE (exp);
extract_ops_from_tree (exp, &code, &op0, &op1); extract_ops_from_tree (exp, &code, &op0, &op1);
if (split_constant_offset_1 (otype, op0, code, op1, &e, &o)) if (split_constant_offset_1 (type, op0, code, op1, &e, &o))
{ {
*var = fold_convert (type, e); *var = e;
*off = o; *off = o;
} }
} }