On 4 August 2016 at 18:29, Richard Biener <richard.guent...@gmail.com> wrote: > On Thu, Aug 4, 2016 at 1:31 PM, Prasad Ghangal <prasad.ghan...@gmail.com> > wrote: >> On 2 August 2016 at 14:29, Richard Biener <richard.guent...@gmail.com> wrote: >>> On Mon, Aug 1, 2016 at 4:52 PM, Prasad Ghangal <prasad.ghan...@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