[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