Lines 3967-3972
visit_nary_op (tree lhs, gassign *stmt)
Link Here
|
3967 |
} |
3967 |
} |
3968 |
} |
3968 |
} |
3969 |
} |
3969 |
} |
|
|
3970 |
break; |
3971 |
|
3972 |
case EQ_EXPR: |
3973 |
case NE_EXPR: |
3974 |
case LT_EXPR: |
3975 |
case LE_EXPR: |
3976 |
case GT_EXPR: |
3977 |
case GE_EXPR: |
3978 |
/* See if we can CSE a comparison with another performed with a |
3979 |
different sign (if compared for equality) or as pointer vs. |
3980 |
integer. This seems to happen a lot for std::string code, |
3981 |
see PR88775. */ |
3982 |
if ((INTEGRAL_TYPE_P (TREE_TYPE (rhs1)) |
3983 |
|| POINTER_TYPE_P (TREE_TYPE (rhs1))) |
3984 |
&& TREE_CODE (rhs1) == SSA_NAME) |
3985 |
{ |
3986 |
gassign *def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (rhs1)); |
3987 |
if (def |
3988 |
&& CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)) |
3989 |
&& tree_nop_conversion_p (TREE_TYPE (rhs1), |
3990 |
TREE_TYPE (gimple_assign_rhs1 (def))) |
3991 |
&& (code == EQ_EXPR || code == NE_EXPR |
3992 |
|| (TYPE_UNSIGNED (TREE_TYPE (rhs1)) |
3993 |
== TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def)))))) |
3994 |
{ |
3995 |
tree ops[3] = {}; |
3996 |
ops[0] = vn_valueize (gimple_assign_rhs1 (def)); |
3997 |
tree rhs2 = gimple_assign_rhs2 (stmt); |
3998 |
if (TREE_CODE (rhs2) == INTEGER_CST) |
3999 |
ops[1] = fold_convert (TREE_TYPE (rhs1), rhs2); |
4000 |
else if ((def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (rhs2))) |
4001 |
&& CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)) |
4002 |
&& tree_nop_conversion_p |
4003 |
(TREE_TYPE (rhs2), |
4004 |
TREE_TYPE (gimple_assign_rhs1 (def))) |
4005 |
&& (code == EQ_EXPR || code == NE_EXPR |
4006 |
|| (TYPE_UNSIGNED (TREE_TYPE (rhs2)) |
4007 |
== TYPE_UNSIGNED |
4008 |
(TREE_TYPE (gimple_assign_rhs1 (def))))) |
4009 |
&& types_compatible_p |
4010 |
(TREE_TYPE (gimple_assign_rhs1 (def)), |
4011 |
TREE_TYPE (ops[0]))) |
4012 |
ops[1] = vn_valueize (gimple_assign_rhs1 (def)); |
4013 |
if (ops[1]) |
4014 |
{ |
4015 |
tree res = vn_nary_op_lookup_pieces (2, code, |
4016 |
type, ops, NULL); |
4017 |
if (res) |
4018 |
return set_ssa_val_to (lhs, res); |
4019 |
} |
4020 |
} |
4021 |
} |
4022 |
break; |
4023 |
|
3970 |
default:; |
4024 |
default:; |
3971 |
} |
4025 |
} |
3972 |
|
4026 |
|