[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
This commit is contained in:
Sanjoy Das 2016-08-06 00:01:56 +00:00
parent ab23f2239f
commit 265e61ad49
3 changed files with 16 additions and 4 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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