1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64 < %s | FileCheck %s 3 4define void @loop1(ptr noalias nocapture noundef writeonly %dst, ptr nocapture noundef readonly %data, i32 noundef %width) { 5; CHECK-LABEL: loop1: 6; CHECK: // %bb.0: // %entry 7; CHECK-NEXT: subs w8, w2, #1 8; CHECK-NEXT: b.lt .LBB0_8 9; CHECK-NEXT: // %bb.1: // %for.body.preheader 10; CHECK-NEXT: cmp w8, #6 11; CHECK-NEXT: b.hi .LBB0_3 12; CHECK-NEXT: // %bb.2: 13; CHECK-NEXT: mov w10, wzr 14; CHECK-NEXT: mov x8, x1 15; CHECK-NEXT: mov x9, x0 16; CHECK-NEXT: b .LBB0_6 17; CHECK-NEXT: .LBB0_3: // %vector.ph 18; CHECK-NEXT: add x11, x8, #1 19; CHECK-NEXT: mov w8, #1132396544 // =0x437f0000 20; CHECK-NEXT: add x12, x0, #4 21; CHECK-NEXT: and x10, x11, #0x1fffffff8 22; CHECK-NEXT: dup v0.4s, w8 23; CHECK-NEXT: add x13, x1, #16 24; CHECK-NEXT: add x8, x1, x10, lsl #2 25; CHECK-NEXT: add x9, x0, x10 26; CHECK-NEXT: mov x14, x10 27; CHECK-NEXT: .LBB0_4: // %vector.body 28; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 29; CHECK-NEXT: ldp q1, q2, [x13, #-16] 30; CHECK-NEXT: subs x14, x14, #8 31; CHECK-NEXT: add x13, x13, #32 32; CHECK-NEXT: fcmgt v3.4s, v1.4s, v0.4s 33; CHECK-NEXT: fcmgt v4.4s, v2.4s, v0.4s 34; CHECK-NEXT: fcmlt v5.4s, v1.4s, #0.0 35; CHECK-NEXT: fcmlt v6.4s, v2.4s, #0.0 36; CHECK-NEXT: bit v1.16b, v0.16b, v3.16b 37; CHECK-NEXT: bit v2.16b, v0.16b, v4.16b 38; CHECK-NEXT: bic v1.16b, v1.16b, v5.16b 39; CHECK-NEXT: bic v2.16b, v2.16b, v6.16b 40; CHECK-NEXT: fcvtzs v1.4s, v1.4s 41; CHECK-NEXT: fcvtzs v2.4s, v2.4s 42; CHECK-NEXT: xtn v1.4h, v1.4s 43; CHECK-NEXT: xtn v2.4h, v2.4s 44; CHECK-NEXT: uzp1 v1.8b, v1.8b, v0.8b 45; CHECK-NEXT: uzp1 v2.8b, v2.8b, v0.8b 46; CHECK-NEXT: mov v1.s[1], v2.s[0] 47; CHECK-NEXT: stur d1, [x12, #-4] 48; CHECK-NEXT: add x12, x12, #8 49; CHECK-NEXT: b.ne .LBB0_4 50; CHECK-NEXT: // %bb.5: // %middle.block 51; CHECK-NEXT: cmp x11, x10 52; CHECK-NEXT: b.eq .LBB0_8 53; CHECK-NEXT: .LBB0_6: // %for.body.preheader1 54; CHECK-NEXT: movi d0, #0000000000000000 55; CHECK-NEXT: mov w11, #1132396544 // =0x437f0000 56; CHECK-NEXT: sub w10, w2, w10 57; CHECK-NEXT: fmov s1, w11 58; CHECK-NEXT: .LBB0_7: // %for.body 59; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 60; CHECK-NEXT: ldr s2, [x8], #4 61; CHECK-NEXT: fcmp s2, s1 62; CHECK-NEXT: fcsel s3, s1, s2, gt 63; CHECK-NEXT: fcmp s2, #0.0 64; CHECK-NEXT: fcsel s2, s0, s3, mi 65; CHECK-NEXT: subs w10, w10, #1 66; CHECK-NEXT: fcvtzs w11, s2 67; CHECK-NEXT: strb w11, [x9], #1 68; CHECK-NEXT: b.ne .LBB0_7 69; CHECK-NEXT: .LBB0_8: // %for.cond.cleanup 70; CHECK-NEXT: ret 71entry: 72 %cmp9 = icmp sgt i32 %width, 0 73 br i1 %cmp9, label %for.body.preheader, label %for.cond.cleanup 74 75for.body.preheader: ; preds = %entry 76 %0 = add i32 %width, -1 77 %1 = zext i32 %0 to i64 78 %2 = add nuw nsw i64 %1, 1 79 %min.iters.check = icmp ult i32 %0, 7 80 br i1 %min.iters.check, label %for.body.preheader21, label %vector.ph 81 82vector.ph: ; preds = %for.body.preheader 83 %n.vec = and i64 %2, 8589934584 84 %ind.end = trunc i64 %n.vec to i32 85 %ind.end14 = getelementptr float, ptr %data, i64 %n.vec 86 %ind.end16 = getelementptr i8, ptr %dst, i64 %n.vec 87 br label %vector.body 88 89vector.body: ; preds = %vector.body, %vector.ph 90 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] 91 %next.gep = getelementptr float, ptr %data, i64 %index 92 %next.gep18 = getelementptr i8, ptr %dst, i64 %index 93 %wide.load = load <4 x float>, ptr %next.gep, align 4 94 %3 = getelementptr float, ptr %next.gep, i64 4 95 %wide.load20 = load <4 x float>, ptr %3, align 4 96 %4 = fcmp olt <4 x float> %wide.load, zeroinitializer 97 %5 = fcmp olt <4 x float> %wide.load20, zeroinitializer 98 %6 = fcmp ogt <4 x float> %wide.load, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 99 %7 = fcmp ogt <4 x float> %wide.load20, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 100 %8 = select <4 x i1> %6, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %wide.load 101 %9 = select <4 x i1> %7, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %wide.load20 102 %10 = select <4 x i1> %4, <4 x float> zeroinitializer, <4 x float> %8 103 %11 = select <4 x i1> %5, <4 x float> zeroinitializer, <4 x float> %9 104 %12 = fptoui <4 x float> %10 to <4 x i8> 105 %13 = fptoui <4 x float> %11 to <4 x i8> 106 store <4 x i8> %12, ptr %next.gep18, align 1 107 %14 = getelementptr i8, ptr %next.gep18, i64 4 108 store <4 x i8> %13, ptr %14, align 1 109 %index.next = add nuw i64 %index, 8 110 %15 = icmp eq i64 %index.next, %n.vec 111 br i1 %15, label %middle.block, label %vector.body 112 113middle.block: ; preds = %vector.body 114 %cmp.n = icmp eq i64 %2, %n.vec 115 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader21 116 117for.body.preheader21: ; preds = %for.body.preheader, %middle.block 118 %i.012.ph = phi i32 [ 0, %for.body.preheader ], [ %ind.end, %middle.block ] 119 %src.011.ph = phi ptr [ %data, %for.body.preheader ], [ %ind.end14, %middle.block ] 120 %dst.addr.010.ph = phi ptr [ %dst, %for.body.preheader ], [ %ind.end16, %middle.block ] 121 br label %for.body 122 123for.cond.cleanup: ; preds = %for.body, %middle.block, %entry 124 ret void 125 126for.body: ; preds = %for.body.preheader21, %for.body 127 %i.012 = phi i32 [ %inc, %for.body ], [ %i.012.ph, %for.body.preheader21 ] 128 %src.011 = phi ptr [ %add.ptr, %for.body ], [ %src.011.ph, %for.body.preheader21 ] 129 %dst.addr.010 = phi ptr [ %add.ptr2, %for.body ], [ %dst.addr.010.ph, %for.body.preheader21 ] 130 %16 = load float, ptr %src.011, align 4 131 %cmp.i = fcmp olt float %16, 0.000000e+00 132 %cmp1.i = fcmp ogt float %16, 2.550000e+02 133 %.x.i = select i1 %cmp1.i, float 2.550000e+02, float %16 134 %retval.0.i = select i1 %cmp.i, float 0.000000e+00, float %.x.i 135 %conv = fptoui float %retval.0.i to i8 136 store i8 %conv, ptr %dst.addr.010, align 1 137 %add.ptr = getelementptr inbounds float, ptr %src.011, i64 1 138 %add.ptr2 = getelementptr inbounds i8, ptr %dst.addr.010, i64 1 139 %inc = add nuw nsw i32 %i.012, 1 140 %exitcond.not = icmp eq i32 %inc, %width 141 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 142} 143 144define void @loop2(ptr noalias nocapture noundef writeonly %dst, ptr nocapture noundef readonly %data, i32 noundef %width) { 145; CHECK-LABEL: loop2: 146; CHECK: // %bb.0: // %entry 147; CHECK-NEXT: subs w8, w2, #1 148; CHECK-NEXT: b.lt .LBB1_7 149; CHECK-NEXT: // %bb.1: // %for.body.preheader 150; CHECK-NEXT: cmp w8, #2 151; CHECK-NEXT: b.ls .LBB1_4 152; CHECK-NEXT: // %bb.2: // %vector.memcheck 153; CHECK-NEXT: ubfiz x9, x8, #1, #32 154; CHECK-NEXT: add x9, x9, #2 155; CHECK-NEXT: add x10, x1, x9, lsl #2 156; CHECK-NEXT: cmp x10, x0 157; CHECK-NEXT: b.ls .LBB1_8 158; CHECK-NEXT: // %bb.3: // %vector.memcheck 159; CHECK-NEXT: add x9, x0, x9 160; CHECK-NEXT: cmp x9, x1 161; CHECK-NEXT: b.ls .LBB1_8 162; CHECK-NEXT: .LBB1_4: 163; CHECK-NEXT: mov w10, wzr 164; CHECK-NEXT: mov x8, x1 165; CHECK-NEXT: mov x9, x0 166; CHECK-NEXT: .LBB1_5: // %for.body.preheader1 167; CHECK-NEXT: movi d0, #0000000000000000 168; CHECK-NEXT: mov w11, #1132396544 // =0x437f0000 169; CHECK-NEXT: sub w10, w2, w10 170; CHECK-NEXT: fmov s1, w11 171; CHECK-NEXT: .LBB1_6: // %for.body 172; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 173; CHECK-NEXT: ldp s2, s3, [x8], #8 174; CHECK-NEXT: fcmp s2, s1 175; CHECK-NEXT: fcsel s4, s1, s2, gt 176; CHECK-NEXT: fcmp s2, #0.0 177; CHECK-NEXT: fcsel s2, s0, s4, mi 178; CHECK-NEXT: fcmp s3, s1 179; CHECK-NEXT: fcsel s4, s1, s3, gt 180; CHECK-NEXT: fcmp s3, #0.0 181; CHECK-NEXT: fcvtzs w11, s2 182; CHECK-NEXT: fcsel s3, s0, s4, mi 183; CHECK-NEXT: subs w10, w10, #1 184; CHECK-NEXT: strb w11, [x9] 185; CHECK-NEXT: fcvtzs w12, s3 186; CHECK-NEXT: strb w12, [x9, #1] 187; CHECK-NEXT: add x9, x9, #2 188; CHECK-NEXT: b.ne .LBB1_6 189; CHECK-NEXT: .LBB1_7: // %for.cond.cleanup 190; CHECK-NEXT: ret 191; CHECK-NEXT: .LBB1_8: // %vector.ph 192; CHECK-NEXT: add x11, x8, #1 193; CHECK-NEXT: mov w8, #1132396544 // =0x437f0000 194; CHECK-NEXT: and x10, x11, #0x1fffffffc 195; CHECK-NEXT: dup v0.4s, w8 196; CHECK-NEXT: add x8, x1, x10, lsl #3 197; CHECK-NEXT: add x9, x0, x10, lsl #1 198; CHECK-NEXT: mov x12, x10 199; CHECK-NEXT: .LBB1_9: // %vector.body 200; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 201; CHECK-NEXT: ld2 { v1.4s, v2.4s }, [x1], #32 202; CHECK-NEXT: subs x12, x12, #4 203; CHECK-NEXT: fcmgt v3.4s, v1.4s, v0.4s 204; CHECK-NEXT: fcmgt v4.4s, v2.4s, v0.4s 205; CHECK-NEXT: fcmlt v5.4s, v1.4s, #0.0 206; CHECK-NEXT: bsl v3.16b, v0.16b, v1.16b 207; CHECK-NEXT: bsl v4.16b, v0.16b, v2.16b 208; CHECK-NEXT: fcmlt v1.4s, v2.4s, #0.0 209; CHECK-NEXT: bic v2.16b, v3.16b, v5.16b 210; CHECK-NEXT: bic v1.16b, v4.16b, v1.16b 211; CHECK-NEXT: fcvtzs v2.4s, v2.4s 212; CHECK-NEXT: fcvtzs v1.4s, v1.4s 213; CHECK-NEXT: xtn v2.4h, v2.4s 214; CHECK-NEXT: xtn v1.4h, v1.4s 215; CHECK-NEXT: trn1 v1.8b, v2.8b, v1.8b 216; CHECK-NEXT: str d1, [x0], #8 217; CHECK-NEXT: b.ne .LBB1_9 218; CHECK-NEXT: // %bb.10: // %middle.block 219; CHECK-NEXT: cmp x11, x10 220; CHECK-NEXT: b.ne .LBB1_5 221; CHECK-NEXT: b .LBB1_7 222entry: 223 %cmp19 = icmp sgt i32 %width, 0 224 br i1 %cmp19, label %for.body.preheader, label %for.cond.cleanup 225 226for.body.preheader: ; preds = %entry 227 %0 = add i32 %width, -1 228 %1 = zext i32 %0 to i64 229 %2 = add nuw nsw i64 %1, 1 230 %min.iters.check = icmp ult i32 %0, 3 231 br i1 %min.iters.check, label %for.body.preheader35, label %vector.memcheck 232 233vector.memcheck: ; preds = %for.body.preheader 234 %3 = add i32 %width, -1 235 %4 = zext i32 %3 to i64 236 %5 = shl nuw nsw i64 %4, 1 237 %6 = add nuw nsw i64 %5, 2 238 %scevgep = getelementptr i8, ptr %dst, i64 %6 239 %scevgep24 = getelementptr float, ptr %data, i64 %6 240 %bound0 = icmp ugt ptr %scevgep24, %dst 241 %bound1 = icmp ugt ptr %scevgep, %data 242 %found.conflict = and i1 %bound0, %bound1 243 br i1 %found.conflict, label %for.body.preheader35, label %vector.ph 244 245vector.ph: ; preds = %vector.memcheck 246 %n.vec = and i64 %2, 8589934588 247 %ind.end = trunc i64 %n.vec to i32 248 %7 = shl nuw nsw i64 %n.vec, 1 249 %ind.end27 = getelementptr float, ptr %data, i64 %7 250 %8 = shl nuw nsw i64 %n.vec, 1 251 %ind.end29 = getelementptr i8, ptr %dst, i64 %8 252 br label %vector.body 253 254vector.body: ; preds = %vector.body, %vector.ph 255 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] 256 %9 = shl i64 %index, 1 257 %next.gep = getelementptr float, ptr %data, i64 %9 258 %10 = shl i64 %index, 1 259 %wide.vec = load <8 x float>, ptr %next.gep, align 4 260 %strided.vec = shufflevector <8 x float> %wide.vec, <8 x float> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 261 %strided.vec34 = shufflevector <8 x float> %wide.vec, <8 x float> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 262 %11 = fcmp olt <4 x float> %strided.vec, zeroinitializer 263 %12 = fcmp ogt <4 x float> %strided.vec, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 264 %13 = select <4 x i1> %12, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec 265 %14 = select <4 x i1> %11, <4 x float> zeroinitializer, <4 x float> %13 266 %15 = fptoui <4 x float> %14 to <4 x i8> 267 %16 = fcmp olt <4 x float> %strided.vec34, zeroinitializer 268 %17 = fcmp ogt <4 x float> %strided.vec34, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 269 %18 = select <4 x i1> %17, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec34 270 %19 = select <4 x i1> %16, <4 x float> zeroinitializer, <4 x float> %18 271 %20 = fptoui <4 x float> %19 to <4 x i8> 272 %21 = getelementptr inbounds i8, ptr %dst, i64 %10 273 %interleaved.vec = shufflevector <4 x i8> %15, <4 x i8> %20, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7> 274 store <8 x i8> %interleaved.vec, ptr %21, align 1 275 %index.next = add nuw i64 %index, 4 276 %22 = icmp eq i64 %index.next, %n.vec 277 br i1 %22, label %middle.block, label %vector.body 278 279middle.block: ; preds = %vector.body 280 %cmp.n = icmp eq i64 %2, %n.vec 281 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader35 282 283for.body.preheader35: ; preds = %vector.memcheck, %for.body.preheader, %middle.block 284 %i.022.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %ind.end, %middle.block ] 285 %src.021.ph = phi ptr [ %data, %vector.memcheck ], [ %data, %for.body.preheader ], [ %ind.end27, %middle.block ] 286 %dst.addr.020.ph = phi ptr [ %dst, %vector.memcheck ], [ %dst, %for.body.preheader ], [ %ind.end29, %middle.block ] 287 br label %for.body 288 289for.cond.cleanup: ; preds = %for.body, %middle.block, %entry 290 ret void 291 292for.body: ; preds = %for.body.preheader35, %for.body 293 %i.022 = phi i32 [ %inc, %for.body ], [ %i.022.ph, %for.body.preheader35 ] 294 %src.021 = phi ptr [ %add.ptr, %for.body ], [ %src.021.ph, %for.body.preheader35 ] 295 %dst.addr.020 = phi ptr [ %add.ptr6, %for.body ], [ %dst.addr.020.ph, %for.body.preheader35 ] 296 %23 = load float, ptr %src.021, align 4 297 %cmp.i = fcmp olt float %23, 0.000000e+00 298 %cmp1.i = fcmp ogt float %23, 2.550000e+02 299 %.x.i = select i1 %cmp1.i, float 2.550000e+02, float %23 300 %retval.0.i = select i1 %cmp.i, float 0.000000e+00, float %.x.i 301 %conv = fptoui float %retval.0.i to i8 302 store i8 %conv, ptr %dst.addr.020, align 1 303 %arrayidx2 = getelementptr inbounds float, ptr %src.021, i64 1 304 %24 = load float, ptr %arrayidx2, align 4 305 %cmp.i15 = fcmp olt float %24, 0.000000e+00 306 %cmp1.i16 = fcmp ogt float %24, 2.550000e+02 307 %.x.i17 = select i1 %cmp1.i16, float 2.550000e+02, float %24 308 %retval.0.i18 = select i1 %cmp.i15, float 0.000000e+00, float %.x.i17 309 %conv4 = fptoui float %retval.0.i18 to i8 310 %arrayidx5 = getelementptr inbounds i8, ptr %dst.addr.020, i64 1 311 store i8 %conv4, ptr %arrayidx5, align 1 312 %add.ptr = getelementptr inbounds float, ptr %src.021, i64 2 313 %add.ptr6 = getelementptr inbounds i8, ptr %dst.addr.020, i64 2 314 %inc = add nuw nsw i32 %i.022, 1 315 %exitcond.not = icmp eq i32 %inc, %width 316 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 317} 318 319define void @loop3(ptr noalias nocapture noundef writeonly %dst, ptr nocapture noundef readonly %data, i32 noundef %width) { 320; CHECK-LABEL: loop3: 321; CHECK: // %bb.0: // %entry 322; CHECK-NEXT: subs w8, w2, #1 323; CHECK-NEXT: b.lt .LBB2_9 324; CHECK-NEXT: // %bb.1: // %for.body.preheader 325; CHECK-NEXT: cmp w8, #2 326; CHECK-NEXT: b.ls .LBB2_6 327; CHECK-NEXT: // %bb.2: // %vector.memcheck 328; CHECK-NEXT: add x9, x8, w8, uxtw #1 329; CHECK-NEXT: add x9, x9, #3 330; CHECK-NEXT: add x10, x1, x9, lsl #2 331; CHECK-NEXT: add x9, x0, x9 332; CHECK-NEXT: cmp x10, x0 333; CHECK-NEXT: ccmp x9, x1, #0, hi 334; CHECK-NEXT: b.hi .LBB2_6 335; CHECK-NEXT: // %bb.3: // %vector.ph 336; CHECK-NEXT: add x11, x8, #1 337; CHECK-NEXT: mov w8, #1132396544 // =0x437f0000 338; CHECK-NEXT: adrp x12, .LCPI2_0 339; CHECK-NEXT: and x10, x11, #0x1fffffffc 340; CHECK-NEXT: dup v0.4s, w8 341; CHECK-NEXT: ldr q1, [x12, :lo12:.LCPI2_0] 342; CHECK-NEXT: add x9, x10, x10, lsl #1 343; CHECK-NEXT: mov x12, x10 344; CHECK-NEXT: add x8, x1, x9, lsl #2 345; CHECK-NEXT: add x9, x0, x9 346; CHECK-NEXT: .LBB2_4: // %vector.body 347; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 348; CHECK-NEXT: ld3 { v2.4s, v3.4s, v4.4s }, [x1], #48 349; CHECK-NEXT: add x13, x0, #8 350; CHECK-NEXT: subs x12, x12, #4 351; CHECK-NEXT: fcmgt v5.4s, v2.4s, v0.4s 352; CHECK-NEXT: fcmgt v6.4s, v3.4s, v0.4s 353; CHECK-NEXT: fcmgt v7.4s, v4.4s, v0.4s 354; CHECK-NEXT: fcmlt v16.4s, v2.4s, #0.0 355; CHECK-NEXT: fcmlt v17.4s, v3.4s, #0.0 356; CHECK-NEXT: bsl v5.16b, v0.16b, v2.16b 357; CHECK-NEXT: bsl v6.16b, v0.16b, v3.16b 358; CHECK-NEXT: bsl v7.16b, v0.16b, v4.16b 359; CHECK-NEXT: fcmlt v2.4s, v4.4s, #0.0 360; CHECK-NEXT: bic v3.16b, v5.16b, v16.16b 361; CHECK-NEXT: bic v4.16b, v6.16b, v17.16b 362; CHECK-NEXT: bic v2.16b, v7.16b, v2.16b 363; CHECK-NEXT: fcvtzs v3.4s, v3.4s 364; CHECK-NEXT: fcvtzs v4.4s, v4.4s 365; CHECK-NEXT: fcvtzs v2.4s, v2.4s 366; CHECK-NEXT: xtn v5.4h, v3.4s 367; CHECK-NEXT: xtn v6.4h, v4.4s 368; CHECK-NEXT: xtn v7.4h, v2.4s 369; CHECK-NEXT: tbl v2.16b, { v5.16b, v6.16b, v7.16b }, v1.16b 370; CHECK-NEXT: st1 { v2.s }[2], [x13] 371; CHECK-NEXT: str d2, [x0], #12 372; CHECK-NEXT: b.ne .LBB2_4 373; CHECK-NEXT: // %bb.5: // %middle.block 374; CHECK-NEXT: cmp x11, x10 375; CHECK-NEXT: b.ne .LBB2_7 376; CHECK-NEXT: b .LBB2_9 377; CHECK-NEXT: .LBB2_6: 378; CHECK-NEXT: mov w10, wzr 379; CHECK-NEXT: mov x8, x1 380; CHECK-NEXT: mov x9, x0 381; CHECK-NEXT: .LBB2_7: // %for.body.preheader1 382; CHECK-NEXT: movi d0, #0000000000000000 383; CHECK-NEXT: mov w11, #1132396544 // =0x437f0000 384; CHECK-NEXT: sub w10, w2, w10 385; CHECK-NEXT: fmov s1, w11 386; CHECK-NEXT: .LBB2_8: // %for.body 387; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 388; CHECK-NEXT: ldp s2, s3, [x8] 389; CHECK-NEXT: fcmp s2, s1 390; CHECK-NEXT: fcsel s4, s1, s2, gt 391; CHECK-NEXT: fcmp s2, #0.0 392; CHECK-NEXT: fcsel s2, s0, s4, mi 393; CHECK-NEXT: fcmp s3, s1 394; CHECK-NEXT: fcsel s4, s1, s3, gt 395; CHECK-NEXT: fcmp s3, #0.0 396; CHECK-NEXT: ldr s3, [x8, #8] 397; CHECK-NEXT: fcvtzs w11, s2 398; CHECK-NEXT: add x8, x8, #12 399; CHECK-NEXT: fcsel s4, s0, s4, mi 400; CHECK-NEXT: fcmp s3, s1 401; CHECK-NEXT: strb w11, [x9] 402; CHECK-NEXT: fcsel s5, s1, s3, gt 403; CHECK-NEXT: fcmp s3, #0.0 404; CHECK-NEXT: fcvtzs w12, s4 405; CHECK-NEXT: fcsel s3, s0, s5, mi 406; CHECK-NEXT: subs w10, w10, #1 407; CHECK-NEXT: strb w12, [x9, #1] 408; CHECK-NEXT: fcvtzs w13, s3 409; CHECK-NEXT: strb w13, [x9, #2] 410; CHECK-NEXT: add x9, x9, #3 411; CHECK-NEXT: b.ne .LBB2_8 412; CHECK-NEXT: .LBB2_9: // %for.cond.cleanup 413; CHECK-NEXT: ret 414entry: 415 %cmp29 = icmp sgt i32 %width, 0 416 br i1 %cmp29, label %for.body.preheader, label %for.cond.cleanup 417 418for.body.preheader: ; preds = %entry 419 %0 = add i32 %width, -1 420 %1 = zext i32 %0 to i64 421 %2 = add nuw nsw i64 %1, 1 422 %min.iters.check = icmp ult i32 %0, 3 423 br i1 %min.iters.check, label %for.body.preheader46, label %vector.memcheck 424 425vector.memcheck: ; preds = %for.body.preheader 426 %3 = add i32 %width, -1 427 %4 = zext i32 %3 to i64 428 %5 = mul nuw nsw i64 %4, 3 429 %6 = add nuw nsw i64 %5, 3 430 %scevgep = getelementptr i8, ptr %dst, i64 %6 431 %scevgep34 = getelementptr float, ptr %data, i64 %6 432 %bound0 = icmp ugt ptr %scevgep34, %dst 433 %bound1 = icmp ugt ptr %scevgep, %data 434 %found.conflict = and i1 %bound0, %bound1 435 br i1 %found.conflict, label %for.body.preheader46, label %vector.ph 436 437vector.ph: ; preds = %vector.memcheck 438 %n.vec = and i64 %2, 8589934588 439 %ind.end = trunc i64 %n.vec to i32 440 %7 = mul nuw nsw i64 %n.vec, 3 441 %ind.end37 = getelementptr float, ptr %data, i64 %7 442 %8 = mul nuw nsw i64 %n.vec, 3 443 %ind.end39 = getelementptr i8, ptr %dst, i64 %8 444 br label %vector.body 445 446vector.body: ; preds = %vector.body, %vector.ph 447 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] 448 %9 = mul i64 %index, 3 449 %next.gep = getelementptr float, ptr %data, i64 %9 450 %10 = mul i64 %index, 3 451 %wide.vec = load <12 x float>, ptr %next.gep, align 4 452 %strided.vec = shufflevector <12 x float> %wide.vec, <12 x float> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9> 453 %strided.vec44 = shufflevector <12 x float> %wide.vec, <12 x float> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10> 454 %strided.vec45 = shufflevector <12 x float> %wide.vec, <12 x float> poison, <4 x i32> <i32 2, i32 5, i32 8, i32 11> 455 %11 = fcmp olt <4 x float> %strided.vec, zeroinitializer 456 %12 = fcmp ogt <4 x float> %strided.vec, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 457 %13 = select <4 x i1> %12, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec 458 %14 = select <4 x i1> %11, <4 x float> zeroinitializer, <4 x float> %13 459 %15 = fptoui <4 x float> %14 to <4 x i8> 460 %16 = fcmp olt <4 x float> %strided.vec44, zeroinitializer 461 %17 = fcmp ogt <4 x float> %strided.vec44, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 462 %18 = select <4 x i1> %17, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec44 463 %19 = select <4 x i1> %16, <4 x float> zeroinitializer, <4 x float> %18 464 %20 = fptoui <4 x float> %19 to <4 x i8> 465 %21 = fcmp olt <4 x float> %strided.vec45, zeroinitializer 466 %22 = fcmp ogt <4 x float> %strided.vec45, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 467 %23 = select <4 x i1> %22, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec45 468 %24 = select <4 x i1> %21, <4 x float> zeroinitializer, <4 x float> %23 469 %25 = fptoui <4 x float> %24 to <4 x i8> 470 %26 = getelementptr inbounds i8, ptr %dst, i64 %10 471 %27 = shufflevector <4 x i8> %15, <4 x i8> %20, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 472 %28 = shufflevector <4 x i8> %25, <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> 473 %interleaved.vec = shufflevector <8 x i8> %27, <8 x i8> %28, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11> 474 store <12 x i8> %interleaved.vec, ptr %26, align 1 475 %index.next = add nuw i64 %index, 4 476 %29 = icmp eq i64 %index.next, %n.vec 477 br i1 %29, label %middle.block, label %vector.body 478 479middle.block: ; preds = %vector.body 480 %cmp.n = icmp eq i64 %2, %n.vec 481 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader46 482 483for.body.preheader46: ; preds = %vector.memcheck, %for.body.preheader, %middle.block 484 %i.032.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %ind.end, %middle.block ] 485 %src.031.ph = phi ptr [ %data, %vector.memcheck ], [ %data, %for.body.preheader ], [ %ind.end37, %middle.block ] 486 %dst.addr.030.ph = phi ptr [ %dst, %vector.memcheck ], [ %dst, %for.body.preheader ], [ %ind.end39, %middle.block ] 487 br label %for.body 488 489for.cond.cleanup: ; preds = %for.body, %middle.block, %entry 490 ret void 491 492for.body: ; preds = %for.body.preheader46, %for.body 493 %i.032 = phi i32 [ %inc, %for.body ], [ %i.032.ph, %for.body.preheader46 ] 494 %src.031 = phi ptr [ %add.ptr, %for.body ], [ %src.031.ph, %for.body.preheader46 ] 495 %dst.addr.030 = phi ptr [ %add.ptr10, %for.body ], [ %dst.addr.030.ph, %for.body.preheader46 ] 496 %30 = load float, ptr %src.031, align 4 497 %cmp.i = fcmp olt float %30, 0.000000e+00 498 %cmp1.i = fcmp ogt float %30, 2.550000e+02 499 %.x.i = select i1 %cmp1.i, float 2.550000e+02, float %30 500 %retval.0.i = select i1 %cmp.i, float 0.000000e+00, float %.x.i 501 %conv = fptoui float %retval.0.i to i8 502 store i8 %conv, ptr %dst.addr.030, align 1 503 %arrayidx2 = getelementptr inbounds float, ptr %src.031, i64 1 504 %31 = load float, ptr %arrayidx2, align 4 505 %cmp.i21 = fcmp olt float %31, 0.000000e+00 506 %cmp1.i22 = fcmp ogt float %31, 2.550000e+02 507 %.x.i23 = select i1 %cmp1.i22, float 2.550000e+02, float %31 508 %retval.0.i24 = select i1 %cmp.i21, float 0.000000e+00, float %.x.i23 509 %conv4 = fptoui float %retval.0.i24 to i8 510 %arrayidx5 = getelementptr inbounds i8, ptr %dst.addr.030, i64 1 511 store i8 %conv4, ptr %arrayidx5, align 1 512 %arrayidx6 = getelementptr inbounds float, ptr %src.031, i64 2 513 %32 = load float, ptr %arrayidx6, align 4 514 %cmp.i25 = fcmp olt float %32, 0.000000e+00 515 %cmp1.i26 = fcmp ogt float %32, 2.550000e+02 516 %.x.i27 = select i1 %cmp1.i26, float 2.550000e+02, float %32 517 %retval.0.i28 = select i1 %cmp.i25, float 0.000000e+00, float %.x.i27 518 %conv8 = fptoui float %retval.0.i28 to i8 519 %arrayidx9 = getelementptr inbounds i8, ptr %dst.addr.030, i64 2 520 store i8 %conv8, ptr %arrayidx9, align 1 521 %add.ptr = getelementptr inbounds float, ptr %src.031, i64 3 522 %add.ptr10 = getelementptr inbounds i8, ptr %dst.addr.030, i64 3 523 %inc = add nuw nsw i32 %i.032, 1 524 %exitcond.not = icmp eq i32 %inc, %width 525 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 526} 527 528define void @loop4(ptr noalias nocapture noundef writeonly %dst, ptr nocapture noundef readonly %data, i32 noundef %width) { 529; CHECK-LABEL: loop4: 530; CHECK: // %bb.0: // %entry 531; CHECK-NEXT: subs w8, w2, #1 532; CHECK-NEXT: b.lt .LBB3_7 533; CHECK-NEXT: // %bb.1: // %for.body.preheader 534; CHECK-NEXT: cmp w8, #2 535; CHECK-NEXT: b.ls .LBB3_4 536; CHECK-NEXT: // %bb.2: // %vector.memcheck 537; CHECK-NEXT: ubfiz x9, x8, #2, #32 538; CHECK-NEXT: add x9, x9, #4 539; CHECK-NEXT: add x10, x1, x9, lsl #2 540; CHECK-NEXT: cmp x10, x0 541; CHECK-NEXT: b.ls .LBB3_8 542; CHECK-NEXT: // %bb.3: // %vector.memcheck 543; CHECK-NEXT: add x9, x0, x9 544; CHECK-NEXT: cmp x9, x1 545; CHECK-NEXT: b.ls .LBB3_8 546; CHECK-NEXT: .LBB3_4: 547; CHECK-NEXT: mov w10, wzr 548; CHECK-NEXT: mov x8, x1 549; CHECK-NEXT: mov x9, x0 550; CHECK-NEXT: .LBB3_5: // %for.body.preheader1 551; CHECK-NEXT: movi d0, #0000000000000000 552; CHECK-NEXT: mov w11, #1132396544 // =0x437f0000 553; CHECK-NEXT: sub w10, w2, w10 554; CHECK-NEXT: fmov s1, w11 555; CHECK-NEXT: .LBB3_6: // %for.body 556; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 557; CHECK-NEXT: ldp s2, s3, [x8] 558; CHECK-NEXT: fcmp s2, s1 559; CHECK-NEXT: fcsel s4, s1, s2, gt 560; CHECK-NEXT: fcmp s2, #0.0 561; CHECK-NEXT: fcsel s2, s0, s4, mi 562; CHECK-NEXT: fcmp s3, s1 563; CHECK-NEXT: fcsel s4, s1, s3, gt 564; CHECK-NEXT: fcmp s3, #0.0 565; CHECK-NEXT: fcvtzs w11, s2 566; CHECK-NEXT: ldp s3, s5, [x8, #8] 567; CHECK-NEXT: add x8, x8, #16 568; CHECK-NEXT: fcsel s4, s0, s4, mi 569; CHECK-NEXT: fcmp s3, s1 570; CHECK-NEXT: strb w11, [x9] 571; CHECK-NEXT: fcvtzs w12, s4 572; CHECK-NEXT: fcsel s6, s1, s3, gt 573; CHECK-NEXT: fcmp s3, #0.0 574; CHECK-NEXT: fcsel s3, s0, s6, mi 575; CHECK-NEXT: fcmp s5, s1 576; CHECK-NEXT: strb w12, [x9, #1] 577; CHECK-NEXT: fcsel s6, s1, s5, gt 578; CHECK-NEXT: fcmp s5, #0.0 579; CHECK-NEXT: fcvtzs w13, s3 580; CHECK-NEXT: fcsel s2, s0, s6, mi 581; CHECK-NEXT: subs w10, w10, #1 582; CHECK-NEXT: strb w13, [x9, #2] 583; CHECK-NEXT: fcvtzs w14, s2 584; CHECK-NEXT: strb w14, [x9, #3] 585; CHECK-NEXT: add x9, x9, #4 586; CHECK-NEXT: b.ne .LBB3_6 587; CHECK-NEXT: .LBB3_7: // %for.cond.cleanup 588; CHECK-NEXT: ret 589; CHECK-NEXT: .LBB3_8: // %vector.ph 590; CHECK-NEXT: add x11, x8, #1 591; CHECK-NEXT: mov w8, #1132396544 // =0x437f0000 592; CHECK-NEXT: adrp x12, .LCPI3_0 593; CHECK-NEXT: and x10, x11, #0x1fffffffc 594; CHECK-NEXT: dup v0.4s, w8 595; CHECK-NEXT: ldr q1, [x12, :lo12:.LCPI3_0] 596; CHECK-NEXT: add x8, x1, x10, lsl #4 597; CHECK-NEXT: add x9, x0, x10, lsl #2 598; CHECK-NEXT: mov x12, x10 599; CHECK-NEXT: .LBB3_9: // %vector.body 600; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 601; CHECK-NEXT: ld4 { v2.4s, v3.4s, v4.4s, v5.4s }, [x1], #64 602; CHECK-NEXT: subs x12, x12, #4 603; CHECK-NEXT: fcmgt v6.4s, v2.4s, v0.4s 604; CHECK-NEXT: fcmgt v7.4s, v3.4s, v0.4s 605; CHECK-NEXT: fcmgt v16.4s, v4.4s, v0.4s 606; CHECK-NEXT: fcmgt v17.4s, v5.4s, v0.4s 607; CHECK-NEXT: fcmlt v18.4s, v2.4s, #0.0 608; CHECK-NEXT: fcmlt v19.4s, v3.4s, #0.0 609; CHECK-NEXT: fcmlt v20.4s, v4.4s, #0.0 610; CHECK-NEXT: bsl v6.16b, v0.16b, v2.16b 611; CHECK-NEXT: bsl v7.16b, v0.16b, v3.16b 612; CHECK-NEXT: bsl v16.16b, v0.16b, v4.16b 613; CHECK-NEXT: bsl v17.16b, v0.16b, v5.16b 614; CHECK-NEXT: fcmlt v2.4s, v5.4s, #0.0 615; CHECK-NEXT: bic v3.16b, v6.16b, v18.16b 616; CHECK-NEXT: bic v4.16b, v7.16b, v19.16b 617; CHECK-NEXT: bic v5.16b, v16.16b, v20.16b 618; CHECK-NEXT: bic v2.16b, v17.16b, v2.16b 619; CHECK-NEXT: fcvtzs v3.4s, v3.4s 620; CHECK-NEXT: fcvtzs v4.4s, v4.4s 621; CHECK-NEXT: fcvtzs v5.4s, v5.4s 622; CHECK-NEXT: fcvtzs v2.4s, v2.4s 623; CHECK-NEXT: xtn v16.4h, v3.4s 624; CHECK-NEXT: xtn v17.4h, v4.4s 625; CHECK-NEXT: xtn v18.4h, v5.4s 626; CHECK-NEXT: xtn v19.4h, v2.4s 627; CHECK-NEXT: tbl v2.16b, { v16.16b, v17.16b, v18.16b, v19.16b }, v1.16b 628; CHECK-NEXT: str q2, [x0], #16 629; CHECK-NEXT: b.ne .LBB3_9 630; CHECK-NEXT: // %bb.10: // %middle.block 631; CHECK-NEXT: cmp x11, x10 632; CHECK-NEXT: b.ne .LBB3_5 633; CHECK-NEXT: b .LBB3_7 634entry: 635 %cmp39 = icmp sgt i32 %width, 0 636 br i1 %cmp39, label %for.body.preheader, label %for.cond.cleanup 637 638for.body.preheader: ; preds = %entry 639 %0 = add i32 %width, -1 640 %1 = zext i32 %0 to i64 641 %2 = add nuw nsw i64 %1, 1 642 %min.iters.check = icmp ult i32 %0, 3 643 br i1 %min.iters.check, label %for.body.preheader57, label %vector.memcheck 644 645vector.memcheck: ; preds = %for.body.preheader 646 %3 = add i32 %width, -1 647 %4 = zext i32 %3 to i64 648 %5 = shl nuw nsw i64 %4, 2 649 %6 = add nuw nsw i64 %5, 4 650 %scevgep = getelementptr i8, ptr %dst, i64 %6 651 %scevgep44 = getelementptr float, ptr %data, i64 %6 652 %bound0 = icmp ugt ptr %scevgep44, %dst 653 %bound1 = icmp ugt ptr %scevgep, %data 654 %found.conflict = and i1 %bound0, %bound1 655 br i1 %found.conflict, label %for.body.preheader57, label %vector.ph 656 657vector.ph: ; preds = %vector.memcheck 658 %n.vec = and i64 %2, 8589934588 659 %ind.end = trunc i64 %n.vec to i32 660 %7 = shl nuw nsw i64 %n.vec, 2 661 %ind.end47 = getelementptr float, ptr %data, i64 %7 662 %8 = shl nuw nsw i64 %n.vec, 2 663 %ind.end49 = getelementptr i8, ptr %dst, i64 %8 664 br label %vector.body 665 666vector.body: ; preds = %vector.body, %vector.ph 667 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] 668 %9 = shl i64 %index, 2 669 %next.gep = getelementptr float, ptr %data, i64 %9 670 %10 = shl i64 %index, 2 671 %wide.vec = load <16 x float>, ptr %next.gep, align 4 672 %strided.vec = shufflevector <16 x float> %wide.vec, <16 x float> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12> 673 %strided.vec54 = shufflevector <16 x float> %wide.vec, <16 x float> poison, <4 x i32> <i32 1, i32 5, i32 9, i32 13> 674 %strided.vec55 = shufflevector <16 x float> %wide.vec, <16 x float> poison, <4 x i32> <i32 2, i32 6, i32 10, i32 14> 675 %strided.vec56 = shufflevector <16 x float> %wide.vec, <16 x float> poison, <4 x i32> <i32 3, i32 7, i32 11, i32 15> 676 %11 = fcmp olt <4 x float> %strided.vec, zeroinitializer 677 %12 = fcmp ogt <4 x float> %strided.vec, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 678 %13 = select <4 x i1> %12, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec 679 %14 = select <4 x i1> %11, <4 x float> zeroinitializer, <4 x float> %13 680 %15 = fptoui <4 x float> %14 to <4 x i8> 681 %16 = fcmp olt <4 x float> %strided.vec54, zeroinitializer 682 %17 = fcmp ogt <4 x float> %strided.vec54, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 683 %18 = select <4 x i1> %17, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec54 684 %19 = select <4 x i1> %16, <4 x float> zeroinitializer, <4 x float> %18 685 %20 = fptoui <4 x float> %19 to <4 x i8> 686 %21 = fcmp olt <4 x float> %strided.vec55, zeroinitializer 687 %22 = fcmp ogt <4 x float> %strided.vec55, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 688 %23 = select <4 x i1> %22, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec55 689 %24 = select <4 x i1> %21, <4 x float> zeroinitializer, <4 x float> %23 690 %25 = fptoui <4 x float> %24 to <4 x i8> 691 %26 = fcmp olt <4 x float> %strided.vec56, zeroinitializer 692 %27 = fcmp ogt <4 x float> %strided.vec56, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02> 693 %28 = select <4 x i1> %27, <4 x float> <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>, <4 x float> %strided.vec56 694 %29 = select <4 x i1> %26, <4 x float> zeroinitializer, <4 x float> %28 695 %30 = fptoui <4 x float> %29 to <4 x i8> 696 %31 = getelementptr inbounds i8, ptr %dst, i64 %10 697 %32 = shufflevector <4 x i8> %15, <4 x i8> %20, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 698 %33 = shufflevector <4 x i8> %25, <4 x i8> %30, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 699 %interleaved.vec = shufflevector <8 x i8> %32, <8 x i8> %33, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15> 700 store <16 x i8> %interleaved.vec, ptr %31, align 1 701 %index.next = add nuw i64 %index, 4 702 %34 = icmp eq i64 %index.next, %n.vec 703 br i1 %34, label %middle.block, label %vector.body 704 705middle.block: ; preds = %vector.body 706 %cmp.n = icmp eq i64 %2, %n.vec 707 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader57 708 709for.body.preheader57: ; preds = %vector.memcheck, %for.body.preheader, %middle.block 710 %i.042.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %ind.end, %middle.block ] 711 %src.041.ph = phi ptr [ %data, %vector.memcheck ], [ %data, %for.body.preheader ], [ %ind.end47, %middle.block ] 712 %dst.addr.040.ph = phi ptr [ %dst, %vector.memcheck ], [ %dst, %for.body.preheader ], [ %ind.end49, %middle.block ] 713 br label %for.body 714 715for.cond.cleanup: ; preds = %for.body, %middle.block, %entry 716 ret void 717 718for.body: ; preds = %for.body.preheader57, %for.body 719 %i.042 = phi i32 [ %inc, %for.body ], [ %i.042.ph, %for.body.preheader57 ] 720 %src.041 = phi ptr [ %add.ptr, %for.body ], [ %src.041.ph, %for.body.preheader57 ] 721 %dst.addr.040 = phi ptr [ %add.ptr14, %for.body ], [ %dst.addr.040.ph, %for.body.preheader57 ] 722 %35 = load float, ptr %src.041, align 4 723 %cmp.i = fcmp olt float %35, 0.000000e+00 724 %cmp1.i = fcmp ogt float %35, 2.550000e+02 725 %.x.i = select i1 %cmp1.i, float 2.550000e+02, float %35 726 %retval.0.i = select i1 %cmp.i, float 0.000000e+00, float %.x.i 727 %conv = fptoui float %retval.0.i to i8 728 store i8 %conv, ptr %dst.addr.040, align 1 729 %arrayidx2 = getelementptr inbounds float, ptr %src.041, i64 1 730 %36 = load float, ptr %arrayidx2, align 4 731 %cmp.i27 = fcmp olt float %36, 0.000000e+00 732 %cmp1.i28 = fcmp ogt float %36, 2.550000e+02 733 %.x.i29 = select i1 %cmp1.i28, float 2.550000e+02, float %36 734 %retval.0.i30 = select i1 %cmp.i27, float 0.000000e+00, float %.x.i29 735 %conv4 = fptoui float %retval.0.i30 to i8 736 %arrayidx5 = getelementptr inbounds i8, ptr %dst.addr.040, i64 1 737 store i8 %conv4, ptr %arrayidx5, align 1 738 %arrayidx6 = getelementptr inbounds float, ptr %src.041, i64 2 739 %37 = load float, ptr %arrayidx6, align 4 740 %cmp.i31 = fcmp olt float %37, 0.000000e+00 741 %cmp1.i32 = fcmp ogt float %37, 2.550000e+02 742 %.x.i33 = select i1 %cmp1.i32, float 2.550000e+02, float %37 743 %retval.0.i34 = select i1 %cmp.i31, float 0.000000e+00, float %.x.i33 744 %conv8 = fptoui float %retval.0.i34 to i8 745 %arrayidx9 = getelementptr inbounds i8, ptr %dst.addr.040, i64 2 746 store i8 %conv8, ptr %arrayidx9, align 1 747 %arrayidx10 = getelementptr inbounds float, ptr %src.041, i64 3 748 %38 = load float, ptr %arrayidx10, align 4 749 %cmp.i35 = fcmp olt float %38, 0.000000e+00 750 %cmp1.i36 = fcmp ogt float %38, 2.550000e+02 751 %.x.i37 = select i1 %cmp1.i36, float 2.550000e+02, float %38 752 %retval.0.i38 = select i1 %cmp.i35, float 0.000000e+00, float %.x.i37 753 %conv12 = fptoui float %retval.0.i38 to i8 754 %arrayidx13 = getelementptr inbounds i8, ptr %dst.addr.040, i64 3 755 store i8 %conv12, ptr %arrayidx13, align 1 756 %add.ptr = getelementptr inbounds float, ptr %src.041, i64 4 757 %add.ptr14 = getelementptr inbounds i8, ptr %dst.addr.040, i64 4 758 %inc = add nuw nsw i32 %i.042, 1 759 %exitcond.not = icmp eq i32 %inc, %width 760 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 761} 762