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