[llvm-branch-commits] [llvm] [AArch64][llvm] Combine SVE AND-NOT operations into BIC for _x forms (PR #232526)
Kieran B via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 22 08:02:45 PDT 2026
================
@@ -753,6 +758,46 @@ let Predicates = [HasSVE_or_SME] in {
defm EOR_ZZZ : sve_int_bin_cons_log<0b10, "eor", xor>;
defm BIC_ZZZ : sve_int_bin_cons_log<0b11, "bic", AArch64bic>;
+ multiclass SVEAndNotPats<ValueType VT, ValueType PT> {
+ // Ordinary AND: NOT's undefined inactive lanes may take the value ~b.
+ def : Pat<(and VT:$a,
+ (VT (int_aarch64_sve_not (VT (undef)), (PT srcvalue), VT:$b))),
+ (BIC_ZZZ $a, $b)>;
+ // Ordinary AND: an all-active NOT produces ~b in every lane.
+ def : Pat<(and VT:$a,
+ (VT (int_aarch64_sve_not (VT srcvalue), (PT (SVEAllActive)), VT:$b))),
+ (BIC_ZZZ $a, $b)>;
+
+ // AND_U: matching predicates ensure NOT produces ~b in every active AND lane.
+ def : Pat<(VT (SVEAndU PT:$pg, VT:$a,
+ (VT (int_aarch64_sve_not (VT srcvalue), PT:$pg, VT:$b)))),
+ (BIC_ZZZ $a, $b)>;
+
+ // AND_U: NOT's undefined inactive lanes may take the value ~b,
----------------
kieroxide wrote:
When I removed the patterns in the class starting at the `AND_U: NOT's`, I seem to get no change in the test outcomes. Is this missing tests, or do the other patterns cover these cases?
https://github.com/llvm/llvm-project/pull/232526
More information about the llvm-branch-commits
mailing list