[PATCH] D87974: [Builtin] Add __builtin_zero_non_value_bits.

JF Bastien via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 23 10:10:09 PDT 2020


jfb added inline comments.


================
Comment at: clang/lib/CodeGen/CGBuiltin.cpp:1647
+                                        QualType Ty) {
+  auto *I8Ptr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy);
+  auto *Zero = ConstantInt::get(CGF.Int8Ty, 0);
----------------
I'd like to hear @rsmith's thoughts on this approach, in particular w.r.t. aliasing concerns. I also wonder if below the GEPs should be inbounds, depending on how they're created.


================
Comment at: clang/lib/CodeGen/CGBuiltin.cpp:1652
+    auto Element = CGF.Builder.CreateGEP(I8Ptr, Index);
+    CGF.Builder.CreateAlignedStore(Zero, Element, MaybeAlign());
+  };
----------------
You should use `alignmentAtOffset` here.


================
Comment at: clang/test/CodeGenCXX/builtin-zero-non-value-bits-codegen.cpp:16
+  Bar f;
+};
+
----------------
It would be helpful to have a comment with the final layout of the struct, including padding. Give each padding field a name, and reference them in the IR check below.


================
Comment at: clang/test/CodeGenCXX/builtin-zero-non-value-bits-codegen.cpp:26
+// CHECK: [[FOO_RAW_PTR:%.*]] = bitcast %struct.Foo* [[FOO_BASE]] to i8*
+// CHECK: [[PAD_1:%.*]] = getelementptr i8, i8* [[FOO_RAW_PTR]], i32 1
+// CHECK: store i8 0, i8* [[PAD_1]]
----------------
It would help read the tests if you had a comment on top of each store, for example here "padding byte X".


================
Comment at: clang/test/CodeGenCXX/builtin-zero-non-value-bits-codegen.cpp:46
+void test(Baz *baz) {
+  __builtin_zero_non_value_bits(baz);
+}
----------------
It would be useful to see a test for arrays with a type that contains tail padding.


================
Comment at: clang/test/CodeGenCXX/builtin-zero-non-value-bits.cpp:160
+
+int main() {
+  testAllForType<32, 16, char>(11, 22, 33, 44);
----------------
zoecarver wrote:
> jfb wrote:
> > Usually CodeGen tests will use lit to check the emitted IR matches expectations. I think that's what you want to do here.
> > 
> > Remember to test `volatile` qualified pointers, as well as address spaces too.
> What's a good place for me to put this end-to-end test?
I'm not sure, I don't usually add this type of test :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87974



More information about the cfe-commits mailing list