On Thu, 2016-10-20 at 13:02 +0200, Bernd Schmidt wrote:
>
> On 10/20/2016 11:22 AM, Bernd Schmidt wrote:
> > On 10/20/2016 01:49 AM, David Malcolm wrote:
> > >
> > > (b) for all codes for which rtx_equal_p requires pointer
> > > equality, add
> > > some kind of extra ID to the dump, allowing the loader to
> > > reconstruct
> > > the graph. This could be the pointer itself:
> > >
> > > (scratch:DI [0x7ffff19ee150])
> > > (scratch:DI [ptr:0x7ffff19ee150])
> > >
> > > or somesuch, but it would perhaps be better to use some kind of
> > > more
> > > human-friendly ID e.g.
> > >
> > > (scratch:DI [ptr-idx: 42])
> > >
> > > or similar, rather than subject ourselves to raw hex values.
> > > Probably
> > > need an extra flag to print-rtl.c, to avoid making the dumps more
> > > verbose for everyone who doesn't want this (if so, does "compact"
> > > mode
> > > need renaming...)
> > >
> > > Or just do this for SCRATCH, maybe?
> >
> > Recognizing by SCRATCH wouldn't catch everything, I believe. You
> > should
> > be able to check n_dups and dup_loc in recog_data to identify cases
> > where you need to ensure something is restored with pointer
> > equality.
Thanks; I'll look into this.
> > I'd hope you already have pointer equality for all instances of
> > each
> > pseudo register.
The loader already does this; I'll add an explicit selftest for it.
> As for the output format, I think you're on the right track assigning
> IDs, but maybe the following would be easier to parse for machines
> and
> humans:
>
> (cinsn (set (mem/v:BLK {0}(scratch:DI) [0 A8])
> (unspec:BLK [
> (mem/v:BLK (match_dup 0) [0 A8])
> ] UNSPEC_MEMORY_BLOCKAGE)) "test.c":2
> (nil))
>
> where the {0} could be recognized as a prefix saying "store the
> address
> of the next rtx into slot 0, with a finalization pass replacing
> match_dups with the corresponding address.
>
> Could also maybe do something like (0|scratch:DI), that ought to also
> be
> unambiguous.
match_dup is within the part of rtl.def that's guarded by
#ifdef GENERATOR_FILE, so as-is we can't use match_dup on the host
(unless we expose it there, I suppose). But we may be able to special
-case it in the loader, and do it directly (or give it its own name,
maybe "reuse_rtx"?)
As for syntax, I think I prefer to have the ID to appear within the
paren, since we have enough weird syntax to cope with within the
operands, so it might look like:
({0} scratch:DI)
or:
(0|scratch:DI)
with the insn as a whole looking like:
(cinsn (set (mem/v:BLK (0|scratch:DI) [0 A8])
(unspec:BLK [
(mem/v:BLK (reuse_rtx 0) [0 A8])
] UNSPEC_MEMORY_BLOCKAGE)) "test.c":2
(nil))