1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@var32 = global [3 x i32] zeroinitializer 4*9880d681SAndroid Build Coastguard Worker@var64 = global [3 x i64] zeroinitializer 5*9880d681SAndroid Build Coastguard Worker@var32_align64 = global [3 x i32] zeroinitializer, align 8 6*9880d681SAndroid Build Coastguard Worker@alias = alias [3 x i32], [3 x i32]* @var32_align64 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i64 @test_align32() { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_align32: 10*9880d681SAndroid Build Coastguard Worker %addr = bitcast [3 x i32]* @var32 to i64* 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker ; Since @var32 is only guaranteed to be aligned to 32-bits, it's invalid to 13*9880d681SAndroid Build Coastguard Worker ; emit an "LDR x0, [x0, #:lo12:var32] instruction to implement this load. 14*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* %addr 15*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[HIBITS:x[0-9]+]], var32 16*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], [[HIBITS]], {{#?}}:lo12:var32 17*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[ADDR]]] 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker ret i64 %val 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i64 @test_align64() { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_align64: 24*9880d681SAndroid Build Coastguard Worker %addr = bitcast [3 x i64]* @var64 to i64* 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker ; However, var64 *is* properly aligned and emitting an adrp/add/ldr would be 27*9880d681SAndroid Build Coastguard Worker ; inefficient. 28*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* %addr 29*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIBITS:[0-9]+]], var64 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x[[HIBITS]] 31*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[HIBITS]], {{#?}}:lo12:var64] 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker ret i64 %val 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i64 @test_var32_align64() { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_var32_align64: 38*9880d681SAndroid Build Coastguard Worker %addr = bitcast [3 x i32]* @var32_align64 to i64* 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker ; Since @var32 is only guaranteed to be aligned to 32-bits, it's invalid to 41*9880d681SAndroid Build Coastguard Worker ; emit an "LDR x0, [x0, #:lo12:var32] instruction to implement this load. 42*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* %addr 43*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIBITS:[0-9]+]], var32_align64 44*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x[[HIBITS]] 45*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[HIBITS]], {{#?}}:lo12:var32_align64] 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker ret i64 %val 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i64 @test_var32_alias() { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_var32_alias: 52*9880d681SAndroid Build Coastguard Worker %addr = bitcast [3 x i32]* @alias to i64* 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker ; Test that we can find the alignment for aliases. 55*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* %addr 56*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIBITS:[0-9]+]], alias 57*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x[[HIBITS]] 58*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[HIBITS]], {{#?}}:lo12:alias] 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker ret i64 %val 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker@yet_another_var = external global {i32, i32} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i64 @test_yet_another_var() { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_yet_another_var: 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker ; @yet_another_var has a preferred alignment of 8, but that's not enough if 69*9880d681SAndroid Build Coastguard Worker ; we're going to be linking against other things. Its ABI alignment is only 4 70*9880d681SAndroid Build Coastguard Worker ; so we can't fold the load. 71*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* bitcast({i32, i32}* @yet_another_var to i64*) 72*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[HIBITS:x[0-9]+]], yet_another_var 73*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], [[HIBITS]], {{#?}}:lo12:yet_another_var 74*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[ADDR]]] 75*9880d681SAndroid Build Coastguard Worker ret i64 %val 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i64()* @test_functions() { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_functions: 80*9880d681SAndroid Build Coastguard Worker ret i64()* @test_yet_another_var 81*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[HIBITS:x[0-9]+]], test_yet_another_var 82*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, [[HIBITS]], {{#?}}:lo12:test_yet_another_var 83*9880d681SAndroid Build Coastguard Worker} 84