This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gimplefe] "Unknown tree: c_maybe_const_expr" error while parsing conditional expression


On 4 August 2016 at 18:29, Richard Biener <richard.guenther@gmail.com> wrote:
> On Thu, Aug 4, 2016 at 1:31 PM, Prasad Ghangal <prasad.ghangal@gmail.com> wrote:
>> On 2 August 2016 at 14:29, Richard Biener <richard.guenther@gmail.com> wrote:
>>> On Mon, Aug 1, 2016 at 4:52 PM, Prasad Ghangal <prasad.ghangal@gmail.com> wrote:
>>>> Hi,
>>>>
>>>> I am trying to replace c_parser_paren_condition (parser) in
>>>> c_parser_gimple_if_stmt by c_parser_gimple_paren_condition (parser) as
>>>> described in the patch
>>>>
>>>> I am trying test case
>>>> void __GIMPLE () foo ()
>>>> {
>>>>   int a;
>>>> bb_2:
>>>>   if (a == 2)
>>>>     goto bb_3;
>>>>   else
>>>>     goto bb_4;
>>>> bb_3:
>>>>   a_2 = 4;
>>>> bb_4:
>>>>   return;
>>>> }
>>>>
>>>> but it fails to parse gimple expression and produces error as
>>>> /home/prasad/test3.c: In function ‘foo’:
>>>> /home/prasad/test3.c:1:18: error: invalid operands in gimple comparison
>>>>  void __GIMPLE () foo ()
>>>>                   ^~~
>>>> if (<<< Unknown tree: c_maybe_const_expr
>>>>
>>>>   a >>> == 2) goto bb_3; else goto bb_4;
>>>> /home/prasad/test3.c:1:18: internal compiler error: verify_gimple failed
>>>>
>>>> I failed to debug where it is setting to C_MAYBE_CONST_EXPR
>>>
>>> It's in parsing the binary expression.  Btw, you don't need lvalue_to_rvalue
>>> conversion or truthvalue conversion - source that would require this would
>>> not be valid GIMPLE.  Let me try to debug:
>>>
>>>
>>> (gdb) p debug_tree (cond.value)
>>>  <eq_expr 0x7ffff6997960
>>>     type <integer_type 0x7ffff688b7e0 int public SI
>>>         size <integer_cst 0x7ffff6887ee8 constant 32>
>>>         unit size <integer_cst 0x7ffff6887f00 constant 4>
>>>         align 32 symtab 0 alias set -1 canonical type 0x7ffff688b7e0
>>> precision 32 min <integer_cst 0x7ffff6887ea0 -2147483648> max
>>> <integer_cst 0x7ffff6887eb8 2147483647>
>>>         pointer_to_this <pointer_type 0x7ffff68a5930>>
>>>
>>>     arg 0 <c_maybe_const_expr 0x7ffff6997938 type <integer_type
>>> 0x7ffff688b7e0 int>
>>>
>>>         arg 1 <var_decl 0x7ffff7fefcf0 a type <integer_type 0x7ffff688b7e0 int>
>>>             used SI file t.c line 3 col 7 size <integer_cst
>>> 0x7ffff6887ee8 32> unit size <integer_cst 0x7ffff6887f00 4>
>>>             align 32 context <function_decl 0x7ffff699c500 foo>>>
>>>     arg 1 <integer_cst 0x7ffff68a4318 type <integer_type
>>> 0x7ffff688b7e0 int> constant 2>
>>>     t.c:5:9 start: t.c:5:7 finish: t.c:5:12>
>>> $5 = void
>>> (gdb) b ggc-page.c:1444 if result == 0x7ffff6997938
>>> Breakpoint 6 at 0x8a0d3e: file
>>> /space/rguenther/src/gcc_gimple_fe/gcc/ggc-page.c, line 1444.
>>> (gdb) run
>>>
>>> Breakpoint 6, ggc_internal_alloc (size=40, f=0x0, s=0, n=1)
>>>     at /space/rguenther/src/gcc_gimple_fe/gcc/ggc-page.c:1444
>>> 1444      return result;
>>> (gdb) fin (a few times)
>>> Run till exit from #0  0x00000000011821b7 in build2_stat (
>>>     code=C_MAYBE_CONST_EXPR, tt=<integer_type 0x7ffff688b7e0 int>,
>>>     arg0=<tree 0x0>, arg1=<var_decl 0x7ffff7fefcf0 a>)
>>>     at /space/rguenther/src/gcc_gimple_fe/gcc/tree.c:4466
>>> 0x000000000081d263 in c_wrap_maybe_const (expr=<var_decl 0x7ffff7fefcf0 a>,
>>>     non_const=false)
>>>     at /space/rguenther/src/gcc_gimple_fe/gcc/c-family/c-common.c:4359
>>> 4359      expr = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (expr), NULL, expr);
>>> Value returned is $11 = (tree_node *) 0x7ffff6997938
>>> (gdb) up
>>> #1  0x00000000007b8e81 in build_binary_op (location=176833, code=EQ_EXPR,
>>>     orig_op0=<var_decl 0x7ffff7fefcf0 a>,
>>>     orig_op1=<integer_cst 0x7ffff68a4318>, convert_p=1)
>>>     at /space/rguenther/src/gcc_gimple_fe/gcc/c/c-typeck.c:11549
>>> 11549                       op0 = c_wrap_maybe_const (op0, !op0_maybe_const);
>>>
>>> and this is guarded by !in_late_binary_op (which also seems to guard folding).
>>> So I suggest to somewhere at the start of parsing to set in_late_binary_op to
>>> true for -fgimple.  Not sure if it works for everything, but you
>>> should have accumulated
>>> quite some tests for -fgimple in the testsuite to make sure it doesn't
>>> regress anything.
>>>
>> I did bootstrap build for the trunk and testing is in progress. How
>> can I test with -fgimple flag enabled?
>
> You can do
>
> make check-gcc RUNTESTFLAGS="--target_board=unix/-fgimple"
>
> Richard.
>
I was comparing result from latest commit and "gcc initial version". I
found most of the testcases failed due to modified gimple dump.


Thanks,
Prasad

>>
>> Thanks,
>> Prasad
>>> The following works for me:
>>>
>>> diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
>>> index 70800a2..c8c087a 100644
>>> --- a/gcc/c/c-parser.c
>>> +++ b/gcc/c/c-parser.c
>>> @@ -2158,7 +2159,10 @@ c_parser_declaration_or_fndef (c_parser
>>> *parser, bool fndef_ok,
>>>
>>>        if (gimple_body_p && flag_gimple)
>>>         {
>>> +         bool saved = in_late_binary_op;
>>> +         in_late_binary_op = true;
>>>           c_parser_parse_gimple_body (parser);
>>> +         in_late_binary_op = saved;
>>>           cgraph_node::finalize_function (current_function_decl, false);
>>>           timevar_pop (tv);
>>>           return;
>>>
>>>
>>> Richard.
>>>
>>>>
>>>> Thanks,
>>>> Prasad


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]