ymandel added a comment.

In D153493#4450358 <https://reviews.llvm.org/D153493#4450358>, @sammccall wrote:

>> I realize the complexity is frustrating, but I don't see how that's related 
>> to the issue here. The complexity of the `JoinedStateBuilder` is caused by 
>> the desire to minimize copies. The multiple cases come directly from the 
>> algorithm itself, most particularly that we may or may not be in an initial 
>> state, and the previous block may or may not have an environment we care 
>> about. At least, that is the specific issue I'm concerned with.
>
> We have 9 state transitions (3 states x 3 operations). Each would be less 
> than half as complicated if it didn't have to deal with Lattice's join being 
> mutating and Environment's being non-mutating.
>
> I believe further simplifications are possible (essentially: back at the 
> callsite track `vector<const Env*> All` plus `deque<Environment> Owned` for 
> owned copies, special case `All.size() == 0` and `All.size() == 1` and 
> otherwise `joinVec(All)`.
> However with Lattice's mutating join involved this no longer works, and after 
> addressing that it's no longer simpler.

I'm pretty sure I agree on all of this, please document it somewhere (file an 
Issue in the github tracker?). FWIW, I think mutating join was a case of 
premature optimization gone bad, and ultimately the builtin lattice should not 
be built in at all -- it should exist outside the core and be just another 
client.

>> "join with InitEnv" should reduce to the identity function, so if its not, 
>> that feels like a problem we're sweeping under the rug.
>
> Only in a mathematical sense - in reality humans need to read these SAT 
> systems, and we're using a solver that can't perform that reduction.

I think we're talking past each other (and actually agreeing), sorry. To be 
clear, I don't mean that as a criticism of this change -- I think you've hit an 
important point and fixing it might make this simpler. I totally agree about 
SAT systems, and the solver, etc. But, I'm saying that it shouldn't come to 
that. I think the Environment join operation is broken if  `join(InitEnv, E) != 
E`. I'm asking whether we can reduce (some) complexity by fixing that.  From 
your earlier point, there are more problems, but I want to focus on this 
particular one in case solving it makes other things easier.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D153493

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

Reply via email to