[llvm] [SLP]Initial support for non-power-of-2 vectorization (PR #151530)

via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 18 11:58:51 PST 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {undef deprecator}-->


:warning: undef deprecator found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git diff -U0 --pickaxe-regex -S '([^a-zA-Z0-9#_-]undef([^a-zA-Z0-9_-]|$)|UndefValue::get)' 'HEAD~1' HEAD llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp llvm/test/Transforms/SLPVectorizer/AArch64/InstructionsState-is-invalid-0.ll llvm/test/Transforms/SLPVectorizer/AArch64/PR38339.ll llvm/test/Transforms/SLPVectorizer/AArch64/div-like-mixed-with-undefs.ll llvm/test/Transforms/SLPVectorizer/AArch64/reused-scalar-repeated-in-node.ll llvm/test/Transforms/SLPVectorizer/AArch64/transpose-inseltpoison.ll llvm/test/Transforms/SLPVectorizer/AArch64/transpose.ll llvm/test/Transforms/SLPVectorizer/AArch64/tsc-s116.ll llvm/test/Transforms/SLPVectorizer/AArch64/vectorizable-selects-uniform-cmps.ll llvm/test/Transforms/SLPVectorizer/RISCV/basic-strided-loads.ll llvm/test/Transforms/SLPVectorizer/RISCV/gather-insert-point-restore.ll llvm/test/Transforms/SLPVectorizer/RISCV/reductions.ll llvm/test/Transforms/SLPVectorizer/RISCV/reordered-buildvector-scalars.ll llvm/test/Transforms/SLPVectorizer/RISCV/smin-signed-zextended.ll llvm/test/Transforms/SLPVectorizer/RISCV/unordered-loads-operands.ll llvm/test/Transforms/SLPVectorizer/SystemZ/reuse-non-power-of-2-reorder.ll llvm/test/Transforms/SLPVectorizer/X86/PR39774.ll llvm/test/Transforms/SLPVectorizer/X86/PR40310.ll llvm/test/Transforms/SLPVectorizer/X86/bool-mask.ll llvm/test/Transforms/SLPVectorizer/X86/bv-shuffle-mask.ll llvm/test/Transforms/SLPVectorizer/X86/cse.ll llvm/test/Transforms/SLPVectorizer/X86/div-possibly-extended-with-poisons.ll llvm/test/Transforms/SLPVectorizer/X86/extractelement-multi-register-use.ll llvm/test/Transforms/SLPVectorizer/X86/extractelement-single-use-many-nodes.ll llvm/test/Transforms/SLPVectorizer/X86/extractelements-vector-ops-shuffle.ll llvm/test/Transforms/SLPVectorizer/X86/extractelemets-extended-by-poison.ll llvm/test/Transforms/SLPVectorizer/X86/full-match-with-poison-scalar.ll llvm/test/Transforms/SLPVectorizer/X86/full-matched-bv-with-subvectors.ll llvm/test/Transforms/SLPVectorizer/X86/gather-node-same-reduced.ll llvm/test/Transforms/SLPVectorizer/X86/gathered-shuffle-resized.ll llvm/test/Transforms/SLPVectorizer/X86/insert-subvector.ll llvm/test/Transforms/SLPVectorizer/X86/load-merge-inseltpoison.ll llvm/test/Transforms/SLPVectorizer/X86/load-merge.ll llvm/test/Transforms/SLPVectorizer/X86/load-partial-vector-shuffle.ll llvm/test/Transforms/SLPVectorizer/X86/malformed_phis.ll llvm/test/Transforms/SLPVectorizer/X86/non-power-of-2-order-detection.ll llvm/test/Transforms/SLPVectorizer/X86/non-scheduled-inst-extern-use.ll llvm/test/Transforms/SLPVectorizer/X86/parent-node-non-schedulable.ll llvm/test/Transforms/SLPVectorizer/X86/parent-node-schedulable-with-multi-copyables.ll llvm/test/Transforms/SLPVectorizer/X86/pr47629-inseltpoison.ll llvm/test/Transforms/SLPVectorizer/X86/pr47629.ll llvm/test/Transforms/SLPVectorizer/X86/pr47642.ll llvm/test/Transforms/SLPVectorizer/X86/pr49081.ll llvm/test/Transforms/SLPVectorizer/X86/reduced-val-vectorized-in-transform.ll llvm/test/Transforms/SLPVectorizer/X86/reorder-reused-masked-gather.ll llvm/test/Transforms/SLPVectorizer/X86/reorder-reused-masked-gather2.ll llvm/test/Transforms/SLPVectorizer/X86/reordered-masked-loads.ll llvm/test/Transforms/SLPVectorizer/X86/replaced-external-in-reduction.ll llvm/test/Transforms/SLPVectorizer/X86/reschedule-only-scheduled.ll llvm/test/Transforms/SLPVectorizer/X86/resized-bv-values-non-power-of2-node.ll llvm/test/Transforms/SLPVectorizer/X86/reuse-extracts-in-wider-vect.ll llvm/test/Transforms/SLPVectorizer/X86/revec-reduced-value-vectorized-later.ll llvm/test/Transforms/SLPVectorizer/X86/same-values-sub-node-with-poisons.ll llvm/test/Transforms/SLPVectorizer/X86/shrink_after_reorder.ll llvm/test/Transforms/SLPVectorizer/X86/sin-sqrt.ll llvm/test/Transforms/SLPVectorizer/X86/whole-registers-compare.ll llvm/test/Transforms/SLPVectorizer/extract-many-users-buildvector.ll llvm/test/Transforms/SLPVectorizer/gathered-consecutive-loads-different-types.ll llvm/test/Transforms/SLPVectorizer/insertelement-across-zero.ll llvm/test/Transforms/SLPVectorizer/reduction-whole-regs-loads.ll llvm/test/Transforms/SLPVectorizer/reorder-clustered-node.ll llvm/test/Transforms/SLPVectorizer/revec-shufflevector.ll llvm/test/Transforms/SLPVectorizer/revec.ll llvm/test/Transforms/SLPVectorizer/shuffle-mask-resized.ll
``````````

</details>


The following files introduce new uses of undef:
 - llvm/test/Transforms/SLPVectorizer/X86/parent-node-non-schedulable.ll
 - llvm/test/Transforms/SLPVectorizer/X86/reschedule-only-scheduled.ll

[Undef](https://llvm.org/docs/LangRef.html#undefined-values) is now deprecated and should only be used in the rare cases where no replacement is possible. For example, a load of uninitialized memory yields `undef`. You should use `poison` values for placeholders instead.

In tests, avoid using `undef` and having tests that trigger undefined behavior. If you need an operand with some unimportant value, you can add a new argument to the function and use that instead.

For example, this is considered a bad practice:
```llvm
define void @fn() {
  ...
  br i1 undef, ...
}
```

Please use the following instead:
```llvm
define void @fn(i1 %cond) {
  ...
  br i1 %cond, ...
}
```

Please refer to the [Undefined Behavior Manual](https://llvm.org/docs/UndefinedBehavior.html) for more information.



https://github.com/llvm/llvm-project/pull/151530


More information about the llvm-commits mailing list