[PATCH] D153698: [InstCombine] canonicalize multi xor as cmp+select
Allen zhong via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 25 08:26:34 PDT 2023
Allen updated this revision to Diff 534308.
Allen added a comment.
address comment
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153698/new/
https://reviews.llvm.org/D153698
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstCombine/select-cmp.ll
Index: llvm/test/Transforms/InstCombine/select-cmp.ll
===================================================================
--- llvm/test/Transforms/InstCombine/select-cmp.ll
+++ llvm/test/Transforms/InstCombine/select-cmp.ll
@@ -345,4 +345,18 @@
ret i1 %r
}
+; https://alive2.llvm.org/ce/z/TGgJTq
+define i32 @select_icmp_xor_multi_insn(i32 noundef %a, i32 noundef %b) {
+; CHECK-LABEL: @select_icmp_xor_multi_insn(
+; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[XOR1:%.*]] = xor i32 [[TMP1]], -1
+; CHECK-NEXT: ret i32 [[XOR1]]
+;
+ %tobool = icmp eq i32 %a, %b
+ %not = xor i32 %a, -1
+ %xor1 = xor i32 %not, %b
+ %cond = select i1 %tobool, i32 -1, i32 %xor1
+ ret i32 %cond
+}
+
declare void @use(i1)
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4253,13 +4253,10 @@
return RepOp;
// We cannot replace a constant, and shouldn't even try.
- if (isa<Constant>(Op))
- return nullptr;
-
- auto *I = dyn_cast<Instruction>(V);
- if (!I || !is_contained(I->operands(), Op))
+ if (isa<Constant>(Op) || !isa<Instruction>(V))
return nullptr;
+ auto *I = cast<Instruction>(V);
// The arguments of a phi node might refer to a value from a previous
// cycle iteration.
if (isa<PHINode>(I))
@@ -4278,6 +4275,25 @@
transform(I->operands(), NewOps.begin(),
[&](Value *V) { return V == Op ? RepOp : V; });
+ // TODO: support more type operator
+ if (dyn_cast<BinaryOperator>(I) && !is_contained(I->operands(), Op)) {
+ for (unsigned Idx = 0, E = I->getNumOperands(); Idx < E; ++Idx) {
+ Value *NewV = I->getOperand(Idx);
+ if (!isa<BinaryOperator>(NewV))
+ continue;
+ auto *NewI = cast<BinaryOperator>(NewV);
+ if (NewI->getParent() != I->getParent())
+ continue;
+ Value *S = simplifyWithOpReplaced(NewV, Op, RepOp, Q, AllowRefinement,
+ MaxRecurse - 1);
+ if (!S)
+ continue;
+ Constant *Cst = dyn_cast<Constant>(S);
+ if (Cst && Cst->isNullValue())
+ NewOps[Idx] = Cst;
+ }
+ }
+
if (!AllowRefinement) {
// General InstSimplify functions may refine the result, e.g. by returning
// a constant for a potentially poison value. To avoid this, implement only
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153698.534308.patch
Type: text/x-patch
Size: 2442 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230625/e5ff1957/attachment-0001.bin>
More information about the llvm-commits
mailing list