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 dso_local local_unnamed_addr global i32*, align 8 7@ch = external dso_local local_unnamed_addr global i32, align 4 8@ch8 = external dso_local local_unnamed_addr global i8, align 4 9@t = external dso_local local_unnamed_addr global %struct.T, align 4 10@t2 = external dso_local local_unnamed_addr global %struct.T, align 2 11@f = external dso_local 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