mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:50:30 +00:00
[LoopRotate] Detect loops with indirect branches better (we're giving up on them).
llvm-svn: 322137
This commit is contained in:
parent
de2d0196a2
commit
2c87fa96bb
@ -268,7 +268,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
|||||||
|
|
||||||
// If the loop could not be converted to canonical form, it must have an
|
// If the loop could not be converted to canonical form, it must have an
|
||||||
// indirectbr in it, just give up.
|
// indirectbr in it, just give up.
|
||||||
if (!OrigPreheader)
|
if (!OrigPreheader || !L->hasDedicatedExits())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Anything ScalarEvolution may know about this loop or the PHI nodes
|
// Anything ScalarEvolution may know about this loop or the PHI nodes
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
; RUN: opt < %s -S -loop-rotate -disable-output -verify-loop-info -verify-dom-info
|
; RUN: opt < %s -S -loop-rotate -o - -verify-loop-info -verify-dom-info | FileCheck %s
|
||||||
; PR5502
|
|
||||||
|
|
||||||
|
; PR5502
|
||||||
define void @z80_do_opcodes() nounwind {
|
define void @z80_do_opcodes() nounwind {
|
||||||
entry:
|
entry:
|
||||||
br label %while.cond
|
br label %while.cond
|
||||||
@ -41,3 +41,34 @@ indirectgoto: ; preds = %run_opcode, %while.
|
|||||||
%opcode.0 = phi i8 [ undef, %while.body ], [ %tmp276, %run_opcode ] ; <i8> [#uses=2]
|
%opcode.0 = phi i8 [ undef, %while.body ], [ %tmp276, %run_opcode ] ; <i8> [#uses=2]
|
||||||
indirectbr i8* undef, [label %run_opcode, label %if.else295, label %end_opcode]
|
indirectbr i8* undef, [label %run_opcode, label %if.else295, label %end_opcode]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: @foo
|
||||||
|
define void @foo(i1 %a, i1 %b, i8* %c) {
|
||||||
|
; CHECK: entry
|
||||||
|
; CHECK-NEXT: br i1 %a, label %return, label %preheader
|
||||||
|
entry:
|
||||||
|
br i1 %a, label %return, label %preheader
|
||||||
|
|
||||||
|
; CHECK: preheader:
|
||||||
|
; CHECK-NEXT: br label %header
|
||||||
|
preheader:
|
||||||
|
br label %header
|
||||||
|
|
||||||
|
; CHECK: header:
|
||||||
|
; CHECK-NEXT: br i1 %b, label %return, label %body
|
||||||
|
header:
|
||||||
|
br i1 %b, label %return, label %body
|
||||||
|
|
||||||
|
; CHECK: body:
|
||||||
|
; CHECK-NEXT: indirectbr i8* %c, [label %return, label %latch]
|
||||||
|
body:
|
||||||
|
indirectbr i8* %c, [label %return, label %latch]
|
||||||
|
|
||||||
|
; CHECK: latch:
|
||||||
|
; CHECK-NEXT: br label %header
|
||||||
|
latch:
|
||||||
|
br label %header
|
||||||
|
|
||||||
|
return:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user