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