hokein added inline comments.

================
Comment at: clang-tools-extra/pseudo/lib/GLR.cpp:87
     NewHeads.clear();
+    MaybeGC();
     glrReduce(PendingReduce, Params,
----------------
sammccall wrote:
> hokein wrote:
> > I would just call it before the `NewHeads.clear()`, and run the `gc` on the 
> > `NewHeads` directly.
> > 
> > It simplifies the implementation (no need to traverse three pending 
> > actions, and no duplicated elements in Roots). The downside is that some 
> > dead heads (heads with no available actions on `Terminal.symbol()`) will 
> > not be GCed in this run, but I think it is negligible, as those will be 
> > GCed in next run.
> Oops, I forgot that Pending* are all empty at the beginning of this loop. I 
> should probably add an assertion for that.
> 
> We can call it right at the top of the loop, yes? It doesn't need to be 
> between AddSsteps and NewHeads.clear().
> 
> > run the gc on the NewHeads directly
> Unfortunately not: the GC naturally consumes the argument (it becomes the 
> stack for the DFS) so we need a copy.
> We could move the copy into gc() but:
>  - this way we can reuse the same vector every time and don't have to allocate
>  - soon we'll have error-recovery candidates as additional roots we want to 
> pass in
> Oops, I forgot that Pending* are all empty at the beginning of this loop. I 
> should probably add an assertion for that.

Yes. I would probably do it after glrReduce and glrShift calls.

> We can call it right at the top of the loop, yes? It doesn't need to be 
> between AddSsteps and NewHeads.clear().

Yes, exactly.  We could also do that at the end of the loop.

> > run the gc on the NewHeads directly
> Unfortunately not: the GC naturally consumes the argument (it becomes the 
> stack for the DFS) so we need a copy.
> We could move the copy into gc() but:
>  - this way we can reuse the same vector every time and don't have to allocate
>  - soon we'll have error-recovery candidates as additional roots we want to 
> pass in

oh, I didn't notice that. I think making a copy is fine.



================
Comment at: clang-tools-extra/pseudo/lib/GLR.cpp:391
+                              llvm::ArrayRef<const Node *> Parents) {
+  ++NodeCount;
+  Node *Result = new (allocate(Parents.size()))
----------------
sammccall wrote:
> hokein wrote:
> > The NodeCount becomes vague now, we update in both addNode and allocate 
> > methods, I think we should have two separate counts.
> - Oops, that duplicated ++NodeCount is just a mistake.
> - names are vague now, both "NodeCount" and "Allocated" are dubious. Maybe 
> I'll rename to `NodesCreated` and `Alive`, WDYT?
> - are there actually more metrics we want to record? we have nodes-created, 
> currently-live-nodes (Allocated.size()), nodes-destroyed (`NodeCount - 
> Allocated.size()`). We could track max-live-node but I think Arena.bytes() is 
> fine for our purposes.
> - do we want to expose any of those numbers through APIs? I couldn't work out 
> what I'd actually do with them.
> names are vague now, both "NodeCount" and "Allocated" are dubious. Maybe I'll 
> rename to NodesCreated and Alive, WDYT?

Sounds good to me.

> are there actually more metrics we want to record? we have nodes-created, 
> currently-live-nodes (Allocated.size()), nodes-destroyed (NodeCount - 
> Allocated.size()). We could track max-live-node but I think Arena.bytes() is 
> fine for our purposes.

I think these are sufficient, should provide enough details about 
GSS-memory-related information. The other things I will like to record is the 
max-active-heads, but that's a different bit.

> do we want to expose any of those numbers through APIs? I couldn't work out 
> what I'd actually do with them.

I think we should avoid to expose an API per field, we probably just need a 
single API which returns a Stats struct containing all these things. We can do 
it later.




================
Comment at: clang-tools-extra/pseudo/lib/GLR.cpp:403
+  ++NodeCount;
+  if (FreeList.size() <= Parents)
+    FreeList.resize(Parents + 1);
----------------
sammccall wrote:
> hokein wrote:
> > What's the practical size of the `FreeList`? I think we can just find one, 
> > and use it as initial default size, to save some cost of resize. 
> It's whatever the max #parents is - maybe 10 or something?
> I don't think it's worth adding a hard-coded guess to save ~1 resize of a 
> single vector per parse!
I would image there will be multiple resize calls, if the path like 
`allocate(1), allocate(3), ..., allocate(max)`, which I think it is practical? 
unless the first call is `allocate(max)` which is unlikely I think.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D126723/new/

https://reviews.llvm.org/D126723

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to