Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -scalarrepl -S | not grep " = alloca"
      2 ; rdar://6417724
      3 ; Instcombine shouldn't do anything to this function that prevents promoting the allocas inside it.
      4 
      5 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"
      6 target triple = "i386-apple-darwin9.6"
      7 
      8 %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >" = type { i32* }
      9 %"struct.std::_Vector_base<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" }
     10 %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl" = type { i32*, i32*, i32* }
     11 %"struct.std::bidirectional_iterator_tag" = type <{ i8 }>
     12 %"struct.std::forward_iterator_tag" = type <{ i8 }>
     13 %"struct.std::input_iterator_tag" = type <{ i8 }>
     14 %"struct.std::random_access_iterator_tag" = type <{ i8 }>
     15 %"struct.std::vector<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >" }
     16 
     17 define i32* @_Z3fooRSt6vectorIiSaIiEE(%"struct.std::vector<int,std::allocator<int> >"* %X) {
     18 entry:
     19   %0 = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
     20   %__first_addr.i.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
     21   %__last_addr.i.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
     22   %unnamed_arg.i = alloca %"struct.std::bidirectional_iterator_tag", align 8
     23   %1 = alloca %"struct.std::bidirectional_iterator_tag"
     24   %__first_addr.i = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
     25   %2 = alloca %"struct.std::bidirectional_iterator_tag"
     26   %3 = alloca %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"
     27   %4 = alloca i32
     28   %"alloca point" = bitcast i32 0 to i32
     29   store i32 42, i32* %4, align 4
     30   %5 = getelementptr %"struct.std::vector<int,std::allocator<int> >"* %X, i32 0, i32 0
     31   %6 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >"* %5, i32 0, i32 0
     32   %7 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl"* %6, i32 0, i32 1
     33   %8 = load i32** %7, align 4
     34   %9 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %3, i32 0, i32 0
     35   store i32* %8, i32** %9, align 4
     36   %10 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %3, i32 0, i32 0
     37   %11 = load i32** %10, align 4
     38   %tmp2.i = ptrtoint i32* %11 to i32
     39   %tmp1.i = inttoptr i32 %tmp2.i to i32*
     40   %tmp3 = ptrtoint i32* %tmp1.i to i32
     41   %tmp2 = inttoptr i32 %tmp3 to i32*
     42   %12 = getelementptr %"struct.std::vector<int,std::allocator<int> >"* %X, i32 0, i32 0
     43   %13 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >"* %12, i32 0, i32 0
     44   %14 = getelementptr %"struct.std::_Vector_base<int,std::allocator<int> >::_Vector_impl"* %13, i32 0, i32 0
     45   %15 = load i32** %14, align 4
     46   %16 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %0, i32 0, i32 0
     47   store i32* %15, i32** %16, align 4
     48   %17 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %0, i32 0, i32 0
     49   %18 = load i32** %17, align 4
     50   %tmp2.i17 = ptrtoint i32* %18 to i32
     51   %tmp1.i18 = inttoptr i32 %tmp2.i17 to i32*
     52   %tmp8 = ptrtoint i32* %tmp1.i18 to i32
     53   %tmp6 = inttoptr i32 %tmp8 to i32*
     54   %19 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i, i32 0, i32 0
     55   store i32* %tmp6, i32** %19
     56   %20 = getelementptr %"struct.std::bidirectional_iterator_tag"* %1, i32 0, i32 0
     57   %21 = load i8* %20, align 1
     58   %22 = or i8 %21, 0
     59   %23 = or i8 %22, 0
     60   %24 = or i8 %23, 0
     61   %25 = getelementptr %"struct.std::bidirectional_iterator_tag"* %2, i32 0, i32 0
     62   store i8 0, i8* %25, align 1
     63   %elt.i = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i, i32 0, i32 0
     64   %val.i = load i32** %elt.i
     65   %tmp.i = bitcast %"struct.std::bidirectional_iterator_tag"* %unnamed_arg.i to i8*
     66   %tmp9.i = bitcast %"struct.std::bidirectional_iterator_tag"* %2 to i8*
     67   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp.i, i8* %tmp9.i, i64 1, i32 1, i1 false)
     68   %26 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
     69   store i32* %val.i, i32** %26
     70   %27 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__last_addr.i.i, i32 0, i32 0
     71   store i32* %tmp2, i32** %27
     72   %28 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__last_addr.i.i, i32 0, i32 0
     73   %29 = load i32** %28, align 4
     74   %30 = ptrtoint i32* %29 to i32
     75   %31 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
     76   %32 = load i32** %31, align 4
     77   %33 = ptrtoint i32* %32 to i32
     78   %34 = sub i32 %30, %33
     79   %35 = ashr i32 %34, 2
     80   %36 = ashr i32 %35, 2
     81   br label %bb12.i.i
     82 
     83 bb.i.i:                                           ; preds = %bb12.i.i
     84   %37 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
     85   %38 = load i32** %37, align 4
     86   %39 = load i32* %38, align 4
     87   %40 = load i32* %4, align 4
     88   %41 = icmp eq i32 %39, %40
     89   %42 = zext i1 %41 to i8
     90   %toBool.i.i = icmp ne i8 %42, 0
     91   br i1 %toBool.i.i, label %bb1.i.i, label %bb2.i.i
     92 
     93 bb1.i.i:                                          ; preds = %bb.i.i
     94   %43 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
     95   %44 = load i32** %43, align 4
     96   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
     97 
     98 bb2.i.i:                                          ; preds = %bb.i.i
     99   %45 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    100   %46 = load i32** %45, align 4
    101   %47 = getelementptr i32* %46, i64 1
    102   %48 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    103   store i32* %47, i32** %48, align 4
    104   %49 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    105   %50 = load i32** %49, align 4
    106   %51 = load i32* %50, align 4
    107   %52 = load i32* %4, align 4
    108   %53 = icmp eq i32 %51, %52
    109   %54 = zext i1 %53 to i8
    110   %toBool3.i.i = icmp ne i8 %54, 0
    111   br i1 %toBool3.i.i, label %bb4.i.i, label %bb5.i.i
    112 
    113 bb4.i.i:                                          ; preds = %bb2.i.i
    114   %55 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    115   %56 = load i32** %55, align 4
    116   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    117 
    118 bb5.i.i:                                          ; preds = %bb2.i.i
    119   %57 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    120   %58 = load i32** %57, align 4
    121   %59 = getelementptr i32* %58, i64 1
    122   %60 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    123   store i32* %59, i32** %60, align 4
    124   %61 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    125   %62 = load i32** %61, align 4
    126   %63 = load i32* %62, align 4
    127   %64 = load i32* %4, align 4
    128   %65 = icmp eq i32 %63, %64
    129   %66 = zext i1 %65 to i8
    130   %toBool6.i.i = icmp ne i8 %66, 0
    131   br i1 %toBool6.i.i, label %bb7.i.i, label %bb8.i.i
    132 
    133 bb7.i.i:                                          ; preds = %bb5.i.i
    134   %67 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    135   %68 = load i32** %67, align 4
    136   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    137 
    138 bb8.i.i:                                          ; preds = %bb5.i.i
    139   %69 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    140   %70 = load i32** %69, align 4
    141   %71 = getelementptr i32* %70, i64 1
    142   %72 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    143   store i32* %71, i32** %72, align 4
    144   %73 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    145   %74 = load i32** %73, align 4
    146   %75 = load i32* %74, align 4
    147   %76 = load i32* %4, align 4
    148   %77 = icmp eq i32 %75, %76
    149   %78 = zext i1 %77 to i8
    150   %toBool9.i.i = icmp ne i8 %78, 0
    151   br i1 %toBool9.i.i, label %bb10.i.i, label %bb11.i.i
    152 
    153 bb10.i.i:                                         ; preds = %bb8.i.i
    154   %79 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    155   %80 = load i32** %79, align 4
    156   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    157 
    158 bb11.i.i:                                         ; preds = %bb8.i.i
    159   %81 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    160   %82 = load i32** %81, align 4
    161   %83 = getelementptr i32* %82, i64 1
    162   %84 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    163   store i32* %83, i32** %84, align 4
    164   %85 = sub i32 %__trip_count.0.i.i, 1
    165   br label %bb12.i.i
    166 
    167 bb12.i.i:                                         ; preds = %bb11.i.i, %entry
    168   %__trip_count.0.i.i = phi i32 [ %36, %entry ], [ %85, %bb11.i.i ]
    169   %86 = icmp sgt i32 %__trip_count.0.i.i, 0
    170   br i1 %86, label %bb.i.i, label %bb13.i.i
    171 
    172 bb13.i.i:                                         ; preds = %bb12.i.i
    173   %87 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__last_addr.i.i, i32 0, i32 0
    174   %88 = load i32** %87, align 4
    175   %89 = ptrtoint i32* %88 to i32
    176   %90 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    177   %91 = load i32** %90, align 4
    178   %92 = ptrtoint i32* %91 to i32
    179   %93 = sub i32 %89, %92
    180   %94 = ashr i32 %93, 2
    181   switch i32 %94, label %bb26.i.i [
    182     i32 1, label %bb22.i.i
    183     i32 2, label %bb18.i.i
    184     i32 3, label %bb14.i.i
    185   ]
    186 
    187 bb14.i.i:                                         ; preds = %bb13.i.i
    188   %95 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    189   %96 = load i32** %95, align 4
    190   %97 = load i32* %96, align 4
    191   %98 = load i32* %4, align 4
    192   %99 = icmp eq i32 %97, %98
    193   %100 = zext i1 %99 to i8
    194   %toBool15.i.i = icmp ne i8 %100, 0
    195   br i1 %toBool15.i.i, label %bb16.i.i, label %bb17.i.i
    196 
    197 bb16.i.i:                                         ; preds = %bb14.i.i
    198   %101 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    199   %102 = load i32** %101, align 4
    200   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    201 
    202 bb17.i.i:                                         ; preds = %bb14.i.i
    203   %103 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    204   %104 = load i32** %103, align 4
    205   %105 = getelementptr i32* %104, i64 1
    206   %106 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    207   store i32* %105, i32** %106, align 4
    208   br label %bb18.i.i
    209 
    210 bb18.i.i:                                         ; preds = %bb17.i.i, %bb13.i.i
    211   %107 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    212   %108 = load i32** %107, align 4
    213   %109 = load i32* %108, align 4
    214   %110 = load i32* %4, align 4
    215   %111 = icmp eq i32 %109, %110
    216   %112 = zext i1 %111 to i8
    217   %toBool19.i.i = icmp ne i8 %112, 0
    218   br i1 %toBool19.i.i, label %bb20.i.i, label %bb21.i.i
    219 
    220 bb20.i.i:                                         ; preds = %bb18.i.i
    221   %113 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    222   %114 = load i32** %113, align 4
    223   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    224 
    225 bb21.i.i:                                         ; preds = %bb18.i.i
    226   %115 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    227   %116 = load i32** %115, align 4
    228   %117 = getelementptr i32* %116, i64 1
    229   %118 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    230   store i32* %117, i32** %118, align 4
    231   br label %bb22.i.i
    232 
    233 bb22.i.i:                                         ; preds = %bb21.i.i, %bb13.i.i
    234   %119 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    235   %120 = load i32** %119, align 4
    236   %121 = load i32* %120, align 4
    237   %122 = load i32* %4, align 4
    238   %123 = icmp eq i32 %121, %122
    239   %124 = zext i1 %123 to i8
    240   %toBool23.i.i = icmp ne i8 %124, 0
    241   br i1 %toBool23.i.i, label %bb24.i.i, label %bb25.i.i
    242 
    243 bb24.i.i:                                         ; preds = %bb22.i.i
    244   %125 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    245   %126 = load i32** %125, align 4
    246   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    247 
    248 bb25.i.i:                                         ; preds = %bb22.i.i
    249   %127 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    250   %128 = load i32** %127, align 4
    251   %129 = getelementptr i32* %128, i64 1
    252   %130 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__first_addr.i.i, i32 0, i32 0
    253   store i32* %129, i32** %130, align 4
    254   br label %bb26.i.i
    255 
    256 bb26.i.i:                                         ; preds = %bb25.i.i, %bb13.i.i
    257   %131 = getelementptr %"struct.__gnu_cxx::__normal_iterator<int*,std::vector<int, std::allocator<int> > >"* %__last_addr.i.i, i32 0, i32 0
    258   %132 = load i32** %131, align 4
    259   br label %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    260 
    261 _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
    262   %.0.0.i.i = phi i32* [ %132, %bb26.i.i ], [ %126, %bb24.i.i ], [ %114, %bb20.i.i ], [ %102, %bb16.i.i ], [ %80, %bb10.i.i ], [ %68, %bb7.i.i ], [ %56, %bb4.i.i ], [ %44, %bb1.i.i ]
    263   %tmp2.i.i = ptrtoint i32* %.0.0.i.i to i32
    264   %tmp1.i.i = inttoptr i32 %tmp2.i.i to i32*
    265   %tmp4.i = ptrtoint i32* %tmp1.i.i to i32
    266   %tmp3.i = inttoptr i32 %tmp4.i to i32*
    267   %tmp8.i = ptrtoint i32* %tmp3.i to i32
    268   %tmp6.i = inttoptr i32 %tmp8.i to i32*
    269   %tmp12 = ptrtoint i32* %tmp6.i to i32
    270   %tmp10 = inttoptr i32 %tmp12 to i32*
    271   %tmp16 = ptrtoint i32* %tmp10 to i32
    272   br label %return
    273 
    274 return:                                           ; preds = %_ZSt4findIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiET_S7_S7_RKT0_.exit
    275   %tmp14 = inttoptr i32 %tmp16 to i32*
    276   ret i32* %tmp14
    277 }
    278 
    279 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
    280