[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / 2009-02-20-InstCombine-SROA.ll
blobb532c81556738974f007b042dcd8585d819a22fc
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck --check-prefix=IC %s
3 ; RUN: opt < %s -passes='instcombine,sroa' -S | FileCheck --check-prefix=IC_SROA %s
5 ; rdar://6417724
6 ; Instcombine shouldn't do anything to this function that prevents promoting the allocas inside it.
8 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
9 target triple = "i386-apple-darwin9.6"
11 %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >" = type { ptr }
12 %"struct.std::_Vector_base<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" }
13 %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" = type { ptr, ptr, ptr }
14 %"struct.std::bidirectional_iterator_tag" = type <{ i8 }>
15 %"struct.std::forward_iterator_tag" = type <{ i8 }>
16 %"struct.std::input_iterator_tag" = type <{ i8 }>
17 %"struct.std::random_access_iterator_tag" = type <{ i8 }>
18 %"struct.std::vector<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >" }
20 define ptr @_Z3fooRSt6vectorIiSaIiEE(ptr %X) {
21 ; IC-LABEL: @_Z3fooRSt6vectorIiSaIiEE(
22 ; IC-NEXT:  entry:
23 ; IC-NEXT:    [[__FIRST_ADDR_I_I:%.*]] = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", align 8
24 ; IC-NEXT:    [[__LAST_ADDR_I_I:%.*]] = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", align 8
25 ; IC-NEXT:    [[TMP0:%.*]] = alloca i32, align 4
26 ; IC-NEXT:    store i32 42, ptr [[TMP0]], align 4
27 ; IC-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[X:%.*]], i32 4
28 ; IC-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 4
29 ; IC-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[X]], align 4
30 ; IC-NEXT:    store ptr [[TMP3]], ptr [[__FIRST_ADDR_I_I]], align 4
31 ; IC-NEXT:    store ptr [[TMP2]], ptr [[__LAST_ADDR_I_I]], align 4
32 ; IC-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[TMP2]] to i32
33 ; IC-NEXT:    [[TMP5:%.*]] = ptrtoint ptr [[TMP3]] to i32
34 ; IC-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP4]], [[TMP5]]
35 ; IC-NEXT:    [[TMP7:%.*]] = ashr i32 [[TMP6]], 4
36 ; IC-NEXT:    br label [[BB12_I_I:%.*]]
37 ; IC:       bb.i.i:
38 ; IC-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
39 ; IC-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4
40 ; IC-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP0]], align 4
41 ; IC-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP9]], [[TMP10]]
42 ; IC-NEXT:    br i1 [[TMP11]], label [[BB1_I_I:%.*]], label [[BB2_I_I:%.*]]
43 ; IC:       bb1.i.i:
44 ; IC-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
45 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT:%.*]]
46 ; IC:       bb2.i.i:
47 ; IC-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
48 ; IC-NEXT:    [[TMP14:%.*]] = getelementptr i8, ptr [[TMP13]], i32 4
49 ; IC-NEXT:    store ptr [[TMP14]], ptr [[__FIRST_ADDR_I_I]], align 4
50 ; IC-NEXT:    [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 4
51 ; IC-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP0]], align 4
52 ; IC-NEXT:    [[TMP17:%.*]] = icmp eq i32 [[TMP15]], [[TMP16]]
53 ; IC-NEXT:    br i1 [[TMP17]], label [[BB4_I_I:%.*]], label [[BB5_I_I:%.*]]
54 ; IC:       bb4.i.i:
55 ; IC-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
56 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
57 ; IC:       bb5.i.i:
58 ; IC-NEXT:    [[TMP19:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
59 ; IC-NEXT:    [[TMP20:%.*]] = getelementptr i8, ptr [[TMP19]], i32 4
60 ; IC-NEXT:    store ptr [[TMP20]], ptr [[__FIRST_ADDR_I_I]], align 4
61 ; IC-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
62 ; IC-NEXT:    [[TMP22:%.*]] = load i32, ptr [[TMP0]], align 4
63 ; IC-NEXT:    [[TMP23:%.*]] = icmp eq i32 [[TMP21]], [[TMP22]]
64 ; IC-NEXT:    br i1 [[TMP23]], label [[BB7_I_I:%.*]], label [[BB8_I_I:%.*]]
65 ; IC:       bb7.i.i:
66 ; IC-NEXT:    [[TMP24:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
67 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
68 ; IC:       bb8.i.i:
69 ; IC-NEXT:    [[TMP25:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
70 ; IC-NEXT:    [[TMP26:%.*]] = getelementptr i8, ptr [[TMP25]], i32 4
71 ; IC-NEXT:    store ptr [[TMP26]], ptr [[__FIRST_ADDR_I_I]], align 4
72 ; IC-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4
73 ; IC-NEXT:    [[TMP28:%.*]] = load i32, ptr [[TMP0]], align 4
74 ; IC-NEXT:    [[TMP29:%.*]] = icmp eq i32 [[TMP27]], [[TMP28]]
75 ; IC-NEXT:    br i1 [[TMP29]], label [[BB10_I_I:%.*]], label [[BB11_I_I:%.*]]
76 ; IC:       bb10.i.i:
77 ; IC-NEXT:    [[TMP30:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
78 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
79 ; IC:       bb11.i.i:
80 ; IC-NEXT:    [[TMP31:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
81 ; IC-NEXT:    [[TMP32:%.*]] = getelementptr i8, ptr [[TMP31]], i32 4
82 ; IC-NEXT:    store ptr [[TMP32]], ptr [[__FIRST_ADDR_I_I]], align 4
83 ; IC-NEXT:    [[TMP33:%.*]] = add nsw i32 [[__TRIP_COUNT_0_I_I:%.*]], -1
84 ; IC-NEXT:    br label [[BB12_I_I]]
85 ; IC:       bb12.i.i:
86 ; IC-NEXT:    [[__TRIP_COUNT_0_I_I]] = phi i32 [ [[TMP7]], [[ENTRY:%.*]] ], [ [[TMP33]], [[BB11_I_I]] ]
87 ; IC-NEXT:    [[TMP34:%.*]] = icmp sgt i32 [[__TRIP_COUNT_0_I_I]], 0
88 ; IC-NEXT:    br i1 [[TMP34]], label [[BB_I_I:%.*]], label [[BB13_I_I:%.*]]
89 ; IC:       bb13.i.i:
90 ; IC-NEXT:    [[TMP35:%.*]] = load ptr, ptr [[__LAST_ADDR_I_I]], align 4
91 ; IC-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[TMP35]] to i32
92 ; IC-NEXT:    [[TMP37:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
93 ; IC-NEXT:    [[TMP38:%.*]] = ptrtoint ptr [[TMP37]] to i32
94 ; IC-NEXT:    [[TMP39:%.*]] = sub i32 [[TMP36]], [[TMP38]]
95 ; IC-NEXT:    [[TMP40:%.*]] = ashr i32 [[TMP39]], 2
96 ; IC-NEXT:    switch i32 [[TMP40]], label [[BB26_I_I:%.*]] [
97 ; IC-NEXT:      i32 1, label [[BB22_I_I:%.*]]
98 ; IC-NEXT:      i32 2, label [[BB18_I_I:%.*]]
99 ; IC-NEXT:      i32 3, label [[BB14_I_I:%.*]]
100 ; IC-NEXT:    ]
101 ; IC:       bb14.i.i:
102 ; IC-NEXT:    [[TMP41:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
103 ; IC-NEXT:    [[TMP42:%.*]] = load i32, ptr [[TMP41]], align 4
104 ; IC-NEXT:    [[TMP43:%.*]] = load i32, ptr [[TMP0]], align 4
105 ; IC-NEXT:    [[TMP44:%.*]] = icmp eq i32 [[TMP42]], [[TMP43]]
106 ; IC-NEXT:    br i1 [[TMP44]], label [[BB16_I_I:%.*]], label [[BB17_I_I:%.*]]
107 ; IC:       bb16.i.i:
108 ; IC-NEXT:    [[TMP45:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
109 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
110 ; IC:       bb17.i.i:
111 ; IC-NEXT:    [[TMP46:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
112 ; IC-NEXT:    [[TMP47:%.*]] = getelementptr i8, ptr [[TMP46]], i32 4
113 ; IC-NEXT:    store ptr [[TMP47]], ptr [[__FIRST_ADDR_I_I]], align 4
114 ; IC-NEXT:    br label [[BB18_I_I]]
115 ; IC:       bb18.i.i:
116 ; IC-NEXT:    [[TMP48:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
117 ; IC-NEXT:    [[TMP49:%.*]] = load i32, ptr [[TMP48]], align 4
118 ; IC-NEXT:    [[TMP50:%.*]] = load i32, ptr [[TMP0]], align 4
119 ; IC-NEXT:    [[TMP51:%.*]] = icmp eq i32 [[TMP49]], [[TMP50]]
120 ; IC-NEXT:    br i1 [[TMP51]], label [[BB20_I_I:%.*]], label [[BB21_I_I:%.*]]
121 ; IC:       bb20.i.i:
122 ; IC-NEXT:    [[TMP52:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
123 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
124 ; IC:       bb21.i.i:
125 ; IC-NEXT:    [[TMP53:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
126 ; IC-NEXT:    [[TMP54:%.*]] = getelementptr i8, ptr [[TMP53]], i32 4
127 ; IC-NEXT:    store ptr [[TMP54]], ptr [[__FIRST_ADDR_I_I]], align 4
128 ; IC-NEXT:    br label [[BB22_I_I]]
129 ; IC:       bb22.i.i:
130 ; IC-NEXT:    [[TMP55:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
131 ; IC-NEXT:    [[TMP56:%.*]] = load i32, ptr [[TMP55]], align 4
132 ; IC-NEXT:    [[TMP57:%.*]] = load i32, ptr [[TMP0]], align 4
133 ; IC-NEXT:    [[TMP58:%.*]] = icmp eq i32 [[TMP56]], [[TMP57]]
134 ; IC-NEXT:    br i1 [[TMP58]], label [[BB24_I_I:%.*]], label [[BB25_I_I:%.*]]
135 ; IC:       bb24.i.i:
136 ; IC-NEXT:    [[TMP59:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
137 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
138 ; IC:       bb25.i.i:
139 ; IC-NEXT:    [[TMP60:%.*]] = load ptr, ptr [[__FIRST_ADDR_I_I]], align 4
140 ; IC-NEXT:    [[TMP61:%.*]] = getelementptr i8, ptr [[TMP60]], i32 4
141 ; IC-NEXT:    store ptr [[TMP61]], ptr [[__FIRST_ADDR_I_I]], align 4
142 ; IC-NEXT:    br label [[BB26_I_I]]
143 ; IC:       bb26.i.i:
144 ; IC-NEXT:    [[TMP62:%.*]] = load ptr, ptr [[__LAST_ADDR_I_I]], align 4
145 ; IC-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
146 ; IC:       _ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit:
147 ; IC-NEXT:    [[DOT0_0_I_I:%.*]] = phi ptr [ [[TMP62]], [[BB26_I_I]] ], [ [[TMP59]], [[BB24_I_I]] ], [ [[TMP52]], [[BB20_I_I]] ], [ [[TMP45]], [[BB16_I_I]] ], [ [[TMP30]], [[BB10_I_I]] ], [ [[TMP24]], [[BB7_I_I]] ], [ [[TMP18]], [[BB4_I_I]] ], [ [[TMP12]], [[BB1_I_I]] ]
148 ; IC-NEXT:    br label [[RETURN:%.*]]
149 ; IC:       return:
150 ; IC-NEXT:    ret ptr [[DOT0_0_I_I]]
152 ; IC_SROA-LABEL: @_Z3fooRSt6vectorIiSaIiEE(
153 ; IC_SROA-NEXT:  entry:
154 ; IC_SROA-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[X:%.*]], i32 4
155 ; IC_SROA-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 4
156 ; IC_SROA-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[X]], align 4
157 ; IC_SROA-NEXT:    [[TMP3:%.*]] = ptrtoint ptr [[TMP1]] to i32
158 ; IC_SROA-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[TMP2]] to i32
159 ; IC_SROA-NEXT:    [[TMP5:%.*]] = sub i32 [[TMP3]], [[TMP4]]
160 ; IC_SROA-NEXT:    [[TMP6:%.*]] = ashr i32 [[TMP5]], 4
161 ; IC_SROA-NEXT:    br label [[BB12_I_I:%.*]]
162 ; IC_SROA:       bb.i.i:
163 ; IC_SROA-NEXT:    [[TMP7:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_0:%.*]], align 4
164 ; IC_SROA-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 42
165 ; IC_SROA-NEXT:    br i1 [[TMP8]], label [[BB1_I_I:%.*]], label [[BB2_I_I:%.*]]
166 ; IC_SROA:       bb1.i.i:
167 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT:%.*]]
168 ; IC_SROA:       bb2.i.i:
169 ; IC_SROA-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_0]], i32 4
170 ; IC_SROA-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4
171 ; IC_SROA-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], 42
172 ; IC_SROA-NEXT:    br i1 [[TMP11]], label [[BB4_I_I:%.*]], label [[BB5_I_I:%.*]]
173 ; IC_SROA:       bb4.i.i:
174 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
175 ; IC_SROA:       bb5.i.i:
176 ; IC_SROA-NEXT:    [[TMP12:%.*]] = getelementptr i8, ptr [[TMP9]], i32 4
177 ; IC_SROA-NEXT:    [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
178 ; IC_SROA-NEXT:    [[TMP14:%.*]] = icmp eq i32 [[TMP13]], 42
179 ; IC_SROA-NEXT:    br i1 [[TMP14]], label [[BB7_I_I:%.*]], label [[BB8_I_I:%.*]]
180 ; IC_SROA:       bb7.i.i:
181 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
182 ; IC_SROA:       bb8.i.i:
183 ; IC_SROA-NEXT:    [[TMP15:%.*]] = getelementptr i8, ptr [[TMP12]], i32 4
184 ; IC_SROA-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4
185 ; IC_SROA-NEXT:    [[TMP17:%.*]] = icmp eq i32 [[TMP16]], 42
186 ; IC_SROA-NEXT:    br i1 [[TMP17]], label [[BB10_I_I:%.*]], label [[BB11_I_I:%.*]]
187 ; IC_SROA:       bb10.i.i:
188 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
189 ; IC_SROA:       bb11.i.i:
190 ; IC_SROA-NEXT:    [[TMP18:%.*]] = getelementptr i8, ptr [[TMP15]], i32 4
191 ; IC_SROA-NEXT:    [[TMP19:%.*]] = add nsw i32 [[__TRIP_COUNT_0_I_I:%.*]], -1
192 ; IC_SROA-NEXT:    br label [[BB12_I_I]]
193 ; IC_SROA:       bb12.i.i:
194 ; IC_SROA-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[TMP18]], [[BB11_I_I]] ]
195 ; IC_SROA-NEXT:    [[__TRIP_COUNT_0_I_I]] = phi i32 [ [[TMP6]], [[ENTRY]] ], [ [[TMP19]], [[BB11_I_I]] ]
196 ; IC_SROA-NEXT:    [[TMP20:%.*]] = icmp sgt i32 [[__TRIP_COUNT_0_I_I]], 0
197 ; IC_SROA-NEXT:    br i1 [[TMP20]], label [[BB_I_I:%.*]], label [[BB13_I_I:%.*]]
198 ; IC_SROA:       bb13.i.i:
199 ; IC_SROA-NEXT:    [[TMP21:%.*]] = ptrtoint ptr [[TMP1]] to i32
200 ; IC_SROA-NEXT:    [[TMP22:%.*]] = ptrtoint ptr [[__FIRST_ADDR_I_I_SROA_0_0]] to i32
201 ; IC_SROA-NEXT:    [[TMP23:%.*]] = sub i32 [[TMP21]], [[TMP22]]
202 ; IC_SROA-NEXT:    [[TMP24:%.*]] = ashr i32 [[TMP23]], 2
203 ; IC_SROA-NEXT:    switch i32 [[TMP24]], label [[BB26_I_I:%.*]] [
204 ; IC_SROA-NEXT:      i32 1, label [[BB22_I_I:%.*]]
205 ; IC_SROA-NEXT:      i32 2, label [[BB18_I_I:%.*]]
206 ; IC_SROA-NEXT:      i32 3, label [[BB14_I_I:%.*]]
207 ; IC_SROA-NEXT:    ]
208 ; IC_SROA:       bb14.i.i:
209 ; IC_SROA-NEXT:    [[TMP25:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_0]], align 4
210 ; IC_SROA-NEXT:    [[TMP26:%.*]] = icmp eq i32 [[TMP25]], 42
211 ; IC_SROA-NEXT:    br i1 [[TMP26]], label [[BB16_I_I:%.*]], label [[BB17_I_I:%.*]]
212 ; IC_SROA:       bb16.i.i:
213 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
214 ; IC_SROA:       bb17.i.i:
215 ; IC_SROA-NEXT:    [[TMP27:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_0]], i32 4
216 ; IC_SROA-NEXT:    br label [[BB18_I_I]]
217 ; IC_SROA:       bb18.i.i:
218 ; IC_SROA-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_1:%.*]] = phi ptr [ [[TMP27]], [[BB17_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ]
219 ; IC_SROA-NEXT:    [[TMP28:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_1]], align 4
220 ; IC_SROA-NEXT:    [[TMP29:%.*]] = icmp eq i32 [[TMP28]], 42
221 ; IC_SROA-NEXT:    br i1 [[TMP29]], label [[BB20_I_I:%.*]], label [[BB21_I_I:%.*]]
222 ; IC_SROA:       bb20.i.i:
223 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
224 ; IC_SROA:       bb21.i.i:
225 ; IC_SROA-NEXT:    [[TMP30:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_1]], i32 4
226 ; IC_SROA-NEXT:    br label [[BB22_I_I]]
227 ; IC_SROA:       bb22.i.i:
228 ; IC_SROA-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_2:%.*]] = phi ptr [ [[TMP30]], [[BB21_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB13_I_I]] ]
229 ; IC_SROA-NEXT:    [[TMP31:%.*]] = load i32, ptr [[__FIRST_ADDR_I_I_SROA_0_2]], align 4
230 ; IC_SROA-NEXT:    [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 42
231 ; IC_SROA-NEXT:    br i1 [[TMP32]], label [[BB24_I_I:%.*]], label [[BB25_I_I:%.*]]
232 ; IC_SROA:       bb24.i.i:
233 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
234 ; IC_SROA:       bb25.i.i:
235 ; IC_SROA-NEXT:    [[TMP33:%.*]] = getelementptr i8, ptr [[__FIRST_ADDR_I_I_SROA_0_2]], i32 4
236 ; IC_SROA-NEXT:    br label [[BB26_I_I]]
237 ; IC_SROA:       bb26.i.i:
238 ; IC_SROA-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
239 ; IC_SROA:       _ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit:
240 ; IC_SROA-NEXT:    [[DOT0_0_I_I:%.*]] = phi ptr [ [[TMP1]], [[BB26_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_2]], [[BB24_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_1]], [[BB20_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB16_I_I]] ], [ [[TMP15]], [[BB10_I_I]] ], [ [[TMP12]], [[BB7_I_I]] ], [ [[TMP9]], [[BB4_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0_0]], [[BB1_I_I]] ]
241 ; IC_SROA-NEXT:    br label [[RETURN:%.*]]
242 ; IC_SROA:       return:
243 ; IC_SROA-NEXT:    ret ptr [[DOT0_0_I_I]]
245 entry:
246   %0 = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
247   %__first_addr.i.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
248   %__last_addr.i.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
249   %unnamed_arg.i = alloca %"struct.std::bidirectional_iterator_tag", align 8
250   %1 = alloca %"struct.std::bidirectional_iterator_tag"
251   %__first_addr.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
252   %2 = alloca %"struct.std::bidirectional_iterator_tag"
253   %3 = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
254   %4 = alloca i32
255   %"alloca point" = bitcast i32 0 to i32
256   store i32 42, ptr %4, align 4
257   %5 = getelementptr %"struct.std::vector<int,std::allocator<int> >", ptr %X, i32 0, i32 0
258   %6 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >", ptr %5, i32 0, i32 0
259   %7 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl", ptr %6, i32 0, i32 1
260   %8 = load ptr, ptr %7, align 4
261   %9 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %3, i32 0, i32 0
262   store ptr %8, ptr %9, align 4
263   %10 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %3, i32 0, i32 0
264   %11 = load ptr, ptr %10, align 4
265   %tmp2.i = ptrtoint ptr %11 to i32
266   %tmp1.i = inttoptr i32 %tmp2.i to ptr
267   %tmp3 = ptrtoint ptr %tmp1.i to i32
268   %tmp2 = inttoptr i32 %tmp3 to ptr
269   %12 = getelementptr %"struct.std::vector<int,std::allocator<int> >", ptr %X, i32 0, i32 0
270   %13 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >", ptr %12, i32 0, i32 0
271   %14 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl", ptr %13, i32 0, i32 0
272   %15 = load ptr, ptr %14, align 4
273   %16 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %0, i32 0, i32 0
274   store ptr %15, ptr %16, align 4
275   %17 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %0, i32 0, i32 0
276   %18 = load ptr, ptr %17, align 4
277   %tmp2.i17 = ptrtoint ptr %18 to i32
278   %tmp1.i18 = inttoptr i32 %tmp2.i17 to ptr
279   %tmp8 = ptrtoint ptr %tmp1.i18 to i32
280   %tmp6 = inttoptr i32 %tmp8 to ptr
281   %19 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i, i32 0, i32 0
282   store ptr %tmp6, ptr %19
283   %20 = load i8, ptr %1, align 1
284   %21 = or i8 %20, 0
285   %22 = or i8 %21, 0
286   %23 = or i8 %22, 0
287   store i8 0, ptr %2, align 1
288   %elt.i = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i, i32 0, i32 0
289   %val.i = load ptr, ptr %elt.i
290   call void @llvm.memcpy.p0.p0.i64(ptr %unnamed_arg.i, ptr %2, i64 1, i1 false)
291   %24 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
292   store ptr %val.i, ptr %24
293   %25 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__last_addr.i.i, i32 0, i32 0
294   store ptr %tmp2, ptr %25
295   %26 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__last_addr.i.i, i32 0, i32 0
296   %27 = load ptr, ptr %26, align 4
297   %28 = ptrtoint ptr %27 to i32
298   %29 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
299   %30 = load ptr, ptr %29, align 4
300   %31 = ptrtoint ptr %30 to i32
301   %32 = sub i32 %28, %31
302   %33 = ashr i32 %32, 2
303   %34 = ashr i32 %33, 2
304   br label %bb12.i.i
306 bb.i.i:                                           ; preds = %bb12.i.i
307   %35 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
308   %36 = load ptr, ptr %35, align 4
309   %37 = load i32, ptr %36, align 4
310   %38 = load i32, ptr %4, align 4
311   %39 = icmp eq i32 %37, %38
312   %40 = zext i1 %39 to i8
313   %toBool.i.i = icmp ne i8 %40, 0
314   br i1 %toBool.i.i, label %bb1.i.i, label %bb2.i.i
316 bb1.i.i:                                          ; preds = %bb.i.i
317   %41 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
318   %42 = load ptr, ptr %41, align 4
319   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
321 bb2.i.i:                                          ; preds = %bb.i.i
322   %43 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
323   %44 = load ptr, ptr %43, align 4
324   %45 = getelementptr i32, ptr %44, i64 1
325   %46 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
326   store ptr %45, ptr %46, align 4
327   %47 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
328   %48 = load ptr, ptr %47, align 4
329   %49 = load i32, ptr %48, align 4
330   %50 = load i32, ptr %4, align 4
331   %51 = icmp eq i32 %49, %50
332   %52 = zext i1 %51 to i8
333   %toBool3.i.i = icmp ne i8 %52, 0
334   br i1 %toBool3.i.i, label %bb4.i.i, label %bb5.i.i
336 bb4.i.i:                                          ; preds = %bb2.i.i
337   %53 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
338   %54 = load ptr, ptr %53, align 4
339   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
341 bb5.i.i:                                          ; preds = %bb2.i.i
342   %55 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
343   %56 = load ptr, ptr %55, align 4
344   %57 = getelementptr i32, ptr %56, i64 1
345   %58 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
346   store ptr %57, ptr %58, align 4
347   %59 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
348   %60 = load ptr, ptr %59, align 4
349   %61 = load i32, ptr %60, align 4
350   %62 = load i32, ptr %4, align 4
351   %63 = icmp eq i32 %61, %62
352   %64 = zext i1 %63 to i8
353   %toBool6.i.i = icmp ne i8 %64, 0
354   br i1 %toBool6.i.i, label %bb7.i.i, label %bb8.i.i
356 bb7.i.i:                                          ; preds = %bb5.i.i
357   %65 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
358   %66 = load ptr, ptr %65, align 4
359   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
361 bb8.i.i:                                          ; preds = %bb5.i.i
362   %67 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
363   %68 = load ptr, ptr %67, align 4
364   %69 = getelementptr i32, ptr %68, i64 1
365   %70 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
366   store ptr %69, ptr %70, align 4
367   %71 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
368   %72 = load ptr, ptr %71, align 4
369   %73 = load i32, ptr %72, align 4
370   %74 = load i32, ptr %4, align 4
371   %75 = icmp eq i32 %73, %74
372   %76 = zext i1 %75 to i8
373   %toBool9.i.i = icmp ne i8 %76, 0
374   br i1 %toBool9.i.i, label %bb10.i.i, label %bb11.i.i
376 bb10.i.i:                                         ; preds = %bb8.i.i
377   %77 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
378   %78 = load ptr, ptr %77, align 4
379   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
381 bb11.i.i:                                         ; preds = %bb8.i.i
382   %79 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
383   %80 = load ptr, ptr %79, align 4
384   %81 = getelementptr i32, ptr %80, i64 1
385   %82 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
386   store ptr %81, ptr %82, align 4
387   %83 = sub i32 %__trip_count.0.i.i, 1
388   br label %bb12.i.i
390 bb12.i.i:                                         ; preds = %bb11.i.i, %entry
391   %__trip_count.0.i.i = phi i32 [ %34, %entry ], [ %83, %bb11.i.i ]
392   %84 = icmp sgt i32 %__trip_count.0.i.i, 0
393   br i1 %84, label %bb.i.i, label %bb13.i.i
395 bb13.i.i:                                         ; preds = %bb12.i.i
396   %85 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__last_addr.i.i, i32 0, i32 0
397   %86 = load ptr, ptr %85, align 4
398   %87 = ptrtoint ptr %86 to i32
399   %88 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
400   %89 = load ptr, ptr %88, align 4
401   %90 = ptrtoint ptr %89 to i32
402   %91 = sub i32 %87, %90
403   %92 = ashr i32 %91, 2
404   switch i32 %92, label %bb26.i.i [
405   i32 1, label %bb22.i.i
406   i32 2, label %bb18.i.i
407   i32 3, label %bb14.i.i
408   ]
410 bb14.i.i:                                         ; preds = %bb13.i.i
411   %93 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
412   %94 = load ptr, ptr %93, align 4
413   %95 = load i32, ptr %94, align 4
414   %96 = load i32, ptr %4, align 4
415   %97 = icmp eq i32 %95, %96
416   %98 = zext i1 %97 to i8
417   %toBool15.i.i = icmp ne i8 %98, 0
418   br i1 %toBool15.i.i, label %bb16.i.i, label %bb17.i.i
420 bb16.i.i:                                         ; preds = %bb14.i.i
421   %99 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
422   %100 = load ptr, ptr %99, align 4
423   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
425 bb17.i.i:                                         ; preds = %bb14.i.i
426   %101 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
427   %102 = load ptr, ptr %101, align 4
428   %103 = getelementptr i32, ptr %102, i64 1
429   %104 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
430   store ptr %103, ptr %104, align 4
431   br label %bb18.i.i
433 bb18.i.i:                                         ; preds = %bb17.i.i, %bb13.i.i
434   %105 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
435   %106 = load ptr, ptr %105, align 4
436   %107 = load i32, ptr %106, align 4
437   %108 = load i32, ptr %4, align 4
438   %109 = icmp eq i32 %107, %108
439   %110 = zext i1 %109 to i8
440   %toBool19.i.i = icmp ne i8 %110, 0
441   br i1 %toBool19.i.i, label %bb20.i.i, label %bb21.i.i
443 bb20.i.i:                                         ; preds = %bb18.i.i
444   %111 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
445   %112 = load ptr, ptr %111, align 4
446   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
448 bb21.i.i:                                         ; preds = %bb18.i.i
449   %113 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
450   %114 = load ptr, ptr %113, align 4
451   %115 = getelementptr i32, ptr %114, i64 1
452   %116 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
453   store ptr %115, ptr %116, align 4
454   br label %bb22.i.i
456 bb22.i.i:                                         ; preds = %bb21.i.i, %bb13.i.i
457   %117 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
458   %118 = load ptr, ptr %117, align 4
459   %119 = load i32, ptr %118, align 4
460   %120 = load i32, ptr %4, align 4
461   %121 = icmp eq i32 %119, %120
462   %122 = zext i1 %121 to i8
463   %toBool23.i.i = icmp ne i8 %122, 0
464   br i1 %toBool23.i.i, label %bb24.i.i, label %bb25.i.i
466 bb24.i.i:                                         ; preds = %bb22.i.i
467   %123 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
468   %124 = load ptr, ptr %123, align 4
469   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
471 bb25.i.i:                                         ; preds = %bb22.i.i
472   %125 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
473   %126 = load ptr, ptr %125, align 4
474   %127 = getelementptr i32, ptr %126, i64 1
475   %128 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__first_addr.i.i, i32 0, i32 0
476   store ptr %127, ptr %128, align 4
477   br label %bb26.i.i
479 bb26.i.i:                                         ; preds = %bb25.i.i, %bb13.i.i
480   %129 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >", ptr %__last_addr.i.i, i32 0, i32 0
481   %130 = load ptr, ptr %129, align 4
482   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
484 _ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit: ; preds = %bb26.i.i, %bb24.i.i, %bb20.i.i, %bb16.i.i, %bb10.i.i, %bb7.i.i, %bb4.i.i, %bb1.i.i
485   %.0.0.i.i = phi ptr [ %130, %bb26.i.i ], [ %124, %bb24.i.i ], [ %112, %bb20.i.i ], [ %100, %bb16.i.i ], [ %78, %bb10.i.i ], [ %66, %bb7.i.i ], [ %54, %bb4.i.i ], [ %42, %bb1.i.i ]
486   %tmp2.i.i = ptrtoint ptr %.0.0.i.i to i32
487   %tmp1.i.i = inttoptr i32 %tmp2.i.i to ptr
488   %tmp4.i = ptrtoint ptr %tmp1.i.i to i32
489   %tmp3.i = inttoptr i32 %tmp4.i to ptr
490   %tmp8.i = ptrtoint ptr %tmp3.i to i32
491   %tmp6.i = inttoptr i32 %tmp8.i to ptr
492   %tmp12 = ptrtoint ptr %tmp6.i to i32
493   %tmp10 = inttoptr i32 %tmp12 to ptr
494   %tmp16 = ptrtoint ptr %tmp10 to i32
495   br label %return
497 return:                                           ; preds = %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
498   %tmp14 = inttoptr i32 %tmp16 to ptr
499   ret ptr %tmp14
502 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind