forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[TBAA] Test for tbaa.struct metadata with bitfields in big endian lay…
…out (llvm#87617) This test exposes what I think is invalid tbaa.struct metadata currently generated for bitfields when using big endian layout. The regions given by `!{i64 2, i64 4, [[META3:![0-9]+]], i64 4, i64 4 ...` are overlapping. This issue was originally observed in llvm#86709.
- Loading branch information
1 parent
be8fd86
commit dcab42a
Showing
1 changed file
with
39 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// RUN: %clang_cc1 -triple aarch64_be-apple-darwin -emit-llvm -o - -O1 %s | \ | ||
// RUN: FileCheck -check-prefixes=CHECK,CHECK-BE %s | ||
// RUN: %clang_cc1 -triple aarch64-apple-darwin -emit-llvm -o - -O1 %s | \ | ||
// RUN: FileCheck -check-prefixes=CHECK,CHECK-LE %s | ||
// | ||
// Check that TBAA metadata for structs containing bitfields is | ||
// consistent between big and little endian layouts. | ||
// | ||
// FIXME: The metadata below is invalid for the big endian layout: the | ||
// start offset of 2 is incorrect. | ||
|
||
struct NamedBitfields { | ||
int f1 : 8; | ||
int f2 : 8; | ||
unsigned f3 : 1; | ||
unsigned f4 : 15; | ||
int f5; | ||
double f6; | ||
}; | ||
|
||
// CHECK-LABEL: _Z4copyP14NamedBitfieldsS0_ | ||
// CHECK-SAME: ptr nocapture noundef writeonly [[A1:%.*]], ptr nocapture noundef readonly [[A2:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { | ||
// CHECK-NEXT: entry: | ||
// CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) [[A1]], ptr noundef nonnull align 8 dereferenceable(16) [[A2]], i64 16, i1 false), !tbaa.struct [[TBAA_STRUCT2:![0-9]+]] | ||
// CHECK-NEXT: ret void | ||
// | ||
void copy(NamedBitfields *a1, NamedBitfields *a2) { | ||
*a1 = *a2; | ||
} | ||
|
||
// CHECK-BE: [[TBAA_STRUCT2]] = !{i64 2, i64 4, [[META3:![0-9]+]], i64 4, i64 4, [[META6:![0-9]+]], i64 8, i64 8, [[META8:![0-9]+]]} | ||
// CHECK-LE: [[TBAA_STRUCT2]] = !{i64 0, i64 4, [[META3:![0-9]+]], i64 4, i64 4, [[META6:![0-9]+]], i64 8, i64 8, [[META8:![0-9]+]]} | ||
// CHECK: [[META3]] = !{[[META4:![0-9]+]], [[META4]], i64 0} | ||
// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} | ||
// CHECK: [[META5]] = !{!"Simple C++ TBAA"} | ||
// CHECK: [[META6]] = !{[[META7:![0-9]+]], [[META7]], i64 0} | ||
// CHECK: [[META7]] = !{!"int", [[META4]], i64 0} | ||
// CHECK: [[META8]] = !{[[META9:![0-9]+]], [[META9]], i64 0} | ||
// CHECK: [[META9]] = !{!"double", [[META4]], i64 0} |