Commit e681fb2b by Bin Cheng Committed by Bin Cheng

re PR tree-optimization/67921 ("internal compiler error: in…

re PR tree-optimization/67921 ("internal compiler error: in build_polynomial_chrec, at tree-chrec.h:147" when using -fsanitize=undefined)


	PR tree-optimization/67921
	* fold-const.c (split_tree): New parameters.  Convert pointer
	type variable part to proper type before negating. 
	(fold_binary_loc): Pass new arguments to split_tree.

	gcc/testsuite/ChangeLog
	PR tree-optimization/67921
	* c-c++-common/ubsan/pr67921.c: New test.

From-SVN: r233042
parent b6adbb9f
2016-02-01 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/67921
* fold-const.c (split_tree): New parameters. Convert pointer
type variable part to proper type before negating.
(fold_binary_loc): Pass new arguments to split_tree.
2016-02-01 Nathan Sidwell <nathan@codesourcery.com> 2016-02-01 Nathan Sidwell <nathan@codesourcery.com>
* config/nvptx/nvptx.c (PTX_GANG_DEFAULT): New. * config/nvptx/nvptx.c (PTX_GANG_DEFAULT): New.
......
...@@ -109,7 +109,8 @@ enum comparison_code { ...@@ -109,7 +109,8 @@ enum comparison_code {
static bool negate_expr_p (tree); static bool negate_expr_p (tree);
static tree negate_expr (tree); static tree negate_expr (tree);
static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int); static tree split_tree (location_t, tree, tree, enum tree_code,
tree *, tree *, tree *, int);
static tree associate_trees (location_t, tree, tree, enum tree_code, tree); static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
static enum comparison_code comparison_to_compcode (enum tree_code); static enum comparison_code comparison_to_compcode (enum tree_code);
static enum tree_code compcode_to_comparison (enum comparison_code); static enum tree_code compcode_to_comparison (enum comparison_code);
...@@ -767,7 +768,10 @@ negate_expr (tree t) ...@@ -767,7 +768,10 @@ negate_expr (tree t)
literal for which we use *MINUS_LITP instead. literal for which we use *MINUS_LITP instead.
If NEGATE_P is true, we are negating all of IN, again except a literal If NEGATE_P is true, we are negating all of IN, again except a literal
for which we use *MINUS_LITP instead. for which we use *MINUS_LITP instead. If a variable part is of pointer
type, it is negated after converting to TYPE. This prevents us from
generating illegal MINUS pointer expression. LOC is the location of
the converted variable part.
If IN is itself a literal or constant, return it as appropriate. If IN is itself a literal or constant, return it as appropriate.
...@@ -775,8 +779,8 @@ negate_expr (tree t) ...@@ -775,8 +779,8 @@ negate_expr (tree t)
same type as IN, but they will have the same signedness and mode. */ same type as IN, but they will have the same signedness and mode. */
static tree static tree
split_tree (tree in, enum tree_code code, tree *conp, tree *litp, split_tree (location_t loc, tree in, tree type, enum tree_code code,
tree *minus_litp, int negate_p) tree *conp, tree *litp, tree *minus_litp, int negate_p)
{ {
tree var = 0; tree var = 0;
...@@ -833,7 +837,12 @@ split_tree (tree in, enum tree_code code, tree *conp, tree *litp, ...@@ -833,7 +837,12 @@ split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
if (neg_conp_p) if (neg_conp_p)
*conp = negate_expr (*conp); *conp = negate_expr (*conp);
if (neg_var_p) if (neg_var_p)
var = negate_expr (var); {
/* Convert to TYPE before negating a pointer type expr. */
if (var && POINTER_TYPE_P (TREE_TYPE (var)))
var = fold_convert_loc (loc, type, var);
var = negate_expr (var);
}
} }
else if (TREE_CODE (in) == BIT_NOT_EXPR else if (TREE_CODE (in) == BIT_NOT_EXPR
&& code == PLUS_EXPR) && code == PLUS_EXPR)
...@@ -854,6 +863,9 @@ split_tree (tree in, enum tree_code code, tree *conp, tree *litp, ...@@ -854,6 +863,9 @@ split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
else if (*minus_litp) else if (*minus_litp)
*litp = *minus_litp, *minus_litp = 0; *litp = *minus_litp, *minus_litp = 0;
*conp = negate_expr (*conp); *conp = negate_expr (*conp);
/* Convert to TYPE before negating a pointer type expr. */
if (var && POINTER_TYPE_P (TREE_TYPE (var)))
var = fold_convert_loc (loc, type, var);
var = negate_expr (var); var = negate_expr (var);
} }
...@@ -9621,9 +9633,10 @@ fold_binary_loc (location_t loc, ...@@ -9621,9 +9633,10 @@ fold_binary_loc (location_t loc,
then the result with variables. This increases the chances of then the result with variables. This increases the chances of
literals being recombined later and of generating relocatable literals being recombined later and of generating relocatable
expressions for the sum of a constant and literal. */ expressions for the sum of a constant and literal. */
var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0); var0 = split_tree (loc, arg0, type, code,
var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1, &con0, &lit0, &minus_lit0, 0);
code == MINUS_EXPR); var1 = split_tree (loc, arg1, type, code,
&con1, &lit1, &minus_lit1, code == MINUS_EXPR);
/* Recombine MINUS_EXPR operands by using PLUS_EXPR. */ /* Recombine MINUS_EXPR operands by using PLUS_EXPR. */
if (code == MINUS_EXPR) if (code == MINUS_EXPR)
......
2016-02-01 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/67921
* c-c++-common/ubsan/pr67921.c: New test.
2016-02-01 Richard Biener <rguenther@suse.de> 2016-02-01 Richard Biener <rguenther@suse.de>
PR middle-end/69556 PR middle-end/69556
......
/* { dg-do compile } */
/* { dg-options "-fsanitize=undefined" } */
struct s
{
int n;
int arr[][6];
};
void bar (int);
void foo (struct s *ptr)
{
int i;
for (; i < 2; i++)
for (; ptr->n;)
{
int *a = ptr->arr[i];
int b[66];
int j = 0;
for (; j < 56; j++)
bar (a[j] - b[j]);
}
}
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