From 292771627735a0d23ba3e82b04f9571def812917 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Mon, 21 Oct 2019 08:21:44 +0000 Subject: [PATCH] [CVP] Deduce no-wrap on `mul` Summary: `ConstantRange::makeGuaranteedNoWrapRegion()` knows how to deal with `mul` since 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) Reviewers: nikic, reames, luqmana, sanjoy, timshen Reviewed By: reames Subscribers: hiraditya, javed.absar, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69203 llvm-svn: 375396 --- llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp | 1 + llvm/test/Transforms/CorrelatedValuePropagation/mul.ll | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp index ba16afaa8968..6be715c1036c 100644 --- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -860,6 +860,7 @@ static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT, break; case Instruction::Add: case Instruction::Sub: + case Instruction::Mul: BBChanged |= processBinOp(cast(II), LVI); break; case Instruction::And: diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/mul.ll b/llvm/test/Transforms/CorrelatedValuePropagation/mul.ll index 786c1b5c8809..288d114cb370 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/mul.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/mul.ll @@ -7,7 +7,7 @@ define i8 @test0(i8 %a) { ; 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 @@ define i8 @test1(i8 %a) { ; 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 @@ define i8 @test2(i8 %a) { ; 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 @@ define i8 @test4(i8 %a) { ; 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