[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / AArch64 / ldradr.ll
blobbd295eac5ec303be9130886953179935e567089f
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
4 %struct.T = type <{ i32, i64, i8, i32 }>
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
13 define 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
19 entry:
20   %0 = load i32*, i32** @ptr, align 8
21   %1 = load i32, i32* %0, align 4
22   ret i32 %1
25 define i32 @barch() {
26 ; CHECK-LABEL: barch:
27 ; CHECK:       // %bb.0: // %entry
28 ; CHECK-NEXT:    ldr w0, ch
29 ; CHECK-NEXT:    ret
30 entry:
31   %0 = load i32, i32* @ch, align 4
32   ret i32 %0
35 define i32 @barta() {
36 ; CHECK-LABEL: barta:
37 ; CHECK:       // %bb.0: // %entry
38 ; CHECK-NEXT:    ldr w0, t
39 ; CHECK-NEXT:    ret
40 entry:
41   %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 0), align 4
42   ret i32 %0
45 define i64 @bartb() {
46 ; CHECK-LABEL: bartb:
47 ; CHECK:       // %bb.0: // %entry
48 ; CHECK-NEXT:    ldr x0, t+4
49 ; CHECK-NEXT:    ret
50 entry:
51   %0 = load i64, i64* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 1), align 8
52   ret i64 %0
55 define 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
61 entry:
62   %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 3), align 1
63   ret i32 %0
66 define 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
72 entry:
73   %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t2, i64 0, i32 0), align 2
74   ret i32 %0
77 define i64 @zextload() {
78 ; CHECK-LABEL: zextload:
79 ; CHECK:       // %bb.0: // %entry
80 ; CHECK-NEXT:    ldr w0, ch
81 ; CHECK-NEXT:    ret
82 entry:
83   %0 = load i32, i32* @ch, align 4
84   %1 = zext i32 %0 to i64
85   ret i64 %1
88 define 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
94 entry:
95   %0 = load i8, i8* @ch8, align 4
96   %1 = zext i8 %0 to i64
97   ret i64 %1
100 define i64 @sextload() {
101 ; CHECK-LABEL: sextload:
102 ; CHECK:       // %bb.0: // %entry
103 ; CHECK-NEXT:    ldrsw x0, ch
104 ; CHECK-NEXT:    ret
105 entry:
106   %0 = load i32, i32* @ch, align 4
107   %1 = sext i32 %0 to i64
108   ret i64 %1
111 define 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
117 entry:
118   %0 = load i8, i8* @ch8, align 4
119   %1 = sext i8 %0 to i64
120   ret i64 %1
123 define float @floatload() {
124 ; CHECK-LABEL: floatload:
125 ; CHECK:       // %bb.0: // %entry
126 ; CHECK-NEXT:    ldr s0, f
127 ; CHECK-NEXT:    ret
128 entry:
129   %0 = load float, float* @f, align 4
130   ret float %0