forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
AArch64: estimate inline asm length during branch relaxation
To make sure branches are in range, we need to do a better job of estimating the length of an inline assembly block than "it's probably 1 instruction, who'd write asm with more than that?". Fortunately there's already a (highly suspect, see how many ways you can think of to break it!) callback for this purpose, which is used by the other targets. rdar://problem/17277590 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211095 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
3a001aa
commit c22960d
Showing
2 changed files
with
42 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
; RUN: llc -mtriple=aarch64-apple-ios7.0 -disable-block-placement -aarch64-tbz-offset-bits=4 -o - %s | FileCheck %s | ||
define i32 @test_asm_length(i32 %in) { | ||
; CHECK-LABEL: test_asm_length: | ||
|
||
; It would be more natural to use just one "tbnz %false" here, but if the | ||
; number of instructions in the asm is counted reasonably, that block is out | ||
; of the limited range we gave tbz. So branch relaxation has to invert the | ||
; condition. | ||
; CHECK: tbz w0, #0, [[TRUE:LBB[0-9]+_[0-9]+]] | ||
; CHECK: b [[FALSE:LBB[0-9]+_[0-9]+]] | ||
|
||
; CHECK: [[TRUE]]: | ||
; CHECK: orr w0, wzr, #0x4 | ||
; CHECK: nop | ||
; CHECK: nop | ||
; CHECK: nop | ||
; CHECK: nop | ||
; CHECK: nop | ||
; CHECK: nop | ||
; CHECK: ret | ||
|
||
; CHECK: [[FALSE]]: | ||
; CHECK: ret | ||
|
||
%val = and i32 %in, 1 | ||
%tst = icmp eq i32 %val, 0 | ||
br i1 %tst, label %true, label %false | ||
|
||
true: | ||
call void asm sideeffect "nop\0A\09nop\0A\09nop\0A\09nop\0A\09nop\0A\09nop", ""() | ||
ret i32 4 | ||
|
||
false: | ||
ret i32 0 | ||
} |