[VectorCombine] Missed scalarization of negation through `mul` with a scalar splat
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
## Description
The direct form `-splat(b)` is scalarized, but the equivalent opportunity is missed when the splat is an operand of `mul`.
## Reproducer
```llvm
target triple = "x86_64-unknown-linux-gnu"
define <16 x i32> @src(<16 x i32> %a, i32 %b) {
%splat.ins = insertelement <16 x i32> poison, i32 %b, i64 0
%splat = shufflevector <16 x i32> %splat.ins, <16 x i32> poison,
<16 x i32> zeroinitializer
%mul = mul <16 x i32> %a, %splat
%neg = sub <16 x i32> zeroinitializer, %mul
ret <16 x i32> %neg
}
```
The negation remains vector-valued.
The equivalent direct case is already scalarized:
```llvm
define <16 x i32> @direct(<16 x i32> %a, i32 %b) {
%splat.ins = insertelement <16 x i32> poison, i32 %b, i64 0
%splat = shufflevector <16 x i32> %splat.ins, <16 x i32> poison,
<16 x i32> zeroinitializer
%neg = sub <16 x i32> zeroinitializer, %splat
ret <16 x i32> %neg
}
```
## Expected
For wrapping integer arithmetic, use:
```text
-(A * splat(B)) -> A * splat(-B)
```
so the negation can be performed as a scalar operation before the splat:
```llvm
define <16 x i32> @expected(<16 x i32> %a, i32 %b) {
%neg.scalar = sub i32 0, %b
%splat.ins = insertelement <16 x i32> poison, i32 %neg.scalar, i64 0
%splat = shufflevector <16 x i32> %splat.ins, <16 x i32> poison,
<16 x i32> zeroinitializer
%mul = mul <16 x i32> %a, %splat
ret <16 x i32> %mul
}
```
# Representative Vector Neg-Mul-Splat Contexts
## Context 1: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm.cpp.ll:1630`
- Function: `_Z18MlasSymmQgemmPackBmmPKambiPv`
- Block: `vector.body`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1626`; `sub` line: `1630`
- `mul` operands: `%broadcast.splat, %wide.load`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 1613, "insert_def": "%broadcast.splatinsert", "insert_line": 1612, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointA"}, "second_operand": "poison", "value": "%ZeroPointA", "vector_type": "<16 x i32>"}]`
```llvm
1627: %10 = mul <16 x i32> %broadcast.splat, %wide.load13
1628: %11 = mul <16 x i32> %broadcast.splat, %wide.load14
1629: %12 = mul <16 x i32> %broadcast.splat, %wide.load15
1630: %13 = sub <16 x i32> zeroinitializer, %9
1631: %14 = sub <16 x i32> zeroinitializer, %10
1632: %15 = sub <16 x i32> zeroinitializer, %11
1633: %16 = sub <16 x i32> zeroinitializer, %12
```
show more
## Context 2: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:337`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_U8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph380`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `333`; `sub` line: `337`
- `mul` operands: `%wide.load387, %broadcast.splat384`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat384", "broadcast_line": 222, "insert_def": "%broadcast.splatinsert383", "insert_line": 221, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
334: %89 = mul <16 x i32> %wide.load388, %broadcast.splat384
335: %90 = mul <16 x i32> %wide.load389, %broadcast.splat384
336: %91 = mul <16 x i32> %wide.load390, %broadcast.splat384
337: %92 = sub <16 x i32> zeroinitializer, %88
338: %93 = sub <16 x i32> zeroinitializer, %89
339: %94 = sub <16 x i32> zeroinitializer, %90
340: %95 = sub <16 x i32> zeroinitializer, %91
```
## Context 3: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_default.cpp.ll:1600`
- Function: `_Z22MlasGemmQuantOperationI30MLAS_GEMM_QUANT_KERNEL_DEFAULTEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph659`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1596`; `sub` line: `1600`
- `mul` operands: `%wide.load666, %broadcast.splat663`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat663", "broadcast_line": 1296, "insert_def": "%broadcast.splatinsert662", "insert_line": 1295, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointA.addr.0.i"}, "second_operand": "poison", "value": "%ZeroPointA.addr.0.i", "vector_type": "<16 x i32>"}]`
```llvm
1597: %76 = mul <16 x i32> %wide.load667, %broadcast.splat663
1598: %77 = mul <16 x i32> %wide.load668, %broadcast.splat663
1599: %78 = mul <16 x i32> %wide.load669, %broadcast.splat663
1600: %79 = sub <16 x i32> zeroinitializer, %75
1601: %80 = sub <16 x i32> zeroinitializer, %76
1602: %81 = sub <16 x i32> zeroinitializer, %77
1603: %82 = sub <16 x i32> zeroinitializer, %78
```
## Context 4: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_sse.cpp.ll:1763`
- Function: `_Z22MlasGemmQuantOperationI25MLAS_GEMM_U8X8_KERNEL_SSEEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph406`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1759`; `sub` line: `1763`
- `mul` operands: `%wide.load413, %broadcast.splat410`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat410", "broadcast_line": 1115, "insert_def": "%broadcast.splatinsert409", "insert_line": 1114, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
1760: %197 = mul <16 x i32> %wide.load414, %broadcast.splat410
1761: %198 = mul <16 x i32> %wide.load415, %broadcast.splat410
1762: %199 = mul <16 x i32> %wide.load416, %broadcast.splat410
1763: %200 = sub <16 x i32> zeroinitializer, %196
1764: %201 = sub <16 x i32> zeroinitializer, %197
1765: %202 = sub <16 x i32> zeroinitializer, %198
1766: %203 = sub <16 x i32> zeroinitializer, %199
```
## Context 5: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:1291`
- Function: `_Z28MlasGemmQuantPackedOperationI26MLAS_GEMM_U8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph417`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1287`; `sub` line: `1291`
- `mul` operands: `%wide.load424, %broadcast.splat421`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat421", "broadcast_line": 1167, "insert_def": "%broadcast.splatinsert420", "insert_line": 1166, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
1288: %86 = mul <16 x i32> %wide.load425, %broadcast.splat421
1289: %87 = mul <16 x i32> %wide.load426, %broadcast.splat421
1290: %88 = mul <16 x i32> %wide.load427, %broadcast.splat421
1291: %89 = sub <16 x i32> zeroinitializer, %85
1292: %90 = sub <16 x i32> zeroinitializer, %86
1293: %91 = sub <16 x i32> zeroinitializer, %87
1294: %92 = sub <16 x i32> zeroinitializer, %88
```
## Context 6: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:2763`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_U8U8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `2762`; `sub` line: `2763`
- `mul` operands: `%wide.load, %broadcast.splat`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 2325, "insert_def": "%broadcast.splatinsert", "insert_line": 2324, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv22"}, "second_operand": "poison", "value": "%conv22", "vector_type": "<16 x i32>"}]`
```llvm
2760: %n.vec = and i64 %.sroa.speculated.us.us.us, 16
2761: %wide.load = load <16 x i32>, ptr %add.ptr1, align 4, !tbaa !54
2762: %155 = mul <16 x i32> %wide.load, %broadcast.splat
2763: %156 = sub <16 x i32> zeroinitializer, %155
2764: store <16 x i32> %156, ptr %add.ptr1, align 4, !tbaa !54
2765: %cmp.n = icmp eq i64 %sub68.us.us.us, %n.vec
2766: br i1 %cmp.n, label %if.end84.us.us.us, label %vec.epilog.iter.check
```
## Context 7: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:3683`
- Function: `_Z28MlasGemmQuantPackedOperationI26MLAS_GEMM_U8U8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph362`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `3679`; `sub` line: `3683`
- `mul` operands: `%wide.load369, %broadcast.splat366`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat366", "broadcast_line": 3574, "insert_def": "%broadcast.splatinsert365", "insert_line": 3573, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
3680: %70 = mul <16 x i32> %wide.load370, %broadcast.splat366
3681: %71 = mul <16 x i32> %wide.load371, %broadcast.splat366
3682: %72 = mul <16 x i32> %wide.load372, %broadcast.splat366
3683: %73 = sub <16 x i32> zeroinitializer, %69
3684: %74 = sub <16 x i32> zeroinitializer, %70
3685: %75 = sub <16 x i32> zeroinitializer, %71
3686: %76 = sub <16 x i32> zeroinitializer, %72
```
## Context 8: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:4947`
- Function: `_Z22MlasGemmQuantOperationI30MLAS_GEMM_U8U8_KERNEL_AVX2VNNIEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `4946`; `sub` line: `4947`
- `mul` operands: `%wide.load, %broadcast.splat`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 4509, "insert_def": "%broadcast.splatinsert", "insert_line": 4508, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv22"}, "second_operand": "poison", "value": "%conv22", "vector_type": "<16 x i32>"}]`
```llvm
4944: %n.vec = and i64 %.sroa.speculated.us.us.us, 16
4945: %wide.load = load <16 x i32>, ptr %add.ptr1, align 4, !tbaa !54
4946: %155 = mul <16 x i32> %wide.load, %broadcast.splat
4947: %156 = sub <16 x i32> zeroinitializer, %155
4948: store <16 x i32> %156, ptr %add.ptr1, align 4, !tbaa !54
4949: %cmp.n = icmp eq i64 %sub68.us.us.us, %n.vec
4950: br i1 %cmp.n, label %if.end84.us.us.us, label %vec.epilog.iter.check
```
## Context 9: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:5842`
- Function: `_Z28MlasGemmQuantPackedOperationI30MLAS_GEMM_U8U8_KERNEL_AVX2VNNIEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph360`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `5838`; `sub` line: `5842`
- `mul` operands: `%wide.load367, %broadcast.splat364`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat364", "broadcast_line": 5733, "insert_def": "%broadcast.splatinsert363", "insert_line": 5732, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
5839: %70 = mul <16 x i32> %wide.load368, %broadcast.splat364
5840: %71 = mul <16 x i32> %wide.load369, %broadcast.splat364
5841: %72 = mul <16 x i32> %wide.load370, %broadcast.splat364
5842: %73 = sub <16 x i32> zeroinitializer, %69
5843: %74 = sub <16 x i32> zeroinitializer, %70
5844: %75 = sub <16 x i32> zeroinitializer, %71
5845: %76 = sub <16 x i32> zeroinitializer, %72
```
## Context 10: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:7081`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_S8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `7080`; `sub` line: `7081`
- `mul` operands: `%wide.load, %broadcast.splat`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 6643, "insert_def": "%broadcast.splatinsert", "insert_line": 6642, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv22"}, "second_operand": "poison", "value": "%conv22", "vector_type": "<16 x i32>"}]`
```llvm
7078: %n.vec = and i64 %.sroa.speculated.us.us.us, 16
7079: %wide.load = load <16 x i32>, ptr %add.ptr1, align 4, !tbaa !54
7080: %155 = mul <16 x i32> %wide.load, %broadcast.splat
7081: %156 = sub <16 x i32> zeroinitializer, %155
7082: store <16 x i32> %156, ptr %add.ptr1, align 4, !tbaa !54
7083: %cmp.n = icmp eq i64 %sub68.us.us.us, %n.vec
7084: br i1 %cmp.n, label %if.end84.us.us.us, label %vec.epilog.iter.check
```
## Context 11: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:8001`
- Function: `_Z28MlasGemmQuantPackedOperationI26MLAS_GEMM_S8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph362`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `7997`; `sub` line: `8001`
- `mul` operands: `%wide.load369, %broadcast.splat366`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat366", "broadcast_line": 7892, "insert_def": "%broadcast.splatinsert365", "insert_line": 7891, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
7998: %70 = mul <16 x i32> %wide.load370, %broadcast.splat366
7999: %71 = mul <16 x i32> %wide.load371, %broadcast.splat366
8000: %72 = mul <16 x i32> %wide.load372, %broadcast.splat366
8001: %73 = sub <16 x i32> zeroinitializer, %69
8002: %74 = sub <16 x i32> zeroinitializer, %70
8003: %75 = sub <16 x i32> zeroinitializer, %71
8004: %76 = sub <16 x i32> zeroinitializer, %72
```
## Context 12: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:9265`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_S8U8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `9264`; `sub` line: `9265`
- `mul` operands: `%wide.load, %broadcast.splat`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 8827, "insert_def": "%broadcast.splatinsert", "insert_line": 8826, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv22"}, "second_operand": "poison", "value": "%conv22", "vector_type": "<16 x i32>"}]`
```llvm
9262: %n.vec = and i64 %.sroa.speculated.us.us.us, 16
9263: %wide.load = load <16 x i32>, ptr %add.ptr1, align 4, !tbaa !54
9264: %155 = mul <16 x i32> %wide.load, %broadcast.splat
9265: %156 = sub <16 x i32> zeroinitializer, %155
9266: store <16 x i32> %156, ptr %add.ptr1, align 4, !tbaa !54
9267: %cmp.n = icmp eq i64 %sub68.us.us.us, %n.vec
9268: br i1 %cmp.n, label %if.end84.us.us.us, label %vec.epilog.iter.check
```
## Context 13: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:10185`
- Function: `_Z28MlasGemmQuantPackedOperationI26MLAS_GEMM_S8U8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vector.ph362`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `10181`; `sub` line: `10185`
- `mul` operands: `%wide.load369, %broadcast.splat366`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat366", "broadcast_line": 10076, "insert_def": "%broadcast.splatinsert365", "insert_line": 10075, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<16 x i32>"}]`
```llvm
10182: %70 = mul <16 x i32> %wide.load370, %broadcast.splat366
10183: %71 = mul <16 x i32> %wide.load371, %broadcast.splat366
10184: %72 = mul <16 x i32> %wide.load372, %broadcast.splat366
10185: %73 = sub <16 x i32> zeroinitializer, %69
10186: %74 = sub <16 x i32> zeroinitializer, %70
10187: %75 = sub <16 x i32> zeroinitializer, %71
10188: %76 = sub <16 x i32> zeroinitializer, %72
```
## Context 14: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:425`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_U8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vec.epilog.vector.body404`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `424`; `sub` line: `425`
- `mul` operands: `%wide.load406, %broadcast.splat403`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat403", "broadcast_line": 239, "insert_def": "%broadcast.splatinsert402", "insert_line": 238, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<8 x i32>"}]`
```llvm
422: %123 = getelementptr inbounds nuw [4 x i8], ptr %add.ptr2, i64 %index405
423: %wide.load406 = load <8 x i32>, ptr %123, align 4, !tbaa !54
424: %124 = mul <8 x i32> %wide.load406, %broadcast.splat403
425: %125 = sub <8 x i32> zeroinitializer, %124
426: store <8 x i32> %125, ptr %123, align 4, !tbaa !54
427: %index.next407 = add nuw i64 %index405, 8
428: %126 = icmp eq i64 %index.next407, %n.vec401
```
## Context 15: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_avx2.cpp.ll:539`
- Function: `_Z22MlasGemmQuantOperationI26MLAS_GEMM_U8S8_KERNEL_AVX2EvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vec.epilog.vector.body`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `538`; `sub` line: `539`
- `mul` operands: `%broadcast.splat358, %wide.load360`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat358", "broadcast_line": 245, "insert_def": "%broadcast.splatinsert357", "insert_line": 244, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointB.addr.0.i"}, "second_operand": "poison", "value": "%ZeroPointB.addr.0.i", "vector_type": "<4 x i32>"}]`
```llvm
536: %137 = getelementptr inbounds nuw [4 x i8], ptr %add.ptr1, i64 %index359
537: %wide.load360 = load <4 x i32>, ptr %137, align 4, !tbaa !54
538: %138 = mul <4 x i32> %broadcast.splat358, %wide.load360
539: %139 = sub <4 x i32> zeroinitializer, %138
540: store <4 x i32> %139, ptr %137, align 4, !tbaa !54
541: %index.next361 = add nuw i64 %index359, 4
542: %140 = icmp eq i64 %index.next361, %n.vec356
```
## Context 16: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_default.cpp.ll:1648`
- Function: `_Z22MlasGemmQuantOperationI30MLAS_GEMM_QUANT_KERNEL_DEFAULTEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vec.epilog.vector.body683`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1647`; `sub` line: `1648`
- `mul` operands: `%wide.load685, %broadcast.splat682`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat682", "broadcast_line": 1305, "insert_def": "%broadcast.splatinsert681", "insert_line": 1304, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointA.addr.0.i"}, "second_operand": "poison", "value": "%ZeroPointA.addr.0.i", "vector_type": "<8 x i32>"}]`
```llvm
1645: %92 = getelementptr inbounds nuw [4 x i8], ptr %add.ptr2, i64 %index684
1646: %wide.load685 = load <8 x i32>, ptr %92, align 4, !tbaa !23
1647: %93 = mul <8 x i32> %wide.load685, %broadcast.splat682
1648: %94 = sub <8 x i32> zeroinitializer, %93
1649: store <8 x i32> %94, ptr %92, align 4, !tbaa !23
1650: %index.next686 = add nuw i64 %index684, 8
1651: %95 = icmp eq i64 %index.next686, %n.vec680
```
## Context 17: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_default.cpp.ll:2114`
- Function: `_Z22MlasGemmQuantOperationI30MLAS_GEMM_QUANT_KERNEL_DEFAULTEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vec.epilog.vector.body522`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `2113`; `sub` line: `2114`
- `mul` operands: `%wide.load524, %broadcast.splat521`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat521", "broadcast_line": 1311, "insert_def": "%broadcast.splatinsert520", "insert_line": 1310, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointB.addr.0.i"}, "second_operand": "poison", "value": "%ZeroPointB.addr.0.i", "vector_type": "<4 x i32>"}]`
```llvm
2111: %195 = getelementptr inbounds nuw [4 x i8], ptr %add.ptr1, i64 %index523
2112: %wide.load524 = load <4 x i32>, ptr %195, align 4, !tbaa !23
2113: %196 = mul <4 x i32> %wide.load524, %broadcast.splat521
2114: %197 = sub <4 x i32> zeroinitializer, %196
2115: store <4 x i32> %197, ptr %195, align 4, !tbaa !23
2116: %index.next525 = add nuw i64 %index523, 4
2117: %198 = icmp eq i64 %index.next525, %n.vec519
```
## Context 18: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm_kernel_sse.cpp.ll:1811`
- Function: `_Z22MlasGemmQuantOperationI25MLAS_GEMM_U8X8_KERNEL_SSEEvPK28MLAS_GEMM_QUANT_SHAPE_PARAMSPK27MLAS_GEMM_QUANT_DATA_PARAMSmmmm`
- Block: `vec.epilog.vector.body`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1810`; `sub` line: `1811`
- `mul` operands: `%wide.load425, %broadcast.splat423`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat423", "broadcast_line": 1124, "insert_def": "%broadcast.splatinsert422", "insert_line": 1123, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%conv"}, "second_operand": "poison", "value": "%conv", "vector_type": "<8 x i32>"}]`
```llvm
1808: %213 = getelementptr inbounds nuw [4 x i8], ptr %add.ptr2, i64 %index424
1809: %wide.load425 = load <8 x i32>, ptr %213, align 4, !tbaa !13
1810: %214 = mul <8 x i32> %wide.load425, %broadcast.splat423
1811: %215 = sub <8 x i32> zeroinitializer, %214
1812: store <8 x i32> %215, ptr %213, align 4, !tbaa !13
1813: %index.next426 = add nuw i64 %index424, 8
1814: %216 = icmp eq i64 %index.next426, %n.vec421
```
## Context 19: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm.cpp.ll:1631`
- Function: `_Z18MlasSymmQgemmPackBmmPKambiPv`
- Block: `vector.body`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1627`; `sub` line: `1631`
- `mul` operands: `%broadcast.splat, %wide.load13`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 1613, "insert_def": "%broadcast.splatinsert", "insert_line": 1612, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointA"}, "second_operand": "poison", "value": "%ZeroPointA", "vector_type": "<16 x i32>"}]`
```llvm
1628: %11 = mul <16 x i32> %broadcast.splat, %wide.load14
1629: %12 = mul <16 x i32> %broadcast.splat, %wide.load15
1630: %13 = sub <16 x i32> zeroinitializer, %9
1631: %14 = sub <16 x i32> zeroinitializer, %10
1632: %15 = sub <16 x i32> zeroinitializer, %11
1633: %16 = sub <16 x i32> zeroinitializer, %12
1634: store <16 x i32> %13, ptr %5, align 4, !tbaa !74
```
## Context 20: `direct_vector_splat_unflagged`
- Module: `bench/onnxruntime-x86_64-v4/optimized/onnxruntime__core__mlas__lib__qgemm.cpp.ll:1632`
- Function: `_Z18MlasSymmQgemmPackBmmPKambiPv`
- Block: `vector.body`
- Exact family match: `true`
- One-use chain: `true`
- `mul` line: `1628`; `sub` line: `1632`
- `mul` operands: `%broadcast.splat, %wide.load14`
- Splat proofs: `[{"broadcast_def": "%broadcast.splat", "broadcast_line": 1613, "insert_def": "%broadcast.splatinsert", "insert_line": 1612, "kind": "variable_scalar_splat", "mask": "zero", "scalar_source": {"kind": "ssa", "value": "%ZeroPointA"}, "second_operand": "poison", "value": "%ZeroPointA", "vector_type": "<16 x i32>"}]`
```llvm
1629: %12 = mul <16 x i32> %broadcast.splat, %wide.load15
1630: %13 = sub <16 x i32> zeroinitializer, %9
1631: %14 = sub <16 x i32> zeroinitializer, %10
1632: %15 = sub <16 x i32> zeroinitializer, %11
1633: %16 = sub <16 x i32> zeroinitializer, %12
1634: store <16 x i32> %13, ptr %5, align 4, !tbaa !74
1635: store <16 x i32> %14, ptr %6, align 4, !tbaa !74
```
Contributor guide
Assessment
This issue has not been assessed yet.