[PATCH] D135376: [Transforms/ObjCARC] Fix non-deterministic output of `ObjCARCOptPass`

Akira Hatanaka via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 12 10:07:19 PDT 2022


ahatanak added inline comments.


================
Comment at: llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp:81
 
-  // Check each unique source of the PHI node against B.
-  SmallPtrSet<const Value *, 4> UniqueSrc;
-  for (Value *PV1 : A->incoming_values()) {
-    if (UniqueSrc.insert(PV1).second && related(PV1, B))
+    if (comparePHISources(PNB, A))
       return true;
----------------
akyrtzi wrote:
> ahatanak wrote:
> > This function returns true if either `comparePHISources(PNB, A)` or `comparePHISources(A, B)` returns true. Should it return false if either `comparePHISources(PNB, A)` or `comparePHISources(A, B)` returns false instead? I think `related` returns true when the two pointers are related but also when it doesn't know the answer (i.e., it's being conservative). On the other hand, it returns false only when it's certain that the two pointers aren't related.
> To make sure I understand, the semantics we want here is that two `PHINode`s are only considered related if they //both// have a source value that is related to the other, and if only one `PHINode` has a source value related to the other, but not the other `PHINode`, then they should not be considered related. Is this correct?
Yes, that was what I was thinking.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D135376



More information about the llvm-commits mailing list