[PATCH] D26438: [Verifier] Add verification for TBAA metadata
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 9 14:32:14 PST 2016
sanjoy added a comment.
Hi Manman,
In https://reviews.llvm.org/D26438#590834, @sanjoy wrote:
> > I may have misunderstood your point, but for struct-path TBAA, the last integer for a type node is the offset. Only for old scalar TBAA, the last optional integer specifies whether it is immutable. There is no ambiguity in struct-path TBAA.
>
> Thanks, that clears it up for me.
There is this bit of language in the TBAA implementation:
// The second field is the access type node, it
// must be a scalar type node.
but in the TBAA metadata generated by clang it seems like we have access types like `!{!"int", !N, i64 0}` which look like struct nodes. I can think of three ways to resolve this:
1. State that access types are not necessarily scalar type nodes. However, this is not consistent with how `getMostGenericTBAA` walks up the parent types of the access type node.
2. State that `!{!"int", !N, i64 0}` is a scalar type node.
3. State that access types can be either scalar type nodes or a struct type node with one member at offset 0.
I'm not sure what the cleanest option is though I'm slightly leaning towards the second one.
A second related point to what you said before about the immutable bit is that today we'll upgrade
define i32 @f(i32* %p) {
%val = load i32, i32* %p, !tbaa !0
ret i32 %val
}
!0 = !{!"const int", !1, i64 1}
!1 = !{!"const char", !2, i64 1}
!2 = !{!"char", !3}
!3 = !{!"root"}
to
define i32 @f(i32* %p) {
%val = load i32, i32* %p, !tbaa !0
ret i32 %val
}
!0 = !{!1, !1, i64 0, i64 1}
!1 = !{!"const int", !2}
!2 = !{!"const char", !3, i64 1}
!3 = !{!"char", !4}
!4 = !{!"root"}
This is a problem since in the old scalar tbaa metadata `!{!"char", !2, i64 1}` meant "immutable `const char`" but after the upgrade it means `struct const_char` with a `char` at offset 1. IOW, given what you said, I don't think the auto-upgrade path is correct.
https://reviews.llvm.org/D26438
More information about the llvm-commits
mailing list