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