1; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s
2; RUN: llc < %s -global-isel -global-isel-abort=2 -pass-remarks-missed=gisel* \
3; RUN:     -mtriple=aarch64-w64-mingw32 2>&1| FileCheck %s --check-prefixes=GISEL,FALLBACK
4
5@var = external local_unnamed_addr global i32, align 4
6@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
7@localvar = dso_local local_unnamed_addr global i32 0, align 4
8@localcommon = common dso_local local_unnamed_addr global i32 0, align 4
9@extvar = external dllimport local_unnamed_addr global i32, align 4
10
11define dso_local i32 @getVar() {
12; CHECK-LABEL: getVar:
13; CHECK:    adrp x8, .refptr.var
14; CHECK:    ldr  x8, [x8, .refptr.var]
15; CHECK:    ldr  w0, [x8]
16; CHECK:    ret
17entry:
18  %0 = load i32, i32* @var, align 4
19  ret i32 %0
20}
21
22define dso_local i32 @getDsoLocalVar() {
23; CHECK-LABEL: getDsoLocalVar:
24; CHECK:    adrp x8, dsolocalvar
25; CHECK:    ldr  w0, [x8, dsolocalvar]
26; CHECK:    ret
27entry:
28  %0 = load i32, i32* @dsolocalvar, align 4
29  ret i32 %0
30}
31
32define dso_local i32 @getLocalVar() {
33; CHECK-LABEL: getLocalVar:
34; CHECK:    adrp x8, localvar
35; CHECK:    ldr  w0, [x8, localvar]
36; CHECK:    ret
37entry:
38  %0 = load i32, i32* @localvar, align 4
39  ret i32 %0
40}
41
42define dso_local i32 @getLocalCommon() {
43; CHECK-LABEL: getLocalCommon:
44; CHECK:    adrp x8, localcommon
45; CHECK:    ldr  w0, [x8, localcommon]
46; CHECK:    ret
47entry:
48  %0 = load i32, i32* @localcommon, align 4
49  ret i32 %0
50}
51
52define dso_local i32 @getExtVar() {
53; CHECK-LABEL: getExtVar:
54; CHECK:    adrp x8, __imp_extvar
55; CHECK:    ldr  x8, [x8, __imp_extvar]
56; CHECK:    ldr  w0, [x8]
57; CHECK:    ret
58entry:
59  %0 = load i32, i32* @extvar, align 4
60  ret i32 %0
61}
62
63define dso_local void @callFunc() {
64; CHECK-LABEL: callFunc:
65; CHECK:    b otherFunc
66entry:
67  tail call void @otherFunc()
68  ret void
69}
70
71declare dso_local void @otherFunc()
72
73; FALLBACK-NOT: remark:{{.*}}sspFunc
74define dso_local void @sspFunc() #0 {
75; CHECK-LABEL: sspFunc:
76; CHECK:    adrp x8, .refptr.__stack_chk_guard
77; CHECK:    ldr  x8, [x8, .refptr.__stack_chk_guard]
78; CHECK:    ldr  x8, [x8]
79; GISEL-LABEL: sspFunc:
80; GISEL:    adrp x8, .refptr.__stack_chk_guard
81; GISEL:    ldr  x8, [x8, .refptr.__stack_chk_guard]
82; GISEL:    ldr  x8, [x8]
83entry:
84  %c = alloca i8, align 1
85  call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %c)
86  call void @ptrUser(i8* nonnull %c)
87  call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %c)
88  ret void
89}
90
91declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
92declare dso_local void @ptrUser(i8*) local_unnamed_addr #2
93declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
94
95attributes #0 = { sspstrong }
96
97; CHECK:        .section        .rdata$.refptr.__stack_chk_guard,"dr",discard,.refptr.__stack_chk_guard
98; CHECK:        .globl  .refptr.__stack_chk_guard
99; CHECK: .refptr.__stack_chk_guard:
100; CHECK:        .xword  __stack_chk_guard
101; CHECK:        .section        .rdata$.refptr.var,"dr",discard,.refptr.var
102; CHECK:        .globl  .refptr.var
103; CHECK: .refptr.var:
104; CHECK:        .xword  var
105