; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny < %s | FileCheck %s ; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -fast-isel < %s | FileCheck %s ; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -global-isel < %s | FileCheck %s --check-prefix=CHECK-GLOBISEL ; Note fast-isel tests here will fall back to isel @src = external local_unnamed_addr global [65536 x i8], align 1 @dst = external global [65536 x i8], align 1 @ptr = external local_unnamed_addr global ptr, align 8 define dso_local void @foo1() { ; CHECK-LABEL: foo1: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ldr x8, :got:src ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: ldr x9, :got:dst ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: foo1: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: ldr x8, :got:src ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: ldr x9, :got:dst ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @src, align 1 store i8 %0, ptr @dst, align 1 ret void } define dso_local void @foo2() { ; CHECK-LABEL: foo2: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ldr x8, :got:ptr ; CHECK-NEXT: ldr x9, :got:dst ; CHECK-NEXT: str x9, [x8] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: foo2: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: ldr x8, :got:ptr ; CHECK-GLOBISEL-NEXT: ldr x9, :got:dst ; CHECK-GLOBISEL-NEXT: str x9, [x8] ; CHECK-GLOBISEL-NEXT: ret entry: store ptr @dst, ptr @ptr, align 8 ret void } define dso_local void @foo3() { ; FIXME: Needn't adr ptr ; ; CHECK-LABEL: foo3: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ldr x8, :got:src ; CHECK-NEXT: ldr x9, :got:ptr ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: ldr x9, [x9] ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: foo3: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: ldr x8, :got:src ; CHECK-GLOBISEL-NEXT: ldr x9, :got:ptr ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: ldr x9, [x9] ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @src, align 1 %1 = load ptr, ptr @ptr, align 8 store i8 %0, ptr %1, align 1 ret void } @lsrc = internal global i8 0, align 4 @ldst = internal global i8 0, align 4 @lptr = internal global ptr null, align 8 define dso_local void @bar1() { ; CHECK-LABEL: bar1: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lsrc ; CHECK-NEXT: adr x9, ldst ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: bar1: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lsrc ; CHECK-GLOBISEL-NEXT: adr x9, ldst ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @lsrc, align 4 store i8 %0, ptr @ldst, align 4 ret void } define dso_local void @bar2() { ; CHECK-LABEL: bar2: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lptr ; CHECK-NEXT: adr x9, ldst ; CHECK-NEXT: str x9, [x8] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: bar2: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lptr ; CHECK-GLOBISEL-NEXT: adr x9, ldst ; CHECK-GLOBISEL-NEXT: str x9, [x8] ; CHECK-GLOBISEL-NEXT: ret entry: store ptr @ldst, ptr @lptr, align 8 ret void } define dso_local void @bar3() { ; FIXME: Needn't adr lptr ; ; CHECK-LABEL: bar3: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lsrc ; CHECK-NEXT: ldr x9, lptr ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: bar3: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lsrc ; CHECK-GLOBISEL-NEXT: adr x9, lptr ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: ldr x9, [x9] ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @lsrc, align 4 %1 = load ptr, ptr @lptr, align 8 store i8 %0, ptr %1, align 1 ret void } @lbsrc = internal global [65536 x i8] zeroinitializer, align 4 @lbdst = internal global [65536 x i8] zeroinitializer, align 4 define dso_local void @baz1() { ; CHECK-LABEL: baz1: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lbsrc ; CHECK-NEXT: adr x9, lbdst ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: baz1: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lbsrc ; CHECK-GLOBISEL-NEXT: adr x9, lbdst ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @lbsrc, align 4 store i8 %0, ptr @lbdst, align 4 ret void } define dso_local void @baz2() { ; CHECK-LABEL: baz2: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lptr ; CHECK-NEXT: adr x9, lbdst ; CHECK-NEXT: str x9, [x8] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: baz2: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lptr ; CHECK-GLOBISEL-NEXT: adr x9, lbdst ; CHECK-GLOBISEL-NEXT: str x9, [x8] ; CHECK-GLOBISEL-NEXT: ret entry: store ptr @lbdst, ptr @lptr, align 8 ret void } define dso_local void @baz3() { ; FIXME: Needn't adr lptr ; ; CHECK-LABEL: baz3: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x8, lbsrc ; CHECK-NEXT: ldr x9, lptr ; CHECK-NEXT: ldrb w8, [x8] ; CHECK-NEXT: strb w8, [x9] ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: baz3: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x8, lbsrc ; CHECK-GLOBISEL-NEXT: adr x9, lptr ; CHECK-GLOBISEL-NEXT: ldrb w8, [x8] ; CHECK-GLOBISEL-NEXT: ldr x9, [x9] ; CHECK-GLOBISEL-NEXT: strb w8, [x9] ; CHECK-GLOBISEL-NEXT: ret entry: %0 = load i8, ptr @lbsrc, align 4 %1 = load ptr, ptr @lptr, align 8 store i8 %0, ptr %1, align 1 ret void } declare void @func(...) define dso_local ptr @externfuncaddr() { ; CHECK-LABEL: externfuncaddr: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: ldr x0, :got:func ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: externfuncaddr: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: ldr x0, :got:func ; CHECK-GLOBISEL-NEXT: ret entry: ret ptr @func } define dso_local ptr @localfuncaddr() { ; CHECK-LABEL: localfuncaddr: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: adr x0, externfuncaddr ; CHECK-NEXT: ret ; ; CHECK-GLOBISEL-LABEL: localfuncaddr: ; CHECK-GLOBISEL: // %bb.0: // %entry ; CHECK-GLOBISEL-NEXT: adr x0, externfuncaddr ; CHECK-GLOBISEL-NEXT: ret entry: ret ptr @externfuncaddr }