mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-20 14:29:27 +00:00
Thumb2: When applying branch optimizations, visit branches in reverse order.
The order in which branches appear in ImmBranches is approximately their order within the function body. By visiting later branches first, we reduce the distance between earlier forward branches and their targets, making it more likely that the cbn?z optimization, which can only apply to forward branches, will succeed for those earlier branches. Differential Revision: http://reviews.llvm.org/D9185 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235640 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1ad0f74155
commit
391b2c39f7
@ -1745,8 +1745,13 @@ bool ARMConstantIslands::optimizeThumb2Instructions() {
|
||||
bool ARMConstantIslands::optimizeThumb2Branches() {
|
||||
bool MadeChange = false;
|
||||
|
||||
for (unsigned i = 0, e = ImmBranches.size(); i != e; ++i) {
|
||||
ImmBranch &Br = ImmBranches[i];
|
||||
// The order in which branches appear in ImmBranches is approximately their
|
||||
// order within the function body. By visiting later branches first, we reduce
|
||||
// the distance between earlier forward branches and their targets, making it
|
||||
// more likely that the cbn?z optimization, which can only apply to forward
|
||||
// branches, will succeed.
|
||||
for (unsigned i = ImmBranches.size(); i != 0; --i) {
|
||||
ImmBranch &Br = ImmBranches[i-1];
|
||||
unsigned Opcode = Br.MI->getOpcode();
|
||||
unsigned NewOpc = 0;
|
||||
unsigned Scale = 1;
|
||||
|
54
test/CodeGen/Thumb2/cbnz.ll
Normal file
54
test/CodeGen/Thumb2/cbnz.ll
Normal file
@ -0,0 +1,54 @@
|
||||
; RUN: llc -mtriple thumbv7-unknown-linux -o - %s | FileCheck %s
|
||||
|
||||
declare void @x()
|
||||
declare void @y()
|
||||
|
||||
define void @f(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: f:
|
||||
; CHECK: cbnz
|
||||
%p = icmp eq i32 %x, 0
|
||||
br i1 %p, label %t, label %f
|
||||
|
||||
t:
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
; CHECK: cbnz
|
||||
%q = icmp eq i32 %y, 0
|
||||
br i1 %q, label %t2, label %f
|
||||
|
||||
t2:
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
call void @x()
|
||||
br label %f
|
||||
|
||||
f:
|
||||
call void @y()
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user