On Mon, Aug 1, 2016 at 4:52 PM, Prasad Ghangal <[email protected]> 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.
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