summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/no-unique-address.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-06-22 21:30:43 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-06-22 21:30:43 +0000
commit1fa07ebd929383f769994818c3f8c55919bf0a0e (patch)
tree1f68cf27e569af8a9ce77a0faaac3edfa641e60d /clang/test/CodeGenCXX/no-unique-address.cpp
parent780c374b2056afb5665377690183cdd50bf97f09 (diff)
downloadbcm5719-llvm-1fa07ebd929383f769994818c3f8c55919bf0a0e.tar.gz
bcm5719-llvm-1fa07ebd929383f769994818c3f8c55919bf0a0e.zip
Fix TBAA representation for zero-sized fields and unnamed bit-fields.
Unnamed bit-fields should not be represented in the TBAA metadata because they do not represent storage fields (they only affect layout). Zero-sized fields should not be represented in the TBAA metadata because by definition they have no associated storage (so we will never emit a load or store through them), and they might not appear in declaration order within the struct layout. Fixes a verifier failure when emitting a TBAA-enabled load through a class type containing a zero-sized field. llvm-svn: 364140
Diffstat (limited to 'clang/test/CodeGenCXX/no-unique-address.cpp')
-rw-r--r--clang/test/CodeGenCXX/no-unique-address.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/no-unique-address.cpp b/clang/test/CodeGenCXX/no-unique-address.cpp
index fce5f8b8197..c88fb4d2c30 100644
--- a/clang/test/CodeGenCXX/no-unique-address.cpp
+++ b/clang/test/CodeGenCXX/no-unique-address.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -std=c++2a %s -emit-llvm -o - -triple x86_64-linux-gnu | FileCheck %s
+// RUN: %clang_cc1 -std=c++2a %s -emit-llvm -o - -triple x86_64-linux-gnu -O2 -disable-llvm-passes | FileCheck %s --check-prefix=CHECK-OPT
struct A { ~A(); int n; char c[3]; };
struct B { [[no_unique_address]] A a; char k; };
@@ -77,3 +78,18 @@ Empty1 &accessE1(FieldOverlap &fo) { return fo.e1; }
// CHECK: %[[RET:.*]] = bitcast i8* %[[ADJUSTED]] to %[[E1]]*
// CHECK: ret %[[E1]]* %[[RET]]
Empty1 &accessE2(FieldOverlap &fo) { return fo.e2; }
+
+struct LaterDeclaredFieldHasLowerOffset {
+ int a;
+ int b;
+ [[no_unique_address]] Empty1 e;
+};
+// CHECK-OPT-LABEL: @_Z41loadWhereLaterDeclaredFieldHasLowerOffset
+int loadWhereLaterDeclaredFieldHasLowerOffset(LaterDeclaredFieldHasLowerOffset &a) {
+ // CHECK-OPT: getelementptr
+ // CHECK-OPT: load {{.*}}, !tbaa ![[TBAA_AB:[0-9]*]]
+ return a.b;
+}
+// Note, never emit TBAA for zero-size fields.
+// CHECK-OPT: ![[TBAA_AB]] = !{![[TBAA_A:[0-9]*]], ![[TBAA_INT:[0-9]*]], i64 4}
+// CHECK-OPT: ![[TBAA_A]] = !{!"_ZTS32LaterDeclaredFieldHasLowerOffset", ![[TBAA_INT]], i64 0, ![[TBAA_INT]], i64 4}
OpenPOWER on IntegriCloud