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:
parent
0fca105f8c
commit
05c13c4399
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
29
gcc/testsuite/gcc.dg/pr84131.c
Normal file
29
gcc/testsuite/gcc.dg/pr84131.c
Normal 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);
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user