blob: c76724444bf2676b59bf796360c9948c70039913 [file] [log] [blame]
Manman Ren975d83c2013-04-27 00:39:37 +00001// RUN: %clang_cc1 -Werror -triple i386-unknown-unknown -emit-llvm -O1 -disable-llvm-optzns -o - %s | FileCheck %s
2// RUN: %clang_cc1 -Werror -triple i386-unknown-unknown -emit-llvm -O1 -struct-path-tbaa -disable-llvm-optzns -o - %s | FileCheck %s -check-prefix=PATH
Dan Gohman2ea7e732010-12-13 23:51:08 +00003
4// Types with the may_alias attribute should be considered equivalent
5// to char for aliasing.
6
7typedef int __attribute__((may_alias)) aliasing_int;
8
9void test0(aliasing_int *ai, int *i)
10{
John McCallbc7fbf02011-02-26 08:07:02 +000011// CHECK: store i32 0, i32* %{{.*}}, !tbaa !1
Manman Ren975d83c2013-04-27 00:39:37 +000012// PATH: store i32 0, i32* %{{.*}}, !tbaa [[TAG_CHAR:!.*]]
Dan Gohman2ea7e732010-12-13 23:51:08 +000013 *ai = 0;
John McCallbc7fbf02011-02-26 08:07:02 +000014// CHECK: store i32 1, i32* %{{.*}}, !tbaa !3
Manman Ren975d83c2013-04-27 00:39:37 +000015// PATH: store i32 1, i32* %{{.*}}, !tbaa [[TAG_INT:!.*]]
Dan Gohman2ea7e732010-12-13 23:51:08 +000016 *i = 1;
17}
18
John McCallbc7fbf02011-02-26 08:07:02 +000019// PR9307
20struct Test1 { int x; };
21struct Test1MA { int x; } __attribute__((may_alias));
22void test1(struct Test1MA *p1, struct Test1 *p2) {
23 // CHECK: store i32 2, i32* {{%.*}}, !tbaa !1
Manman Ren975d83c2013-04-27 00:39:37 +000024 // PATH: store i32 2, i32* {{%.*}}, !tbaa [[TAG_CHAR]]
John McCallbc7fbf02011-02-26 08:07:02 +000025 p1->x = 2;
26 // CHECK: store i32 3, i32* {{%.*}}, !tbaa !3
Manman Ren975d83c2013-04-27 00:39:37 +000027 // PATH: store i32 3, i32* {{%.*}}, !tbaa [[TAG_test1_x:!.*]]
John McCallbc7fbf02011-02-26 08:07:02 +000028 p2->x = 3;
29}
Dan Gohman2ea7e732010-12-13 23:51:08 +000030
31// CHECK: !0 = metadata !{metadata !"any pointer", metadata !1}
32// CHECK: !1 = metadata !{metadata !"omnipotent char", metadata !2}
Duncan Sands2d7cb062012-04-15 18:04:54 +000033// CHECK: !2 = metadata !{metadata !"Simple C/C++ TBAA"}
Dan Gohman2ea7e732010-12-13 23:51:08 +000034// CHECK: !3 = metadata !{metadata !"int", metadata !1}
Manman Ren975d83c2013-04-27 00:39:37 +000035
36// PATH: [[TYPE_CHAR:!.*]] = metadata !{metadata !"omnipotent char", metadata !{{.*}}
37// PATH: [[TAG_CHAR]] = metadata !{metadata [[TYPE_CHAR]], metadata [[TYPE_CHAR]], i64 0}
38// PATH: [[TAG_INT]] = metadata !{metadata [[TYPE_INT:!.*]], metadata [[TYPE_INT]], i64 0}
39// PATH: [[TYPE_INT]] = metadata !{metadata !"int", metadata [[TYPE_CHAR]]
40// PATH: [[TAG_test1_x]] = metadata !{metadata [[TYPE_test1:!.*]], metadata [[TYPE_INT]], i64 0}
41// PATH: [[TYPE_test1]] = metadata !{metadata !"_ZTS5Test1", metadata [[TYPE_INT]], i64 0}