[PATCH] D26438: [Verifier] Add verification for TBAA metadata

Sanjoy Das via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 9 15:53:54 PST 2016


sanjoy added inline comments.


================
Comment at: lib/IR/Verifier.cpp:3706
+  (void)InsertResult;
+  assert(InsertResult.second && "We just checked!");
+  return Result;
----------------
manmanren wrote:
> Is this necessary given that we just checked BaseNode is not in TBAABaseNodes?
No, it is redundant, which is why it is an `assert` and not an `Assert`. :)


================
Comment at: lib/IR/Verifier.cpp:3802
+static bool IsSingularStructTBAANode(const MDNode *MD,
+                                     SmallPtrSetImpl<const MDNode *> &Visited) {
+  if (MD->getNumOperands() != 3)
----------------
manmanren wrote:
> sanjoy wrote:
> > manmanren wrote:
> > > This seems somewhat heavy-weighted. I guess you are trying to differentiate a scalar type node from a struct type node with a single field, given that both can have 3 operands with the 2nd operand being a type and the 3rd being an offset. I don't think you can really differentiate the two cases. I feel like checking the offset being zero for the access type node of a tag should be enough.
> > > 
> > > I will not call them *singular" struct type node, since they are scalar type node.
> > > 
> > > createTBAAScalarTypeNode will generate such a scalar type node with 3 operands, createTBAANode (which is not used in clang any more) can generate a scalar type node with 2 operands.
> > Hi Manman,
> > 
> > I'd like to keep the recursive nature of this check and not just check
> > the offset only on the MDNode for the access tag.
> > 
> > IOW, I'd like to avoid invalid cases where the access tag has a full
> > blown struct type descriptor at offset 0, since in such (invalid)
> > cases `getMostGenericTBAA` will produce bad merged metadata that would
> > be hard to debug:
> > 
> > ```
> > ;; Invalid metadata that I want the verifier to reject
> > 
> > !root = !{!"C++ TBAA"}
> > !int = !{!"int", !root}
> > !float = !{!"float", !root}
> > !s_a = !{"s_a", !int, 5, !float, 20}
> > !s_b = !{"s_b", !int, 6, !float, 20}
> > 
> > !scalar_a = !{!"scalar-a", !s_a, 0}
> > !scalar_b = !{!"scalar-b", !s_b, 0}
> > 
> > !tag_a = !{!some_struct, !scalar_a, 20}
> > !tag_b = !{!some_struct, !scalar_b, 20}
> > 
> > !tag_c = !{!float, !float, 0}
> > 
> > !generic_tag = !{!int, !int, 0}
> > ```
> > 
> > Both `!tag_a` and `!tag_b` should may-alias with `!tag_c`, but
> > `getMostGenericTBAA` will merge `!tag_a` and `!tag_b` into
> > `!generic_tag` which does not alias with `!tag_c`.
> > 
> > However, I'm happy to call replace "singular" with "scalar".
> > 
> Sounds good. More checking means fewer bugs.
> Please rename singular to scalar and add a testing case for the above example if it is not in the patch.
Renamed and added a test case.


https://reviews.llvm.org/D26438





More information about the llvm-commits mailing list