[PATCH] D69203: [CVP] Deduce no-wrap on `mul`
Roman Lebedev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 18 15:18:41 PDT 2019
lebedev.ri created this revision.
lebedev.ri added reviewers: nikic, reames, luqmana, sanjoy, timshen.
lebedev.ri added a project: LLVM.
Herald added subscribers: javed.absar, hiraditya.
`ConstantRange::makeGuaranteedNoWrapRegion()` knows how to deal with `mul`
since rL335646 <https://reviews.llvm.org/rL335646>, there is exhaustive test coverage.
This is already used by CVP's `processOverflowIntrinsic()`,
and by SCEV's `StrengthenNoWrapFlags()`
That being said, currently, this doesn't help much in the end:
| statistic | old | new | delta | percentage |
| correlated-value-propagation.NumMulNSW | 4 | 275 | 271 | 6775.00% |
| correlated-value-propagation.NumMulNUW | 4 | 1323 | 1319 | 32975.00% |
| correlated-value-propagation.NumMulNW | 8 | 1598 | 1590 | 19875.00% |
| correlated-value-propagation.NumNSW | 5715 | 5986 | 271 | 4.74% |
| correlated-value-propagation.NumNUW | 9193 | 10512 | 1319 | 14.35% |
| correlated-value-propagation.NumNW | 14908 | 16498 | 1590 | 10.67% |
| instcount.NumAddInst | 275871 | 275869 | -2 | 0.00% |
| instcount.NumBrInst | 708234 | 708232 | -2 | 0.00% |
| instcount.NumMulInst | 43812 | 43810 | -2 | 0.00% |
| instcount.NumPHIInst | 316786 | 316784 | -2 | 0.00% |
| instcount.NumTruncInst | 62165 | 62167 | 2 | 0.00% |
| instcount.NumUDivInst | 2528 | 2526 | -2 | -0.08% |
| instcount.TotalBlocks | 842995 | 842993 | -2 | 0.00% |
| instcount.TotalInsts | 7376486 | 7376478 | -8 | 0.00% |
|
(^ test-suite plain, tests still pass)
Do we want this for consistency?
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D69203
Files:
llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
llvm/test/Transforms/CorrelatedValuePropagation/mul.ll
Index: llvm/test/Transforms/CorrelatedValuePropagation/mul.ll
===================================================================
--- llvm/test/Transforms/CorrelatedValuePropagation/mul.ll
+++ llvm/test/Transforms/CorrelatedValuePropagation/mul.ll
@@ -7,7 +7,7 @@
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 3
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
@@ -30,7 +30,7 @@
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 4
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
@@ -53,7 +53,7 @@
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 6
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
@@ -101,7 +101,7 @@
; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP1]], [[CMP2]]
; CHECK-NEXT: br i1 [[COND]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50
+; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
Index: llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -860,6 +860,7 @@
break;
case Instruction::Add:
case Instruction::Sub:
+ case Instruction::Mul:
BBChanged |= processBinOp(cast<BinaryOperator>(II), LVI);
break;
case Instruction::And:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69203.225701.patch
Type: text/x-patch
Size: 2147 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191018/bbeb85ed/attachment.bin>
More information about the llvm-commits
mailing list