fghanim added inline comments.

================
Comment at: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h:282
+  IRBuilder<> AllocaBuilder;
+
   /// Map to remember source location strings
----------------
jdoerfert wrote:
> fghanim wrote:
> > What's the benefit of this over just maintaining an alloca insertion point?
> > 
> > With this we will have 3 `IRBuilder`s to maintain and keep track of: the 
> > clang (or flang) `IRBuilder`, the OMP `IRBuilder` and the `allocaBuilder`
> No functional difference. Basically the same reason why clang has an 
> AllocIRBuilder (I think), we can use it independently of the other one. The 
> alternative is to save the builder IP, set it to the alloca IP, do alloca 
> stuff, reset the builder IP, when you use the AllocaIRBuilder below. Again, 
> no functional difference, just less setting/resetting of IPs.
I understand where you are coming from, and I understand that functionally 
there is mostly no change - for now. But I prefer we do a small struct with 
some RAII, over adding an entire builder. I think it's a bit overkill and will 
be a source to lots of trouble.

Clang maintains an instruction `AllocaInsertPt`, not a specific builder. 
Speaking of which, This is completely from memory (i.e. check to make sure); I 
think we already save the previous `AllocaInsertionPt` in clang as part of the 
`bodyGenCB`. In which case, this is not needed; a nested `parallel` will always 
be generated by clang as part of the `bodyGenCB`, which in turn is going to 
save the Alloca insertion point for us. 
To enable the creation of the allocas for `TID` and `ZeroAddr` in the outer 
function, Why not pass current `AllocaInsertionPt` as an arg. to 
`createParallel`


================
Comment at: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h:294
     PostOutlineCBTy PostOutlineCB;
+    BasicBlock *EntryBB, *ExitBB;
+
----------------
jdoerfert wrote:
> fghanim wrote:
> > I see two benefits of passing entry and exit blocks, as opposed to what we 
> > used to do:
> > 1. less memory, but in return we collect blocks twice (i.e. O(N) mem & 
> > O(N+E) work vs O(1) mem and 2 * O(N+E) work ). Do you expect that the 
> > vector is likely to become large enough where it is a problem? if not, 
> > what's the benefit of the change?
> > 
> > 2. If some blocks are added later, then this becomes a correctness issue. 
> > Which is unlikely since it happens after the body codegen is complete. 
> > However, if I am mistaken, shouldn't we also delay searching for 
> > inputs/outputs?
> It is 2. Here, finalization steps will outline the inner region and introduce 
> split blocks in the process. Those were not in the outer regions blocks 
> vector which caused problems. The inputs/outputs are not allowed to change 
> though, that invariant seems to hold fine.
> (Once we do OpenMP loop transformations on this level other new blocks would 
> be introduced during finalize.)
Oh right. Thanks for explaining that. :)
Nit: if possible, add a simple assert to check that inputs/outputs didn't change


================
Comment at: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h:299
+    void collectBlocks(SmallPtrSetImpl<BasicBlock *> &BlockSet,
+                       SmallVectorImpl<BasicBlock *> &BlockVector);
   };
----------------
jdoerfert wrote:
> fghanim wrote:
> > What is the benefit of passing `blockSet` when it is exclusively used 
> > inside of `collectBlocks`? 
> > I don't think I saw a usage of it in calling functions. am I missing 
> > something?
> It's used in line 684 outside of collectBlocks.
Oh, Thanks. I missed that. :)
In this case; I think both the Blockset, and BlockVector have the same 
contents, correct? can't we use the vector instead on line 684, and keep the 
set local?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82470



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

Reply via email to