From 265e61ad4925b28547765e55805696a0a8c88fc0 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Sat, 6 Aug 2016 00:01:56 +0000 Subject: [PATCH] [IRCE] Preserve loop-simplify form Fixes PR28764. Right now there is no way to test this, but (as mentioned on the PR) with Michael Zolotukhin's yet to be checked in LoopSimplify verfier, 8 of the llvm-lit tests for IRCE crash. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277891 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp | 2 ++ test/Transforms/IRCE/conjunctive-checks.ll | 16 +++++++++++++--- test/Transforms/IRCE/single-access-no-preloop.ll | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp index 3226efb86d2..4cbf2112e1e 100644 --- a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp +++ b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp @@ -66,6 +66,7 @@ #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils/LoopUtils.h" #include "llvm/Transforms/Utils/SimplifyIndVar.h" +#include "llvm/Transforms/Utils/LoopSimplify.h" #include "llvm/Transforms/Utils/UnrollLoop.h" using namespace llvm; @@ -1278,6 +1279,7 @@ bool LoopConstrainer::run() { DT.recalculate(F); formLCSSARecursively(OriginalLoop, DT, &LI, &SE); + simplifyLoop(&OriginalLoop, &DT, &LI, &SE, nullptr, true); return true; } diff --git a/test/Transforms/IRCE/conjunctive-checks.ll b/test/Transforms/IRCE/conjunctive-checks.ll index 8d752131ced..be058148977 100644 --- a/test/Transforms/IRCE/conjunctive-checks.ll +++ b/test/Transforms/IRCE/conjunctive-checks.ll @@ -12,7 +12,10 @@ define void @f_0(i32 *%arr, i32 *%a_len_ptr, i32 %n, i1* %cond_buf) { ; CHECK: [[exit_main_loop_at_loclamp_cmp:[^ ]+]] = icmp sgt i32 [[exit_main_loop_at_hiclamp]], 0 ; CHECK: [[exit_main_loop_at_loclamp:[^ ]+]] = select i1 [[exit_main_loop_at_loclamp_cmp]], i32 [[exit_main_loop_at_hiclamp]], i32 0 ; CHECK: [[enter_main_loop:[^ ]+]] = icmp slt i32 0, [[exit_main_loop_at_loclamp]] -; CHECK: br i1 [[enter_main_loop]], label %loop, label %main.pseudo.exit +; CHECK: br i1 [[enter_main_loop]], label %loop.preheader2, label %main.pseudo.exit + +; CHECK: loop.preheader2: +; CHECK: br label %loop entry: %len = load i32, i32* %a_len_ptr, !range !0 @@ -31,7 +34,10 @@ define void @f_0(i32 *%arr, i32 *%a_len_ptr, i32 %n, i1* %cond_buf) { ; CHECK: loop: ; CHECK: %cond = load volatile i1, i1* %cond_buf ; CHECK: %abc = and i1 %cond, true -; CHECK: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1 +; CHECK: br i1 %abc, label %in.bounds, label %out.of.bounds.loopexit, !prof !1 + +; CHECK: out.of.bounds.loopexit: +; CHECK: br label %out.of.bounds in.bounds: %addr = getelementptr i32, i32* %arr, i32 %idx.for.abc @@ -78,7 +84,11 @@ define void @f_1( ; CHECK: loop: ; CHECK: %abc = and i1 true, true -; CHECK: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1 +; CHECK: br i1 %abc, label %in.bounds, label %out.of.bounds.loopexit, !prof !1 + +; CHECK: out.of.bounds.loopexit: +; CHECK-NEXT: br label %out.of.bounds + in.bounds: %addr.a = getelementptr i32, i32* %arr_a, i32 %idx diff --git a/test/Transforms/IRCE/single-access-no-preloop.ll b/test/Transforms/IRCE/single-access-no-preloop.ll index 77288a01c00..17464f25f70 100644 --- a/test/Transforms/IRCE/single-access-no-preloop.ll +++ b/test/Transforms/IRCE/single-access-no-preloop.ll @@ -93,7 +93,7 @@ define void @single_access_no_preloop_with_offset(i32 *%arr, i32 *%a_len_ptr, i3 ; CHECK: [[exit_main_loop_at_loclamp_cmp:[^ ]+]] = icmp sgt i32 [[exit_main_loop_at_hiclamp]], 0 ; CHECK: [[exit_main_loop_at_loclamp:[^ ]+]] = select i1 [[exit_main_loop_at_loclamp_cmp]], i32 [[exit_main_loop_at_hiclamp]], i32 0 ; CHECK: [[enter_main_loop:[^ ]+]] = icmp slt i32 0, [[exit_main_loop_at_loclamp]] -; CHECK: br i1 [[enter_main_loop]], label %loop, label %main.pseudo.exit +; CHECK: br i1 [[enter_main_loop]], label %loop.preheader2, label %main.pseudo.exit ; CHECK: loop: ; CHECK: br i1 true, label %in.bounds, label %out.of.bounds -- 2.11.0