[PATCH] D62703: [CVP] Simplify non-overflowing saturating add/sub
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 30 14:49:37 PDT 2019
nikic updated this revision to Diff 202305.
nikic added a comment.
Use separate statistic.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62703/new/
https://reviews.llvm.org/D62703
Files:
llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
Index: llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
===================================================================
--- llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
+++ llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
@@ -739,8 +739,8 @@
; CHECK-NEXT: call void @llvm.trap()
; CHECK-NEXT: unreachable
; CHECK: cont:
-; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X]], i8 100)
-; CHECK-NEXT: ret i8 [[RES]]
+; CHECK-NEXT: [[RES1:%.*]] = add nuw i8 [[X]], 100
+; CHECK-NEXT: ret i8 [[RES1]]
;
%cmp = icmp ugt i8 %x, 100
br i1 %cmp, label %trap, label %cont
@@ -762,8 +762,8 @@
; CHECK-NEXT: call void @llvm.trap()
; CHECK-NEXT: unreachable
; CHECK: cont:
-; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X]], i8 20)
-; CHECK-NEXT: ret i8 [[RES]]
+; CHECK-NEXT: [[RES1:%.*]] = add nsw i8 [[X]], 20
+; CHECK-NEXT: ret i8 [[RES1]]
;
%cmp = icmp sgt i8 %x, 100
br i1 %cmp, label %trap, label %cont
@@ -785,8 +785,8 @@
; CHECK-NEXT: call void @llvm.trap()
; CHECK-NEXT: unreachable
; CHECK: cont:
-; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[X]], i8 100)
-; CHECK-NEXT: ret i8 [[RES]]
+; CHECK-NEXT: [[RES1:%.*]] = sub nuw i8 [[X]], 100
+; CHECK-NEXT: ret i8 [[RES1]]
;
%cmp = icmp ult i8 %x, 100
br i1 %cmp, label %trap, label %cont
@@ -808,8 +808,8 @@
; CHECK-NEXT: call void @llvm.trap()
; CHECK-NEXT: unreachable
; CHECK: cont:
-; CHECK-NEXT: [[RES:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X]], i8 20)
-; CHECK-NEXT: ret i8 [[RES]]
+; CHECK-NEXT: [[RES1:%.*]] = sub nsw i8 [[X]], 20
+; CHECK-NEXT: ret i8 [[RES1]]
;
%cmp = icmp slt i8 %x, -100
br i1 %cmp, label %trap, label %cont
Index: llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -63,6 +63,8 @@
STATISTIC(NumAShrs, "Number of ashr converted to lshr");
STATISTIC(NumSRems, "Number of srem converted to urem");
STATISTIC(NumOverflows, "Number of overflow checks removed");
+STATISTIC(NumSaturating,
+ "Number of saturating arithmetics converted to normal arithmetics");
static cl::opt<bool> DontAddNoWrapFlags("cvp-dont-add-nowrap-flags", cl::init(true));
@@ -428,6 +430,20 @@
++NumOverflows;
}
+static void processSaturatingInst(SaturatingInst *SI) {
+ BinaryOperator *BinOp = BinaryOperator::Create(
+ SI->getBinaryOp(), SI->getLHS(), SI->getRHS(), SI->getName(), SI);
+ BinOp->setDebugLoc(SI->getDebugLoc());
+ if (SI->isSigned())
+ BinOp->setHasNoSignedWrap();
+ else
+ BinOp->setHasNoUnsignedWrap();
+
+ SI->replaceAllUsesWith(BinOp);
+ SI->eraseFromParent();
+ ++NumSaturating;
+}
+
/// Infer nonnull attributes for the arguments at the specified callsite.
static bool processCallSite(CallSite CS, LazyValueInfo *LVI) {
SmallVector<unsigned, 4> ArgNos;
@@ -440,6 +456,13 @@
}
}
+ if (auto *SI = dyn_cast<SaturatingInst>(CS.getInstruction())) {
+ if (willNotOverflow(SI, LVI)) {
+ processSaturatingInst(SI);
+ return true;
+ }
+ }
+
// Deopt bundle operands are intended to capture state with minimal
// perturbance of the code otherwise. If we can find a constant value for
// any such operand and remove a use of the original value, that's
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62703.202305.patch
Type: text/x-patch
Size: 3510 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190530/57cb9e1a/attachment.bin>
More information about the llvm-commits
mailing list