1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// RUN: %clang_cc1 -Werror -triple i386-unknown-unknown -emit-llvm -O1 -no-struct-path-tbaa -disable-llvm-optzns -o - %s | FileCheck %s
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// RUN: %clang_cc1 -Werror -triple i386-unknown-unknown -emit-llvm -O1 -disable-llvm-optzns -o - %s | FileCheck %s -check-prefix=PATH
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Types with the may_alias attribute should be considered equivalent
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// to char for aliasing.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef int __attribute__((may_alias)) aliasing_int;
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid test0(aliasing_int *ai, int *i)
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: store i32 0, i32* %{{.*}}, !tbaa [[TAG_CHAR:!.*]]
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: store i32 0, i32* %{{.*}}, !tbaa [[TAG_CHAR:!.*]]
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *ai = 0;
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: store i32 1, i32* %{{.*}}, !tbaa [[TAG_INT:!.*]]
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: store i32 1, i32* %{{.*}}, !tbaa [[TAG_INT:!.*]]
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *i = 1;
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PR9307
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct Test1 { int x; };
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct Test1MA { int x; } __attribute__((may_alias));
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid test1(struct Test1MA *p1, struct Test1 *p2) {
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // CHECK: store i32 2, i32* {{%.*}}, !tbaa [[TAG_CHAR]]
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // PATH: store i32 2, i32* {{%.*}}, !tbaa [[TAG_CHAR]]
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  p1->x = 2;
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // CHECK: store i32 3, i32* {{%.*}}, !tbaa [[TAG_INT]]
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // PATH: store i32 3, i32* {{%.*}}, !tbaa [[TAG_test1_x:!.*]]
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  p2->x = 3;
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: metadata !{metadata !"any pointer", metadata [[TYPE_CHAR:!.*]],
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: [[TYPE_CHAR]] = metadata !{metadata !"omnipotent char", metadata [[TAG_CXX_TBAA:!.*]],
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: [[TAG_CXX_TBAA]] = metadata !{metadata !"Simple C/C++ TBAA"}
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: [[TAG_CHAR]] = metadata !{metadata [[TYPE_CHAR]], metadata [[TYPE_CHAR]], i64 0}
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: [[TAG_INT]] = metadata !{metadata [[TYPE_INT:!.*]], metadata [[TYPE_INT]], i64 0}
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// CHECK: [[TYPE_INT]] = metadata !{metadata !"int", metadata [[TYPE_CHAR]]
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TYPE_CHAR:!.*]] = metadata !{metadata !"omnipotent char", metadata !{{.*}}
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TAG_CHAR]] = metadata !{metadata [[TYPE_CHAR]], metadata [[TYPE_CHAR]], i64 0}
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TAG_INT]] = metadata !{metadata [[TYPE_INT:!.*]], metadata [[TYPE_INT]], i64 0}
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TYPE_INT]] = metadata !{metadata !"int", metadata [[TYPE_CHAR]]
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TAG_test1_x]] = metadata !{metadata [[TYPE_test1:!.*]], metadata [[TYPE_INT]], i64 0}
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PATH: [[TYPE_test1]] = metadata !{metadata !"Test1", metadata [[TYPE_INT]], i64 0}
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org