+2018-10-15 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-08-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87024
+ * tree-inline.c (copy_bb): Drop unused __builtin_va_arg_pack_len
+ calls.
+
+ 2018-08-17 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86505
+ * tree-inline.c (copy_bb): When inlining __builtin_va_arg_pack_len ()
+ across a va-arg-pack using call adjust its return value accordingly.
+
2018-10-12 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+2018-10-15 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2018-08-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87024
+ * gcc.dg/pr87024.c: New testcase.
+
+ 2018-08-17 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86505
+ * gcc.dg/torture/pr86505.c: New testcase.
+
2018-10-12 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
--- /dev/null
+/* { dg-do run } */
+
+static inline __attribute__(( __always_inline__)) int
+funA(unsigned int param, ...)
+{
+ return __builtin_va_arg_pack_len();
+}
+
+static inline __attribute__(( __always_inline__)) int
+funB(unsigned int param, ...)
+{
+ return funA(param, 2, 4, __builtin_va_arg_pack());
+}
+
+int
+testBuiltin(void)
+{
+ int rc = funB(0,1,2);
+ if (rc != 4)
+ return 1;
+ return 0;
+}
+
+int
+main()
+{
+ int rc = testBuiltin();
+ if (rc == 1)
+ __builtin_abort ();
+
+ return 0;
+}
&& id->call_stmt
&& (decl = gimple_call_fndecl (stmt))
&& DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_ARG_PACK_LEN
- && ! gimple_call_va_arg_pack_p (id->call_stmt))
+ && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_ARG_PACK_LEN)
{
/* __builtin_va_arg_pack_len () should be replaced by
the number of anonymous arguments. */
if (POINTER_BOUNDS_P (gimple_call_arg (id->call_stmt, i)))
nargs--;
- count = build_int_cst (integer_type_node, nargs);
- new_stmt = gimple_build_assign (gimple_call_lhs (stmt), count);
- gsi_replace (©_gsi, new_stmt, false);
- stmt = new_stmt;
+ if (!gimple_call_lhs (stmt))
+ {
+ /* Drop unused calls. */
+ gsi_remove (©_gsi, false);
+ continue;
+ }
+ else if (!gimple_call_va_arg_pack_p (id->call_stmt))
+ {
+ count = build_int_cst (integer_type_node, nargs);
+ new_stmt = gimple_build_assign (gimple_call_lhs (stmt), count);
+ gsi_replace (©_gsi, new_stmt, false);
+ stmt = new_stmt;
+ }
+ else if (nargs != 0)
+ {
+ tree newlhs;
+ if (gimple_in_ssa_p (cfun))
+ newlhs = make_ssa_name (integer_type_node, NULL);
+ else
+ newlhs = create_tmp_reg (integer_type_node);
+ count = build_int_cst (integer_type_node, nargs);
+ new_stmt = gimple_build_assign (gimple_call_lhs (stmt),
+ PLUS_EXPR, newlhs, count);
+ gimple_call_set_lhs (stmt, newlhs);
+ gsi_insert_after (©_gsi, new_stmt, GSI_NEW_STMT);
+ }
}
else if (call_stmt
&& id->call_stmt