| ; 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 | |
| } |