From: Nikita Popov Date: Mon, 24 Jun 2019 20:13:13 +0000 (+0000) Subject: [CVP] Reenable nowrap flag inference X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ba1c95516f2cbcd1e1ada05b6e8b9e91cf86871;p=llvm [CVP] Reenable nowrap flag inference Inference of nowrap flags in CVP has been disabled, because it triggered a bug in LFTR (https://bugs.llvm.org/show_bug.cgi?id=31181). This issue has been fixed in D60935, so we should be able to reenable nowrap flag inference now. Differential Revision: https://reviews.llvm.org/D62776 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364228 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp index 17a8972c6fe..8ec071536ec 100644 --- a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -66,7 +66,7 @@ STATISTIC(NumOverflows, "Number of overflow checks removed"); STATISTIC(NumSaturating, "Number of saturating arithmetics converted to normal arithmetics"); -static cl::opt DontAddNoWrapFlags("cvp-dont-add-nowrap-flags", cl::init(true)); +static cl::opt DontAddNoWrapFlags("cvp-dont-add-nowrap-flags", cl::init(false)); namespace { diff --git a/test/Transforms/CorrelatedValuePropagation/basic.ll b/test/Transforms/CorrelatedValuePropagation/basic.ll index 630cfcb6bc1..c4dfc47a7b4 100644 --- a/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -463,7 +463,7 @@ define i1 @clamp_low1(i32 %a) { ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp eq i32 [[A]], 5 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], -1 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[A]] ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4 ; CHECK-NEXT: br label [[NEXT:%.*]] @@ -495,7 +495,7 @@ define i1 @clamp_low2(i32 %a) { ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], -1 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 5 ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 4 ; CHECK-NEXT: br label [[NEXT:%.*]] @@ -527,7 +527,7 @@ define i1 @clamp_high1(i32 %a) { ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp eq i32 [[A]], 5 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 1 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[A]] ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6 ; CHECK-NEXT: br label [[NEXT:%.*]] @@ -559,7 +559,7 @@ define i1 @clamp_high2(i32 %a) { ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 1 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 5 ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 6 ; CHECK-NEXT: br label [[NEXT:%.*]] @@ -592,7 +592,7 @@ define i1 @clamp_high3(i32 %a) { ; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]] ; CHECK: a_guard: ; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ne i32 [[A]], 5 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 100 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 100 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 5 ; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[SEL]], 105 ; CHECK-NEXT: br label [[NEXT:%.*]] @@ -625,7 +625,7 @@ define void @abs1(i32 %a, i1* %p) { ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] ; CHECK-NEXT: br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]] ; CHECK: guard: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[A]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], 0 ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[A]] ; CHECK-NEXT: br label [[SPLIT:%.*]] @@ -675,7 +675,7 @@ define void @abs2(i32 %a, i1* %p) { ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] ; CHECK-NEXT: br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]] ; CHECK: guard: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[A]] ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], 0 ; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[SUB]] ; CHECK-NEXT: br label [[SPLIT:%.*]] @@ -725,7 +725,7 @@ define void @nabs1(i32 %a, i1* %p) { ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] ; CHECK-NEXT: br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]] ; CHECK: guard: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[A]] ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], 0 ; CHECK-NEXT: [[NABS:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[A]] ; CHECK-NEXT: br label [[SPLIT:%.*]] @@ -775,7 +775,7 @@ define void @nabs2(i32 %a, i1* %p) { ; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] ; CHECK-NEXT: br i1 [[AND]], label [[GUARD:%.*]], label [[EXIT:%.*]] ; CHECK: guard: -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[A]] +; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[A]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], 0 ; CHECK-NEXT: [[NABS:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[SUB]] ; CHECK-NEXT: br label [[SPLIT:%.*]] diff --git a/test/Transforms/CorrelatedValuePropagation/deopt.ll b/test/Transforms/CorrelatedValuePropagation/deopt.ll index 6dab3aaf243..affd456182d 100644 --- a/test/Transforms/CorrelatedValuePropagation/deopt.ll +++ b/test/Transforms/CorrelatedValuePropagation/deopt.ll @@ -118,8 +118,8 @@ define void @test4(i1 %c, i1 %c2) { ; CHECK-LABEL: @test4( ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 0, i64 1 ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 0, i64 1 -; CHECK-NEXT: [[ADD1:%.*]] = add i64 0, [[SEL]] -; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[ADD1]], [[SEL2]] +; CHECK-NEXT: [[ADD1:%.*]] = add nuw nsw i64 0, [[SEL]] +; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD1]], [[SEL2]] ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[ADD2]], 1 ; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]] ; CHECK: taken: diff --git a/test/Transforms/CorrelatedValuePropagation/icmp.ll b/test/Transforms/CorrelatedValuePropagation/icmp.ll index de97e858b58..3b0f33a5129 100644 --- a/test/Transforms/CorrelatedValuePropagation/icmp.ll +++ b/test/Transforms/CorrelatedValuePropagation/icmp.ll @@ -93,7 +93,7 @@ define i1 @test3(i32 %x, i32 %y) #0 { ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], 10 ; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]] ; CHECK: cont2: -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[Y]] +; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[X]], [[Y]] ; CHECK-NEXT: br label [[CONT3:%.*]] ; CHECK: cont3: ; CHECK-NEXT: br label [[OUT]] @@ -132,7 +132,7 @@ define i1 @test4(i32 %x, i32 %y) #0 { ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], 10 ; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]] ; CHECK: cont2: -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[Y]] +; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[X]], [[Y]] ; CHECK-NEXT: br label [[CONT3:%.*]] ; CHECK: cont3: ; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[ADD]], 15 diff --git a/test/Transforms/CorrelatedValuePropagation/range.ll b/test/Transforms/CorrelatedValuePropagation/range.ll index 0e6915a289b..49d4e1f48a9 100644 --- a/test/Transforms/CorrelatedValuePropagation/range.ll +++ b/test/Transforms/CorrelatedValuePropagation/range.ll @@ -276,7 +276,7 @@ define i1 @test10(i64* %p) { define i1 @test11() { ; CHECK-LABEL: @test11( ; CHECK-NEXT: [[POSITIVE:%.*]] = load i32, i32* @g, !range !3 -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[POSITIVE]], 1 +; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[POSITIVE]], 1 ; CHECK-NEXT: [[TEST:%.*]] = icmp sgt i32 [[ADD]], 0 ; CHECK-NEXT: br label [[NEXT:%.*]] ; CHECK: next: