1; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output < %s 2>&1 | FileCheck %s 2; REQUIRES: asserts 3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 5target triple = "thumbv8.1m.main-arm-none-eabi" 6 7; Trip count of 5 - shouldn't be vectorized. 8; CHECK-LABEL: tripcount5 9; CHECK: LV: Selecting VF: 1 10define void @tripcount5(ptr nocapture readonly %in, ptr nocapture %out, ptr nocapture readonly %consts, i32 %n) #0 { 11entry: 12 %arrayidx20 = getelementptr inbounds i32, ptr %out, i32 1 13 %arrayidx38 = getelementptr inbounds i32, ptr %out, i32 2 14 %arrayidx56 = getelementptr inbounds i32, ptr %out, i32 3 15 %arrayidx74 = getelementptr inbounds i32, ptr %out, i32 4 16 %arrayidx92 = getelementptr inbounds i32, ptr %out, i32 5 17 %arrayidx110 = getelementptr inbounds i32, ptr %out, i32 6 18 %arrayidx128 = getelementptr inbounds i32, ptr %out, i32 7 19 %out.promoted = load i32, ptr %out, align 4 20 %arrayidx20.promoted = load i32, ptr %arrayidx20, align 4 21 %arrayidx38.promoted = load i32, ptr %arrayidx38, align 4 22 %arrayidx56.promoted = load i32, ptr %arrayidx56, align 4 23 %arrayidx74.promoted = load i32, ptr %arrayidx74, align 4 24 %arrayidx92.promoted = load i32, ptr %arrayidx92, align 4 25 %arrayidx110.promoted = load i32, ptr %arrayidx110, align 4 26 %arrayidx128.promoted = load i32, ptr %arrayidx128, align 4 27 br label %for.body 28 29for.cond.cleanup: ; preds = %for.body 30 store i32 %add12, ptr %out, align 4 31 store i32 %add30, ptr %arrayidx20, align 4 32 store i32 %add48, ptr %arrayidx38, align 4 33 store i32 %add66, ptr %arrayidx56, align 4 34 store i32 %add84, ptr %arrayidx74, align 4 35 store i32 %add102, ptr %arrayidx92, align 4 36 store i32 %add120, ptr %arrayidx110, align 4 37 store i32 %add138, ptr %arrayidx128, align 4 38 ret void 39 40for.body: ; preds = %entry, %for.body 41 %hop.0236 = phi i32 [ 0, %entry ], [ %add139, %for.body ] 42 %add12220235 = phi i32 [ %out.promoted, %entry ], [ %add12, %for.body ] 43 %add30221234 = phi i32 [ %arrayidx20.promoted, %entry ], [ %add30, %for.body ] 44 %add48222233 = phi i32 [ %arrayidx38.promoted, %entry ], [ %add48, %for.body ] 45 %add66223232 = phi i32 [ %arrayidx56.promoted, %entry ], [ %add66, %for.body ] 46 %add84224231 = phi i32 [ %arrayidx74.promoted, %entry ], [ %add84, %for.body ] 47 %add102225230 = phi i32 [ %arrayidx92.promoted, %entry ], [ %add102, %for.body ] 48 %add120226229 = phi i32 [ %arrayidx110.promoted, %entry ], [ %add120, %for.body ] 49 %add138227228 = phi i32 [ %arrayidx128.promoted, %entry ], [ %add138, %for.body ] 50 %arrayidx = getelementptr inbounds i16, ptr %in, i32 %hop.0236 51 %0 = load i16, ptr %arrayidx, align 2 52 %conv = sext i16 %0 to i32 53 %arrayidx1 = getelementptr inbounds i16, ptr %consts, i32 %hop.0236 54 %1 = load i16, ptr %arrayidx1, align 2 55 %conv2 = sext i16 %1 to i32 56 %mul = mul nsw i32 %conv2, %conv 57 %add = add nsw i32 %mul, %add12220235 58 %add4 = or i32 %hop.0236, 1 59 %arrayidx5 = getelementptr inbounds i16, ptr %in, i32 %add4 60 %2 = load i16, ptr %arrayidx5, align 2 61 %conv6 = sext i16 %2 to i32 62 %arrayidx8 = getelementptr inbounds i16, ptr %consts, i32 %add4 63 %3 = load i16, ptr %arrayidx8, align 2 64 %conv9 = sext i16 %3 to i32 65 %mul10 = mul nsw i32 %conv9, %conv6 66 %add12 = add nsw i32 %mul10, %add 67 %add13 = or i32 %hop.0236, 2 68 %arrayidx14 = getelementptr inbounds i16, ptr %in, i32 %add13 69 %4 = load i16, ptr %arrayidx14, align 2 70 %conv15 = sext i16 %4 to i32 71 %arrayidx17 = getelementptr inbounds i16, ptr %consts, i32 %add13 72 %5 = load i16, ptr %arrayidx17, align 2 73 %conv18 = sext i16 %5 to i32 74 %mul19 = mul nsw i32 %conv18, %conv15 75 %add21 = add nsw i32 %mul19, %add30221234 76 %add22 = or i32 %hop.0236, 3 77 %arrayidx23 = getelementptr inbounds i16, ptr %in, i32 %add22 78 %6 = load i16, ptr %arrayidx23, align 2 79 %conv24 = sext i16 %6 to i32 80 %arrayidx26 = getelementptr inbounds i16, ptr %consts, i32 %add22 81 %7 = load i16, ptr %arrayidx26, align 2 82 %conv27 = sext i16 %7 to i32 83 %mul28 = mul nsw i32 %conv27, %conv24 84 %add30 = add nsw i32 %mul28, %add21 85 %add31 = or i32 %hop.0236, 4 86 %arrayidx32 = getelementptr inbounds i16, ptr %in, i32 %add31 87 %8 = load i16, ptr %arrayidx32, align 2 88 %conv33 = sext i16 %8 to i32 89 %arrayidx35 = getelementptr inbounds i16, ptr %consts, i32 %add31 90 %9 = load i16, ptr %arrayidx35, align 2 91 %conv36 = sext i16 %9 to i32 92 %mul37 = mul nsw i32 %conv36, %conv33 93 %add39 = add nsw i32 %mul37, %add48222233 94 %add40 = or i32 %hop.0236, 5 95 %arrayidx41 = getelementptr inbounds i16, ptr %in, i32 %add40 96 %10 = load i16, ptr %arrayidx41, align 2 97 %conv42 = sext i16 %10 to i32 98 %arrayidx44 = getelementptr inbounds i16, ptr %consts, i32 %add40 99 %11 = load i16, ptr %arrayidx44, align 2 100 %conv45 = sext i16 %11 to i32 101 %mul46 = mul nsw i32 %conv45, %conv42 102 %add48 = add nsw i32 %mul46, %add39 103 %add49 = or i32 %hop.0236, 6 104 %arrayidx50 = getelementptr inbounds i16, ptr %in, i32 %add49 105 %12 = load i16, ptr %arrayidx50, align 2 106 %conv51 = sext i16 %12 to i32 107 %arrayidx53 = getelementptr inbounds i16, ptr %consts, i32 %add49 108 %13 = load i16, ptr %arrayidx53, align 2 109 %conv54 = sext i16 %13 to i32 110 %mul55 = mul nsw i32 %conv54, %conv51 111 %add57 = add nsw i32 %mul55, %add66223232 112 %add58 = or i32 %hop.0236, 7 113 %arrayidx59 = getelementptr inbounds i16, ptr %in, i32 %add58 114 %14 = load i16, ptr %arrayidx59, align 2 115 %conv60 = sext i16 %14 to i32 116 %arrayidx62 = getelementptr inbounds i16, ptr %consts, i32 %add58 117 %15 = load i16, ptr %arrayidx62, align 2 118 %conv63 = sext i16 %15 to i32 119 %mul64 = mul nsw i32 %conv63, %conv60 120 %add66 = add nsw i32 %mul64, %add57 121 %add67 = or i32 %hop.0236, 8 122 %arrayidx68 = getelementptr inbounds i16, ptr %in, i32 %add67 123 %16 = load i16, ptr %arrayidx68, align 2 124 %conv69 = sext i16 %16 to i32 125 %arrayidx71 = getelementptr inbounds i16, ptr %consts, i32 %add67 126 %17 = load i16, ptr %arrayidx71, align 2 127 %conv72 = sext i16 %17 to i32 128 %mul73 = mul nsw i32 %conv72, %conv69 129 %add75 = add nsw i32 %mul73, %add84224231 130 %add76 = or i32 %hop.0236, 9 131 %arrayidx77 = getelementptr inbounds i16, ptr %in, i32 %add76 132 %18 = load i16, ptr %arrayidx77, align 2 133 %conv78 = sext i16 %18 to i32 134 %arrayidx80 = getelementptr inbounds i16, ptr %consts, i32 %add76 135 %19 = load i16, ptr %arrayidx80, align 2 136 %conv81 = sext i16 %19 to i32 137 %mul82 = mul nsw i32 %conv81, %conv78 138 %add84 = add nsw i32 %mul82, %add75 139 %add85 = or i32 %hop.0236, 10 140 %arrayidx86 = getelementptr inbounds i16, ptr %in, i32 %add85 141 %20 = load i16, ptr %arrayidx86, align 2 142 %conv87 = sext i16 %20 to i32 143 %arrayidx89 = getelementptr inbounds i16, ptr %consts, i32 %add85 144 %21 = load i16, ptr %arrayidx89, align 2 145 %conv90 = sext i16 %21 to i32 146 %mul91 = mul nsw i32 %conv90, %conv87 147 %add93 = add nsw i32 %mul91, %add102225230 148 %add94 = or i32 %hop.0236, 11 149 %arrayidx95 = getelementptr inbounds i16, ptr %in, i32 %add94 150 %22 = load i16, ptr %arrayidx95, align 2 151 %conv96 = sext i16 %22 to i32 152 %arrayidx98 = getelementptr inbounds i16, ptr %consts, i32 %add94 153 %23 = load i16, ptr %arrayidx98, align 2 154 %conv99 = sext i16 %23 to i32 155 %mul100 = mul nsw i32 %conv99, %conv96 156 %add102 = add nsw i32 %mul100, %add93 157 %add103 = or i32 %hop.0236, 12 158 %arrayidx104 = getelementptr inbounds i16, ptr %in, i32 %add103 159 %24 = load i16, ptr %arrayidx104, align 2 160 %conv105 = sext i16 %24 to i32 161 %arrayidx107 = getelementptr inbounds i16, ptr %consts, i32 %add103 162 %25 = load i16, ptr %arrayidx107, align 2 163 %conv108 = sext i16 %25 to i32 164 %mul109 = mul nsw i32 %conv108, %conv105 165 %add111 = add nsw i32 %mul109, %add120226229 166 %add112 = or i32 %hop.0236, 13 167 %arrayidx113 = getelementptr inbounds i16, ptr %in, i32 %add112 168 %26 = load i16, ptr %arrayidx113, align 2 169 %conv114 = sext i16 %26 to i32 170 %arrayidx116 = getelementptr inbounds i16, ptr %consts, i32 %add112 171 %27 = load i16, ptr %arrayidx116, align 2 172 %conv117 = sext i16 %27 to i32 173 %mul118 = mul nsw i32 %conv117, %conv114 174 %add120 = add nsw i32 %mul118, %add111 175 %add121 = or i32 %hop.0236, 14 176 %arrayidx122 = getelementptr inbounds i16, ptr %in, i32 %add121 177 %28 = load i16, ptr %arrayidx122, align 2 178 %conv123 = sext i16 %28 to i32 179 %arrayidx125 = getelementptr inbounds i16, ptr %consts, i32 %add121 180 %29 = load i16, ptr %arrayidx125, align 2 181 %conv126 = sext i16 %29 to i32 182 %mul127 = mul nsw i32 %conv126, %conv123 183 %add129 = add nsw i32 %mul127, %add138227228 184 %add130 = or i32 %hop.0236, 15 185 %arrayidx131 = getelementptr inbounds i16, ptr %in, i32 %add130 186 %30 = load i16, ptr %arrayidx131, align 2 187 %conv132 = sext i16 %30 to i32 188 %arrayidx134 = getelementptr inbounds i16, ptr %consts, i32 %add130 189 %31 = load i16, ptr %arrayidx134, align 2 190 %conv135 = sext i16 %31 to i32 191 %mul136 = mul nsw i32 %conv135, %conv132 192 %add138 = add nsw i32 %mul136, %add129 193 %add139 = add nuw nsw i32 %hop.0236, 16 194 %cmp = icmp ult i32 %hop.0236, 64 195 br i1 %cmp, label %for.body, label %for.cond.cleanup 196} 197 198; Trip count of 8 - does get vectorized 199; CHECK-LABEL: tripcount8 200; CHECK: LV: Selecting VF: 4 201define void @tripcount8(ptr nocapture readonly %in, ptr nocapture %out, ptr nocapture readonly %consts, i32 %n) #0 { 202entry: 203 %arrayidx20 = getelementptr inbounds i32, ptr %out, i32 1 204 %arrayidx38 = getelementptr inbounds i32, ptr %out, i32 2 205 %arrayidx56 = getelementptr inbounds i32, ptr %out, i32 3 206 %arrayidx74 = getelementptr inbounds i32, ptr %out, i32 4 207 %arrayidx92 = getelementptr inbounds i32, ptr %out, i32 5 208 %arrayidx110 = getelementptr inbounds i32, ptr %out, i32 6 209 %arrayidx128 = getelementptr inbounds i32, ptr %out, i32 7 210 %out.promoted = load i32, ptr %out, align 4 211 %arrayidx20.promoted = load i32, ptr %arrayidx20, align 4 212 %arrayidx38.promoted = load i32, ptr %arrayidx38, align 4 213 %arrayidx56.promoted = load i32, ptr %arrayidx56, align 4 214 %arrayidx74.promoted = load i32, ptr %arrayidx74, align 4 215 %arrayidx92.promoted = load i32, ptr %arrayidx92, align 4 216 %arrayidx110.promoted = load i32, ptr %arrayidx110, align 4 217 %arrayidx128.promoted = load i32, ptr %arrayidx128, align 4 218 br label %for.body 219 220for.cond.cleanup: ; preds = %for.body 221 store i32 %add12, ptr %out, align 4 222 store i32 %add30, ptr %arrayidx20, align 4 223 store i32 %add48, ptr %arrayidx38, align 4 224 store i32 %add66, ptr %arrayidx56, align 4 225 store i32 %add84, ptr %arrayidx74, align 4 226 store i32 %add102, ptr %arrayidx92, align 4 227 store i32 %add120, ptr %arrayidx110, align 4 228 store i32 %add138, ptr %arrayidx128, align 4 229 ret void 230 231for.body: ; preds = %entry, %for.body 232 %hop.0236 = phi i32 [ 0, %entry ], [ %add139, %for.body ] 233 %add12220235 = phi i32 [ %out.promoted, %entry ], [ %add12, %for.body ] 234 %add30221234 = phi i32 [ %arrayidx20.promoted, %entry ], [ %add30, %for.body ] 235 %add48222233 = phi i32 [ %arrayidx38.promoted, %entry ], [ %add48, %for.body ] 236 %add66223232 = phi i32 [ %arrayidx56.promoted, %entry ], [ %add66, %for.body ] 237 %add84224231 = phi i32 [ %arrayidx74.promoted, %entry ], [ %add84, %for.body ] 238 %add102225230 = phi i32 [ %arrayidx92.promoted, %entry ], [ %add102, %for.body ] 239 %add120226229 = phi i32 [ %arrayidx110.promoted, %entry ], [ %add120, %for.body ] 240 %add138227228 = phi i32 [ %arrayidx128.promoted, %entry ], [ %add138, %for.body ] 241 %arrayidx = getelementptr inbounds i16, ptr %in, i32 %hop.0236 242 %0 = load i16, ptr %arrayidx, align 2 243 %conv = sext i16 %0 to i32 244 %arrayidx1 = getelementptr inbounds i16, ptr %consts, i32 %hop.0236 245 %1 = load i16, ptr %arrayidx1, align 2 246 %conv2 = sext i16 %1 to i32 247 %mul = mul nsw i32 %conv2, %conv 248 %add = add nsw i32 %mul, %add12220235 249 %add4 = or i32 %hop.0236, 1 250 %arrayidx5 = getelementptr inbounds i16, ptr %in, i32 %add4 251 %2 = load i16, ptr %arrayidx5, align 2 252 %conv6 = sext i16 %2 to i32 253 %arrayidx8 = getelementptr inbounds i16, ptr %consts, i32 %add4 254 %3 = load i16, ptr %arrayidx8, align 2 255 %conv9 = sext i16 %3 to i32 256 %mul10 = mul nsw i32 %conv9, %conv6 257 %add12 = add nsw i32 %mul10, %add 258 %add13 = or i32 %hop.0236, 2 259 %arrayidx14 = getelementptr inbounds i16, ptr %in, i32 %add13 260 %4 = load i16, ptr %arrayidx14, align 2 261 %conv15 = sext i16 %4 to i32 262 %arrayidx17 = getelementptr inbounds i16, ptr %consts, i32 %add13 263 %5 = load i16, ptr %arrayidx17, align 2 264 %conv18 = sext i16 %5 to i32 265 %mul19 = mul nsw i32 %conv18, %conv15 266 %add21 = add nsw i32 %mul19, %add30221234 267 %add22 = or i32 %hop.0236, 3 268 %arrayidx23 = getelementptr inbounds i16, ptr %in, i32 %add22 269 %6 = load i16, ptr %arrayidx23, align 2 270 %conv24 = sext i16 %6 to i32 271 %arrayidx26 = getelementptr inbounds i16, ptr %consts, i32 %add22 272 %7 = load i16, ptr %arrayidx26, align 2 273 %conv27 = sext i16 %7 to i32 274 %mul28 = mul nsw i32 %conv27, %conv24 275 %add30 = add nsw i32 %mul28, %add21 276 %add31 = or i32 %hop.0236, 4 277 %arrayidx32 = getelementptr inbounds i16, ptr %in, i32 %add31 278 %8 = load i16, ptr %arrayidx32, align 2 279 %conv33 = sext i16 %8 to i32 280 %arrayidx35 = getelementptr inbounds i16, ptr %consts, i32 %add31 281 %9 = load i16, ptr %arrayidx35, align 2 282 %conv36 = sext i16 %9 to i32 283 %mul37 = mul nsw i32 %conv36, %conv33 284 %add39 = add nsw i32 %mul37, %add48222233 285 %add40 = or i32 %hop.0236, 5 286 %arrayidx41 = getelementptr inbounds i16, ptr %in, i32 %add40 287 %10 = load i16, ptr %arrayidx41, align 2 288 %conv42 = sext i16 %10 to i32 289 %arrayidx44 = getelementptr inbounds i16, ptr %consts, i32 %add40 290 %11 = load i16, ptr %arrayidx44, align 2 291 %conv45 = sext i16 %11 to i32 292 %mul46 = mul nsw i32 %conv45, %conv42 293 %add48 = add nsw i32 %mul46, %add39 294 %add49 = or i32 %hop.0236, 6 295 %arrayidx50 = getelementptr inbounds i16, ptr %in, i32 %add49 296 %12 = load i16, ptr %arrayidx50, align 2 297 %conv51 = sext i16 %12 to i32 298 %arrayidx53 = getelementptr inbounds i16, ptr %consts, i32 %add49 299 %13 = load i16, ptr %arrayidx53, align 2 300 %conv54 = sext i16 %13 to i32 301 %mul55 = mul nsw i32 %conv54, %conv51 302 %add57 = add nsw i32 %mul55, %add66223232 303 %add58 = or i32 %hop.0236, 7 304 %arrayidx59 = getelementptr inbounds i16, ptr %in, i32 %add58 305 %14 = load i16, ptr %arrayidx59, align 2 306 %conv60 = sext i16 %14 to i32 307 %arrayidx62 = getelementptr inbounds i16, ptr %consts, i32 %add58 308 %15 = load i16, ptr %arrayidx62, align 2 309 %conv63 = sext i16 %15 to i32 310 %mul64 = mul nsw i32 %conv63, %conv60 311 %add66 = add nsw i32 %mul64, %add57 312 %add67 = or i32 %hop.0236, 8 313 %arrayidx68 = getelementptr inbounds i16, ptr %in, i32 %add67 314 %16 = load i16, ptr %arrayidx68, align 2 315 %conv69 = sext i16 %16 to i32 316 %arrayidx71 = getelementptr inbounds i16, ptr %consts, i32 %add67 317 %17 = load i16, ptr %arrayidx71, align 2 318 %conv72 = sext i16 %17 to i32 319 %mul73 = mul nsw i32 %conv72, %conv69 320 %add75 = add nsw i32 %mul73, %add84224231 321 %add76 = or i32 %hop.0236, 9 322 %arrayidx77 = getelementptr inbounds i16, ptr %in, i32 %add76 323 %18 = load i16, ptr %arrayidx77, align 2 324 %conv78 = sext i16 %18 to i32 325 %arrayidx80 = getelementptr inbounds i16, ptr %consts, i32 %add76 326 %19 = load i16, ptr %arrayidx80, align 2 327 %conv81 = sext i16 %19 to i32 328 %mul82 = mul nsw i32 %conv81, %conv78 329 %add84 = add nsw i32 %mul82, %add75 330 %add85 = or i32 %hop.0236, 10 331 %arrayidx86 = getelementptr inbounds i16, ptr %in, i32 %add85 332 %20 = load i16, ptr %arrayidx86, align 2 333 %conv87 = sext i16 %20 to i32 334 %arrayidx89 = getelementptr inbounds i16, ptr %consts, i32 %add85 335 %21 = load i16, ptr %arrayidx89, align 2 336 %conv90 = sext i16 %21 to i32 337 %mul91 = mul nsw i32 %conv90, %conv87 338 %add93 = add nsw i32 %mul91, %add102225230 339 %add94 = or i32 %hop.0236, 11 340 %arrayidx95 = getelementptr inbounds i16, ptr %in, i32 %add94 341 %22 = load i16, ptr %arrayidx95, align 2 342 %conv96 = sext i16 %22 to i32 343 %arrayidx98 = getelementptr inbounds i16, ptr %consts, i32 %add94 344 %23 = load i16, ptr %arrayidx98, align 2 345 %conv99 = sext i16 %23 to i32 346 %mul100 = mul nsw i32 %conv99, %conv96 347 %add102 = add nsw i32 %mul100, %add93 348 %add103 = or i32 %hop.0236, 12 349 %arrayidx104 = getelementptr inbounds i16, ptr %in, i32 %add103 350 %24 = load i16, ptr %arrayidx104, align 2 351 %conv105 = sext i16 %24 to i32 352 %arrayidx107 = getelementptr inbounds i16, ptr %consts, i32 %add103 353 %25 = load i16, ptr %arrayidx107, align 2 354 %conv108 = sext i16 %25 to i32 355 %mul109 = mul nsw i32 %conv108, %conv105 356 %add111 = add nsw i32 %mul109, %add120226229 357 %add112 = or i32 %hop.0236, 13 358 %arrayidx113 = getelementptr inbounds i16, ptr %in, i32 %add112 359 %26 = load i16, ptr %arrayidx113, align 2 360 %conv114 = sext i16 %26 to i32 361 %arrayidx116 = getelementptr inbounds i16, ptr %consts, i32 %add112 362 %27 = load i16, ptr %arrayidx116, align 2 363 %conv117 = sext i16 %27 to i32 364 %mul118 = mul nsw i32 %conv117, %conv114 365 %add120 = add nsw i32 %mul118, %add111 366 %add121 = or i32 %hop.0236, 14 367 %arrayidx122 = getelementptr inbounds i16, ptr %in, i32 %add121 368 %28 = load i16, ptr %arrayidx122, align 2 369 %conv123 = sext i16 %28 to i32 370 %arrayidx125 = getelementptr inbounds i16, ptr %consts, i32 %add121 371 %29 = load i16, ptr %arrayidx125, align 2 372 %conv126 = sext i16 %29 to i32 373 %mul127 = mul nsw i32 %conv126, %conv123 374 %add129 = add nsw i32 %mul127, %add138227228 375 %add130 = or i32 %hop.0236, 15 376 %arrayidx131 = getelementptr inbounds i16, ptr %in, i32 %add130 377 %30 = load i16, ptr %arrayidx131, align 2 378 %conv132 = sext i16 %30 to i32 379 %arrayidx134 = getelementptr inbounds i16, ptr %consts, i32 %add130 380 %31 = load i16, ptr %arrayidx134, align 2 381 %conv135 = sext i16 %31 to i32 382 %mul136 = mul nsw i32 %conv135, %conv132 383 %add138 = add nsw i32 %mul136, %add129 384 %add139 = add nuw nsw i32 %hop.0236, 16 385 %cmp = icmp ult i32 %hop.0236, 112 386 br i1 %cmp, label %for.body, label %for.cond.cleanup 387} 388 389; Larger example with predication that should also not be vectorized 390; CHECK-LABEL: predicated_test 391; CHECK: LV: Selecting VF: 1 392; CHECK: LV: Selecting VF: 1 393define dso_local i32 @predicated_test(i32 noundef %0, ptr %glob) #0 { 394 %2 = alloca [101 x i32], align 4 395 %3 = alloca [21 x i32], align 4 396 call void @llvm.lifetime.start.p0(i64 404, ptr nonnull %2) 397 call void @llvm.lifetime.start.p0(i64 84, ptr nonnull %3) 398 %4 = icmp sgt i32 %0, 0 399 br i1 %4, label %5, label %159 400 4015: ; preds = %1 402 %6 = getelementptr inbounds [21 x i32], ptr %3, i32 0, i32 5 403 br label %7 404 4057: ; preds = %5, %155 406 %8 = phi i32 [ %10, %155 ], [ undef, %5 ] 407 %9 = phi i32 [ %156, %155 ], [ 0, %5 ] 408 %10 = shl i32 %8, 4 409 store i32 %10, ptr %6, align 4 410 br label %11 411 41211: ; preds = %7, %152 413 %12 = phi i32 [ 0, %7 ], [ %153, %152 ] 414 %13 = lshr i32 %12, 3 415 %14 = getelementptr inbounds [21 x i32], ptr %3, i32 0, i32 %13 416 %15 = load i32, ptr %14, align 4 417 %16 = shl nuw nsw i32 %12, 2 418 %17 = and i32 %16, 28 419 %18 = ashr i32 %15, %17 420 %19 = and i32 %18, 15 421 %20 = mul nuw nsw i32 %19, 5 422 %21 = add nuw nsw i32 %20, 5 423 %22 = getelementptr inbounds i32, ptr %glob, i32 %21 424 %23 = mul nuw nsw i32 %12, 5 425 br label %24 426 42724: ; preds = %11, %78 428 %25 = phi i32 [ 0, %11 ], [ %79, %78 ] 429 %26 = add nuw nsw i32 %25, %23 430 %27 = getelementptr inbounds [101 x i32], ptr %2, i32 0, i32 %26 431 store i32 0, ptr %27, align 4 432 %28 = getelementptr inbounds i32, ptr %22, i32 %25 433 %29 = load i32, ptr %28, align 4 434 %30 = and i32 %29, 1 435 %31 = icmp eq i32 %30, 0 436 %32 = and i32 %29, 2 437 %33 = icmp eq i32 %32, 0 438 %34 = and i32 %29, 4 439 %35 = icmp eq i32 %34, 0 440 %36 = and i32 %29, 8 441 %37 = icmp eq i32 %36, 0 442 %38 = and i32 %29, 16 443 %39 = icmp eq i32 %38, 0 444 %40 = and i32 %29, 32 445 %41 = icmp eq i32 %40, 0 446 %42 = and i32 %29, 64 447 %43 = icmp eq i32 %42, 0 448 %44 = and i32 %29, 128 449 %45 = icmp eq i32 %44, 0 450 %46 = and i32 %29, 254 451 %47 = icmp eq i32 %46, 0 452 br i1 %31, label %48, label %62 453 45448: ; preds = %24 455 %49 = select i1 %33, i32 0, i32 129 456 %50 = or i32 %49, 258 457 %51 = select i1 %35, i32 %49, i32 %50 458 %52 = or i32 %51, 516 459 %53 = select i1 %37, i32 %51, i32 %52 460 %54 = or i32 %53, 1032 461 %55 = select i1 %39, i32 %53, i32 %54 462 %56 = or i32 %55, 2064 463 %57 = select i1 %41, i32 %55, i32 %56 464 %58 = or i32 %57, 4128 465 %59 = select i1 %43, i32 %57, i32 %58 466 %60 = or i32 %59, 8256 467 %61 = select i1 %45, i32 %59, i32 %60 468 br i1 %47, label %78, label %76 469 47062: ; preds = %24 471 %63 = select i1 %33, i32 0, i32 516 472 %64 = or i32 %63, 1032 473 %65 = select i1 %35, i32 %63, i32 %64 474 %66 = or i32 %65, 2064 475 %67 = select i1 %37, i32 %65, i32 %66 476 %68 = or i32 %67, 4128 477 %69 = select i1 %39, i32 %67, i32 %68 478 %70 = or i32 %69, 8256 479 %71 = select i1 %41, i32 %69, i32 %70 480 %72 = or i32 %71, 16512 481 %73 = select i1 %43, i32 %71, i32 %72 482 %74 = or i32 %73, 33024 483 %75 = select i1 %45, i32 %73, i32 %74 484 br i1 %47, label %78, label %76 485 48676: ; preds = %62, %48 487 %77 = phi i32 [ %61, %48 ], [ %75, %62 ] 488 store i32 %77, ptr %27, align 4 489 br label %78 490 49178: ; preds = %76, %62, %48 492 %79 = add nuw nsw i32 %25, 1 493 %80 = icmp eq i32 %79, 5 494 br i1 %80, label %81, label %24 495 49681: ; preds = %78 497 br label %82 498 49982: ; preds = %81, %149 500 %83 = phi i32 [ %150, %149 ], [ 0, %81 ] 501 %84 = add nuw nsw i32 %83, %23 502 %85 = getelementptr inbounds [101 x i32], ptr %2, i32 0, i32 %84 503 %86 = load i32, ptr %85, align 4 504 %87 = shl i32 %86, 30 505 %88 = and i32 %87, 1073741824 506 %89 = and i32 %86, 2 507 %90 = icmp eq i32 %89, 0 508 %91 = select i1 %90, i32 %88, i32 1073741824 509 %92 = shl i32 %86, 27 510 %93 = and i32 %92, 536870912 511 %94 = or i32 %91, %93 512 %95 = shl i32 %86, 25 513 %96 = and i32 %95, 268435456 514 %97 = or i32 %94, %96 515 %98 = shl i32 %86, 23 516 %99 = and i32 %98, 134217728 517 %100 = or i32 %97, %99 518 %101 = or i32 %100, %86 519 %102 = and i32 %86, 31 520 %103 = and i32 %101, 32 521 %104 = shl nuw nsw i32 %103, 21 522 %105 = or i32 %102, %103 523 %106 = and i32 %101, 64 524 %107 = shl nuw nsw i32 %106, 19 525 %108 = or i32 %104, %107 526 %109 = or i32 %105, %106 527 %110 = and i32 %101, 128 528 %111 = shl nuw nsw i32 %110, 17 529 %112 = or i32 %108, %111 530 %113 = or i32 %109, %110 531 %114 = and i32 %101, 256 532 %115 = shl nuw nsw i32 %114, 15 533 %116 = or i32 %112, %115 534 %117 = or i32 %113, %114 535 %118 = and i32 %101, 512 536 %119 = shl nuw nsw i32 %118, 13 537 %120 = or i32 %116, %119 538 %121 = or i32 %120, %101 539 %122 = or i32 %117, %118 540 %123 = and i32 %121, 1024 541 %124 = shl nuw nsw i32 %123, 11 542 %125 = or i32 %122, %123 543 %126 = and i32 %121, 2048 544 %127 = shl nuw nsw i32 %126, 9 545 %128 = or i32 %124, %127 546 %129 = or i32 %125, %126 547 %130 = and i32 %121, 4096 548 %131 = shl nuw nsw i32 %130, 7 549 %132 = or i32 %128, %131 550 %133 = or i32 %129, %130 551 %134 = and i32 %121, 8192 552 %135 = shl nuw nsw i32 %134, 5 553 %136 = or i32 %132, %135 554 %137 = or i32 %136, %121 555 %138 = or i32 %133, %134 556 %139 = and i32 %137, 16384 557 %140 = or i32 %138, %139 558 %141 = and i32 %137, 32768 559 %142 = or i32 %140, %141 560 %143 = icmp eq i32 %142, 0 561 br i1 %143, label %149, label %144 562 563144: ; preds = %82 564 %145 = shl nuw nsw i32 %139, 3 565 %146 = shl nuw nsw i32 %141, 1 566 %147 = or i32 %145, %146 567 %148 = or i32 %147, %137 568 store i32 %148, ptr %85, align 4 569 br label %149 570 571149: ; preds = %82, %144 572 %150 = add nuw nsw i32 %83, 1 573 %151 = icmp eq i32 %150, 5 574 br i1 %151, label %152, label %82 575 576152: ; preds = %149 577 %153 = add nuw nsw i32 %12, 1 578 %154 = icmp eq i32 %153, 20 579 br i1 %154, label %155, label %11 580 581155: ; preds = %152 582 %156 = add nuw nsw i32 %9, 1 583 %157 = icmp eq i32 %156, %0 584 br i1 %157, label %158, label %7 585 586158: ; preds = %155 587 br label %159 588 589159: ; preds = %158, %1 590 call void @llvm.lifetime.end.p0(i64 84, ptr nonnull %3) 591 call void @llvm.lifetime.end.p0(i64 404, ptr nonnull %2) 592 ret i32 0 593} 594 595; This has a maximum trip count of 4. The codegen is currently much better with <8 x half> vectorization. 596; CHECK-LABEL: arm_q15_to_f16_remainder 597; CHECK: LV: Selecting VF: 8 598define void @arm_q15_to_f16_remainder(ptr nocapture noundef readonly %pSrc, ptr nocapture noundef writeonly noalias %pDst, i32 noundef %blockSize) #0 { 599entry: 600 %rem = and i32 %blockSize, 3 601 %cmp.not5 = icmp eq i32 %rem, 0 602 br i1 %cmp.not5, label %while.end, label %while.body.preheader 603 604while.body.preheader: ; preds = %entry 605 br label %while.body 606 607while.body: ; preds = %while.body.preheader, %while.body 608 %blkCnt.08 = phi i32 [ %dec, %while.body ], [ %rem, %while.body.preheader ] 609 %pIn.07 = phi ptr [ %incdec.ptr, %while.body ], [ %pSrc, %while.body.preheader ] 610 %pDst.addr.06 = phi ptr [ %incdec.ptr2, %while.body ], [ %pDst, %while.body.preheader ] 611 %incdec.ptr = getelementptr inbounds i8, ptr %pIn.07, i32 2 612 %0 = load i16, ptr %pIn.07, align 2 613 %conv1 = sitofp i16 %0 to half 614 %1 = fmul fast half %conv1, 0xH0200 615 %incdec.ptr2 = getelementptr inbounds i8, ptr %pDst.addr.06, i32 2 616 store half %1, ptr %pDst.addr.06, align 2 617 %dec = add nsw i32 %blkCnt.08, -1 618 %cmp.not = icmp eq i32 %dec, 0 619 br i1 %cmp.not, label %while.end.loopexit, label %while.body 620 621while.end.loopexit: ; preds = %while.body 622 br label %while.end 623 624while.end: ; preds = %while.end.loopexit, %entry 625 ret void 626} 627 628 629declare void @llvm.lifetime.start.p0(i64, ptr) 630declare void @llvm.lifetime.end.p0(i64, ptr) 631 632attributes #0 = { "target-features"="+mve.fp" } 633