[PATCH][RFC] Fix PR55890
Richard Biener
rguenther@suse.de
Mon Jan 7 14:08:00 GMT 2013
On Mon, 7 Jan 2013, Jakub Jelinek wrote:
> On Mon, Jan 07, 2013 at 02:55:48PM +0100, Richard Biener wrote:
> > *** gcc/testsuite/gcc.dg/torture/pr55890-1.c (revision 0)
> > --- gcc/testsuite/gcc.dg/torture/pr55890-1.c (working copy)
> > ***************
> > *** 0 ****
> > --- 1,6 ----
> > + /* { dg-do compile } */
> > +
> > + extern void *memmove(void *, void *, long unsigned int);
>
> Please use __SIZE_TYPE__ as the last argument here.
Done. Also fixed up tree-ssa-strlen.c now as pr55890-2.c also
ICEs therein.
Re-bootstrapping/testing now.
Richard.
2013-01-07 Richard Biener <rguenther@suse.de>
PR middle-end/55890
* gimple.h (gimple_call_builtin_p): New overload.
* gimple.c (validate_call): New function.
(gimple_call_builtin_p): Likewise.
* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
Use gimple_call_builtin_p.
(find_func_clobbers): Likewise.
* tree-ssa-strlen.c (adjust_last_stmt): Likewise.
(strlen_optimize_stmt): Likewise.
* gcc.dg/torture/pr55890-1.c: New testcase.
* gcc.dg/torture/pr55890-2.c: Likewise.
Index: gcc/gimple.c
===================================================================
*** gcc/gimple.c (revision 194970)
--- gcc/gimple.c (working copy)
*************** is_gimple_builtin_call (gimple stmt)
*** 4137,4152 ****
return false;
}
! /* Return true when STMT is builtins call to CODE. */
bool
gimple_call_builtin_p (gimple stmt, enum built_in_function code)
{
tree fndecl;
! return (is_gimple_call (stmt)
! && (fndecl = gimple_call_fndecl (stmt)) != NULL
! && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
! && DECL_FUNCTION_CODE (fndecl) == code);
}
/* Return true if STMT clobbers memory. STMT is required to be a
--- 4137,4196 ----
return false;
}
! /* Return true when STMTs arguments match those of FNDECL. */
!
! static bool
! validate_call (gimple stmt, tree fndecl)
! {
! tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
! unsigned nargs = gimple_call_num_args (stmt);
! for (unsigned i = 0; i < nargs; ++i)
! {
! /* Variadic args follow. */
! if (!targs)
! return true;
! tree arg = gimple_call_arg (stmt, i);
! if (INTEGRAL_TYPE_P (TREE_TYPE (arg))
! && INTEGRAL_TYPE_P (TREE_VALUE (targs)))
! ;
! else if (POINTER_TYPE_P (TREE_TYPE (arg))
! && POINTER_TYPE_P (TREE_VALUE (targs)))
! ;
! else if (TREE_CODE (TREE_TYPE (arg))
! != TREE_CODE (TREE_VALUE (targs)))
! return false;
! targs = TREE_CHAIN (targs);
! }
! if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
! return false;
! return true;
! }
!
! /* Return true when STMT is builtins call to CLASS. */
!
! bool
! gimple_call_builtin_p (gimple stmt, enum built_in_class klass)
! {
! tree fndecl;
! if (is_gimple_call (stmt)
! && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
! && DECL_BUILT_IN_CLASS (fndecl) == klass)
! return validate_call (stmt, fndecl);
! return false;
! }
!
! /* Return true when STMT is builtins call to CODE of CLASS. */
bool
gimple_call_builtin_p (gimple stmt, enum built_in_function code)
{
tree fndecl;
! if (is_gimple_call (stmt)
! && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
! && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
! && DECL_FUNCTION_CODE (fndecl) == code)
! return validate_call (stmt, fndecl);
! return false;
}
/* Return true if STMT clobbers memory. STMT is required to be a
Index: gcc/gimple.h
===================================================================
*** gcc/gimple.h (revision 194970)
--- gcc/gimple.h (working copy)
*************** extern bool walk_stmt_load_store_ops (gi
*** 893,898 ****
--- 893,899 ----
bool (*)(gimple, tree, void *),
bool (*)(gimple, tree, void *));
extern bool gimple_ior_addresses_taken (bitmap, gimple);
+ extern bool gimple_call_builtin_p (gimple, enum built_in_class);
extern bool gimple_call_builtin_p (gimple, enum built_in_function);
extern bool gimple_asm_clobbers_memory_p (const_gimple);
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c (revision 194970)
--- gcc/tree-ssa-structalias.c (working copy)
*************** find_func_aliases_for_builtin_call (gimp
*** 4014,4021 ****
vec<ce_s> rhsc = vNULL;
varinfo_t fi;
! if (fndecl != NULL_TREE
! && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
/* ??? All builtins that are handled here need to be handled
in the alias-oracle query functions explicitly! */
switch (DECL_FUNCTION_CODE (fndecl))
--- 4014,4020 ----
vec<ce_s> rhsc = vNULL;
varinfo_t fi;
! if (gimple_call_builtin_p (t, BUILT_IN_NORMAL))
/* ??? All builtins that are handled here need to be handled
in the alias-oracle query functions explicitly! */
switch (DECL_FUNCTION_CODE (fndecl))
*************** find_func_clobbers (gimple origt)
*** 4768,4775 ****
/* For builtins we do not have separate function info. For those
we do not generate escapes for we have to generate clobbers/uses. */
! if (decl
! && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
switch (DECL_FUNCTION_CODE (decl))
{
/* The following functions use and clobber memory pointed to
--- 4767,4773 ----
/* For builtins we do not have separate function info. For those
we do not generate escapes for we have to generate clobbers/uses. */
! if (gimple_call_builtin_p (t, BUILT_IN_NORMAL))
switch (DECL_FUNCTION_CODE (decl))
{
/* The following functions use and clobber memory pointed to
Index: gcc/tree-ssa-strlen.c
===================================================================
*** gcc/tree-ssa-strlen.c (revision 194970)
--- gcc/tree-ssa-strlen.c (working copy)
*************** adjust_last_stmt (strinfo si, gimple stm
*** 809,818 ****
if (!is_gimple_call (last.stmt))
return;
! callee = gimple_call_fndecl (last.stmt);
! if (callee == NULL_TREE || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
return;
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_MEMCPY:
--- 809,818 ----
if (!is_gimple_call (last.stmt))
return;
! if (!gimple_call_builtin_p (last.stmt, BUILT_IN_NORMAL))
return;
+ callee = gimple_call_fndecl (last.stmt);
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_MEMCPY:
*************** strlen_optimize_stmt (gimple_stmt_iterat
*** 1750,1756 ****
if (is_gimple_call (stmt))
{
tree callee = gimple_call_fndecl (stmt);
! if (callee && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_STRLEN:
--- 1750,1756 ----
if (is_gimple_call (stmt))
{
tree callee = gimple_call_fndecl (stmt);
! if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_STRLEN:
Index: gcc/testsuite/gcc.dg/torture/pr55890-1.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr55890-1.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr55890-1.c (working copy)
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+
+ extern void *memmove(void *, void *, __SIZE_TYPE__);
+ typedef int (*_TEST_fun_) ();
+ static _TEST_fun_ i = (_TEST_fun_) memmove;
+ main() { i(); }
Index: gcc/testsuite/gcc.dg/torture/pr55890-2.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr55890-2.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr55890-2.c (working copy)
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-do compile } */
+
+ extern void *memcpy();
+ main() { memcpy(); }
More information about the Gcc-patches
mailing list