On Thu, 2016-10-06 at 15:53 -0400, David Malcolm wrote: > On Thu, 2016-10-06 at 15:30 +0200, Bernd Schmidt wrote: > > On 10/05/2016 06:15 PM, David Malcolm wrote: > > > +;; MEM[(struct isl_obj *)&obj1] = &isl_obj_map_vtable; > > > +(insn 1045 0 1046 2 (set (reg:SI 480) > > > + (high:SI (symbol_ref:SI ("isl_obj_map_vtable") > > > + [flags 0xc0] > > > + <var_decl 0x7fa0363ea240 > > > isl_obj_map_vtable>))) > > > + y.c:12702 -1 > > > + (nil)) > > > +(insn 1046 1045 1047 2 (set (reg/f:SI 479) > > > + (lo_sum:SI (reg:SI 480) > > > + (symbol_ref:SI ("isl_obj_map_vtable") > > > + [flags 0xc0] > > > + <var_decl 0x7fa0363ea240 isl_obj_map_vtable>))) > > > + y.c:12702 -1 > > > + (expr_list:REG_EQUAL (symbol_ref:SI ("isl_obj_map_vtable") > > > + [flags 0xc0] > > > + <var_decl 0x7fa0363ea240 > > > isl_obj_map_vtable>) > > > + (nil))) > > > > I hate saying this, since you've obviously spent a lot of effort, > > but > > I > > think we're still at a too early stage to construct testcases. One > > issue > > that came up while discussing previous patch kits is that the > > format > > here is still too verbose, and I'd like to settle on a format > > first. > > We have to construct testcases in order to see what the testcase > format > should look like - it's hard to talk about things without examples. > > > There's all manner of things that are pointless in a testcase and > > impede > > readability: > > > > * INSN_UIDs and NEXT/PREV fields (could be constructed from > > scratch, > > except for labels) > > A benefit of keeping the INSN_UIDs is that if you've spent half an > hour > single-stepping through RTL modification and know that INSN_UID 1045 > is > the one that gets corrupted, you can have that insn have UID 1045 in > the testcase. Otherwise the UIDs get determined by the parser, and > can > change if other insns get inserted. > > Explicit UIDs let you refer to specific insns when discussing a test > case. > > > * INSN_CODE_NUMBERs in both textual and number form. > > * Various (nil) fields > > FWIW these (nil) fields signify the end of various expr_list chains. > If we emit them, there are places in the format where it would become > ambiguous as to which field is getting an expr_list. > > > * VAR_DECL addresses. > > Here's a revised version of that example > (gcc/testsuite/rtl.dg/aarch64/pr71779.rtl), with the things you > mention > removed, and with some indentation to aid readability: > > ;; { dg-do compile { target aarch64-*-* } } > ;; { dg-options "-fsingle-pass=rtl-cse1 -fdump-rtl-cse1" } > > (function "fragment" > (insn-chain > ;; MEM[(struct isl_obj *)&obj1] = &isl_obj_map_vtable; > (insn 2 (set (reg:SI 480) > (high:SI (symbol_ref:SI ("isl_obj_map_vtable") > [flags 0xc0] <var_decl > isl_obj_map_vtable>))) > y.c:12702) > (insn 2 (set (reg/f:SI 479) > (lo_sum:SI (reg:SI 480) > (symbol_ref:SI ("isl_obj_map_vtable") > [flags 0xc0] > <var_decl 0x7fa0363ea240 > isl_obj_map_vtable>))) > y.c:12702 > (expr_list:REG_EQUAL (symbol_ref:SI ("isl_obj_map_vtable") > [flags 0xc0] > <var_decl isl_obj_map_vtable>))) > (insn 2 (set (reg:DI 481) > (subreg:DI (reg/f:SI 479) 0)) y.c:12702) > (insn 2 (set (zero_extract:DI (reg/v:DI 191 [ obj1D.17368 ]) > (const_int 32 [0x20]) > (const_int 0 [0])) > (reg:DI 481)) y.c:12702) > ;; Extra insn, to avoid all of the above from being deleted by > DCE > (insn 2 (set (mem:DI (reg:DI 191) [1 i+0 S4 A32]) > (const_int 1 [0x1]))) > > ) ;; insn-chain > ) ;; function > > This is with the optional cfg and crtl directives omitted. > > Does the above look acceptable? > > The "2" values after each "insn" are the basic block indices. Should > these be omitted also?
If we do that, one approach could be to introduce a (basic-block) directive into the (insn-chain), giving something like this: ;; { dg-do compile { target aarch64-*-* } } ;; { dg-options "-fsingle-pass=rtl-cse1 -fdump-rtl-cse1" } (function "fragment" (insn-chain (basic-block 2 ;; MEM[(struct isl_obj *)&obj1] = &isl_obj_map_vtable; (insn (set (reg:SI 480) (high:SI (symbol_ref:SI ("isl_obj_map_vtable") [flags 0xc0] <var_decl isl_obj_map_vtable>))) y.c:12702) (insn (set (reg/f:SI 479) (lo_sum:SI (reg:SI 480) (symbol_ref:SI ("isl_obj_map_vtable") [flags 0xc0] <var_decl 0x7fa0363ea240 isl_obj_map_vtable>))) y.c:12702 (expr_list:REG_EQUAL (symbol_ref:SI ("isl_obj_map_vtable") [flags 0xc0] <var_decl isl_obj_map_vtable>))) (insn (set (reg:DI 481) (subreg:DI (reg/f:SI 479) 0)) y.c:12702) (insn (set (zero_extract:DI (reg/v:DI 191 [ obj1D.17368 ]) (const_int 32 [0x20]) (const_int 0 [0])) (reg:DI 481)) y.c:12702) ;; Extra insn, to avoid all of the above from being deleted by DCE (insn (set (mem:DI (reg:DI 191) [1 i+0 S4 A32]) (const_int 1 [0x1]))) ) ;; basic-block 2 ) ;; insn-chain ) ;; function > My hope here is to that the input format is something that existing > gcc > developers will be comfortable reading, which is why I opted for > parsing the existing output - and I'm nervous about moving away too > much from the existing format. In particular, I want the format to > be > something that can be automatically printed and roundtripped, and for > it to be useful to look at when in the debugger. > > Some other possible changes: locations could do with a wrapper, > and/or > to quote the filename, since otherwise we can't cope with spaces in > filenames). So instead of: > > (insn 2 (set (reg:DI 481) > (subreg:DI (reg/f:SI 479) > 0)) y.c:12702) > > we could have: > > (insn 2 (set (reg:DI 481) > (subreg:DI (reg/f:SI 479) 0)) "y.c":12702) > > or: > > (insn 2 (set (reg:DI 481) > (subreg:DI (reg/f:SI 479) > 0)) (srcloc "y.c" 12702)) > > Any preferences on these? > > > What does the RTL reader actually do with MEM_ATTRs? > > It parses them, where it can parse the MEM_EXPR, at least (it can > only > handle simple decl names for MEM_EXPR). > > > Do these survive > > the dump/read process? > > Yes, for the MEM_EXPR cases above. So it will successfully parse the > "[1 i+0 S4 A32]" above. > > > There was also a testcase where virtual regs still occurred with > > register number, I think it would be best to disallow this and add > > the > > ability to parse "(reg:DI virtual-outgoing-args)". > > When we discussing pseudos you expressed a need to keep printing the > regno for REGs, so that the dump format is usable in the debugger, > for > array indices etc. Hence I'd prefer to keep printing the regno for > all > regnos, including virtuals. > > > Also I think I'd prefer testcases submitted separately from the RTL > > frontend. It seems we have two different frontend approaches here, > > one > > RTL frontend and one modification for the C frontend - which do you > > prefer? > > Is it acceptable to do both? I'd like to have an actual RTL > frontend, > though this punts on handling structs etc, whereas Richi seems to > prefer the modification to the C frontend, since it better supports > structs, aliasing, etc. At this point, whichever gets me past patch > review... > > Dave