[PATCH] D94870: [InstSimplify] Handle commutativity for 'and' and 'outer or' for (~A & B) | ~(A | B) --> ~A
Dávid Bolvanský via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 16 10:12:37 PST 2021
xbolva00 updated this revision to Diff 317187.
xbolva00 added a comment.
Simplify code.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D94870/new/
https://reviews.llvm.org/D94870
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/or.ll
Index: llvm/test/Transforms/InstSimplify/or.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/or.ll
+++ llvm/test/Transforms/InstSimplify/or.ll
@@ -399,11 +399,7 @@
define i32 @and_or_not_or5(i32 %A, i32 %B) {
; CHECK-LABEL: @and_or_not_or5(
; CHECK-NEXT: [[I:%.*]] = xor i32 [[A:%.*]], -1
-; CHECK-NEXT: [[I2:%.*]] = and i32 [[B:%.*]], [[I]]
-; CHECK-NEXT: [[I3:%.*]] = or i32 [[B]], [[A]]
-; CHECK-NEXT: [[I4:%.*]] = xor i32 [[I3]], -1
-; CHECK-NEXT: [[I5:%.*]] = or i32 [[I2]], [[I4]]
-; CHECK-NEXT: ret i32 [[I5]]
+; CHECK-NEXT: ret i32 [[I]]
;
%i = xor i32 %A, -1
%i2 = and i32 %B, %i
@@ -416,11 +412,7 @@
define i32 @and_or_not_or6(i32 %A, i32 %B) {
; CHECK-LABEL: @and_or_not_or6(
; CHECK-NEXT: [[I:%.*]] = xor i32 [[A:%.*]], -1
-; CHECK-NEXT: [[I2:%.*]] = and i32 [[I]], [[B:%.*]]
-; CHECK-NEXT: [[I3:%.*]] = or i32 [[B]], [[A]]
-; CHECK-NEXT: [[I4:%.*]] = xor i32 [[I3]], -1
-; CHECK-NEXT: [[I5:%.*]] = or i32 [[I4]], [[I2]]
-; CHECK-NEXT: ret i32 [[I5]]
+; CHECK-NEXT: ret i32 [[I]]
;
%i = xor i32 %A, -1
%i2 = and i32 %i, %B
@@ -433,11 +425,7 @@
define i32 @and_or_not_or7(i32 %A, i32 %B) {
; CHECK-LABEL: @and_or_not_or7(
; CHECK-NEXT: [[I:%.*]] = xor i32 [[A:%.*]], -1
-; CHECK-NEXT: [[I2:%.*]] = and i32 [[B:%.*]], [[I]]
-; CHECK-NEXT: [[I3:%.*]] = or i32 [[B]], [[A]]
-; CHECK-NEXT: [[I4:%.*]] = xor i32 [[I3]], -1
-; CHECK-NEXT: [[I5:%.*]] = or i32 [[I4]], [[I2]]
-; CHECK-NEXT: ret i32 [[I5]]
+; CHECK-NEXT: ret i32 [[I]]
;
%i = xor i32 %A, -1
%i2 = and i32 %B, %i
@@ -450,11 +438,7 @@
define i32 @and_or_not_or8(i32 %A, i32 %B) {
; CHECK-LABEL: @and_or_not_or8(
; CHECK-NEXT: [[I:%.*]] = xor i32 [[B:%.*]], -1
-; CHECK-NEXT: [[I2:%.*]] = and i32 [[A:%.*]], [[I]]
-; CHECK-NEXT: [[I3:%.*]] = or i32 [[B]], [[A]]
-; CHECK-NEXT: [[I4:%.*]] = xor i32 [[I3]], -1
-; CHECK-NEXT: [[I5:%.*]] = or i32 [[I4]], [[I2]]
-; CHECK-NEXT: ret i32 [[I5]]
+; CHECK-NEXT: ret i32 [[I]]
;
%i = xor i32 %B, -1
%i2 = and i32 %A, %i
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2224,7 +2224,7 @@
if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::Or))
return V;
- Value *A, *B;
+ Value *A, *B, *NotA;
// (A & ~B) | (A ^ B) -> (A ^ B)
// (~B & A) | (A ^ B) -> (A ^ B)
// (A & ~B) | (B ^ A) -> (B ^ A)
@@ -2253,6 +2253,7 @@
match(Op1, m_c_Xor(m_Not(m_Specific(A)), m_Specific(B)))))
return Op1;
+ // Commute the 'or' operands.
// (~A ^ B) | (A & B) -> (~A ^ B)
// (~A ^ B) | (B & A) -> (~A ^ B)
// (B ^ ~A) | (A & B) -> (B ^ ~A)
@@ -2266,9 +2267,18 @@
// (~A & B) | ~(B | A) --> ~A
// (B & ~A) | ~(A | B) --> ~A
// (B & ~A) | ~(B | A) --> ~A
- if (match(Op0, m_And(m_Not(m_Value(A)), m_Value(B))) &&
+ if (match(Op0, m_c_And(m_CombineAnd(m_Value(NotA), m_Not(m_Value(A))), m_Value(B))) &&
match(Op1, m_Not(m_c_Or(m_Specific(A), m_Specific(B)))))
- return cast<BinaryOperator>(Op0)->getOperand(0);
+ return NotA;
+
+ // Commute the 'or' operands.
+ // ~(A | B) | (~A & B) --> ~A
+ // ~(B | A) | (~A & B) --> ~A
+ // ~(A | B) | (B & ~A) --> ~A
+ // ~(B | A) | (B & ~A) --> ~A
+ if (match(Op1, m_c_And(m_CombineAnd(m_Value(NotA), m_Not(m_Value(A))), m_Value(B))) &&
+ match(Op0, m_Not(m_c_Or(m_Specific(A), m_Specific(B)))))
+ return NotA;
if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false))
return V;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94870.317187.patch
Type: text/x-patch
Size: 3650 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210116/405e25fc/attachment.bin>
More information about the llvm-commits
mailing list