2019-10-19 04:36:19 +08:00
|
|
|
; 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:
|
[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 16:21:44 +08:00
|
|
|
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i8 [[A]], 50
|
2019-10-19 04:36:19 +08:00
|
|
|
; 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:
|
[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 16:21:44 +08:00
|
|
|
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
|
2019-10-19 04:36:19 +08:00
|
|
|
; 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:
|
[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 16:21:44 +08:00
|
|
|
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[A]], 50
|
2019-10-19 04:36:19 +08:00
|
|
|
; 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:
|
[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 16:21:44 +08:00
|
|
|
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[A]], 50
|
2019-10-19 04:36:19 +08:00
|
|
|
; 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
|
|
|
|
}
|