mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
45f41f7ab1
This is a more general alternative/extension to D102635. Rather than handling the special case of "header exit with non-exiting latch", this unrolls against the smallest exact trip count from any exit. The latch exit is no longer treated as priviledged when it comes to full unrolling. The motivating case is in full-unroll-one-unpredictable-exit.ll. Here the header exit is an IV-based exit, while the latch exit is a data comparison. This kind of loop does not get rotated, because the latch is already exiting, and loop rotation doesn't try to distinguish IV-based/analyzable latches. Differential Revision: https://reviews.llvm.org/D102982
47 lines
1.5 KiB
LLVM
47 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -loop-unroll -unroll-runtime -unroll-runtime-multi-exit < %s | FileCheck %s
|
|
|
|
; This loop has a known trip count on the non-latch exit. When performing
|
|
; runtime unrolling (at least when using a prologue rather than epilogue) we
|
|
; should not fold that exit based on known trip count information prior to
|
|
; prologue insertion, as that may change the trip count for the modified loop.
|
|
|
|
define void @test(i32 %s, i32 %n) {
|
|
; CHECK-LABEL: @test(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[N2:%.*]] = add i32 [[S:%.*]], 123
|
|
; CHECK-NEXT: br label [[LOOP:%.*]]
|
|
; CHECK: loop:
|
|
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[S]], [[ENTRY:%.*]] ], [ [[I_INC:%.*]], [[LATCH:%.*]] ]
|
|
; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[I]], [[N2]]
|
|
; CHECK-NEXT: br i1 [[C1]], label [[EXIT1:%.*]], label [[LATCH]]
|
|
; CHECK: latch:
|
|
; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[I]], [[N:%.*]]
|
|
; CHECK-NEXT: [[I_INC]] = add i32 [[I]], 1
|
|
; CHECK-NEXT: br i1 [[C2]], label [[EXIT2:%.*]], label [[LOOP]]
|
|
; CHECK: exit1:
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: exit2:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%n2 = add i32 %s, 123
|
|
br label %loop
|
|
|
|
loop:
|
|
%i = phi i32 [ %s, %entry], [ %i.inc, %latch ]
|
|
%c1 = icmp eq i32 %i, %n2
|
|
br i1 %c1, label %exit1, label %latch
|
|
|
|
latch:
|
|
%c2 = icmp eq i32 %i, %n
|
|
%i.inc = add i32 %i, 1
|
|
br i1 %c2, label %exit2, label %loop
|
|
|
|
exit1:
|
|
ret void
|
|
|
|
exit2:
|
|
ret void
|
|
}
|