blob: 4cb7cb014d2bf826c1a9e1af5ff2081ff3618d2b [file]
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter "LV: Found an estimated cost of [0-9]+(.[0-9]+)? for VF 1 For instruction:\s*%v0 = load" --filter "Cost of [0-9]+(.[0-9]+)? for VF [0-9]+: (INTERLEAVE-GROUP with factor [0-9]+,|EXPRESSION|REPLICATE|WIDEN)" --filter "^ ir<.* = load from index" --filter "LV: Selecting VF:" --filter "Estimated cost per lane"
; RUN: opt -mtriple=wasm32 -mattr=+simd128 -passes=loop-vectorize %s --debug-only=loop-vectorize --disable-output < %s 2>&1 | FileCheck %s
; RUN: opt -mtriple=wasm32 -mattr=+simd128 -passes=loop-vectorize %s --vectorizer-maximize-bandwidth --debug-only=loop-vectorize --disable-output < %s 2>&1 | FileCheck %s --check-prefix=MAX
define dso_local void @aim_for_vf8(ptr %0, i32 %1, ptr %2, ptr %3, i1 %4, ptr %5, i32 %6, i32 %7, i32 %8, i32 %9, ptr %.out, ptr %.out1, ptr %.out2, ptr %.out3, ptr %.out4) {
; CHECK-LABEL: 'aim_for_vf8'
; CHECK: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4:%[0-9]+]]>, ir<%49>
; CHECK: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5:%[0-9]+]]>, ir<%65>
; CHECK: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6:%[0-9]+]]>, ir<%54>
; CHECK: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7:%[0-9]+]]>, ir<%67>
; CHECK: Cost of 2 for VF 2: WIDEN ir<%28> = load vp<[[VP12:%[0-9]+]]>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%31> = load ir<%29>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%32> = sext ir<%31> to i32
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%33> = load vp<%next.gep>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%34> = sext ir<%33> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%35> = mul nsw ir<%34>, ir<%32>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%36> = add ir<%35>, ir<%21>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%37> = getelementptr inbounds vp<%next.gep>, ir<1>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%38> = load ir<%37>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%39> = sext ir<%38> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%40> = mul nsw ir<%39>, ir<%32>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%41> = add ir<%40>, ir<%23>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%43> = load ir<%42>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%44> = sext ir<%43> to i32
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%45> = getelementptr inbounds vp<%next.gep>, ir<2>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%46> = load ir<%45>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%47> = sext ir<%46> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%48> = mul nsw ir<%47>, ir<%44>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%49> = add ir<%36>, ir<%48>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%50> = getelementptr inbounds vp<%next.gep>, ir<3>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%51> = load ir<%50>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%52> = sext ir<%51> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%53> = mul nsw ir<%52>, ir<%44>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%54> = add ir<%41>, ir<%53>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%55> = load ir<%30>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%56> = sext ir<%55> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%57> = mul nsw ir<%56>, ir<%34>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%58> = add ir<%57>, ir<%22>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%59> = mul nsw ir<%56>, ir<%39>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%60> = add ir<%59>, ir<%24>
; CHECK: Cost of 0 for VF 2: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; CHECK: Cost of 6 for VF 2: REPLICATE ir<%62> = load ir<%61>
; CHECK: Cost of 0 for VF 2: WIDEN-CAST ir<%63> = sext ir<%62> to i32
; CHECK: Cost of 1 for VF 2: WIDEN ir<%64> = mul nsw ir<%63>, ir<%47>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%65> = add ir<%58>, ir<%64>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%66> = mul nsw ir<%63>, ir<%52>
; CHECK: Cost of 1 for VF 2: WIDEN ir<%67> = add ir<%60>, ir<%66>
; CHECK: Cost for VF 2: 75 (Estimated cost per lane: 37.5)
; CHECK: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4]]>, ir<%49>
; CHECK: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5]]>, ir<%65>
; CHECK: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6]]>, ir<%54>
; CHECK: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7]]>, ir<%67>
; CHECK: Cost of 2 for VF 4: WIDEN ir<%28> = load vp<[[VP12]]>
; CHECK: Cost of 0 for VF 4: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; CHECK: Cost of 0 for VF 4: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; CHECK: Cost of 12 for VF 4: REPLICATE ir<%31> = load ir<%29>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%32> = sext ir<%31> to i32
; CHECK: Cost of 18 for VF 4: INTERLEAVE-GROUP with factor 4, vp<%next.gep>
; CHECK: ir<%33> = load from index 0
; CHECK: ir<%38> = load from index 1
; CHECK: ir<%46> = load from index 2
; CHECK: ir<%51> = load from index 3
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%34> = sext ir<%33> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%35> = mul nsw ir<%34>, ir<%32>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%36> = add ir<%35>, ir<%21>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%39> = sext ir<%38> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%40> = mul nsw ir<%39>, ir<%32>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%41> = add ir<%40>, ir<%23>
; CHECK: Cost of 0 for VF 4: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; CHECK: Cost of 12 for VF 4: REPLICATE ir<%43> = load ir<%42>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%44> = sext ir<%43> to i32
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%47> = sext ir<%46> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%48> = mul nsw ir<%47>, ir<%44>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%49> = add ir<%36>, ir<%48>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%52> = sext ir<%51> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%53> = mul nsw ir<%52>, ir<%44>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%54> = add ir<%41>, ir<%53>
; CHECK: Cost of 12 for VF 4: REPLICATE ir<%55> = load ir<%30>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%56> = sext ir<%55> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%57> = mul nsw ir<%56>, ir<%34>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%58> = add ir<%57>, ir<%22>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%59> = mul nsw ir<%56>, ir<%39>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%60> = add ir<%59>, ir<%24>
; CHECK: Cost of 0 for VF 4: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; CHECK: Cost of 12 for VF 4: REPLICATE ir<%62> = load ir<%61>
; CHECK: Cost of 2 for VF 4: WIDEN-CAST ir<%63> = sext ir<%62> to i32
; CHECK: Cost of 1 for VF 4: WIDEN ir<%64> = mul nsw ir<%63>, ir<%47>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%65> = add ir<%58>, ir<%64>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%66> = mul nsw ir<%63>, ir<%52>
; CHECK: Cost of 1 for VF 4: WIDEN ir<%67> = add ir<%60>, ir<%66>
; CHECK: Cost for VF 4: 108 (Estimated cost per lane: 27)
; CHECK: LV: Selecting VF: 4.
;
; MAX-LABEL: 'aim_for_vf8'
; MAX: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4:%[0-9]+]]>, ir<%49>
; MAX: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5:%[0-9]+]]>, ir<%65>
; MAX: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6:%[0-9]+]]>, ir<%54>
; MAX: Cost of 1 for VF 2: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7:%[0-9]+]]>, ir<%67>
; MAX: Cost of 2 for VF 2: WIDEN ir<%28> = load vp<[[VP12:%[0-9]+]]>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%31> = load ir<%29>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%32> = sext ir<%31> to i32
; MAX: Cost of 6 for VF 2: REPLICATE ir<%33> = load vp<%next.gep>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%34> = sext ir<%33> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%35> = mul nsw ir<%34>, ir<%32>
; MAX: Cost of 1 for VF 2: WIDEN ir<%36> = add ir<%35>, ir<%21>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%37> = getelementptr inbounds vp<%next.gep>, ir<1>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%38> = load ir<%37>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%39> = sext ir<%38> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%40> = mul nsw ir<%39>, ir<%32>
; MAX: Cost of 1 for VF 2: WIDEN ir<%41> = add ir<%40>, ir<%23>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%43> = load ir<%42>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%44> = sext ir<%43> to i32
; MAX: Cost of 0 for VF 2: REPLICATE ir<%45> = getelementptr inbounds vp<%next.gep>, ir<2>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%46> = load ir<%45>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%47> = sext ir<%46> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%48> = mul nsw ir<%47>, ir<%44>
; MAX: Cost of 1 for VF 2: WIDEN ir<%49> = add ir<%36>, ir<%48>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%50> = getelementptr inbounds vp<%next.gep>, ir<3>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%51> = load ir<%50>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%52> = sext ir<%51> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%53> = mul nsw ir<%52>, ir<%44>
; MAX: Cost of 1 for VF 2: WIDEN ir<%54> = add ir<%41>, ir<%53>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%55> = load ir<%30>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%56> = sext ir<%55> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%57> = mul nsw ir<%56>, ir<%34>
; MAX: Cost of 1 for VF 2: WIDEN ir<%58> = add ir<%57>, ir<%22>
; MAX: Cost of 1 for VF 2: WIDEN ir<%59> = mul nsw ir<%56>, ir<%39>
; MAX: Cost of 1 for VF 2: WIDEN ir<%60> = add ir<%59>, ir<%24>
; MAX: Cost of 0 for VF 2: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; MAX: Cost of 6 for VF 2: REPLICATE ir<%62> = load ir<%61>
; MAX: Cost of 0 for VF 2: WIDEN-CAST ir<%63> = sext ir<%62> to i32
; MAX: Cost of 1 for VF 2: WIDEN ir<%64> = mul nsw ir<%63>, ir<%47>
; MAX: Cost of 1 for VF 2: WIDEN ir<%65> = add ir<%58>, ir<%64>
; MAX: Cost of 1 for VF 2: WIDEN ir<%66> = mul nsw ir<%63>, ir<%52>
; MAX: Cost of 1 for VF 2: WIDEN ir<%67> = add ir<%60>, ir<%66>
; MAX: Cost for VF 2: 75 (Estimated cost per lane: 37.5)
; MAX: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4]]>, ir<%49>
; MAX: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5]]>, ir<%65>
; MAX: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6]]>, ir<%54>
; MAX: Cost of 1 for VF 4: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7]]>, ir<%67>
; MAX: Cost of 2 for VF 4: WIDEN ir<%28> = load vp<[[VP12]]>
; MAX: Cost of 0 for VF 4: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; MAX: Cost of 0 for VF 4: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; MAX: Cost of 12 for VF 4: REPLICATE ir<%31> = load ir<%29>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%32> = sext ir<%31> to i32
; MAX: Cost of 18 for VF 4: INTERLEAVE-GROUP with factor 4, vp<%next.gep>
; MAX: ir<%33> = load from index 0
; MAX: ir<%38> = load from index 1
; MAX: ir<%46> = load from index 2
; MAX: ir<%51> = load from index 3
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%34> = sext ir<%33> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%35> = mul nsw ir<%34>, ir<%32>
; MAX: Cost of 1 for VF 4: WIDEN ir<%36> = add ir<%35>, ir<%21>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%39> = sext ir<%38> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%40> = mul nsw ir<%39>, ir<%32>
; MAX: Cost of 1 for VF 4: WIDEN ir<%41> = add ir<%40>, ir<%23>
; MAX: Cost of 0 for VF 4: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; MAX: Cost of 12 for VF 4: REPLICATE ir<%43> = load ir<%42>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%44> = sext ir<%43> to i32
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%47> = sext ir<%46> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%48> = mul nsw ir<%47>, ir<%44>
; MAX: Cost of 1 for VF 4: WIDEN ir<%49> = add ir<%36>, ir<%48>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%52> = sext ir<%51> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%53> = mul nsw ir<%52>, ir<%44>
; MAX: Cost of 1 for VF 4: WIDEN ir<%54> = add ir<%41>, ir<%53>
; MAX: Cost of 12 for VF 4: REPLICATE ir<%55> = load ir<%30>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%56> = sext ir<%55> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%57> = mul nsw ir<%56>, ir<%34>
; MAX: Cost of 1 for VF 4: WIDEN ir<%58> = add ir<%57>, ir<%22>
; MAX: Cost of 1 for VF 4: WIDEN ir<%59> = mul nsw ir<%56>, ir<%39>
; MAX: Cost of 1 for VF 4: WIDEN ir<%60> = add ir<%59>, ir<%24>
; MAX: Cost of 0 for VF 4: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; MAX: Cost of 12 for VF 4: REPLICATE ir<%62> = load ir<%61>
; MAX: Cost of 2 for VF 4: WIDEN-CAST ir<%63> = sext ir<%62> to i32
; MAX: Cost of 1 for VF 4: WIDEN ir<%64> = mul nsw ir<%63>, ir<%47>
; MAX: Cost of 1 for VF 4: WIDEN ir<%65> = add ir<%58>, ir<%64>
; MAX: Cost of 1 for VF 4: WIDEN ir<%66> = mul nsw ir<%63>, ir<%52>
; MAX: Cost of 1 for VF 4: WIDEN ir<%67> = add ir<%60>, ir<%66>
; MAX: Cost for VF 4: 108 (Estimated cost per lane: 27)
; MAX: Cost of 1 for VF 8: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4]]>, ir<%49>
; MAX: Cost of 1 for VF 8: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5]]>, ir<%65>
; MAX: Cost of 1 for VF 8: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6]]>, ir<%54>
; MAX: Cost of 1 for VF 8: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7]]>, ir<%67>
; MAX: Cost of 2 for VF 8: WIDEN ir<%28> = load vp<[[VP12]]>
; MAX: Cost of 0 for VF 8: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; MAX: Cost of 0 for VF 8: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; MAX: Cost of 24 for VF 8: REPLICATE ir<%31> = load ir<%29>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%32> = sext ir<%31> to i32
; MAX: Cost of 26 for VF 8: INTERLEAVE-GROUP with factor 4, vp<%next.gep>
; MAX: ir<%33> = load from index 0
; MAX: ir<%38> = load from index 1
; MAX: ir<%46> = load from index 2
; MAX: ir<%51> = load from index 3
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%34> = sext ir<%33> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%35> = mul nsw ir<%34>, ir<%32>
; MAX: Cost of 2 for VF 8: WIDEN ir<%36> = add ir<%35>, ir<%21>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%39> = sext ir<%38> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%40> = mul nsw ir<%39>, ir<%32>
; MAX: Cost of 2 for VF 8: WIDEN ir<%41> = add ir<%40>, ir<%23>
; MAX: Cost of 0 for VF 8: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; MAX: Cost of 24 for VF 8: REPLICATE ir<%43> = load ir<%42>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%44> = sext ir<%43> to i32
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%47> = sext ir<%46> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%48> = mul nsw ir<%47>, ir<%44>
; MAX: Cost of 2 for VF 8: WIDEN ir<%49> = add ir<%36>, ir<%48>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%52> = sext ir<%51> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%53> = mul nsw ir<%52>, ir<%44>
; MAX: Cost of 2 for VF 8: WIDEN ir<%54> = add ir<%41>, ir<%53>
; MAX: Cost of 24 for VF 8: REPLICATE ir<%55> = load ir<%30>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%56> = sext ir<%55> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%57> = mul nsw ir<%56>, ir<%34>
; MAX: Cost of 2 for VF 8: WIDEN ir<%58> = add ir<%57>, ir<%22>
; MAX: Cost of 2 for VF 8: WIDEN ir<%59> = mul nsw ir<%56>, ir<%39>
; MAX: Cost of 2 for VF 8: WIDEN ir<%60> = add ir<%59>, ir<%24>
; MAX: Cost of 0 for VF 8: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; MAX: Cost of 24 for VF 8: REPLICATE ir<%62> = load ir<%61>
; MAX: Cost of 5 for VF 8: WIDEN-CAST ir<%63> = sext ir<%62> to i32
; MAX: Cost of 2 for VF 8: WIDEN ir<%64> = mul nsw ir<%63>, ir<%47>
; MAX: Cost of 2 for VF 8: WIDEN ir<%65> = add ir<%58>, ir<%64>
; MAX: Cost of 2 for VF 8: WIDEN ir<%66> = mul nsw ir<%63>, ir<%52>
; MAX: Cost of 2 for VF 8: WIDEN ir<%67> = add ir<%60>, ir<%66>
; MAX: Cost for VF 8: 210 (Estimated cost per lane: 26.3)
; MAX: Cost of 1 for VF 16: WIDEN-REDUCTION-PHI ir<%21> = phi (add) vp<[[VP4]]>, vp<[[VP15:%[0-9]+]]> (VF scaled by 1/4)
; MAX: Cost of 1 for VF 16: WIDEN-REDUCTION-PHI ir<%22> = phi (add) vp<[[VP5]]>, vp<[[VP19:%[0-9]+]]> (VF scaled by 1/4)
; MAX: Cost of 1 for VF 16: WIDEN-REDUCTION-PHI ir<%23> = phi (add) vp<[[VP6]]>, vp<[[VP16:%[0-9]+]]> (VF scaled by 1/4)
; MAX: Cost of 1 for VF 16: WIDEN-REDUCTION-PHI ir<%24> = phi (add) vp<[[VP7]]>, vp<[[VP20:%[0-9]+]]> (VF scaled by 1/4)
; MAX: Cost of 4 for VF 16: WIDEN ir<%28> = load vp<[[VP12]]>
; MAX: Cost of 0 for VF 16: REPLICATE ir<%29> = getelementptr inbounds ir<%18>, ir<%28>
; MAX: Cost of 0 for VF 16: REPLICATE ir<%30> = getelementptr inbounds ir<%19>, ir<%28>
; MAX: Cost of 48 for VF 16: REPLICATE ir<%31> = load ir<%29>
; MAX: Cost of 132 for VF 16: INTERLEAVE-GROUP with factor 4, vp<%next.gep>
; MAX: ir<%33> = load from index 0
; MAX: ir<%38> = load from index 1
; MAX: ir<%46> = load from index 2
; MAX: ir<%51> = load from index 3
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP13:%[0-9]+]]> = ir<%21> + partial.reduce.add (mul nsw (ir<%33> sext to i32), (ir<%31> sext to i32))
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP14:%[0-9]+]]> = ir<%23> + partial.reduce.add (mul nsw (ir<%38> sext to i32), (ir<%31> sext to i32))
; MAX: Cost of 0 for VF 16: REPLICATE ir<%42> = getelementptr inbounds ir<%29>, ir<%6>
; MAX: Cost of 48 for VF 16: REPLICATE ir<%43> = load ir<%42>
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP15]]> = vp<[[VP13]]> + partial.reduce.add (mul nsw (ir<%46> sext to i32), (ir<%43> sext to i32))
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP16]]> = vp<[[VP14]]> + partial.reduce.add (mul nsw (ir<%51> sext to i32), (ir<%43> sext to i32))
; MAX: Cost of 48 for VF 16: REPLICATE ir<%55> = load ir<%30>
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP17:%[0-9]+]]> = ir<%22> + partial.reduce.add (mul nsw (ir<%55> sext to i32), (ir<%33> sext to i32))
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP18:%[0-9]+]]> = ir<%24> + partial.reduce.add (mul nsw (ir<%55> sext to i32), (ir<%38> sext to i32))
; MAX: Cost of 0 for VF 16: REPLICATE ir<%61> = getelementptr inbounds ir<%30>, ir<%6>
; MAX: Cost of 48 for VF 16: REPLICATE ir<%62> = load ir<%61>
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP19]]> = vp<[[VP17]]> + partial.reduce.add (mul nsw (ir<%62> sext to i32), (ir<%46> sext to i32))
; MAX: Cost of 2 for VF 16: EXPRESSION vp<[[VP20]]> = vp<[[VP18]]> + partial.reduce.add (mul nsw (ir<%62> sext to i32), (ir<%51> sext to i32))
; MAX: Cost for VF 16: 352 (Estimated cost per lane: 22)
; MAX: LV: Selecting VF: 16.
;
newFuncRoot:
br label %10
10: ; preds = %newFuncRoot, %73
%11 = phi i32 [ 0, %newFuncRoot ], [ %78, %73 ]
%12 = phi i32 [ 0, %newFuncRoot ], [ %77, %73 ]
%13 = phi i32 [ 0, %newFuncRoot ], [ %76, %73 ]
%14 = phi i32 [ 0, %newFuncRoot ], [ %75, %73 ]
%15 = phi ptr [ %0, %newFuncRoot ], [ %74, %73 ]
%16 = phi i32 [ 0, %newFuncRoot ], [ %79, %73 ]
%17 = mul i32 %1, %16
%18 = getelementptr i8, ptr %2, i32 %17
%19 = getelementptr i8, ptr %3, i32 %17
br i1 %4, label %20, label %73
20: ; preds = %20, %10
%21 = phi i32 [ %49, %20 ], [ %11, %10 ]
%22 = phi i32 [ %65, %20 ], [ %12, %10 ]
%23 = phi i32 [ %54, %20 ], [ %13, %10 ]
%24 = phi i32 [ %67, %20 ], [ %14, %10 ]
%25 = phi ptr [ %68, %20 ], [ %15, %10 ]
%26 = phi i32 [ %69, %20 ], [ 0, %10 ]
%27 = getelementptr inbounds [4 x i8], ptr %5, i32 %26
%28 = load i32, ptr %27, align 4
%29 = getelementptr inbounds i8, ptr %18, i32 %28
%30 = getelementptr inbounds i8, ptr %19, i32 %28
%31 = load i8, ptr %29, align 1
%32 = sext i8 %31 to i32
%33 = load i8, ptr %25, align 1
%34 = sext i8 %33 to i32
%35 = mul nsw i32 %34, %32
%36 = add nsw i32 %35, %21
%37 = getelementptr inbounds i8, ptr %25, i32 1
%38 = load i8, ptr %37, align 1
%39 = sext i8 %38 to i32
%40 = mul nsw i32 %39, %32
%41 = add nsw i32 %40, %23
%42 = getelementptr inbounds i8, ptr %29, i32 %6
%43 = load i8, ptr %42, align 1
%44 = sext i8 %43 to i32
%45 = getelementptr inbounds i8, ptr %25, i32 2
%46 = load i8, ptr %45, align 1
%47 = sext i8 %46 to i32
%48 = mul nsw i32 %47, %44
%49 = add nsw i32 %36, %48
%50 = getelementptr inbounds i8, ptr %25, i32 3
%51 = load i8, ptr %50, align 1
%52 = sext i8 %51 to i32
%53 = mul nsw i32 %52, %44
%54 = add nsw i32 %41, %53
%55 = load i8, ptr %30, align 1
%56 = sext i8 %55 to i32
%57 = mul nsw i32 %56, %34
%58 = add nsw i32 %57, %22
%59 = mul nsw i32 %56, %39
%60 = add nsw i32 %59, %24
%61 = getelementptr inbounds i8, ptr %30, i32 %6
%62 = load i8, ptr %61, align 1
%63 = sext i8 %62 to i32
%64 = mul nsw i32 %63, %47
%65 = add nsw i32 %58, %64
%66 = mul nsw i32 %63, %52
%67 = add nsw i32 %60, %66
%68 = getelementptr inbounds i8, ptr %25, i32 4
%69 = add nuw nsw i32 %26, 1
%70 = icmp eq i32 %69, %7
br i1 %70, label %71, label %20
71: ; preds = %20
%72 = getelementptr i8, ptr %15, i32 %8
br label %73
73: ; preds = %71, %10
%74 = phi ptr [ %15, %10 ], [ %72, %71 ]
%75 = phi i32 [ %14, %10 ], [ %67, %71 ]
%76 = phi i32 [ %13, %10 ], [ %54, %71 ]
%77 = phi i32 [ %12, %10 ], [ %65, %71 ]
%78 = phi i32 [ %11, %10 ], [ %49, %71 ]
store i32 %78, ptr %.out4, align 4
store i32 %77, ptr %.out3, align 4
store i32 %76, ptr %.out2, align 4
store i32 %75, ptr %.out1, align 4
store ptr %74, ptr %.out, align 4
%79 = add nuw nsw i32 %16, 2
%80 = or disjoint i32 %79, 1
%81 = icmp slt i32 %80, %9
br i1 %81, label %10, label %.exitStub
.exitStub: ; preds = %73
ret void
}