Ivan A. Kosarev | b75a50b | 2017-09-26 14:22:48 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s |
| 2 | // |
| 3 | // Check that we generate correct TBAA information for reference accesses. |
| 4 | |
| 5 | struct S; |
| 6 | |
| 7 | struct B { |
| 8 | S &s; |
Ivan A. Kosarev | 9f9d157 | 2017-10-30 11:49:31 +0000 | [diff] [blame] | 9 | B(S &s); |
| 10 | S &get(); |
Ivan A. Kosarev | b75a50b | 2017-09-26 14:22:48 +0000 | [diff] [blame] | 11 | }; |
| 12 | |
Ivan A. Kosarev | 9f9d157 | 2017-10-30 11:49:31 +0000 | [diff] [blame] | 13 | B::B(S &s) : s(s) { |
| 14 | // CHECK-LABEL: _ZN1BC2ER1S |
| 15 | // Check initialization of the reference parameter. |
| 16 | // CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer:!.*]] |
| 17 | |
| 18 | // Check loading of the reference parameter. |
| 19 | // CHECK: load %struct.S*, %struct.S** {{.*}}, !tbaa [[TAG_pointer]] |
| 20 | |
| 21 | // Check initialization of the reference member. |
| 22 | // CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer]] |
Ivan A. Kosarev | b75a50b | 2017-09-26 14:22:48 +0000 | [diff] [blame] | 23 | } |
| 24 | |
Ivan A. Kosarev | 9f9d157 | 2017-10-30 11:49:31 +0000 | [diff] [blame] | 25 | S &B::get() { |
| 26 | // CHECK-LABEL: _ZN1B3getEv |
| 27 | // Check that we access the reference as a structure member. |
| 28 | // CHECK: load %struct.S*, %struct.S** {{.*}}, !tbaa [[TAG_B_s:!.*]] |
| 29 | return s; |
| 30 | } |
| 31 | |
Ivan A. Kosarev | b75a50b | 2017-09-26 14:22:48 +0000 | [diff] [blame] | 32 | // CHECK-DAG: [[TAG_pointer]] = !{[[TYPE_pointer:!.*]], [[TYPE_pointer]], i64 0} |
Ivan A. Kosarev | 9f9d157 | 2017-10-30 11:49:31 +0000 | [diff] [blame] | 33 | // CHECK-DAG: [[TAG_B_s]] = !{[[TYPE_B:!.*]], [[TYPE_pointer]], i64 0} |
| 34 | // |
| 35 | // CHECK-DAG: [[TYPE_B]] = !{!"_ZTS1B", [[TYPE_pointer]], i64 0} |
Ivan A. Kosarev | b75a50b | 2017-09-26 14:22:48 +0000 | [diff] [blame] | 36 | // CHECK-DAG: [[TYPE_pointer]] = !{!"any pointer", [[TYPE_char:!.*]], i64 0} |
| 37 | // CHECK-DAG: [[TYPE_char]] = !{!"omnipotent char", {{!.*}}, i64 0} |