141 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s3; RUN: llc < %s -global-isel -mtriple=arm64-linux-gnu | FileCheck %s --check-prefix=GISEL4 5@x1 = external hidden global [2 x i64]6@x2 = external hidden global [16777216 x i64]7@x3 = external hidden global { [9 x ptr], [8 x ptr] }8 9define i64 @f1() {10; CHECK-LABEL: f1:11; CHECK: // %bb.0:12; CHECK-NEXT: adrp x8, x1+1613; CHECK-NEXT: ldr x0, [x8, :lo12:x1+16]14; CHECK-NEXT: ret15;16; GISEL-LABEL: f1:17; GISEL: // %bb.0:18; GISEL-NEXT: adrp x8, x1+1619; GISEL-NEXT: ldr x0, [x8, :lo12:x1+16]20; GISEL-NEXT: ret21 %l = load i64, ptr getelementptr ([2 x i64], ptr @x1, i64 0, i64 2)22 ret i64 %l23}24 25define i64 @f2() {26; CHECK-LABEL: f2:27; CHECK: // %bb.0:28; CHECK-NEXT: adrp x8, x129; CHECK-NEXT: add x8, x8, :lo12:x130; CHECK-NEXT: ldr x0, [x8, #24]31; CHECK-NEXT: ret32;33; GISEL-LABEL: f2:34; GISEL: // %bb.0:35; GISEL-NEXT: adrp x8, x136; GISEL-NEXT: add x8, x8, :lo12:x137; GISEL-NEXT: ldr x0, [x8, #24]38; GISEL-NEXT: ret39 40 %l = load i64, ptr getelementptr ([2 x i64], ptr @x1, i64 0, i64 3)41 ret i64 %l42}43 44define i64 @f3() {45; CHECK-LABEL: f3:46; CHECK: // %bb.0:47; CHECK-NEXT: adrp x8, x1+148; CHECK-NEXT: add x8, x8, :lo12:x1+149; CHECK-NEXT: ldr x0, [x8]50; CHECK-NEXT: ret51;52; GISEL-LABEL: f3:53; GISEL: // %bb.0:54; GISEL-NEXT: adrp x8, x1+155; GISEL-NEXT: add x8, x8, :lo12:x1+156; GISEL-NEXT: ldr x0, [x8]57; GISEL-NEXT: ret58 %l = load i64, ptr getelementptr (i8, ptr @x1, i64 1)59 ret i64 %l60}61 62define [2 x i64] @f4() {63; FIXME: GlobalISel misses the opportunity to form a LDP here.64;65; CHECK-LABEL: f4:66; CHECK: // %bb.0:67; CHECK-NEXT: adrp x8, x2+868; CHECK-NEXT: add x8, x8, :lo12:x2+869; CHECK-NEXT: ldp x0, x1, [x8]70; CHECK-NEXT: ret71;72; GISEL-LABEL: f4:73; GISEL: // %bb.0:74; GISEL-NEXT: adrp x8, x2+875; GISEL-NEXT: adrp x9, x2+876; GISEL-NEXT: add x9, x9, :lo12:x2+877; GISEL-NEXT: ldr x0, [x8, :lo12:x2+8]78; GISEL-NEXT: ldr x1, [x9, #8]79; GISEL-NEXT: ret80 %l = load [2 x i64], ptr getelementptr (i8, ptr @x2, i64 8)81 ret [2 x i64] %l82}83 84define i64 @f5() {85; CHECK-LABEL: f5:86; CHECK: // %bb.0:87; CHECK-NEXT: adrp x8, x2+104856888; CHECK-NEXT: ldr x0, [x8, :lo12:x2+1048568]89; CHECK-NEXT: ret90;91; GISEL-LABEL: f5:92; GISEL: // %bb.0:93; GISEL-NEXT: adrp x8, x2+104856894; GISEL-NEXT: ldr x0, [x8, :lo12:x2+1048568]95; GISEL-NEXT: ret96 %l = load i64, ptr getelementptr ([16777216 x i64], ptr @x2, i64 0, i64 131071)97 ret i64 %l98}99 100define i64 @f6() {101; CHECK-LABEL: f6:102; CHECK: // %bb.0:103; CHECK-NEXT: mov w8, #1048576104; CHECK-NEXT: adrp x9, x2105; CHECK-NEXT: add x9, x9, :lo12:x2106; CHECK-NEXT: ldr x0, [x9, x8]107; CHECK-NEXT: ret108;109; GISEL-LABEL: f6:110; GISEL: // %bb.0:111; GISEL-NEXT: mov w8, #1048576112; GISEL-NEXT: adrp x9, x2113; GISEL-NEXT: add x9, x9, :lo12:x2114; GISEL-NEXT: ldr x0, [x9, x8]115; GISEL-NEXT: ret116 %l = load i64, ptr getelementptr ([16777216 x i64], ptr @x2, i64 0, i64 131072)117 ret i64 %l118}119 120define i32 @f7() {121; CHECK-LABEL: f7:122; CHECK: // %bb.0: // %entry123; CHECK-NEXT: adrp x8, x3+108124; CHECK-NEXT: ldr w0, [x8, :lo12:x3+108]125; CHECK-NEXT: ret126;127; GISEL-LABEL: f7:128; GISEL: // %bb.0: // %entry129; GISEL-NEXT: adrp x8, x3+108130; GISEL-NEXT: ldr w0, [x8, :lo12:x3+108]131; GISEL-NEXT: ret132 133entry:134 %lshr = lshr i128 bitcast (<2 x i64> <i64 undef, i64 ptrtoint (ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @x3, i64 0, i32 1, i64 2) to i64)> to i128), 64135 %trunc = trunc i128 %lshr to i64136 %inttoptr = inttoptr i64 %trunc to ptr137 %gep = getelementptr i32, ptr %inttoptr, i64 5138 %l = load i32, ptr %gep139 ret i32 %l140}141