summaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/PowerPC/tls-picgot.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/PowerPC/tls-picgot.ll')
-rw-r--r--llvm/test/CodeGen/PowerPC/tls-picgot.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/tls-picgot.ll b/llvm/test/CodeGen/PowerPC/tls-picgot.ll
new file mode 100644
index 000000000000..6562d864d1ba
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/tls-picgot.ll
@@ -0,0 +1,31 @@
+; RUN: llc -verify-machineinstrs -relocation-model=pic < %s | FileCheck %s
+
+target triple = "powerpc-unknown-linux-gnu"
+
+; Test that LR is preserved when PPC32PICGOT clobbers it with a local "bl".
+
+@TLS = external thread_local global i8
+
+; CHECK-LABEL: tls_addr:
+; CHECK: mflr [[SAVED_REG:[0-9]+]]
+
+; CHECK: bl [[JUMP:\.L[[:alnum:]_]+]]
+; CHECK-NEXT: [[OFFSET:\.L[[:alnum:]_]+]]:
+; CHECK-NEXT: .long _GLOBAL_OFFSET_TABLE_-[[OFFSET]]
+; CHECK-NEXT: [[JUMP]]
+; CHECK-NEXT: mflr {{[0-9]+}}
+
+; CHECK: mtlr [[SAVED_REG]]
+; CHECK-NEXT: blr
+
+define ptr @tls_addr() unnamed_addr {
+ %1 = call ptr @llvm.threadlocal.address.p0(ptr @TLS)
+ ret ptr %1
+}
+
+declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 8, !"PIC Level", i32 2}
+!1 = !{i32 7, !"PIE Level", i32 2}