diff mbox

Fix host_size_t_cst_p predicate

Message ID b38d122f-3325-c51c-2c3d-0f064304a200@suse.cz
State New
Headers show

Commit Message

Martin Liška Oct. 27, 2016, 3:06 p.m. UTC
On 10/27/2016 03:35 PM, Richard Biener wrote:
> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>> Running simple test-case w/o the proper header file causes ICE:
>> strncmp ("a", "b", -1);
>>
>> 0xe74462 tree_to_uhwi(tree_node const*)
>>         ../../gcc/tree.c:7324
>> 0x90a23f host_size_t_cst_p
>>         ../../gcc/fold-const-call.c:63
>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*, tree_node*, tree_node*)
>>         ../../gcc/fold-const-call.c:1512
>> 0x787b01 fold_builtin_3
>>         ../../gcc/builtins.c:8385
>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>         ../../gcc/builtins.c:8465
>> 0x9052b1 fold(tree_node*)
>>         ../../gcc/fold-const.c:11919
>> 0x6de2bb c_fully_fold_internal
>>         ../../gcc/c/c-fold.c:185
>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>         ../../gcc/c/c-fold.c:90
>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>         ../../gcc/c/c-typeck.c:10369
>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>         ../../gcc/c/c-typeck.c:10414
>> 0x6cb578 c_parser_statement_after_labels
>>         ../../gcc/c/c-parser.c:5430
>> 0x6cd333 c_parser_compound_statement_nostart
>>         ../../gcc/c/c-parser.c:4944
>> 0x6cdbde c_parser_compound_statement
>>         ../../gcc/c/c-parser.c:4777
>> 0x6c93ac c_parser_declaration_or_fndef
>>         ../../gcc/c/c-parser.c:2176
>> 0x6d51ab c_parser_external_declaration
>>         ../../gcc/c/c-parser.c:1574
>> 0x6d5c09 c_parser_translation_unit
>>         ../../gcc/c/c-parser.c:1454
>> 0x6d5c09 c_parse_file()
>>         ../../gcc/c/c-parser.c:18173
>> 0x72ffd2 c_common_parse_file()
>>         ../../gcc/c-family/c-opts.c:1087
>>
>> Following patch improves the host_size_t_cst_p predicate.
>>
>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>
>> Ready to be installed?
> 
> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
> CHAR_BIT test is now redundant.
> 
> OTOH it was probably desired to allow -1 here?  A little looking back
> in time should tell.

Ok, it started with r229922, where it was changed from:

  if (tree_fits_uhwi_p (len) && p1 && p2)
    {
      const int i = strncmp (p1, p2, tree_to_uhwi (len));
...

to current version:

    case CFN_BUILT_IN_STRNCMP:
      {
	bool const_size_p = host_size_t_cst_p (arg2, &s2);

Thus I'm suggesting to change to back to it.

Ready to be installed?
Thanks,
Martin

> 
> Richard.
> 
>> Martin

Comments

Richard Biener Oct. 28, 2016, 8:37 a.m. UTC | #1
On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
> On 10/27/2016 03:35 PM, Richard Biener wrote:
>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>> Running simple test-case w/o the proper header file causes ICE:
>>> strncmp ("a", "b", -1);
>>>
>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>         ../../gcc/tree.c:7324
>>> 0x90a23f host_size_t_cst_p
>>>         ../../gcc/fold-const-call.c:63
>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*, tree_node*, tree_node*)
>>>         ../../gcc/fold-const-call.c:1512
>>> 0x787b01 fold_builtin_3
>>>         ../../gcc/builtins.c:8385
>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>         ../../gcc/builtins.c:8465
>>> 0x9052b1 fold(tree_node*)
>>>         ../../gcc/fold-const.c:11919
>>> 0x6de2bb c_fully_fold_internal
>>>         ../../gcc/c/c-fold.c:185
>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>         ../../gcc/c/c-fold.c:90
>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>         ../../gcc/c/c-typeck.c:10369
>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>         ../../gcc/c/c-typeck.c:10414
>>> 0x6cb578 c_parser_statement_after_labels
>>>         ../../gcc/c/c-parser.c:5430
>>> 0x6cd333 c_parser_compound_statement_nostart
>>>         ../../gcc/c/c-parser.c:4944
>>> 0x6cdbde c_parser_compound_statement
>>>         ../../gcc/c/c-parser.c:4777
>>> 0x6c93ac c_parser_declaration_or_fndef
>>>         ../../gcc/c/c-parser.c:2176
>>> 0x6d51ab c_parser_external_declaration
>>>         ../../gcc/c/c-parser.c:1574
>>> 0x6d5c09 c_parser_translation_unit
>>>         ../../gcc/c/c-parser.c:1454
>>> 0x6d5c09 c_parse_file()
>>>         ../../gcc/c/c-parser.c:18173
>>> 0x72ffd2 c_common_parse_file()
>>>         ../../gcc/c-family/c-opts.c:1087
>>>
>>> Following patch improves the host_size_t_cst_p predicate.
>>>
>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>
>>> Ready to be installed?
>>
>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>> CHAR_BIT test is now redundant.
>>
>> OTOH it was probably desired to allow -1 here?  A little looking back
>> in time should tell.
>
> Ok, it started with r229922, where it was changed from:
>
>   if (tree_fits_uhwi_p (len) && p1 && p2)
>     {
>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
> ...
>
> to current version:
>
>     case CFN_BUILT_IN_STRNCMP:
>       {
>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>
> Thus I'm suggesting to change to back to it.
>
> Ready to be installed?

Let's ask Richard.

Richard.

> Thanks,
> Martin
>
>>
>> Richard.
>>
>>> Martin
>
Richard Sandiford Oct. 31, 2016, 12:12 a.m. UTC | #2
Richard Biener <richard.guenther@gmail.com> writes:
> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>> Running simple test-case w/o the proper header file causes ICE:
>>>> strncmp ("a", "b", -1);
>>>>
>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>         ../../gcc/tree.c:7324
>>>> 0x90a23f host_size_t_cst_p
>>>>         ../../gcc/fold-const-call.c:63
>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>> tree_node*, tree_node*)
>>>>         ../../gcc/fold-const-call.c:1512
>>>> 0x787b01 fold_builtin_3
>>>>         ../../gcc/builtins.c:8385
>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>>         ../../gcc/builtins.c:8465
>>>> 0x9052b1 fold(tree_node*)
>>>>         ../../gcc/fold-const.c:11919
>>>> 0x6de2bb c_fully_fold_internal
>>>>         ../../gcc/c/c-fold.c:185
>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>         ../../gcc/c/c-fold.c:90
>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>         ../../gcc/c/c-typeck.c:10369
>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>         ../../gcc/c/c-typeck.c:10414
>>>> 0x6cb578 c_parser_statement_after_labels
>>>>         ../../gcc/c/c-parser.c:5430
>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>         ../../gcc/c/c-parser.c:4944
>>>> 0x6cdbde c_parser_compound_statement
>>>>         ../../gcc/c/c-parser.c:4777
>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>         ../../gcc/c/c-parser.c:2176
>>>> 0x6d51ab c_parser_external_declaration
>>>>         ../../gcc/c/c-parser.c:1574
>>>> 0x6d5c09 c_parser_translation_unit
>>>>         ../../gcc/c/c-parser.c:1454
>>>> 0x6d5c09 c_parse_file()
>>>>         ../../gcc/c/c-parser.c:18173
>>>> 0x72ffd2 c_common_parse_file()
>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>
>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>
>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>
>>>> Ready to be installed?
>>>
>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>> CHAR_BIT test is now redundant.
>>>
>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>> in time should tell.
>>
>> Ok, it started with r229922, where it was changed from:
>>
>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>     {
>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>> ...
>>
>> to current version:
>>
>>     case CFN_BUILT_IN_STRNCMP:
>>       {
>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>
>> Thus I'm suggesting to change to back to it.
>>
>> Ready to be installed?
>
> Let's ask Richard.

The idea with the:

  wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT

test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
I think we still want that.

Thanks,
Richard
Martin Liška Oct. 31, 2016, 9:10 a.m. UTC | #3
On 10/31/2016 01:12 AM, Richard Sandiford wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>> strncmp ("a", "b", -1);
>>>>>
>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>         ../../gcc/tree.c:7324
>>>>> 0x90a23f host_size_t_cst_p
>>>>>         ../../gcc/fold-const-call.c:63
>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>> tree_node*, tree_node*)
>>>>>         ../../gcc/fold-const-call.c:1512
>>>>> 0x787b01 fold_builtin_3
>>>>>         ../../gcc/builtins.c:8385
>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>>>         ../../gcc/builtins.c:8465
>>>>> 0x9052b1 fold(tree_node*)
>>>>>         ../../gcc/fold-const.c:11919
>>>>> 0x6de2bb c_fully_fold_internal
>>>>>         ../../gcc/c/c-fold.c:185
>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>         ../../gcc/c/c-fold.c:90
>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>         ../../gcc/c/c-parser.c:5430
>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>         ../../gcc/c/c-parser.c:4944
>>>>> 0x6cdbde c_parser_compound_statement
>>>>>         ../../gcc/c/c-parser.c:4777
>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>         ../../gcc/c/c-parser.c:2176
>>>>> 0x6d51ab c_parser_external_declaration
>>>>>         ../../gcc/c/c-parser.c:1574
>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>         ../../gcc/c/c-parser.c:1454
>>>>> 0x6d5c09 c_parse_file()
>>>>>         ../../gcc/c/c-parser.c:18173
>>>>> 0x72ffd2 c_common_parse_file()
>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>
>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>
>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>>
>>>>> Ready to be installed?
>>>>
>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>> CHAR_BIT test is now redundant.
>>>>
>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>> in time should tell.
>>>
>>> Ok, it started with r229922, where it was changed from:
>>>
>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>     {
>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>> ...
>>>
>>> to current version:
>>>
>>>     case CFN_BUILT_IN_STRNCMP:
>>>       {
>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>
>>> Thus I'm suggesting to change to back to it.
>>>
>>> Ready to be installed?
>>
>> Let's ask Richard.
> 
> The idea with the:
> 
>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
> 
> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
> I think we still want that.

OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
wi::min_precision check, right?

Thanks,
Martin

> 
> Thanks,
> Richard
>
Richard Biener Oct. 31, 2016, 9:37 a.m. UTC | #4
On Mon, Oct 31, 2016 at 10:10 AM, Martin Liška <mliska@suse.cz> wrote:
> On 10/31/2016 01:12 AM, Richard Sandiford wrote:
>> Richard Biener <richard.guenther@gmail.com> writes:
>>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>>> strncmp ("a", "b", -1);
>>>>>>
>>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>>         ../../gcc/tree.c:7324
>>>>>> 0x90a23f host_size_t_cst_p
>>>>>>         ../../gcc/fold-const-call.c:63
>>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>>> tree_node*, tree_node*)
>>>>>>         ../../gcc/fold-const-call.c:1512
>>>>>> 0x787b01 fold_builtin_3
>>>>>>         ../../gcc/builtins.c:8385
>>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>>>>         ../../gcc/builtins.c:8465
>>>>>> 0x9052b1 fold(tree_node*)
>>>>>>         ../../gcc/fold-const.c:11919
>>>>>> 0x6de2bb c_fully_fold_internal
>>>>>>         ../../gcc/c/c-fold.c:185
>>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>>         ../../gcc/c/c-fold.c:90
>>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>>         ../../gcc/c/c-parser.c:5430
>>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>>         ../../gcc/c/c-parser.c:4944
>>>>>> 0x6cdbde c_parser_compound_statement
>>>>>>         ../../gcc/c/c-parser.c:4777
>>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>>         ../../gcc/c/c-parser.c:2176
>>>>>> 0x6d51ab c_parser_external_declaration
>>>>>>         ../../gcc/c/c-parser.c:1574
>>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>>         ../../gcc/c/c-parser.c:1454
>>>>>> 0x6d5c09 c_parse_file()
>>>>>>         ../../gcc/c/c-parser.c:18173
>>>>>> 0x72ffd2 c_common_parse_file()
>>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>>
>>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>>
>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>>>>
>>>>>> Ready to be installed?
>>>>>
>>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>>> CHAR_BIT test is now redundant.
>>>>>
>>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>>> in time should tell.
>>>>
>>>> Ok, it started with r229922, where it was changed from:
>>>>
>>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>>     {
>>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>>> ...
>>>>
>>>> to current version:
>>>>
>>>>     case CFN_BUILT_IN_STRNCMP:
>>>>       {
>>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>>
>>>> Thus I'm suggesting to change to back to it.
>>>>
>>>> Ready to be installed?
>>>
>>> Let's ask Richard.
>>
>> The idea with the:
>>
>>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
>>
>> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
>> I think we still want that.
>
> OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
> wi::min_precision check, right?

Not sure.  If we have host_size_t_cst_p then we should have a corresponding
size_t host_size_t (const_tree) and should use those in pairs.  Not sure
why we have sth satisfying host_size_t_cst_p but not tree_fits_uhwi_p.
Is that wi::min_precision fault?  The way it is documented suggests that
it should be equal to tree_fits_uwhi_p ...

Richard.

> Thanks,
> Martin
>
>>
>> Thanks,
>> Richard
>>
>
Richard Sandiford Oct. 31, 2016, 9:58 a.m. UTC | #5
Richard Biener <richard.guenther@gmail.com> writes:
> On Mon, Oct 31, 2016 at 10:10 AM, Martin Liška <mliska@suse.cz> wrote:
>> On 10/31/2016 01:12 AM, Richard Sandiford wrote:
>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>>>> strncmp ("a", "b", -1);
>>>>>>>
>>>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>>>         ../../gcc/tree.c:7324
>>>>>>> 0x90a23f host_size_t_cst_p
>>>>>>>         ../../gcc/fold-const-call.c:63
>>>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>>>> tree_node*, tree_node*)
>>>>>>>         ../../gcc/fold-const-call.c:1512
>>>>>>> 0x787b01 fold_builtin_3
>>>>>>>         ../../gcc/builtins.c:8385
>>>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>>>>>         ../../gcc/builtins.c:8465
>>>>>>> 0x9052b1 fold(tree_node*)
>>>>>>>         ../../gcc/fold-const.c:11919
>>>>>>> 0x6de2bb c_fully_fold_internal
>>>>>>>         ../../gcc/c/c-fold.c:185
>>>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>>>         ../../gcc/c/c-fold.c:90
>>>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>>>         ../../gcc/c/c-parser.c:5430
>>>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>>>         ../../gcc/c/c-parser.c:4944
>>>>>>> 0x6cdbde c_parser_compound_statement
>>>>>>>         ../../gcc/c/c-parser.c:4777
>>>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>>>         ../../gcc/c/c-parser.c:2176
>>>>>>> 0x6d51ab c_parser_external_declaration
>>>>>>>         ../../gcc/c/c-parser.c:1574
>>>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>>>         ../../gcc/c/c-parser.c:1454
>>>>>>> 0x6d5c09 c_parse_file()
>>>>>>>         ../../gcc/c/c-parser.c:18173
>>>>>>> 0x72ffd2 c_common_parse_file()
>>>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>>>
>>>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>>>
>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives
>>>>>>> regression tests.
>>>>>>>
>>>>>>> Ready to be installed?
>>>>>>
>>>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>>>> CHAR_BIT test is now redundant.
>>>>>>
>>>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>>>> in time should tell.
>>>>>
>>>>> Ok, it started with r229922, where it was changed from:
>>>>>
>>>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>>>     {
>>>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>>>> ...
>>>>>
>>>>> to current version:
>>>>>
>>>>>     case CFN_BUILT_IN_STRNCMP:
>>>>>       {
>>>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>>>
>>>>> Thus I'm suggesting to change to back to it.
>>>>>
>>>>> Ready to be installed?
>>>>
>>>> Let's ask Richard.
>>>
>>> The idea with the:
>>>
>>>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
>>>
>>> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
>>> I think we still want that.
>>
>> OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
>> wi::min_precision check, right?
>
> Not sure.  If we have host_size_t_cst_p then we should have a corresponding
> size_t host_size_t (const_tree) and should use those in pairs.  Not sure
> why we have sth satisfying host_size_t_cst_p but not tree_fits_uhwi_p.

It's the other way around: something can satisfy tree_fits_uhwi_p
(i.e. fit within a uint64_t) but not fit within the host's size_t.
The kind of case I'm thinking of is:

  strncmp ("fi", "fo", (1L << 32) + 1)

for an ILP32 host and LP64 target.  There's a danger that by passing
the uint64_t value (1L << 32) + 1 to the host's strncmp that we'd
truncate it to 1, giving the wrong result.

Thanks,
Richard
Richard Biener Oct. 31, 2016, 10:09 a.m. UTC | #6
On Mon, Oct 31, 2016 at 10:58 AM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On Mon, Oct 31, 2016 at 10:10 AM, Martin Liška <mliska@suse.cz> wrote:
>>> On 10/31/2016 01:12 AM, Richard Sandiford wrote:
>>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>>>>> strncmp ("a", "b", -1);
>>>>>>>>
>>>>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>>>>         ../../gcc/tree.c:7324
>>>>>>>> 0x90a23f host_size_t_cst_p
>>>>>>>>         ../../gcc/fold-const-call.c:63
>>>>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>>>>> tree_node*, tree_node*)
>>>>>>>>         ../../gcc/fold-const-call.c:1512
>>>>>>>> 0x787b01 fold_builtin_3
>>>>>>>>         ../../gcc/builtins.c:8385
>>>>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**, int, bool)
>>>>>>>>         ../../gcc/builtins.c:8465
>>>>>>>> 0x9052b1 fold(tree_node*)
>>>>>>>>         ../../gcc/fold-const.c:11919
>>>>>>>> 0x6de2bb c_fully_fold_internal
>>>>>>>>         ../../gcc/c/c-fold.c:185
>>>>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>>>>         ../../gcc/c/c-fold.c:90
>>>>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>>>>         ../../gcc/c/c-parser.c:5430
>>>>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>>>>         ../../gcc/c/c-parser.c:4944
>>>>>>>> 0x6cdbde c_parser_compound_statement
>>>>>>>>         ../../gcc/c/c-parser.c:4777
>>>>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>>>>         ../../gcc/c/c-parser.c:2176
>>>>>>>> 0x6d51ab c_parser_external_declaration
>>>>>>>>         ../../gcc/c/c-parser.c:1574
>>>>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>>>>         ../../gcc/c/c-parser.c:1454
>>>>>>>> 0x6d5c09 c_parse_file()
>>>>>>>>         ../../gcc/c/c-parser.c:18173
>>>>>>>> 0x72ffd2 c_common_parse_file()
>>>>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>>>>
>>>>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>>>>
>>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives
>>>>>>>> regression tests.
>>>>>>>>
>>>>>>>> Ready to be installed?
>>>>>>>
>>>>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>>>>> CHAR_BIT test is now redundant.
>>>>>>>
>>>>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>>>>> in time should tell.
>>>>>>
>>>>>> Ok, it started with r229922, where it was changed from:
>>>>>>
>>>>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>>>>     {
>>>>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>>>>> ...
>>>>>>
>>>>>> to current version:
>>>>>>
>>>>>>     case CFN_BUILT_IN_STRNCMP:
>>>>>>       {
>>>>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>>>>
>>>>>> Thus I'm suggesting to change to back to it.
>>>>>>
>>>>>> Ready to be installed?
>>>>>
>>>>> Let's ask Richard.
>>>>
>>>> The idea with the:
>>>>
>>>>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
>>>>
>>>> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
>>>> I think we still want that.
>>>
>>> OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
>>> wi::min_precision check, right?
>>
>> Not sure.  If we have host_size_t_cst_p then we should have a corresponding
>> size_t host_size_t (const_tree) and should use those in pairs.  Not sure
>> why we have sth satisfying host_size_t_cst_p but not tree_fits_uhwi_p.
>
> It's the other way around: something can satisfy tree_fits_uhwi_p
> (i.e. fit within a uint64_t) but not fit within the host's size_t.
> The kind of case I'm thinking of is:
>
>   strncmp ("fi", "fo", (1L << 32) + 1)
>
> for an ILP32 host and LP64 target.  There's a danger that by passing
> the uint64_t value (1L << 32) + 1 to the host's strncmp that we'd
> truncate it to 1, giving the wrong result.

Yes, but if it passes host_size_t_cst_p why does tree_to_uhwi ICE then?
(unless we have a > 64bit host size_t).

Richard.

>
> Thanks,
> Richard
Richard Sandiford Oct. 31, 2016, 10:18 a.m. UTC | #7
Richard Biener <richard.guenther@gmail.com> writes:
> On Mon, Oct 31, 2016 at 10:58 AM, Richard Sandiford
> <richard.sandiford@arm.com> wrote:
>> Richard Biener <richard.guenther@gmail.com> writes:
>>> On Mon, Oct 31, 2016 at 10:10 AM, Martin Liška <mliska@suse.cz> wrote:
>>>> On 10/31/2016 01:12 AM, Richard Sandiford wrote:
>>>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>>>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>>>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>>>>>> strncmp ("a", "b", -1);
>>>>>>>>>
>>>>>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>>>>>         ../../gcc/tree.c:7324
>>>>>>>>> 0x90a23f host_size_t_cst_p
>>>>>>>>>         ../../gcc/fold-const-call.c:63
>>>>>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>>>>>> tree_node*, tree_node*)
>>>>>>>>>         ../../gcc/fold-const-call.c:1512
>>>>>>>>> 0x787b01 fold_builtin_3
>>>>>>>>>         ../../gcc/builtins.c:8385
>>>>>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**,
>>>>>>>>> int, bool)
>>>>>>>>>         ../../gcc/builtins.c:8465
>>>>>>>>> 0x9052b1 fold(tree_node*)
>>>>>>>>>         ../../gcc/fold-const.c:11919
>>>>>>>>> 0x6de2bb c_fully_fold_internal
>>>>>>>>>         ../../gcc/c/c-fold.c:185
>>>>>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>>>>>         ../../gcc/c/c-fold.c:90
>>>>>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>>>>>         ../../gcc/c/c-parser.c:5430
>>>>>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>>>>>         ../../gcc/c/c-parser.c:4944
>>>>>>>>> 0x6cdbde c_parser_compound_statement
>>>>>>>>>         ../../gcc/c/c-parser.c:4777
>>>>>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>>>>>         ../../gcc/c/c-parser.c:2176
>>>>>>>>> 0x6d51ab c_parser_external_declaration
>>>>>>>>>         ../../gcc/c/c-parser.c:1574
>>>>>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>>>>>         ../../gcc/c/c-parser.c:1454
>>>>>>>>> 0x6d5c09 c_parse_file()
>>>>>>>>>         ../../gcc/c/c-parser.c:18173
>>>>>>>>> 0x72ffd2 c_common_parse_file()
>>>>>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>>>>>
>>>>>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>>>>>
>>>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives
>>>>>>>>> regression tests.
>>>>>>>>>
>>>>>>>>> Ready to be installed?
>>>>>>>>
>>>>>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>>>>>> CHAR_BIT test is now redundant.
>>>>>>>>
>>>>>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>>>>>> in time should tell.
>>>>>>>
>>>>>>> Ok, it started with r229922, where it was changed from:
>>>>>>>
>>>>>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>>>>>     {
>>>>>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>>>>>> ...
>>>>>>>
>>>>>>> to current version:
>>>>>>>
>>>>>>>     case CFN_BUILT_IN_STRNCMP:
>>>>>>>       {
>>>>>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>>>>>
>>>>>>> Thus I'm suggesting to change to back to it.
>>>>>>>
>>>>>>> Ready to be installed?
>>>>>>
>>>>>> Let's ask Richard.
>>>>>
>>>>> The idea with the:
>>>>>
>>>>>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
>>>>>
>>>>> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
>>>>> I think we still want that.
>>>>
>>>> OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
>>>> wi::min_precision check, right?
>>>
>>> Not sure.  If we have host_size_t_cst_p then we should have a corresponding
>>> size_t host_size_t (const_tree) and should use those in pairs.  Not sure
>>> why we have sth satisfying host_size_t_cst_p but not tree_fits_uhwi_p.
>>
>> It's the other way around: something can satisfy tree_fits_uhwi_p
>> (i.e. fit within a uint64_t) but not fit within the host's size_t.
>> The kind of case I'm thinking of is:
>>
>>   strncmp ("fi", "fo", (1L << 32) + 1)
>>
>> for an ILP32 host and LP64 target.  There's a danger that by passing
>> the uint64_t value (1L << 32) + 1 to the host's strncmp that we'd
>> truncate it to 1, giving the wrong result.
>
> Yes, but if it passes host_size_t_cst_p why does tree_to_uhwi ICE then?
> (unless we have a > 64bit host size_t).

Because in Martin's test case the length has a signed type.
tree_to_uhwi then treats the argument as -1 to infinite precision
rather than ~(size_t) 0 to infinite precision.

Thanks,
Richard
Richard Biener Oct. 31, 2016, 11:11 a.m. UTC | #8
On Mon, Oct 31, 2016 at 11:18 AM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On Mon, Oct 31, 2016 at 10:58 AM, Richard Sandiford
>> <richard.sandiford@arm.com> wrote:
>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>> On Mon, Oct 31, 2016 at 10:10 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>> On 10/31/2016 01:12 AM, Richard Sandiford wrote:
>>>>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>>>>> On Thu, Oct 27, 2016 at 5:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>>> On 10/27/2016 03:35 PM, Richard Biener wrote:
>>>>>>>>> On Thu, Oct 27, 2016 at 9:41 AM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>>>>> Running simple test-case w/o the proper header file causes ICE:
>>>>>>>>>> strncmp ("a", "b", -1);
>>>>>>>>>>
>>>>>>>>>> 0xe74462 tree_to_uhwi(tree_node const*)
>>>>>>>>>>         ../../gcc/tree.c:7324
>>>>>>>>>> 0x90a23f host_size_t_cst_p
>>>>>>>>>>         ../../gcc/fold-const-call.c:63
>>>>>>>>>> 0x90a23f fold_const_call(combined_fn, tree_node*, tree_node*,
>>>>>>>>>> tree_node*, tree_node*)
>>>>>>>>>>         ../../gcc/fold-const-call.c:1512
>>>>>>>>>> 0x787b01 fold_builtin_3
>>>>>>>>>>         ../../gcc/builtins.c:8385
>>>>>>>>>> 0x787b01 fold_builtin_n(unsigned int, tree_node*, tree_node**,
>>>>>>>>>> int, bool)
>>>>>>>>>>         ../../gcc/builtins.c:8465
>>>>>>>>>> 0x9052b1 fold(tree_node*)
>>>>>>>>>>         ../../gcc/fold-const.c:11919
>>>>>>>>>> 0x6de2bb c_fully_fold_internal
>>>>>>>>>>         ../../gcc/c/c-fold.c:185
>>>>>>>>>> 0x6e1f6b c_fully_fold(tree_node*, bool, bool*)
>>>>>>>>>>         ../../gcc/c/c-fold.c:90
>>>>>>>>>> 0x67cbbf c_process_expr_stmt(unsigned int, tree_node*)
>>>>>>>>>>         ../../gcc/c/c-typeck.c:10369
>>>>>>>>>> 0x67cfbd c_finish_expr_stmt(unsigned int, tree_node*)
>>>>>>>>>>         ../../gcc/c/c-typeck.c:10414
>>>>>>>>>> 0x6cb578 c_parser_statement_after_labels
>>>>>>>>>>         ../../gcc/c/c-parser.c:5430
>>>>>>>>>> 0x6cd333 c_parser_compound_statement_nostart
>>>>>>>>>>         ../../gcc/c/c-parser.c:4944
>>>>>>>>>> 0x6cdbde c_parser_compound_statement
>>>>>>>>>>         ../../gcc/c/c-parser.c:4777
>>>>>>>>>> 0x6c93ac c_parser_declaration_or_fndef
>>>>>>>>>>         ../../gcc/c/c-parser.c:2176
>>>>>>>>>> 0x6d51ab c_parser_external_declaration
>>>>>>>>>>         ../../gcc/c/c-parser.c:1574
>>>>>>>>>> 0x6d5c09 c_parser_translation_unit
>>>>>>>>>>         ../../gcc/c/c-parser.c:1454
>>>>>>>>>> 0x6d5c09 c_parse_file()
>>>>>>>>>>         ../../gcc/c/c-parser.c:18173
>>>>>>>>>> 0x72ffd2 c_common_parse_file()
>>>>>>>>>>         ../../gcc/c-family/c-opts.c:1087
>>>>>>>>>>
>>>>>>>>>> Following patch improves the host_size_t_cst_p predicate.
>>>>>>>>>>
>>>>>>>>>> Patch can bootstrap on ppc64le-redhat-linux and survives
>>>>>>>>>> regression tests.
>>>>>>>>>>
>>>>>>>>>> Ready to be installed?
>>>>>>>>>
>>>>>>>>> I believe the wi::min_precision (t, UNSIGNED) <= sizeof (size_t) *
>>>>>>>>> CHAR_BIT test is now redundant.
>>>>>>>>>
>>>>>>>>> OTOH it was probably desired to allow -1 here?  A little looking back
>>>>>>>>> in time should tell.
>>>>>>>>
>>>>>>>> Ok, it started with r229922, where it was changed from:
>>>>>>>>
>>>>>>>>   if (tree_fits_uhwi_p (len) && p1 && p2)
>>>>>>>>     {
>>>>>>>>       const int i = strncmp (p1, p2, tree_to_uhwi (len));
>>>>>>>> ...
>>>>>>>>
>>>>>>>> to current version:
>>>>>>>>
>>>>>>>>     case CFN_BUILT_IN_STRNCMP:
>>>>>>>>       {
>>>>>>>>         bool const_size_p = host_size_t_cst_p (arg2, &s2);
>>>>>>>>
>>>>>>>> Thus I'm suggesting to change to back to it.
>>>>>>>>
>>>>>>>> Ready to be installed?
>>>>>>>
>>>>>>> Let's ask Richard.
>>>>>>
>>>>>> The idea with the:
>>>>>>
>>>>>>   wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT
>>>>>>
>>>>>> test was to stop us attempting 64-bit size_t operations on ILP32 hosts.
>>>>>> I think we still want that.
>>>>>
>>>>> OK, so is the consensus to add tree_fits_uhwi_p predicate to the current
>>>>> wi::min_precision check, right?
>>>>
>>>> Not sure.  If we have host_size_t_cst_p then we should have a corresponding
>>>> size_t host_size_t (const_tree) and should use those in pairs.  Not sure
>>>> why we have sth satisfying host_size_t_cst_p but not tree_fits_uhwi_p.
>>>
>>> It's the other way around: something can satisfy tree_fits_uhwi_p
>>> (i.e. fit within a uint64_t) but not fit within the host's size_t.
>>> The kind of case I'm thinking of is:
>>>
>>>   strncmp ("fi", "fo", (1L << 32) + 1)
>>>
>>> for an ILP32 host and LP64 target.  There's a danger that by passing
>>> the uint64_t value (1L << 32) + 1 to the host's strncmp that we'd
>>> truncate it to 1, giving the wrong result.
>>
>> Yes, but if it passes host_size_t_cst_p why does tree_to_uhwi ICE then?
>> (unless we have a > 64bit host size_t).
>
> Because in Martin's test case the length has a signed type.
> tree_to_uhwi then treats the argument as -1 to infinite precision
> rather than ~(size_t) 0 to infinite precision.

Indeed.  So the bug is kind-of in the caller then.  OTOH we could simply
re-interpret the input as target size_t before doing the range check /
conversion.

I believe fold_const_call has the general issue of not verifying argument types
before recognizing things as BUILT_IN_* (or the FE is at fault - but that's an
old discussion...)

Richard.

> Thanks,
> Richard
diff mbox

Patch

From 608ed3ac6b743846e9bce62cd0b0e83e2b018684 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Wed, 26 Oct 2016 13:48:39 +0200
Subject: [PATCH] Fix host_size_t_cst_p predicat

gcc/ChangeLog:

2016-10-26  Martin Liska  <mliska@suse.cz>

	* fold-const-call.c (host_size_t_cst_p): Test whether
	it can fit to uhwi.

gcc/testsuite/ChangeLog:

2016-10-26  Martin Liska  <mliska@suse.cz>

	* gcc.dg/tree-ssa/builtins-folding-gimple-ub.c (main): Add
	test case.
---
 gcc/fold-const-call.c                                      | 3 +--
 gcc/testsuite/gcc.dg/tree-ssa/builtins-folding-gimple-ub.c | 4 ++++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/gcc/fold-const-call.c b/gcc/fold-const-call.c
index 05a15f9..b8154c8 100644
--- a/gcc/fold-const-call.c
+++ b/gcc/fold-const-call.c
@@ -57,8 +57,7 @@  complex_cst_p (tree t)
 static inline bool
 host_size_t_cst_p (tree t, size_t *size_out)
 {
-  if (integer_cst_p (t)
-      && wi::min_precision (t, UNSIGNED) <= sizeof (size_t) * CHAR_BIT)
+  if (tree_fits_uhwi_p (t))
     {
       *size_out = tree_to_uhwi (t);
       return true;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtins-folding-gimple-ub.c b/gcc/testsuite/gcc.dg/tree-ssa/builtins-folding-gimple-ub.c
index df0ede2..e1658d1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/builtins-folding-gimple-ub.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/builtins-folding-gimple-ub.c
@@ -17,6 +17,10 @@  main (void)
   if (__builtin_memchr (foo1, 'x', 1000)) /* Not folded away.  */
     __builtin_abort ();
 
+  /* STRNCMP.  */
+  if (strncmp ("a", "b", -1)) /* { dg-warning "implicit declaration of function" } */
+    __builtin_abort ();
+
   return 0;
 }
 
-- 
2.10.1