[PATCH] D49216: [InstSimplify] simplify add instruction if two operands are negative
ChenZheng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 11 19:07:36 PDT 2018
shchenz created this revision.
shchenz added reviewers: spatel, echristo, nemanjai.
Herald added a subscriber: hiraditya.
This is from https://reviews.llvm.org/D48754, use isKnownNegation() function to simplify more add instruction patterns. such as:
define i8 @knownnegation(i8 %x, i8 %y) {
%xy = sub i8 %x, %y
%yx = sub i8 %y, %x
%r = add i8 %xy, %yx
ret i8 %r
}
--->
define i8 @knownnegation(i8 %x, i8 %y) {
ret i8 0
}
Test cases are added at https://reviews.llvm.org/rL336822
https://reviews.llvm.org/D49216
Files:
llvm/include/llvm/Analysis/ValueTracking.h
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstSimplify/add.ll
Index: llvm/test/Transforms/InstSimplify/add.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/add.ll
+++ llvm/test/Transforms/InstSimplify/add.ll
@@ -30,10 +30,7 @@
define i8 @knownnegation(i8 %x, i8 %y) {
; CHECK-LABEL: @knownnegation(
-; CHECK-NEXT: [[XY:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[YX:%.*]] = sub i8 [[Y]], [[X]]
-; CHECK-NEXT: [[R:%.*]] = add i8 [[XY]], [[YX]]
-; CHECK-NEXT: ret i8 [[R]]
+; CHECK-NEXT: ret i8 0
;
%xy = sub i8 %x, %y
%yx = sub i8 %y, %x
@@ -43,10 +40,7 @@
define <2 x i8> @knownnegation_commute_vec(<2 x i8> %x, <2 x i8> %y) {
; CHECK-LABEL: @knownnegation_commute_vec(
-; CHECK-NEXT: [[XY:%.*]] = sub <2 x i8> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[YX:%.*]] = sub <2 x i8> [[Y]], [[X]]
-; CHECK-NEXT: [[R:%.*]] = add <2 x i8> [[YX]], [[XY]]
-; CHECK-NEXT: ret <2 x i8> [[R]]
+; CHECK-NEXT: ret <2 x i8> zeroinitializer
;
%xy = sub <2 x i8> %x, %y
%yx = sub <2 x i8> %y, %x
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -4511,6 +4511,26 @@
return {SPF_UNKNOWN, SPNB_NA, false};
}
+bool llvm::isKnownNegation(const Value *X, const Value *Y) {
+ assert(X && Y && "Invalid operand");
+
+ // X = sub (0, Y)
+ if (match(X, m_Neg(m_Specific(Y))))
+ return true;
+
+ // Y = sub (0, X)
+ if (match(Y, m_Neg(m_Specific(X))))
+ return true;
+
+ // X = sub (A, B), Y = sub (B, A)
+ Value *A, *B;
+ if (match(X, m_Sub(m_Value(A), m_Value(B))) &&
+ match(Y, m_Sub(m_Specific(B), m_Specific(A))))
+ return true;
+
+ return false;
+}
+
static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred,
FastMathFlags FMF,
Value *CmpLHS, Value *CmpRHS,
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -540,6 +540,10 @@
if (match(Op1, m_Zero()))
return Op0;
+ // If two operands are negative, return 0.
+ if (isKnownNegation(Op0, Op1))
+ return Constant::getNullValue(Op0->getType());
+
// X + (Y - X) -> Y
// (Y - X) + X -> Y
// Eg: X + -X -> 0
Index: llvm/include/llvm/Analysis/ValueTracking.h
===================================================================
--- llvm/include/llvm/Analysis/ValueTracking.h
+++ llvm/include/llvm/Analysis/ValueTracking.h
@@ -101,6 +101,9 @@
const Instruction *CxtI = nullptr,
const DominatorTree *DT = nullptr);
+ /// Return true if the two given values are negation.
+ bool isKnownNegation(const Value *X, const Value *Y);
+
/// Returns true if the give value is known to be non-negative.
bool isKnownNonNegative(const Value *V, const DataLayout &DL,
unsigned Depth = 0,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49216.155106.patch
Type: text/x-patch
Size: 3098 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180712/27977e1c/attachment.bin>
More information about the llvm-commits
mailing list