Commit da2ce5f9 by Richard Biener Committed by Richard Biener

re PR tree-optimization/80122 (__builtin_va_arg_pack() and…

re PR tree-optimization/80122 (__builtin_va_arg_pack() and __builtin_va_arg_pack_len() does not work correctly)

2017-03-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/80122
	* tree-inline.c (copy_bb): Do not expans va-arg packs or
	va_arg_pack_len when the inlined call stmt requires pack
	expansion itself.
	* tree-inline.h (struct copy_body_data): Make call_stmt a gcall *.

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

From-SVN: r246313
parent 8c00ae24
2017-03-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/80122
* tree-inline.c (copy_bb): Do not expans va-arg packs or
va_arg_pack_len when the inlined call stmt requires pack
expansion itself.
* tree-inline.h (struct copy_body_data): Make call_stmt a gcall *.
2017-03-21 Jakub Jelinek <jakub@redhat.com> 2017-03-21 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/78158 PR sanitizer/78158
......
2017-03-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/80122
* gcc.dg/torture/pr80122.c: New testcase.
2017-03-21 Toma Tabacu <toma.tabacu@imgtec.com> 2017-03-21 Toma Tabacu <toma.tabacu@imgtec.com>
* gcc.dg/pic-2.c: Skip for MIPS. * gcc.dg/pic-2.c: Skip for MIPS.
......
/* { dg-do run } */
#define __GNU_ALWAYS_INLINE inline __attribute__(( __always_inline__))
#define DEVT_ALL 0
#define CMD_ABI_DEVICES 100
static __GNU_ALWAYS_INLINE int
send_msg_to_gm_w_dev_t(int msg_type, unsigned int dev_msg_type,
int devt, ...)
{
char s[256];
int nArgs = __builtin_va_arg_pack_len();
if (nArgs != 2)
__builtin_abort ();
__builtin_sprintf (s, "%d", __builtin_va_arg_pack ());
if (__builtin_strcmp (s, "99") != 0)
__builtin_abort ();
/* do something with nArgs and ... */
return 0;
}
static __GNU_ALWAYS_INLINE int
send_msg_to_gm(int msg_type, unsigned int dev_msg_type,
...)
{
int nArgs = __builtin_va_arg_pack_len();
if (nArgs != 2)
__builtin_abort ();
return send_msg_to_gm_w_dev_t(msg_type, dev_msg_type,
DEVT_ALL, __builtin_va_arg_pack());
}
static __GNU_ALWAYS_INLINE int
send_enable(unsigned int dev_msg_type, ...)
{
int nArgs = __builtin_va_arg_pack_len();
if (nArgs != 2)
__builtin_abort ();
return send_msg_to_gm(CMD_ABI_DEVICES, dev_msg_type, __builtin_va_arg_pack());
}
int
main(void)
{
int mode = 99;
send_enable(1, mode, sizeof(mode));
return 0;
}
...@@ -1860,7 +1860,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, ...@@ -1860,7 +1860,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
call_stmt = dyn_cast <gcall *> (stmt); call_stmt = dyn_cast <gcall *> (stmt);
if (call_stmt if (call_stmt
&& gimple_call_va_arg_pack_p (call_stmt) && gimple_call_va_arg_pack_p (call_stmt)
&& id->call_stmt) && id->call_stmt
&& ! gimple_call_va_arg_pack_p (id->call_stmt))
{ {
/* __builtin_va_arg_pack () should be replaced by /* __builtin_va_arg_pack () should be replaced by
all arguments corresponding to ... in the caller. */ all arguments corresponding to ... in the caller. */
...@@ -1940,7 +1941,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, ...@@ -1940,7 +1941,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
&& id->call_stmt && id->call_stmt
&& (decl = gimple_call_fndecl (stmt)) && (decl = gimple_call_fndecl (stmt))
&& DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
&& DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_ARG_PACK_LEN) && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_ARG_PACK_LEN
&& ! gimple_call_va_arg_pack_p (id->call_stmt))
{ {
/* __builtin_va_arg_pack_len () should be replaced by /* __builtin_va_arg_pack_len () should be replaced by
the number of anonymous arguments. */ the number of anonymous arguments. */
...@@ -4584,7 +4586,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) ...@@ -4584,7 +4586,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
/* Record the function we are about to inline. */ /* Record the function we are about to inline. */
id->src_fn = fn; id->src_fn = fn;
id->src_cfun = DECL_STRUCT_FUNCTION (fn); id->src_cfun = DECL_STRUCT_FUNCTION (fn);
id->call_stmt = stmt; id->call_stmt = call_stmt;
/* If the src function contains an IFN_VA_ARG, then so will the dst /* If the src function contains an IFN_VA_ARG, then so will the dst
function after inlining. Likewise for IFN_GOMP_USE_SIMT. */ function after inlining. Likewise for IFN_GOMP_USE_SIMT. */
......
...@@ -81,7 +81,7 @@ struct copy_body_data ...@@ -81,7 +81,7 @@ struct copy_body_data
/* GIMPLE_CALL if va arg parameter packs should be expanded or NULL /* GIMPLE_CALL if va arg parameter packs should be expanded or NULL
is not. */ is not. */
gimple *call_stmt; gcall *call_stmt;
/* Exception landing pad the inlined call lies in. */ /* Exception landing pad the inlined call lies in. */
int eh_lp_nr; int eh_lp_nr;
......
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