From: Jeff Law Date: Tue, 2 Jul 1996 22:59:02 +0000 (-0600) Subject: expr.c (compare): If function pointers need canonicalization before comparisons,... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5718612fc1929a7d9a3ec02c34eb6999c3d5b738;p=gcc.git expr.c (compare): If function pointers need canonicalization before comparisons, canonicalize them. * expr.c (compare): If function pointers need canonicalization before comparisons, canonicalize them. (do_store_flag): Do not use an sCC insn for a function pointer comparison if function pointers need canonicalization before comparing. From-SVN: r12381 --- diff --git a/gcc/expr.c b/gcc/expr.c index 5dd6700caa6..1c4c6bb61c3 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10582,6 +10582,32 @@ compare (exp, signed_code, unsigned_code) int unsignedp = TREE_UNSIGNED (type); enum rtx_code code = unsignedp ? unsigned_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. */ + 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)) + { + rtx new_op0 = 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; + } +#endif + return compare_from_rtx (op0, op1, code, unsignedp, mode, ((mode == BLKmode) ? expr_size (TREE_OPERAND (exp, 0)) : NULL_RTX), @@ -10716,6 +10742,19 @@ do_store_flag (exp, target, mode, only_cheap) if (operand_mode == BLKmode) return 0; + /* We won't bother with store-flag operations involving function pointers + when function pointers must be canonicalized before comparisons. */ +#ifdef HAVE_canonicalize_funcptr_for_compare + 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_OPERAND (exp, 1))) == POINTER_TYPE + && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1)))) + == FUNCTION_TYPE)))) + return 0; +#endif + STRIP_NOPS (arg0); STRIP_NOPS (arg1);