1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=aarch64-none-eabi -code-model=tiny -verify-machineinstrs | FileCheck %s
3
4%struct.T = type <{ i32, i64, i8, i32 }>
5
6@ptr = external local_unnamed_addr global i32*, align 8
7@ch = external local_unnamed_addr global i32, align 4
8@ch8 = external local_unnamed_addr global i8, align 4
9@t = external local_unnamed_addr global %struct.T, align 4
10@t2 = external local_unnamed_addr global %struct.T, align 2
11@f = external local_unnamed_addr global float, align 4
12
13define i32 @barp() {
14; CHECK-LABEL: barp:
15; CHECK:       // %bb.0: // %entry
16; CHECK-NEXT:    ldr x8, ptr
17; CHECK-NEXT:    ldr w0, [x8]
18; CHECK-NEXT:    ret
19entry:
20  %0 = load i32*, i32** @ptr, align 8
21  %1 = load i32, i32* %0, align 4
22  ret i32 %1
23}
24
25define i32 @barch() {
26; CHECK-LABEL: barch:
27; CHECK:       // %bb.0: // %entry
28; CHECK-NEXT:    ldr w0, ch
29; CHECK-NEXT:    ret
30entry:
31  %0 = load i32, i32* @ch, align 4
32  ret i32 %0
33}
34
35define i32 @barta() {
36; CHECK-LABEL: barta:
37; CHECK:       // %bb.0: // %entry
38; CHECK-NEXT:    ldr w0, t
39; CHECK-NEXT:    ret
40entry:
41  %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 0), align 4
42  ret i32 %0
43}
44
45define i64 @bartb() {
46; CHECK-LABEL: bartb:
47; CHECK:       // %bb.0: // %entry
48; CHECK-NEXT:    ldr x0, t+4
49; CHECK-NEXT:    ret
50entry:
51  %0 = load i64, i64* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 1), align 8
52  ret i64 %0
53}
54
55define i32 @bartc() {
56; CHECK-LABEL: bartc:
57; CHECK:       // %bb.0: // %entry
58; CHECK-NEXT:    adr x8, t+13
59; CHECK-NEXT:    ldr w0, [x8]
60; CHECK-NEXT:    ret
61entry:
62  %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 3), align 1
63  ret i32 %0
64}
65
66define i32 @bart2a() {
67; CHECK-LABEL: bart2a:
68; CHECK:       // %bb.0: // %entry
69; CHECK-NEXT:    adr x8, t2
70; CHECK-NEXT:    ldr w0, [x8]
71; CHECK-NEXT:    ret
72entry:
73  %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t2, i64 0, i32 0), align 2
74  ret i32 %0
75}
76
77define i64 @zextload() {
78; CHECK-LABEL: zextload:
79; CHECK:       // %bb.0: // %entry
80; CHECK-NEXT:    ldr w0, ch
81; CHECK-NEXT:    ret
82entry:
83  %0 = load i32, i32* @ch, align 4
84  %1 = zext i32 %0 to i64
85  ret i64 %1
86}
87
88define i64 @zextload8() {
89; CHECK-LABEL: zextload8:
90; CHECK:       // %bb.0: // %entry
91; CHECK-NEXT:    adr x8, ch8
92; CHECK-NEXT:    ldrb w0, [x8]
93; CHECK-NEXT:    ret
94entry:
95  %0 = load i8, i8* @ch8, align 4
96  %1 = zext i8 %0 to i64
97  ret i64 %1
98}
99
100define i64 @sextload() {
101; CHECK-LABEL: sextload:
102; CHECK:       // %bb.0: // %entry
103; CHECK-NEXT:    ldrsw x0, ch
104; CHECK-NEXT:    ret
105entry:
106  %0 = load i32, i32* @ch, align 4
107  %1 = sext i32 %0 to i64
108  ret i64 %1
109}
110
111define i64 @sextload8() {
112; CHECK-LABEL: sextload8:
113; CHECK:       // %bb.0: // %entry
114; CHECK-NEXT:    adr x8, ch8
115; CHECK-NEXT:    ldrsb x0, [x8]
116; CHECK-NEXT:    ret
117entry:
118  %0 = load i8, i8* @ch8, align 4
119  %1 = sext i8 %0 to i64
120  ret i64 %1
121}
122
123define float @floatload() {
124; CHECK-LABEL: floatload:
125; CHECK:       // %bb.0: // %entry
126; CHECK-NEXT:    ldr s0, f
127; CHECK-NEXT:    ret
128entry:
129  %0 = load float, float* @f, align 4
130  ret float %0
131}
132
133