diff options
author | Jeff Law <law@redhat.com> | 2005-07-02 08:15:11 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-07-02 08:15:11 -0600 |
commit | 2d0dab7f2bb2acbc9a9fffc7278be44c9a1dcd43 (patch) | |
tree | bc249b4ee590ce8d295fe4bb0175dcaab1069eb6 /gcc/tree-ssa-dom.c | |
parent | c85ce869e757158c55fd428befdb59ad5d537c1f (diff) | |
download | gcc-2d0dab7f2bb2acbc9a9fffc7278be44c9a1dcd43.zip gcc-2d0dab7f2bb2acbc9a9fffc7278be44c9a1dcd43.tar.gz gcc-2d0dab7f2bb2acbc9a9fffc7278be44c9a1dcd43.tar.bz2 |
tree-ssa-dom.c (find_equivalent_equality_comparison): Do not a eliminate type conversion which feeds an equality comparison if...
* tree-ssa-dom.c (find_equivalent_equality_comparison): Do not
a eliminate type conversion which feeds an equality comparison
if the original type or either operand in the comparison is a
function pointer.
* gcc.dg/tree-ssa/pr22051-1.c: New test.
* gcc.dg/tree-ssa/pr22051-2.c: New test.
From-SVN: r101534
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 86da07b..e341a68 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1882,6 +1882,18 @@ find_equivalent_equality_comparison (tree cond) { tree def_rhs = TREE_OPERAND (def_stmt, 1); + + /* If either operand to the comparison is a pointer to + a function, then we can not apply this optimization + as some targets require function pointers to be + canonicalized and in this case this optimization would + eliminate a necessary canonicalization. */ + if ((POINTER_TYPE_P (TREE_TYPE (op0)) + && TREE_CODE (TREE_TYPE (TREE_TYPE (op0))) == FUNCTION_TYPE) + || (POINTER_TYPE_P (TREE_TYPE (op1)) + && TREE_CODE (TREE_TYPE (TREE_TYPE (op1))) == FUNCTION_TYPE)) + return NULL; + /* Now make sure the RHS of the MODIFY_EXPR is a typecast. */ if ((TREE_CODE (def_rhs) == NOP_EXPR || TREE_CODE (def_rhs) == CONVERT_EXPR) @@ -1895,6 +1907,16 @@ find_equivalent_equality_comparison (tree cond) > TYPE_PRECISION (TREE_TYPE (def_rhs))) return NULL; + /* If the inner type of the conversion is a pointer to + a function, then we can not apply this optimization + as some targets require function pointers to be + canonicalized. This optimization would result in + canonicalization of the pointer when it was not originally + needed/intended. */ + if (POINTER_TYPE_P (def_rhs_inner_type) + && TREE_CODE (TREE_TYPE (def_rhs_inner_type)) == FUNCTION_TYPE) + return NULL; + /* What we want to prove is that if we convert OP1 to the type of the object inside the NOP_EXPR that the result is still equivalent to SRC. |