PR tree-optimization/94131 - ICE on printf with a VLA string and -fno-tree-ccp

gcc/testsuite/ChangeLog:

	PR tree-optimization/94131
	* gcc.dg/pr94131.c: New test.

gcc/ChangeLog:

	PR tree-optimization/94131
	* gimple-fold.c (get_range_strlen_tree): Fail for variable-length
	types and decls.
	* tree-ssa-strlen.c (get_range_strlen_dynamic): Avoid assuming
	types have constant sizes.
This commit is contained in:
Martin Sebor 2020-03-25 09:39:50 -06:00 committed by Jeff Law
parent 0fca105f8c
commit 05c13c4399
5 changed files with 61 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2020-03-25 Martin Sebor <msebor@redhat.com>
PR tree-optimization/94131
* gimple-fold.c (get_range_strlen_tree): Fail for variable-length
types and decls.
* tree-ssa-strlen.c (get_range_strlen_dynamic): Avoid assuming
types have constant sizes.
2020-03-25 Martin Liska <mliska@suse.cz>
PR lto/94259

View File

@ -1378,7 +1378,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail when the array bound is unknown or zero. */
val = TYPE_SIZE_UNIT (optype);
if (!val || integer_zerop (val))
if (!val
|| TREE_CODE (val) != INTEGER_CST
|| integer_zerop (val))
return false;
val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
@ -1412,7 +1414,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail when the array bound is unknown or zero. */
val = TYPE_SIZE_UNIT (optype);
if (!val || integer_zerop (val))
if (!val
|| TREE_CODE (val) != INTEGER_CST
|| integer_zerop (val))
return false;
val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
integer_one_node);
@ -1448,7 +1452,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail if the offset is out of bounds. Such accesses
should be diagnosed at some point. */
val = DECL_SIZE_UNIT (ref);
if (!val || integer_zerop (val))
if (!val
|| TREE_CODE (val) != INTEGER_CST
|| integer_zerop (val))
return false;
poly_offset_int psiz = wi::to_offset (val);

View File

@ -1,3 +1,8 @@
2020-03-25 Martin Sebor <msebor@redhat.com>
PR tree-optimization/94131
* gcc.dg/pr94131.c: New test.
2020-03-25 Sandra Loosemore <sandra@codesourcery.com>
* gcc.dg/pr92301.c (main): Allow argc to be 0 to support

View File

@ -0,0 +1,29 @@
/* PR 94131 - ICE on printf with a VLA string and -fno-tree-ccp
-fno-tree-forwprop
{ dg-do compile }
{ dg-options "-O1 -fno-tree-ccp -fno-tree-forwprop" } */
void rv1 (int n)
{
char a[n];
__INTPTR_TYPE__ i = (__INTPTR_TYPE__ )&a[0];
i &= 3;
__builtin_memset (a, '\0', sizeof a);
__builtin_printf ("%s", i ? &a[0] : "");
}
void sink (void*);
void rv2 (int n)
{
char a[n];
__INTPTR_TYPE__ i = (__INTPTR_TYPE__)&a[0];
i &= 3;
__builtin_memset (a, '\0', sizeof a);
__builtin_printf ("%s", i ? &a[0] : "");
sink (a);
}

View File

@ -1140,10 +1140,16 @@ get_range_strlen_dynamic (tree src, c_strlen_data *pdata, bitmap *visited,
{
tree basetype = TREE_TYPE (base);
tree size = TYPE_SIZE_UNIT (basetype);
++off; /* Increment for the terminating nul. */
pdata->maxlen = fold_build2 (MINUS_EXPR, size_type_node, size,
build_int_cst (size_type_node, off));
pdata->maxbound = pdata->maxlen;
if (TREE_CODE (size) == INTEGER_CST)
{
++off; /* Increment for the terminating nul. */
tree toffset = build_int_cst (size_type_node, off);
pdata->maxlen = fold_build2 (MINUS_EXPR, size_type_node, size,
toffset);
pdata->maxbound = pdata->maxlen;
}
else
pdata->maxlen = build_all_ones_cst (size_type_node);
}
else
pdata->maxlen = build_all_ones_cst (size_type_node);