diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-06-01 09:40:18 +0000 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-06-01 09:40:18 +0000 |
commit | 46d4dba6e64eb47dfa04beb8d9c623a29b3375df (patch) | |
tree | 0c03cb4b8c67d1dc85b121ad97a368ee4b42bf47 /llvm/test/Transforms/IndVarSimplify | |
parent | 2b1d799a595213fd6524a0222bf59a8eb9b04b0a (diff) | |
download | bcm5719-llvm-46d4dba6e64eb47dfa04beb8d9c623a29b3375df.tar.gz bcm5719-llvm-46d4dba6e64eb47dfa04beb8d9c623a29b3375df.zip |
[IndVarSimplify] Fixup nowrap flags during LFTR (PR31181)
Fix for https://bugs.llvm.org/show_bug.cgi?id=31181 and partial fix
for LFTR poison handling issues in general.
When LFTR moves a condition from pre-inc to post-inc, it may now
depend on value that is poison due to nowrap flags. To avoid this,
we clear any nowrap flag that SCEV cannot prove for the post-inc
addrec.
Additionally, LFTR may switch to a different IV that is dynamically
dead and as such may be arbitrarily poison. This patch will correct
nowrap flags in some but not all cases where this happens. This is
related to the adoption of IR nowrap flags for the pre-inc addrec.
(See some of the switch_to_different_iv tests, where flags are not
dropped or insufficiently dropped.)
Finally, there are likely similar issues with the handling of GEP
inbounds, but we don't have a test case for this yet.
Differential Revision: https://reviews.llvm.org/D60935
llvm-svn: 362292
Diffstat (limited to 'llvm/test/Transforms/IndVarSimplify')
-rw-r--r-- | llvm/test/Transforms/IndVarSimplify/lftr-pr31181.ll | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/llvm/test/Transforms/IndVarSimplify/lftr-pr31181.ll b/llvm/test/Transforms/IndVarSimplify/lftr-pr31181.ll index 8316d8dbce2..6032b1d13ce 100644 --- a/llvm/test/Transforms/IndVarSimplify/lftr-pr31181.ll +++ b/llvm/test/Transforms/IndVarSimplify/lftr-pr31181.ll @@ -15,7 +15,7 @@ define i32 @test_drop_nuw() { ; CHECK: loop: ; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ -2, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[LOOP]] ] ; CHECK-NEXT: store i32 [[STOREMERGE]], i32* @a -; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[STOREMERGE]], 1 +; CHECK-NEXT: [[INC]] = add nsw i32 [[STOREMERGE]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[INC]], 0 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]] ; CHECK: exit: @@ -42,7 +42,7 @@ define i32 @test_drop_nsw() { ; CHECK: loop: ; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[LOOP]] ] ; CHECK-NEXT: store i32 [[STOREMERGE]], i32* @a -; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[STOREMERGE]], 1 +; CHECK-NEXT: [[INC]] = add nuw i32 [[STOREMERGE]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[INC]], -2147483648 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]] ; CHECK: exit: @@ -155,7 +155,7 @@ define i32 @test_drop_nsw_var_lim(i32 %lim) { ; CHECK: loop: ; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ [[INC:%.*]], [[LOOP]] ], [ 0, [[LOOP_PREHEADER]] ] ; CHECK-NEXT: store i32 [[STOREMERGE]], i32* @a -; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[STOREMERGE]], 1 +; CHECK-NEXT: [[INC]] = add nuw i32 [[STOREMERGE]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[INC]], [[TMP0]] ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]] ; CHECK: exit.loopexit: @@ -194,7 +194,7 @@ define i32 @switch_to_different_iv_post_inc(i32* %ptr, i1 %always_false) { ; CHECK-NEXT: br label [[ALWAYS_TAKEN]] ; CHECK: always_taken: ; CHECK-NEXT: [[IV_INC]] = add nsw i32 [[IV]], 1 -; CHECK-NEXT: [[IV2_INC]] = add nuw nsw i32 [[IV2]], 1 +; CHECK-NEXT: [[IV2_INC]] = add nuw i32 [[IV2]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IV2_INC]], -2147483627 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_COND]], label [[FOR_END:%.*]] ; CHECK: for.end: @@ -242,7 +242,7 @@ define i32 @switch_to_different_iv_pre_inc(i32* %ptr, i1 %always_false) { ; CHECK-NEXT: br label [[ALWAYS_TAKEN]] ; CHECK: always_taken: ; CHECK-NEXT: [[IV_INC]] = add nsw i32 [[IV]], 1 -; CHECK-NEXT: [[IV2_INC]] = add nuw nsw i32 [[IV2]], 1 +; CHECK-NEXT: [[IV2_INC]] = add nuw i32 [[IV2]], 1 ; CHECK-NEXT: br label [[FOR_COND]] ; CHECK: for.end: ; CHECK-NEXT: ret i32 0 @@ -329,7 +329,7 @@ define i32 @switch_to_different_iv_second_poison(i32* %ptr, i1 %always_false) { ; CHECK-NEXT: store volatile i32 [[IV2]], i32* [[PTR]] ; CHECK-NEXT: br label [[ALWAYS_TAKEN]] ; CHECK: always_taken: -; CHECK-NEXT: [[IV2_INC]] = add nuw nsw i32 [[IV2]], 1 +; CHECK-NEXT: [[IV2_INC]] = add nsw i32 [[IV2]], 1 ; CHECK-NEXT: [[IV_INC]] = add nsw i32 [[IV]], 1 ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IV2_INC]], -2147483629 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_COND]], label [[FOR_END:%.*]] |