1; REQUIRES: arm-registered-target 2; RUN: opt -S -loop-reduce %s -o - | FileCheck %s 3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5target triple = "armv8-unknown-hurd-eabihf" 6 7%"class.std::__1::vector.182" = type { %"class.std::__1::__vector_base.183" } 8%"class.std::__1::__vector_base.183" = type { i8*, i8*, %"class.std::__1::__compressed_pair.184" } 9%"class.std::__1::__compressed_pair.184" = type { %"struct.std::__1::__compressed_pair_elem.185" } 10%"struct.std::__1::__compressed_pair_elem.185" = type { i8* } 11%"class.std::__1::__vector_base_common" = type { i8 } 12 13$vector_insert = comdat any 14 15declare i8* @Allocate(i32) local_unnamed_addr 16declare void @Free(i8*) local_unnamed_addr 17declare void @_ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv(%"class.std::__1::__vector_base_common"*) local_unnamed_addr 18declare i8* @memmove(i8*, i8*, i32) local_unnamed_addr 19 20; Function Attrs: noimplicitfloat nounwind uwtable 21define linkonce_odr i32 @vector_insert(%"class.std::__1::vector.182"*, [1 x i32], i8*, i8*) local_unnamed_addr #1 comdat align 2 { 22; CHECK-LABEL: vector_insert 23 %5 = extractvalue [1 x i32] %1, 0 24 %6 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 0 25 %7 = load i8*, i8** %6, align 4 26; CHECK: [[LOAD:%[0-9]+]] = load i8*, i8** 27 %8 = bitcast %"class.std::__1::vector.182"* %0 to i32* 28 %9 = ptrtoint i8* %7 to i32 29; CHECK: [[NEW_CAST:%[0-9]+]] = ptrtoint i8* [[LOAD]] to i32 30; CHECK: [[OLD_CAST:%[0-9]+]] = ptrtoint i8* [[LOAD]] to i32 31 %10 = sub i32 %5, %9 32 %11 = getelementptr inbounds i8, i8* %7, i32 %10 33 %12 = ptrtoint i8* %3 to i32 34 %13 = ptrtoint i8* %2 to i32 35 %14 = sub i32 %12, %13 36 %15 = icmp sgt i32 %14, 0 37 br i1 %15, label %18, label %16 38 39; <label>:16: ; preds = %4 40 %17 = ptrtoint i8* %11 to i32 41 br label %148 42 43; <label>:18: ; preds = %4 44 %19 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 2, i32 0, i32 0 45 %20 = bitcast i8** %19 to i32* 46 %21 = load i32, i32* %20, align 4 47 %22 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 1 48 %23 = load i8*, i8** %22, align 4 49 %24 = ptrtoint i8* %23 to i32 50 %25 = sub i32 %21, %24 51 %26 = icmp sgt i32 %14, %25 52 %27 = bitcast i8** %22 to i32* 53 br i1 %26, label %77, label %28 54 55; <label>:28: ; preds = %18 56 %29 = ptrtoint i8* %11 to i32 57 %30 = sub i32 %24, %29 58 %31 = icmp sgt i32 %14, %30 59 br i1 %31, label %32, label %48 60 61; <label>:32: ; preds = %28 62 %33 = getelementptr inbounds i8, i8* %2, i32 %30 63 %34 = icmp eq i8* %33, %3 64 br i1 %34, label %43, label %35 65 66; <label>:35: ; preds = %32, %35 67 %36 = phi i8* [ %41, %35 ], [ %23, %32 ] 68 %37 = phi i8* [ %39, %35 ], [ %33, %32 ] 69 %38 = load i8, i8* %37, align 1 70 store i8 %38, i8* %36, align 1 71 %39 = getelementptr inbounds i8, i8* %37, i32 1 72 %40 = load i8*, i8** %22, align 4 73 %41 = getelementptr inbounds i8, i8* %40, i32 1 74 store i8* %41, i8** %22, align 4 75 %42 = icmp eq i8* %39, %3 76 br i1 %42, label %43, label %35 77 78; <label>:43: ; preds = %35, %32 79 %44 = phi i8* [ %23, %32 ], [ %41, %35 ] 80 %45 = icmp sgt i32 %30, 0 81 br i1 %45, label %46, label %148 82 83; <label>:46: ; preds = %43 84 %47 = ptrtoint i8* %44 to i32 85 br label %48 86 87; <label>:48: ; preds = %46, %28 88 %49 = phi i32 [ %47, %46 ], [ %24, %28 ] 89 %50 = phi i8* [ %44, %46 ], [ %23, %28 ] 90 %51 = phi i8* [ %33, %46 ], [ %3, %28 ] 91 %52 = getelementptr inbounds i8, i8* %11, i32 %14 92 %53 = ptrtoint i8* %52 to i32 93 %54 = sub i32 %49, %53 94 %55 = getelementptr inbounds i8, i8* %11, i32 %54 95 %56 = icmp ult i8* %55, %23 96 br i1 %56, label %63, label %57 97 98; <label>:57: ; preds = %63, %48 99 %58 = icmp eq i32 %54, 0 100 br i1 %58, label %71, label %59 101 102; <label>:59: ; preds = %57 103 %60 = sub i32 0, %54 104 %61 = getelementptr inbounds i8, i8* %50, i32 %60 105 %62 = tail call i8* @memmove(i8* %61, i8* %11, i32 %54) #13 106 br label %71 107 108; <label>:63: ; preds = %48, %63 109 %64 = phi i8* [ %69, %63 ], [ %50, %48 ] 110 %65 = phi i8* [ %67, %63 ], [ %55, %48 ] 111 %66 = load i8, i8* %65, align 1 112 store i8 %66, i8* %64, align 1 113 %67 = getelementptr inbounds i8, i8* %65, i32 1 114 %68 = load i8*, i8** %22, align 4 115 %69 = getelementptr inbounds i8, i8* %68, i32 1 116 store i8* %69, i8** %22, align 4 117 %70 = icmp eq i8* %67, %23 118 br i1 %70, label %57, label %63 119 120; <label>:71: ; preds = %57, %59 121 %72 = ptrtoint i8* %51 to i32 122 %73 = sub i32 %72, %13 123 %74 = icmp eq i32 %73, 0 124 br i1 %74, label %148, label %75 125 126; <label>:75: ; preds = %71 127 %76 = tail call i8* @memmove(i8* %11, i8* %2, i32 %73) #13 128 br label %148 129 130; <label>:77: ; preds = %18 131 %78 = sub i32 %24, %9 132 %79 = add i32 %78, %14 133 %80 = icmp slt i32 %79, 0 134 br i1 %80, label %81, label %83 135 136; <label>:81: ; preds = %77 137 %82 = bitcast %"class.std::__1::vector.182"* %0 to %"class.std::__1::__vector_base_common"* 138 tail call void @_ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv(%"class.std::__1::__vector_base_common"* %82) #15 139 unreachable 140 141; <label>:83: ; preds = %77 142 %84 = sub i32 %21, %9 143 %85 = icmp ult i32 %84, 1073741823 144 br i1 %85, label %86, label %91 145 146; <label>:86: ; preds = %83 147 %87 = shl i32 %84, 1 148 %88 = icmp ult i32 %87, %79 149 %89 = select i1 %88, i32 %79, i32 %87 150 %90 = icmp eq i32 %89, 0 151 br i1 %90, label %94, label %91 152 153; <label>:91: ; preds = %83, %86 154 %92 = phi i32 [ %89, %86 ], [ 2147483647, %83 ] 155 %93 = tail call i8* @Allocate(i32 %92) #13 156 br label %94 157 158; <label>:94: ; preds = %86, %91 159 %95 = phi i32 [ %92, %91 ], [ 0, %86 ] 160 %96 = phi i8* [ %93, %91 ], [ null, %86 ] 161 %97 = getelementptr inbounds i8, i8* %96, i32 %10 162 %98 = ptrtoint i8* %97 to i32 163 %99 = getelementptr inbounds i8, i8* %96, i32 %95 164 %100 = ptrtoint i8* %99 to i32 165 %101 = icmp eq i8* %2, %3 166 br i1 %101, label %111, label %102 167 168; <label>:102: ; preds = %94, %102 169 %103 = phi i8* [ %106, %102 ], [ %97, %94 ] 170 %104 = phi i8* [ %107, %102 ], [ %2, %94 ] 171 %105 = load i8, i8* %104, align 1 172 store i8 %105, i8* %103, align 1 173 %106 = getelementptr inbounds i8, i8* %103, i32 1 174 %107 = getelementptr inbounds i8, i8* %104, i32 1 175 %108 = icmp eq i8* %107, %3 176 br i1 %108, label %109, label %102 177 178; <label>:109: ; preds = %102 179 %110 = ptrtoint i8* %106 to i32 180 br label %111 181 182; <label>:111: ; preds = %109, %94 183 %112 = phi i32 [ %98, %94 ], [ %110, %109 ] 184 %113 = load i8*, i8** %6, align 4 185 %114 = icmp eq i8* %113, %11 186 br i1 %114, label %124, label %115 187 188; CHECK-LABEL: .preheader: 189; CHECK-NEXT: sub i32 [[OLD_CAST]], [[NEW_CAST]] 190; <label>:115: ; preds = %111, %115 191 %116 = phi i8* [ %118, %115 ], [ %97, %111 ] 192 %117 = phi i8* [ %119, %115 ], [ %11, %111 ] 193 %118 = getelementptr inbounds i8, i8* %116, i32 -1 194 %119 = getelementptr inbounds i8, i8* %117, i32 -1 195 %120 = load i8, i8* %119, align 1 196 store i8 %120, i8* %118, align 1 197 %121 = icmp eq i8* %119, %113 198 br i1 %121, label %122, label %115 199 200; <label>:122: ; preds = %115 201 %123 = ptrtoint i8* %118 to i32 202 br label %124 203 204; <label>:124: ; preds = %122, %111 205 %125 = phi i32 [ %98, %111 ], [ %123, %122 ] 206 %126 = phi i8* [ %97, %111 ], [ %118, %122 ] 207 %127 = load i8*, i8** %22, align 4 208 %128 = icmp eq i8* %127, %11 209 br i1 %128, label %129, label %131 210 211; <label>:129: ; preds = %124 212 %130 = ptrtoint i8* %126 to i32 213 br label %142 214 215; <label>:131: ; preds = %124 216 %132 = inttoptr i32 %112 to i8* 217 br label %133 218 219; <label>:133: ; preds = %133, %131 220 %134 = phi i8* [ %138, %133 ], [ %132, %131 ] 221 %135 = phi i8* [ %137, %133 ], [ %11, %131 ] 222 %136 = load i8, i8* %135, align 1 223 store i8 %136, i8* %134, align 1 224 %137 = getelementptr inbounds i8, i8* %135, i32 1 225 %138 = getelementptr inbounds i8, i8* %134, i32 1 226 %139 = icmp eq i8* %137, %127 227 br i1 %139, label %140, label %133 228 229; <label>:140: ; preds = %133 230 %141 = ptrtoint i8* %138 to i32 231 br label %142 232 233; <label>:142: ; preds = %140, %129 234 %143 = phi i32 [ %112, %129 ], [ %141, %140 ] 235 %144 = phi i32 [ %130, %129 ], [ %125, %140 ] 236 %145 = load i8*, i8** %6, align 4 237 store i32 %144, i32* %8, align 4 238 store i32 %143, i32* %27, align 4 239 store i32 %100, i32* %20, align 4 240 %146 = icmp eq i8* %145, null 241 br i1 %146, label %148, label %147 242 243; <label>:147: ; preds = %142 244 tail call void @Free(i8* nonnull %145) #13 245 br label %148 246 247; <label>:148: ; preds = %16, %147, %142, %43, %71, %75 248 %149 = phi i32 [ %17, %16 ], [ %98, %147 ], [ %98, %142 ], [ %29, %43 ], [ %29, %71 ], [ %29, %75 ] 249 ret i32 %149 250} 251 252