[llvm] r277891 - [IRCE] Preserve loop-simplify form

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 5 17:01:56 PDT 2016


Author: sanjoy
Date: Fri Aug  5 19:01:56 2016
New Revision: 277891

URL: http://llvm.org/viewvc/llvm-project?rev=277891&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
    llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll
    llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll

Modified: llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=277891&r1=277890&r2=277891&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp Fri Aug  5 19:01:56 2016
@@ -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;
 }

Modified: llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll?rev=277891&r1=277890&r2=277891&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll (original)
+++ llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll Fri Aug  5 19:01:56 2016
@@ -12,7 +12,10 @@ define void @f_0(i32 *%arr, i32 *%a_len_
 ; 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_
 ; 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

Modified: llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll?rev=277891&r1=277890&r2=277891&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll (original)
+++ llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll Fri Aug  5 19:01:56 2016
@@ -93,7 +93,7 @@ define void @single_access_no_preloop_wi
 ; 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




More information about the llvm-commits mailing list