From: Nathanael Nerode Date: Sun, 12 Dec 2004 21:01:17 +0000 (+0000) Subject: re PR middle-end/17564 (New treatment of function pointers when used with equality... X-Git-Tag: releases/gcc-4.0.0~2225 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=b8c26d709c132d137fc17b6a1b1b45fc6ad0f5c4;p=gcc.git re PR middle-end/17564 (New treatment of function pointers when used with equality operators, when casts are involved) PR middle-end/17564 * dojump.c (do_compare_and_jump): Only canonicalize function pointers in a comparison if both sides are function pointers. Co-Authored-By: John David Anglin From-SVN: r92061 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1b1c55c5fbc..5c7416f0a141 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-12-12 Nathanael Nerode + John David Anglin + + PR middle-end/17564 + * dojump.c (do_compare_and_jump): Only canonicalize function pointers + in a comparison if both sides are function pointers. + 2004-12-12 Richard Henderson PR target/18932 diff --git a/gcc/dojump.c b/gcc/dojump.c index 93bcb8be41a1..b1e17ec88033 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -904,24 +904,23 @@ do_compare_and_jump (tree exp, enum rtx_code signed_code, #ifdef HAVE_canonicalize_funcptr_for_compare /* If function pointers need to be "canonicalized" before they can - be reliably compared, then canonicalize them. */ + be reliably compared, then canonicalize them. + Only do this if *both* sides of the comparison are function pointers. + If one side isn't, we want a noncanonicalized comparison. See PR + middle-end/17564. */ if (HAVE_canonicalize_funcptr_for_compare && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))) - == FUNCTION_TYPE)) + && TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))) + == FUNCTION_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1)))) + == FUNCTION_TYPE) { rtx new_op0 = gen_reg_rtx (mode); + rtx new_op1 = gen_reg_rtx (mode); emit_insn (gen_canonicalize_funcptr_for_compare (new_op0, op0)); op0 = new_op0; - } - - if (HAVE_canonicalize_funcptr_for_compare - && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1)))) - == FUNCTION_TYPE)) - { - rtx new_op1 = gen_reg_rtx (mode); emit_insn (gen_canonicalize_funcptr_for_compare (new_op1, op1)); op1 = new_op1;