252 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny < %s | FileCheck %s3; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -fast-isel < %s | FileCheck %s4; RUN: llc -verify-machineinstrs -o - -mtriple=aarch64-none-linux-gnu -code-model=tiny -global-isel < %s | FileCheck %s --check-prefix=CHECK-GLOBISEL5 6; Note fast-isel tests here will fall back to isel7 8@src = external local_unnamed_addr global [65536 x i8], align 19@dst = external global [65536 x i8], align 110@ptr = external local_unnamed_addr global ptr, align 811 12define dso_local void @foo1() {13; CHECK-LABEL: foo1:14; CHECK: // %bb.0: // %entry15; CHECK-NEXT: ldr x8, :got:src16; CHECK-NEXT: ldrb w8, [x8]17; CHECK-NEXT: ldr x9, :got:dst18; CHECK-NEXT: strb w8, [x9]19; CHECK-NEXT: ret20;21; CHECK-GLOBISEL-LABEL: foo1:22; CHECK-GLOBISEL: // %bb.0: // %entry23; CHECK-GLOBISEL-NEXT: ldr x8, :got:src24; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]25; CHECK-GLOBISEL-NEXT: ldr x9, :got:dst26; CHECK-GLOBISEL-NEXT: strb w8, [x9]27; CHECK-GLOBISEL-NEXT: ret28entry:29 %0 = load i8, ptr @src, align 130 store i8 %0, ptr @dst, align 131 ret void32}33 34define dso_local void @foo2() {35; CHECK-LABEL: foo2:36; CHECK: // %bb.0: // %entry37; CHECK-NEXT: ldr x8, :got:ptr38; CHECK-NEXT: ldr x9, :got:dst39; CHECK-NEXT: str x9, [x8]40; CHECK-NEXT: ret41;42; CHECK-GLOBISEL-LABEL: foo2:43; CHECK-GLOBISEL: // %bb.0: // %entry44; CHECK-GLOBISEL-NEXT: ldr x8, :got:ptr45; CHECK-GLOBISEL-NEXT: ldr x9, :got:dst46; CHECK-GLOBISEL-NEXT: str x9, [x8]47; CHECK-GLOBISEL-NEXT: ret48entry:49 store ptr @dst, ptr @ptr, align 850 ret void51}52 53define dso_local void @foo3() {54; FIXME: Needn't adr ptr55;56; CHECK-LABEL: foo3:57; CHECK: // %bb.0: // %entry58; CHECK-NEXT: ldr x8, :got:src59; CHECK-NEXT: ldr x9, :got:ptr60; CHECK-NEXT: ldrb w8, [x8]61; CHECK-NEXT: ldr x9, [x9]62; CHECK-NEXT: strb w8, [x9]63; CHECK-NEXT: ret64;65; CHECK-GLOBISEL-LABEL: foo3:66; CHECK-GLOBISEL: // %bb.0: // %entry67; CHECK-GLOBISEL-NEXT: ldr x8, :got:src68; CHECK-GLOBISEL-NEXT: ldr x9, :got:ptr69; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]70; CHECK-GLOBISEL-NEXT: ldr x9, [x9]71; CHECK-GLOBISEL-NEXT: strb w8, [x9]72; CHECK-GLOBISEL-NEXT: ret73entry:74 %0 = load i8, ptr @src, align 175 %1 = load ptr, ptr @ptr, align 876 store i8 %0, ptr %1, align 177 ret void78}79 80@lsrc = internal global i8 0, align 481@ldst = internal global i8 0, align 482@lptr = internal global ptr null, align 883 84define dso_local void @bar1() {85; CHECK-LABEL: bar1:86; CHECK: // %bb.0: // %entry87; CHECK-NEXT: adr x8, lsrc88; CHECK-NEXT: adr x9, ldst89; CHECK-NEXT: ldrb w8, [x8]90; CHECK-NEXT: strb w8, [x9]91; CHECK-NEXT: ret92;93; CHECK-GLOBISEL-LABEL: bar1:94; CHECK-GLOBISEL: // %bb.0: // %entry95; CHECK-GLOBISEL-NEXT: adr x8, lsrc96; CHECK-GLOBISEL-NEXT: adr x9, ldst97; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]98; CHECK-GLOBISEL-NEXT: strb w8, [x9]99; CHECK-GLOBISEL-NEXT: ret100entry:101 %0 = load i8, ptr @lsrc, align 4102 store i8 %0, ptr @ldst, align 4103 ret void104}105 106define dso_local void @bar2() {107; CHECK-LABEL: bar2:108; CHECK: // %bb.0: // %entry109; CHECK-NEXT: adr x8, lptr110; CHECK-NEXT: adr x9, ldst111; CHECK-NEXT: str x9, [x8]112; CHECK-NEXT: ret113;114; CHECK-GLOBISEL-LABEL: bar2:115; CHECK-GLOBISEL: // %bb.0: // %entry116; CHECK-GLOBISEL-NEXT: adr x8, lptr117; CHECK-GLOBISEL-NEXT: adr x9, ldst118; CHECK-GLOBISEL-NEXT: str x9, [x8]119; CHECK-GLOBISEL-NEXT: ret120entry:121 store ptr @ldst, ptr @lptr, align 8122 ret void123}124 125define dso_local void @bar3() {126; FIXME: Needn't adr lptr127;128; CHECK-LABEL: bar3:129; CHECK: // %bb.0: // %entry130; CHECK-NEXT: adr x8, lsrc131; CHECK-NEXT: ldr x9, lptr132; CHECK-NEXT: ldrb w8, [x8]133; CHECK-NEXT: strb w8, [x9]134; CHECK-NEXT: ret135;136; CHECK-GLOBISEL-LABEL: bar3:137; CHECK-GLOBISEL: // %bb.0: // %entry138; CHECK-GLOBISEL-NEXT: adr x8, lsrc139; CHECK-GLOBISEL-NEXT: adr x9, lptr140; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]141; CHECK-GLOBISEL-NEXT: ldr x9, [x9]142; CHECK-GLOBISEL-NEXT: strb w8, [x9]143; CHECK-GLOBISEL-NEXT: ret144entry:145 %0 = load i8, ptr @lsrc, align 4146 %1 = load ptr, ptr @lptr, align 8147 store i8 %0, ptr %1, align 1148 ret void149}150 151 152@lbsrc = internal global [65536 x i8] zeroinitializer, align 4153@lbdst = internal global [65536 x i8] zeroinitializer, align 4154 155define dso_local void @baz1() {156; CHECK-LABEL: baz1:157; CHECK: // %bb.0: // %entry158; CHECK-NEXT: adr x8, lbsrc159; CHECK-NEXT: adr x9, lbdst160; CHECK-NEXT: ldrb w8, [x8]161; CHECK-NEXT: strb w8, [x9]162; CHECK-NEXT: ret163;164; CHECK-GLOBISEL-LABEL: baz1:165; CHECK-GLOBISEL: // %bb.0: // %entry166; CHECK-GLOBISEL-NEXT: adr x8, lbsrc167; CHECK-GLOBISEL-NEXT: adr x9, lbdst168; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]169; CHECK-GLOBISEL-NEXT: strb w8, [x9]170; CHECK-GLOBISEL-NEXT: ret171entry:172 %0 = load i8, ptr @lbsrc, align 4173 store i8 %0, ptr @lbdst, align 4174 ret void175}176 177define dso_local void @baz2() {178; CHECK-LABEL: baz2:179; CHECK: // %bb.0: // %entry180; CHECK-NEXT: adr x8, lptr181; CHECK-NEXT: adr x9, lbdst182; CHECK-NEXT: str x9, [x8]183; CHECK-NEXT: ret184;185; CHECK-GLOBISEL-LABEL: baz2:186; CHECK-GLOBISEL: // %bb.0: // %entry187; CHECK-GLOBISEL-NEXT: adr x8, lptr188; CHECK-GLOBISEL-NEXT: adr x9, lbdst189; CHECK-GLOBISEL-NEXT: str x9, [x8]190; CHECK-GLOBISEL-NEXT: ret191entry:192 store ptr @lbdst, ptr @lptr, align 8193 ret void194}195 196define dso_local void @baz3() {197; FIXME: Needn't adr lptr198;199; CHECK-LABEL: baz3:200; CHECK: // %bb.0: // %entry201; CHECK-NEXT: adr x8, lbsrc202; CHECK-NEXT: ldr x9, lptr203; CHECK-NEXT: ldrb w8, [x8]204; CHECK-NEXT: strb w8, [x9]205; CHECK-NEXT: ret206;207; CHECK-GLOBISEL-LABEL: baz3:208; CHECK-GLOBISEL: // %bb.0: // %entry209; CHECK-GLOBISEL-NEXT: adr x8, lbsrc210; CHECK-GLOBISEL-NEXT: adr x9, lptr211; CHECK-GLOBISEL-NEXT: ldrb w8, [x8]212; CHECK-GLOBISEL-NEXT: ldr x9, [x9]213; CHECK-GLOBISEL-NEXT: strb w8, [x9]214; CHECK-GLOBISEL-NEXT: ret215entry:216 %0 = load i8, ptr @lbsrc, align 4217 %1 = load ptr, ptr @lptr, align 8218 store i8 %0, ptr %1, align 1219 ret void220}221 222 223declare void @func(...)224 225define dso_local ptr @externfuncaddr() {226; CHECK-LABEL: externfuncaddr:227; CHECK: // %bb.0: // %entry228; CHECK-NEXT: ldr x0, :got:func229; CHECK-NEXT: ret230;231; CHECK-GLOBISEL-LABEL: externfuncaddr:232; CHECK-GLOBISEL: // %bb.0: // %entry233; CHECK-GLOBISEL-NEXT: ldr x0, :got:func234; CHECK-GLOBISEL-NEXT: ret235entry:236 ret ptr @func237}238 239define dso_local ptr @localfuncaddr() {240; CHECK-LABEL: localfuncaddr:241; CHECK: // %bb.0: // %entry242; CHECK-NEXT: adr x0, externfuncaddr243; CHECK-NEXT: ret244;245; CHECK-GLOBISEL-LABEL: localfuncaddr:246; CHECK-GLOBISEL: // %bb.0: // %entry247; CHECK-GLOBISEL-NEXT: adr x0, externfuncaddr248; CHECK-GLOBISEL-NEXT: ret249entry:250 ret ptr @externfuncaddr251}252