[PATCH] D57352: [InstCombine] canonicalize cmp/select form of uadd saturate with constant
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 28 12:46:26 PST 2019
spatel created this revision.
spatel added reviewers: nikic, RKSimon, lebedev.ri.
Herald added a subscriber: mcrosier.
I'm not sure where we are in the process of optimizing the saturating/overflowing ops, so I'm circling back around to a loose end from D51929 <https://reviews.llvm.org/D51929>.
The backend (either CGP or DAG) doesn't recognize this pattern, so we end up with different asm for these IR variants.
Regardless of anything else, I think we want to get raw IR variations into the minimal number of raw IR forms. If/when we can canonicalize to intrinsics, that will make that step easier.
https://reviews.llvm.org/D57352
Files:
lib/Transforms/InstCombine/InstCombineSelect.cpp
test/Transforms/InstCombine/saturating-add-sub.ll
Index: test/Transforms/InstCombine/saturating-add-sub.ll
===================================================================
--- test/Transforms/InstCombine/saturating-add-sub.ll
+++ test/Transforms/InstCombine/saturating-add-sub.ll
@@ -655,9 +655,9 @@
define i32 @uadd_sat_constant_commute(i32 %x) {
; CHECK-LABEL: @uadd_sat_constant_commute(
; CHECK-NEXT: [[A:%.*]] = add i32 [[X:%.*]], 42
-; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X]], -43
-; CHECK-NEXT: [[R:%.*]] = select i1 [[C]], i32 [[A]], i32 -1
-; CHECK-NEXT: ret i32 [[R]]
+; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[X]], -43
+; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 -1, i32 [[A]]
+; CHECK-NEXT: ret i32 [[TMP2]]
;
%a = add i32 %x, 42
%c = icmp ult i32 %x, -43
@@ -681,9 +681,9 @@
define <4 x i32> @uadd_sat_constant_vec_commute(<4 x i32> %x) {
; CHECK-LABEL: @uadd_sat_constant_vec_commute(
; CHECK-NEXT: [[A:%.*]] = add <4 x i32> [[X:%.*]], <i32 42, i32 42, i32 42, i32 42>
-; CHECK-NEXT: [[C:%.*]] = icmp ult <4 x i32> [[X]], <i32 -43, i32 -43, i32 -43, i32 -43>
-; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[C]], <4 x i32> [[A]], <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
-; CHECK-NEXT: ret <4 x i32> [[R]]
+; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt <4 x i32> [[X]], <i32 -43, i32 -43, i32 -43, i32 -43>
+; CHECK-NEXT: [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> [[A]]
+; CHECK-NEXT: ret <4 x i32> [[TMP2]]
;
%a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>
%c = icmp ult <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>
Index: lib/Transforms/InstCombine/InstCombineSelect.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -675,6 +675,23 @@
return IsNegative ? Builder.CreateSub(B, Max) : Builder.CreateSub(Max, B);
}
+static Value *canonicalizeSaturatedAdd(ICmpInst *Cmp, Value *TVal, Value *FVal,
+ InstCombiner::BuilderTy &Builder) {
+ // Match an unsigned saturated add with constant.
+ Value *X = Cmp->getOperand(0);
+ const APInt *CmpC, *AddC;
+ if (!Cmp->hasOneUse() || Cmp->getPredicate() != ICmpInst::ICMP_ULT ||
+ !match(Cmp->getOperand(1), m_APInt(CmpC)) || !match(FVal, m_AllOnes()) ||
+ !match(TVal, m_Add(m_Specific(X), m_APInt(AddC))) || ~(*AddC) != *CmpC)
+ return nullptr;
+
+ // Commute compare and select operands:
+ // select (icmp ult X, C), (add X, ~C), -1 -->
+ // select (icmp ugt X, C), -1, (add X, ~C)
+ Value *NewCmp = Builder.CreateICmp(ICmpInst::ICMP_UGT, X, Cmp->getOperand(1));
+ return Builder.CreateSelect(NewCmp, FVal, TVal);
+}
+
/// Attempt to fold a cttz/ctlz followed by a icmp plus select into a single
/// call to cttz/ctlz with flag 'is_zero_undef' cleared.
///
@@ -1048,6 +1065,9 @@
if (Value *V = canonicalizeSaturatedSubtract(ICI, TrueVal, FalseVal, Builder))
return replaceInstUsesWith(SI, V);
+ if (Value *V = canonicalizeSaturatedAdd(ICI, TrueVal, FalseVal, Builder))
+ return replaceInstUsesWith(SI, V);
+
return Changed ? &SI : nullptr;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57352.183940.patch
Type: text/x-patch
Size: 3205 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190128/bece81f4/attachment.bin>
More information about the llvm-commits
mailing list