blob: 0a481818e6113c12237a6eb9311855d4a76a4833 [file] [log] [blame]
Ben Langmuir3b4c30b2013-05-09 19:17:11 +00001// RUN: %clang_cc1 -fblocks -emit-llvm %s -o %t
2// RUN: FileCheck %s -input-file=%t -check-prefix=CHECK1
3// RUN: FileCheck %s -input-file=%t -check-prefix=CHECK2
Alexey Bataev6de13e82014-06-30 05:07:42 +00004// REQUIRES:disabled
Ben Langmuir3b4c30b2013-05-09 19:17:11 +00005
6struct A {
7 int a;
8 float b;
9 char c;
10};
11
Alexey Bataevaca7fcf2014-06-30 02:55:54 +000012void test_nest_captured_stmt(int param, int size, int param_arr[size]) {
Ben Langmuir3b4c30b2013-05-09 19:17:11 +000013 int w;
Alexey Bataevaca7fcf2014-06-30 02:55:54 +000014 int arr[param][size];
15 // CHECK1: %struct.anon{{.*}} = type { i32*, i32*, i32*, i32**, i32* }
16 // CHECK1: %struct.anon{{.*}} = type { i32*, i32*, i32**, i32*, i32*, i32**, i32* }
17 // CHECK1: [[T:%struct.anon.*]] = type { i32*, i32*, %struct.A*, i32**, i32*, i32*, i32**, i32* }
Ben Langmuir3b4c30b2013-05-09 19:17:11 +000018 #pragma clang __debug captured
19 {
20 int x;
21 int *y = &w;
22 #pragma clang __debug captured
23 {
24 struct A z;
25 #pragma clang __debug captured
26 {
27 w = x = z.a = 1;
28 *y = param;
29 z.b = 0.1f;
30 z.c = 'c';
Alexey Bataevaca7fcf2014-06-30 02:55:54 +000031 param_arr[size - 1] = 2;
32 arr[10][z.a] = 12;
Ben Langmuir3b4c30b2013-05-09 19:17:11 +000033
34 // CHECK1: define internal void @__captured_stmt{{.*}}([[T]]
35 //
36 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 2
37 // CHECK1-NEXT: load %struct.A**
38 // CHECK1-NEXT: getelementptr inbounds %struct.A*
39 // CHECK1-NEXT: store i32 1
40 //
41 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 1
42 // CHECK1-NEXT: load i32**
43 // CHECK1-NEXT: store i32 1
44 //
45 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 0
46 // CHECK1-NEXT: load i32**
47 // CHECK1-NEXT: store i32 1
48 //
49 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 4
50 // CHECK1-NEXT: load i32**
51 // CHECK1-NEXT: load i32*
52 // CHECK1-NEXT: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 3
53 // CHECK1-NEXT: load i32***
54 // CHECK1-NEXT: load i32**
55 // CHECK1-NEXT: store i32
56 //
57 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 2
58 // CHECK1-NEXT: load %struct.A**
59 // CHECK1-NEXT: getelementptr inbounds %struct.A*
60 // CHECK1-NEXT: store float
61 //
62 // CHECK1: getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 2
63 // CHECK1-NEXT: load %struct.A**
64 // CHECK1-NEXT: getelementptr inbounds %struct.A*
65 // CHECK1-NEXT: store i8 99
Alexey Bataevaca7fcf2014-06-30 02:55:54 +000066 //
67 // CHECK1: [[SIZE_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 5
Alexey Bataev83222d62014-06-30 05:02:50 +000068 // CHECK1-DAG: [[SIZE_ADDR:%.*]] = load i32** [[SIZE_ADDR_REF]]
69 // CHECK1-DAG: [[SIZE:%.*]] = load i32* [[SIZE_ADDR]]
70 // CHECK1-DAG: [[SIZE_MINUS_1:%.*]] = sub nsw i32 [[SIZE]], 1
71 // CHECK1-DAG: [[PARAM_ARR_IDX:%.*]] = {{.*}} [[SIZE_MINUS_1]]
72 // CHECK1-DAG: [[PARAM_ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 6
73 // CHECK1-DAG: [[PARAM_ARR_ADDR:%.*]] = load i32*** [[PARAM_ARR_ADDR_REF]]
74 // CHECK1-DAG: [[PARAM_ARR:%.*]] = load i32** [[PARAM_ARR_ADDR]]
75 // CHECK1-DAG: [[PARAM_ARR_SIZE_MINUS_1_ADDR:%.*]] = getelementptr inbounds i32* [[PARAM_ARR]], i{{.*}} [[PARAM_ARR_IDX]]
76 // CHECK1: store i32 2, i32* [[PARAM_ARR_SIZE_MINUS_1_ADDR]]
Alexey Bataevaca7fcf2014-06-30 02:55:54 +000077 //
78 // CHECK1: [[Z_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 2
Alexey Bataev83222d62014-06-30 05:02:50 +000079 // CHECK1-DAG: [[Z_ADDR:%.*]] = load %struct.A** [[Z_ADDR_REF]]
80 // CHECK1-DAG: [[Z_A_ADDR:%.*]] = getelementptr inbounds %struct.A* [[Z_ADDR]], i32 0, i32 0
81 // CHECK1-DAG: [[Z_A:%.*]] = load i32* [[Z_A_ADDR]]
82 // CHECK1-DAG: [[ARR_IDX_2:%.*]] = {{.*}} [[Z_A]]
83 // CHECK1-DAG: [[ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i32 0, i32 7
84 // CHECK1-DAG: [[ARR_ADDR:%.*]] = load i32** [[ARR_ADDR_REF]]
85 // CHECK1-DAG: [[ARR_IDX_1:%.*]] = mul {{.*}} 10
86 // CHECK1-DAG: [[ARR_10_ADDR:%.*]] = getelementptr inbounds i32* [[ARR_ADDR]], i{{.*}} [[ARR_IDX_1]]
87 // CHECK1-DAG: [[ARR_10_Z_A_ADDR:%.*]] = getelementptr inbounds i32* [[ARR_10_ADDR]], i{{.*}} [[ARR_IDX_2]]
88 // CHECK1: store i32 12, i32* [[ARR_10_Z_A_ADDR]]
Ben Langmuir3b4c30b2013-05-09 19:17:11 +000089 }
90 }
91 }
92}
93
94void test_nest_block() {
95 __block int x;
96 int y;
97 ^{
98 int z;
99 x = z;
100 #pragma clang __debug captured
101 {
102 z = y; // OK
103 }
104 }();
105
106 // CHECK2: define internal void @{{.*}}test_nest_block_block_invoke
107 //
108 // CHECK2: [[Z:%[0-9a-z_]*]] = alloca i32
109 // CHECK2: alloca %struct.anon{{.*}}
110 //
111 // CHECK2: store i32
112 // CHECK2: store i32* [[Z]]
113 //
114 // CHECK2: getelementptr inbounds %struct.anon
115 // CHECK2-NEXT: getelementptr inbounds
116 // CHECK2-NEXT: store i32*
117 //
118 // CHECK2: call void @__captured_stmt
119
120 int a;
121 #pragma clang __debug captured
122 {
123 __block int b;
124 int c;
125 __block int d;
126 ^{
127 b = a;
128 b = c;
129 b = d;
130 }();
131 }
132
133 // CHECK2: alloca %struct.__block_byref_b
134 // CHECK2-NEXT: [[C:%[0-9a-z_]*]] = alloca i32
135 // CHECK2-NEXT: alloca %struct.__block_byref_d
136 //
137 // CHECK2: bitcast %struct.__block_byref_b*
138 // CHECK2-NEXT: store i8*
139 //
140 // CHECK2: [[CapA:%[0-9a-z_.]*]] = getelementptr inbounds {{.*}}, i32 0, i32 7
141 //
142 // CHECK2: getelementptr inbounds %struct.anon{{.*}}, i32 0, i32 0
143 // CHECK2: load i32**
144 // CHECK2: load i32*
145 // CHECK2: store i32 {{.*}}, i32* [[CapA]]
146 //
147 // CHECK2: [[CapC:%[0-9a-z_.]*]] = getelementptr inbounds {{.*}}, i32 0, i32 8
148 // CHECK2-NEXT: [[Val:%[0-9a-z_]*]] = load i32* [[C]]
149 // CHECK2-NEXT: store i32 [[Val]], i32* [[CapC]]
150 //
151 // CHECK2: bitcast %struct.__block_byref_d*
152 // CHECK2-NEXT: store i8*
153}