mboehme marked 2 inline comments as done.
mboehme added inline comments.

================
Comment at: 
clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp:545
+          &cast<AggregateStorageLocation>(State.Env.createStorageLocation(*E));
+      State.Env.setStorageLocationStrict(*E, *Loc);
+    }
----------------
ymandel wrote:
> Should this line instead be outside of this `if`? So that the flow is
> ```
> Loc = get
> if (!Loc) Loc = create
> set(Loc)
> ```
I don't understand -- wouldn't this just be doing unnecessary work?

If

```
Loc = cast_or_null<AggregateStorageLocation>(
        State.Env.getStorageLocationStrict(*E));
```

returns a non-null `Loc`, we don't create a new `Loc`, hence

```
State.Env.setStorageLocationStrict(*E, *Loc);
```

is a no-op, as `E` is already associated with `Loc`.


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:473-474
       if (S->isElidable()) {
-        Env.setStorageLocation(*S, *ArgLoc);
-      } else if (auto *ArgVal = cast_or_null<StructValue>(Env.getValue(*Arg))) 
{
+        if (Value *Val = Env.getValue(*ArgLoc))
+          Env.setValueStrict(*S, *Val);
+      } else {
----------------
ymandel wrote:
> What happens otherwise? I gather that `S` just isn't associated with anything?
Correct. The idea being that if `S` is elidable, i.e. just a pass-through, we 
want to pass through any `StructValue` that we got, and so if we didn't get a 
`StructValue`, then we shouldn't pass one through.

I guess we could also just create a `StructValue` from scratch and associate it 
with `ArgLoc`, but I'm not sure that it makes much of a difference in practice.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156672

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

Reply via email to