summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AArch64/branch-relax-asm.ll
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-06-17 11:31:42 +0000
committerTim Northover <tnorthover@apple.com>2014-06-17 11:31:42 +0000
commitd5531f72dc1d4c85997a13530fc783c8dfaab25c (patch)
tree4317bae42ddce5cd3c18893c42ac95402db4f342 /llvm/test/CodeGen/AArch64/branch-relax-asm.ll
parent5d97293e26f32a3cc404f2d6cbc009ba8ab33669 (diff)
downloadbcm5719-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.ll35
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
+}
OpenPOWER on IntegriCloud