[llvm] [GlobalISel] Combine (X == 0) & (Y == 0) -> (X | Y) == 0 (PR #71949)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 29 21:48:01 PST 2024
================
@@ -945,6 +945,37 @@ def redundant_binop_in_equality : GICombineRule<
[{ return Helper.matchRedundantBinOpInEquality(*${root}, ${info}); }]),
(apply [{ Helper.applyBuildFn(*${root}, ${info}); }])>;
+// Transform: (X == 0 & Y == 0) -> (X | Y) == 0
+def double_icmp_zero_and_combine: GICombineRule<
+ (defs root:$root),
+ (match (G_ICMP $d1, $p, $s1, 0),
+ (G_ICMP $d2, $p, $s2, 0),
+ (G_AND $root, $d1, $d2),
+ [{ return ${p}.getPredicate() == CmpInst::ICMP_EQ &&
+ !MRI.getType(${s1}.getReg()).isPointer() &&
+ (MRI.getType(${s1}.getReg()) ==
+ MRI.getType(${s2}.getReg())); }]),
----------------
arsenm wrote:
You should be able to match this with GITypeOf<"$s1"> instead of using the manual predicate.
@Pierre-vh is there a nicer way to filter out pointers?
https://github.com/llvm/llvm-project/pull/71949
More information about the llvm-commits
mailing list