[llvm-branch-commits] [llvm] [AArch64][llvm] Combine SVE AND-NOT operations into BIC for _x forms (PR #232526)
Jonathan Thackray via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 22 08:52:40 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,
----------------
jthackray wrote:
Thanks. This is a "not, not, and" case, which without this pattern becomes "not, not, bic", rather than "not, bic". But it's a niche case to have two `not`s sequentially, so I'll remove it as this PR is complicated enough. I also removed some other patterns that aren't required now that I've had to add that C++ back.
https://github.com/llvm/llvm-project/pull/232526
More information about the llvm-branch-commits
mailing list