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 4 5; rdar://6417724 6; Instcombine shouldn't do anything to this function that prevents promoting the allocas inside it. 7 8target 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" 9target triple = "i386-apple-darwin9.6" 10 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> >" } 19 20define 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]] 151; 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]] 244; 245entry: 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 305 306bb.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 315 316bb1.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 320 321bb2.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 335 336bb4.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 340 341bb5.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 355 356bb7.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 360 361bb8.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 375 376bb10.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 380 381bb11.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 389 390bb12.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 394 395bb13.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 ] 409 410bb14.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 419 420bb16.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 424 425bb17.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 432 433bb18.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 442 443bb20.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 447 448bb21.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 455 456bb22.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 465 466bb24.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 470 471bb25.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 478 479bb26.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 483 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 496 497return: ; preds = %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit 498 %tmp14 = inttoptr i32 %tmp16 to ptr 499 ret ptr %tmp14 500} 501 502declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind 503