PR78888 - add value range info for tolower/toupper

Jakub Jelinek jakub@redhat.com
Thu Aug 3 07:51:00 GMT 2017


On Thu, Aug 03, 2017 at 12:58:06PM +0530, Prathamesh Kulkarni wrote:
> --- a/gcc/tree-vrp.c
> +++ b/gcc/tree-vrp.c
> @@ -3778,6 +3778,19 @@ extract_range_basic (value_range *vr, gimple *stmt)
>  		return;
>  	      }
>  	  break;
> +	case CFN_BUILT_IN_TOUPPER:
> +	case CFN_BUILT_IN_TOLOWER:
> +	  if (tree lhs = gimple_call_lhs (stmt))
> +	    {
> +	      tree type = TREE_TYPE (lhs);
> +	      unsigned char min = (cfn == CFN_BUILT_IN_TOUPPER) ? 'a' : 'A';
> +	      unsigned char max = (cfn == CFN_BUILT_IN_TOUPPER) ? 'z' : 'Z';
> +	      tree range_min = build_int_cstu (type, min);
> +	      tree range_max = build_int_cstu (type, max);
> +	      set_value_range (vr, VR_ANTI_RANGE, range_min, range_max, NULL);
> +	      return;

You are hardcoding here host characters and using it for target.
I think you need to use
lang_hooks.to_target_charset
(really no idea how it works or doesn't in LTO, but gimple-fold.c is already
using it among others).
Also, you're assuming that the 'a'-'z' and 'A'-'Z' ranges are without gaps,
which isn't the case for e.g. EBCDIC.  So I think you'd need to verify
(once?) that the target charset has this property.

	Jakub



More information about the Gcc-patches mailing list