mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-23 14:30:50 +00:00
[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:
parent
ab23f2239f
commit
265e61ad49
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user