1 // RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s
3 // CHECK: %struct.test = type { i32, %struct.nested2, i32 }
4 // CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }
5 // CHECK: %struct.nested1 = type { i32, i32 }
6 typedef struct nested1
{
26 // CHECK: %var = alloca %struct.test, align 4
29 // CHECK: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 1
30 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 0
31 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
34 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 1
35 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 2
36 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
39 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 1
40 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 1
41 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 0
42 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
45 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}var, i32 0, i32 1
46 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 1
47 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 1
48 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
51 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 0
52 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
55 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 2
56 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
60 void foo2(struct test
* var
)
62 // CHECK: alloca ptr, align
63 // CHECK-NEXT: store ptr %var, ptr %{{.*}}, align
64 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
65 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 1
66 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 0
67 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
70 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
71 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 1
72 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 2
73 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
76 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
77 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 1
78 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 1
79 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 0
80 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
83 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
84 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 1
85 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 1
86 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 1
87 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
90 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
91 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 0
92 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4
95 // CHECK-NEXT: load ptr, ptr %{{.*}}, align
96 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 2
97 // CHECK-NEXT: load i32, ptr %{{.*}}, align 4