On 19-02-15 11:29, Tom de Vries wrote:
Hi,
I'm posting this patch series for stage1:
- 0001-Disable-lang_hooks.gimplify_expr-in-free_lang_data.patch
- 0002-Add-gimple_find_sub_bbs.patch
- 0003-Factor-optimize_va_list_gpr_fpr_size-out-of-pass_std.patch
- 0004-Handle-internal_fn-in-operand_equal_p.patch
- 0005-Postpone-expanding-va_arg-until-pass_stdarg.patch
The patch series - based on Michael's initial patch - postpones expanding va_arg
until pass_stdarg, which makes pass_stdarg more robust.
Bootstrapped and reg-tested on x86_64 using all languages, with unix/ and
unix/-m32 testing.
I'll post the patches in reply to this email.
This patch adds handling of internal functions in operand_equal_p.
I ran into a situation here in operand_equal_p where it segfaulted on the
internal function IFN_VA_ARG, because the CALL_EXPR_FN of an internal function
is NULL, and operand_equal_p does not expect NULL arguments:
...
case CALL_EXPR:
/* If the CALL_EXPRs call different functions, then they
clearly can not be equal. */
if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
flags))
return 0;
...
This patch fixes that by testing if CALL_EXPR_FN is NULL.
OK for stage1?
Thanks,
- Tom
2015-02-17 Tom de Vries <t...@codesourcery.com>
* fold-const.c (operand_equal_p): Handle INTERNAL_FNs.
---
gcc/fold-const.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 8377120..fbf76d0 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3032,6 +3032,11 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
switch (TREE_CODE (arg0))
{
case CALL_EXPR:
+ /* Handle internal_fns conservatively. */
+ if (CALL_EXPR_FN (arg0) == NULL_TREE
+ || CALL_EXPR_FN (arg1) == NULL_TREE)
+ return 0;
+
/* If the CALL_EXPRs call different functions, then they
clearly can not be equal. */
if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
--
1.9.1