[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / SROA / 2009-02-20-InstCombine-SROA.ll
blobe0c2290dcabad01997747b7af542e6e77426d6db
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -sroa -S | FileCheck %s
4 ; rdar://6417724
6 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"
7 target triple = "i386-apple-darwin9.6"
9 %"struct.std::vector<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >" }
10 %"struct.std::_Vector_base<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" }
11 %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" = type { i32*, i32*, i32* }
13 define i32* @_Z3fooRSt6vectorIiSaIiEE(%"struct.std::vector<int,std::allocator<int> >"* %X) {
14 ; CHECK-LABEL: @_Z3fooRSt6vectorIiSaIiEE(
15 ; CHECK-NEXT:  entry:
16 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0:%.*]] = alloca i32*, align 8
17 ; CHECK-NEXT:    [[__LAST_ADDR_I_I_SROA_0:%.*]] = alloca i32*, align 8
18 ; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr %"struct.std::vector<int,std::allocator<int> >", %"struct.std::vector<int,std::allocator<int> >"* [[X:%.*]], i32 0, i32 0, i32 0, i32 1
19 ; CHECK-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[TMP0]], align 4
20 ; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr %"struct.std::vector<int,std::allocator<int> >", %"struct.std::vector<int,std::allocator<int> >"* [[X]], i32 0, i32 0, i32 0, i32 0
21 ; CHECK-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[TMP2]], align 4
22 ; CHECK-NEXT:    store i32* [[TMP3]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
23 ; CHECK-NEXT:    store i32* [[TMP1]], i32** [[__LAST_ADDR_I_I_SROA_0]], align 8
24 ; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[TMP1]] to i32
25 ; CHECK-NEXT:    [[TMP5:%.*]] = ptrtoint i32* [[TMP3]] to i32
26 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP4]], [[TMP5]]
27 ; CHECK-NEXT:    [[TMP7:%.*]] = ashr i32 [[TMP6]], 4
28 ; CHECK-NEXT:    br label [[BB12_I_I:%.*]]
29 ; CHECK:       bb.i.i:
30 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_13:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
31 ; CHECK-NEXT:    [[TMP8:%.*]] = load i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_13]], align 4
32 ; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 42
33 ; CHECK-NEXT:    br i1 [[TMP9]], label [[BB1_I_I:%.*]], label [[BB2_I_I:%.*]]
34 ; CHECK:       bb1.i.i:
35 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT:%.*]]
36 ; CHECK:       bb2.i.i:
37 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_14:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
38 ; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_14]], i32 1
39 ; CHECK-NEXT:    store i32* [[TMP10]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
40 ; CHECK-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
41 ; CHECK-NEXT:    [[TMP12:%.*]] = icmp eq i32 [[TMP11]], 42
42 ; CHECK-NEXT:    br i1 [[TMP12]], label [[BB4_I_I:%.*]], label [[BB5_I_I:%.*]]
43 ; CHECK:       bb4.i.i:
44 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
45 ; CHECK:       bb5.i.i:
46 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_15:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
47 ; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_15]], i32 1
48 ; CHECK-NEXT:    store i32* [[TMP13]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
49 ; CHECK-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
50 ; CHECK-NEXT:    [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 42
51 ; CHECK-NEXT:    br i1 [[TMP15]], label [[BB7_I_I:%.*]], label [[BB8_I_I:%.*]]
52 ; CHECK:       bb7.i.i:
53 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
54 ; CHECK:       bb8.i.i:
55 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_16:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
56 ; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_16]], i32 1
57 ; CHECK-NEXT:    store i32* [[TMP16]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
58 ; CHECK-NEXT:    [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4
59 ; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP17]], 42
60 ; CHECK-NEXT:    br i1 [[TMP18]], label [[BB10_I_I:%.*]], label [[BB11_I_I:%.*]]
61 ; CHECK:       bb10.i.i:
62 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
63 ; CHECK:       bb11.i.i:
64 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_17:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
65 ; CHECK-NEXT:    [[TMP19:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_17]], i32 1
66 ; CHECK-NEXT:    store i32* [[TMP19]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
67 ; CHECK-NEXT:    [[TMP20:%.*]] = add i32 [[__TRIP_COUNT_0_I_I:%.*]], -1
68 ; CHECK-NEXT:    br label [[BB12_I_I]]
69 ; CHECK:       bb12.i.i:
70 ; CHECK-NEXT:    [[__TRIP_COUNT_0_I_I]] = phi i32 [ [[TMP7]], [[ENTRY:%.*]] ], [ [[TMP20]], [[BB11_I_I]] ]
71 ; CHECK-NEXT:    [[TMP21:%.*]] = icmp sgt i32 [[__TRIP_COUNT_0_I_I]], 0
72 ; CHECK-NEXT:    br i1 [[TMP21]], label [[BB_I_I:%.*]], label [[BB13_I_I:%.*]]
73 ; CHECK:       bb13.i.i:
74 ; CHECK-NEXT:    [[__LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0_:%.*]] = load i32*, i32** [[__LAST_ADDR_I_I_SROA_0]], align 8
75 ; CHECK-NEXT:    [[TMP22:%.*]] = ptrtoint i32* [[__LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0___LAST_ADDR_I_I_SROA_0_0_]] to i32
76 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
77 ; CHECK-NEXT:    [[TMP23:%.*]] = ptrtoint i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_]] to i32
78 ; CHECK-NEXT:    [[TMP24:%.*]] = sub i32 [[TMP22]], [[TMP23]]
79 ; CHECK-NEXT:    [[TMP25:%.*]] = ashr i32 [[TMP24]], 2
80 ; CHECK-NEXT:    switch i32 [[TMP25]], label [[BB26_I_I:%.*]] [
81 ; CHECK-NEXT:    i32 1, label [[BB22_I_I:%.*]]
82 ; CHECK-NEXT:    i32 2, label [[BB18_I_I:%.*]]
83 ; CHECK-NEXT:    i32 3, label [[BB14_I_I:%.*]]
84 ; CHECK-NEXT:    ]
85 ; CHECK:       bb14.i.i:
86 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_7:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
87 ; CHECK-NEXT:    [[TMP26:%.*]] = load i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_7]], align 4
88 ; CHECK-NEXT:    [[TMP27:%.*]] = icmp eq i32 [[TMP26]], 42
89 ; CHECK-NEXT:    br i1 [[TMP27]], label [[BB16_I_I:%.*]], label [[BB17_I_I:%.*]]
90 ; CHECK:       bb16.i.i:
91 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
92 ; CHECK:       bb17.i.i:
93 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_8:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
94 ; CHECK-NEXT:    [[TMP28:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_8]], i32 1
95 ; CHECK-NEXT:    store i32* [[TMP28]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
96 ; CHECK-NEXT:    br label [[BB18_I_I]]
97 ; CHECK:       bb18.i.i:
98 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_9:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
99 ; CHECK-NEXT:    [[TMP29:%.*]] = load i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_9]], align 4
100 ; CHECK-NEXT:    [[TMP30:%.*]] = icmp eq i32 [[TMP29]], 42
101 ; CHECK-NEXT:    br i1 [[TMP30]], label [[BB20_I_I:%.*]], label [[BB21_I_I:%.*]]
102 ; CHECK:       bb20.i.i:
103 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
104 ; CHECK:       bb21.i.i:
105 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_10:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
106 ; CHECK-NEXT:    [[TMP31:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_10]], i32 1
107 ; CHECK-NEXT:    store i32* [[TMP31]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
108 ; CHECK-NEXT:    br label [[BB22_I_I]]
109 ; CHECK:       bb22.i.i:
110 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_11:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
111 ; CHECK-NEXT:    [[TMP32:%.*]] = load i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_11]], align 4
112 ; CHECK-NEXT:    [[TMP33:%.*]] = icmp eq i32 [[TMP32]], 42
113 ; CHECK-NEXT:    br i1 [[TMP33]], label [[BB24_I_I:%.*]], label [[BB25_I_I:%.*]]
114 ; CHECK:       bb24.i.i:
115 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
116 ; CHECK:       bb25.i.i:
117 ; CHECK-NEXT:    [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_12:%.*]] = load i32*, i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
118 ; CHECK-NEXT:    [[TMP34:%.*]] = getelementptr i32, i32* [[__FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0___FIRST_ADDR_I_I_SROA_0_0_12]], i32 1
119 ; CHECK-NEXT:    store i32* [[TMP34]], i32** [[__FIRST_ADDR_I_I_SROA_0]], align 8
120 ; CHECK-NEXT:    br label [[BB26_I_I]]
121 ; CHECK:       bb26.i.i:
122 ; CHECK-NEXT:    br label [[_ZST4FINDIN9__GNU_CXX17__NORMAL_ITERATORIPIST6VECTORIISAIIEEEEIET_S7_S7_RKT0__EXIT]]
123 ; CHECK:       _ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit:
124 ; CHECK-NEXT:    [[DOTIN_IN:%.*]] = phi i32** [ [[__LAST_ADDR_I_I_SROA_0]], [[BB26_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB24_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB20_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB16_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB10_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB7_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB4_I_I]] ], [ [[__FIRST_ADDR_I_I_SROA_0]], [[BB1_I_I]] ]
125 ; CHECK-NEXT:    br label [[RETURN:%.*]]
126 ; CHECK:       return:
127 ; CHECK-NEXT:    [[TMP35:%.*]] = load i32*, i32** [[DOTIN_IN]], align 4
128 ; CHECK-NEXT:    ret i32* [[TMP35]]
130 entry:
131   %__first_addr.i.i.sroa.0 = alloca i32*, align 8
132   %__last_addr.i.i.sroa.0 = alloca i32*, align 8
133   %0 = getelementptr %"struct.std::vector<int,std::allocator<int> >", %"struct.std::vector<int,std::allocator<int> >"* %X, i32 0, i32 0, i32 0, i32 1
134   %1 = load i32*, i32** %0, align 4
135   %2 = getelementptr %"struct.std::vector<int,std::allocator<int> >", %"struct.std::vector<int,std::allocator<int> >"* %X, i32 0, i32 0, i32 0, i32 0
136   %3 = load i32*, i32** %2, align 4
137   store i32* %3, i32** %__first_addr.i.i.sroa.0, align 8
138   store i32* %1, i32** %__last_addr.i.i.sroa.0, align 8
139   %4 = ptrtoint i32* %1 to i32
140   %5 = ptrtoint i32* %3 to i32
141   %6 = sub i32 %4, %5
142   %7 = ashr i32 %6, 4
143   br label %bb12.i.i
145 bb.i.i:                                           ; preds = %bb12.i.i
146   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.13 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
147   %8 = load i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.13, align 4
148   %9 = icmp eq i32 %8, 42
149   br i1 %9, label %bb1.i.i, label %bb2.i.i
151 bb1.i.i:                                          ; preds = %bb.i.i
152   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
154 bb2.i.i:                                          ; preds = %bb.i.i
155   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.14 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
156   %10 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.14, i32 1
157   store i32* %10, i32** %__first_addr.i.i.sroa.0, align 8
158   %11 = load i32, i32* %10, align 4
159   %12 = icmp eq i32 %11, 42
160   br i1 %12, label %bb4.i.i, label %bb5.i.i
162 bb4.i.i:                                          ; preds = %bb2.i.i
163   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
165 bb5.i.i:                                          ; preds = %bb2.i.i
166   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.15 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
167   %13 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.15, i32 1
168   store i32* %13, i32** %__first_addr.i.i.sroa.0, align 8
169   %14 = load i32, i32* %13, align 4
170   %15 = icmp eq i32 %14, 42
171   br i1 %15, label %bb7.i.i, label %bb8.i.i
173 bb7.i.i:                                          ; preds = %bb5.i.i
174   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
176 bb8.i.i:                                          ; preds = %bb5.i.i
177   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.16 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
178   %16 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.16, i32 1
179   store i32* %16, i32** %__first_addr.i.i.sroa.0, align 8
180   %17 = load i32, i32* %16, align 4
181   %18 = icmp eq i32 %17, 42
182   br i1 %18, label %bb10.i.i, label %bb11.i.i
184 bb10.i.i:                                         ; preds = %bb8.i.i
185   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
187 bb11.i.i:                                         ; preds = %bb8.i.i
188   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.17 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
189   %19 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.17, i32 1
190   store i32* %19, i32** %__first_addr.i.i.sroa.0, align 8
191   %20 = add i32 %__trip_count.0.i.i, -1
192   br label %bb12.i.i
194 bb12.i.i:                                         ; preds = %bb11.i.i, %entry
195   %__trip_count.0.i.i = phi i32 [ %7, %entry ], [ %20, %bb11.i.i ]
196   %21 = icmp sgt i32 %__trip_count.0.i.i, 0
197   br i1 %21, label %bb.i.i, label %bb13.i.i
199 bb13.i.i:                                         ; preds = %bb12.i.i
200   %__last_addr.i.i.sroa.0.0.__last_addr.i.i.sroa.0.0.__last_addr.i.i.sroa.0.0. = load i32*, i32** %__last_addr.i.i.sroa.0, align 8
201   %22 = ptrtoint i32* %__last_addr.i.i.sroa.0.0.__last_addr.i.i.sroa.0.0.__last_addr.i.i.sroa.0.0. to i32
202   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0. = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
203   %23 = ptrtoint i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0. to i32
204   %24 = sub i32 %22, %23
205   %25 = ashr i32 %24, 2
206   switch i32 %25, label %bb26.i.i [
207   i32 1, label %bb22.i.i
208   i32 2, label %bb18.i.i
209   i32 3, label %bb14.i.i
210   ]
212 bb14.i.i:                                         ; preds = %bb13.i.i
213   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.7 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
214   %26 = load i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.7, align 4
215   %27 = icmp eq i32 %26, 42
216   br i1 %27, label %bb16.i.i, label %bb17.i.i
218 bb16.i.i:                                         ; preds = %bb14.i.i
219   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
221 bb17.i.i:                                         ; preds = %bb14.i.i
222   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.8 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
223   %28 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.8, i32 1
224   store i32* %28, i32** %__first_addr.i.i.sroa.0, align 8
225   br label %bb18.i.i
227 bb18.i.i:                                         ; preds = %bb17.i.i, %bb13.i.i
228   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.9 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
229   %29 = load i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.9, align 4
230   %30 = icmp eq i32 %29, 42
231   br i1 %30, label %bb20.i.i, label %bb21.i.i
233 bb20.i.i:                                         ; preds = %bb18.i.i
234   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
236 bb21.i.i:                                         ; preds = %bb18.i.i
237   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.10 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
238   %31 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.10, i32 1
239   store i32* %31, i32** %__first_addr.i.i.sroa.0, align 8
240   br label %bb22.i.i
242 bb22.i.i:                                         ; preds = %bb21.i.i, %bb13.i.i
243   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.11 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
244   %32 = load i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.11, align 4
245   %33 = icmp eq i32 %32, 42
246   br i1 %33, label %bb24.i.i, label %bb25.i.i
248 bb24.i.i:                                         ; preds = %bb22.i.i
249   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
251 bb25.i.i:                                         ; preds = %bb22.i.i
252   %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.12 = load i32*, i32** %__first_addr.i.i.sroa.0, align 8
253   %34 = getelementptr i32, i32* %__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.__first_addr.i.i.sroa.0.0.12, i32 1
254   store i32* %34, i32** %__first_addr.i.i.sroa.0, align 8
255   br label %bb26.i.i
257 bb26.i.i:                                         ; preds = %bb25.i.i, %bb13.i.i
258   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
260 _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
261   %.in.in = phi i32** [ %__last_addr.i.i.sroa.0, %bb26.i.i ], [ %__first_addr.i.i.sroa.0, %bb24.i.i ], [ %__first_addr.i.i.sroa.0, %bb20.i.i ], [ %__first_addr.i.i.sroa.0, %bb16.i.i ], [ %__first_addr.i.i.sroa.0, %bb10.i.i ], [ %__first_addr.i.i.sroa.0, %bb7.i.i ], [ %__first_addr.i.i.sroa.0, %bb4.i.i ], [ %__first_addr.i.i.sroa.0, %bb1.i.i ]
262   br label %return
264 return:                                           ; preds = %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
265   %35 = load i32*, i32** %.in.in, align 4
266   ret i32* %35
269 ; Function Attrs: argmemonly nofree nosync nounwind willreturn
270 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #0
272 attributes #0 = { argmemonly nofree nosync nounwind willreturn }