sgatev marked 4 inline comments as done. sgatev added inline comments.
================ Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:32 +template <typename K, typename V> +bool denseMapsAreEqual(const llvm::DenseMap<K, V> &Map1, + const llvm::DenseMap<K, V> &Map2) { ---------------- xazax.hun wrote: > sgatev wrote: > > xazax.hun wrote: > > > Shouldn't we add `operator==` instead? > > I'd be happy to do that. Do we need reviews from other folks for it? Would > > it make sense to move the code to the other location in a follow-up PR, to > > limit the scope of the change? > Actually, I think DenseMaps should already have `operator==` so we should be > able to remove this code. Thanks, I must have missed that. Removed the local implementation. ================ Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:88 + for (const FieldDecl *Field : Type->getAsRecordDecl()->fields()) { + FieldLocs.insert({Field, &createStorageLocation(Field->getType())}); + } ---------------- xazax.hun wrote: > sgatev wrote: > > xazax.hun wrote: > > > Could this end up creating an overly large state? There might be objects > > > with quite a lot fields but each function would only access a small > > > subset of those. Alternatively, we could attempt to create the > > > representations for fields on demand (this is the approach what the clang > > > static analyzer is using). > > That's a great point, however I don't think initialization on demand plays > > well with the dataflow algorithm. For example: > > > > ``` > > struct S { > > int Val; > > }; > > > > void target(bool b) { > > // basic block 1: > > S Foo; > > int Bar; > > if (b) { > > // basic block 2: > > Bar = Foo.Val; > > } else { > > // basic block 3: > > Bar = Foo.Val; > > } > > // basic block 4: > > ... > > } > > ``` > > In basic block 4 we should be able to infer that the value that is assigned > > to the storage location for `Bar` is unambiguous. However, since > > `Foo.Value` isn't created in basic block 1, this means that it's not > > inherited by basic block 2 and basic block 3. Each of these blocks will end > > up creating distinct values to assign to the storage location for > > `Foo.Value` and so in basic block 4 the value for `Bar` will end up being > > ambiguous. > > > > Alternatively, we can do a pass over all statements in all basic blocks > > before running the analysis to identify which fields are used in the > > function. We can use this information here to initialize only parts that > > are being used. > > > > What do you think? > I am not convinced about this example. I think it should not matter where and > when we create the location for Foo.Val, it always should be equivalent to > the others, i.e., they should have the same identity regardless their > creation. Basically, I think the identity of such a location should be > determined by the base object (Foo in this case), and the access path to the > subobject. > > This would be a non-trivial change, so I'm ok with deferring this discussion > to some follow-up PRs. But I'd love to see some alternatives explored because > eagerly evaluating all fields used to bite me in the past in other static > analysis tools performance-wise. Right. I agree with the comment about storage locations. The issue I see has to do with values that are assigned to the respective storage locations. In general, different values can be assigned to the same storage location in different basic blocks. I don't see a straightforward way to incorporate on-demand initialization while preserving the behavior with respect to values. Perhaps we can achieve this by storing references to parent environments in `Environment` instead of merging their `LocToVal` maps when creating environments for successor basic blocks, but this patch is already pretty big so I'd rather defer that. I do agree that this is an important problem we should solve so I added a FIXME to remind us. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D116368/new/ https://reviews.llvm.org/D116368 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits