ftynse planned changes to this revision. ftynse added inline comments.
================ Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:736 "Expected copy/create callback to set replacement value!"); - if (ReplacementValue == &V) - return; } ---------------- jdoerfert wrote: > ftynse wrote: > > jdoerfert wrote: > > > jdoerfert wrote: > > > > I was expecting the above logic to be placed here, after the `PrivCB` > > > > callback as I assumed we would privatize in the sequential part. Clang > > > > does not and we do not either (for now), which is unfortunate. It does > > > > duplicate the privatization and makes this patch more complicated than > > > > I anticipated. I though we can simply replace `ReplacementValue` by > > > > `Reloaded` if `ReplacementValue` wasn't a pointer and therefor put in > > > > an alloca. The fact that we need to reload `V` and then "replace twice" > > > > seems really unfortunate. > > > > > > > > What would happen if you do not have `Reloaded` at all but instead make > > > > it `V = createlodoad(alloca)`? After all, `Reloaded` is equivalent to > > > > `V` in all aspects, right? Would this work? Would we still need the > > > > code below? I feel like there must be a minimal solution as we only > > > > want to replace the value once on the other side of the call edge. > > > -"duplicate privatization" +"duplicate replace all uses with" > > I am not sure I fully follow what you suggest, so I will elaborate on the > > two versions I had considered. > > > > 1. Move the code that loads back the value (currently lines 709-725) after > > this line. This will not remove the need for two separate "replace all > > uses with": there uses of the original `V` in the body that need to be > > replaced with `ReplacementValue`, and there are uses of `V` that could have > > been introduced by `PrivCB` for the purpose of //defining// > > `ReplacementValue` which should be replaced with `Reloaded` instead. This > > doesn't look like it would address your concern about having double > > replacement. > > > > 2. I can keep the code that loads back the value in its current place and > > pass either `V` or `*Reloaded` to `PrivCB`. This will make sure any > > instructions created in `PrivCB` use the `Reloaded` and don't need to be > > update via "replace all uses with" pattern. However, this exposes the > > pointer mechanism to the caller of `CreateParallel`. The `Value &` that > > `PrivCB` receives is not necessarily a value that exists in the user code, > > it can be the alloca we constructed in builder. So the implementation of > > `PrivCB` needs to be aware of it and can no longer rely on, e.g., keeping a > > list of values/instructions that need privatization or directly rely on > > types since the type would change. I decided that I did not want to change > > the contract that `PrivCB` has with `CreateParallel` because I was not > > aware of all its use cases (and have a preference for more "isolated" APIs) > > . However, if you think it is acceptable for the builder in order to reduce > > the complexity/overhead of the code, I can adapt. > > > > There is a flavor of (2) that changes `PrivCB` to take both `V` and > > `Replacement` so that the implementation of `PrivCB` can easily detect when > > the pointer mechanism is active. > Appreciate the detailed explanations! > > > There is a flavor of (2) that changes PrivCB to take both V and Replacement > > so that the implementation of PrivCB can easily detect when the pointer > > mechanism is active. > > This looks like a sweet-spot. We can avoid adding more replacement logic but > the `PrivCB` is aware of what is going on. If you are OK with this solution > as well I'd prefer it. > Great, will do this. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D92189/new/ https://reviews.llvm.org/D92189 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits