diff options
| author | Luqman Aden <me@luqman.ca> | 2019-04-20 13:14:18 +0000 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2019-04-20 13:14:18 +0000 |
| commit | 2993661cc0e5d7f6d15e071bfcd047592aef6675 (patch) | |
| tree | a03c0526995394a5e62b94507cfbdec5a2599069 /llvm/test | |
| parent | d3b2682351184c8a2aacb40ae0b62888ff847478 (diff) | |
| download | bcm5719-llvm-2993661cc0e5d7f6d15e071bfcd047592aef6675.tar.gz bcm5719-llvm-2993661cc0e5d7f6d15e071bfcd047592aef6675.zip | |
[CorrelatedValuePropagation] Mark subs that we know not to wrap with nuw/nsw.
Summary:
Teach CorrelatedValuePropagation to also handle sub instructions in addition to add. Relatively simple since makeGuaranteedNoWrapRegion already understood sub instructions. Only subtle change is which range is passed as "Other" to that function, since sub isn't commutative.
Note that CorrelatedValuePropagation::processAddSub is still hidden behind a default-off flag as IndVarSimplify hasn't yet been fixed to strip the added nsw/nuw flags and causes a miscompile. (PR31181)
Reviewers: sanjoy, apilipenko, nikic
Reviewed By: nikic
Subscribers: hiraditya, jfb, jdoerfert, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60036
llvm-svn: 358816
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/CorrelatedValuePropagation/add.ll | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/CorrelatedValuePropagation/sub.ll | 36 |
2 files changed, 19 insertions, 19 deletions
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/add.ll b/llvm/test/Transforms/CorrelatedValuePropagation/add.ll index 4001f511f94..026af75220d 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/add.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/add.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -correlated-propagation -cvp-dont-process-adds=false -S | FileCheck %s +; RUN: opt < %s -correlated-propagation -cvp-dont-add-nowrap-flags=false -S | FileCheck %s ; CHECK-LABEL: @test0( define void @test0(i32 %a) { diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll b/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll index 83f6ff15d1a..6e954e8ff67 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -correlated-propagation -cvp-dont-process-adds=false -S | FileCheck %s +; RUN: opt < %s -correlated-propagation -cvp-dont-add-nowrap-flags=false -S | FileCheck %s define void @test0(i32 %a) { ; CHECK-LABEL: @test0( @@ -7,7 +7,7 @@ define void @test0(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 100 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -30,7 +30,7 @@ define void @test1(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 100 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -76,7 +76,7 @@ define void @test3(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], -1 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -99,7 +99,7 @@ define void @test4(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 2147483647 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -163,7 +163,7 @@ define void @test7(i32 %a, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP_1]], [[FLAG:%.*]] ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -191,7 +191,7 @@ define void @test8(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP_1]], [[CMP_2]] ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -250,7 +250,7 @@ define void @test9(i32 %a, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP_1]], [[CMP_3]] ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -279,7 +279,7 @@ define void @test10(i32 %a, i32 %b, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP_1]], [[FLAG:%.*]] ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -307,7 +307,7 @@ define i32 @test11(i32* %p, i32 %i) { ; CHECK-NEXT: [[WITHIN:%.*]] = and i1 [[WITHIN_1]], [[WITHIN_2]] ; CHECK-NEXT: br i1 [[WITHIN]], label [[THEN:%.*]], label [[ELSE:%.*]] ; CHECK: then: -; CHECK-NEXT: [[I_MINUS_6:%.*]] = sub i32 [[I]], 6 +; CHECK-NEXT: [[I_MINUS_6:%.*]] = sub nuw nsw i32 [[I]], 6 ; CHECK-NEXT: ret i32 [[I_MINUS_6]] ; CHECK: else: ; CHECK-NEXT: ret i32 0 @@ -336,7 +336,7 @@ define void @test12(i32 %a, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = or i1 [[CMP_1]], [[FLAG:%.*]] ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -364,7 +364,7 @@ define void @test13(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = or i1 [[CMP_1]], [[CMP_2]] ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -423,7 +423,7 @@ define void @test14(i32 %a, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = or i1 [[CMP_1]], [[CMP_3]] ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -452,7 +452,7 @@ define void @test15(i32 %a, i32 %b, i1 %flag) { ; CHECK-NEXT: [[CMP:%.*]] = or i1 [[CMP_1]], [[FLAG:%.*]] ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[BB:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1 +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[A]], 1 ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -483,7 +483,7 @@ define i32 @test16(i32* %n, i32* %a) { ; CHECK-NEXT: [[X:%.*]] = load atomic i32, i32* [[A:%.*]] unordered, align 8 ; CHECK-NEXT: fence acquire ; CHECK-NEXT: [[ACC_CURR]] = sub i32 [[ACC]], [[X]] -; CHECK-NEXT: [[IV_NEXT]] = sub i32 [[IV]], -1 +; CHECK-NEXT: [[IV_NEXT]] = sub nsw i32 [[IV]], -1 ; CHECK-NEXT: [[NVAL:%.*]] = load atomic i32, i32* [[N:%.*]] unordered, align 8 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[IV_NEXT]], [[NVAL]] ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]] @@ -514,7 +514,7 @@ define void @test17(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 100 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 1, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 1, [[A]] ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -537,7 +537,7 @@ define void @test18(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 10000 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 -2, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nuw i32 -2, [[A]] ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void @@ -560,7 +560,7 @@ define void @test19(i32 %a) { ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 100 ; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]] ; CHECK: bb: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 -1, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 -1, [[A]] ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void |

