Files
clang-p2996/llvm/test/Transforms/CorrelatedValuePropagation/mul.ll
Roman Lebedev 2927716277 [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
2019-10-21 08:21:44 +00:00

176 lines
4.0 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -correlated-propagation -cvp-dont-add-nowrap-flags=false -S | FileCheck %s
define i8 @test0(i8 %a) {
; CHECK-LABEL: @test0(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 3
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp = icmp ult i8 %a, 3
br i1 %cmp, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test1(i8 %a) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 4
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp = icmp ult i8 %a, 4
br i1 %cmp, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test2(i8 %a) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 6
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp = icmp ult i8 %a, 6
br i1 %cmp, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test3(i8 %a) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 7
; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp = icmp ult i8 %a, 7
br i1 %cmp, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test4(i8 %a) {
; CHECK-LABEL: @test4(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3
; CHECK-NEXT: [[COND:%.*]] = and i1 [[CMP1]], [[CMP2]]
; CHECK-NEXT: br i1 [[COND]], label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[A]], 50
; CHECK-NEXT: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp1 = icmp slt i8 %a, 3
%cmp2 = icmp sgt i8 %a, -3
%cond = and i1 %cmp1, %cmp2
br i1 %cond, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test5(i8 %a) {
; CHECK-LABEL: @test5(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 3
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -4
; 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: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp1 = icmp slt i8 %a, 3
%cmp2 = icmp sgt i8 %a, -4
%cond = and i1 %cmp1, %cmp2
br i1 %cond, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}
define i8 @test6(i8 %a) {
; CHECK-LABEL: @test6(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A:%.*]], 4
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[A]], -3
; 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: ret i8 [[MUL]]
; CHECK: exit:
; CHECK-NEXT: ret i8 0
;
entry:
%cmp1 = icmp slt i8 %a, 4
%cmp2 = icmp sgt i8 %a, -3
%cond = and i1 %cmp1, %cmp2
br i1 %cond, label %bb, label %exit
bb:
%mul = mul i8 %a, 50
ret i8 %mul
exit:
ret i8 0
}