1f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky// RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s
2f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
39cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK: %struct.test = type { i32, %struct.nested2, i32 }
49cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }
5f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky// CHECK: %struct.nested1 = type { i32, i32 }
6f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewyckytypedef struct nested1 {
7f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int a1;
8f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int b1;
9f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky} NESTED1;
10f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
11f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewyckystruct nested2 {
12f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int a;
13f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    NESTED1;
14f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int b;
15f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky};
16f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
17f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewyckystruct test {
18f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int    x;
19f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    struct nested2;
20f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky    int    y;
21f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky};
22f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
23f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
24f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewyckyvoid foo()
25f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky{
26f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  // CHECK: %var = alloca %struct.test, align 4
27f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  struct test var;
28f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 0
313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
32f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.a;
33f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 2
363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
37f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.b;
38f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 0
423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
43f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.a1;
44f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}var, i32 0, i32 1
463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 1
483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
49f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.b1;
50f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 0
523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
53f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.x;
54f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 2
563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
57f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var.y;
58f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky}
59f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
60f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewyckyvoid foo2(struct test* var)
61f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky{
62f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  // CHECK: alloca %struct.test*, align
63f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  // CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align
643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 0
673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
68f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->a;
69f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 2
733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
74f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->b;
75f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 0
803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
81f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->a1;
82f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 1
873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
88f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->b1;
89f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 0
923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
93f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->x;
94f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky
953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load %struct.test*, %struct.test** %{{.*}}, align
963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 2
973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
98f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky  var->y;
99f0438e728f6e6954990ca9eed4ed1aae9d6aa098Nick Lewycky}
100