View | Details | Return to bug 88775 | Differences between
and this patch

Collapse All | Expand All

(-)a/gcc/tree-ssa-sccvn.c (+54 lines)
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

Return to bug 88775