diff options
author | Tim Northover <tnorthover@apple.com> | 2014-06-17 11:31:42 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2014-06-17 11:31:42 +0000 |
commit | d5531f72dc1d4c85997a13530fc783c8dfaab25c (patch) | |
tree | 4317bae42ddce5cd3c18893c42ac95402db4f342 /llvm/test/CodeGen/AArch64/branch-relax-asm.ll | |
parent | 5d97293e26f32a3cc404f2d6cbc009ba8ab33669 (diff) | |
download | bcm5719-llvm-d5531f72dc1d4c85997a13530fc783c8dfaab25c.tar.gz bcm5719-llvm-d5531f72dc1d4c85997a13530fc783c8dfaab25c.zip |
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
llvm-svn: 211095
Diffstat (limited to 'llvm/test/CodeGen/AArch64/branch-relax-asm.ll')
-rw-r--r-- | llvm/test/CodeGen/AArch64/branch-relax-asm.ll | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/branch-relax-asm.ll b/llvm/test/CodeGen/AArch64/branch-relax-asm.ll new file mode 100644 index 00000000000..7409c84e618 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/branch-relax-asm.ll @@ -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 +} |