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