1; RUN: llc -relocation-model=static -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_ABS 2; RUN: llc -relocation-model=ropi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC --check-prefix=ARM_RW_ABS 3; RUN: llc -relocation-model=rwpi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_SB 4; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC --check-prefix=ARM_RW_SB 5 6; RUN: llc -relocation-model=static -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS --check-prefix=THUMB2_RW_ABS 7; RUN: llc -relocation-model=ropi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC --check-prefix=THUMB2_RW_ABS 8; RUN: llc -relocation-model=rwpi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS --check-prefix=THUMB2_RW_SB 9; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC --check-prefix=THUMB2_RW_SB 10 11; RUN: llc -relocation-model=static -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_ABS 12; RUN: llc -relocation-model=ropi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC --check-prefix=THUMB1_RW_ABS 13; RUN: llc -relocation-model=rwpi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_SB 14; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC --check-prefix=THUMB1_RW_SB 15 16; RUN: llc -relocation-model=rwpi -mtriple=armv7a--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_ABS --check-prefix=NO_MOVT_ARM_RW_SB 17; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_PC --check-prefix=NO_MOVT_ARM_RW_SB 18 19; RUN: llc -relocation-model=rwpi -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_ABS --check-prefix=NO_MOVT_THUMB2_RW_SB 20; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_PC --check-prefix=NO_MOVT_THUMB2_RW_SB 21 22target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 23 24@a = external global i32, align 4 25@b = external constant i32, align 4 26@c0 = global i32 42, align 4 27@c1 = alias i32, ptr @c0 28@d0 = constant i32 42, align 4 29@d1 = alias i32, ptr @d0 30@take_addr_func_alias1 = alias ptr (), ptr @take_addr_func_alias 31 32define i32 @read() { 33entry: 34 %0 = load i32, ptr @a, align 4 35 ret i32 %0 36; CHECK-LABEL: read: 37 38; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 39; ARM_RW_ABS: movt r[[REG]], :upper16:a 40; ARM_RW_ABS: ldr r0, [r[[REG]]] 41 42; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) 43; ARM_RW_SB: movt r[[REG]], :upper16:a(sbrel) 44; ARM_RW_SB: ldr r0, [r9, r[[REG]]] 45 46; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 47; NO_MOVT_ARM_RW_SB: ldr r0, [r9, r[[REG]]] 48 49; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 50; THUMB2_RW_ABS: movt r[[REG]], :upper16:a 51; THUMB2_RW_ABS: ldr r0, [r[[REG]]] 52 53; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) 54; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) 55; THUMB2_RW_SB: ldr.w r0, [r9, r[[REG]]] 56 57; NO_MOVT_THUMB2_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 58; NO_MOVT_THUMB2_RW_SB: ldr.w r0, [r9, r[[REG]]] 59 60; THUMB1_RW_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 61; THUMB1_RW_ABS: ldr r0, [r[[REG]]] 62 63; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 64; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 65; THUMB1_RW_SB: ldr r0, [r[[REG_SB]], r[[REG]]] 66 67; CHECK: {{(bx lr|pop)}} 68 69; NO_MOVT_ARM_RW_SB: [[LCPI]] 70; NO_MOVT_ARM_RW_SB: .long a(sbrel) 71 72; NO_MOVT_THUMB2_RW_SB: [[LCPI]] 73; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) 74 75; THUMB1_RW_ABS: [[LCPI]] 76; THUMB1_RW_ABS-NEXT: .long a 77 78; THUMB1_RW_SB: [[LCPI]] 79; THUMB1_RW_SB: .long a(sbrel) 80} 81 82define void @write(i32 %v) { 83entry: 84 store i32 %v, ptr @a, align 4 85 ret void 86; CHECK-LABEL: write: 87 88; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 89; ARM_RW_ABS: movt r[[REG]], :upper16:a 90; ARM_RW_ABS: str r0, [r[[REG:[0-9]]]] 91 92; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a 93; ARM_RW_SB: movt r[[REG]], :upper16:a 94; ARM_RW_SB: str r0, [r9, r[[REG:[0-9]]]] 95 96; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 97; NO_MOVT_ARM_RW_SB: str r0, [r9, r[[REG]]] 98 99; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 100; THUMB2_RW_ABS: movt r[[REG]], :upper16:a 101; THUMB2_RW_ABS: str r0, [r[[REG]]] 102 103; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) 104; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) 105; THUMB2_RW_SB: str.w r0, [r9, r[[REG]]] 106 107; NO_MOVT_THUMB2_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 108; NO_MOVT_THUMB2_RW_SB: str.w r0, [r9, r[[REG]]] 109 110; THUMB1_RW_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 111; THUMB1_RW_ABS: str r0, [r[[REG]]] 112 113; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 114; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 115; THUMB1_RW_SB: str r0, [r[[REG_SB]], r[[REG]]] 116 117; CHECK: {{(bx lr|pop)}} 118 119; NO_MOVT_ARM_RW_SB: [[LCPI]] 120; NO_MOVT_ARM_RW_SB: .long a(sbrel) 121 122; NO_MOVT_THUMB2_RW_SB: [[LCPI]] 123; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) 124 125; THUMB1_RW_ABS: [[LCPI]] 126; THUMB1_RW_ABS-NEXT: .long a 127 128; THUMB1_RW_SB: [[LCPI]] 129; THUMB1_RW_SB: .long a(sbrel) 130} 131 132define i32 @read_const() { 133entry: 134 %0 = load i32, ptr @b, align 4 135 ret i32 %0 136; CHECK-LABEL: read_const: 137 138; ARM_RO_ABS: movw r[[reg:[0-9]]], :lower16:b 139; ARM_RO_ABS: movt r[[reg]], :upper16:b 140; ARM_RO_ABS: ldr r0, [r[[reg]]] 141 142; NO_MOVT_ARM_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 143; NO_MOVT_ARM_RO_ABS: ldr r0, [r[[REG]]] 144 145; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) 146; ARM_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+8)) 147; ARM_RO_PC: [[LPC]]: 148; ARM_RO_PC-NEXT: ldr r0, [pc, r[[REG]]] 149 150; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 151; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 152; NO_MOVT_ARM_RO_PC: ldr r0, [pc, r[[REG]]] 153 154; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:b 155; THUMB2_RO_ABS: movt r[[REG]], :upper16:b 156; THUMB2_RO_ABS: ldr r0, [r[[REG]]] 157 158; NO_MOVT_THUMB2_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 159; NO_MOVT_THUMB2_RO_ABS: ldr r0, [r[[REG]]] 160 161; THUMB2_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) 162; THUMB2_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+4)) 163; THUMB2_RO_PC: [[LPC]]: 164; THUMB2_RO_PC-NEXT: add r[[REG]], pc 165; THUMB2_RO_PC: ldr r0, [r[[REG]]] 166 167; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 168; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 169; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc 170; NO_MOVT_THUMB2_RO_PC: ldr r0, [r[[REG]]] 171 172 173; THUMB1_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 174; THUMB1_RO_ABS: ldr r0, [r[[REG]]] 175 176; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 177; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 178; THUMB1_RO_PC-NEXT: add r[[REG]], pc 179; THUMB1_RO_PC: ldr r0, [r[[REG]]] 180 181; CHECK: {{(bx lr|pop)}} 182 183; NO_MOVT_ARM_RO_ABS: [[LCPI]] 184; NO_MOVT_ARM_RO_ABS-NEXT: .long b 185 186; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] 187; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b 188 189; THUMB1_RO_ABS: [[LCPI]] 190; THUMB1_RO_ABS-NEXT: .long b 191 192; NO_MOVT_ARM_RO_PC: [[LCPI]] 193; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8) 194 195; NO_MOVT_THUMB2_RO_PC: [[LCPI]] 196; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4) 197 198; THUMB1_RO_PC: [[LCPI]] 199; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4) 200} 201 202define ptr @take_addr() { 203entry: 204 ret ptr @a 205; CHECK-LABEL: take_addr: 206 207; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 208; ARM_RW_ABS: movt r[[REG]], :upper16:a 209 210; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) 211; ARM_RW_SB: movt r[[REG]], :upper16:a(sbrel) 212; ARM_RW_SB: add r0, r9, r[[REG]] 213 214; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 215; NO_MOVT_ARM_RW_SB: add r0, r9, r[[REG]] 216 217; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a 218; THUMB2_RW_ABS: movt r[[REG]], :upper16:a 219 220; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) 221; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) 222; THUMB2_RW_SB: add r0, r9 223 224; NO_MOVT_THUMB2_RW_SB: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 225; NO_MOVT_THUMB2_RW_SB: add r0, r9 226 227; THUMB1_RW_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 228 229; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 230; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 231; THUMB1_RW_SB: adds r[[REG]], r[[REG_SB]], r[[REG]] 232 233; CHECK: {{(bx lr|pop)}} 234 235; NO_MOVT_ARM_RW_SB: [[LCPI]] 236; NO_MOVT_ARM_RW_SB: .long a(sbrel) 237 238; NO_MOVT_THUMB2_RW_SB: [[LCPI]] 239; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) 240 241; THUMB1_RW_ABS: [[LCPI]] 242; THUMB1_RW_ABS-NEXT: .long a 243 244; THUMB1_RW_SB: [[LCPI]] 245; THUMB1_RW_SB: .long a(sbrel) 246} 247 248define ptr @take_addr_const() { 249entry: 250 ret ptr @b 251; CHECK-LABEL: take_addr_const: 252 253; ARM_RO_ABS: movw r[[REG:[0-9]]], :lower16:b 254; ARM_RO_ABS: movt r[[REG]], :upper16:b 255 256; NO_MOVT_ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 257 258; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) 259; ARM_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+8)) 260; ARM_RO_PC: [[LPC]]: 261; ARM_RO_PC-NEXT: add r0, pc, r[[REG:[0-9]]] 262 263; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 264; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 265; NO_MOVT_ARM_RO_PC-NEXT: add r0, pc, r[[REG]] 266 267; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:b 268; THUMB2_RO_ABS: movt r[[REG]], :upper16:b 269 270; NO_MOVT_THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 271 272; THUMB2_RO_PC: movw r0, :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) 273; THUMB2_RO_PC: movt r0, :upper16:(b-([[LPC]]+4)) 274; THUMB2_RO_PC: [[LPC]]: 275; THUMB2_RO_PC-NEXT: add r0, pc 276 277; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 278; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 279; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc 280 281; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 282 283; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 284; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 285; THUMB1_RO_PC-NEXT: add r[[REG]], pc 286 287; CHECK: {{(bx lr|pop)}} 288 289; NO_MOVT_ARM_RO_ABS: [[LCPI]] 290; NO_MOVT_ARM_RO_ABS-NEXT: .long b 291 292; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] 293; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b 294 295; THUMB1_RO_ABS: [[LCPI]] 296; THUMB1_RO_ABS-NEXT: .long b 297 298; NO_MOVT_ARM_RO_PC: [[LCPI]] 299; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8) 300 301; NO_MOVT_THUMB2_RO_PC: [[LCPI]] 302; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4) 303 304; THUMB1_RO_PC: [[LCPI]] 305; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4) 306} 307 308define ptr @take_addr_func() { 309entry: 310 ret ptr @take_addr_func 311; CHECK-LABEL: take_addr_func: 312 313; ARM_RO_ABS: movw r[[REG:[0-9]]], :lower16:take_addr_func 314; ARM_RO_ABS: movt r[[REG]], :upper16:take_addr_func 315 316; NO_MOVT_ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 317 318; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) 319; ARM_RO_PC: movt r[[REG]], :upper16:(take_addr_func-([[LPC]]+8)) 320; ARM_RO_PC: [[LPC]]: 321; ARM_RO_PC-NEXT: add r0, pc, r[[REG:[0-9]]] 322 323; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 324; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 325; NO_MOVT_ARM_RO_PC-NEXT: add r0, pc, r[[REG]] 326 327; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:take_addr_func 328; THUMB2_RO_ABS: movt r[[REG]], :upper16:take_addr_func 329 330; NO_MOVT_THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 331 332; THUMB2_RO_PC: movw r0, :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) 333; THUMB2_RO_PC: movt r0, :upper16:(take_addr_func-([[LPC]]+4)) 334; THUMB2_RO_PC: [[LPC]]: 335; THUMB2_RO_PC-NEXT: add r0, pc 336 337; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 338; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 339; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc 340 341; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 342 343; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 344; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 345; THUMB1_RO_PC-NEXT: add r[[REG]], pc 346 347; CHECK: {{(bx lr|pop)}} 348 349; NO_MOVT_ARM_RO_ABS: [[LCPI]] 350; NO_MOVT_ARM_RO_ABS-NEXT: .long take_addr_func 351 352; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] 353; NO_MOVT_THUMB2_RO_ABS-NEXT: .long take_addr_func 354 355; THUMB1_RO_ABS: [[LCPI]] 356; THUMB1_RO_ABS-NEXT: .long take_addr_func 357 358; NO_MOVT_ARM_RO_PC: [[LCPI]] 359; NO_MOVT_ARM_RO_PC-NEXT: .long take_addr_func-([[LPC]]+8) 360 361; NO_MOVT_THUMB2_RO_PC: [[LCPI]] 362; NO_MOVT_THUMB2_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4) 363 364; THUMB1_RO_PC: [[LCPI]] 365; THUMB1_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4) 366} 367 368define ptr @take_addr_alias() { 369entry: 370 ret ptr @c1 371} 372; CHECK-LABEL: take_addr_alias: 373; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:c1(sbrel) 374; ARM_RW_SB: movt r[[REG]], :upper16:c1(sbrel) 375; ARM_RW_SB: add r0, r9, r[[REG]] 376 377define ptr @take_addr_const_alias() { 378entry: 379 ret ptr @d1 380} 381; CHECK-LABEL: take_addr_const_alias: 382; ARM_RO_PC: movw [[REG:r[0-9]]], :lower16:(d1-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) 383; ARM_RO_PC-NEXT: movt [[REG]], :upper16:(d1-([[LPC]]+8)) 384; ARM_RO_PC-NEXT: [[LPC]]: 385; ARM_RO_PC-NEXT: add r0, pc, [[REG]] 386 387define weak ptr @take_addr_func_alias() { 388entry: 389 ret ptr @take_addr_func_alias1 390} 391; CHECK-LABEL: take_addr_func_alias: 392; ARM_RO_PC: movw [[REG:r[0-9]]], :lower16:(take_addr_func_alias1-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) 393; ARM_RO_PC-NEXT: movt [[REG]], :upper16:(take_addr_func_alias1-([[LPC]]+8)) 394; ARM_RO_PC-NEXT: [[LPC]]: 395; ARM_RO_PC-NEXT: add r0, pc, [[REG]] 396 397define ptr @block_addr() { 398entry: 399 br label %lab1 400 401lab1: 402 ret ptr blockaddress(@block_addr, %lab1) 403 404; CHECK-LABEL: block_addr: 405 406; ARM_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: 407; ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 408 409; ARM_RO_PC: [[LTMP:.Ltmp[0-9]+]]: 410; ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] 411; ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 412; ARM_RO_PC: add r0, pc, r[[REG]] 413 414; THUMB2_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: 415; THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 416 417; THUMB2_RO_PC: [[LTMP:.Ltmp[0-9]+]]: 418; THUMB2_RO_PC: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 419; THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 420; THUMB2_RO_PC: add r0, pc 421 422; THUMB1_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: 423; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 424 425; THUMB1_RO_PC: [[LTMP:.Ltmp[0-9]+]]: 426; THUMB1_RO_PC: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] 427; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: 428; THUMB1_RO_PC: add r0, pc 429 430; CHECK: bx lr 431 432; ARM_RO_ABS: [[LCPI]] 433; ARM_RO_ABS-NEXT: .long [[LTMP]] 434 435; ARM_RO_PC: [[LCPI]] 436; ARM_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+8) 437 438; THUMB2_RO_ABS: [[LCPI]] 439; THUMB2_RO_ABS-NEXT: .long [[LTMP]] 440 441; THUMB2_RO_PC: [[LCPI]] 442; THUMB2_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+4) 443 444; THUMB1_RO_ABS: [[LCPI]] 445; THUMB1_RO_ABS-NEXT: .long [[LTMP]] 446 447; THUMB1_RO_PC: [[LCPI]] 448; THUMB1_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+4) 449} 450